Introduction

Research Question: How does the revenue from fees/forfeitures compare to total revenue within Virginia’s localities? Are there differences in assessment of fines, policing, incidences of traffic cases and case outcomes?

Our project was inspired by this study. The authors explore the effects of the percent of a local government’s revenue that comes from collecting fines, fees, and asset forfeitures on the rate at which their police departments solve violent and property crimes. They find that as the share of revenue from fines increases, crime clearance rate falls.

The general court data is not coded in a uniform way. Therefore it is difficult to easily discern in what types of cases fines are being assessed. According to the study by Goldstein, et. al. linked above, over 80% of involuntary police contact (contact initiated by offers, as opposed to citizens calling the police, or initiating contact in some other way) occurs due to traffic violations. Additionally, police officers tend to have a high level of discretion about the severity of tickets during traffic stops.

Taking all of this into account, we ultimately want to investigate if, in traffic cases, the share of revenue that comes from fines is correlated to the number and severity of fines assessed for localities in Virginia. While beyond the scope of our project, the rates of fine and forfeitures as a percentage of income

Set Up

# Load needed libraries
library(tidyverse)
library(janitor)
library(rcartocolor)
library(readxl)
library(sf)
library(tigris)
library(scales) 
library(ggthemes)
library(modelsummary)
library(corrplot)
library(stargazer)
library(kableExtra)
options(tigris_use_cache = TRUE) 

# Read in regional circuit court data
general <- readRDS("../data/gd_case_2017.RDS")

# Camel case to snake case
general <- general %>% 
  clean_names()

Descriptive data

Title 46.2 of the Code of Virginia pertains to Motor Vehicles. Because of the high level of pulbic-police interaction and our hypothesis that police officers will have the highest degree of discression during traffic stops, we will only be looking at cases that include this code.

What is the distribution of infractions, misdemeanors, and felonies in the general court data?

general %>% 
  filter(str_detect(code_section, "46.2", negate = FALSE)) %>%
  select(case_type) %>%
  filter(case_type == "Infraction" | case_type == "Misdemeanor" | case_type == "Felony") %>%
  ggplot(aes(x = fct_infreq(case_type), fill = case_type)) +
  geom_bar()

As expected, among traffic violations, the majority of cases are infractions. About one-sixth of cases are misdemeanors. There are very few felonies in the general court data for traffic cases. Many of the more serious cases, and therefore felonies, would likely be adjudicated in the circuit court.

Of traffic violations, how many cases have a fine assoicated with it, what is the percentage of cases with a fine, and what are the minimum, average, median, and maximum fines in these cases?

fine_tab <- general %>%
  filter(str_detect(code_section, "46.2", negate = FALSE)) %>%
  mutate(num_cases = n()) %>%
  filter(fine > 0) %>%
  summarize(first(num_cases),
    num_cases_fine = n(),
    pct_fine = n() / first(num_cases),
    min_fine = min(fine),
    mean_fine = mean(fine),
    median_fine = median(fine),
    max_fine = max(fine)
  )

kbl(fine_tab)
first(num_cases) num_cases_fine pct_fine min_fine mean_fine median_fine max_fine
1529438 1164897 0.7617 0.1 90.83 78 35288

Fines are present in about 75 percent of traffic cases. Fines range from $0.10 to $35,288 with an average fine of $90.83.

In traffic cases where fines are present, how does the number of cases vary by race?

general <- general %>%
  mutate(race7 = fct_collapse(race,
                              unknown = c("", "Unknown", "Unknown (Includes Not Applicable, Unknown)"),
                              amind = c("American Indian", "American Indian or Alaskan Native"),
                              asian = c("Asian or Pacific Islander", "Asian Or Pacific Islander"),
                              black = c("Black", "Black(Non-Hispanic)"),
                              white = c("White", "White Caucasian(Non-Hispanic)"),
                              latinx = c("Hispanic"),
                              remaining = c("Other(Includes Not Applicable, Unknown)", "NA")))

general %>%
  filter(str_detect(code_section, "46.2", negate = FALSE)) %>%
  filter(fine > 0) %>%
  group_by(race7) %>%
  ggplot(aes(fct_infreq(race7), fill = race7)) +
  geom_bar() +
  labs(y = "", title = "Number of Traffic Cases Filed by Race") +
  guides(color = "none")

We felt this method was the best way to recode race to give us fewer and clearer categories than are provided in the raw dataset. Race is likely coded as a function of perception rather than how the person in the data actually identifies. While this is problematic, there is no way to account for this in our analysis. Race has therefore been recoded in the way that we believe best maintains the original coding.

Fines are racially assessed in way that is not unexpected. Black defendants do seem to have a slightly highers share of cases with fines than their share of the Virginia population. This may be a factor of police fining Black people at higher rates. However, it could also be a factor of out of state drivers. To know for sure, we would need to know the demographics of out of state drivers that drive in Virginia. The state is surrounded by states with significantly high Black populations near the state line.

## generating total fines and traffic fines by county in 2017
general <- general %>% 
  mutate(fips3 = str_pad(as.character(fips), 3, side = "left", pad = "0"))

fines_assessed_2017 <- general %>%
   filter(fine > 0) %>%
  group_by(fips3) %>%
  summarize(total_fines = sum(fine))

traffic_fines_assessed_2017 <- general %>% 
  filter(fine > 0) %>%
  filter(str_detect(code_section, "46.2", negate = FALSE)) %>%
  group_by(fips3) %>%
  summarize(traffic_fines = sum(fine))

fines_assessed_2017 <- left_join(fines_assessed_2017, traffic_fines_assessed_2017, by="fips3")

fines_assessed_2017 <- fines_assessed_2017 %>% mutate(ratio_from_traffic=(traffic_fines/total_fines))

va_counties <- counties(state = 51, cb = TRUE)

va_counties <- va_counties %>% 
  left_join(fines_assessed_2017, by = c("COUNTYFP" = "fips3"))

map_data4 <- va_counties %>%
  select(COUNTYFP, NAME, NAMELSAD, traffic_fines, total_fines, ratio_from_traffic, GEOID, geometry)

Fines assessed

Total fines versus traffic fines by county in 2017

county_tab <- fines_assessed_2017 %>% 
  mutate(ratio_from_traffic=(traffic_fines/total_fines)) %>% 
  arrange(desc(ratio_from_traffic))

county_tab <-left_join(county_tab, va_counties, by=c("fips3"="COUNTYFP"))


kbl(county_tab %>% select(NAMELSAD, total_fines.x, traffic_fines.x, ratio_from_traffic.x),
    col.names= c("Locality", "Total Fines", "Traffic Fines", "Percent Traffic Fines"),
    align="lccc",
    format.args=list(big.mark = ',')) %>% 
  kable_material(row_label_position=c,
              
                html_font= "arial") %>% 
  scroll_box(height = "400px")
Locality Total Fines Traffic Fines Percent Traffic Fines
Greensville County 2,213,599 2,189,134 0.9889
Brunswick County 2,423,942 2,396,637 0.9887
Bland County 1,187,053 1,171,653 0.9870
Sussex County 1,966,800 1,939,040 0.9859
Southampton County 1,075,717 1,050,637 0.9767
Hopewell city 2,066,915 2,010,182 0.9726
Northampton County 2,099,325 2,036,245 0.9700
Essex County 413,237 400,452 0.9691
Carroll County 2,807,492 2,709,738 0.9652
Dinwiddie County 993,516 954,941 0.9612
Wythe County 2,849,215 2,734,925 0.9599
Rappahannock County 293,275 279,681 0.9536
Cumberland County 237,034 225,574 0.9517
Amherst County 768,359 724,139 0.9424
Clarke County 573,673 539,869 0.9411
Smyth County 1,793,170 1,685,805 0.9401
Caroline County 1,010,093 949,153 0.9397
Charlotte County 338,387 317,382 0.9379
King William County 200,827 187,707 0.9347
Rockbridge County 1,478,356 1,379,941 0.9334
Amelia County 248,867 231,447 0.9300
Giles County 468,618 435,758 0.9299
Mecklenburg County 914,772 850,390 0.9296
Petersburg city 1,066,683 990,883 0.9289
Botetourt County 939,655 869,855 0.9257
Prince George County 664,410 614,725 0.9252
Emporia city 662,579 612,217 0.9240
Nottoway County 212,919 196,454 0.9227
Charles City County 58,937 54,237 0.9203
Washington County 1,588,504 1,460,514 0.9194
Nelson County 285,329 261,339 0.9159
Lunenburg County 117,210 107,290 0.9154
Greene County 261,959 239,064 0.9126
Pittsylvania County 523,328 476,974 0.9114
Buckingham County 147,268 133,788 0.9085
Richmond County 173,492 157,567 0.9082
Madison County 361,546 328,346 0.9082
King and Queen County 231,508 210,123 0.9076
Alleghany County 542,318 491,720 0.9067
Prince Edward County 484,809 438,835 0.9052
New Kent County 620,200 561,289 0.9050
NA 1,953,169 1,762,483 0.9024
Albemarle County 831,736 750,066 0.9018
Bath County 96,091 85,781 0.8927
Portsmouth city 1,274,163 1,131,057 0.8877
Chesapeake city 2,894,885 2,567,201 0.8868
Shenandoah County 914,892 810,828 0.8863
King George County 357,562 316,481 0.8851
Roanoke County 998,320 882,713 0.8842
Highland County 35,307 31,177 0.8830
Augusta County 929,258 817,522 0.8798
NA 1,560,837 1,372,026 0.8790
Goochland County 337,411 296,491 0.8787
Surry County 98,127 85,752 0.8739
Pulaski County 699,670 611,299 0.8737
Hampton city 1,914,600 1,662,403 0.8683
York County 679,673 589,648 0.8675
Isle of Wight County 661,187 573,173 0.8669
Salem city 403,098 348,268 0.8640
Bristol city 498,409 430,409 0.8636
Henrico County 4,377,401 3,762,455 0.8595
Accomack County 770,591 662,336 0.8595
Westmoreland County 234,239 201,040 0.8583
Fauquier County 1,508,930 1,291,570 0.8560
Rockingham County 1,702,607 1,453,221 0.8535
Fairfax city 714,978 609,582 0.8526
Appomattox County 165,280 140,900 0.8525
Loudoun County 3,517,495 2,973,784 0.8454
Charlottesville city 473,219 399,884 0.8450
Hanover County 1,972,870 1,664,665 0.8438
Halifax County 589,955 497,575 0.8434
Page County 277,614 233,399 0.8407
NA 95,752 80,237 0.8380
Northumberland County 89,103 74,593 0.8372
Mathews County 70,865 59,255 0.8362
Campbell County 333,728 278,705 0.8351
Buena Vista city 97,785 81,300 0.8314
Martinsville city 224,540 186,239 0.8294
Montgomery County 1,266,494 1,049,978 0.8290
Powhatan County 254,430 210,675 0.8280
Warren County 588,716 486,691 0.8267
Henry County 428,714 352,274 0.8217
Suffolk city 725,534 590,115 0.8134
Craig County 28,806 23,426 0.8132
Franklin County 467,108 379,610 0.8127
Bedford County 502,064 407,935 0.8125
Louisa County 259,015 210,170 0.8114
Fluvanna County 184,720 149,641 0.8101
Colonial Heights city 482,944 389,859 0.8073
Chesterfield County 2,849,363 2,299,928 0.8072
Lancaster County 88,595 71,500 0.8070
Orange County 642,529 517,368 0.8052
Frederick County 1,230,778 990,723 0.8050
Wise County 571,399 459,124 0.8035
Patrick County 153,865 123,199 0.8007
Williamsburg city 592,578 473,458 0.7990
Russell County 296,940 236,678 0.7971
Spotsylvania County 982,376 782,566 0.7966
Floyd County 129,926 102,881 0.7918
Scott County 398,605 315,185 0.7907
Gloucester County 447,914 353,024 0.7882
Norfolk city 1,950,890 1,529,794 0.7842
Roanoke city 1,004,198 782,062 0.7788
Culpeper County 787,983 613,498 0.7786
Buchanan County 167,137 129,912 0.7773
NA 411,639 319,937 0.7772
Middlesex County 85,572 65,412 0.7644
Alexandria city 1,706,648 1,300,241 0.7619
Arlington County 2,644,850 2,005,099 0.7581
Dickenson County 119,142 89,372 0.7501
Stafford County 1,274,945 948,139 0.7437
Falls Church city 180,882 133,978 0.7407
Virginia Beach city 4,772,730 3,495,288 0.7323
Lynchburg city 457,503 325,843 0.7122
Prince William County 5,996,274 4,270,088 0.7121
Grayson County 172,069 120,974 0.7031
Lee County 294,632 206,177 0.6998
Franklin city 44,105 30,780 0.6979
Tazewell County 500,704 349,144 0.6973
Waynesboro city 112,117 77,237 0.6889
Staunton city 228,147 157,101 0.6886
Fredericksburg city 333,863 227,816 0.6824
Fairfax County 17,140,071 11,558,084 0.6743
Danville city 423,095 284,184 0.6717
Galax city 172,810 115,715 0.6696
Winchester city 363,813 206,248 0.5669
Radford city 269,323 94,462 0.3507
NA 265,712 13,337 0.0502
NA 750 NA NA
NA 10,095 NA NA
NA 75 NA NA
ggplot(data = map_data4) + 
  geom_sf(aes(fill = ratio_from_traffic)) +
  scale_fill_carto_c(palette = "ag_Sunset", direction=-1) +
  theme_void() +
  theme(legend.position = "right")

