NORC Data - Data Center Opposition Analysis

Candidates platformed data center positions in the midterms. People feel strongly about data centers. In exit polls, people said their feelings about data centers drove their vote. In the aftermath,analysts and reporters are concluding that data center positioning carried a lot of weight in the surprising midterm results. And AI stocks fell amid the interpretation that the midterm results were a referendum on AI and data centers.

How much did data centers actually motivate turnout or swing votes? Do concerns about data centers explain any variance above concerns about the economy?

And to what extent are the roots of the opposition truly in data centers vs AI regulation and economic concerns?

show code
chep_raw <- read_csv("https://civichealth.norc.org/downloads/civichealth_datafile.csv") 
Rows: 113020 Columns: 402
── Column specification ────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): P_STATE, RACE1_OFFICEID, RACE3_OFFICEID, RACE4_OFFICEID, RACE5_OF...
dbl (396): SU_ID, CHEP_WEIGHT, MODE, STATENUM, LVB, WVA, WVB, TIMEVOTE, LIKE...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
show code
chep_clean = chep_raw |> 
  select(LVB, DATACENTER_PROXIMITY, DATACENTERS, AICON_HEALTH, AICON_LAND, AICON_POLLUTION, AICON_UTIL, AIFAV_GOVREG, AIFAV_GRIDUP, AIFAV_LIMITSCHOOLS, AIFAV_LOCALDATA, AIHELP_ARTS, AIHELP_CLIMATE, AIHELP_ECON, AIHELP_US, AIHELP_YOU, AITX_COMMS, AITX_GVMT, AITX_INFO, AITX_TAXES, COMPETITIVE_GOV, COMPETITIVE_SEN, CONF_CONGRESS, CONF_EXEC, CONF_LOCALGVMT, CONF_STATE, ECONOMY,FINANCE_NONE, GOVVOTE, HOUSEVOTE, IDEO5, MED_HH_INC, SATIF_FINANCIAL, SATIF_US, SENVOTE, RACE1_RACEID, RACE1_VOTE, RACE1_PARTY, RACE3_OFFICEID, RACE3_PARTY, RACE3_RACEID, RACE3_VOTE, RACE4_OFFICEID, RACE4_PARTY, RACE4_RACEID, RACE4_VOTE, RACE5_OFFICEID, RACE5_PARTY, RACE5_RACEID, RACE5_VOTE, TRUST_GOV, VOTE22, VOTE22_CHOICE, VOTE24, VOTE24_CHOICE, LIKELYVOTER, PARTY5, PARTY) |> 
  mutate(voter2026 = case_when(LVB == 3 | LVB == 4 ~"nonvoter",
                               LVB == 1 | LVB == 2 | LVB == 5 ~ "voter",
                               LVB == 99 ~NA)) |> 
  mutate(vote26 = case_when(voter2026 == 'nonvoter' ~ "none",
                            HOUSEVOTE == 1 ~ "D",
                            HOUSEVOTE == 2 ~ "R",
                            HOUSEVOTE == 3 ~ "other"),
         vote24 = case_when(VOTE24 == 2 ~ "none",
                            VOTE24_CHOICE == 1 ~ "D",
                            VOTE24_CHOICE == 2 ~ "R",
                            VOTE24_CHOICE == 3 ~ "other"),
        vote_transition_24_26 = case_when(vote24 == "R" & vote26 == "R" ~ "stayedRed", #uses presidential vote in 24 and house vote in 26 to classify party vote and transition
                                          vote24 == "D" & vote26 == "D" ~ "stayedBlue",
                                          (vote24 == "D" | vote24 =='other') & vote26 == "R" ~ "flippedRed",
                                          (vote24 == "R"| vote24 =='other') & vote26 == "D" ~ "flippedBlue",
                                          vote24 == "R" & vote26 == "none" ~ "votedRed24_stayedHome26",
                                          vote24 == "D" & vote26 == "none" ~ "votedBlue24_stayedHome26",
                                          vote24 == "none" & vote26 == "R" ~ "newVoter_Red",
                                          vote24 == "none" & vote26 == "D" ~ "newVoter_Blue",
                                          vote24 == "none" & vote26 == "none" ~ "nonvoter_both",
                                          vote24 == "other" | vote26 == "other" ~ "thirdParty"),
        dataCenterSentiment = if_else(AIFAV_LOCALDATA %in% 1:5, 3 - AIFAV_LOCALDATA, NA),
        DATACENTER_PROXIMITY = ifelse(DATACENTER_PROXIMITY != 99, DATACENTER_PROXIMITY, NA),
        across(c(starts_with("AICON_"),
                  AIFAV_GOVREG, AIFAV_GRIDUP, AIFAV_LIMITSCHOOLS,
                  starts_with("AIHELP_")),
                ~ na_if(.x, 99),
                .names = "{.col}_clean")) |> 
  
  mutate(across(starts_with("AICON_") & ends_with("_clean"),
                ~ if_else(.x %in% 1:5, 5 - .x, NA),  
                .names = "{str_replace(str_remove(.col, '_clean'), 'AICON_', 'DataCenterConcern_')}")) |>
  mutate(across(starts_with("AIHELP_") & ends_with("_clean"),
                ~ case_match(.x,
                             1 ~  1,    
                             2 ~ -1,    
                             3 ~  0),  
                .names = "{str_replace(str_remove(.col, '_clean'), 'AIHELP_', 'AIhelpHurt_')}")) |>


  select(-ends_with("_clean"))

