Introduction

The United States Defence Department’s 1033 program began in 1997, it allows for the transfer of excess military equipment to civilian law enforcement agencies. Most of the equipment obtained is standard, things such as cold weather clothing, diesel generators and flashlights. However, a significant portion of it is explicitly combat-oriented in nature, equipment such as M-16 rifles, tanks, and mine-resistant vehicles.

This is an analysis that explores U.S. civilian law enforcement spending on the acquisition of military equipment that is explicitly combat-oriented. Spending is examined at a state and county level, other county-level data such as crime and poverty rates are incorporated and their relationship to spending is also investigated.

Please e-mail comments and suggestions to vcolano@gmail.com.

About the data

In 2014 the New York Times filed a freedom of information act request and received data from the Pentagon on all acquisitions since 2006. The data was made public by the NYT, it can be found here. The NYT wrote a post with an interactive data visualization on the topic: What Military Gear Your Local Police Department Bought.

Setup

Load libraries and import the police acquisitions data set.

library(data.table)
library(ggplot2)
library(scales)
library(ggmap)
library(statebins)
library(plyr)
library(readxl)
library(stringr)
library(stringi)
library(extrafont)
## Registering fonts with R
library(USA.county.data)
library(lattice)
#library(devtools)
#devtools::install_github("deleetdk/USA.county.data") # only need to load this once

data = fread("~/projects/policeMilitarySurplus/data/policeAcquisitionOfMilitarySurplus2014.csv")
colnames(data) = make.names(names(data)) # make column names R-friendly (remove spaces)
data$Item.Name = sapply(data$Item.Name, trimws) # trim whitespace
data = data[!(data$Item.Name == ""), ] # get rid of empty string value

# make an appropriate theme for our plots later on
military_theme = theme_classic() + 
  theme(plot.title=element_text(size=20, color="#0D0A0B", vjust=1, hjust=0.5, family="Courier New"),
  text=element_text(size=13, hjust=0.5, family="Courier New"), plot.background=element_rect(color="#F3EFF5"))

Dataset format:

head(data, n=1)
##    State    County              NSN             Item.Name Quantity   UI
## 1:    AK ANCHORAGE 1005-00-073-9421 RIFLE,5.56 MILLIMETER        1 Each
##    Acquisition.Cost  Ship.Date
## 1:              499 2012-08-30

NSN stands for NATO Stock Number, it’s a unique identifier for military supplies across NATO nations

Which items were purchased the most?

itemFreq = count(data, "Item.Name")
itemFreq = itemFreq[with(itemFreq, order(-freq)), ]
head(itemFreq, n=10)
##                            Item.Name  freq
## 12840          RIFLE,5.56 MILLIMETER 61548
## 12841          RIFLE,7.62 MILLIMETER 17726
## 13951                   SIGHT,REFLEX  9494
## 11529   PISTOL,CALIBER .45,AUTOMATIC  8649
## 16300                  TRUCK,UTILITY  5002
## 10680            NIGHT VISION GOGGLE  2279
## 8208            ILLUMINATOR,INFRARED  2275
## 13799             SHIRT,COLD WEATHER  2085
## 8217  IMAGE INTENSIFIER,NIGHT VISION  1870
## 13887      SHOTGUN,12 GAGE,RIOT TYPE  1448

Total expenditure on an item-level basis