Fines from traffic cases make up a significant amount of the total fines that counties and cities collect throughout the state.

Maximum: Greensville County (98.9%)
Minimum: Radford City (35.1%)

Fines assessed to all cases in 2017 by county

ggplot(data = map_data4) + 
  geom_sf(aes(fill = total_fines)) +
  scale_fill_carto_c(palette = "Emerald") +
  theme_void() +
  theme(legend.position = "right")

Maximum: Fairfax County ($17,140,071)
Minimum: Craig County ($28,806)

Fines assessed to traffic cases in 2017 by county

ggplot(data = map_data4) + 
  geom_sf(aes(fill = traffic_fines)) +
  scale_fill_carto_c(palette = "Emerald") +
  theme_void() +
  theme(legend.position = "right")

Maximum: Fairfax County ($11,558,084)
Minimum: Craig County ($23,426)

As seen in the two maps above, there is little difference in the distribution of counties in terms of fine collection and fine collection from traffic cases.

State and Local Government Finances and Population Data

# Add in 2017 Annual Survey of State and Local Government Finances data

cog <- read_fwf("../data/2017FinEstDAT_06102021modp_pu.txt",
                fwf_widths(c(12,3,12,4,1), c("id", "item", "amount", "year", "imp")))

cog <- cog %>% 
  mutate(state = str_sub(id, 1,2),
         type = str_sub(id, 3, 3),
         county = str_sub(id, 4, 6),
         unit = str_sub(id, 7,12))


# filter to locality governments
vacog <- cog %>% 
  filter(state == "51",
         type %in% c("1", "2"))
# Generate variable for total revenue

totrevcode <- c("T01", "T08", "T09", "T10", "T11", 
                "T12", "T13", "T14", "T15", "T16",
                "T19", "T20", "T21", "T22", "T23",
                "T24", "T25", "T27", "T28", "T29",
                "T40", "T41", "T50", "T51", "T53",
                "T99", "A01", "A03", "A06", "A09",
                "A10", "A12", "A14", "A16", "A18",
                "A21", "A36", "A44", "A45", "A50",
                "A54", "A56", "A59", "A60", "A61",
                "A80", "A81", "A87", "A89", "U01",
                "U10", "U11", "U20", "U30", "U40",
                "U41", "U50", "U95", "U99", "B01",
                "B21", "B22", "B27", "B30", "B42",
                "B46", "B47", "B50", "B54", "B59",
                "B79", "B80", "B89", "B91", "B92",
                "B93", "B94", "C21", "C28", "C30",
                "C42", "C46", "C47", "C50", "C67",
                "C79", "C80", "C89", "C91", "C92",
                "C93", "C94", "D11", "D21", "D30",
                "D42", "D46", "D47", "D50", "D79",
                "D80", "D89", "D91", "D92", "D93", "D94")


vatotalrev <- vacog %>%
  filter(item %in% totrevcode) %>% # mpc added
  group_by(county) %>%
  summarize(total_revenue = sum(amount))
# Generate variable for total fines

vafines <- vacog %>%
  select(item, amount, county) %>%
  filter(str_detect(item, "U30", negate = FALSE))

vafines <- vafines %>% 
  group_by(county) %>% 
  summarize(amount = sum(amount))
# Merge new dataframes

varevfines <- merge(vafines, vatotalrev ,by="county")
# Generate variable for percent of revenue generated by fines

varevfines <- left_join(vatotalrev, vafines, by="county") %>%
  mutate(fine_revenue = replace_na(amount, 0),
    pct_rev_from_fines = (fine_revenue / total_revenue)*100)
# Percent revenue from fines by county

