Skip to content
BusinessTech AcademyBusinessTech AcademyData Dive

Term-one CSVs — sources, and what each pair actually does

Ten files in data/, five shapes, two datasets each. Rebuild them with python3 fetch.py — the CSV is the artifact of record for a dive, so it has to be reproducible rather than a mystery file somebody downloaded once.

Every row below carries the four-part source test from ../05-find-your-own.md: publisher · collection date · method · link. A dataset missing any of the four is a rumour with a number in it, and that rule applies to us before it applies to students.


The three publishers

PublisherCollectionMethodLink
City of Los Angeles — MyLA311 Service Request Data 2022calendar 2022, completeevery service request logged by the city's 311 system: call, app, web or self-reported. Geocoded to the reported addressdata.lacity.org/resource/i5ke-k6by
USGS — ANSS Comprehensive Catalogcalendar 2024seismometer network; each event's location and magnitude are computed from station arrivals, with a stated errorearthquake.usgs.gov/fdsnws/event/1/
NOAA Global Monitoring Laboratory — Mauna Loa annual mean CO21959–2025continuous in-situ air sampling at Mauna Loa Observatory, Hawaiigml.noaa.gov/ccgg/trends/
US EPA — AirData annual AQI by countycalendar 2024daily AQI computed from regulatory monitors, summarised per county. No API keyaqs.epa.gov/aqsweb/airdata/
City of Los Angeles — Street Tree Inventory, 1990s1990s surveyfield inventory of street planting SITES, 810,931 of them. A site with no tree is recorded, not omitteddata.lacity.org/resource/vt5t-mscf
NASA Exoplanet Archive — Planetary Systems Composite Parametersliveconfirmed exoplanets, one row per planet, queried over TAP. No API keyexoplanetarchive.ipac.caltech.edu

Rung 4 additions, 2026-08-28

absence_ca_counties_air_monitoring.csv (58) · hexbin_la_311_2km.csv (131) · hexbin_la_311_5km.csv (31) · multiples_gistemp_zonal.csv (51) · noise_socal_m4_by_year.csv (30) · void_exoplanet_mass_period.csv (5,981). Adds NASA GISTEMP zonal means; the hex bins are computed in fetch.py. Verified:

Two rung-4 dives changed because the data refused. The bank specced 4.5 as a trade-area cuisine absence; the LA 311 test of it found zero empty cells (all 15 districts carry all 12 request types), so there was no absence to teach from and the exoplanet void replaced it. And 4.1 was specced against USDA FARA, whose published file paths both return 404; the California monitoring gap needed no new source and is sharper, the absence being of the instrument rather than of a shop.

Rung 3 additions, 2026-08-28

pair_ca_counties_area_population_aqi.csv (58) · window_global_temperature_annual.csv (146) · window_15_year_trends.csv (132) · spread_la_311_daily_by_month.csv (365) · correlation_co2_temperature_exoplanets.csv (33). Verified for rung-3.md:

Rung 2 additions, 2026-08-28

choropleth_nyc_rat_complaints_by_borough.csv (5) · two_instruments_nyc_rats.csv (5) · line_socal_quakes_by_decade.csv (13) · weekday_nyc_rat_complaints.csv (7) · weekday_socal_quakes.csv (7) · hourly_311_outage_2022_09_24.csv (72). Verified for rung-2.md:

Rung 1 additions, 2026-08-27

number_la_aqi_california_counties.csv (52) · picture_la_street_trees_by_species.csv (20) · picture_exoplanets_by_discovery_method.csv (11) · donut_la_311_by_request_type.csv (12) · donut_quakes_by_depth_band.csv (3). Built and verified for rung-1.md:

Query bounds, so the numbers are reproducible: earthquakes are Southern California (32.5–35.5 N, 120–116 W), calendar 2024, M1.5 and above — 2,508 events.


The five pairs, verified

Each claim below was measured against the committed files, not assumed.

1. the table — every value and no shape

table_la_311_sample.csv (40 rows) · table_quakes_full.csv (2,508 rows)

Forty rows of 311 feel legible. Twenty-five hundred earthquakes do not. The table fails at a size you can feel, which is GAISE II's own reason for teaching graphs at all.

2. the bar — a ranking of places, and a ranking of sizes

bar_la_311_by_council_district.csv (15) · bar_quakes_by_magnitude_band.csv (5)

