← All studies · askamerica.ai

Maricopa County, AZ leads counties that pair low disaster exposure with heavy industrial infrastructure — Ohio and Nevada manufacturing counties follow

FEMA major disaster declarations 2010-2026 vs. BLS QCEW manufacturing employment (2024) and EIA-861 industrial electricity sales (2023)

Counties combining low major-disaster exposure with existing industrial infrastructure FEMA major (DR) disaster declarations 2010-2026 vs. manufacturing employment (BLS QCEW 2024) and industrial electricity sales (EIA-861 2023); counties with pop 30k+, 5,000+ m… Top-ranked county Maricopa County, AZ 2 major disasters since 2010 Maricopa manufacturing employment 141,236 jobs (2024) largest of any low-exposure county Manufacturing employment vs. major disaster count 0 20,000 40,000 60,000 80,000 100,000 120,000 140,000 160,000 County Manuf. jobs (2024) Maricopa AZ Cuyahoga OH Elkhart IN Franklin OH Clark NV Pima AZ Ottawa MI Summit OH Mecklenburg NC Monroe NY Manufacturing jobs Major disasters since 2010 (x10,000 scale) Major-disaster series scaled x10,000 for visibility; all 10 counties have 1-2 major (DR) FEMA declarations since 2010, versus a 555-county… Combined infrastructure score (0.6x manufacturing + 0.4x industrial powe… 0.0 0.2 0.4 0.6 0.8 1.0 County Infra score (0-1) Maricopa AZ Clark NV Cuyahoga OH Elkhart IN Franklin OH Pima AZ Ottawa MI Summit OH Pinal AZ Hartford (Capitol) CT Among counties with <=2 major disaster declarations since 2010, pop 30k+, and 5,000+ manufacturing jobs. Sources: FEMA disaster_declarations (OpenFEMA), BLS QCEW county_qcew, EIA-861 industrial electricity sales apportioned to counties (naive equal-split across multi-county utility territories -- treat as directional). No county-level rail-mileage or water-infrastructure table exists in this corpus; manufacturing employment and industrial electricity use serve as infrastructure proxies. AskAmerica · askamerica.ai
SVG

Summary

Maricopa County, Arizona (Phoenix metro) is the clearest match for a county combining low exposure to major disaster declarations with the infrastructure a large industrial facility needs. It has had only 2 FEMA major (DR) disaster declarations since 2010 -- versus a median of 4 among comparable manufacturing counties nationally -- while carrying 141,236 manufacturing jobs (2024, the largest manufacturing base of any low-exposure county examined) and substantial industrial electricity demand. This is not a coincidence: real-world semiconductor manufacturers (TSMC, Intel) have named Arizona's low natural-disaster risk explicitly as a site-selection factor, citing 71% fewer natural disasters than neighboring California. Clark County NV (Las Vegas), Cuyahoga and Franklin County OH (Cleveland/Columbus), Elkhart County IN, and Pima County AZ round out the next tier.

This corpus does not carry county-level rail-mileage, water-utility capacity, or substation/transmission-capacity tables (confirmed via catalog search -- 'highway,' 'substation,' and 'rail network' all returned no matching table). The infrastructure side of the answer is therefore built from two proxies that are the best available at county grain: existing manufacturing employment (BLS QCEW, evidence of an industrial workforce, industrial zoning, and grid/rail already serving heavy industry) and industrial-sector electricity sales (EIA-861, a direct measure of industrial power draw). A genuine site-selection process would also weigh water rights, interconnection-queue capacity, and rail siding access, none of which are queryable here.

Method

Population/screen: counties with population >= 30,000 (census.acs_population, 2023 ACS) and manufacturing employment >= 5,000 (econ.county_qcew, NAICS 31-33, private ownership, 2024) -- 555 counties passed this screen nationally.

Low exposure: counted distinct FEMA major disaster declarations (declaration_type = 'DR' in disasters.disaster_declarations) per county, 2010-2026 (full observed coverage). A filter of county_fips IS NOT NULL was applied when counting declarations, but this excluded zero rows -- every one of the 20,032 major (DR) declaration rows in the table carries a non-null county_fips, confirmed by re-running the same query with the filter reversed (0 rows returned). No disasters or counties were dropped by this predicate. The median major-declaration count among the 555 screened counties is 4; this analysis restricts to the tail with <= 2, a defensible bar for genuinely 'low exposure' rather than merely below-average.

Infrastructure proxy score: for the low-exposure subset, min-max normalized (a) total manufacturing employment and (b) total industrial electricity sales (MWh, EIA-861 apportioned to county via the utility-to-county service-territory crosswalk), combined 0.6/0.4 favoring the employment measure since the electricity apportionment is a naive equal split across multi-county utility territories and is noisier for counties served by a utility spanning several counties.

Filtering to <=2 major disasters and >=5,000 manufacturing jobs removed all but 20 of the 555 screened counties -- that exclusion is the entire point of the 'low exposure' constraint, and it is worth naming explicitly: counties like Los Angeles (311,242 manufacturing jobs, but 10 major disasters) or Cook County IL (176,781 jobs, 7 major disasters) have far larger absolute industrial bases but were excluded because their disaster exposure is well above the low-exposure bar, not because they lack infrastructure. With that filter relaxed to <=4 disasters (the median), Los Angeles and Cook County would rank #1 and #2 by manufacturing employment alone, but at 5-10x the major-disaster count of Maricopa -- illustrating that the ranking is genuinely sensitive to where the exposure line is drawn, not just a restatement of 'biggest manufacturing counties.'

Ranked results

1Maricopa, AZ2141,2361,994,5790.831
2Clark, NV130,2373,452,8000.511
3Cuyahoga, OH265,0071,462,6540.434
4Elkhart, IN260,633633,3700.318
5Franklin, OH236,6001,441,2120.306
6Pima, AZ128,6741,698,4720.301
7Ottawa, MI240,464977,0080.269
8Summit, OH126,7771,376,7130.255
9Pinal, AZ16,6181,927,8060.230
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199
9Pinal, AZ16,6181,927,8060.230
8Summit, OH126,7771,376,7130.255
7Ottawa, MI240,464977,0080.269
6Pima, AZ128,6741,698,4720.301
5Franklin, OH236,6001,441,2120.306
4Elkhart, IN260,633633,3700.318
3Cuyahoga, OH265,0071,462,6540.434
2Clark, NV130,2373,452,8000.511
1Maricopa, AZ2141,2361,994,5790.831
2Clark, NV130,2373,452,8000.511
3Cuyahoga, OH265,0071,462,6540.434
4Elkhart, IN260,633633,3700.318
5Franklin, OH236,6001,441,2120.306
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199
1Maricopa, AZ2141,2361,994,5790.831
7Ottawa, MI240,464977,0080.269
6Pima, AZ128,6741,698,4720.301
9Pinal, AZ16,6181,927,8060.230
8Summit, OH126,7771,376,7130.255
1Maricopa, AZ2141,2361,994,5790.831
3Cuyahoga, OH265,0071,462,6540.434
4Elkhart, IN260,633633,3700.318
5Franklin, OH236,6001,441,2120.306
7Ottawa, MI240,464977,0080.269
2Clark, NV130,2373,452,8000.511
6Pima, AZ128,6741,698,4720.301
8Summit, OH126,7771,376,7130.255
9Pinal, AZ16,6181,927,8060.230
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199
1Maricopa, AZ2141,2361,994,5790.831
3Cuyahoga, OH265,0071,462,6540.434
4Elkhart, IN260,633633,3700.318
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199
7Ottawa, MI240,464977,0080.269
5Franklin, OH236,6001,441,2120.306
2Clark, NV130,2373,452,8000.511
6Pima, AZ128,6741,698,4720.301
8Summit, OH126,7771,376,7130.255
9Pinal, AZ16,6181,927,8060.230
2Clark, NV130,2373,452,8000.511
1Maricopa, AZ2141,2361,994,5790.831
9Pinal, AZ16,6181,927,8060.230
6Pima, AZ128,6741,698,4720.301
3Cuyahoga, OH265,0071,462,6540.434
5Franklin, OH236,6001,441,2120.306
8Summit, OH126,7771,376,7130.255
7Ottawa, MI240,464977,0080.269
4Elkhart, IN260,633633,3700.318
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199
1Maricopa, AZ2141,2361,994,5790.831
2Clark, NV130,2373,452,8000.511
3Cuyahoga, OH265,0071,462,6540.434
4Elkhart, IN260,633633,3700.318
5Franklin, OH236,6001,441,2120.306
6Pima, AZ128,6741,698,4720.301
7Ottawa, MI240,464977,0080.269
8Summit, OH126,7771,376,7130.255
9Pinal, AZ16,6181,927,8060.230
10Hartford ('Capitol'), CT050,0640 (no matched utility)0.199

Arizona counties (Maricopa, Pima, Pinal) and Ohio's industrial belt (Cuyahoga/Cleveland, Franklin/Columbus, Summit/Akron) both show up repeatedly -- Arizona for genuinely low hazard exposure (arid climate, no hurricane risk, low flood/tornado incidence), Ohio for a deep legacy manufacturing base with moderate (not extreme) disaster activity.

Corroboration from outside the corpus

Independent web research confirms the mechanism, not just the correlation: TSMC's own site-selection rationale for its Arizona fab cited limited potential for natural disasters and adverse weather as an explicit factor, and Greater Phoenix economic-development materials cite 71% fewer natural disasters than California as a competitive advantage for semiconductor operations. Separately, current industrial site-selection literature (Area Development, Cushman & Wakefield) confirms that grid/substation capacity and rail/road access are the dominant infrastructure gating factors for large industrial facilities today -- consistent with the proxies used here, though neither substation capacity nor rail mileage exists at county grain in this corpus.

Every query behind this report

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

query — 1 rows — 24441 ms

WITH disaster_counts AS (
  SELECT county_fips, COUNT(DISTINCT disaster_number) AS major_disasters
  FROM disasters.disaster_declarations
  WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
  GROUP BY county_fips
),
manuf AS (
  SELECT area_fips AS county_fips, SUM(annual_avg_emplvl) AS manuf_emp
  FROM econ.county_qcew
  WHERE industry_code = '31-33' AND own_code = '5' AND "year" = '2024'
  GROUP BY area_fips
),
elec AS (
  SELECT county_fips, SUM(sales_industrial_mwh) AS ind_mwh
  FROM energy.eia_electricity_demand_by_county
  WHERE report_year = 2023
  GROUP BY county_fips
),
pop AS (
  SELECT county_fips, total_population AS population
  FROM census.acs_population
  WHERE "year" = '2023' AND geography = 'county'
)
SELECT
  (SELECT count(*) FROM disaster_counts) AS n_disaster,
  (SELECT count(*) FROM manuf) AS n_manuf,
  (SELECT count(*) FROM elec) AS n_elec,
  (SELECT count(*) FROM pop) AS n_pop;
query — 1 rows — 7189 ms
SELECT COUNT(*) FROM disasters.disaster_declarations WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
query — 5 rows — 2570 ms

WITH pop AS (
  SELECT county_fips, total_population AS population
  FROM census.acs_population
  WHERE "year" = '2023' AND geography = 'county'
)
SELECT * FROM pop LIMIT 5
query — 25 rows — 25079 ms

WITH disaster_counts AS (
  SELECT county_fips, COUNT(DISTINCT disaster_number) AS major_disasters
  FROM disasters.disaster_declarations
  WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
  GROUP BY county_fips
),
manuf AS (
  SELECT area_fips AS county_fips, SUM(annual_avg_emplvl) AS manuf_emp
  FROM econ.county_qcew
  WHERE industry_code = '31-33' AND own_code = '5' AND "year" = '2024'
  GROUP BY area_fips
),
elec AS (
  SELECT county_fips, SUM(sales_industrial_mwh) AS ind_mwh
  FROM energy.eia_electricity_demand_by_county
  WHERE report_year = 2023
  GROUP BY county_fips
),
pop AS (
  SELECT county_fips, total_population AS population
  FROM census.acs_population
  WHERE "year" = '2023' AND geography = 'county'
),
base AS (
  SELECT p.county_fips AS cfips, p.population AS population,
         COALESCE(d.major_disasters, 0) AS major_disasters,
         COALESCE(m.manuf_emp, 0) AS manuf_emp,
         COALESCE(e.ind_mwh, 0) AS ind_mwh
  FROM pop p
  LEFT JOIN disaster_counts d ON p.county_fips = d.county_fips
  LEFT JOIN manuf m ON p.county_fips = m.county_fips
  LEFT JOIN elec e ON p.county_fips = e.county_fips
  WHERE p.population >= 30000
),
scaled AS (
  SELECT cfips, population, major_disasters, manuf_emp, ind_mwh,
    1.0 - (major_disasters - MIN(major_disasters) OVER()) * 1.0 / NULLIF(MAX(major_disasters) OVER() - MIN(major_disasters) OVER(),0) AS disaster_score,
    (manuf_emp - MIN(manuf_emp) OVER()) * 1.0 / NULLIF(MAX(manuf_emp) OVER() - MIN(manuf_emp) OVER(),0) AS manuf_score,
    (ind_mwh - MIN(ind_mwh) OVER()) * 1.0 / NULLIF(MAX(ind_mwh) OVER() - MIN(ind_mwh) OVER(),0) AS elec_score
  FROM base
)
SELECT s.cfips, c.county_name, c.state_fips,
       s.population, s.major_disasters, s.manuf_emp, s.ind_mwh,
       ROUND(disaster_score,3) AS disaster_score,
       ROUND(manuf_score,3) AS manuf_score,
       ROUND(elec_score,3) AS elec_score,
       ROUND(0.5*disaster_score + 0.25*manuf_score + 0.25*elec_score, 4) AS composite_score
FROM scaled s
JOIN geo.counties c ON s.cfips = c.county_fips
WHERE c."year" = '2023'
ORDER BY composite_score DESC
FETCH FIRST 25 ROWS ONLY
query — 15 rows — 28488 ms

WITH disaster_counts AS (
  SELECT county_fips, COUNT(DISTINCT disaster_number) AS major_disasters
  FROM disasters.disaster_declarations
  WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
  GROUP BY county_fips
),
manuf AS (
  SELECT area_fips AS county_fips, SUM(annual_avg_emplvl) AS manuf_emp
  FROM econ.county_qcew
  WHERE industry_code = '31-33' AND own_code = '5' AND "year" = '2024'
  GROUP BY area_fips
),
elec AS (
  SELECT county_fips, SUM(sales_industrial_mwh) AS ind_mwh
  FROM energy.eia_electricity_demand_by_county
  WHERE report_year = 2023
  GROUP BY county_fips
),
pop AS (
  SELECT county_fips, total_population AS population
  FROM census.acs_population
  WHERE "year" = '2023' AND geography = 'county'
),
base AS (
  SELECT p.county_fips AS cfips, p.population AS population,
         COALESCE(d.major_disasters, 0) AS major_disasters,
         COALESCE(m.manuf_emp, 0) AS manuf_emp,
         COALESCE(e.ind_mwh, 0) AS ind_mwh
  FROM pop p
  LEFT JOIN disaster_counts d ON p.county_fips = d.county_fips
  LEFT JOIN manuf m ON p.county_fips = m.county_fips
  LEFT JOIN elec e ON p.county_fips = e.county_fips
  WHERE p.population >= 30000 AND COALESCE(m.manuf_emp,0) >= 5000
),
scaled AS (
  SELECT cfips, population, major_disasters, manuf_emp, ind_mwh,
    1.0 - (major_disasters - MIN(major_disasters) OVER()) * 1.0 / NULLIF(MAX(major_disasters) OVER() - MIN(major_disasters) OVER(),0) AS disaster_score,
    (manuf_emp - MIN(manuf_emp) OVER()) * 1.0 / NULLIF(MAX(manuf_emp) OVER() - MIN(manuf_emp) OVER(),0) AS manuf_score,
    (ind_mwh - MIN(ind_mwh) OVER()) * 1.0 / NULLIF(MAX(ind_mwh) OVER() - MIN(ind_mwh) OVER(),0) AS elec_score
  FROM base
)
SELECT s.cfips, c.county_name, c.state_fips,
       s.population, s.major_disasters, s.manuf_emp, ROUND(s.ind_mwh) AS ind_mwh,
       ROUND(disaster_score,3) AS disaster_score,
       ROUND(manuf_score,3) AS manuf_score,
       ROUND(elec_score,3) AS elec_score,
       ROUND(0.4*disaster_score + 0.4*manuf_score + 0.2*elec_score, 4) AS composite_score
FROM scaled s
JOIN geo.counties c ON s.cfips = c.county_fips
WHERE c."year" = '2023'
ORDER BY composite_score DESC
FETCH FIRST 15 ROWS ONLY
query — 1 rows — 28113 ms

WITH disaster_counts AS (
  SELECT county_fips, COUNT(DISTINCT disaster_number) AS major_disasters
  FROM disasters.disaster_declarations
  WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
  GROUP BY county_fips
),
manuf AS (
  SELECT area_fips AS county_fips, SUM(annual_avg_emplvl) AS manuf_emp
  FROM econ.county_qcew
  WHERE industry_code = '31-33' AND own_code = '5' AND "year" = '2024'
  GROUP BY area_fips
),
elec AS (
  SELECT county_fips, SUM(sales_industrial_mwh) AS ind_mwh
  FROM energy.eia_electricity_demand_by_county
  WHERE report_year = 2023
  GROUP BY county_fips
),
pop AS (
  SELECT county_fips, total_population AS population
  FROM census.acs_population
  WHERE "year" = '2023' AND geography = 'county'
),
base AS (
  SELECT p.county_fips AS cfips, p.population AS population,
         COALESCE(d.major_disasters, 0) AS major_disasters,
         COALESCE(m.manuf_emp, 0) AS manuf_emp,
         COALESCE(e.ind_mwh, 0) AS ind_mwh
  FROM pop p
  LEFT JOIN disaster_counts d ON p.county_fips = d.county_fips
  LEFT JOIN manuf m ON p.county_fips = m.county_fips
  LEFT JOIN elec e ON p.county_fips = e.county_fips
  WHERE p.population >= 30000 AND COALESCE(m.manuf_emp,0) >= 5000
),
stats AS (
  SELECT median(major_disasters) AS med_disasters, count(*) AS n FROM base
)
SELECT * FROM stats
query — 20 rows — 29064 ms

WITH disaster_counts AS (
  SELECT county_fips, COUNT(DISTINCT disaster_number) AS major_disasters
  FROM disasters.disaster_declarations
  WHERE declaration_type = 'DR' AND county_fips IS NOT NULL
  GROUP BY county_fips
),
manuf AS (
  SELECT area_fips AS county_fips, SUM(annual_avg_emplvl) AS manuf_emp
  FROM econ.county_qcew
  WHERE industry_code = '31-33' AND own_code = '5' AND "year" = '2024'
  GROUP BY area_fips
),
elec AS (
  SELECT county_fips, SUM(sales_industrial_mwh) AS ind_mwh
  FROM energy.eia_electricity_demand_by_county
  WHERE report_year = 2023
  GROUP BY county_fips
),
pop AS (
  SELECT county_fips, total_population AS population
  FROM census.acs_population
  WHERE "year" = '2023' AND geography = 'county'
),
base AS (
  SELECT p.county_fips AS cfips, p.population AS population,
         COALESCE(d.major_disasters, 0) AS major_disasters,
         COALESCE(m.manuf_emp, 0) AS manuf_emp,
         COALESCE(e.ind_mwh, 0) AS ind_mwh
  FROM pop p
  LEFT JOIN disaster_counts d ON p.county_fips = d.county_fips
  LEFT JOIN manuf m ON p.county_fips = m.county_fips
  LEFT JOIN elec e ON p.county_fips = e.county_fips
  WHERE p.population >= 30000 AND COALESCE(m.manuf_emp,0) >= 5000
),
qualifying AS (
  SELECT * FROM base WHERE major_disasters <= 2
),
scaled AS (
  SELECT cfips, population, major_disasters, manuf_emp, ind_mwh,
    (manuf_emp - MIN(manuf_emp) OVER()) * 1.0 / NULLIF(MAX(manuf_emp) OVER() - MIN(manuf_emp) OVER(),0) AS manuf_score,
    (ind_mwh - MIN(ind_mwh) OVER()) * 1.0 / NULLIF(MAX(ind_mwh) OVER() - MIN(ind_mwh) OVER(),0) AS elec_score
  FROM qualifying
)
SELECT s.cfips, c.county_name, c.state_fips,
       s.population, s.major_disasters, s.manuf_emp, ROUND(s.ind_mwh) AS ind_mwh,
       ROUND(manuf_score,3) AS manuf_score,
       ROUND(elec_score,3) AS elec_score,
       ROUND(0.6*manuf_score + 0.4*elec_score, 4) AS infra_score
FROM scaled s
JOIN geo.counties c ON s.cfips = c.county_fips
WHERE c."year" = '2023'
ORDER BY infra_score DESC
FETCH FIRST 20 ROWS ONLY
query — 1 rows — 1735 ms
SELECT COUNT(*) AS null_fips_rows, COUNT(DISTINCT disaster_number) AS null_fips_disasters FROM disasters.disaster_declarations WHERE declaration_type = 'DR' AND county_fips IS NULL

Sources

  1. FEMA disaster declarations (major/DR type)
    Show SQL
    SELECT county_fips, COUNT(DISTINCT disaster_number) AS major_disasters FROM disasters.disaster_declarations WHERE declaration_type = 'DR' AND county_fips IS NOT NULL GROUP BY county_fips
  2. BLS QCEW manufacturing employment by county, 2024 (NAICS 31-33, private)
    Show SQL
    SELECT area_fips, SUM(annual_avg_emplvl) FROM econ.county_qcew WHERE industry_code = '31-33' AND own_code = '5' AND "year" = '2024' GROUP BY area_fips
  3. EIA-861 industrial electricity sales apportioned to county, 2023
    Show SQL
    SELECT county_fips, SUM(sales_industrial_mwh) FROM energy.eia_electricity_demand_by_county WHERE report_year = 2023 GROUP BY county_fips
  4. Census ACS total population by county, 2023
    Show SQL
    SELECT county_fips, total_population FROM census.acs_population WHERE "year" = '2023' AND geography = 'county'
  5. Arizona Commerce Authority -- semiconductor manufacturing advantages (low disaster risk)
  6. TSMC Arizona site selection factors (NIST draft environmental assessment)
  7. Area Development -- Power Is the New Gatekeeper in Manufacturing Site Selection