varevfines %>%
  group_by(county) %>%
  ggplot(aes(x = reorder(county, -pct_rev_from_fines), y = pct_rev_from_fines)) +
  geom_col() +
  labs(title = "Counties by Percent Revenue Generated Through Fines", subtitle = "2017 by FIPS Code",
       x = "County", y = "", color = "% Revenue from Fines")+
  theme(axis.text.x = element_text(angle = 60),
  axis.text = element_text(size=5))

Most counties generate between about one and four percent of their revenue from fines and forfeitures. A significant outlier (Emporia City) collects about 12 percent of its revenue from fines.

VA Population Data

Source: Weldon Cooper Center for Public Service

VApop <- read_excel("/cloud/project/data/PopulationEstimates_July2021_VA_CooperCenter_formatted_1.xlsx")

vapoprevfines <- merge(varevfines, VApop, by="county")
# Fine revenue per capita

vapoprevfines$population <- as.numeric(vapoprevfines$population)

vapoprevfines <- vapoprevfines %>% 
  mutate(amt_dollars=amount*1000)

vapoprevfines <- vapoprevfines%>% 
mutate(fine_rev_percap=amt_dollars/population)
# Population by County (in thousands)

va_counties <- counties(state = 51, cb = TRUE)
va_counties <- va_counties %>%
  left_join(vapoprevfines, by = c("COUNTYFP" = "county"))
map_data2 <- va_counties %>%
  select(COUNTYFP, NAME, NAMELSAD, population, pct_rev_from_fines, fine_rev_percap, GEOID, geometry) %>%
  mutate(pop_thous=population/1000)
  ggplot(data = map_data2) +
    geom_sf(aes(fill = pop_thous)) +
    scale_fill_carto_c(palette = "Sunset") +
    theme_void() +
    theme(legend.position = "bottom")

Maximum: Fairfax County (1,150,309)
Minimum: Highland County (2,232)

# Percent Revenue from Fines by County

va_counties <- counties(state = 51, cb = TRUE)

va_counties <- va_counties %>% 
  left_join(vapoprevfines, by = c("COUNTYFP" = "county"))

map_data1 <- va_counties %>%
  select(COUNTYFP, NAME, NAMELSAD, pct_rev_from_fines, fine_rev_percap, GEOID, geometry)

  ggplot(data = map_data1) + 
    geom_sf(aes(fill = pct_rev_from_fines)) +
    scale_fill_carto_c(palette = "Emerald") +
    theme_void() +
    theme(legend.position = "bottom")

Statewide, there is not much variation in this map due to the extreme outlier.

Maximum: Emporia City (12.0%) Minimum: Covington City (0.018%)

Emporia City (between U.S. 58 and I-95) generates about 12 perent of it revenue from fines, while all others were less than 4 percent. Emporia is widely known as the major speed trap of Virginia.

Percent Revenue from Fines by County (excluding outlier)

va_counties <- counties(state = 51, cb = TRUE)
va_counties <- va_counties %>%
  left_join(vapoprevfines, by = c("COUNTYFP" = "county"))
map_data3 <- va_counties %>%
  select(COUNTYFP, NAME, NAMELSAD, pct_rev_from_fines, fine_rev_percap, GEOID, geometry) %>%
  filter(NAME != "Emporia")
  ggplot(data = map_data3) +
    geom_sf(aes(fill = pct_rev_from_fines)) +
    scale_fill_carto_c(palette = "Emerald") +
    theme_void() +
    theme(legend.position = "bottom")

When we remove the outlier, we see much more variation across the state.

Maximum without outlier: Brunswick County (3.93%)
Minimum: Covington City (0.018%)

Fine Revenue per Capita by County

ggplot(data = map_data1) + 
    geom_sf(aes(fill = fine_rev_percap)) +
    scale_fill_carto_c(palette = "Purp") +
    theme_void() +
    theme(legend.position = "bottom")

Again, there is little variation because the outlier is so extreme.

Maximum: Emporia City ($482.31 per resident)
Minimum: Craig County ($0.40 per resident)

Fine Revenue per Capita by County (excluding outlier)

ggplot(data = map_data3) +
    geom_sf(aes(fill = fine_rev_percap)) +
    scale_fill_carto_c(palette = "Purp") +
    theme_void() +
    theme(legend.position = "bottom")

We again see more variation when the outlier is removed from the map.

Maximum without outlier: Greensville County, which surrounds Emporia City ($156.62)
Minimum Craig County ($0.41)

Data Analysis

# Generate average fine variable