Relevant variables

  • DATACENTER_PROXIMITY “Data center proximity (Source: Data Center Map)”
  • DATACENTERS “Data center count (Source: Data Center Map)”
  • AICON_HEALTH “How concerned are you about AI data centers impacting the health of the local population in the communities where they are built?”
  • AICON_LAND “How concerned are you about AI data centers impacting the development of open land or land previously used for farming and agriculture in the communities where they are built?”
  • AICON_POLLUTION “How concerned are you about AI data centers impacting pollution of natural resources, including air and water, in the communities where they are built?”
  • AICON_UTIL “How concerned are you about AI data centers impacting the price of utilities, including electricity and water, in the communities where they are built?”
  • AIFAV_GOVREG “Do you favor, oppose, or neither favor nor oppose increased government regulation on the use of artificial intelligence, or AI?”
  • AIFAV_GRIDUP “Do you favor, oppose, or neither favor nor oppose policies that require companies that build data centers to pay for the electric grid upgrades needed to support them?”
  • AIFAV_LIMITSCHOOLS “Do you favor, oppose, or neither favor nor oppose policies that limit the use of AI in public elementary and high schools?”
  • AIFAV_LOCALDATA “Do you favor, oppose, or neither favor nor oppose the construction of a data center in your local area to support artificial intelligence, or AI, technology in the U.S.?”
  • AIHELP_ARTS “In the next 10 years, do you think artificial intelligence, or AI, will do more to help or more to hurt arts and entertainment, or will it not make much difference? If you’re not sure, you can say that too.”
  • AIHELP_CLIMATE “In the next 10 years, do you think artificial intelligence, or AI, will do more to help or more to hurt the environment, or will it not make much difference? If you’re not sure, you can say that too.”
  • AIHELP_ECON “In the next 10 years, do you think artificial intelligence, or AI, will do more to help or more to hurt the U.S. economy, or will it not make much difference? If you’re not sure, you can say that too.”
  • AIHELP_US “In the next 10 years, do you think artificial intelligence, or AI, will do more to help or more to hurt the ability of the U.S. to compete with other countries, or will it not make much difference? If you’re not sure, you can say that too.”
  • AIHELP_YOU “In the next 10 years, do you think artificial intelligence, or AI, will do more to help or more to hurt you personally, or will it not make much difference? If you’re not sure, you can say that too.”
  • AITX_COMMS “Do you agree, disagree, or neither agree nor disagree that the communities that host data centers receive more in benefits than they bear in costs?”
  • AITX_GVMT “Do you agree, disagree, or neither agree nor disagree that governments should stop approving new data centers until stronger regulations and safeguards are in place?”
  • AITX_INFO “Do you agree, disagree, or neither agree nor disagree that data center companies provide enough information to local communities about their energy and water use?”
  • AITX_TAXES “Do you agree, disagree, or neither agree nor disagree that data centers receive more tax breaks from state and local governments than they should?”
  • COMPETITIVE_GOV “Competitive Governor race (Source: Cook Political Report)”
  • COMPETITIVE_SEN “Competitive Senate race (Source: Cook Political Report)”
  • CONF_CONGRESS “As far as the people running Congress are concerned, would you say you have a great deal of confidence, only some confidence, or hardly any confidence at all in them?”
  • CONF_EXEC “As far as the people running the executive branch of the federal government are concerned, would you say you have a great deal of confidence, only some confidence, or hardly any confidence at all in them?”
  • CONF_LOCALGVMT “As far as the people running local government such as your town council, city commission, or county board are concerned, would you say you have a great deal of confidence, only some confidence, or hardly any confidence at all in them?”
  • CONF_STATE “As far as the people running [RESPONDENT STATE]’s government are concerned, would you say you have a great deal of confidence, only some confidence, or hardly any confidence at all in them?”
  • ECONOMY “How would you describe the nation’s economy these days? Would you say…” [1 = very good, 5 = very poor, 99 = skipped]
  • FINANCE_NONE “In the past year, have you done or experienced any of the following? None of these”
  • GOVVOTE “Vote for Governor” [1 = Dem vote, 2 = Repub vote, 3 = other]
  • HOUSEVOTE “Vote for Congress” [1 = Dem vote, 2 = Repub vote, 3 = other]
  • IDEO5 “On most political matters, do you consider yourself…” [1 = very liberal, 3 = moderate, 5 = very conservative]
  • MED_HH_INC “Median household income (Source: ACS)”
  • SATIF_FINANCIAL “How satisfied are you with your current financial situation?”
  • SATIF_US “How satisfied are you with how things are going in the country today?”
  • SENVOTE “Vote for Senate”
  • RACE1_RACEID “Race 1 race ID”
  • RACE1_VOTE “Race 1 candidate vote”
  • RACE3_OFFICEID “Race 3 office ID”
  • RACE3_PARTY “Race 3 party vote”
  • RACE3_RACEID “Race 3 race ID”
  • RACE3_VOTE “Race 3 candidate vote”
  • RACE4_OFFICEID “Race 4 office ID”
  • RACE4_PARTY “Race 4 party vote”
  • RACE4_RACEID “Race 4 race ID”
  • RACE4_VOTE “Race 4 candidate vote”
  • RACE5_OFFICEID “Race 5 office ID”
  • RACE5_PARTY “Race 5 party vote”
  • RACE5_RACEID “Race 5 race ID”
  • RACE5_VOTE “Race 5 candidate vote”
  • TRUST_GOV “Do you agree, disagree, or neither agree nor disagree that most of the time we can trust people in government to do what is right?”
  • VOTE22 “What about voting in the 2022 midterm election? Which one of the following statements best describes you?”
  • VOTE22_CHOICE “In the 2022 election for United States House of Representatives, did you vote for the Democratic candidate, the Republican candidate, or someone else?”
  • VOTE24 “Which one of the following statements best describes you?”
  • VOTE24_CHOICE “Did you vote in the 2024 presidential election for Kamala Harris, Donald Trump, or someone else?”
  • LIKELYVOTER [1 = likely voter, 2 = nonvoter]
  • PARTY5 “Democrat” “Lean Democrat”“Independent no lean” “Lean Republican” “Republican” = PARTY Democrat, Republican, Neither