costs_df = itemFreq
costs_df$freq = costs_df$freq + (1 - data$Quantity[match(costs_df$Item.Name, data$Item.Name)])
costs_df$Total.Cost = data$Acquisition.Cost[match(costs_df$Item.Name, data$Item.Name)]
costs_df$Total.Cost = costs_df$Total.Cost*costs_df$freq
costs_df$NSN = data$NSN[match(costs_df$Item.Name, data$Item.Name)] # NSN will be useful to us
costs_df = costs_df[c("NSN", "Item.Name", "freq", "Total.Cost")] # reorder for readability
costs_df = costs_df[with(costs_df, order(-Total.Cost)), ]
head(costs_df, n=20)
##                    NSN
## 16300 2320-01-146-7190
## 10136 2355-01-555-0908
## 7752  1520-00-087-7637
## 7750  1520-01-020-4216
## 16296 2320-01-272-5029
## 16224 2320-01-050-2084
## 10829 2355-DS-COM-BTV2
## 16250 3930-01-054-3833
## 12840 1005-00-073-9421
## 16234 2320-01-047-8756
## 16302 2320-01-205-2682
## 464   1510-01-070-3661
## 8208  5855-01-465-2168
## 15922 2420-01-160-2754
## 2604  2350-01-068-4077
## 16307 2320-01-047-8754
## 10283 1385-01-456-9129
## 7053  6115-00-394-9576
## 16219 2320-01-074-7642
## 6788  5855-01-519-0337
##                                                    Item.Name  freq
## 16300                                          TRUCK,UTILITY  5002
## 10136                                 MINE RESISTANT VEHICLE   341
## 7752                                      HELICOPTER,UTILITY   109
## 7750                                  HELICOPTER,OBSERVATION   282
## 16296                                          TRUCK TRACTOR   547
## 16224                                            TRUCK,CARGO   718
## 10829 ONLY COMPLETE COMBAT/ASSAULT/TACTICAL WHEELED VEHICLES    98
## 16250                                        TRUCK,LIFT,FORK   309
## 12840                                  RIFLE,5.56 MILLIMETER 61548
## 16234                                             TRUCK,DUMP   355
## 16302                                              TRUCK,VAN   173
## 464                                 AIRPLANE,CARGO-TRANSPORT    27
## 8208                                    ILLUMINATOR,INFRARED  2272
## 15922                             TRACTOR,WHEELED,INDUSTRIAL   138
## 2604                          CARRIER,PERSONNEL,FULL TRACKED    53
## 16307                                          TRUCK,WRECKER   103
## 10283                                                MK3MOD0    66
## 7053                                     GENERATOR SET,DIESE   582
## 16219                                          TRUCK,ARMORED   164
## 6788                 FORWARD LOOKING INFRARED IMAGING SYSTEM    19
##       Total.Cost
## 16300  195868316
## 10136  140492000
## 7752   100574736
## 7750    53810394
## 16296   53661247
## 16224   50700134
## 10829   45080000
## 16250   30903090
## 12840   30712452
## 16234   30016670
## 16302   25206100
## 464     21623355
## 8208    17690496
## 15922   15180000
## 2604    12976732
## 16307   12950808
## 10283   12741828
## 7053    12111420
## 16219   10671480
## 6788    10345166

$195,868,316 spent on Humvee-like trucks, $140,492,000 on mine-resistant trucks and $100,574,736 on helicopters were the three largest expenses.

Extracting a purely-militarized subset

There is some equipment which is objectively non-militarized, such as the dump trucks, fork lifts and diesel generators. To focus this analysis on the militarization of US police forces we’ll reduce the data to a subset that is explicitly militarized in nature, items which could serve little to no purpose in the policing of civilians. For simplicity, only the first 100 items with the highest total cost were examined manually. Other items containing keywords which indicate that they are militarized are also added.

Disclaimer: There is subjectivity as to what is “militarized” and what is not. While items were researched by looking up their NSN, the author does not have significant knowledge of this domain.

subset = c("TRUCK,UTILITY",  "MINE RESISTANT VEHICLE", "ONLY COMPLETE COMBAT/ASSAULT/TACTICAL WHEELED VEHICLES",
           "RIFLE,5.56 MILLIMETER", "ILLUMINATOR,INFRARED", "TRUCK,CARGO", "TRUCK,VAN",
           "CARRIER,PERSONNEL,FULL TRACKED", "TRUCK,ARMORED", "FORWARD LOOKING INFRARED IMAGING SYSTEM",
           "TRUCK,WRECKER", "NIGHT VISION GOGGLE", "VIEWER,NIGHT VISION", "BOAT,BRIDGE ERECTION,INBOARD ENGINE",
           "LIGHT ARMORED VEHICLE", "RANGE FINDER,LASER", "SIGHT,REFLEX",
           "SHOP EQUIPMENT,AUTOMOTIVE VEHICLE", "TRUCK,STAKE", "RIFLE,7.62 MILLIMETER", "MINE RESISTANT VEHI",
           "TRUCK,TANK", "SIGHT,NIGHT VISION SNIPERSCOPE", "SEMITRAILER,TANK")