311 by district runs 65,952 to 108,379 — a 1.6x spread across fifteen bars. Earthquakes by band run 1,684 / 721 / 88 / 14 / 1. The same shape, and one of them is almost flat while the other falls off a cliff.

A trap that is ours, not the Earth's: the M1 bar is short because the query starts at M1.5, so that band is half-missing. Somebody's filter is visible in the chart. Worth handing to students rather than hiding — it is the window lever, in their own data.

3. the line — one noisy series, one famously smooth one

line_la_311_by_month.csv (12) · line_co2_mauna_loa_annual.csv (67)

Measured mean step, as a share of level: 311 moves 8.78% month to month. CO2 moves 0.47% year to year — about nineteen times smoother. And CO2 rises in all 67 years, with no exceptions. Same shape; only one of them lets you see a trend by eye.

4. the histogram — two distributions that are not the same species

hist_la_311_per_day.csv (365) · hist_quake_magnitudes.csv (2,508)

They skew in opposite directions, which is better than the pair was designed for:

medianmeanshape
311 per day3,8533,638left-skewed — a tail of unusually quiet days
quake magnitude1.791.95right-skewed — a tail of unusually large events

And the 311 file's minimum is 95 requests in a day, against an average of 3,638 — a 97% drop. The question the Full Cycle protocol asks of it is is that a quiet day in Los Angeles, or a day the system was down?

Answered, 2026-08-27, and the answer is better than the question. See below.

The quake side carries a real law: counts per whole magnitude fall 1,684 → 721 → 88 → 14 → 1, ratios of roughly 8x, 6x and 14x. That is Gutenberg-Richter — about ten times fewer earthquakes for each step up in magnitude — visible in a file the students pulled.

5. the dot density map — uncertainty stated, and uncertainty silent

dots_la_311_points.csv (1,500) · dots_quake_epicentres.csv (2,508)

CORRECTED against the data. The pairing document originally claimed the 311 dots are placed randomly within a region and the epicentres are real locations. Measurement refuted it: 311 points are 92% unique coordinates, geocoded to real reported addresses. Both datasets carry real positions.

The true distinction is better:

One dataset states its uncertainty. The other is silent — and silence is not the same as being right.

That is a sharper lesson than the one it replaces, and it was only available because the claim got checked against the file.


The 95-request day — solved, and it is the best thing in the bank

Saturday 2022-09-24. It is not a quiet day. It is an outage, and the hours prove it.

A quiet Saturday has a normal daily shape at lower volume. This day has a hard edge:

`` 2022-09-23 Fri normal all day ... 19:79 20:47 21:33 22:0 23:0 <- stops 21:55:14 2022-09-24 Sat 00-18: NOTHING 19:1 20:5 21:25 22:38 23:26 ^ first request of the day, 19:49:29 2022-09-25 Sun 3,716 requests -- the BUSIEST Sunday of 2022 (median 2,514) ``

Roughly twenty-two hours with nothing recorded, from Friday 22:00 to Saturday 19:49. Nobody stops reporting bulky items for twenty-two hours and then starts again at a quarter to eight in the evening.

