| Map | Dem seats | Mean-median | Efficiency gap |
|---|---|---|---|
| 2024 map | 43 | 0.015 | 9.2% |
| AB 604 map (re-run) | 46 | -0.028 | 17.9% |
If you run the 2024 election again on the AB 604 map with the same votes, Democrats go from 43 seats to 46 out of 52, so they gain 3. The efficiency gap goes from 9.2% to 17.9%, so even more Republican votes get wasted on the new map.
The mean-median score actually goes the other way (+0.015 to -0.028). I think this is because the new map spreads Democratic voters more evenly across districts, which moves the median but doesn’t really show up as an advantage. Since Democrats win about 61% of the vote statewide, mean-median isn’t a great measure here, and the seat count and efficiency gap show the change more clearly.
Caveats:The election and Prop 50
California voters passed Prop 50 on November 4, 2025, about 64% to 36%. It swapped out the congressional map drawn by the independent Citizens Redistricting Commission for a new map drawn by the state legislature (AB 604). The new map is used for the 2026, 2028, and 2030 elections, and then the Commission goes back to drawing maps after the 2030 Census.
Before this, the maps were drawn by the Commission, which is a nonpartisan group of citizens. AB 604 was drawn by the legislature to add Democratic seats, as a response to Texas passing a new map that helps Republicans.
The CA Secretary of State posts the official results, like the certified Statement of Vote, results by county, and the voter guide description of Prop 50.
The Statewide Database
The Statewide Database is California’s redistricting database, run out of UC Berkeley’s law school. It takes election and voter registration data from every county and matches it to census geography, so it can be mapped and compared across the state. The data is free, and it had nothing to do with drawing the Prop 50 map.
For the 2024 general election it has vote counts and registration by precinct, plus files that connect precincts to census blocks. Since it converts county data into its own precincts, its totals can be a little off from the official results.
Units of geography
Votes are counted by SV precinct and then converted to SR precincts, so SR counts are close estimates, not exact. A few votes can’t be placed, and very small precincts show up as “***“.
Data files
| File | Source | One row is |
|---|---|---|
| state_g24_sov_data_by_g24_srprec.csv | Statewide Database | one SR precinct’s 2024 votes |
| g24-results-by-district.xlsx | CA Secretary of State | one county in a district (plus title and total rows) |
| g24-candidates-by-district.csv | CA Secretary of State | one district’s candidates |
| data/clean/sov_srprec_clean.csv | made in Part 2 | one SR precinct’s 2024 votes, cleaned |
| state_g24_sr_blk_map.csv | Statewide Database | one (partial) census block in an SR precinct |
| ab604.csv | CA Assembly | one census block and its new district |
| tl_2024_06_cd119 shapefile | US Census Bureau | one 2024 district’s shape |
| AB604 shapefile | CA Assembly | one AB 604 district’s shape |
Problem 1: Vote counts read in as text
44 vote columns came in as text instead of numbers. The only value that wouldn’t convert was “***“, which shows up where a precinct’s result isn’t reported, so it’s really a missing value.
Fix: read “***” as NA so the columns are numbers, and use na.rm = TRUE when adding things up.
Rows affected: 1,974 precincts (in CNGDEM01).
| CNGDEM01 | n |
|---|---|
| *** | 1974 |
Problem 2: A precinct with no district
One row has CDDIST = 0, which can’t be right since districts go from 1 to 52. It’s precinct 99999 in Orange County, which holds 441 votes that couldn’t be assigned to a real precinct.
Fix: kept it since it still counts statewide, but flagged it with has_district so it’s left out of district totals and maps.
Rows affected: 1.
| SRPREC_KEY | COUNTY | CDDIST | TOTVOTE | CNGDEM01 | CNGREP01 |
|---|---|---|---|---|---|
| 0605999999 | 30 | 0 | 441 | 160 | 263 |
Other checks (nothing to fix)
Precincts in clean data
25245
Columns in clean data
77
Check: Do my totals match the official ones?
My totals are a little lower than the official ones in almost every district. Most are off by less than 200 votes and the biggest gap is about 800. This is from the “***” precincts, since their votes are hidden in the precinct data but still counted in the official totals.
Q1: What share of the vote did Democrats get in each district?
Democrats got more than half the two-party vote in most districts. The bars at 100% are races with two Democrats, and the empty bar at district 20 is a race with two Republicans. A few districts are close to the 50% line, so those were competitive.
Q2: Which races had two candidates from the same party?
Four races. Three had two Democrats (districts 12, 16, and 34) and one had two Republicans (district 20). This happens because of California’s top-two primary.
| CDDIST | dem | rep | ind | official_votes | difference |
|---|---|---|---|---|---|
| 12 | 283008 | 0 | 0 | 283025 | -17 |
| 16 | 308400 | 0 | 0 | 308476 | -76 |
| 20 | 0 | 288627 | 0 | 288788 | -161 |
| 34 | 189410 | 0 | 0 | 189414 | -4 |
Q3: How big are precincts?
Really right-skewed. Lots of precincts have zero or almost zero votes, most have under 2,000, and a few have over 4,000.
Seats (Dem - Rep)
43 - 9
Dem share of two-party vote
60.7%
Mean-median
0.015
Efficiency gap
9.2%
This is the median minus the mean of the Dem vote share across districts. For the 2024 map it’s +0.015, so the median district is about 1.5 points more Democratic than the average. That’s a small Democratic advantage, so the map is pretty close to balanced by this measure.
Efficiency gap
A vote is wasted if it goes to the loser, or to the winner past the 50% they needed. The efficiency gap is Republican wasted votes minus Democratic wasted votes, divided by all votes. For the 2024 map it’s +9.2%, so Republicans wasted more votes. Democrats got about 61% of the vote but 83% of the seats. Some of this is just because Democrats have such a big majority statewide, not only because of the map. Also, the same-party races (12, 16, 20, 34) and district 37 count as 100% for one party.
Approach B: Proportional allocation
I split each SR precinct’s votes across its census blocks based on how many of the precinct’s registered voters live on each block (PCTSRPREC). Then I matched each block to its AB 604 district and added up the votes.
This assumes that every block in a precinct voted the same way as the precinct overall, with the same turnout.
Votes kept
99.995%
Did it keep every vote?
751 out of about 15 million votes didn’t end up in a new district. They’re from 17 precincts that don’t have any census blocks in the file. Most are from Orange County’s catch-all precinct 99999 (423 votes), and the rest are small precincts, mostly in San Bernardino County. That’s way too small to change any results.
| SRPREC_KEY | dem | rep |
|---|---|---|
| 0605999999 | 160 | 263 |
| 06071AP10001 | 62 | 65 |
| 06071AP30002 | 8 | 9 |
| 06071CO42765 | 5 | 6 |
| 06071RC11862 | 2 | 6 |
| 06071RC21185 | 9 | 7 |
| 06071RIA1100 | 17 | 17 |
| 06071SB62614 | 9 | 3 |
| 06071UNI0024 | 9 | 10 |
| 06071UNI0548 | 6 | 5 |
| 06071UNI2567 | 5 | 7 |
| 06071UNI2576 | 10 | 18 |
| 06073999001 | 5 | 8 |
| 06073999392 | 5 | 5 |
| 061071088001 | 0 | 5 |
| 061075998049 | 0 | 1 |
| 0611312041 | 4 | 0 |
| new_cd | dem | rep |
|---|---|---|
| 1 | 182536 | 150547 |
| 2 | 231970 | 148401 |
| 3 | 189935 | 164638 |
| 4 | 189348 | 143688 |
| 5 | 118108 | 229041 |
| 6 | 171008 | 151904 |
| 7 | 189330 | 144663 |
| 8 | 206138 | 95613 |
| 9 | 150450 | 107208 |
| 10 | 241492 | 122289 |
| 11 | 274823 | 64326 |
| 12 | 282994 | 7 |
| 13 | 106097 | 93398 |
| 14 | 182755 | 88548 |
| 15 | 211545 | 77838 |
| 16 | 303563 | 1222 |
| 17 | 173840 | 81195 |
| 18 | 148689 | 80974 |
| 19 | 252380 | 111787 |
| 20 | 18143 | 266917 |
| 21 | 95927 | 98000 |
| 22 | 79246 | 85059 |
| 23 | 104128 | 162504 |
| 24 | 214218 | 127631 |
| 25 | 151325 | 113437 |
| 26 | 189811 | 141056 |
| 27 | 155380 | 128506 |
| 28 | 200210 | 110832 |
| 29 | 147599 | 66379 |
| 30 | 213422 | 101066 |
| 31 | 156576 | 118185 |
| 32 | 207700 | 126246 |
| 33 | 139520 | 98230 |
| 34 | 189289 | 25 |
| 35 | 140040 | 110457 |
| 36 | 245999 | 111947 |
| 37 | 160391 | 15 |
| 38 | 137694 | 108221 |
| 39 | 129199 | 98936 |
| 40 | 160148 | 211998 |
| 41 | 172525 | 120963 |
| 42 | 189315 | 149080 |
| 43 | 160076 | 53152 |
| 44 | 147262 | 53784 |
| 45 | 152843 | 138564 |
| 46 | 135824 | 84761 |
| 47 | 184945 | 164007 |
| 48 | 163694 | 155138 |
| 49 | 206515 | 173227 |
| 50 | 209472 | 151469 |
| 51 | 201458 | 141837 |
| 52 | 168463 | 94895 |