The OpenElections Project
Analyzing a Single Race with OpenElections Data
Analyzing Voter Turnout with OpenElections Data
Looking into Problems with OpenElections Data
Missing Data
Incorrectly Structured Data
Adding New Data
Analyzing a Single Race with New Data
Analyzing Voter Turnout with New Data
Comparing Multiple Races from a Single Election
Looking at the Dropoff from the Presidential to the Senate Race by County
Comparing Multiple Races from Multiple Elections
The following summary of the OpenElections project can be found on their GitHub page:
The goal of OpenElections is to create the first free, comprehensive, standardized, linked set of election data for the United States, including federal, statewide and state legislative offices. The current options for election data can be difficult to find and use or financially out-of-reach for most journalists and civic hackers. We want the people who work with election data to be able to get what they need, whether that's for stories and data analysis or web applications and interactive graphics.
I previously created an R Shiny app for analyzing election data that is documented at this link. One major limitation, however, is that it can only analyze election data which has been parsed and stored in files that it can access. In order to address that limitation, I have taken the code from that app and modified it to access the OpenElections data online. There is a public online version of this app at https://econdata.shinyapps.io/voting_oe24/. Having been derived from the app described at this link, much of the new app's functionality will be very similar. However, the UI has had to change a fair amount. The remainder of this document will describe how to use the new app, chiefly by giving a number of examples using OpenElections data.
Analyzing a Single Race with OpenElections Data
Currently, navigating to https://econdata.shinyapps.io/voting_oe24/ will initially display the following page:
The message indicates that the user must select the desired STATE, YEAR, ELECTION, COUNTY, and OFFICE to define a race. The selections must be made in that order and each selection will generally populate the options for the next selection. Upon selection all of those items, click on the "ADD RACE" button to add the defined race to the RACES select box. In this example, the initial selections can be accepted and the user need only click the "ADD RACE" button. This displays the following page:
As can be seen, the columns consist of COUNTY, AREA, TOTAL, Harris_D, Trump_R, Stein_G, Oliver_L, and other Presidential candidates. Not visible are the last two columns of DEM_CVT and REP_CVT. COUNTY is Wayne in this case and AREA refers to the precinct names (except for Wisconsin where it refers to the ward names). TOTAL is the total votes and the next nine columns are the last names of the candidates followed by an underscore and a character to indicate the party. DEM_CVT and REP_CVT are cumulative vote shares used in CVTs (cumulative vote tallys).
Clicking on the "Area Plot" tab will then display the following page:
This shows the total votes versus the vote margin in every precinct in Wayne County in the President's race. Hovering over any of the precincts causes a popup to be displayed which shows the total votes and percent margin. That is the cause of the popup visible next to the precinct in the lower right. Looking at the 4th to the last entry in the list on the Areas tab shows this to be Grosse Ile Township, Precinct 1.
The plot above shows that there is a cluster of strongly Democrat precincts with 500 or less total votes in the upper left. Most of the other precincts contain up to a bit over 2,000 total votes. However, there is a string of strongly Democrat precincts with over 2,000 total votes in the upper right.
Clicking on the CVT tab will display the following page:
The use of CVTs (Cumulative Vote Tallies) are described at this link. The CVT plot shows that precincts with the fewest total votes tend to be strongly Democrat. However, just before the vertical midpoint line, the red line starts rising. This is due to the fact that relatively more of the mid-sized precincts lean Republican. At the very end, the red line tilts back down a bit. This is undoubtably due to the string of strongly Democrat precincts in the upper right of the prior Area Plot.
Analyzing Voter Turnout with OpenElections Data
The turnout of a single race in a single county can be displayed via the following steps:
The y-axis shows the turnout in every precinct and is calculated by dividing the total votes for President by the total number of registered voters in each precinct. As can be seen, most of the precincts had a turnout between 40 and 80 percent. However, there is a clump of strongly Democrat precincts that had a turnout around 20 percent. It's hard to know the reason for this clump of low-turnout, solid-Democrat precincts without further investigation.
Looking into Problems with OpenElections Data
After following the steps in the prior section to produce the plot above, change COUNTY from "Wayne" to "Oakland". This will display the following plot:
As can be seen, all of the points are now in a horizontal line at 100 percent on the y-axis. Less noticable may be that OFFICE has now changed from "Registered Voters" to "Straight Party". In fact, clicking on the OFFICE select list reveals that "Registered Voters" is no longer a selection. This is an example of a problem caused by missing OpenElections data. An examination of the OpenElections data reveals that Oakland County does not contain any "Registered Voters" data. It may be that the data was obtained from county websites and that the Oakland County website did not have data on registered voters. In any case, all of the counties that are missing data on registered voters can be found via the following steps:
MI: 2024 President Votes as Percent of 2024 Registered Voters Votes (Percent ratio) COUNTY AREA Dem Rep MARGIN1 TOTAL1 Dem.1 Rep.1 MARGIN2 TOTAL2 DEM_SH REP_SH MAR_SH TOT_SH 1 ALCONA COUNTY 28.61 70.26 -41.65 98.88 0 0 0 10,663 Inf Inf 70.14 70.14 2 ALGER COUNTY 39.46 59.26 -19.80 98.73 0 0 0 7,703 Inf Inf 68.26 68.26 3 ALLEGAN COUNTY 35.60 62.76 -27.17 98.36 0 0 0 101,976 Inf Inf 70.63 70.63 4 ALPENA COUNTY 35.02 63.61 -28.59 98.63 0 0 0 25,412 Inf Inf 67.85 67.85 5 ANTRIM COUNTY 37.43 61.15 -23.72 98.57 0 0 0 23,738 Inf Inf 71.24 71.24 6 ARENAC COUNTY 29.05 69.62 -40.57 98.67 0 0 0 11,802 Inf Inf 77.64 77.64 7 BARAGA COUNTY 34.35 64.15 -29.80 98.50 0 0 0 6,951 Inf Inf 62.32 62.32 8 BARRY COUNTY 32.08 66.41 -34.33 98.50 0 0 0 53,251 Inf Inf 72.53 72.53 9 BENZIE COUNTY 44.91 53.57 -8.66 98.48 0 0 0 17,258 Inf Inf 74.58 74.58 10 CALHOUN COUNTY 42.47 56.56 -14.09 99.03 0 0 0 112,922 Inf Inf 60.45 60.45 11 CASS COUNTY 32.42 66.29 -33.87 98.71 0 0 0 94,963 Inf Inf 29.40 29.40 12 CHARLEVOIX COUNTY 40.71 57.60 -16.89 98.31 0 0 0 24,397 Inf Inf 72.46 72.46 13 CHEBOYGAN COUNTY 33.68 64.73 -31.05 98.41 0 0 0 23,112 Inf Inf 71.21 71.21 14 CHIPPEWA COUNTY 36.96 61.18 -24.22 98.14 0 0 0 28,466 Inf Inf 64.59 64.59 15 CLINTON COUNTY 44.83 53.42 -8.59 98.26 0 0 0 66,393 Inf Inf 75.42 75.42 16 CRAWFORD COUNTY 32.43 66.14 -33.71 98.56 0 0 0 12,765 Inf Inf 66.49 66.49 17 DICKINSON COUNTY 31.04 67.28 -36.24 98.33 0 0 0 23,913 Inf Inf 64.17 64.17 18 EMMET COUNTY 43.68 54.42 -10.74 98.11 0 0 0 31,372 Inf Inf 73.01 73.01 19 GOGEBIC COUNTY 40.71 57.76 -17.05 98.47 0 0 0 13,983 Inf Inf 59.47 59.47 20 HILLSDALE COUNTY 23.66 75.04 -51.38 98.70 0 0 0 32,372 Inf Inf 76.70 76.70 21 HOUGHTON COUNTY 40.61 57.62 -17.01 98.23 0 0 0 27,848 Inf Inf 69.68 69.68 22 INGHAM COUNTY 63.75 34.10 29.65 97.84 0 0 0 223,383 Inf Inf 66.39 66.39 23 IONIA COUNTY 33.33 65.19 -31.87 98.52 0 0 0 49,858 Inf Inf 68.24 68.24 24 IRON COUNTY 34.71 64.00 -29.29 98.71 0 0 0 11,059 Inf Inf 63.60 63.60 25 JACKSON COUNTY 38.59 59.88 -21.30 98.47 0 0 0 129,053 Inf Inf 64.96 64.96 26 KEWEENAW COUNTY 42.75 55.51 -12.76 98.27 0 0 0 2,122 Inf Inf 76.06 76.06 27 LAPEER COUNTY 29.43 69.18 -39.74 98.61 0 0 0 75,542 Inf Inf 73.48 73.48 28 LEELANAU COUNTY 53.08 45.34 7.74 98.43 0 0 0 20,094 Inf Inf 88.19 88.19 29 LENAWEE COUNTY 37.74 60.76 -23.01 98.50 0 0 0 82,006 Inf Inf 67.16 67.16 30 LIVINGSTON COUNTY 37.38 61.32 -23.94 98.70 0 0 0 168,904 Inf Inf 78.42 78.42 31 LUCE COUNTY 25.71 72.55 -46.84 98.26 0 0 0 5,844 Inf Inf 51.18 51.18 32 MACKINAC COUNTY 36.90 61.76 -24.87 98.66 0 0 0 10,598 Inf Inf 68.38 68.38 33 MANISTEE COUNTY 41.17 57.09 -15.92 98.26 0 0 0 23,434 Inf Inf 65.39 65.39 34 MARQUETTE COUNTY 53.49 44.76 8.73 98.25 0 0 0 56,240 Inf Inf 69.36 69.36 35 MASON COUNTY 38.47 59.75 -21.28 98.22 0 0 0 2,145 Inf Inf 845.03 845.03 36 MECOSTA COUNTY 34.14 64.14 -30.00 98.28 0 0 0 33,368 Inf Inf 67.49 67.49 37 MENOMINEE COUNTY 32.52 66.07 -33.55 98.59 0 0 0 21,238 Inf Inf 61.62 61.62 38 MISSAUKEE COUNTY 21.25 77.21 -55.95 98.46 0 0 0 13,010 Inf Inf 70.35 70.35 39 MONTCALM COUNTY 29.75 68.72 -38.97 98.48 0 0 0 46,138 Inf Inf 75.52 75.52 40 MONTMORENCY COUNTY 26.59 71.85 -45.26 98.44 0 0 0 9,334 Inf Inf 68.58 68.58 41 MUSKEGON COUNTY 48.36 50.15 -1.79 98.51 0 0 0 95,754 Inf Inf 99.40 99.40 42 OCEANA COUNTY 34.16 64.14 -29.98 98.31 0 0 0 22,784 Inf Inf 65.33 65.33 43 OGEMAW COUNTY 28.30 70.23 -41.93 98.54 0 0 0 18,953 Inf Inf 66.70 66.70 44 ONTONAGON COUNTY 34.16 64.49 -30.33 98.65 0 0 0 5,787 Inf Inf 66.42 66.42 45 OSCODA COUNTY 27.21 71.50 -44.29 98.71 0 0 0 7,891 Inf Inf 65.86 65.86 46 OTSEGO COUNTY 31.58 66.84 -35.26 98.41 0 0 0 24,216 Inf Inf 66.07 66.07 47 OTTAWA COUNTY 39.02 59.46 -20.44 98.48 0 2 -2 237,953 Inf 5,306,650 75.02 75.02 48 PRESQUE ISLE COUNTY 34.66 63.56 -28.90 98.22 0 0 0 10,941 Inf Inf 80.07 80.07 49 ROSCOMMON COUNTY 32.91 65.84 -32.92 98.75 0 0 0 23,947 Inf Inf 67.12 67.12 50 SANILAC COUNTY 25.50 73.11 -47.62 98.61 0 0 0 29,357 Inf Inf 79.58 79.58 51 SCHOOLCRAFT COUNTY 33.30 65.25 -31.95 98.55 0 0 0 7,542 Inf Inf 64.94 64.94 52 ST. CLAIR COUNTY 31.91 66.50 -34.59 98.41 0 0 0 131,539 Inf Inf 73.48 73.48 53 TUSCOLA COUNTY 27.84 70.79 -42.95 98.63 0 0 0 43,951 Inf Inf 69.95 69.95 54 WAYNE COUNTY 62.49 33.61 28.88 96.11 0 0 0 1,480,511 Inf Inf 58.04 58.04 55 WEXFORD COUNTY 31.92 66.51 -34.59 98.43 0 0 0 29,414 Inf Inf 66.29 66.29 56 BAY Other 42.01 56.72 -14.71 98.73 0 0 0 0 Inf Inf Inf Inf 57 BERRIEN Other 22.50 26.41 -3.91 48.91 0 0 0 0 Inf Inf Inf Inf 58 BRANCH Other 28.03 70.41 -42.38 98.44 0 0 0 0 Inf Inf Inf Inf 59 CLARE Other 15.17 33.86 -18.70 49.03 0 0 0 0 Inf Inf Inf Inf 60 DELTA Other 16.96 32.07 -15.11 49.04 0 0 0 0 Inf Inf Inf Inf 61 EATON Other 46.76 49.84 -3.08 96.60 0 0 0 0 Inf Inf Inf Inf 62 GENESEE Other 51.31 47.12 4.19 98.43 0 0 0 0 Inf Inf Inf Inf 63 GLADWIN Other 29.03 69.71 -40.68 98.74 0 0 0 0 Inf Inf Inf Inf 64 GRAND TRAVERSE Other 48.11 49.82 -1.72 97.93 0 0 0 0 Inf Inf Inf Inf 65 GRATIOT Other 16.75 32.32 -15.57 49.07 0 0 0 0 Inf Inf Inf Inf 66 HURON Other 29.09 69.66 -40.57 98.75 0 0 0 0 Inf Inf Inf Inf 67 IOSCO Other 16.86 32.04 -15.18 48.90 0 0 0 0 Inf Inf Inf Inf 68 ISABELLA Other 26.17 22.81 3.36 48.98 0 0 0 0 Inf Inf Inf Inf 69 KALAMAZOO Other 28.79 19.99 8.80 48.79 0 0 0 0 Inf Inf Inf Inf 70 KALKASKA Other 27.76 70.55 -42.80 98.31 0 0 0 0 Inf Inf Inf Inf 71 KENT Other 25.70 23.04 2.66 48.74 0 0 0 0 Inf Inf Inf Inf 72 LAKE Other 16.49 32.46 -15.97 48.95 0 0 0 0 Inf Inf Inf Inf 73 MACOMB Other 41.86 55.43 -13.57 97.29 0 0 0 0 Inf Inf Inf Inf 74 MIDLAND Other 20.64 28.18 -7.54 48.83 0 0 0 0 Inf Inf Inf Inf 75 MONROE Other 17.74 31.22 -13.48 48.96 0 0 0 0 Inf Inf Inf Inf 76 NEWAYGO Other 13.82 35.06 -21.23 48.88 0 0 0 0 Inf Inf Inf Inf 77 OAKLAND Other 53.72 43.25 10.47 96.97 0 0 0 0 Inf Inf Inf Inf 78 OSCEOLA Other 12.54 36.34 -23.80 48.88 0 0 0 0 Inf Inf Inf Inf 79 SAGINAW Other 23.35 24.14 -0.79 47.49 0 0 0 0 Inf Inf Inf Inf 80 SHIAWASSEE Other 18.73 30.20 -11.46 48.93 0 0 0 0 Inf Inf Inf Inf 81 ST. JOSEPH'S Other 32.20 66.11 -33.90 98.31 0 0 0 0 Inf Inf Inf Inf 82 VAN BUREN Other 20.71 28.23 -7.53 48.94 0 0 0 0 Inf Inf Inf Inf 83 WASHTENAW Other 70.74 26.49 44.25 97.22 0 0 0 0 Inf Inf Inf Inf 84 TOTAL TOTAL 40.43 41.54 -1.11 81.97 0 4 -4 7,810,340 Inf 140,245,550 172.92 172.92As can be seen, the last 28 counties (BAY through WASTENAW) contain zero for TOTAL2 and Inf for the last two columns (the turnout). An inspection of the OpenElections data reveals that it contains no registration data for these 28 counties.
Due to its variety and lack of standardization, election data can be very difficult to parse. An introduction to the issue of standarization can be found at this link. Due to this difficulty in parsing, there can be cases when the data is not structured correctly. An example of data that appears to be misstructured can be seen via the following steps:
This will display the following plots:
This should display the CVTs of the 9 Michigan counties that have the most votes. However, Kent, Kalamazoo, Saginaw, and Monroe counties all show totals that are greater for Other than for Dem (Democrat) or Rep (Republican). The reason for this can be seen by clicking on the Areas tab and setting COUNTY to each of the 9 counties. It turns out that Kent, Kalamazoo, Saginaw, and Monroe counties all include Cast_U as one of the candidates and this column contains numbers far higher than the other candidates. In fact, it turns out that Cast_U comes from "Ballots Cast" being included as a candidate. The actual data can be found online at this link. Searching the file reveals that "Ballots Cast" are included in the candidate column of those four counties (and some others) instead of the expected office column.
As described in the prior section, OpenElections data may be missing data or contain some misstructured or otherwise erroneous data. This may be most likely with newer data where there has not yet been time to parse the data or where the parsed data has received less scrutiny. In addition, there may be a need to reproduce all or some portion of the data from the original state or county data in order to verify it. For these cases, it's possible to write programs that will parse and convert the source data from the state or county into a format that can be accessed by the program.
All of the examples up to this point have used the public online version of this app at https://econdata.shinyapps.io/voting_oe24/. In order to have the app access newly created data, the code for the app needs to be downloaded from https://github.com/rdavis27/voting_oe and run on a local machine. This will give the user access to the data subdirectory which is where new data files are stored.
The program at https://github.com/rdavis27/voting_oe/blob/main/makedata/pa2024/make_pa2024all.R will download election and registration data for Pennsylvania for the 2024 general election, parse it, and create the file 20241105__pa__GE__precinct.csv in the data directory for use by the application. The data comes from this Bulk Election Data page on the Pennsylvania Government website. However, that website states the following:
The D epartment o f State provides public access to both unofficial and official election returns submitted by the county boards of elections. Beginning on election night, unofficial countywide election returns are posted by the depar tment as th ey are received from the counties. Returns remain unofficial until certified. Official countywide election returns are tabulated by the department and certified under the Seal of the Secretary of the Commo nwealth to the appropriate officer(s). A summary of the certified election returns is published on the department's website at Pennsylvania Elections - Summary Results (pa.gov). Prec inct-level election returns are reported by county election officials through the department's Elections and Campaign Finance system. Official precinct election returns are maintained by the county boards of elections
Checking the total votes in the bulk data, it appears that this data in unofficial. However, the following table shows how close the totals are to the official data:
Total Democrat Republican Year Bulk Bulk Official Change %Change Bulk Official Change %Change ---- --------- --------- --------- ------ ------- --------- --------- ------- ------- 2024 7,031,737 3,420,865 3,423,042 2,177 0.06 3,543,041 3,543,308 267 0.01 2020 6,916,044 3,457,343 3,458,229 886 0.03 3,379,320 3,377,674 -1,646 -0.05 2016 6,114,296 2,925,758 2,926,441 683 0.02 2,970,378 2,970,733 355 0.01 2012 5,734,022 2,985,454 2,990,274 4,820 0.16 2,672,742 2,680,434 7,692 0.29 2008 6,006,568 3,275,699 3,276,363 664 0.02 2,655,380 2,655,885 505 0.02 2004 5,747,431 2,925,060 2,938,095 13,035 0.45 2,781,957 2,793,847 11,890 0.43 2000 4,911,538 2,486,468 2,485,967 -501 -0.02 2,279,403 2,281,127 1,724 0.08
Analyzing a Single Race with New Data
Precinct data for Allegheny County in the newly Pennsylvania data can be displayed via the following steps:
As can be seen, the columns consist of COUNTY, AREA, TOTAL, Harris_D, Trump_R, Stein_G, Oliver_L, DEM_CVT, and REP_CVT. COUNTY is Allegheny in this case and AREA refers to the precinct names (except for Wisconsin where it refers to the ward names). TOTAL is the total votes and the next four columns are the last names of the candidates followed by an underscore and a character to indicate the party. DEM_CVT and REP_CVT are cumulative vote shares used in CVTs (cumulative vote tallys).
Clicking on the "Area Plot" tab will then display the following page:
This shows the total votes versus the vote margin in every precinct in Allegheny County in the President's race. Hovering over any of the precincts causes a popup to be displayed which shows the total votes and percent margin. That is the cause of the popup visible next to the precinct on the far right. Looking at the precinct in the list on the Areas tab shows this to be Precinct 4870.
The plot above shows that the solid Democrat precincts tend to be smaller on average than the Toss-Up and solid Republican precincts. Clicking on the CVT tab now will display the following page:
The use of CVTs (Cumulative Vote Tallies) are described at this link. The CVT plot shows that precincts with the fewest total votes tend to be strongly Democrat. This is in agreement with the prior Area Plot.
The CVT plots for the 9 counties with the most votes can be displayed via the following additional steps:
Analyzing Voter Turnout with New Data
The turnout of a single race in a single county can be displayed via the following steps:
The y-axis shows the turnout in every precinct and is calculated by dividing the total votes for President by the total number of registered voters in each precinct. As can be seen, the solid Republican precincts look to have had about 80 percent turnout on average. However, the turnout in the solid Democrat precincts seemed to drop off down to about 40 percent. The turnout plots for the 9 counties with the most votes can be displayed via the following additional steps:
Changing "Starting index" to 10 will then display the plots for the 9 counties with the next highest votes:
Especially in 6th county (Chester) through the 16th county (Erie), the pattern looks a bit like a gun facing left, with the barrel on the left at about 80 percent turnout and the handle on the right reaching down to about 40 percent. There may be reasons why Republican voters might have tended to have higher turnout in Pennsylvania but it's difficult to think of anything that would cause the turnout of ALL voters to drop off sharply at just the point where the precincts start to lean Democrat. Still, looking at the turnout in earlier years reveals that this pattern is not totally new. One can get the corresponding turnout plots for 2008 via the following additional steps:
This will display the following plots:
The gun patterns are less distinct and the "barrels" are noticably shorter. Still, the turnout is noticably less in most of the solid Democrat precincts. Also, this is in 2008, the year that Obama beat McCain in Pennsylvania by over 10 points. Hence, it would seem that turnout was likely not the key determinant in Trump's win in 2024. It would also be worth looking at any changes in the vote margins since 2020.
Comparing Multiple Races from a Single Election
Looking at the Dropoff from the Presidential to the Senate Race by County
A Reddit post titled "A deeper look into PA voting irregularities" states the following:
In a previous post I went over how many times the Democratic total votes for Senator was greater than the Democratic total votes for President in PA (Nevada too). I don't mean ticket splitting. In every election, voters generally decrease in numbers, even if just a little from the biggest races, like for President downward. In PA, 47 counties have more Democratic Senate Votes than Democratic Presidential Votes.
Take Cameron County, 580 D Senate Votes, and 538 D Presidential Votes. (More Senate votes than President votes) Where R Senate Votes were 1558 and R Presidential 1654. (More President votes, which is the norm). I didn't understand why this pattern was happening ONLY for Democrat votes, but also mostly in smaller counties - under 60,000 voters.
The following plots shows the percent drop from the Presidential to the Senate race for Democrat, Republican, and Total voters in Pennsylvania in 2024 by county.
As stated in the Reddit post, 47 of the 68 counties had a negative drop signifying that there were more Democratic Senate Votes than Democratic Presidential Votes. Cameron County had the fifth largest negative drop. The DEM_SH column in the following table shows the counties with the five largest negative drops:
PA: % Drop in Democrat Votes from 2024 President of the US to 2024 US Senator (Count % drop) COUNTY AREA Dem Rep MARGIN1 TOTAL1 Dem.1 Rep.1 MARGIN2 TOTAL2 DEM_SH REP_SH MAR_SH TOT_SH 1 GREENE COUNTY 4,592 12,319 -7,727 17,236 5,075 11,643 -6,568 17,145 -10.52 5.49 15.00 0.53 2 FULTON COUNTY 1,102 7,039 -5,937 8,177 1,197 6,773 -5,576 8,116 -8.62 3.78 6.08 0.75 3 JUNIATA COUNTY 2,290 9,721 -7,431 12,104 2,478 9,251 -6,773 12,042 -8.21 4.83 8.85 0.51 4 CAMBRIA COUNTY 21,177 49,408 -28,231 71,136 22,887 46,482 -23,595 71,004 -8.07 5.92 16.42 0.19 5 CAMERON COUNTY 538 1,654 -1,116 2,219 580 1,558 -978 2,214 -7.81 5.80 12.37 0.23As can be seen, the vote numbers in the post above match the table and Cameron County had a drop of negative 7.81 percent. Following are the corresponding plots for 2020:
As can be seen in the plots above, the pattern was broken in 2008 when there was a large positive dropoff in Democrat votes and a large negative dropoff in Republican votes. Hence, the current negative dropoff in Democrat votes may be an item of concern, possibly indicative of some level of voter suppression, vote manipulation, or change in voter sentiment. But it does not appear to be a totally new phenomena. Finally, following are the corresponding plots for 2004 and 2000:
Comparing Multiple Races from Multiple Elections
The vote margins in the 2020 and 2024 Presidential races in Pennsylvania can be compared via the following steps:
This will display the following plot:
The plot shows that the solid Republican and toss-up precincts appear to have changed little in their support on average, perhaps shifting slightly Republican (down). However, the solid Democrat precincts appear to have shifted much more, perhaps about 5 percent on average. It's possible to look at the shifts by county via the following additional steps:
This will display the following plots:
This shows that all of the solid Democrat and Toss-up precincts and the great majority of the solid Republican precincts shifted Republican (down). The amount appears to be about 2.5 percent for the solid Republican precincts and about 4 percent for the others. This would appear to be a major contributor to Trump's win in Pennsylvania in 2024. In contrast, the following two plots compare 2016 and 2024 in the same way:
The above plot shows that the solid Republican and toss-up precincts appear to have shifted slightly Democrat (up) since 2016. This appears also true of the less solid Democrat precincts but the more solid Democrat precincts appear to have shifted noticably Republican on average.
The above plot shows that there appears to have been much less change on average among all of the counties since 2016. Philadelphia, however, can be seen to have shifted about 8 percent Republican during that period.
The change in the precincts of the 9 counties with the most votes can be seen via the following steps:
As can be seen, the solid Republican precincts in all of the counties except Philadelphia appear to have shifted slightly Democrat (up) since 2016. However, the solid Democrat precincts have generally shifted Republican (down). The shift may be most noticable in the last 3 counties (Lancaster, York, and Berks) where the precincts have shifted so far Republican so as to approach the dashed line. The dashed line is essentially where the y-axis is in 2024. Hence, those precincts still lean Democrat but will have flipped to leaning Republican if they cross over the dashed line. This pattern is reminiscent of a pattern seen in comparing the 2016 and 2020 presidential races in Texas as seen in the following 9 graphs from this page.
The above 9 counties consist of the 8 southernmost counties in Texas, plus Maverick County. The pattern differs a little bit from the pattern seen in Pennsylvania in that the Texas counties contain few Republican precincts.