Three things make it conclusive rather than probable:

  1. Every intake channel collapsed together — Call fell 99.2% (638 to 5), Mobile App 91% (763 to 69), against the previous Saturday. A single-channel failure would leave the others intact; all of them dying together is the system behind them.
  2. The silence has an edge, not a slope. Zero for nineteen consecutive hours, then 1, 5, 25, 38, 26 — a system coming back and catching up, not people waking up.
  3. The day after is the busiest Sunday of the year, and its hourly profile is flat and abnormally late (176 requests at 22:00, 147 at 23:00, against a normal Sunday's evening taper). That is the backlog draining.

And it happened twice

2022-03-26, the second-quietest Saturday at 291 requests, carries the identical signature: normal until 01:00, then seventeen consecutive empty hours, then back at 19:00.

Both outages end at about 19:00 on a Saturday. Two of them is a pattern, not an accident — a maintenance window is the obvious hypothesis and this data cannot confirm it.

Why this is the best teaching artifact here

The dip is instrumentation, not behaviour. And so is the spike after it.

A student charting requests per day sees a hole on the Saturday and a peak on the Sunday, and the natural story explains both with people: a quiet weekend, then a busy one. Both halves of that story are wrong, and they are wrong for the same reason. One chart, two features, one cause, and the cause is not in the chart — it is in the hours, which the daily chart threw away.

That is the strand's whole argument arriving in one real file the students pulled themselves: this shows when it was recorded, not when it happened.

Run it as a two-stage dive. Show the daily chart and take their explanations first. Then show the hours. The gap between the two answers is the lesson, and it is much stronger than being told.

One honest consequence for this document. The histogram pair above describes the 311 distribution as left-skewed with "a tail of unusually quiet days." That still holds, but at least the two most extreme members of that tail are outages rather than quiet days — so the tail is part behaviour and part instrument, which is a sharper thing to say than either alone.


Not built, and why

the scatter — canopy against surface temperature by LA tract. It needs two datasets joined on tract and neither is a one-call fetch. Census ACS requires an API key (api.census.gov returns Missing Key), which also rules out the commute-time histogram the pairing document names. Both are real and both are a second session's work, not a blocker for term one.

Open

  1. The 95-request day has no explanation yet. Find it before a student does, or decide deliberately to let them find it first — the second is the better lesson.
  2. The 311 archive is 2022. Newer years exist as separate datasets; moving forward a year is a one-line change in fetch.py.
  3. requesttype='Bulky Items' was chosen for the dot map because it is high-volume and carries no sensitivity. Any other type is a one-word change.

The third publisher — teen health

Added 2026-09-05. The first two lanes are about SOMEWHERE; this one is about the students. NHIS Teen covers 12-17 year olds, which is the age of the room the lesson is taught in.

PublisherCollectionMethodLink
National Center for Health Statistics (NCHS/DHIS, U.S. CDC) — NHIS Teen, Interactive Summary Health Statistics for TeensJuly 2021 – December 2022household interview; a sampled teen aged 12–17 answers for themselves. NCHS weights, aggregates, and publishes each estimate with a 95% confidence interval and a reliability flagdata.cdc.gov/d/5pqj-rvh4

Licence. USGOV_WORKS — Public Domain U.S. Government, <https://www.usa.gov/government-works>. Public access level; provenance flag official.

Not microdata, on purpose. NHIS also publishes respondent-level files. We do not touch them. These are estimates NCHS has already aggregated, so there is no respondent here to re-identify — the same instinct as the platform's own k-suppression bar, not an exception to it.

Cite it as:

National Center for Health Statistics. NHIS Teen. Data accessed [date]. Available from <https://data.cdc.gov/d/5pqj-rvh4>.

A defect in the publisher's own metadata, recorded so a student who checks is not confused. The dataset's "Suggested Citation" field prints the identifier 25m4-6qqq. That is NHIS Adult Summary Health Statistics — a different survey — confirmed by fetching both. Citing it as printed would credit the wrong file. The corrected identifier is 5pqj-rvh4.

999 is a suppression flag, not a percentage. 71 of the 1,700 estimates are published as 999 with no confidence interval and cr_p_reliable = 0: NCHS declining to report a group too small to stand behind. Taken literally it is catastrophic — the Midwest's fair_or_poor_health came through as 999 and drew one region a hundred times taller than the rest, a finding that does not exist. fetch_nhis_teen.py blanks the estimate and keeps the row with a plain-language note, because which groups could not be reported on is itself a finding, and this bank's own tracker ends with "Absence is data too."

The four derived files (fetch_nhis_teen.py rebuilds them all):

FileRowsWhat it is for
nhis_teen_estimates.csv1,700every estimate as published, with interval, reliability flag and suppression note — the table, histogram, dotplot, box plot, strip plot, big number
nhis_teen_by_sex.csv10ten measures answered by girls and by boys — the dumbbell and the slope chart, where the GAP is the finding
nhis_teen_group_profiles.csv29one row per group of teens, ten measures wide — parallel coordinates, radar, matrix, scatterplot matrix, scatter, bubble, small multiples
nhis_teen_by_region.csv4the four US census regions — the tile-grid choropleth and its bivariate form

What this lane cannot do, stated rather than forced. Twenty-one of the thirty shapes get an example here. Nine do not: it has no coordinates (the four point maps), no weekday or date cycle (the calendar grid, the rose), no two-category flow (the sankey), and no real time series (the line). And no donut — these percentages are shares of different wholes and do not sum to one, so a donut of them would be a lie. The civic and earth-and-space lanes already cover every one of those.