AIData Systems & AI LabProduct Analytics · Data Systems · AI Workflows · Decision InfrastructureContact
Open OS launcher

Business intelligence / BigQuery / Public data

FEC Campaign Finance Analysis

I analyzed individual and committee contributions across the 2018 and 2020 election cycles. The central challenge was deciding what to count when source tables repeat records and fundraising platforms report the same activity differently.

What the reporting choice changes

The WinRed-exclusion scenario totals about USD 15.25 billion in qualifying itemized records. Individuals account for roughly 83%. October 2020 is the peak month under both definitions. These are contribution records, not a verified count of unique donations.

USD 15.25B

Qualifying amount in the WinRed-exclusion scenario

2,603

Candidate IDs receiving committee contributions in that scenario

59.6%

Share of attributed committee money received by the top 10% of candidate IDs

Checks before conclusions

The 2020 individual table contains 195.5 million rows but only 88.8 million distinct record IDs. I compared the repeated records before selecting stable analysis fields. I also checked source coverage, candidate attribution, transaction types, memo flags and date ranges.

ActBlue and WinRed use different reporting patterns. The report shows the original totals beside a WinRed-exclusion scenario and documents what that comparison can and cannot establish. Excluding reporting can remove unmatched records as well as reduce overlap.

A model that can be inspected

The SQL builds staging views, a saved deduplicated individual table, committee and candidate dimensions, a fact view and monthly aggregates. Reconciliation checks connect the final totals back to the source-level results.

The project includes all 29 queries, the notebook, charts and saved quality-check results. The business-payee section is an analysis plan with source checks and delivery estimates; it does not claim a verified top-10 ranking.

code-proof.workspace

FEC · BigQuery SQL

1-- 21_monthly_chart_data2-- I use the saved monthly summary to compare the two sources3-- over time without scanning the original contribution tables again.45WITH monthly AS (6  SELECT7    contribution_month,8    SUM(9      IF(source_type = 'individual', gross_amount, 0)10    ) AS individual_amount,11    SUM(12      IF(source_type = 'committee', gross_amount, 0)13    ) AS committee_amount,14    SUM(gross_amount) AS total_amount15  FROM16    `fec-contributions-analysis.fec_analysis.agg_contributions_monthly`17  GROUP BY contribution_month18)1920SELECT21  contribution_month,22  individual_amount,23  committee_amount,24  total_amount,25  100 * SAFE_DIVIDE(26    total_amount - LAG(total_amount) OVER (27      ORDER BY contribution_month28    ),29    LAG(total_amount) OVER (30      ORDER BY contribution_month31    )32  ) AS month_over_month_growth_pct33FROM monthly34ORDER BY contribution_month;
Stacked area chart of individual and committee contributions from January 2017 through December 2020, peaking in October 2020.
Monthly contributions under the original reported-record definition. The full report explains the alternative WinRed-exclusion figures.
The top 261 candidate IDs received 59.6 percent of attributed committee contributions; the remaining 2,342 received 40.4 percent.
Candidate concentration in the WinRed-exclusion scenario, combining both cycles. The top group is rounded up to a whole candidate ID.

Source: public Federal Election Commission tables in BigQuery. The analysis covers January 2017 through December 2020. Itemized records do not include every small donation, and reported candidate IDs are not a verified count of distinct people. The report contains the complete definitions and limitations.