Skip to contents

Question and scope

The Anthropic Economic Index publishes aggregate metrics about sampled Claude usage mapped to request, O*NET, SOC occupation, and geography categories. This case study shows a no-token workflow for auditing the latest public CSV release from R.

The output below is descriptive. It summarizes published aggregate metric values in one Anthropic release. It does not estimate rates for the broader economy or effects outside the sampled Claude data.

To render the live outputs, set HF_CASE_STUDY_RUN_PUBLIC_DATA=true before building the article. Optional inference flags are defined in the setup chunk but are not used in the main workflow.

Load the latest public CSV

The June 2026 release is a file-based Hugging Face repository, so the most reliable access path is the direct resolve/main CSV URL.

library(dplyr)
library(stringr)
library(tibble)

aei_release <- "release_2026_06_26"
aei_file <- "data/aei_claude_ai_2026-06-26.csv"
aei_url <- paste0(
  "https://huggingface.co/datasets/Anthropic/EconomicIndex/resolve/main/",
  aei_release, "/", aei_file
)

aei <- utils::read.csv(aei_url, stringsAsFactors = FALSE, check.names = FALSE) |>
  as_tibble()

required_cols <- c(
  "date_start", "date_end", "geo_id", "geo_level", "category_name",
  "hierarchy_level", "metric_id", "value", "node_name", "node_external_id"
)
stopifnot(all(required_cols %in% names(aei)))

print(tibble(
  source_release = aei_release,
  source_file = aei_file,
  rows = nrow(aei),
  columns = ncol(aei),
  first_date_start = min(aei$date_start),
  latest_date_start = max(aei$date_start)
), width = Inf)
#> # A tibble: 1 × 6
#>   source_release     source_file                          rows columns
#>   <chr>              <chr>                               <int>   <int>
#> 1 release_2026_06_26 data/aei_claude_ai_2026-06-26.csv 1636573      10
#>   first_date_start latest_date_start
#>   <chr>            <chr>            
#> 1 2026-04-01       2026-05-01

This first check records the exact file, row count, column count, and covered date window. Pinning the release path matters because future AEI releases may add metrics or change schemas.

Inspect the schema

The current release stores one row per date, geography, category, hierarchy level, metric, and node combination.

print(tibble(
  column = required_cols,
  present = required_cols %in% names(aei),
  example_value = vapply(required_cols, function(col) as.character(aei[[col]][1]), "")
), n = Inf, width = Inf)
#> # A tibble: 10 × 3
#>    column           present example_value                                    
#>    <chr>            <lgl>   <chr>                                            
#>  1 date_start       TRUE    2026-05-01                                       
#>  2 date_end         TRUE    2026-06-01                                       
#>  3 geo_id           TRUE    ZA-WC                                            
#>  4 geo_level        TRUE    subregion                                        
#>  5 category_name    TRUE    onet                                             
#>  6 hierarchy_level  TRUE    2                                                
#>  7 metric_id        TRUE    pct                                              
#>  8 value            TRUE    0.25                                             
#>  9 node_name        TRUE    Prepare financial documents, reports, or budgets.
#> 10 node_external_id TRUE    4.A.3.b.6.I01

These fields define the denominator for every summary. For example, a global overall metric and a country-level O*NET metric are different analytical units and should not be combined without checking the documentation.

Count categories, metrics, and geography levels

category_inventory <- aei |>
  count(category_name, sort = TRUE)

metric_inventory <- aei |>
  distinct(metric_id) |>
  arrange(metric_id)

geo_inventory <- aei |>
  count(geo_level, sort = TRUE)

print(category_inventory, n = Inf, width = Inf)
#> # A tibble: 4 × 2
#>   category_name       n
#>   <chr>           <int>
#> 1 onet           744544
#> 2 request        465202
#> 3 soc_occupation 353817
#> 4 overall         73010
print(tibble(n_metrics = nrow(metric_inventory)), width = Inf)
#> # A tibble: 1 × 1
#>   n_metrics
#>       <int>
#> 1        53
print(geo_inventory, n = Inf, width = Inf)
#> # A tibble: 3 × 2
#>   geo_level      n
#>   <chr>      <int>
#> 1 country   673272
#> 2 global    554941
#> 3 subregion 408360