subset = c(subset, unique(data$Item.Name[with(data, grepl("RIFLE", Item.Name))]))
subset = c(subset, unique(data$Item.Name[with(data, grepl("TANK", Item.Name))]))
subset = c(subset, unique(data$Item.Name[with(data, grepl("GRENADE", Item.Name))]))
subset = c(subset, unique(data$Item.Name[with(data, grepl("BAYONET", Item.Name))]))
subset = unique(subset) # remove duplicates

subset_df = data[data$Item.Name %in% subset]
subset_costs_df = count(subset_df, "Item.Name")
subset_costs_df = subset_costs_df[with(subset_costs_df, order(-freq)), ]
subset_costs_df$freq = subset_costs_df$freq + (subset_df$Quantity[match(subset_costs_df$Item.Name, subset_df$Item.Name)] - 1)
subset_costs_df$Total.Cost = subset_df$Acquisition.Cost[match(subset_costs_df$Item.Name, subset_df$Item.Name)]*subset_costs_df$freq
subset_costs_df = subset_costs_df[with(subset_costs_df, order(-Total.Cost)), ]
length(subset_costs_df$Total.Cost)
## [1] 175
sum(subset_costs_df$Total.Cost)
## [1] 609879850
sum(subset_costs_df$Total.Cost)/sum(costs_df$Total.Cost)
## [1] 0.4818525

All in all, there are 175 unique items in the subset with a total cost of $609,879,850. Out of all spending 48% of it was combat-oriented in nature.

State-level analysis

# Reshape data onto a state level
states_df = aggregate(subset_df$Acquisition.Cost, by=list(state=subset_df$State), FUN=sum)
names(states_df)[names(states_df) == 'x'] = 'spending'
states_df$stateAbr = states_df$state
states_df$state = sapply(state.name[match(states_df$state, state.abb)], tolower)
states_df = states_df[complete.cases(states_df),]

# see who spent the most
suppressWarnings(
ggplot(data = head(states_df[order(-states_df$spending), ], n=10), aes(reorder(state, -spending), spending)) +
  geom_histogram(stat="identity", fill="#4b5320") + # army green
  scale_x_discrete() +
  scale_y_continuous(labels = comma, limits = c(0, 50000000),  expand=c(0,0)) +
  military_theme + theme(axis.text.x = element_text(angle=45, hjust=1)) +
  xlab("State") + ylab("Spending in USD") + ggtitle("Top 10 Spenders"))

# Adjust for population
states_pop = fread("~/projects/policeMilitarySurplus/data/statePopulation.csv")
states_df$spendingPerCapita = states_df$spending / states_pop[match(states_df$state, sapply(states_pop$state, tolower))]$pop_est_2014

suppressWarnings(
ggplot(data = head(states_df[order(-states_df$spendingPerCapita), ], n=10), aes(reorder(state, -spendingPerCapita), spendingPerCapita)) +
  geom_histogram(stat="identity", fill="#4b5320") +
  scale_x_discrete() +
  scale_y_continuous(labels = comma, limits = c(0, 10), expand=c(0,0)) +
  military_theme +
  theme(axis.text.x = element_text(angle=45, hjust=1, size = 12)) +
  xlab("State") + ylab("Spending per capita in USD") +
  ggtitle("Top 10 Spenders per Capita"))

# let's see this on a map
suppressWarnings(
statebins(states_df, "stateAbr", "spending", legend_position = "right", breaks=5,
                     labels=c("<$10m","<$20m","<$30m","<$40m","<$50m"), font_size = 5, legend_title="Spending in USD",
                     brewer_pal = "Greens", text_color = "black",
                     plot_title = "Total Spending from 2006-2014",
                     title_position = "top"))

suppressWarnings(
statebins(states_df, "stateAbr", "spendingPerCapita", legend_position = "right",
                     legend_title="Spending per capita in USD", font_size = 5,
                     breaks = 5, labels=c("<$2","<$4","<$6","<$8","<$10"),
                     brewer_pal = "Greens", text_color = "black",
                     plot_title = "Spending per Capita from 2006-2014",
                     title_position = "top"))

County-level analysis