mean_fine <- general %>%
  filter(str_detect(code_section, "46.2", negate = FALSE)) %>%
  filter(fine > 0) %>%
  group_by(fips3) %>%
  summarize(mean_fine = mean(fine))

# Generate number of fines per person variable 

total_num_fine <- general %>%
  filter(str_detect(code_section, "46.2", negate = FALSE)) %>%
  filter(fine > 0) %>%
  group_by(fips3) %>%
  summarize(total_num_fine = n())

# Combine dataframes

vapoprevfines <- vapoprevfines %>%
  left_join(mean_fine, by = c("county" = "fips3"))

vapoprevfines <- vapoprevfines %>%
  left_join(total_num_fine, by = c("county" = "fips3"))

# Generate variable for number of fines per capita

vapoprevfines <- vapoprevfines %>%
  mutate(num_fines_per_cap = total_num_fine / population)

Scatterplot of percent revenue from fines vs. fine revenue per capita

ggplot(data = vapoprevfines, aes(x = pct_rev_from_fines, y = fine_rev_percap)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE)

Taking out the outlier should provide a clearer picture.

Scatterplot of percent revenue from fines vs. fine revenue per capita (excluding outlier)

vapoprevfines_noEmp <- vapoprevfines %>%
  filter(locality != "Emporia")
  
ggplot(data = vapoprevfines_noEmp, aes(x = pct_rev_from_fines, y = fine_rev_percap)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE)

Looks relatively clear that greater shares of revenue coming from fines are associated with greater fine revenue per capita.

Linear regression of percent revenue from fines on fine revenue per capita (per capita), controlling for population

reg1 = lm(fine_revenue~ pct_rev_from_fines + population, data = vapoprevfines)
summary(reg1)
## 
## Call:
## lm(formula = fine_revenue ~ pct_rev_from_fines + population, 
##     data = vapoprevfines)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
##  -2508   -156    -16     59   4298 
## 
## Coefficients:
##                       Estimate  Std. Error t value   Pr(>|t|)    
## (Intercept)        -118.872255   86.260558   -1.38       0.17    
## pct_rev_from_fines  362.714846   60.682188    5.98 0.00000002 ***
## population            0.011388    0.000553   20.61    < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 811 on 130 degrees of freedom
## Multiple R-squared:  0.772,  Adjusted R-squared:  0.769 
## F-statistic:  220 on 2 and 130 DF,  p-value: <2e-16
reg2 = lm(fine_rev_percap~ pct_rev_from_fines + population, data = vapoprevfines)
summary(reg2)
## 
## Call:
## lm(formula = fine_rev_percap ~ pct_rev_from_fines + population, 
##     data = vapoprevfines)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -63.90  -1.82  -0.29   1.29  35.60 
## 
## Coefficients:
##                       Estimate  Std. Error t value Pr(>|t|)    
## (Intercept)        -0.81661137  1.07186784   -0.76     0.45    
## pct_rev_from_fines 39.23706082  0.74492175   52.67   <2e-16 ***
## population          0.00000559  0.00000678    0.82     0.41    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 9.93 on 127 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.957,  Adjusted R-squared:  0.956 
## F-statistic: 1.4e+03 on 2 and 127 DF,  p-value: <2e-16

Results suggest that the percent revenue from fines variable is positively associated with both total fine revenue and fine revenue per person.

Scatterplot of percent revenue from fines vs. average fine dollar amount

ggplot(data = vapoprevfines, aes(x = pct_rev_from_fines, y = mean_fine)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE)

Again, it is difficult to interpret because of the outlier.

Scatterplot of percent revenue from fines vs. average fine dollar amount (excluding outlier)

ggplot(data = vapoprevfines_noEmp, aes(x = pct_rev_from_fines, y = mean_fine)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE)

This plot shows a positive relationship between the percent of revenue from fines and the average fine amount.

Linear regression of percent revenue from fines on average fine, controlling for population

reg3 = lm(mean_fine ~ pct_rev_from_fines + population, data = vapoprevfines)
summary(reg3)
## 
## Call:
## lm(formula = mean_fine ~ pct_rev_from_fines + population, data = vapoprevfines)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -50.74 -10.57  -3.45   5.32  54.79 
## 
## Coefficients:
##                       Estimate  Std. Error t value Pr(>|t|)    
## (Intercept)        81.69846675  1.92398110   42.46  < 2e-16 ***
## pct_rev_from_fines  4.67315682  1.31277245    3.56  0.00053 ***
## population          0.00000946  0.00001207    0.78  0.43459    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 17.5 on 120 degrees of freedom
##   (10 observations deleted due to missingness)
## Multiple R-squared:  0.0967, Adjusted R-squared:  0.0817 
## F-statistic: 6.43 on 2 and 120 DF,  p-value: 0.00223

