Data Center Public Sentiment

show code
demogs = readRDS('verasightDemogs.rds')

sentiment_study1 = merge(read.csv('dataCenterSentiment_01.csv'), readRDS('verasightDemogs.rds'), by='vsid') %>% 
  filter(dataCenterSentiment != "") %>% 
  mutate(dataCenterSentiment = factor(dataCenterSentiment, labels=c('Strongly oppose', 'Somewhat oppose', 'Have no opinion', 'Somewhat favor', 'Strongly favor')),
         dataCenterDensity = factor(dataCenterDensity, labels=c('None','1-2','More than 2', "I'm not sure"))) %>% 
  mutate(dataCenterDensity_collapsed = factor(ifelse(dataCenterDensity == "I'm not sure", 1, dataCenterDensity), labels=c('None','1-2', 'More than 2')),
         priceForSupport_withoutStrongOpposerZeroes = ifelse(dataCenterSentiment == "Strongly oppose" & priceForSupport <1, NA, priceForSupport)) %>% 
  mutate(priceForSupport_withSupporters = ifelse(dataCenterSentiment == "Somewhat favor" | dataCenterSentiment =="Strongly favor", 0, priceForSupport),
         priceForSupport_withSupporters = ifelse(dataCenterSentiment == "Strongly oppose" & priceForSupport <1, NA, priceForSupport_withSupporters),
         priceForSupport_binned = factor(ifelse(priceForSupport_withoutStrongOpposerZeroes <1, "$0", 
                                         ifelse(priceForSupport_withoutStrongOpposerZeroes > 0 & priceForSupport_withoutStrongOpposerZeroes < 1001, "$1K or less",
                                                ifelse(priceForSupport_withoutStrongOpposerZeroes >1000 & priceForSupport_withoutStrongOpposerZeroes <10001, "More than $1K",
                                                       ifelse(priceForSupport_withoutStrongOpposerZeroes >10000 & priceForSupport_withoutStrongOpposerZeroes <50001, "More than $10K",
                                                              ifelse(priceForSupport_withoutStrongOpposerZeroes >50000 & priceForSupport_withoutStrongOpposerZeroes <100001, "More than $50K", 
                                                              ifelse(priceForSupport_withoutStrongOpposerZeroes >100000 & priceForSupport_withoutStrongOpposerZeroes <1000001, 'More than $100K',
                                                                     ifelse(priceForSupport_withoutStrongOpposerZeroes >1000000 & priceForSupport_withoutStrongOpposerZeroes <1000000001, 'More than $1M', "More than $1B"))))))), levels=c(NA, '$0','$1K or less','More than $1K', 'More than $10K','More than $50K','More than $100K','More than $1M','More than $1B')),
         reasonsTally = rowSums(pick("support_qualityOfLife", "support_localEconomy", "support_AIdev", "support_environment", "support_naturalResources") > 1, na.rm = TRUE)) %>% 
         mutate(reasonsTally_fct = factor(ifelse(reasonsTally <2, "1 or less", reasonsTally)))

We collected a total of 3234 responses. Note that responding to the “price for support” option was encouraged but not required, so some were left NA.

Overall sentiment to a local data center build

show code
nice_table(sentiment_study1 %>% group_by(dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100))

dataCenterSentiment

n

percent

Strongly oppose

1,448

44.77

Somewhat oppose

681

21.06

Have no opinion

513

15.86

Somewhat favor

463

14.32

Strongly favor

129

3.99

