Document athletics in README, About limitations, data dictionary

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9jG4CUFcH6n4vFvgtwndY
This commit is contained in:
emfurst 2026-10-17 11:40:48 -04:00
commit 0eb33d9120
3 changed files with 61 additions and 4 deletions

View file

@ -1,6 +1,6 @@
# Admin Analytics # Admin Analytics
University of Delaware administrative cost benchmarking using public data (IRS 990, IPEDS, BLS CPI-U). Ingests data into a local DuckDB database and serves an interactive Dash dashboard for analysis. University of Delaware administrative cost benchmarking using public data (IRS 990, IPEDS, EADA, BLS CPI-U). Ingests data into a local DuckDB database and serves an interactive Dash dashboard for analysis.
## Scope ## Scope
@ -9,6 +9,7 @@ This project is currently scoped to the **University of Delaware** as a single i
- **Executive compensation** from IRS 990 Schedule J filings by the University of Delaware (EIN 516000297) and UD Research Foundation (EIN 516017306) - **Executive compensation** from IRS 990 Schedule J filings by the University of Delaware (EIN 516000297) and UD Research Foundation (EIN 516017306)
- **Administrative cost ratios** from IPEDS finance surveys (expenses by function, staffing levels, enrollment) - **Administrative cost ratios** from IPEDS finance surveys (expenses by function, staffing levels, enrollment)
- **Endowment performance** and **philanthropic giving** from IPEDS F2 (FASB) financial data - **Endowment performance** and **philanthropic giving** from IPEDS F2 (FASB) financial data
- **Intercollegiate athletics** spending from Equity in Athletics Disclosure Act (EADA) filings, set against university-wide spending and athletics leadership compensation
- **Administrative headcount** via web scraping, currently focused on the **College of Engineering line management** (COE Central, department offices) and the Provost's Office - **Administrative headcount** via web scraping, currently focused on the **College of Engineering line management** (COE Central, department offices) and the Provost's Office
### Changing the target institution ### Changing the target institution
@ -18,7 +19,7 @@ The institution scope is controlled by constants in `src/admin_analytics/config.
- `UD_UNITID = 130943` -- IPEDS institution identifier. Change this to target a different institution. Look up UNITIDs at the [IPEDS Data Center](https://nces.ed.gov/ipeds/use-the-data). - `UD_UNITID = 130943` -- IPEDS institution identifier. Change this to target a different institution. Look up UNITIDs at the [IPEDS Data Center](https://nces.ed.gov/ipeds/use-the-data).
- `UD_EINS = [516000297, 516017306]` -- IRS Employer Identification Numbers for 990 filings. Update these to the EINs of the target institution's nonprofit entities. - `UD_EINS = [516000297, 516017306]` -- IRS Employer Identification Numbers for 990 filings. Update these to the EINs of the target institution's nonprofit entities.
All IPEDS loaders accept a `unitid_filter` parameter. The scraper URLs in `src/admin_analytics/scraper/directory.py` are UD-specific and would need to be updated for a different institution. All IPEDS and EADA loaders accept a `unitid_filter` parameter (EADA is keyed by the same UNITID). The scraper URLs in `src/admin_analytics/scraper/directory.py` are UD-specific and would need to be updated for a different institution.
Multi-institution comparisons (AAU peers, Carnegie peers) are planned for a future phase. Multi-institution comparisons (AAU peers, Carnegie peers) are planned for a future phase.
@ -45,13 +46,14 @@ uv run playwright install chromium
Load data from public sources into the local DuckDB database (`data/admin_analytics.duckdb`). Load data from public sources into the local DuckDB database (`data/admin_analytics.duckdb`).
```bash ```bash
# Ingest everything (IPEDS + IRS 990 + CPI + scraper) # Ingest everything (IPEDS + IRS 990 + CPI + EADA + scraper)
uv run admin-analytics ingest all uv run admin-analytics ingest all
# Or ingest individual sources # Or ingest individual sources
uv run admin-analytics ingest ipeds --year-range 2005-2024 uv run admin-analytics ingest ipeds --year-range 2005-2024
uv run admin-analytics ingest irs990 --year-range 2019-2025 uv run admin-analytics ingest irs990 --year-range 2019-2025
uv run admin-analytics ingest cpi uv run admin-analytics ingest cpi
uv run admin-analytics ingest eada --year-range 2007-2025
uv run admin-analytics ingest scrape uv run admin-analytics ingest scrape
``` ```
@ -69,13 +71,14 @@ Opens at [http://localhost:8050](http://localhost:8050). Use `--port` to change
The dashboard must be restarted to pick up newly ingested data (DuckDB opens in read-only mode to avoid lock conflicts). The dashboard must be restarted to pick up newly ingested data (DuckDB opens in read-only mode to avoid lock conflicts).
The dashboard has seven tabs: The dashboard has eight tabs:
- **Executive Compensation** -- top earners from IRS 990 Schedule J, President and top-10 CAGR, trends by role, compensation breakdown by component, growth vs CPI-U (2015-2023) - **Executive Compensation** -- top earners from IRS 990 Schedule J, President and top-10 CAGR, trends by role, compensation breakdown by component, growth vs CPI-U (2015-2023)
- **Admin Cost Overview** -- admin cost ratios, expense breakdown by function, cost per student, admin-to-faculty ratio (IPEDS data, 2005-2024) - **Admin Cost Overview** -- admin cost ratios, expense breakdown by function, cost per student, admin-to-faculty ratio (IPEDS data, 2005-2024)
- **Staffing & Enrollment** -- staff composition, student-to-staff ratios, management vs faculty vs enrollment growth (indexed) - **Staffing & Enrollment** -- staff composition, student-to-staff ratios, management vs faculty vs enrollment growth (indexed)
- **Endowment** -- endowment value trends, CAGR, investment return rate, CIO compensation vs endowment growth (IPEDS F2) - **Endowment** -- endowment value trends, CAGR, investment return rate, CIO compensation vs endowment growth (IPEDS F2)
- **Philanthropy** -- total private gifts and grants, gift allocation, President and VP Development compensation growth vs fundraising (IPEDS F2 and IRS 990) - **Philanthropy** -- total private gifts and grants, gift allocation, President and VP Development compensation growth vs fundraising (IPEDS F2 and IRS 990)
- **Athletics** -- athletics expenses by football, basketball, other sports, and spending not allocated by sport (FY2007-2025, FBS transition marked); growth vs university and instruction spending; cost per full-time undergraduate; share of university expenses; head coach and athletic director compensation (EADA, IPEDS, IRS 990)
- **Current Headcount** -- scraped UD staff directory data with overhead/non-overhead classification by unit - **Current Headcount** -- scraped UD staff directory data with overhead/non-overhead classification by unit
- **About** -- data sources, methodology, and limitations - **About** -- data sources, methodology, and limitations
@ -104,6 +107,7 @@ src/admin_analytics/
ipeds/ # IPEDS download, parsing, loading ipeds/ # IPEDS download, parsing, loading
irs990/ # IRS 990 XML download, parsing, title normalization irs990/ # IRS 990 XML download, parsing, title normalization
bls/ # BLS CPI-U download and loading bls/ # BLS CPI-U download and loading
eada/ # EADA athletics download and loading
scraper/ # UD staff directory scraper and classifier scraper/ # UD staff directory scraper and classifier
dashboard/ # Dash app, queries, page layouts dashboard/ # Dash app, queries, page layouts
validation.py # Data validation queries validation.py # Data validation queries
@ -118,5 +122,6 @@ tests/ # pytest test suite
|--------|-----------------|-------| |--------|-----------------|-------|
| [IPEDS](https://nces.ed.gov/ipeds/) | Institutional directory, expenses by function, staffing, enrollment | 2005-2024 | | [IPEDS](https://nces.ed.gov/ipeds/) | Institutional directory, expenses by function, staffing, enrollment | 2005-2024 |
| [IRS 990 e-file](https://www.irs.gov/charities-non-profits/form-990-series-downloads) | UD Foundation filings, executive compensation (Schedule J) | 2019-2025 index years (tax years 2017-2023) | | [IRS 990 e-file](https://www.irs.gov/charities-non-profits/form-990-series-downloads) | UD Foundation filings, executive compensation (Schedule J) | 2019-2025 index years (tax years 2017-2023) |
| [EADA](https://ope.ed.gov/athletics/) | Athletics expenses by sport, participants, coaching salaries, full-time undergraduate enrollment | FY2007-2025 (academic years 2006-07 to 2024-25) |
| [BLS CPI-U](https://www.bls.gov/cpi/) | Consumer Price Index for inflation adjustment | Full history | | [BLS CPI-U](https://www.bls.gov/cpi/) | Consumer Price Index for inflation adjustment | Full history |
| UD staff directories | Admin office headcounts and overhead classification | Current snapshot | | UD staff directories | Admin office headcounts and overhead classification | Current snapshot |

View file

@ -168,6 +168,49 @@ Raw data layer for University of Delaware administrative analytics. All tables a
| total_investment_return | BIGINT | Total investment return (all funds) | F2D10 | | total_investment_return | BIGINT | Total investment return (all funds) | F2D10 |
| long_term_investments | BIGINT | Long-term investments (balance sheet) | F2A01 | | long_term_investments | BIGINT | Long-term investments (balance sheet) | F2A01 |
### raw_eada_institution
**Source:** EADA institution-level file (`instLevel.xlsx`), U.S. Dept. of Education OPE
**Granularity:** One row per institution per year
**Primary Key:** (unitid, year)
**Note:** `year` is the academic-year end (2025 = 2024-25), matching IPEDS fiscal years. Coverage starts in 2007; earlier files use coded column names. Revenue equals expenses for UD because the institutional subsidy is reported as revenue.
| Column | Type | Description | Source field |
|--------|------|-------------|-------------|
| unitid | INTEGER | IPEDS institution identifier | unitid |
| year | INTEGER | Academic-year end | derived from file list |
| classification | VARCHAR | NCAA division | classification_name |
| total_revenue | BIGINT | Grand total athletics revenue | GRND_TOTAL_REVENUE |
| total_expenses | BIGINT | Grand total athletics expenses | GRND_TOTAL_EXPENSE |
| unallocated_revenue | BIGINT | Revenue not allocated by sport | TOT_REVENUE_ALL_NOTALLOC |
| unallocated_expenses | BIGINT | Expenses not allocated by sport | TOT_EXPENSE_ALL_NOTALLOC |
| student_aid | BIGINT | Athletically related student aid | STUDENTAID_TOTAL |
| recruiting_expenses | BIGINT | Recruiting expenses | RECRUITEXP_TOTAL |
| head_coach_salary_men | BIGINT | Average head coach salary, men's teams | HDCOACH_SALARY_MEN |
| head_coach_salary_women | BIGINT | Average head coach salary, women's teams | HDCOACH_SALARY_WOMEN |
| asst_coach_salary_men | BIGINT | Average assistant coach salary, men's teams | ASCOACH_SALARY_MEN |
| asst_coach_salary_women | BIGINT | Average assistant coach salary, women's teams | ASCOACH_SALARY_WOMEN |
| participants_men | INTEGER | Unduplicated male participants | UNDUP_CT_PARTIC_MEN |
| participants_women | INTEGER | Unduplicated female participants | UNDUP_CT_PARTIC_WOMEN |
| ft_undergrad_enrollment | INTEGER | Full-time undergraduate enrollment | EFTotalCount |
### raw_eada_sport
**Source:** EADA per-sport file (`Schools.xlsx`)
**Granularity:** One row per institution per sport per year
**Primary Key:** (unitid, year, sport)
**Note:** Sport names are stored as reported and vary across years (e.g. "Swimming and Diving" vs "Swimming and Diving (combined)"). Men's and women's teams of the same sport share one row.
| Column | Type | Description | Source field |
|--------|------|-------------|-------------|
| unitid | INTEGER | IPEDS institution identifier | unitid |
| year | INTEGER | Academic-year end | derived from file list |
| sport | VARCHAR | Sport name | Sports |
| participants_men | INTEGER | Male participants (incl. coed teams) | SUM_PARTIC_MEN |
| participants_women | INTEGER | Female participants (incl. coed teams) | SUM_PARTIC_WOMEN |
| total_revenue | BIGINT | Revenue for the sport | TOTAL_REVENUE_ALL |
| total_expenses | BIGINT | Expenses for the sport | TOTAL_EXPENSE_ALL |
### raw_admin_headcount ### raw_admin_headcount
**Source:** Web scraping of UD staff directory pages **Source:** Web scraping of UD staff directory pages
@ -190,6 +233,7 @@ Raw data layer for University of Delaware administrative analytics. All tables a
- **IPEDS tables** are linked by `unitid` (UD = 130943) - **IPEDS tables** are linked by `unitid` (UD = 130943)
- **IRS 990 tables** are linked by `object_id` (filing) and `ein` (organization) - **IRS 990 tables** are linked by `object_id` (filing) and `ein` (organization)
- **IPEDS → IRS 990:** The `ein` field in `raw_institution` links to `ein` in 990 tables. UD Foundation EINs: 516000297, 516017306 - **IPEDS → IRS 990:** The `ein` field in `raw_institution` links to `ein` in 990 tables. UD Foundation EINs: 516000297, 516017306
- **EADA tables** link to IPEDS by `unitid`; `year` uses the same fiscal-year convention
- **CPI-U** is used for inflation adjustment — join on `year` (and optionally `month`) to any table with a year column - **CPI-U** is used for inflation adjustment — join on `year` (and optionally `month`) to any table with a year column
- **Endowment** data comes from IPEDS F2 endowment section; 990 `total_assets` provides a cross-check - **Endowment** data comes from IPEDS F2 endowment section; 990 `total_assets` provides a cross-check
- **Admin headcount** links to IPEDS via institutional context (UD only in first iteration) - **Admin headcount** links to IPEDS via institutional context (UD only in first iteration)

View file

@ -84,6 +84,14 @@ employees only (FTPT=2).
- **Admin headcount** from web scraping is a point-in-time snapshot and is - **Admin headcount** from web scraping is a point-in-time snapshot and is
limited to the pages currently targeted (College of Engineering and limited to the pages currently targeted (College of Engineering and
Provost's Office). Provost's Office).
- **Athletics figures** measure cost, not subsidy. EADA reports athletics
revenue equal to expenses, with institutional support and student fees
counted as revenue, so it does not show how much of the cost the
university or students cover. UD's reported shared (not-allocated-by-sport) expenses
drop sharply between FY 2011 and FY 2012, which looks like a reporting
change, so athletics growth comparisons start in FY 2012.
- **EADA coverage** starts in FY 2007. Earlier files use coded column names
and are not loaded.
- **Single institution** — this prototype covers the University of Delaware - **Single institution** — this prototype covers the University of Delaware
only. Peer comparisons are planned for a future phase. only. Peer comparisons are planned for a future phase.