# How long billionaires live This project follows every person who appeared on the Forbes 400 lists from 1982 to 2000 and compares their survival with official United States life tables for people of the same sex, age and birth year. The report is in `report/index.html`. ## Result The current numbers are in `data/final/analysis.json` and are shown in the report. They change when more people are traced, so this file does not repeat them. ## Sources The Forbes 400 panel comes from the replication files of Gomez (2023), "Decomposing the Growth of Top Wealth Shares", Econometrica, published on Zenodo (record 10045153, CC BY 4.0). It holds 400 people a year from 1982 to 2017. It has names, ranks, net worth and the reason a person left the list, but no ages. The life tables are the death probabilities by single year of age, sex and calendar year from the Office of the Chief Actuary of the Social Security Administration (2024 Trustees Report). Historical values run to 2021 and intermediate projections follow. The files were taken from the Internet Archive copy of ssa.gov, because ssa.gov rejects scripted requests. Birth and death dates come from Wikidata and English Wikipedia where a person has an entry. For the others they come from obituaries, archives and the LittleSis database, collected by research agents and recorded with their source links in `data/manual/research`. ## How a person is matched A match is a link between a name on the Forbes panel and one Wikidata entry. The scripts propose candidates and score them on the name, the plausibility of the birth year, the death year against the Forbes drop-off, citizenship and occupation. Every proposal was then read by hand. `data/manual/accepted_matches.csv` lists the accepted links and `data/manual/rejected_candidates.csv` lists the rejected ones. About one proposal in twelve with a high score was a namesake and was rejected. ## Status of the tracing Web search in this environment is capped at 200 searches per turn. The manual research therefore stopped early, and some people are still untraced. `data/final/forbes400_longevity.csv` marks them with `match_method` equal to `unresolved`, or with an empty `birth_date`. People without a birth date are left out of the analysis, because the life tables need an age. The input files `data/manual/research/batch_*_input.csv` list who was sent to research, and the matching `batch_*_output.csv` files show what was found. ## Steps Run the scripts from the `src` folder with the project's Python environment (`.venv`, created with `uv`). Each script reads the output of the one before it. | Script | What it does | |---|---| | `01_build_roster.py` | Builds one row per person from the Forbes panel. | | `02_wikidata_candidates.py`, `02b_extra_candidates.py`, `02c_enwiki_candidates.py` | Search Wikidata and Wikipedia for candidates. | | `03_score_matches.py` | Scores the candidates for each person. | | `04_wikipedia_evidence.py` | Fetches Wikipedia introductions and categories for cross-checks. | | `05_review_table.py`, `show_review.py` | Print the proposals for the manual check. | | `06_date_table.py` | Reconciles Wikidata and Wikipedia dates for accepted matches. | | `06b_research_batches.py` | Writes the research input files. | | `06c_wikipedia_mentions.py`, `06d_littlesis.py`, `06e_family_pages.py`, `06f_littlesis_accept.py` | Look for dates of people with no entry of their own. | | `08_build_dataset.py` | Merges everything into `data/final/forbes400_longevity.csv`. | | `07_analysis.py` | Computes mortality ratios, survival curves and years gained. | | `09_build_report_data.py` | Writes `report/data.js` for the report. | To refresh the results after new research, run `08_build_dataset.py`, `07_analysis.py` and `09_build_report_data.py` in that order. ## Method in brief Each person is followed from 1 October of the first year on the list to death or to 31 December 2025. The standardised mortality ratio is the number of deaths observed divided by the number the life tables predict for the same person-time. Survival curves are Kaplan-Meier estimates, and the expected curve is the Hakulinen estimate. The years gained compare two averages of remaining life at first listing: one from each member's life table, and one from that table multiplied by the mortality ratio observed at each age. ## Files `data/final/forbes400_longevity.csv` is the dataset, with one row per person. `data/final/survival_curves.csv` holds the observed and expected survival curves. `data/final/analysis.json` holds every number shown in the report. `data/final/person_expectations.csv` holds the life-table expectation for each analysed person. ## Publishing the report `src/build_site.py` assembles the public site in `dist`: the report, the three result files it links to, and this README. The site is a Cloudflare Pages project named `billionaires`, deployed by direct upload. ```bash .venv/bin/python src/build_site.py ``` ```bash npx wrangler pages deploy dist --project-name billionaires --branch master ```