Data and code to reproduce the figures of
Louis Boucherie, Sagar Kumar, Katharina Ledebur, August Lohse and Karolina Śliwa. Cultural evolution of beauty standards. Proceedings of the National Academy of Sciences 123 (21), e2602380123 (2026). doi:10.1073/pnas.2602380123
@article{boucherie2026cultural,
title = {Cultural evolution of beauty standards},
author = {Boucherie, Louis and Kumar, Sagar and Ledebur, Katharina and Lohse, August and {\'S}liwa, Karolina},
journal = {Proceedings of the National Academy of Sciences},
volume = {123},
number = {21},
pages = {e2602380123},
year = {2026},
doi = {10.1073/pnas.2602380123}
}evolution-beautystd/
├── data/ plot-ready CSV / JSON inputs
├── scripts/ one Python script per figure
├── figures/ figure outputs (PDF; the scripts also write PNG)
└── requirements.txt Python dependencies
The repository is self-contained: each script in scripts/ reads from data/
and writes to figures/.
pip install -r requirements.txt
cd scripts
python <script_name>.pyutils.py holds the shared plot style and is not run on its own.
data/network_shows_edges.csv is the network of runway shows: which models walked
for which brands, and in which year (model_id, brand, year). Models are anonymous
IDs, not linked to the model IDs in the other files.
Brands ranked by eigenvector centrality in the model–brand network. Degree centrality is the share of all models who walked for the brand.
| Rank | Brand | Models | Degree centrality | Eigenvector centrality |
|---|---|---|---|---|
| 1 | Dolce & Gabbana | 2,477 | 0.185 | 0.119 |
| 2 | Valentino | 1,808 | 0.135 | 0.114 |
| 3 | Fendi | 1,403 | 0.105 | 0.102 |
| 4 | Dior | 1,436 | 0.107 | 0.100 |
| 5 | Prada | 1,558 | 0.116 | 0.098 |
| 6 | Chanel | 1,123 | 0.084 | 0.096 |
| 7 | Louis Vuitton | 1,602 | 0.120 | 0.091 |
| 8 | Hermès | 1,245 | 0.093 | 0.090 |
| 9 | Kenzo | 1,267 | 0.095 | 0.087 |
| 10 | Givenchy | 1,242 | 0.093 | 0.087 |
All brands are in figures/network_shows_brand_centrality.csv; scripts/network_shows.py
rebuilds the figure and the table.
| Script | Shows |
|---|---|
age_distribution.py |
Age distribution of records, overall and per event type |
age_evolution.py |
Mean age of records per event type, 2000–2024 |
body_tails.py |
Tail quantiles (P10–P99) of female body measurements, 2000–2024 |
career_evolution.py |
Records per year, by category and by gender |
choropleth_models.py |
Models and records by country of origin |
entropy_evolution.py |
Entropy of categorical and numerical attributes, female models |
event_study_panel.py |
Event study around the 2006 Milan charter and the 2017 Paris regulation |
forest_plot_outliers_trends.py |
Trends in IQR, skewness and kurtosis of body measurements |
forest_plot_std_trends.py |
Trends in the standard deviation of body measurements |
heterogeneous_policy.py |
Policy effects across hierarchy tiers and cities |
hierarchy_table.py |
Top-30 brands by network prestige (table) |
intersectionality_panel.py |
Race × plus-size analysis, 2010–2024 |
measurement_evolution_plots.py |
Mean and standard deviation of body measurements per event type (female and male) |
network_analysis_panel.py |
Brand–model network: embeddings, tiers and prestige |
network_shows.py |
Runway-show network and brand centralities |
outliers_comparison.py |
Shape of measurement distributions, models vs NHANES, with PCA (female and male) |
pca_temporal_plot.py |
Yearly trajectory of female body composition in PCA space |
quantile_policy_analysis.py |
RFM quantiles, Milan and Paris vs control |
rfm_by_age_group.py |
RFM of models vs NHANES women, by age group |
rfm_tiers_sensitivity.py |
Sensitivity of top/bottom-10 % RFM rates to the number of tiers |
- NHANES (US CDC), public-use data:
data/nhanes_female_17_40.csv,data/nhanes_rfm_{female,male}_filtered.csv,data/pca_nhanes_projection_{female,male}.csv. https://www.cdc.gov/nchs/nhanes/index.htm - Natural Earth, public domain: the country shapefile in
data/naturalearth_110m_countries/. https://www.naturalearthdata.com/