The inventory shows that most rows are detailed category rows rather than headline summary rows. It also confirms that the file contains global, country, and subregion aggregates.

Summarize the latest global metrics

The headline summaries below use the latest global overall window in this file.

latest_start <- max(
  aei$date_start[
    aei$geo_id == "GLOBAL" &
      aei$geo_level == "global" &
      aei$category_name == "overall"
  ]
)

overall_latest <- aei |>
  filter(
    geo_id == "GLOBAL",
    geo_level == "global",
    category_name == "overall",
    date_start == latest_start
  )

metric_labels <- tibble(
  metric_id = c(
    "use_case_work_pct",
    "use_case_personal_pct",
    "use_case_coursework_pct",
    "collaboration_bucket_augmentation_pct",
    "collaboration_bucket_automation_pct",
    "ai_autonomy_mean",
    "human_only_ability_pct"
  ),
  metric = c(
    "Work use",
    "Personal use",
    "Coursework use",
    "Augmentation-labeled collaboration",
    "Automation-labeled collaboration",
    "Mean AI autonomy score",
    "Estimated human-only ability"
  )
)

global_metrics <- overall_latest |>
  inner_join(metric_labels, by = "metric_id") |>
  select(metric, value) |>
  arrange(match(metric, metric_labels$metric))

print(global_metrics, n = Inf, width = Inf)
#> # A tibble: 7 × 2
#>   metric                             value
#>   <chr>                              <dbl>
#> 1 Work use                           43.4 
#> 2 Personal use                       40.2 
#> 3 Coursework use                     16.4 
#> 4 Augmentation-labeled collaboration 51.4 
#> 5 Automation-labeled collaboration   48.6 
#> 6 Mean AI autonomy score              2.74
#> 7 Estimated human-only ability       87.6

These percentages are shares within sampled Claude usage in the selected global window. The collaboration labels come from Anthropic’s classification method; they should not be read as direct evidence about outcomes outside the sampled Claude data.

Look at artifact categories

Artifact metrics summarize the kinds of outputs associated with sampled Claude usage.

artifact_summary <- overall_latest |>
  filter(
    str_starts(metric_id, "artifact_"),
    !metric_id %in% c("artifact_none_pct", "artifact_other_pct")
  ) |>
  mutate(
    artifact = metric_id |>
      str_remove("^artifact_") |>
      str_remove("_pct$") |>
      str_replace_all("_", " ")
  ) |>
  arrange(desc(value)) |>
  select(artifact, value) |>
  slice_head(n = 10)

print(artifact_summary, n = Inf, width = Inf)
#> # A tibble: 10 × 2
#>    artifact                 value
#>    <chr>                    <dbl>
#>  1 explanation or answer    16.7 
#>  2 document or report       14.9 
#>  3 advice or recommendation 10.7 
#>  4 analysis or summary       5.55
#>  5 email or message          4.61
#>  6 app or website            4.21
#>  7 plan or strategy          4.09
#>  8 code fix or debug         3.29
#>  9 data or spreadsheet       3.11
#> 10 script or snippet         2.97

This table is a practical first pass at “what kind of work shows up in the release.” It summarizes output categories such as explanations, documents, recommendations, and code, not model quality or real-world task completion.

Inspect request categories

The request category gives another view into the types of sampled prompts.

request_summary <- aei |>
  filter(
    geo_id == "GLOBAL",
    geo_level == "global",
    category_name == "request",
    date_start == latest_start,
    metric_id == "pct"
  ) |>
  arrange(desc(value)) |>
  transmute(
    request_category = node_name,
    hierarchy_level,
    value
  ) |>
  slice_head(n = 10)