##           county      state spending
## 35     jefferson    alabama  8112570
## 74      maricopa    arizona  6363911
## 1405    monmouth new jersey  5340412
## 542         lake   illinois  4800179
## 516         cook   illinois  4656017
## 161  los angeles california  4575273
## 27        etowah    alabama  4173705
## 78         pinal    arizona  3939089
## 8        calhoun    alabama  3825812
## 2073      harris      texas  3781767
## DEFINEDNAME: 00 00 00 11 0b 00 00 00 00 00 00 00 00 00 00 45 58 43 45 4c 5f 50 4f 50 30 31 41 5f 31 30 50 4b 3b 00 00 00 00 7e 0c 00 00 29 00 
## DEFINEDNAME: 00 00 00 11 0b 00 00 00 00 00 00 00 00 00 00 45 58 43 45 4c 5f 50 4f 50 30 31 41 5f 31 30 50 4b 3b 00 00 00 00 7e 0c 00 00 29 00 
## DEFINEDNAME: 00 00 00 11 0b 00 00 00 00 00 00 00 00 00 00 45 58 43 45 4c 5f 50 4f 50 30 31 41 5f 31 30 50 4b 3b 00 00 00 00 7e 0c 00 00 29 00 
## DEFINEDNAME: 00 00 00 11 0b 00 00 00 00 00 00 00 00 00 00 45 58 43 45 4c 5f 50 4f 50 30 31 41 5f 31 30 50 4b 3b 00 00 00 00 7e 0c 00 00 29 00
# There are 3144 counties in the US (https://en.wikipedia.org/wiki/List_of_counties_by_U.S._state)
print(length(counties_df$county)) # Counties with spending > 0
## [1] 2378
print(length(counties_df$county)/3144)
## [1] 0.7563613

Out of the 3144 counties in the US, 2378, or 75%, had some spending on militarized equipment. Counties which have spent nothing on militarized equipment are not taken into account in the following analyses.

# Is population correlated with spending? 
spendPopCor = format(cor(counties_df$population, counties_df$spending, use = "complete"), digits = 4)
suppressWarnings(
ggplot(data = counties_df, aes(x = log(counties_df$population), y = log(counties_df$spending))) +
  military_theme + xlab("Population (log smoothed)") +
  ylab("Spending (log smoothed)") +
  geom_point(colour="#4b5320") + geom_smooth(method='lm', formula=y~x, colour="#454955") +
  ggtitle(paste("Correlation between spending and population = ", spendPopCor)))

The correlation coefficient of 0.47 implies that there is a positive relationship between a county’s police departments’ spending on militarized equipment and the county’s population. In simpler terms, counties with more people tend to have more militarized equipment.

# plot distribution of spending
suppressWarnings(
ggplot(data = counties_df, aes(x=counties_df$spending)) +
  stat_density(aes(y=..count..), color="#454955", fill="dark green", alpha=0.3) +
  stat_density(aes(y=..count..), color="#454955", fill="dark green", alpha=0.3) +
  scale_x_continuous(breaks=c(0, 100, 1000, 5000, 25000, 100000, 500000, 1000000, 3000000, 10000000), 
                     labels=c("$0","$100","$1k","$5k","$25k","$100k","$500k","$1mil","$3mil","$10mil"),
                     trans="log1p", expand=c(0,0), limits=c(0,100000000)) +
  scale_y_continuous(breaks=c(0, 50, 100, 150, 200, 250, 300, 350, 400), expand=c(0,0), limits=c(0,400)) +
  military_theme + xlab("Spending Per Capita in USD") + ylab("Count") +
  theme(axis.text.x = element_text(angle=45, hjust=1)) +
  ggtitle("Total Spending Density on a County Level"))

# plot distribution of spending per capita
suppressWarnings(
ggplot(data = counties_df, aes(x=counties_df$spendingPerCapita)) +
  stat_density(aes(y=..count..), color="#454955", fill="dark green", alpha=0.3) +
  stat_density(aes(y=..count..), color="#454955", fill="dark green", alpha=0.3) +
  scale_x_continuous(breaks=c(-1,0,1,2,3,4,5,10,30,100,300,500,1000), trans="log1p", expand=c(0,0), limits=c(0,1750)) +
  scale_y_continuous(breaks=c(250,500,750,1000,1250,1500,1750,2000), expand=c(0,0), limits=c(0,2000)) +
  military_theme + xlab("Spending Per Capita in USD") + ylab("Number of counties") +
  ggtitle("Spending Per Capita Density on a County Level"))

