Auditing Claude Usage in the Anthropic Economic Index
Source:vignettes/anthropic-economic-index.Rmd
anthropic-economic-index.RmdQuestion 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-01This 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.I01These 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 408360The 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.6These 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.97This 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.25These 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.06The 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 yesThe 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.