Version 2.0 | First Created May 18, 2026 | Updated May 23, 2026
This is a study of gerrymandering in Louisiana. Our objective is two-fold. First. we will introduce metrics that test for the presence of a gerrymander. Second, we will test for the possible presence of gerrymandering in Louisiana using three different approaches - a traditional approach based on methods of shape-based compactness scores, another approach based on population composition or representation, and a final composite approach. Our focus will be on the representativeness of congressional districts using the voting results of prior presidential elections and the geographic distribution populations of different race. This work extends prior studies by extending metrics based on the convex hulls and minimum bounding circles of district polygons to include composition.
Keywords: gerrymandering, compactness, convex hull, minimum bounding circle, area weighted reaggregation
The data used in this analysis includes the (1) Louisiana Congressional Districts, (2) Louisiana Voting Precincts, (3) 2020 Louisiana Block Groups, and (4) 2020 Census Data. As background information, Louisiana has 6 congressional districts. Precincts are the smallest geographic unit of election administration, and block groups are the smallest unit of census data reporting.
# file paths
districts_file <- list(
"HB1" = here("data", "raw", "HB1", "HB1_Congress_221ES.shp"),
"SB4" = here("data", "raw", "SB4", "Congress_-_SB4_Original_(Price).shp"),
"SB8" = here("data", "raw", "SB8", "Act_2_1st_ES_(2024)_-_Congress.shp"),
"SB121" = here("data", "raw", "SB121", "SB_121_Enrolled.shp")
)
blockgroup_file <- here("data", "raw", "LA_block_groups.gpkg")
precincts_file <- here("data", "raw", "LA_precincts.gpkg")
census_metadata_file <- here::here("data", "metadata", "census2020pl_vars.csv")
# read in the data
districts <- st_read(districts_file$SB121)
precincts <- st_read(precincts_file, layer = "LA_precincts_clipped")
blockgroups <- st_read(blockgroup_file)
census2020pl_vars <- read.csv(census_metadata_file)A quick visualization of the three geographic datasets shows that the districts are large and irregularly shaped, the precincts are smaller and more numerous, and the block groups are the smallest and most numerous.
Figure 1: Visualize Louisiana Precincts, Block Groups, and Districts
The districts, precincts, and block groups are in different coordinate reference systems (CRS). To perform spatial operations, we need to transform them to a common CRS. We will use the NAD 1983 geographic coordinate system (EPSG:4269) for all datasets.
districts <- districts |> st_transform(4269) |>
rename_with(~ "DISTRICT", any_of("DISTRICT_I"))
st_geometry(districts) <- "geom"
blockgroups <- blockgroups |> st_transform(4269)
st_geometry(blockgroups) <- "geom"
precincts <- precincts |> st_make_valid() |> st_transform(4269)
st_geometry(precincts) <- "geom"As the first step in our analysis, we want to compute the percentage of the population 18 years or older identified in the census as a minority. We will focus on the Black or African American population here, but this process can be repeated for other racial and ethnic minority categories. We do this by reading in the metadata for the 2020 Census data and identifying the variables that correspond to the population 18 years or older that is Black or African American alone or in combination with any other race(s).
minority_cat <- "Black"
minority_vars <- census2020pl_vars |>
dplyr::filter(str_detect(name, "P3"),
str_detect(label, minority_cat)) |>
select(-concept)Table 1: Extract Census Variables
| Variable | Label |
|---|---|
| P3_004N | !!Total:!!Population of one race:!!Black or African American alone |
| P3_011N | !!Total:!!Population of two or more races:!!Population of two races:!!White; Black or African American |
| P3_016N | !!Total:!!Population of two or more races:!!Population of two races:!!Black or African American; American Indian and Alaska Native |
| P3_017N | !!Total:!!Population of two or more races:!!Population of two races:!!Black or African American; Asian |
| P3_018N | !!Total:!!Population of two or more races:!!Population of two races:!!Black or African American; Native Hawaiian and Other Pacific Islander |
| P3_019N | !!Total:!!Population of two or more races:!!Population of two races:!!Black or African American; Some Other Race |
| P3_027N | !!Total:!!Population of two or more races:!!Population of three races:!!White; Black or African American; American Indian and Alaska Native |
| P3_028N | !!Total:!!Population of two or more races:!!Population of three races:!!White; Black or African American; Asian |
| P3_029N | !!Total:!!Population of two or more races:!!Population of three races:!!White; Black or African American; Native Hawaiian and Other Pacific Islander |
| P3_030N | !!Total:!!Population of two or more races:!!Population of three races:!!White; Black or African American; Some Other Race |
| P3_037N | !!Total:!!Population of two or more races:!!Population of three races:!!Black or African American; American Indian and Alaska Native; Asian |
| P3_038N | !!Total:!!Population of two or more races:!!Population of three races:!!Black or African American; American Indian and Alaska Native; Native Hawaiian and Other Pacific Islander |
| P3_039N | !!Total:!!Population of two or more races:!!Population of three races:!!Black or African American; American Indian and Alaska Native; Some Other Race |
| P3_040N | !!Total:!!Population of two or more races:!!Population of three races:!!Black or African American; Asian; Native Hawaiian and Other Pacific Islander |
| P3_041N | !!Total:!!Population of two or more races:!!Population of three races:!!Black or African American; Asian; Some Other Race |
| P3_042N | !!Total:!!Population of two or more races:!!Population of three races:!!Black or African American; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_048N | !!Total:!!Population of two or more races:!!Population of four races:!!White; Black or African American; American Indian and Alaska Native; Asian |
| P3_049N | !!Total:!!Population of two or more races:!!Population of four races:!!White; Black or African American; American Indian and Alaska Native; Native Hawaiian and Other Pacific Islander |
| P3_050N | !!Total:!!Population of two or more races:!!Population of four races:!!White; Black or African American; American Indian and Alaska Native; Some Other Race |
| P3_051N | !!Total:!!Population of two or more races:!!Population of four races:!!White; Black or African American; Asian; Native Hawaiian and Other Pacific Islander |
| P3_052N | !!Total:!!Population of two or more races:!!Population of four races:!!White; Black or African American; Asian; Some Other Race |
| P3_053N | !!Total:!!Population of two or more races:!!Population of four races:!!White; Black or African American; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_058N | !!Total:!!Population of two or more races:!!Population of four races:!!Black or African American; American Indian and Alaska Native; Asian; Native Hawaiian and Other Pacific Islander |
| P3_059N | !!Total:!!Population of two or more races:!!Population of four races:!!Black or African American; American Indian and Alaska Native; Asian; Some Other Race |
| P3_060N | !!Total:!!Population of two or more races:!!Population of four races:!!Black or African American; American Indian and Alaska Native; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_061N | !!Total:!!Population of two or more races:!!Population of four races:!!Black or African American; Asian; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_064N | !!Total:!!Population of two or more races:!!Population of five races:!!White; Black or African American; American Indian and Alaska Native; Asian; Native Hawaiian and Other Pacific Islander |
| P3_065N | !!Total:!!Population of two or more races:!!Population of five races:!!White; Black or African American; American Indian and Alaska Native; Asian; Some Other Race |
| P3_066N | !!Total:!!Population of two or more races:!!Population of five races:!!White; Black or African American; American Indian and Alaska Native; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_067N | !!Total:!!Population of two or more races:!!Population of five races:!!White; Black or African American; Asian; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_069N | !!Total:!!Population of two or more races:!!Population of five races:!!Black or African American; American Indian and Alaska Native; Asian; Native Hawaiian and Other Pacific Islander; Some Other Race |
| P3_071N | !!Total:!!Population of two or more races:!!Population of six races:!!White; Black or African American; American Indian and Alaska Native; Asian; Native Hawaiian and Other Pacific Islander; Some Other Race |
Next, we will select the relevant variables from the block groups dataset and rename them for clarity. We will also calculate the area of each block group for later use in area-weighted reaggregation.
For reference:
Black is a sum of all 32 columns shown above, in which
any of the racial categories by which someone identifies is Black or
African American.Total is a copy of the population 18 years or over,
variable P3_001N.pctMinority is calculated as
Black / Total * 100CheckPct is calculated as the percentage of the
population 18 years or older that is either white of one race only
(P3_003N) or Black or African American as
calculated above.The CheckPct results should never exceed
100% and should be near 100% except where
significant populations of other minority races are present. If a large
number of areas are below 50%, then the researcher should
consider investigating other minority groups as well.
blockgroups_calc <- blockgroups |>
rowwise() |>
mutate(minority = sum(c_across(all_of(minority_vars$name)))) |>
ungroup() |>
mutate(sarea = st_area(geom),
Total = P3_001N,
pctMinority = minority / Total * 100,
CheckPct = (minority + P3_003N) / Total * 100) |>
select(GEOID, sarea, minority, Total, pctMinority, CheckPct)Similarly, for the precincts, we will calculate the
total votes totV for major party candidates based on the
variables G24PRERTRU (total votes for the Republican
candidate) and G24PREDHAR (total votes for the Democratic
candidate). We will calculate the minority party votes mpV
based on the variable G24PREDHAR (total votes for the
Democratic candidate). Please not that the majority and minority party
designations are state specific. For example, if this analysis were
conducted in California, it would be sensible to reverse these
designations because democratic voters outnumber republican votes in
that state. We will also calculate the area of each precinct for later
use in area-weighted reaggregation.
precincts <- precincts |>
mutate(
totV = G24PRERTRU + G24PREDHAR,
mpV = G24PREDHAR) |>
mutate(sarea = st_area(geom))Figure 2: Visualization of Demographic Variables
We will estimate the minority population percentage and minority party vote percentages in each district by performing an area-weighted reaggregation (AWR) of the block group data and precincts data. This involves intersecting the block groups with the districts, calculating the area of the intersection, and then weighting the population counts by the proportion of the block group that falls within each district. We will do this for the total population and the minority population to calculate the percentage of minority population in each district.
For more details on the AWR method, see Chapter 4 of this Simple Feature Workbook
district_estimates <- st_intersection(blockgroups_calc, districts) |>
st_make_valid() |>
mutate(
awTot = Total * as.numeric(st_area(geom) / sarea),
awMinor = minority * as.numeric(st_area(geom) / sarea)
) |>
st_drop_geometry() |>
group_by(DISTRICT) |>
summarize(bgTotal = sum(awTot),
bgMinority = sum(awMinor))
districts_join <- districts |>
left_join(district_estimates, by = "DISTRICT") |>
mutate(pctMinoritybg = round(bgMinority / bgTotal * 100, 1))Then we will do the same for the precincts to estimate the total votes and minority party votes in each district, which will allow us to calculate the percentage of minority party votes in each district.
district_estimates <- st_intersection(precincts, districts) |>
st_make_valid() |>
mutate(
awTot = totV * as.numeric(st_area(geom) / sarea),
awMinor = mpV * as.numeric(st_area(geom) / sarea)
) |>
st_drop_geometry() |>
group_by(DISTRICT) |>
summarize(totV = sum(awTot),
mpV = sum(awMinor))
districts_join <- districts_join |>
left_join(district_estimates, by = "DISTRICT") |>
mutate(pctMP = round(mpV / totV * 100, 1))Table 2: District Table with Demographic Variables Included
| District | Total Pop | Minority Pop | Pct Minority | Total Voters | Minority Party Votes | Pct Minority Party Votes |
|---|---|---|---|---|---|---|
| 1 | 604549 | 84130 | 13.9 | 354186 | 107889 | 30.5 |
| 2 | 593293 | 341926 | 57.6 | 307538 | 228663 | 74.4 |
| 3 | 587598 | 162760 | 27.7 | 334036 | 105807 | 31.7 |
| 4 | 591346 | 179686 | 30.4 | 315635 | 103232 | 32.7 |
| 5 | 597048 | 197964 | 33.2 | 316944 | 103973 | 32.8 |
| 6 | 596556 | 149267 | 25.0 | 347036 | 117306 | 33.8 |
Convex hulls are the smallest convex shape that can enclose a given geometry. They are often used as a simple way to approximate the shape of a district and to calculate compactness scores.
d_ch <- districts |>
sf::st_convex_hull() |>
mutate(chArea = st_area(geom)) # compute the area of the convex hullFigure 3: Convex Hull of Louisiana Districts
We will create convex hulls for each district and then estimate the minority population percentage and minority party vote percentage within those convex hulls using the same area-weighted reaggregation method as before.
# estimate the population in the convex hulls using AWR with block groups
d_ch_est <- blockgroups_calc |>
st_intersection(d_ch) |>
st_make_valid() |>
mutate(
fArea = st_area(geom),
awTot = Total * as.numeric(fArea / sarea),
awMinor = minority * as.numeric(fArea / sarea),
) |>
st_drop_geometry() |>
group_by(DISTRICT, chArea) |>
summarize(chTotal = sum(awTot),
chMinority = sum(awMinor))Table 3: Demographic Variables in Convex Hull
| District | Total Pop in Convex Hull | Minority Pop in Convex Hull | Pct Minority in Convex Hull |
|---|---|---|---|
| 1 | 1190660 | 368437 | 30.9 |
| 2 | 1276540 | 486641 | 38.1 |
| 3 | 715505 | 185566 | 25.9 |
| 4 | 991671 | 308298 | 31.1 |
| 5 | 842946 | 284292 | 33.7 |
| 6 | 945091 | 305679 | 32.3 |
The same process is repeated for the precincts to estimate the total voters and minority party votes in the convex hulls, which will allow us to calculate the percentage of minority party votes in each convex hull.
# voting population estimates in the convex hulls using AWR with precincts
d_ch_estV <- precincts |>
st_intersection(d_ch) |>
st_make_valid() |>
mutate(
fArea = st_area(geom),
awTot = totV * as.numeric(fArea / sarea),
awMinor = mpV * as.numeric(fArea / sarea),
) |>
st_drop_geometry() |>
group_by(DISTRICT) |>
summarize(chtotV = sum(awTot),
chmpV = sum(awMinor))Table 4: Voting Variables in Convex Hull
| District | Total Voters in Convex Hull | Minority Party Votes in Convex Hull | Pct Minority Party Votes in Convex Hull |
|---|---|---|---|
| 1 | 655051 | 302813 | 46.2 |
| 2 | 685492 | 371525 | 54.2 |
| 3 | 404142 | 121605 | 30.1 |
| 4 | 521079 | 170384 | 32.7 |
| 5 | 467024 | 157745 | 33.8 |
| 6 | 538436 | 216423 | 40.2 |
Minimum bounding circles (MBCs) are the smallest circles that can enclose a given geometry. They are another way to approximate the shape of a district and to calculate compactness scores. Can you guess why we transformed the districts to UTM Zone 15 North prior to calculating the minimum bounding circles?
d_mbc <- districts |>
st_transform(26915) |>
lwgeom::st_minimum_bounding_circle() |>
st_transform(4269) |>
mutate(mbcArea = st_area(geom))Figure 4: Minimum Bounding Circle of Louisiana Districts
We will repeat the same process as with the convex hulls to estimate the minority population percentage and minority party vote percentage within the minimum bounding circles using area-weighted reaggregation.
d_mbc_est <- blockgroups_calc |>
st_intersection(d_mbc) |>
st_make_valid() |>
mutate(
fArea = st_area(geom),
awTot = Total * as.numeric(fArea / sarea),
awMinority = minority * as.numeric(fArea / sarea),
) |>
st_drop_geometry() |>
group_by(DISTRICT, mbcArea) |>
summarize(mbcTotal = sum(awTot),
mbcMinority = sum(awMinority))Table 5: Demographic Variables in Minimum Bounding Circle
| District | Total Pop in MBC | Minority Pop in MBC | Pct Minority in MBC |
|---|---|---|---|
| 1 | 1369713 | 409925 | 29.9 |
| 2 | 1784895 | 582514 | 32.6 |
| 3 | 1241535 | 383933 | 30.9 |
| 4 | 1343959 | 423299 | 31.5 |
| 5 | 1560140 | 504932 | 32.4 |
| 6 | 1529924 | 456488 | 29.8 |
Below is the same process for the precincts to estimate the total voters and minority party votes in the minimum bounding circles, which will allow us to calculate the percentage of minority party votes in each minimum bounding circle.
d_mbc_estV <- precincts |>
st_intersection(d_mbc) |>
st_make_valid() |>
mutate(
fArea = st_area(geom),
awTot = totV * as.numeric(fArea / sarea),
awMinor = mpV * as.numeric(fArea / sarea),
) |>
st_drop_geometry() |>
group_by(DISTRICT) |>
summarize(mbctotV = sum(awTot),
mbcmpV = sum(awMinor))Table 6: Voting Variables in Minimum Bounding Circle
| District | Total Voters in MBC | Minority Party Votes in MBC | Pct Minority Party Votes in MBC |
|---|---|---|---|
| 1 | 769716 | 336026 | 43.7 |
| 2 | 986611 | 450711 | 45.7 |
| 3 | 698048 | 257315 | 36.9 |
| 4 | 726771 | 238428 | 32.8 |
| 5 | 883600 | 321226 | 36.4 |
| 6 | 879486 | 330399 | 37.6 |
With everything calculated, we can now compare the demographic and voting composition of the actual districts to their convex hulls and minimum bounding circles and assess the compactness of the district shapes.
The first approach is the traditional compactness approach. This approach asks whether a district has an irregular or non-compact shape based only on its geometry. It does not consider who lives in the district or how people vote. One common compactness score is the Polsby–Popper ratio, which compares the area of a district to the square of its perimeter.
\[ \text{Polsby-Popper} = \frac{4\pi A_{\text{district}}}{P_{\text{district}}^2} \]
In this equation, \(A_{\text{district}}\) is the area of the district and \(P_{\text{district}}\) is the perimeter of the district. A value closer to 1 means the district is more compact and circle-like, while a value closer to 0 means the district is more elongated, irregular, or convoluted.
Another compactness measure compares the area of the district to the area of its convex hull. The convex hull is the smallest convex polygon that fully contains the district, similar to stretching a rubber band around the district.
\[ \text{Convex Hull Compactness} = \frac{A_{\text{district}}}{A_{\text{convex hull}}} \]
In this equation, \(A_{\text{district}}\) is the area of the district and \(A_{\text{convex hull}}\) is the area of the district’s convex hull. A value closer to 1 means the district closely fills its convex hull, while a lower value means the district has more indentations, gaps, or irregular extensions.
A third compactness measure is the Reock score, which compares the area of the district to the area of its minimum bounding circle. The minimum bounding circle is the smallest circle that fully contains the district.
\[ \text{Reock Score} = \frac{A_{\text{district}}}{A_{\text{minimum bounding circle}}} \]
In this equation, \(A_{\text{district}}\) is the area of the actual district and \(A_{\text{minimum bounding circle}}\) is the area of the smallest circle enclosing the district. A value closer to 1 means the district fills the circle efficiently, while a lower value suggests that the district is stretched out or spatially inefficient.
The second approach is the representation or composition approach. This approach asks what proportion of a racial, ethnic, or political group is represented within each district. For racial gerrymandering, the relevant composition might be the percentage of Black or African American voting-age population. For partisan gerrymandering, the relevant composition might be the percentage of Democratic votes.
\[ C_{\text{race}} = \frac{\text{Black or African American Voting Age Population}}{\text{Total Voting Age Population}} \times 100 \]
This measures the racial composition of a district as a percentage. It tells us what share of the voting-age population belongs to the racial group of interest.
\[ C_{\text{party}} = \frac{\text{Votes for Democrat}}{\text{Votes for Democrat} + \text{Votes for Republican}} \times 100 \]
This measures the partisan composition of a district as a percentage. It tells us what share of the two-party vote went to the Democratic candidate.
Both the compactness-based and the composition-based metrics can be calculated use the geometries that we prepared earlier.
districts_results <- districts_join |>
left_join(d_ch_est, by = "DISTRICT") |>
mutate(chPct = round(chMinority / chTotal * 100, 1),
chDiff = pctMinoritybg - chPct,
chAbsDiff = abs(chDiff)) |>
left_join(d_mbc_est, by = "DISTRICT") |>
mutate(mbcPct = round(mbcMinority / mbcTotal * 100, 1),
mbcDiff = pctMinoritybg - mbcPct,
mbcAbsDiff = abs(mbcDiff)) |>
left_join(d_ch_estV, by = "DISTRICT") |>
mutate(chPctV = round(chmpV / chtotV * 100, 1),
chDiffV = pctMP - chPctV,
chAbsDiffV = abs(chDiffV)) |>
left_join(d_mbc_estV, by = "DISTRICT") |>
mutate(mbcPctV = round(mbcmpV / mbctotV * 100, 1),
mbcDiffV = pctMP - mbcPctV,
mbcAbsDiffV = abs(mbcDiffV)) |>
# calculate compactness scores
mutate(
darea = st_area(geom),
dperim = st_length(st_cast(geom, "MULTILINESTRING")),
compact_shp = round( as.numeric((4 * pi * darea) / dperim^2), 2),
compact_hull = round( as.numeric(darea / chArea), 2),
compact_circ = round( as.numeric(darea / mbcArea), 2)
)The figure below compares the three compactness metrics across the 6 districts of Louisiana. The first thing to notice is that the measures disagree substantially for some districts. Some further questions to consider:
Which districts are consistently non-compact across all three measures?
Which districts change dramatically depending on the compactness metric?
Which measure appears most sensitive to elongated districts?
Figure 5: Compactness Score Comparison
Holler proposes a third parsimonious composite approach to the gerrymandering problem. Dr. Holler asks whether the district’s shape changes voter representation. The analysis compares the composition of the actual district to the composition of a compact geometric version of a similar district. Before we examine this’s mertic, let’s simply compare the distribution of black voters in the different geometries.
Table 7: Compactness and Composition Comparison
| District | Pct Minority in District | Pct Minority in Convex Hull | Difference (District - Convex Hull) | Absolute Difference (District - Convex Hull) | Pct Minority in MBC | Difference (District - MBC) | Absolute Difference (District - MBC) |
|---|---|---|---|---|---|---|---|
| 1 | 13.9 | 30.9 | -17.0 | 17.0 | 29.9 | -16.0 | 16.0 |
| 2 | 57.6 | 38.1 | 19.5 | 19.5 | 32.6 | 25.0 | 25.0 |
| 3 | 27.7 | 25.9 | 1.8 | 1.8 | 30.9 | -3.2 | 3.2 |
| 4 | 30.4 | 31.1 | -0.7 | 0.7 | 31.5 | -1.1 | 1.1 |
| 5 | 33.2 | 33.7 | -0.5 | 0.5 | 32.4 | 0.8 | 0.8 |
| 6 | 25.0 | 32.3 | -7.3 | 7.3 | 29.8 | -4.8 | 4.8 |
We can also visualize these racial differences along with the differences in party voting for each district and its bounding geometries. Figure 6. makes this comparison of the demographic and voting composition of the actual districts to their convex hulls and minimum bounding circles. The questions for consideration here are:
Which districts show the largest gap between actual composition and compact-shape composition?
Which districts appear potentially packed?
Which districts appear potentially cracked or diluted?
Which districts remain similar across all geometries?
Note that the key interpretation is based on the distance between the blue point and the compact-shape estimates.
Figure 6: Comparing Demographic and Voting Estimates
Holler’s metric is essentially a simple, but powerful, comparison of these differences,
\[ C_{\text{diff, convex hull}} = C_{\text{district}} - C_{\text{convex hull}} \]
\[ C_{\text{diff, minimum bounding circle}} = C_{\text{district}} - C_{\text{minimum bounding circle}} \]
If \(C_{\text{diff}}\) is strongly positive, the actual district contains a higher percentage of the group than the compact comparison shape. In the context of minority representation, this may suggest packing, especially if the district is already a minority-majority district, meaning that the group is over-represented in the actual district compared to the compact reference shape.
\[ C_{\text{diff}} > 0 \]
If \(C_{\text{diff}}\) is strongly negative, the actual district contains a lower percentage of the group than the compact comparison shape. This suggests cracking, dilution, or the exclusion of nearby group members from the district.
\[ C_{\text{diff}} < 0 \]
If \(C_{\text{diff}}\) is close to zero, then the district’s irregular shape may not meaningfully change the group’s composition. In this case, the district may look non-compact, but its shape does not appear to substantially distort racial or partisan representation.
\[ C_{\text{diff}} \approx 0 \]