print(request_summary, n = Inf, width = Inf)
#> # A tibble: 10 × 3
#>    request_category                 hierarchy_level value
#>    <chr>                                      <int> <dbl>
#>  1 Content Creation & Copywriting                 2 22.7 
#>  2 Education & Learning                           2 13.2 
#>  3 Software Development                           2 11.5 
#>  4 Research & Intelligence                        2 10.9 
#>  5 Hobbies & Lifestyle                            2  9.49
#>  6 Homework                                       1  6.41
#>  7 Business Process & Operations                  2  4.7 
#>  8 Business operations                            1  4.55
#>  9 Document Processing & Extraction               2  4.32
#> 10 Self-presentation writing                      1  4.25

These rows are useful for auditing the request taxonomy before moving to more detailed task categories. As with the overall metrics, values are published shares inside the AEI release, not population rates.

Inspect O*NET categories

AEI also maps sampled Claude usage to O*NET task-related nodes. The code below extracts the largest global O*NET rows for the latest window.

onet_summary <- aei |>
  filter(
    geo_id == "GLOBAL",
    geo_level == "global",
    category_name == "onet",
    date_start == latest_start,
    metric_id == "pct",
    hierarchy_level == 0
  ) |>
  arrange(desc(value)) |>
  transmute(
    onet_node = str_trunc(node_name, 80),
    node_external_id,
    value
  ) |>
  slice_head(n = 10)

print(onet_summary, n = Inf, width = Inf)
#> # A tibble: 10 × 3
#>    onet_node                                                                    
#>    <chr>                                                                        
#>  1 Search electronic sources, such as databases or repositories, or manual sour…
#>  2 Search standard reference materials, including online sources and the Intern…
#>  3 Recommend and provide advice on a wide variety of products and services.     
#>  4 Answer user inquiries regarding computer software or hardware operation to r…
#>  5 Write new programs or modify existing programs to meet customer requirements…
#>  6 Conduct reference searches, using printed materials and in-house and online …
#>  7 Advise clients or respond to inquiries about financial matters in person or …
#>  8 Recommend products to customers, based on customers' needs and interests.    
#>  9 Answer students' questions.                                                  
#> 10 Edit, standardize, or make changes to material prepared by other writers or …
#>    node_external_id value
#>    <chr>            <dbl>
#>  1 16221             4.95
#>  2 22411             3.74
#>  3 680               2.25
#>  4 1282              1.98
#>  5 16120             1.47
#>  6 1695              1.38
#>  7 18933             1.37
#>  8 8114              1.28
#>  9 22389             1.15
#> 10 3968              1.06

The O*NET mapping is the bridge from usage data to occupational task language. It is a good way to form descriptive hypotheses about what categories appear in sampled Claude usage, but it is not a direct measurement of occupational exposure.

A reproducible audit checklist

print(tibble(
  audit_step = c(
    "Pin release path",
    "Record date window",
    "Fix geography",
    "Fix category",
    "Fix metric",
    "Check hierarchy level",
    "Interpret as sampled Claude usage"
  ),
  value_used_here = c(
    aei_release,
    paste(min(aei$date_start), "to", max(aei$date_end)),
    "GLOBAL / global",
    "overall, request, onet",
    "pct and selected overall metrics",
    "shown in each output",
    "yes"
  )
), n = Inf, width = Inf)
#> # A tibble: 7 × 2
#>   audit_step                        value_used_here                 
#>   <chr>                             <chr>                           
#> 1 Pin release path                  release_2026_06_26              
#> 2 Record date window                2026-04-01 to 2026-06-01        
#> 3 Fix geography                     GLOBAL / global                 
#> 4 Fix category                      overall, request, onet          
#> 5 Fix metric                        pct and selected overall metrics
#> 6 Check hierarchy level             shown in each output            
#> 7 Interpret as sampled Claude usage yes

The checklist is the part to reuse when Anthropic publishes a new release: change the release path, rerun the same audit, and update the interpretation only after checking the schema and metric definitions.

Takeaways

This case study used public Hugging Face-hosted CSV data to audit one AEI release from R. The key workflow is simple: pin a release, load the file, inspect its schema, filter to a well-defined date/geography/category/metric, and interpret values as descriptive shares within sampled Claude usage.