Population_Study/Scripts/1H_Data_center_Migration_Rates.r
2025-12-11 17:31:11 -07:00

87 lines
5.6 KiB
R

library(tidyverse)
#setwd("../")
PERM <- read_csv("./Data/Raw_Data/TerraPower_Report_Data/Monthly_In_Migration_Operations_Workforce.csv")
NUM_YEARS <- ceiling(nrow(PERM)/12)
DATES <- as.Date(paste0(2025,"-",8:12,"-",18))
for(YEAR in 2026:(2026+NUM_YEARS)){
DATES <- c(DATES,as.Date(paste0(YEAR,"-",1:12,"-",18)))
}
PERM$Date <- DATES[1:nrow(PERM)]
PERM$Year <- year(PERM$Date)
PERM$Add_Emp <- c(0,diff(PERM$In_Migration))
PERM$Perm_Migration_Including_Families <- PERM[,"In_Migration"]*0.8*3.05 #TerraPower assumes 80% have families and the average family is 3.2 people, but in wyoming the average is stated as 3.05
OPERATOR <- PERM %>% group_by(Year) %>% summarize(Operator_Emp_Average =mean(In_Migration),Operator_Emp_Migrated=sum(Add_Emp),Total_Op_and_Fam_Migration=max(Perm_Migration_Including_Families))
OPERATOR[,"Total_Op_and_Fam_Migration"] <- c(0,diff(round(pull(OPERATOR,"Total_Op_and_Fam_Migration"))))
TEMP <- read_csv("./Data/Raw_Data/TerraPower_Report_Data/Monthly_In_Migration_Construction_Workforce.csv")
TEMP$Date <- DATES[1:nrow(TEMP)]
TEMP$Year <- year(TEMP$Date)
TEMP[,1] <- 0.41*TEMP[,1] #TerraPower assumes 41% migrate into Lincoln
TEMP$Add_Emp <- c(0,diff(TEMP$In_Migration))
TEMP <- TEMP %>% group_by(Year) %>% summarize(Temp_Emp_Migration=round(sum(Add_Emp)),Average_Temp_Workers=round(mean(In_Migration) ))
TEMP[,"Total_Migration"] <- round(TEMP[,2]+TEMP[,2]*0.37*3.05) #TerraPower assumes 37% will bring families and the average family is 3.2 people, but states Wyoming averages 3.05 family save
CONSTRUCTION <-TEMP %>% select(Year,Construction_Emp_Average=Average_Temp_Workers,Construction_Emp_Migrated=Temp_Emp_Migration,Total_Con_and_Fam_Migration=Total_Migration)
TEMP$End_Year_Temp_Workers <- c(cumsum(TEMP$Temp_Emp_Migration))
#Set the total to zero
#Employment
CONSTRUCTION[4:7,3] <- CONSTRUCTION[4:7,3] -1
CONSTRUCTION[6:7,3] <- CONSTRUCTION[6:7,3] -1
#Family Migration
CONSTRUCTION[4:7,4] <- CONSTRUCTION[4:7,4] -3
#colSums(CONSTRUCTION[,3:4])
#colSums(OPERATOR[,3:4])
if(!exists("SAVE_LOC")){SAVE_LOC <-"./Data/Cleaned_Data/TerraPower_Impact/"}
dir.create(SAVE_LOC, recursive = TRUE, showWarnings = FALSE)
saveRDS(CONSTRUCTION,paste0(SAVE_LOC,"Construction_Related_Migration.Rds"))
saveRDS(OPERATOR,paste0(SAVE_LOC,"Operating_Worker_Related_Migration.Rds"))
#####Double check that Kemmere can house all people
#1,451 tota units required acording to TerraPower
REQUIRED_IN_LIN <- 1451*0.41
TOTAL_IN_KEM <- 333 #According to ACS data
EXPECTED_NEW_IN_KEM <- 750 #According to TerraPower Kemmerer is agressively zoning and will conservativley add 750 houses available to the project
(0.75*TOTAL_IN_KEM+750)/REQUIRED_IN_LIN #Shows a surplus of houses in Kemmerer
############################################################TerraPower IMPLAN estimates
CLEAN_IMPLAN <- function(DF){
DF <- DF[,-1]
COLNAMES <- c("Industry","Direct","Indirect","Induced","Total")
colnames(DF) <- COLNAMES
DF<- DF %>% filter(!is.na(Industry))
DF[,1] <- trimws(str_replace_all(str_replace_all(t(DF[,1]), "[:digit:]|-| |A |B ", "")," ",""))
return(DF)
}
KEM_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Kemmerer_40_Data_Center_Operators.csv"))
LIN_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Lincoln_40_Data_Center_Operators.csv"))
DIFF <- LIN_IMPLAN %>% mutate(LIN_TOTAL=Total-Direct) %>% select(Industry,LIN_TOTAL) %>% full_join(KEM_IMPLAN %>% mutate(KEM_TOTAL=Total-Direct) %>% select(Industry,KEM_TOTAL))
LIN_IMPLAN %>% full_join(KEM_IMPLAN)
DIFF[,"Gap"] <- DIFF[,2]-DIFF[,3]
DIFF$Adjustable_Industry <- DIFF$Industry %in% c('Accommodation and Food Services','Retail Trade','Health Care and Social Assistance','Real Estate and Rental and Leasing','Arts, Entertainment, and Recreation','Manufacturing','Other Services (except Public Administration)')
DIFF[which(DIFF$Adjustable_Industry),]
ADDED_JOBS <- DIFF %>% mutate(KEM_POSSIBLE_INDUCED=Gap*Adjustable_Industry) %>% select(KEM_INDUCED= KEM_TOTAL,KEM_POSSIBLE_INDUCED)
ADDED_JOBS <- colSums(ADDED_JOBS)
POP_WORK_RATIO <-3716/1920.54 #Total population of Kemmerer in 2024 divided total employment both are found in IMPLAN region details for zip code 83101
ADDED_PEOPLE <- POP_WORK_RATIO*ADDED_JOBS
ADDED_PEOPLE[2]-ADDED_PEOPLE[1]
KEM_OP_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Kemmerer_100_Nuclear_Operators.csv"))
LIN_OP_IMPLAN <- CLEAN_IMPLAN(read_csv("Data/Raw_Data/IMPLAN_Employment_Outputs_2_Difit_NAICS/Lincoln_100_Nuclear_Operators.csv"))
OP_DIFF <- LIN_OP_IMPLAN %>% mutate(LIN_OP_TOTAL=Total-Direct) %>% select(Industry,LIN_OP_TOTAL) %>% full_join(KEM_OP_IMPLAN %>% mutate(KEM_OP_TOTAL=Total-Direct) %>% select(Industry,KEM_OP_TOTAL))
OP_DIFF
OP_DIFF[,"Gap"] <- OP_DIFF[,2]-OP_DIFF[,3]
OP_DIFF$Adjustable_Industry <- OP_DIFF$Industry %in% c('Accommodation and Food Services','Retail Trade','Health Care and Social Assistance','Real Estate and Rental and Leasing','Arts, Entertainment, and Recreation','Manufacturing','Other Services (except Public Administration)')
OP_DIFF
OPERATION_ADDED_JOBS <- OP_DIFF %>% mutate(KEM_POSSIBLE_INDUCED=Gap*Adjustable_Industry) %>% select(KEM_INDUCED= KEM_OP_TOTAL,KEM_POSSIBLE_INDUCED)
OPERATION_ADDED_JOBS <- colSums(OPERATION_ADDED_JOBS )
OPERATION_ADDED_PEOPLE <- OPERATION_ADDED_JOBS*POP_WORK_RATIO
OPERATION_ADDED_PEOPLE[2]-OPERATION_ADDED_PEOPLE[1]
RES <- rbind(CONSTRUCTION_ADDED_JOBS,OPERATION_ADDED_JOBS) %>% as_tibble
RES*POP_WORK_RATIO #Total family included migration, converted per person (rather than per 100 jobs)
RES$Job_Type <- c("Construction","Operator")
RES <- RES[,c(3,1:2)]
saveRDS(RES,paste0(SAVE_LOC,"Induced_Jobs.Rds"))