# plot the counties which spent the most 
suppressWarnings(
ggplot(data = head(counties_df[order(-counties_df$spending), ], n=10), aes(x=reorder(Area_name, -spending), y=spending)) + 
  geom_histogram(stat="identity", fill="#4b5320") +
  scale_y_continuous(breaks=c(2000000, 4000000, 6000000, 8000000),
                     labels=c("$2mil", "$4mil", "$6mil", "$8mil")) + 
  military_theme + theme(axis.text.x = element_text(angle=45, hjust=1), plot.title = element_text(hjust = 0)) +
  xlab("Counties") + ylab("Total Spending in USD") + 
  ggtitle("Highest spending by County"))

# plot the counties which spent the most per capita
suppressWarnings(
ggplot(data = head(counties_df[order(-counties_df$spendingPerCapita), ], n=10), aes(reorder(county, -spendingPerCapita), spendingPerCapita)) + 
  geom_histogram(stat="identity", fill="#4b5320") +
  scale_x_discrete(labels=counties_df$Area_name) + 
  scale_y_continuous(labels = comma, limits = c(0, 300)) + 
  military_theme + theme(axis.text.x = element_text(angle=45, hjust=1), plot.title = element_text(hjust = 0)) +
  xlab("Counties") + ylab("Spending per capita in USD") + 
  ggtitle("Highest spending per capita by county"))

Most of these counties are very rural with populatiosn under 5000, a couple large purchases (such as 2 tanks and 4 trucks in the case of Divide, ND) give them their high spending per capita.

Bringing in external county-level data

This data comes from three sources:
1. US Census County Data
2. 2012 Presidential Election County-Level Data from The Guardian
3. A Multifactor US County-Level Dataset put together by Emil O. W. Kirkegaard for his 2016 paper Inequality across US counties: an S factor analysis * The factors in this data set do not have detailed descriptions and it has no data from 2008-2012, though most of the factors are from other time spans in between 2006-2014. Only factors with titles that were easily interpretable are used.

# 2012 presidential election
election_df = read_excel("~/projects/policeMilitarySurplus/data/election2012CountyData.xls", sheet = 1)
## Warning in xls_cols(path, sheet, col_names = col_names, col_types =
## col_types, : Expecting numeric in [1430, 5] got `error`
## Warning in xls_cols(path, sheet, col_names = col_names, col_types =
## col_types, : Expecting numeric in [1430, 7] got `error`
election_df$Area_name = paste0(election_df$`County Name`, ", ", election_df$`State Postal`)
election_df = election_df[!duplicated(election_df[,"Area_name"]),]
election_df = election_df[!is.na(election_df$Area_name),]
counties_df$percentRomney = election_df$percentRomney[match(counties_df$Area_name, election_df$Area_name)]
republicanVoteSpendingCor = format(cor(counties_df$percentRomney, counties_df$spending, use = "complete"), digits = 4)

# Population density in 2010
pop_dense_df = read_excel("~/projects/policeMilitarySurplus/data/censusCountyPopulationTotal1.xls", sheet = 3)
counties_df$popDensity = pop_dense_df$POP060210D[match(counties_df$Area_name, pop_dense_df$Area_name)]
spendPopDenseCor = format(cor(counties_df$popDensity, counties_df$spending, use = "complete"), digits = 4)

# Crime
crime_df = read_excel("~/projects/policeMilitarySurplus/data/censusCountyCrime1.xls", sheet = 3)
# Averge number of violent crimes per year known to police over 2006, 2007 and 2008
counties_df$crime= (crime_df$CRM110208D[match(counties_df$Area_name, crime_df$Areaname)] +
                    crime_df$CRM110207D[match(counties_df$Area_name, crime_df$Areaname)] +
                    crime_df$CRM110208D[match(counties_df$Area_name, crime_df$Areaname)]) / 3
spendCrimeCor = format(cor(counties_df$crime, counties_df$spending, use = "complete"), digits = 4)

