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:
parent
726bc232f2
commit
0eb33d9120
3 changed files with 61 additions and 4 deletions
13
README.md
13
README.md
|
|
@ -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 |
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue