← All studies · askamerica.ai

Police-force size tracks crime rates across places, but not within places over 20 years — and county-grain data doesn't exist to test this directly

FBI Crime Data Explorer, state-year grain, 2010-2024; published county-level causal literature, 1960-2020s

Police staffing tracks crime across places (reverse causation) but not within places over time FBI CDE state-year data, 2010-2024 (49 states + DC); county-grain police staffing does not exist in this warehouse or in any public federal source Cross-state correlation (officers/1,000 vs violent crime rate, 50 states+DC avg 2010-24) r = 0.58 Positive: places with more officers per capita also have more crime. This is dominated by reverse causation (departments staff up where… Same correlation excluding DC r = 0.33 DC alone roughly halves it DC is both the most policed and most violent jurisdiction; it inflates the pooled cross-sectional relationship substantially. Within-state panel effect (2-way FE, state+year absorbed) -5.0 per officer/1,000 p = 0.51, not significant Once state and year fixed effects strip out level differences and national trends, a state's own year-to-year change in officer staffin… Officers per 1,000 residents vs. average violent-crime rate per 100k, state … 0 200 400 600 800 1,000 1,200 Officers per 1,000 Violent rate /100k 2 3 4 5 6 7 8 States DC (outlier) Each point is one jurisdiction's 2010-2024 average. The visible positive slope across states is a place-effect (urban, high-crime… County-grain police employment is not available in this connector (crime.cde_police_employment is state-year only) nor practically obtainable federally at county grain for a 20-year window; state-year FBI CDE data (crime.cde_offenses, crime.cde_police_employment) is the finest common grain available and is used here as the closest feasible proxy, explicitly labeled as such. AskAmerica · askamerica.ai
SVG

Summary

The question as asked cannot be answered directly: no dataset — in this connector or, to our knowledge, in any public federal source — tracks police force size at the county level across a 20-year window. The FBI's police-employment series (crime.cde_police_employment) is published only at state grain; county-level agency-by-agency staffing exists only as a scattered, incompletely-reported roll-up (crime.cde_reta / cde_agencies) with no consistent officer-count field. Two things can still be said with real data: (1) at the coarser state-year grain, places with more officers per capita also tend to have more crime — a raw cross-sectional correlation of about r=0.58 (r=0.33 excluding the extreme outlier, Washington DC) — but this is driven mainly by cities/states reactively staffing up where crime is already high, not by police presence causing crime; (2) once state and year fixed effects are removed — i.e., looking only at whether a state's own year-to-year change in officers per 1,000 tracks its own year-to-year change in violent crime — there is no statistically detectable relationship (coefficient -5.0 per officer/1,000, p=0.51, n=712 state-years, 2010-2024). This matches the published quasi-experimental literature: naive raw correlations between police staffing and crime are typically flat-to-positive because of reverse causation, but well-identified studies using exogenous variation (COPS grant timing, terror-alert redeployments) find police reduce crime, with elasticities around -0.3 to -1.3 depending on crime type and study.

Why the question can't be answered at county grain

We ran search_catalog and describe_table across the crime schema and every table with a county dimension. The results: crime.cde_police_employment (officers per 1,000, sworn officer counts) is keyed on state_abbr + year only — no county column. crime.cde_agencies has a county_name field (agency registry, ~19,600 agencies) but carries no officer-count column at all — just agency identity and NIBRS status. crime.cde_reta is agency-level and monthly, with a county derivable through cde_agencies, but it records only offense counts and officers killed/assaulted in the line of duty — never total officer headcount. No table in this warehouse joins an agency's authorized/sworn strength to its jurisdiction's population at county grain. The FBI's own public LEOKA/CDE employment publication is state-level for the same reason: local agencies report officer counts to the FBI's Uniform Crime Reporting Program inconsistently below the state roll-up, and BJS's county-comparable series (the Law Enforcement Management and Administrative Statistics survey) is a periodic sample survey, not an annual full-count series, so it cannot support a continuous 20-year county panel either. This is a genuine, structural data gap, not a query-writing failure — we are naming it rather than substituting a coarser table for the county claim.

What the state-year data show instead (used as the closest available proxy)

Using FBI CDE state-year data 2010-2024 (crime.cde_offenses summed to annual violent-crime rate per 100k, filtered to state-years with at least 80% agency reporting coverage per the recipe for this table's known SRS-to-NIBRS reporting-coverage instability; crime.cde_police_employment for officers per 1,000):

What the published, quasi-experimental literature finds

The state-year panel above cannot resolve the police-crime relationship causally — officer counts and crime are jointly determined (departments staff up in response to crime, and crime waves can also strain enforcement capacity), and self-reported officer counts are measured with error, both of which bias naive correlations. The literature gets around this with genuinely exogenous shifters of police staffing:

Net picture: when identified with exogenous variation, more police officers per capita causally reduce crime, with an elasticity in roughly the -0.3 to -1.3 range depending on crime type and study design; but a simple correlation of officer staffing against crime rates is confounded by reverse causation and typically comes out flat or positive, exactly what we found in the state-year data here.

Caveats

What This Report Does Not Answer

Every query behind this report

7 warehouse calls ran in this session, in order. Each is reproducible against the same snapshot.

query — 5 rows — 1804 ms
SELECT state_abbr, MIN(year) miny, MAX(year) maxy, COUNT(*) n FROM crime.cde_police_employment WHERE state_abbr <> 'national' GROUP BY state_abbr ORDER BY state_abbr LIMIT 5
query — 500 rows — 3711 ms
SELECT state_abbr, CAST(year AS INTEGER) yr, SUM(offense_rate) AS violent_rate, AVG(population_coverage_pct) AS cov_pct
FROM crime.cde_offenses
WHERE offense_code = 'violent-crime' AND state_abbr <> 'national' AND CAST(year AS INTEGER) BETWEEN 2010 AND 2024
GROUP BY state_abbr, CAST(year AS INTEGER)
HAVING AVG(population_coverage_pct) >= 80
ORDER BY state_abbr, yr
panel_fixed_effects — 5596 ms
WITH crime_yr AS (
  SELECT state_abbr, CAST(year AS INTEGER) yr, SUM(offense_rate) AS violent_rate, AVG(population_coverage_pct) AS cov_pct
  FROM crime.cde_offenses
  WHERE offense_code = 'violent-crime' AND state_abbr NOT IN ('national','DC') AND CAST(year AS INTEGER) BETWEEN 2010 AND 2024
  GROUP BY state_abbr, CAST(year AS INTEGER)
  HAVING AVG(population_coverage_pct) >= 80
)
SELECT c.state_abbr, c.yr, c.violent_rate, p.officers_per_1000
FROM crime_yr c
JOIN crime.cde_police_employment p ON p.state_abbr = c.state_abbr AND p.year = c.yr
WHERE p.officers_per_1000 IS NOT NULL
query — 1 rows — 5981 ms
WITH crime_yr AS (
  SELECT state_abbr, CAST(year AS INTEGER) yr, SUM(offense_rate) AS violent_rate, AVG(population_coverage_pct) AS cov_pct
  FROM crime.cde_offenses
  WHERE offense_code = 'violent-crime' AND state_abbr NOT IN ('national','DC') AND CAST(year AS INTEGER) BETWEEN 2010 AND 2024
  GROUP BY state_abbr, CAST(year AS INTEGER)
  HAVING AVG(population_coverage_pct) >= 80
)
SELECT corr(c.violent_rate, p.officers_per_1000) AS pooled_corr, COUNT(*) n
FROM crime_yr c
JOIN crime.cde_police_employment p ON p.state_abbr = c.state_abbr AND p.year = c.yr
WHERE p.officers_per_1000 IS NOT NULL
query — 1 rows — 6120 ms
WITH crime_yr AS (
  SELECT state_abbr, CAST(year AS INTEGER) yr, SUM(offense_rate) AS violent_rate, AVG(population_coverage_pct) AS cov_pct
  FROM crime.cde_offenses
  WHERE offense_code = 'violent-crime' AND state_abbr <> 'national' AND CAST(year AS INTEGER) BETWEEN 2010 AND 2024
  GROUP BY state_abbr, CAST(year AS INTEGER)
  HAVING AVG(population_coverage_pct) >= 80
)
SELECT corr(c.violent_rate, p.officers_per_1000) AS pooled_corr_with_dc, COUNT(*) n
FROM crime_yr c
JOIN crime.cde_police_employment p ON p.state_abbr = c.state_abbr AND p.year = c.yr
WHERE p.officers_per_1000 IS NOT NULL
query — 50 rows — 6284 ms
WITH crime_yr AS (
  SELECT state_abbr, CAST(year AS INTEGER) yr, SUM(offense_rate) AS violent_rate, AVG(population_coverage_pct) AS cov_pct
  FROM crime.cde_offenses
  WHERE offense_code = 'violent-crime' AND state_abbr NOT IN ('national') AND CAST(year AS INTEGER) BETWEEN 2010 AND 2024
  GROUP BY state_abbr, CAST(year AS INTEGER)
  HAVING AVG(population_coverage_pct) >= 80
)
SELECT c.state_abbr, c.officers, c.violent_rate FROM (
  SELECT c.state_abbr, AVG(p.officers_per_1000) officers, AVG(c.violent_rate) violent_rate
  FROM crime_yr c JOIN crime.cde_police_employment p ON p.state_abbr=c.state_abbr AND p.year=c.yr
  WHERE p.officers_per_1000 IS NOT NULL
  GROUP BY c.state_abbr
) c
ORDER BY c.state_abbr
query — 1 rows — 1360 ms
SELECT COUNT(*) FROM crime.cde_police_employment WHERE state_abbr <> 'national' AND officers_per_1000 IS NULL

Sources

  1. crime.cde_offenses (violent-crime offense_rate, state-year, coverage-filtered)
    Show tool call
    query(sql="SELECT state_abbr, year, SUM(offense_rate) violent_rate, AVG(population_coverage_pct) cov_pct FROM crime.cde_offenses WHERE offense_code='violent-crime' AND state_abbr<>'national' GROUP BY state_abbr, year HAVING AVG(population_coverage_pct)>=80")
  2. crime.cde_police_employment (officers per 1,000, state-year)
    Show SQL
    SELECT state_abbr, year, officers_per_1000 FROM crime.cde_police_employment WHERE state_abbr <> 'national'
  3. Two-way fixed-effects panel: violent_rate ~ officers_per_1000, entity=state, time=year, clustered SE
    Show tool call
    panel_fixed_effects(outcome="violent_rate", predictors=["officers_per_1000"], entity_col="state_abbr", time_col="yr", cluster_col="state_abbr")
  4. Chalfin & McCrary, "The Effect of Police on Crime: New Evidence from U.S. Cities, 1960-2010", NBER Working Paper 18815
  5. Chalfin & McCrary, "Police Force Size and Civilian Race", NBER Working Paper 28202
  6. Mello, "More COPS, Less Crime"
  7. "Size isn't everything: Understanding the relationship between police workforce and crime problems", Journal of Criminal Justice, 2024
  8. "Police levels and crime: A systematic review and meta-analysis"