# Poverty
income_pov_df = read_excel("~/projects/policeMilitarySurplus/data/censusCountyIncomeAndPovertyData.xls", sheet = 3)
# Average people of all ages in poverty per year from 2006-2009
counties_df$poverty = (income_pov_df$IPE110209D[match(counties_df$Area_name, income_pov_df$Areaname)] +
                         income_pov_df$IPE110208D[match(counties_df$Area_name, income_pov_df$Areaname)] +
                         income_pov_df$IPE110207D[match(counties_df$Area_name, income_pov_df$Areaname)] +
                         income_pov_df$IPE110206D[match(counties_df$Area_name, income_pov_df$Areaname)]) / 4
spendPovCor = format(cor(counties_df$poverty, counties_df$spending, use = "complete"), digits = 4)

# Bring in a huge set of count-level data from https://github.com/Deleetdk/USA.county.data
data(USA_county_data)
counties_df$fips = election_df$FIPS[match(counties_df$Area_name, election_df$Area_name)]
USA_county_delta = USA_county_data[sapply(USA_county_data, is.numeric)]
USA_county_delta$spending = counties_df$spending[match(USA_county_delta$fips, counties_df$fips)]
USA_county_delta$percentVotersVotedRomney2008 = counties_df$percentRomney[match(USA_county_delta$fips, counties_df$fips)]
USA_county_delta$popDensity2010 = counties_df$popDensity[match(USA_county_delta$fips, counties_df$fips)]
USA_county_delta$avgViolentCrime06to08 = counties_df$crime[match(USA_county_delta$fips, counties_df$fips)]
USA_county_delta$avgNumPeopleInPoverty06to09 = counties_df$population[match(USA_county_delta$fips, counties_df$fips)]
USA_county_delta = USA_county_delta[!(USA_county_delta$spending==0 | is.na(USA_county_delta$spending)),]
names(USA_county_delta)
# reduce data down to appropriate, understandable factors
keeps = c("spending", "Mixedness", "Infant.mortality", "Injury.deaths", "Homicide.rate",
          "Unemployment", "Uninsured", "HIV.prevalence.rate", "Sexually.transmitted.infections",
          "Diabetes", "Adult.obesity", "Adult.smoking", "Children.in.single.parent.households", "Teen.births",
          "Low.birthweight", "median_age", "Amerindian", "Black", "percentVotersVotedRomney2008", "popDensity2010",
          "White", "Production.transportation.and.material.moving.occupations", "Less.Than.High.School",                                     
          "At.Least.High.School.Diploma", "At.Least.Bachelor.s.Degree", "Graduate.Degree", "School.Enrollment",                                         
          "Median.Earnings.2010.dollars", "White.not.Latino.Population", "African.American.Population",                                
          "Native.American.Population", "Asian.American.Population", "Population.some.other.race.or.races",                       
          "Latino.Population", "Children.Under.6.Living.in.Poverty", "Adults.65.and.Older.Living.in.Poverty",                     
          "Total.Population", "Preschool.Enrollment.Ratio.enrolled.ages.3.and.4", "Poverty.Rate.below.federal.poverty.threshold",               
          "Child.Poverty.living.in.families.below.the.poverty.line", "avgViolentCrime06to08", "avgNumPeopleInPoverty06to09",
          "Management.professional.and.related.occupations", "Service.occupations", "Sales.and.office.occupations",                              
          "Farming.fishing.and.forestry.occupations", "Construction.extraction.maintenance.and.repair.occupations")
USA_county_delta = USA_county_delta[keeps]
spending_cors = sort(cor(as.matrix(USA_county_delta), use="pairwise.complete.obs")["spending",])
spending_cors = head(spending_cors, -1) # remove spending factor
my.cols <- colorRampPalette(c("blue","red"))
res <- data.frame(spending_cors=spending_cors, x=seq(1,length(spending_cors)), y=rep(1,length(spending_cors)), row.names = names(spending_cors))
trellis.par.set(clip=list(panel="off"), axis.line=list(col="transparent"))
levelplot(spending_cors~y*x, data=res, col.regions=my.cols,
          colorkey=list(), region=T, xlab="", ylab="", scales=list(draw=F), pretty = TRUE,
          main=list(label="Correlation with Spending", fontfamily="Courier New"),
          panel=function(...) {
            panel.levelplot(...)
            panel.text(x=rep(1, length(spending_cors)), y=seq(1, length(spending_cors)), 
                       lab=rownames(res), fontfamily="Courier New")
          })

