From 0eb33d91206950331303255b00e3ffae4a2218ca Mon Sep 17 00:00:00 2001 From: emfurst Date: Sat, 17 Oct 2026 11:40:48 -0400 Subject: [PATCH] Document athletics in README, About limitations, data dictionary Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01X9jG4CUFcH6n4vFvgtwndY --- README.md | 13 ++++-- docs/data_dictionary.md | 44 ++++++++++++++++++++ src/admin_analytics/dashboard/pages/about.py | 8 ++++ 3 files changed, 61 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 7ccc269..a9b9e5e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 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 @@ -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) - **Administrative cost ratios** from IPEDS finance surveys (expenses by function, staffing levels, enrollment) - **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 ### 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_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. @@ -45,13 +46,14 @@ uv run playwright install chromium Load data from public sources into the local DuckDB database (`data/admin_analytics.duckdb`). ```bash -# Ingest everything (IPEDS + IRS 990 + CPI + scraper) +# Ingest everything (IPEDS + IRS 990 + CPI + EADA + scraper) uv run admin-analytics ingest all # Or ingest individual sources 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 cpi +uv run admin-analytics ingest eada --year-range 2007-2025 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 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) - **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) - **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) +- **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 - **About** -- data sources, methodology, and limitations @@ -104,6 +107,7 @@ src/admin_analytics/ ipeds/ # IPEDS download, parsing, loading irs990/ # IRS 990 XML download, parsing, title normalization bls/ # BLS CPI-U download and loading + eada/ # EADA athletics download and loading scraper/ # UD staff directory scraper and classifier dashboard/ # Dash app, queries, page layouts 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 | | [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 | | UD staff directories | Admin office headcounts and overhead classification | Current snapshot | diff --git a/docs/data_dictionary.md b/docs/data_dictionary.md index 114158d..a686ac5 100644 --- a/docs/data_dictionary.md +++ b/docs/data_dictionary.md @@ -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 | | 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 **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) - **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 +- **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 - **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) diff --git a/src/admin_analytics/dashboard/pages/about.py b/src/admin_analytics/dashboard/pages/about.py index af539fd..e0b7e61 100644 --- a/src/admin_analytics/dashboard/pages/about.py +++ b/src/admin_analytics/dashboard/pages/about.py @@ -84,6 +84,14 @@ employees only (FTPT=2). - **Admin headcount** from web scraping is a point-in-time snapshot and is limited to the pages currently targeted (College of Engineering and 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 only. Peer comparisons are planned for a future phase.