A 1% increase in the percent of revenue from fines is associated with an increase in the average fine amount of about $4.70.

Scatterplot of percent revenue from fines vs. number of fines assessed per person

ggplot(data = vapoprevfines, aes(x = pct_rev_from_fines, y = num_fines_per_cap)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE)

Again, the plot is distorted by the presence of an outlier.

Scatterplot of percent revenue from fines vs. number of fines assessed per person (excluding outlier)

ggplot(data = vapoprevfines_noEmp, aes(x = pct_rev_from_fines, y = num_fines_per_cap)) +
        geom_point() +
        geom_smooth(method = "lm", se = FALSE)

Percent of revenue from fines is positively associated with the number of fines per capita.

Linear regression of percent revenue from fines on number of fines assessed per person, controlling for population

reg4 = lm(num_fines_per_cap ~ pct_rev_from_fines + population, data = vapoprevfines)
summary(reg4)
## 
## Call:
## lm(formula = num_fines_per_cap ~ pct_rev_from_fines + population, 
##     data = vapoprevfines)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -0.8251 -0.0887 -0.0443  0.0261  1.0894 
## 
## Coefficients:
##                        Estimate   Std. Error t value Pr(>|t|)    
## (Intercept)         0.181567732  0.023824803    7.62  6.5e-12 ***
## pct_rev_from_fines  0.155275658  0.016256160    9.55  < 2e-16 ***
## population         -0.000000260  0.000000149   -1.74    0.085 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.216 on 120 degrees of freedom
##   (10 observations deleted due to missingness)
## Multiple R-squared:  0.451,  Adjusted R-squared:  0.442 
## F-statistic: 49.3 on 2 and 120 DF,  p-value: 2.31e-16

A 1% increase in the percent of revenue from fines is associated with 0.15 additional fines per person.

2017 VDOT Traffic Data

Source: VDOT

VAtraffic <- read_excel("/cloud/project/data/VA_traffic_data.xlsx")

vapoprevfines_traf <- merge(vapoprevfines, VAtraffic, by="county")

Regressions controlling for population and traffic data (daily vehicle miles traveled)

reg5 = lm(fine_revenue~ pct_rev_from_fines, data = vapoprevfines_traf)

reg6 = lm(fine_revenue~ pct_rev_from_fines + DVMT, data = vapoprevfines_traf)

reg7 = lm(fine_revenue~ pct_rev_from_fines + DVMT_interstate, data = vapoprevfines_traf)

reg8 = lm(fine_revenue~ pct_rev_from_fines + population, data = vapoprevfines_traf)

reg9 = lm(fine_revenue~ pct_rev_from_fines + DVMT_interstate + population, data = vapoprevfines_traf)

msummary(list(reg5, reg6, reg7, reg8, reg9), title = "Share of Revenue from Fines and Fine Revenue")
Share of Revenue from Fines and Fine Revenue
Model 1 Model 2 Model 3 Model 4 Model 5
(Intercept) 535.351 574.789 573.823 −325.094 −331.788
(218.102) (230.775) (227.003) (96.090) (100.510)
pct_rev_from_fines 334.278 335.958 339.082 623.312 622.853
(274.883) (275.987) (275.898) (111.097) (111.706)
DVMT 0.000
(0.000)
DVMT_interstate 0.000 0.000
(0.000) (0.000)
population 0.011 0.011
(0.001) (0.001)
Num.Obs. 92 92 92 92 92
R2 0.016 0.019 0.021 0.843 0.843
R2 Adj. 0.005 −0.003 −0.001 0.840 0.838
AIC 1638.4 1640.1 1640.0 1471.3 1473.3
BIC 1645.9 1650.2 1650.0 1481.4 1485.9
Log.Lik. −816.187 −816.035 −815.977 −731.659 −731.628
F 1.479 0.880 0.938 239.607 158.067
RMSE 1743.49 1750.38 1749.27 699.56 703.29

These results show that controlling for daily vehicle miles on traveled either in total or specifically on interstate roadways does not have a significant effect on the results. Controlling for population, however, increases both the estimate of interest and the precision.

