From 8114bd15b297e6c397073f5b90ec386ddbffb860 Mon Sep 17 00:00:00 2001 From: Nissim Lebovits <111617674+nlebovits@users.noreply.github.com> Date: Thu, 7 Dec 2023 20:56:26 -0500 Subject: [PATCH] Built site for gh-pages --- .nojekyll | 2 +- assets/permits_animation.gif | Bin 59933 -> 59927 bytes final.html | 2066 ++++++++++++++++++++++------------ index.html | 2066 ++++++++++++++++++++++------------ 4 files changed, 2701 insertions(+), 1433 deletions(-) diff --git a/.nojekyll b/.nojekyll index 8477f44..252e374 100644 --- a/.nojekyll +++ b/.nojekyll @@ -1 +1 @@ -f50c4fc0 \ No newline at end of file +83c1aad0 \ No newline at end of file diff --git a/assets/permits_animation.gif b/assets/permits_animation.gif index 911fe1f4dafbb762e2e3115fdaf31331712bbb7f..0f53bd787c7f7c4db6276175843930f537ba2628 100644 GIT binary patch delta 18921 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 kffxMX314`_A0F|ESN!4`-+0GA9`ci3=@ - + Predicting New Construction in Philadelphia + + + +

3.1.1 Feature Engineering

@@ -8524,22 +9408,23 @@

Show the code
permits_bg_long <- permits_bg %>%
-                    st_drop_geometry() %>%
-                    pivot_longer(
-                      cols = c(starts_with("lag"), dist_to_2022),
-                      names_to = "Variable",
-                      values_to = "Value"
-                    )
-
+                    filter(year != 2023) %>%
+                    st_drop_geometry() %>%
+                    pivot_longer(
+                      cols = c(starts_with("lag"), dist_to_2022),
+                      names_to = "Variable",
+                      values_to = "Value"
+                    )
 
-ggscatter(permits_bg_long, x = "permits_count", y = "Value", facet.by = "Variable",
-   add = "reg.line",
-   add.params = list(color = "blue", fill = "lightgray"),
-   conf.int = TRUE
-   ) + stat_cor(method = "pearson", p.accuracy = 0.001, r.accuracy = 0.01)
+ +ggscatter(permits_bg_long, x = "permits_count", y = "Value", facet.by = "Variable", + add = "reg.line", + add.params = list(color = palette[3], fill = palette[5]), + conf.int = TRUE + ) + stat_cor(method = "pearson", p.accuracy = 0.001, r.accuracy = 0.01)
-

+

@@ -8558,24 +9443,25 @@

Show the code
permits_train <- filter(permits_bg %>% select(-mapname), year < 2022)
 permits_test <- filter(permits_bg %>% select(-mapname), year == 2022)
-
-reg <- lm(permits_count ~ ., data = st_drop_geometry(permits_train))
-
-predictions <- predict(reg, permits_test)
-predictions <- cbind(permits_test, predictions)
-
-predictions <- predictions %>%
-                  mutate(abs_error = abs(permits_count - predictions),
-                         pct_error = abs_error / permits_count)
-
-ggplot(predictions, aes(x = permits_count, y = predictions)) +
-  geom_point() +
-  labs(title = "Predicted vs. Actual Permits",
-       subtitle = "2022") +
-  geom_smooth(method = "lm", se = FALSE)
+permits_validate <- filter(permits_bg %>% select(-mapname), year == 2023) + +reg <- lm(permits_count ~ ., data = st_drop_geometry(permits_train)) + +predictions <- predict(reg, permits_test) +predictions <- cbind(permits_test, predictions) + +predictions <- predictions %>% + mutate(abs_error = abs(permits_count - predictions), + pct_error = abs_error / permits_count) + +ggplot(predictions, aes(x = permits_count, y = predictions)) + + geom_point() + + labs(title = "Predicted vs. Actual Permits", + subtitle = "2022") + + geom_smooth(method = "lm", se = FALSE)
-

+

Show the code @@ -8588,7 +9474,7 @@

tm_layout(frame = FALSE)

-

+

@@ -8616,7 +9502,7 @@

geom_smooth(method = "lm", se = FALSE)
-

+

Show the code @@ -8629,10 +9515,10 @@

tm_layout(frame = FALSE)

-

+

-

We find that our OLS model has an MAE of only MAE: 2.44–not bad for such a simple model! Still, it struggles most in the areas where we most need it to succeed, so we will try to introduce better variables and apply a more complex model to improve our predictions.

+

We find that our OLS model has an MAE of only MAE: 2.25–not bad for such a simple model! Still, it struggles most in the areas where we most need it to succeed, so we will try to introduce better variables and apply a more complex model to improve our predictions.

4.3 Random Forest Regression

@@ -8657,7 +9543,7 @@

geom_smooth(method = "lm", se = FALSE)
-

+

Show the code @@ -8670,7 +9556,7 @@

tm_layout(frame = FALSE)

-

+

@@ -8691,8 +9577,15 @@

geom_vline(aes(xintercept = vline))
-

+

+
+Show the code +
hmm <- permits_bg %>%
+  st_drop_geometry() %>%
+  group_by(year) %>%
+  summarize_all(.funs = list(~sum(is.na(.)))) # Check NA for all columns
+
@@ -8700,28 +9593,30 @@

Show the code -
tm_shape(acs19) +
-        tm_polygons(col = "Percent_Nonwhite", border.alpha = 0, palette = 'viridis', style = "fisher", colorNA = "lightgrey") +
-  tm_shape(broad_and_market) +
-  tm_lines(col = "lightgrey") +
-  tm_layout(frame = FALSE)
+
# tm_shape(acs22) +
+#         tm_polygons(col = "Percent_Nonwhite", border.alpha = 0, palette = mono_5_orange, style = "fisher", colorNA = "lightgrey") +
+#   tm_shape(broad_and_market) +
+#   tm_lines(col = "lightgrey") +
+#   tm_layout(frame = FALSE)
+# 
+# 
+# tm_shape(acs22) +
+#         tm_polygons(col = "Ext_Rent_Burden", border.alpha = 0, palette = mono_5_orange, style = "fisher", colorNA = "lightgrey") +
+#   tm_shape(broad_and_market) +
+#   tm_lines(col = "lightgrey") +
+#   tm_layout(frame = FALSE)
+
+rf_predictions <- rf_predictions %>%
+                      mutate(race_comp = case_when(
+                        percent_nonwhite >= .50 ~ "Majority Non-White",
+                        TRUE ~ "Majority White"
+                      ))
+
+ggplot(rf_predictions, aes(y = abs_error, color = race_comp)) +
+  geom_boxplot(fill = NA)
-

-
-
-Show the code -
rf_predictions <- rf_predictions %>%
-                      mutate(race_comp = case_when(
-                        percent_nonwhite >= .50 ~ "Majority Non-White",
-                        TRUE ~ "Majority White"
-                      ))
-
-ggplot(rf_predictions, aes(y = abs_error, color = race_comp)) +
-  geom_boxplot(fill = NA)
-
-
-

+

How does this generalize across neighborhoods?

@@ -8735,17 +9630,18 @@

Show the code
filtered_zoning <- zoning %>%
-                     filter(str_detect(CODE, "RS") | str_detect(CODE, "I"))
-
+                     filter(str_detect(CODE, "RS") | str_detect(CODE, "I"),
+                            CODE != "I2")
 
-tm_shape(filtered_zoning) +
-        tm_polygons(col = "CODE", border.alpha = 0, colorNA = "lightgrey") +
-  tm_shape(broad_and_market) +
-  tm_lines(col = "lightgrey") +
-  tm_layout(frame = FALSE)
+ +tm_shape(filtered_zoning) + + tm_polygons(col = "CODE", border.alpha = 0, colorNA = "lightgrey") + + tm_shape(broad_and_market) + + tm_lines(col = "lightgrey") + + tm_layout(frame = FALSE)
-

+

We can extract development predictions at the block level to these parcels and then visualize them by highest need.

@@ -8764,7 +9660,7 @@

tm_layout(frame = FALSE)
-

+

@@ -8783,8 +9679,8 @@

-
- +
+

Furthermore, we can identify properties with high potential for assemblage, which suggests the ability to accomodate high-density, multi-unit housing.

@@ -8829,7 +9725,8 @@

CODE) %>% filter(rf_predictions > 10, n_contig > 2) %>% - kablerize(caption = "Poorly-Zoned Properties with High Development Risk") + arrange(desc(rf_predictions)) %>% + kablerize(caption = "Poorly-Zoned Properties with High Development Risk")
@@ -8845,550 +9742,277 @@

- - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - - - - - - - - + + - - - - - - - - + - - + + - - - - - - - - + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - + + - + - - - - + + + + - - + + - + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - - - - + + + + + - - + + - + - - + + - - + + - - - - - - - - - + + - + - - - - - - - - - + + - + - - + + - - + + - - + + - + - - + + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + - + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - + + - + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - - - - + + + + + - - - - - + + + + + - - + + - + - - - - - - - - - - - - - - - - + + - - + + - - + + - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + + + +
27512.16710757538.37310 3604I2
85821.5859761524ICMX
90312.9468361595RSA5
91621.5859781615ICMX
152211.244374255916717 RSA5
163121.58597499334.18023 32736IRMX
164321.5859762756ICMX
167021.585977280310410 ICMX
167121.5859732804IRMX
186534.3893033128IRMX
209912.9468363492RSA5
225111.4208043744IRMX
268512.9468364533RSA5
316810.58817499434.18023 3550610411 RSA5
343921.5859766067ICMX
355412.9468366289RSA5
361621.58597499534.18023 36405RSA5
383612.946837686910412 ICMX
384634.38930528434.18023 36901ICMX
386512.946836694311160 RSA5
415529.6927037646ICMX
417811.21383178431.03953 377043128 IRMX
459312.9468368805RSA5
469723.0356339094RSA5
475216.0827359244IRMX
480010.58817366931.03953 393716901 ICMX
491021.5859739662RSA5
521135.68783396425.55263 3104117646 ICMX
521235.687833104121240725.55263425776 RSA5
521335.6878387521.73580 3104131615 ICMX
534518.21887156321.73580 3107602736 IRMX
550139.00537160221.73580 311150ICMX2804IRMX
550635.68783344821.73580 3111616405 RSA5
561611.24437470021.73580 311449RSA39661RSA5
599611.00043923921.73580 412339I220073ICMX
620611.00043449220.66737 3128089093 RSA5
625811.000431366219.53400 312932ICMX27869IRMX
631216.08273613058ICMX512519.05720310759IRMX
641223.99983398715.37260 3133147704 IRMX
670322.58767778614.19870 313979I317168ICMX
670511.00043313981RSA3
672013.26530789313.97167 31401917408 RSA5
6793.211.00043814223I2
679422.58767600812.64667 31422412931 ICMX
680822.58767644412.64667 314257I213980RSA3
685511.00043658912.64667 31437314372 RSA5
686411.00043659912.64667 3 14401 RSA5
686511.00043314402RSA5
696513.26530669612.30283 31464914648 ICMX
701412.94683814748ICMX
719211.24437315167RSA2
744639.00537315720I2
748711.00043615820RSA5
763713.26530316181RSA5
788539.00537733512.30283 31671916179 RSA5
810515.75340998412.30283 31717021527 ICMX
813213.26530317217ICMX
822015.48503581811.93540 31741012473 RSA5
854313.56143318033RSD3
907513.56143319078RSA3
936211.24437831511.93540 31959318254 RSA3
960721.58597420075ICMX
980212.167101292311.93540 32044426627 RSA5
985413.56143420536RSA2
1037713.26530321529ICMX
1065113.56143417711.82093 322004RSD18265IRMX
1287729.69270514511.82093 425778RSA510795IRMX
1292911.24437425868RSA1454411.5650059243IRMX
1316413.56143326249RSD1605811.56500613057ICMX
1349410.85073303111.14353 3267595506 RSA5
1359911.24437326935RSA3
1381711.24437327284RSA2
1389211.24437459011.14353 327394RSD39370ICMX
1411013.26530215410.89000 427776I2
1415816.066803278713744 IRMX
14719.221.585972828949I2
14719.312.946832828949I2
1472012.94683628950RSA5624810.01617413532ICMX
@@ -9415,9 +10039,19 @@

-
- +
+ +

+

+
+

5.4 2024 Predictions

+

Just for shits and giggles, throw in 2024 predictions. (Can use data from 2023.)

+
+
+Show the code +
# need to create a new dataframe with year = 2024, spatial and temporal lag based on 2023, and most recent ACS data (2022)
+
diff --git a/index.html b/index.html index 352077f..7b719d1 100644 --- a/index.html +++ b/index.html @@ -6,7 +6,7 @@ - + Predicting New Construction in Philadelphia + + + +

3.1.1 Feature Engineering

@@ -8524,22 +9408,23 @@

Show the code
permits_bg_long <- permits_bg %>%
-                    st_drop_geometry() %>%
-                    pivot_longer(
-                      cols = c(starts_with("lag"), dist_to_2022),
-                      names_to = "Variable",
-                      values_to = "Value"
-                    )
-
+                    filter(year != 2023) %>%
+                    st_drop_geometry() %>%
+                    pivot_longer(
+                      cols = c(starts_with("lag"), dist_to_2022),
+                      names_to = "Variable",
+                      values_to = "Value"
+                    )
 
-ggscatter(permits_bg_long, x = "permits_count", y = "Value", facet.by = "Variable",
-   add = "reg.line",
-   add.params = list(color = "blue", fill = "lightgray"),
-   conf.int = TRUE
-   ) + stat_cor(method = "pearson", p.accuracy = 0.001, r.accuracy = 0.01)
+ +ggscatter(permits_bg_long, x = "permits_count", y = "Value", facet.by = "Variable", + add = "reg.line", + add.params = list(color = palette[3], fill = palette[5]), + conf.int = TRUE + ) + stat_cor(method = "pearson", p.accuracy = 0.001, r.accuracy = 0.01)
-

+

@@ -8558,24 +9443,25 @@

Show the code
permits_train <- filter(permits_bg %>% select(-mapname), year < 2022)
 permits_test <- filter(permits_bg %>% select(-mapname), year == 2022)
-
-reg <- lm(permits_count ~ ., data = st_drop_geometry(permits_train))
-
-predictions <- predict(reg, permits_test)
-predictions <- cbind(permits_test, predictions)
-
-predictions <- predictions %>%
-                  mutate(abs_error = abs(permits_count - predictions),
-                         pct_error = abs_error / permits_count)
-
-ggplot(predictions, aes(x = permits_count, y = predictions)) +
-  geom_point() +
-  labs(title = "Predicted vs. Actual Permits",
-       subtitle = "2022") +
-  geom_smooth(method = "lm", se = FALSE)
+permits_validate <- filter(permits_bg %>% select(-mapname), year == 2023) + +reg <- lm(permits_count ~ ., data = st_drop_geometry(permits_train)) + +predictions <- predict(reg, permits_test) +predictions <- cbind(permits_test, predictions) + +predictions <- predictions %>% + mutate(abs_error = abs(permits_count - predictions), + pct_error = abs_error / permits_count) + +ggplot(predictions, aes(x = permits_count, y = predictions)) + + geom_point() + + labs(title = "Predicted vs. Actual Permits", + subtitle = "2022") + + geom_smooth(method = "lm", se = FALSE)
-

+

Show the code @@ -8588,7 +9474,7 @@

tm_layout(frame = FALSE)

-

+

@@ -8616,7 +9502,7 @@

geom_smooth(method = "lm", se = FALSE)
-

+

Show the code @@ -8629,10 +9515,10 @@

tm_layout(frame = FALSE)

-

+

-

We find that our OLS model has an MAE of only MAE: 2.44–not bad for such a simple model! Still, it struggles most in the areas where we most need it to succeed, so we will try to introduce better variables and apply a more complex model to improve our predictions.

+

We find that our OLS model has an MAE of only MAE: 2.25–not bad for such a simple model! Still, it struggles most in the areas where we most need it to succeed, so we will try to introduce better variables and apply a more complex model to improve our predictions.

4.3 Random Forest Regression

@@ -8657,7 +9543,7 @@

geom_smooth(method = "lm", se = FALSE)
-

+

Show the code @@ -8670,7 +9556,7 @@

tm_layout(frame = FALSE)

-

+

@@ -8691,8 +9577,15 @@

geom_vline(aes(xintercept = vline))
-

+

+
+Show the code +
hmm <- permits_bg %>%
+  st_drop_geometry() %>%
+  group_by(year) %>%
+  summarize_all(.funs = list(~sum(is.na(.)))) # Check NA for all columns
+
@@ -8700,28 +9593,30 @@

Show the code -
tm_shape(acs19) +
-        tm_polygons(col = "Percent_Nonwhite", border.alpha = 0, palette = 'viridis', style = "fisher", colorNA = "lightgrey") +
-  tm_shape(broad_and_market) +
-  tm_lines(col = "lightgrey") +
-  tm_layout(frame = FALSE)
+
# tm_shape(acs22) +
+#         tm_polygons(col = "Percent_Nonwhite", border.alpha = 0, palette = mono_5_orange, style = "fisher", colorNA = "lightgrey") +
+#   tm_shape(broad_and_market) +
+#   tm_lines(col = "lightgrey") +
+#   tm_layout(frame = FALSE)
+# 
+# 
+# tm_shape(acs22) +
+#         tm_polygons(col = "Ext_Rent_Burden", border.alpha = 0, palette = mono_5_orange, style = "fisher", colorNA = "lightgrey") +
+#   tm_shape(broad_and_market) +
+#   tm_lines(col = "lightgrey") +
+#   tm_layout(frame = FALSE)
+
+rf_predictions <- rf_predictions %>%
+                      mutate(race_comp = case_when(
+                        percent_nonwhite >= .50 ~ "Majority Non-White",
+                        TRUE ~ "Majority White"
+                      ))
+
+ggplot(rf_predictions, aes(y = abs_error, color = race_comp)) +
+  geom_boxplot(fill = NA)
-

-
-
-Show the code -
rf_predictions <- rf_predictions %>%
-                      mutate(race_comp = case_when(
-                        percent_nonwhite >= .50 ~ "Majority Non-White",
-                        TRUE ~ "Majority White"
-                      ))
-
-ggplot(rf_predictions, aes(y = abs_error, color = race_comp)) +
-  geom_boxplot(fill = NA)
-
-
-

+

How does this generalize across neighborhoods?

@@ -8735,17 +9630,18 @@

Show the code
filtered_zoning <- zoning %>%
-                     filter(str_detect(CODE, "RS") | str_detect(CODE, "I"))
-
+                     filter(str_detect(CODE, "RS") | str_detect(CODE, "I"),
+                            CODE != "I2")
 
-tm_shape(filtered_zoning) +
-        tm_polygons(col = "CODE", border.alpha = 0, colorNA = "lightgrey") +
-  tm_shape(broad_and_market) +
-  tm_lines(col = "lightgrey") +
-  tm_layout(frame = FALSE)
+ +tm_shape(filtered_zoning) + + tm_polygons(col = "CODE", border.alpha = 0, colorNA = "lightgrey") + + tm_shape(broad_and_market) + + tm_lines(col = "lightgrey") + + tm_layout(frame = FALSE)
-

+

We can extract development predictions at the block level to these parcels and then visualize them by highest need.

@@ -8764,7 +9660,7 @@

tm_layout(frame = FALSE)
-

+

@@ -8783,8 +9679,8 @@

-
- +
+

Furthermore, we can identify properties with high potential for assemblage, which suggests the ability to accomodate high-density, multi-unit housing.

@@ -8829,7 +9725,8 @@

CODE) %>% filter(rf_predictions > 10, n_contig > 2) %>% - kablerize(caption = "Poorly-Zoned Properties with High Development Risk") + arrange(desc(rf_predictions)) %>% + kablerize(caption = "Poorly-Zoned Properties with High Development Risk")
@@ -8845,550 +9742,277 @@

- - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - + + - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - - - - - - - - + + - - - - - - - - + - - + + - - - - - - - - + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - + + - + - - - - - - - - - + + - + - - - - + + + + - - + + - + - - + + - + - - + + - - + + - - + + - + - - + + - - + + - - + + - - + + - - + + - + - - + + - - + + - - - - - + + + + + - - + + - + - - + + - - + + - - - - - - - - - + + - + - - - - - - - - - + + - + - - + + - - + + - - + + - + - - + + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - + - - + + - + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - + + - + - - - - - - - - - + + - + - - - - - - - - - - - - - - - - + + - - + + - - + + - - + + - - - - - + + + + + - - - - - + + + + + - - + + - + - - - - - - - - - - - - - - - - + + - - + + - - + + - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + + + +
27512.16710757538.37310 3604I2
85821.5859761524ICMX
90312.9468361595RSA5
91621.5859781615ICMX
152211.244374255916717 RSA5
163121.58597499334.18023 32736IRMX
164321.5859762756ICMX
167021.585977280310410 ICMX
167121.5859732804IRMX
186534.3893033128IRMX
209912.9468363492RSA5
225111.4208043744IRMX
268512.9468364533RSA5
316810.58817499434.18023 3550610411 RSA5
343921.5859766067ICMX
355412.9468366289RSA5
361621.58597499534.18023 36405RSA5
383612.946837686910412 ICMX
384634.38930528434.18023 36901ICMX
386512.946836694311160 RSA5
415529.6927037646ICMX
417811.21383178431.03953 377043128 IRMX
459312.9468368805RSA5
469723.0356339094RSA5
475216.0827359244IRMX
480010.58817366931.03953 393716901 ICMX
491021.5859739662RSA5
521135.68783396425.55263 3104117646 ICMX
521235.687833104121240725.55263425776 RSA5
521335.6878387521.73580 3104131615 ICMX
534518.21887156321.73580 3107602736 IRMX
550139.00537160221.73580 311150ICMX2804IRMX
550635.68783344821.73580 3111616405 RSA5
561611.24437470021.73580 311449RSA39661RSA5
599611.00043923921.73580 412339I220073ICMX
620611.00043449220.66737 3128089093 RSA5
625811.000431366219.53400 312932ICMX27869IRMX
631216.08273613058ICMX512519.05720310759IRMX
641223.99983398715.37260 3133147704 IRMX
670322.58767778614.19870 313979I317168ICMX
670511.00043313981RSA3
672013.26530789313.97167 31401917408 RSA5
6793.211.00043814223I2
679422.58767600812.64667 31422412931 ICMX
680822.58767644412.64667 314257I213980RSA3
685511.00043658912.64667 31437314372 RSA5
686411.00043659912.64667 3 14401 RSA5
686511.00043314402RSA5
696513.26530669612.30283 31464914648 ICMX
701412.94683814748ICMX
719211.24437315167RSA2
744639.00537315720I2
748711.00043615820RSA5
763713.26530316181RSA5
788539.00537733512.30283 31671916179 RSA5
810515.75340998412.30283 31717021527 ICMX
813213.26530317217ICMX
822015.48503581811.93540 31741012473 RSA5
854313.56143318033RSD3
907513.56143319078RSA3
936211.24437831511.93540 31959318254 RSA3
960721.58597420075ICMX
980212.167101292311.93540 32044426627 RSA5
985413.56143420536RSA2
1037713.26530321529ICMX
1065113.56143417711.82093 322004RSD18265IRMX
1287729.69270514511.82093 425778RSA510795IRMX
1292911.24437425868RSA1454411.5650059243IRMX
1316413.56143326249RSD1605811.56500613057ICMX
1349410.85073303111.14353 3267595506 RSA5
1359911.24437326935RSA3
1381711.24437327284RSA2
1389211.24437459011.14353 327394RSD39370ICMX
1411013.26530215410.89000 427776I2
1415816.066803278713744 IRMX
14719.221.585972828949I2
14719.312.946832828949I2
1472012.94683628950RSA5624810.01617413532ICMX
@@ -9415,9 +10039,19 @@

-
- +
+ +

+

+
+

5.4 2024 Predictions

+

Just for shits and giggles, throw in 2024 predictions. (Can use data from 2023.)

+
+
+Show the code +
# need to create a new dataframe with year = 2024, spatial and temporal lag based on 2023, and most recent ACS data (2022)
+