show code
overallSentiment_plot = sentiment_study1 %>% group_by(dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% mutate(dataCenterSentiment = fct_rev(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()

overallSentiment_plot

show code
ggsave(overallSentiment_plot, filename='overallSentiment_plot.png', dpi = 300)
Saving 7 x 5 in image

Price for support

Participants who did not support a local data center build were asked to register their required price to gain their support. In the following analyses, participants who supported a local data center build are logged as “$0” for this variable.

In addition, there were a decent amount of participants who reported strong opposition to a local data center build, but registered “$0” as the price for their support. I interpreted these to mean “there is no amount of money that would buy my support.” Accordingly, I set those data points to NA

Raw results

Raw results can’t be plotted bc the distribution is too big:

  • mean = 3.4662045^{304}
  • min = 0
  • max = 10^{308}
  • median = 5000

Somebody registered “$-1” and they strongly opposed a local data center build. Probably should be interpreted as “nothing will buy my support”? Set to NA

Cutoff: billion

174 participants registered price tags higher than $1 billion. Excluding them yields 2711 data points.

show code
nice_table(sentiment_study1 %>% filter(priceForSupport_withSupporters<1000000001) %>% summarise(mean = mean(priceForSupport_withSupporters/1000), sd = sd(priceForSupport_withSupporters)/1000, median=median(priceForSupport_withSupporters)/1000, min = min(priceForSupport_withSupporters), max = max(priceForSupport_withSupporters)/1000), title = "Payment required for support, in thousands. (minimum reported in raw)")
ggplot(subset(sentiment_study1,priceForSupport_withSupporters<1000000001 &!is.na(priceForSupport_withSupporters)), aes(x=priceForSupport_withSupporters/1000))+
  geom_density(fill="#00bfc4", alpha=0.4)+
  geom_vline(aes(xintercept=mean(priceForSupport_withSupporters)/1000),color="#00bfc4", linetype="dashed", linewidth=0.5)+
  labs(x="Payment required for support, in thousands.", title="Cutoff: $1 billion")+
  theme_classic()

Payment required for support, in thousands. (minimum reported in raw)

mean

sd

median

min

max

23,966.79

144,119.32

5.00

0.00

1,000,000.00

Cutoff: million

401 participants registered price tags higher than $1 million. Excluding them yields 2484 data points.

show code
nice_table(sentiment_study1 %>% filter(priceForSupport_withSupporters<1000001) %>% summarise(mean = mean(priceForSupport_withSupporters/1000), sd = sd(priceForSupport_withSupporters)/1000, median=median(priceForSupport_withSupporters)/1000, min = min(priceForSupport_withSupporters), max = max(priceForSupport_withSupporters)/1000), title = "Payment required for support, in thousands. (minimum reported in raw)")
ggplot(subset(sentiment_study1,priceForSupport_withSupporters<1000001 &!is.na(priceForSupport_withSupporters)), aes(x=priceForSupport_withSupporters/1000))+
  geom_density(fill="#00bfc4", alpha=0.4)+
  geom_vline(aes(xintercept=mean(priceForSupport_withSupporters)/1000),color="#00bfc4", linetype="dashed", linewidth=0.5)+
  labs(x="Payment required for support, in thousands.", title="Cutoff: $1 million")+
  theme_classic()

Payment required for support, in thousands. (minimum reported in raw)

mean

sd

median

min

max

109.96

281.67

3.00

0.00

1,000.00

further visualizations

Among non-supporters (opposers and no opinions):

show code
nice_table(sentiment_study1 %>% filter(dataCenterSentiment != "Somewhat favor" & dataCenterSentiment != "Strongly favor" &!is.na(priceForSupport_binned)) %>% group_by(priceForSupport_binned) %>% tally() %>% mutate(percent = n/sum(n)*100))
horizontalDotPlot = ggplot(sentiment_study1, aes(x = 1, y=priceForSupport_withoutStrongOpposerZeroes))+
  geom_count(position=position_jitter(), alpha=0.65, color='#E57200')+
  scale_y_continuous(breaks = c(10000, 50000, 100000, 250000, 500000, 1000000), limits=c(0,1000001))+
  coord_flip()+
  theme_classic(base_size=13)+
  theme(axis.title.y=element_blank(),
        axis.text.y=element_blank(),
        axis.ticks.y=element_blank(),
        axis.line.y = element_blank())

ggsave(horizontalDotPlot, filename='horizontalDotPlot.png', dpi = 300, width=8, height=2)

horizontalDotPlot
percentBinsTable = data.frame("price" = c('$1K or less', '$10K or less', '$50K or less', '$100K or less', '$1M or less'),
                                "percentage" = c(22.72, 50.63, 62.14, 69.28, 82.41)) %>% 
  mutate(price = factor(price, levels=c('$1M or less','$100K or less', '$50K or less', '$10K or less', '$1K or less')))

percentBins_plot =ggplot(percentBinsTable, aes(x = price, y=percentage, fill = price))+
  geom_bar(stat = "identity", position=position_dodge(), color='white') +
  scale_y_continuous(breaks=c(0,50,100), limits=c(0,100))+
  theme_classic(base_size=15)+
  labs(fill="", x='') +
  theme(legend.position='none')+
  scale_fill_manual(values=c('#E57200','#ec9049','#f1ac79','#f7c7a7','#F9DCBF'))+
  coord_flip()

ggsave(percentBins_plot, filename='percentBinsPlot.png', dpi = 300, width = 8, height = 6)

percentBins_plot

priceForSupport_binned

n

percent

$0

161

7.02

$1K or less

360

15.70

More than $1K

640

27.91

More than $10K

264

11.51

More than $50K

166

7.24

More than $100K

301

13.13

More than $1M

227

9.90

More than $1B

174

7.59

Sentiment by demographics

current local data center density

show code
nice_table(sentiment_study1 %>% group_by(dataCenterDensity_collapsed, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100))

dataCenterDensity_collapsed

dataCenterSentiment

n

percent

None

Strongly oppose

1,311

45.44

None

Somewhat oppose

599

20.76

None

Have no opinion

472

16.36

None

Somewhat favor

399

13.83

None

Strongly favor

104

3.60

1-2

Strongly oppose

93

37.50

1-2

Somewhat oppose

61

24.60

1-2

Have no opinion

29

11.69

1-2

Somewhat favor

47

18.95

1-2

Strongly favor

18

7.26

More than 2

Strongly oppose

43

43.88

More than 2

Somewhat oppose

21

21.43

More than 2

Have no opinion

11

11.22

More than 2

Somewhat favor

16

16.33

More than 2

Strongly favor

7

7.14

Strongly oppose

1

33.33

Have no opinion

1

33.33

Somewhat favor

1

33.33

show code
sentiment_study1 %>% group_by(dataCenterDensity_collapsed, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% filter(!is.na(dataCenterDensity_collapsed)) %>% mutate(dataCenterSentiment = fct_rev(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(~dataCenterDensity_collapsed, ncol = 1)

political orientation

show code
nice_table(sentiment_study1 %>% group_by(pid_base, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100))

pid_base

dataCenterSentiment

n

percent

Democrat

Strongly oppose

675

52.61

Democrat

Somewhat oppose

261

20.34

Democrat

Have no opinion

170

13.25

Democrat

Somewhat favor

143

11.15

Democrat

Strongly favor

34

2.65

Republican

Strongly oppose

299

34.25

Republican

Somewhat oppose

197

22.57

Republican

Have no opinion

145

16.61

Republican

Somewhat favor

179

20.50

Republican

Strongly favor

53

6.07

Independent

Strongly oppose

371

44.01

Independent

Somewhat oppose

188

22.30

Independent

Have no opinion

142

16.84

Independent

Somewhat favor

113

13.40

Independent

Strongly favor

29

3.44

Other or none

Strongly oppose

99

45.00

Other or none

Somewhat oppose

34

15.45

Other or none

Have no opinion

52

23.64

Other or none

Somewhat favor

23

10.45

Other or none

Strongly favor

12

5.45

Strongly oppose

4

26.67

Somewhat oppose

1

6.67

Have no opinion

4

26.67

Somewhat favor

5

33.33

Strongly favor

1

6.67

show code
sentimentByPoliticalID_plot = sentiment_study1 %>% group_by(pid_base, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% filter(pid_base %in% c('Democrat', 'Republican','Independent')) %>% mutate(dataCenterSentiment = fct_rev(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(~pid_base, ncol = 1)

ggsave(sentimentByPoliticalID_plot, filename='sentimentByPoliticalID_plot.png', dpi = 300, width=12, height = 12)
  
sentimentByPoliticalID_plot

income

show code
nice_table(sentiment_study1 %>% group_by(income, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100))

income

dataCenterSentiment

n

percent

Less than $15,000

Strongly oppose

138

43.40

Less than $15,000

Somewhat oppose

60

18.87

Less than $15,000

Have no opinion

76

23.90

Less than $15,000

Somewhat favor

29

9.12

Less than $15,000

Strongly favor

15

4.72

$15,000 to under $50,000

Strongly oppose

401

44.07

$15,000 to under $50,000

Somewhat oppose

183

20.11

$15,000 to under $50,000

Have no opinion

164

18.02

$15,000 to under $50,000

Somewhat favor

130

14.29

$15,000 to under $50,000

Strongly favor

32

3.52

$50,000 to under $75,000

Strongly oppose

271

44.57

$50,000 to under $75,000

Somewhat oppose

124

20.39

$50,000 to under $75,000

Have no opinion

91

14.97

$50,000 to under $75,000

Somewhat favor

99

16.28

$50,000 to under $75,000

Strongly favor

23

3.78

$75,000 to under $100,000

Strongly oppose

241

48.20

$75,000 to under $100,000

Somewhat oppose

106

21.20

$75,000 to under $100,000

Have no opinion

61

12.20

$75,000 to under $100,000

Somewhat favor

74

14.80

$75,000 to under $100,000

Strongly favor

18

3.60

$100,000 to under $150,000

Strongly oppose

213

46.20

$100,000 to under $150,000

Somewhat oppose

113

24.51

$100,000 to under $150,000

Have no opinion

54

11.71

$100,000 to under $150,000

Somewhat favor

65

14.10

$100,000 to under $150,000

Strongly favor

16

3.47

$150,000 to under $200,000

Strongly oppose

107

46.72

$150,000 to under $200,000

Somewhat oppose

49

21.40

$150,000 to under $200,000

Have no opinion

34

14.85

$150,000 to under $200,000

Somewhat favor

31

13.54

$150,000 to under $200,000

Strongly favor

8

3.49

More than $200,000

Strongly oppose

75

39.06

More than $200,000

Somewhat oppose

44

22.92

More than $200,000

Have no opinion

27

14.06

More than $200,000

Somewhat favor

30

15.62

More than $200,000

Strongly favor

16

8.33

Strongly oppose

2

12.50

Somewhat oppose

2

12.50

Have no opinion

6

37.50

Somewhat favor

5

31.25

Strongly favor

1

6.25

show code
sentiment_study1 %>% filter(!is.na(income)) %>%  group_by(income, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% mutate(dataCenterSentiment = fct_rev(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(~income)

region

show code
sentiment_study1 %>% filter(!is.na(region)) %>%  group_by(region, dataCenterSentiment) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% mutate(dataCenterSentiment = fct_rev(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(~region)

Reasons for support/opposition

show code
nice_table(sentiment_study1 %>% filter(dataCenterSentiment=='Strongly oppose' | dataCenterSentiment=='Somewhat oppose') %>% 
             group_by(reasonsTally_fct) %>% tally() %>% mutate(percent = n/sum(n)*100), title='opposers')

opposers

reasonsTally_fct

n

percent

1 or less

50

2.35

2

14

0.66

3

83

3.90

4

352

16.53

5

1,630

76.56

show code
opposers_reasons_plot = sentiment_study1 %>% filter(dataCenterSentiment=='Strongly oppose' | dataCenterSentiment=='Somewhat oppose') %>% 
  group_by(reasonsTally_fct) %>% 
  tally() %>% mutate(percent = n/sum(n)*100) %>% 
  ggplot(aes(x = .5, y=percent, fill = reasonsTally_fct))+
  geom_bar(stat = "identity", color='white') +
  theme_void(base_size=15)+
  labs(fill="", x='') +
  theme(legend.position='top')+
  scale_fill_manual(values=c('#009fdf','#33b2e5','#66c5ec','#99d9f2','#ccecf9'))+
  coord_flip()

opposers_reasons_plot

show code
ggsave(opposers_reasons_plot, filename='opposers_reasons_plot.png', dpi = 300, width=12, height = 6)

nice_table(sentiment_study1 %>% filter(dataCenterSentiment=='Strongly favor' | dataCenterSentiment=='Somewhat favor') %>% 
             group_by(reasonsTally_fct) %>% tally() %>% mutate(percent = n/sum(n)*100), title='supporters')

supporters

reasonsTally_fct

n

percent

1 or less

9

1.52

2

23

3.89

3

41

6.93

4

72

12.16

5

447

75.51

show code
supporters_reasons_plot = sentiment_study1 %>% filter(dataCenterSentiment=='Strongly favor' | dataCenterSentiment=='Somewhat favor') %>% 
  group_by(reasonsTally_fct) %>% 
  tally() %>% mutate(percent = n/sum(n)*100) %>% 
  ggplot(aes(x = .5, y=percent, fill = reasonsTally_fct))+
  geom_bar(stat = "identity", color='white') +
  theme_void(base_size=15)+
  labs(fill="", x='') +
  theme(legend.position='top')+
  scale_fill_manual(values=c('#62bb46','#81c96b','#a1d690','#c0e4b5','#e0f1da'))+
  coord_flip()

supporters_reasons_plot

show code
ggsave(supporters_reasons_plot, filename='supporters_reasons_plot.png', dpi = 300, width=12, height = 6)

supporters_reasonsLollipop = sentiment_study1 %>% filter(dataCenterSentiment=='Strongly favor' | dataCenterSentiment=='Somewhat favor') %>% 
  group_by(reasonsTally_fct) %>% 
  tally() %>% mutate(percent = n/sum(n)*100) %>% 
  ggplot(aes(x=reasonsTally_fct, y=percent)) +
  geom_segment(
    aes(x=reasonsTally_fct, xend=reasonsTally_fct, y=0, yend=percent), linewidth=0.75) +
  geom_point(
    color="#009fdf", size= 4)+
  theme_classic() +
  coord_flip() +
  ylim(c(0,80))

supporters_reasonsLollipop

show code
ggsave(supporters_reasonsLollipop, filename='supporters_reasonsLollipop.png', dpi = 500, width=4, height = 3)

opposer_reasonsLollipop = sentiment_study1 %>% filter(dataCenterSentiment=='Strongly oppose' | dataCenterSentiment=='Somewhat oppose') %>% 
  group_by(reasonsTally_fct) %>% 
  tally() %>% mutate(percent = n/sum(n)*100) %>% 
  ggplot(aes(x=reasonsTally_fct, y=percent)) +
  geom_segment(
    aes(x=reasonsTally_fct, xend=reasonsTally_fct, y=0, yend=percent), linewidth=0.75) +
  geom_point(
    color="#62bb46", size= 4)+
  theme_classic() +
  coord_flip() +
  ylim(c(0,80))

opposer_reasonsLollipop

show code
ggsave(opposer_reasonsLollipop, filename='opposer_reasonsLollipop.png', dpi = 500, width=4, height = 3)

free responses

show code
library('ggwordcloud'); library('stringr'); library('tidytext')

freeResponse_wordCounts_supporters = sentiment_study1 %>%
  filter(dataCenterSentiment == 'Strongly favor' | dataCenterSentiment =='Somewhat favor') %>% 
  select(support_freeResponse) %>% 
  unnest_tokens(word, support_freeResponse) %>%
  anti_join(stop_words) %>%
  count(word, sort = TRUE)
Joining with `by = join_by(word)`
show code
head(freeResponse_wordCounts_supporters)
       word   n
1      data 199
2      jobs 162
3        ai 131
4   centers 109
5    center  83
6 community  71
show code
# data, jobs, ai, centers, center, community, local, future, bring, people, water

freeResponse_wordCounts_opposers = sentiment_study1 %>%
  filter(dataCenterSentiment == 'Strongly oppose' | dataCenterSentiment =='Somewhat oppose') %>% 
  select(support_freeResponse) %>% 
  unnest_tokens(word, support_freeResponse) %>%
  anti_join(stop_words) %>%
  count(word, sort = TRUE)
Joining with `by = join_by(word)`
show code
head(freeResponse_wordCounts_opposers)
         word   n
1        data 783
2       water 767
3     centers 633
4          ai 376
5   resources 275
6 environment 260
show code
# data water centers ai resources environment energy electricity center people power community jobs

heatmap of the US

show code
library('sf')
Linking to GEOS 3.13.0, GDAL 3.8.5, PROJ 9.5.1; sf_use_s2() is TRUE
show code
library('tigris')
To enable caching of data, set `options(tigris_use_cache = TRUE)`
in your R script or .Rprofile.
show code
library('leaflet')

options(tigris_use_cache = TRUE)

# --- 1. Load county shapefile
counties_sf <- counties(cb = TRUE, resolution = "20m", year = 2020) %>%
  st_transform(4326)

# --- 2. Convert your respondents to sf object
respondents_sf <- sentiment_study1 %>%
  st_as_sf(coords = c("longitude", "latitude"), crs = 4326)

# --- 3. Spatial join: assign each respondent to a county
joined <- st_join(respondents_sf, counties_sf, join = st_within)

# --- 4. Aggregate sentiment to county mean (with n for transparency)
county_sentiment <- joined %>%
  st_drop_geometry() %>%
  group_by(GEOID) %>%
  summarise(
    mean_sentiment = mean(as.numeric(dataCenterSentiment), na.rm = TRUE),
    n = n()
  ) %>%
  filter(n >= 5)  # drop counties with too few respondents

# --- 5. Join back to shapefile
counties_mapped <- counties_sf %>%
  left_join(county_sentiment, by = "GEOID")

# --- 6. Color palette
pal <- colorNumeric(
  palette = c("#e74c3c", "#f5f5f5", "#2ecc71"),
  domain = counties_mapped$mean_sentiment,
  na.color = "#d0d0d0"
)

# --- 7. Interactive map
leaflet(counties_mapped) %>%
  addProviderTiles(providers$CartoDB.Positron) %>%
  addPolygons(
    fillColor = ~pal(mean_sentiment),
    fillOpacity = 0.75,
    color = "white",
    weight = 0.5,
    label = ~paste0(NAME, ": ", round(mean_sentiment, 2), " (n=", n, ")"),
    highlightOptions = highlightOptions(
      weight = 2,
      color = "#333",
      fillOpacity = 0.9,
      bringToFront = TRUE
    )
  ) %>%
  addLegend(
    pal = pal,
    values = ~mean_sentiment,
    title = "Mean sentiment",
    position = "bottomright"
  )

Claude simulated 300 responses to the following question:

And included demographic information for respondents.

show code
simulatedData = read.csv('datacenter_rebate_simulation.csv')

nice_table(simulatedData %>% group_by(ethnicity) %>% count())
nice_table(simulatedData %>% group_by(age_bracket) %>% count())
nice_table(simulatedData %>% group_by(gender) %>% count())
nice_table(simulatedData %>% group_by(income_bracket) %>% count())

ethnicity

n

Asian or Asian American

21

Black or African American

43

Hispanic or Latino

50

Other/Multiracial

17

White (non-Hispanic)

169

age_bracket

n

18-29

57

30-44

71

45-59

66

60-74

72

75+

34

gender

n

Man

155

Non-binary/other

3

Woman

142

income_bracket

n

$100k–$150k

43

$30k–$60k

67

$60k–$100k

96

Over $150k

54

Under $30k

40

Claude simulated prior approval/opposition to a data center being built in the local area.

show code
simulatedData %>% group_by(prior_attitude_numeric) %>% tally() %>% mutate(percent = n/sum(n)*100) %>% 
  ggplot(aes(x = prior_attitude_numeric, y=percent, fill = as.factor(prior_attitude_numeric)))+
  geom_bar(stat = "identity", position = "dodge") +
  theme_minimal()+
  labs(fill="")

The simulated data very much missed the mark here, likely because public sentiment about data centers is so quickly changing.

And finally, the simulated requested tax rebate amounts:

show code
gghistogram(subset(simulatedData, rebate_condition== 'one-time'), x = 'wta_amount')+labs(title='One Time Payment')
gghistogram(subset(simulatedData, rebate_condition== 'yearly'), x = 'wta_amount')+labs(title='Yearly Payments')

Note that Claude implemented a randomly assigned condition to either report a yearly or a one-time payment requirement.

Claude noted that the following likely issues:

  • Respondents will report $0 or refuse to answer if there is no amount of money that is sufficient

  • Respondents will anchor to the $1200 stimulus payment checks