Most of the factors have correlation coefficients very close to 0 which implies those factors probably do not have any relationship at all with spending.

The most telling factors are the top three. The positive correlation of total population and spending is somewhat intuitive, however the positive correlation of crime and poverty with spending is more interesting. What this tells us is that poorer, more crime-ridden counties tend to have higher spending on combat-oriented equipment.

There is also a more nuanced relationship explained by the variables with weaker correlations. We see that non-white populations have weak positive correlations and white population has a weak negative correlation, median age has a weak negative correlation, population density has a weak positive correlation and white collar occupations have weak positive correlation while blue collar occupations have weak negative correlations. What does all of this tell us? Counties that are whiter, more rural, older and more blue collar slightlytend to have less spending on combat-oriented equipment than less white, more white collar and more urban ones do.

ggplot(counties_df, aes(x = log(poverty), y = log(spending))) + 
  military_theme + theme(plot.title = element_text(hjust = 0)) +
  geom_point(colour="#4b5320") + geom_smooth(method='lm', formula=y~x, colour="#454955") +
  xlab("Average Number of People in Poverty per Year from 2006-2009 (log smoothed)") + ylab("Spending (log smoothed)") + 
  ggtitle(label="Spending vs. Poverty on a County Level", 
          subtitle=paste("Correlation between spending and poverty = ", spendPovCor))

suppressWarnings(
ggplot(USA_county_delta, aes(x = White, y = log(spending))) + 
  military_theme + theme(plot.title = element_text(hjust = 0)) +
  geom_point(colour="#4b5320") + geom_smooth(method='lm', formula=y~x, colour="#454955") +
  xlab("Percent White") + ylab("Spending (log smoothed)") +
  ggtitle(label="Spending vs. Percent Whiteness on a County Level",
          subtitle=paste("Correlation between spendinnd Whiteness = ", spending_cors["White"])))
## Warning: Removed 3 rows containing non-finite values (stat_smooth).
## Warning: Removed 3 rows containing missing values (geom_point).

suppressWarnings(
ggplot(USA_county_delta, aes(x = White, y = log(spending))) + 
  military_theme + theme(plot.title = element_text(hjust = 0)) +
  geom_point(colour="#4b5320") + geom_smooth(method='lm', formula=y~x, colour="#454955") +
  xlab("Percent White") + ylab("Spending (log smoothed)") +
  ggtitle(label="Spending vs. Percent Whiteness on a County Level",
          subtitle=paste("Correlation between spendinnd Whiteness = ", spending_cors["White"])))
## Warning: Removed 3 rows containing non-finite values (stat_smooth).
## Warning: Removed 3 rows containing missing values (geom_point).

suppressWarnings(
ggplot(USA_county_delta, aes(x = median_age, y = log(spending))) + 
  military_theme + theme(plot.title = element_text(hjust = 0)) +
  geom_point(colour="#4b5320") + geom_smooth(method='lm', formula=y~x, colour="#454955") +
  xlab("Median Age") + ylab("Spending (log smoothed)") +
  ggtitle(label="Spending vs. Median Age on a County Level",
          subtitle=paste("Correlation between spending and median age = ", spending_cors["median_age"])))
## Warning: Removed 3 rows containing non-finite values (stat_smooth).
## Warning: Removed 3 rows containing missing values (geom_point).

Conclusion and Discussion

Roughly half of all money spent through the 1033 program from 2006 to May 2016 was on equipment that is combat-oriented in nature. In total over the almost 10-year period, $609,879,850 was spent by counties on combat-oriented equipment.
On a state level, Alabama and Tennessee are noteable outliers, they ranked in the top 3 highest total spending and per capita spending state.
Three quarters of all counties in the U.S. spent something on combat-oriented military equipment and most spent less than $100,000. The counties with the highest spending per capita are rural low-population counties.
Counties with higher crime and poverty rates tend to have more spending, while whiter and older counties tend to have a bit less.