Created variables

voter2026

  • “voter” if indicated probably, definitely will vote or already have voted
  • ‘nonvoter’ if indicated probably or definitely will not

vote24

  • ‘none’ if did not vote
  • ‘R’ if voted for Trump
  • ‘D’ if voted for Harris
  • ‘other’

vote26

  • ‘none’ if did not vote in House vote
  • ‘R’ if voted for Republican in House vote
  • ‘D’ if voted for Democrat in House vote
  • ‘other’ if voted for another candidate
  • note that this does not incorporate Alaska bc they have a different voting method. can add at a later time

vote_transition_24_26

  • “stayedRed” if voted for Trump 24 and for Republican House 26
  • “stayedBlue” if voted for Harris 24 and Democrat House 26
  • “flippedRed” if voted for Harris OR Other 24 and Republican House 26
  • “flippedBlue” if voted for Trump OR Other 24 and Democrat House 26
  • “votedRed24_stayedHome26” if voted for Trump 24 and did not vote 26
  • “votedBlue24_stayedHome26” if voted for Harris 24 and did not vote 26
  • “newVoter_Red” if did not vote 24 and voted for Republican House 26
  • “newVoter_Blue” if did not vote 24 and voted for Democrat House 26
  • “nonvoter_both” did not vote either
  • “thirdParty” if voted other both times