reg10 = lm(mean_fine~ pct_rev_from_fines, data = vapoprevfines_traf)

reg11 = lm(mean_fine~ pct_rev_from_fines + DVMT, data = vapoprevfines_traf)

reg12 = lm(mean_fine~ pct_rev_from_fines + DVMT_interstate, data = vapoprevfines_traf)

reg13 = lm(mean_fine~ pct_rev_from_fines + population, data = vapoprevfines_traf)

reg14 = lm(mean_fine~ pct_rev_from_fines + DVMT_interstate + population, data = vapoprevfines_traf)

msummary(list(reg10, reg11, reg12, reg13, reg14), title = "Share of Revenue from Fines and Average Fine Amount")
Share of Revenue from Fines and Average Fine Amount
Model 1 Model 2 Model 3 Model 4 Model 5
(Intercept) 79.030 79.063 79.095 77.956 77.969
(1.827) (1.934) (1.902) (1.995) (2.084)
pct_rev_from_fines 17.482 17.483 17.491 17.842 17.843
(2.290) (2.303) (2.304) (2.298) (2.311)
DVMT 0.000
(0.000)
DVMT_interstate 0.000 0.000
(0.000) (0.000)
population 0.000 0.000
(0.000) (0.000)
Num.Obs. 91 91 91 91 91
R2 0.396 0.396 0.396 0.407 0.407
R2 Adj. 0.389 0.382 0.382 0.394 0.387
AIC 749.0 751.0 751.0 749.2 751.2
BIC 756.5 761.0 761.0 759.3 763.8
Log.Lik. −371.493 −371.491 −371.483 −370.612 −370.612
F 58.266 28.808 28.820 30.228 19.923
RMSE 14.51 14.59 14.59 14.45 14.53

These results show that percent revenue from fines has a positive relationship with the average fine amount. Controlling for daily vehicle miles traveled, daily interstate vehicle miles traveled, or population by county has no impact on the estimates.

#Conclusion While the Census of Governments data is likely the most complete in terms of a repository of local revenues and expenditures, the survey documentation lists an 82.7% response rate for revenue among Virginia localities, and a 75% response rate overall for Virginia. As compared to some of the research that uses data from a similar time frame, our percentages of fines and forfeitures as a share of total revenues are significantly smaller. For instance, computations here using CoG data from 2017 list U30 (fines and forfeitures) revenue from Greensville County as 3.4%, whereas according to the 2017 budget documentation that share may actually be over 8%. Similarly, following the CoG data Brunswick County’s share of U30 revenue is just under 4%, whereas following the county’s own budget, that share may actually be over 5%.

This may be due to a few factors:

-Incomplete response rate among VA localities, as mentioned

-Classification of U30-associated fines, fees, and forfeitures in other budget categories–which would cause them to be excluded from U30 revenues in the CoG data–as well as inconsistent categorization across localities. For instance, the Orange County, VA 2017 budget lists “Charges for traffic violation processing fees” separately from the fines and forfeitures revenue, which means this additional $135,000 in charges was likely not included in the listed U30 CoG revenue data for Orange County.

While these discrepancies seem minor, how and why these discrepancies come to be is a microcosm of the larger lack of reflexive analysis into locality administration and policy. In light of the growing body of research (especially the study by Goldstein, et. al.) on local administration, policing, and inequitable outcomes for minoritized individuals, the lack of transparency has considerable implications for citizens of Virginia’s localities. With more time, we would dive further into revenues to develop a more comprehensive picture of locality revenues, as well as begin to understand differences among those counties with low and high rates of fine revenues as a share of total revenue.

We also would like to acknowledge that while the millions of observations listed in the general court data seem esoteric in aggregate, they represent glimpses of individuals’ journey through the court system in weeks, months, years, dollars, dispositions, and zip codes, just to name a few. Some cases listed here have been ongoing since 2009, others involve traumatic events, and are all wrapped up in lives much larger and significantly more meaningful than the integers and characters here. While this project scratches the surface of the issues of inequity we addressed briefly, the goal of our analysis was to use this data in a way that works towards reducing the amount of court data in the future, that offers a foundation for interrogating policies that promote inequity and injustice, either unconsciously or intentionally. We recognize that through our learning we’ve been beneficiaries of this data, and hope that in turn we can offer work that goes towards generating benefit for others, as well.