Note that for AI and data center concern and regulation variables: recoded “not sure” as NA

Descriptives

show code
nice_table(chep_clean %>% group_by(LIKELYVOTER)  %>% count(), title = 'Likely voters (1) and nonvoters (2)')

Likely voters (1) and nonvoters (2)

LIKELYVOTER

n

1.00

94,489

2.00

18,531

show code
cat('Party with leaners: Democrat (1) Lean Democrat (2) Independent no lean (3) Lean Republican (4) Republican (5)')
Party with leaners: Democrat (1) Lean Democrat (2) Independent no lean (3) Lean Republican (4) Republican (5)
show code
ggdensity(data=chep_clean, x = 'PARTY5', y = 'count', fill='#FDDA24', color='#FDDA24')

show code
nice_table(chep_clean %>% group_by(vote26)  %>% count(), title = "(Intended) House vote '26")

(Intended) House vote '26

vote26

n

D

55,713

R

38,322

none

12,472

other

5,350

1,163

show code
nice_table(chep_clean %>% group_by(vote24)  %>% count(), title = "Presidential vote '24")

Presidential vote '24

vote24

n

D

45,202

R

36,113

none

25,875

other

4,881

949

show code
nice_table(chep_clean %>% group_by(vote_transition_24_26)  %>% count(), title = 'Voter transition status between General Election 24 and House Vote 26')

Voter transition status between General Election 24 and House Vote 26

vote_transition_24_26

n

flippedBlue

4,699

flippedRed

2,420

newVoter_Blue

9,085

newVoter_Red

5,641

nonvoter_both

9,016

stayedBlue

41,506

stayedRed

30,033

thirdParty

6,110

votedBlue24_stayedHome26

1,025

votedRed24_stayedHome26

1,751

1,734

show code
chep_clean |> count(vote_transition_24_26) |>  ggbarplot(x = 'vote_transition_24_26', y = 'n', fill='#E57200', color='#E57200')+coord_flip()

Data Center Sentiment

“Do you favor, oppose, or neither favor nor oppose the construction of a data center in your local area to support artificial intelligence, or AI, technology in the U.S.?”

  • -2 = strongly oppose
  • -1 = somewhat oppose
  • 0 = neither
  • 1 = somewhat favor
  • 2 = strongly favor

Data center opposition and by voter status

show code
ggbarplot(data = subset(chep_clean, !is.na(vote_transition_24_26)), x = 'vote_transition_24_26', y = 'dataCenterSentiment', fill='#E57200',  add='mean_se')+coord_flip()

show code
chep_clean |> filter(!is.na(vote_transition_24_26) & !is.na(dataCenterSentiment)) %>% group_by(vote_transition_24_26, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% mutate(dataCenterSentiment = fct_rev(factor(dataCenterSentiment))) %>% 
  ggplot(aes(x = .5, y=percent, fill = dataCenterSentiment))+
  geom_bar(stat = "identity", color='white') +
  theme_void(base_size=15)+
  labs(fill="", x='') +
  theme(legend.position='top')+
  scale_fill_manual(values=c('#232D4B','#C8CBD2','#FDDA24','#F9DCBF','#E57200'))+
  coord_flip()+
  facet_wrap(~vote_transition_24_26, ncol = 1)

Data Center opposition by proximity to a data center

Data Center Proximity:

  1. data center located within county
  2. Data center located within 100 miles of county
  3. Data center located farther than 100 miles of county
show code
summary(lm(data = subset(chep_clean, DATACENTER_PROXIMITY!=99), dataCenterSentiment~DATACENTER_PROXIMITY))

Call:
lm(formula = dataCenterSentiment ~ DATACENTER_PROXIMITY, data = subset(chep_clean, 
    DATACENTER_PROXIMITY != 99))

Residuals:
    Min      1Q  Median      3Q     Max 
-1.3703 -1.2969 -0.2969  0.7031  2.7766 

Coefficients:
                      Estimate Std. Error t value Pr(>|t|)    
(Intercept)          -0.556211   0.011328  -49.10   <2e-16 ***
DATACENTER_PROXIMITY -0.073460   0.007225  -10.17   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 1.277 on 111322 degrees of freedom
  (1696 observations deleted due to missingness)
Multiple R-squared:  0.0009277, Adjusted R-squared:  0.0009187 
F-statistic: 103.4 on 1 and 111322 DF,  p-value: < 2.2e-16
show code
ggscatter(data=subset(chep_clean, DATACENTER_PROXIMITY!=99),  y='dataCenterSentiment', x='DATACENTER_PROXIMITY', position=position_jitter(), alpha=0.05, add='reg.line')

Support goes down as people get further away from a data center, but the effect is tiny

show code
AI_DC_vars = chep_clean |> select(DATACENTER_PROXIMITY, dataCenterSentiment, DataCenterConcern_HEALTH, DataCenterConcern_LAND, DataCenterConcern_POLLUTION, DataCenterConcern_UTIL, AIhelpHurt_ARTS, AIhelpHurt_CLIMATE, AIhelpHurt_ECON, AIhelpHurt_US, AIhelpHurt_YOU, ECONOMY, TRUST_GOV)

ggcorrplot(round(cor(AI_DC_vars, use='complete.obs'), 3),
           hc.order = TRUE, type = "upper", outline.color = "white", ggtheme = ggplot2::theme_gray, colors = c("#E46726", "white","#6D9EC1" ), lab=TRUE, digits=2)

show code
AI_DC_concernsPCA = AI_DC_vars |> select(-TRUST_GOV, -ECONOMY, -DATACENTER_PROXIMITY) %>% 
  filter(!if_any(everything(), is.na)) %>% 
  princomp(., cor = TRUE)

AI_DC_concernsPCA$loadings

Loadings:
                            Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7
dataCenterSentiment          0.289         0.803  0.500  0.106              
DataCenterConcern_HEALTH    -0.339 -0.348  0.179                            
DataCenterConcern_LAND      -0.336 -0.338                                   
DataCenterConcern_POLLUTION -0.347 -0.360                                   
DataCenterConcern_UTIL      -0.333 -0.356                                   
AIhelpHurt_ARTS              0.283 -0.316  0.228 -0.669  0.446  0.323 -0.118
AIhelpHurt_CLIMATE           0.320 -0.283  0.144 -0.276 -0.715         0.445
AIhelpHurt_ECON              0.327 -0.316 -0.104  0.135 -0.290 -0.145 -0.809
AIhelpHurt_US                0.279 -0.336 -0.441  0.420         0.606  0.224
AIhelpHurt_YOU               0.302 -0.339 -0.170  0.129  0.426 -0.700  0.269
                            Comp.8 Comp.9 Comp.10
dataCenterSentiment                              
DataCenterConcern_HEALTH    -0.270 -0.631 -0.506 
DataCenterConcern_LAND       0.844  0.146 -0.147 
DataCenterConcern_POLLUTION -0.110 -0.207  0.826 
DataCenterConcern_UTIL      -0.445  0.717 -0.182 
AIhelpHurt_ARTS                                  
AIhelpHurt_CLIMATE                               
AIhelpHurt_ECON                                  
AIhelpHurt_US                      -0.119        
AIhelpHurt_YOU                                   

               Comp.1 Comp.2 Comp.3 Comp.4 Comp.5 Comp.6 Comp.7 Comp.8 Comp.9
SS loadings       1.0    1.0    1.0    1.0    1.0    1.0    1.0    1.0    1.0
Proportion Var    0.1    0.1    0.1    0.1    0.1    0.1    0.1    0.1    0.1
Cumulative Var    0.1    0.2    0.3    0.4    0.5    0.6    0.7    0.8    0.9
               Comp.10
SS loadings        1.0
Proportion Var     0.1
Cumulative Var     1.0
show code
biplot(AI_DC_concernsPCA, col=c('white','red'))

show code
plot(AI_DC_concernsPCA, type='l')