library(tidyverse)
potholes <- read_csv("Street_Pothole_Work_Orders_-_Closed_(Dataset)_20260918.csv")
NOAA_precip_data <- read_csv("NOAA_precip_data.csv") %>%
mutate(month = ym(DATE)) %>%
select(month,snow = SNOW)
p <- potholes %>%
transmute(closed = floor_date(ymd_hms(RptClosed), unit = "months"),
reported = floor_date(ymd_hms(RptDate), unit = "months"),
delay = difftime(ymd_hms(RptClosed),ymd_hms(RptDate),units = "days")) %>%
pivot_longer(-delay,
names_to = "type",
values_to = "month") %>%
group_by(type,month) %>%
summarise(n = n(),
avg_delay = mean(delay)) %>%
left_join(NOAA_precip_data, by = "month") %>%
ungroup() %>%
mutate(mamdani = year(month) == 2026,
month_fct = month(month,label = T),
# Set January 2026 as reference for intercept estimate
month_n = interval(ymd("20260101"), month) %/% months(1)) %>%
group_by(type) %>%
mutate(,
snow_lag1 = lag(snow, 1),
snow_lag2 = lag(snow, 2),
snow_lag3 = lag(snow, 3),
snow_lag4 = lag(snow, 4),
snow_lag5 = lag(snow, 5),
snow_lag6 = lag(snow, 6)) %>%
filter(month >= ymd("20160101"))
ggplot(p,
aes(x=month,y=n,color=type)) +
#facet_wrap(~Boro,ncol = 1) +
geom_line(linewidth = 1) +
labs(x="Month",y="Number of potholes reported/fixed")

ggplot(filter(p,type=="reported"),
aes(x=month,y=avg_delay)) +
#facet_wrap(~Boro,ncol = 1) +
geom_line(linewidth = 1) +
labs(x="Month",y="Average days to fix")

Snowfall
ggplot(filter(p,type=="reported"),
aes(x=month,y=snow)) +
#facet_wrap(~Boro,ncol = 1) +
geom_line(linewidth = 1) +
labs(x="Month",y="Total snowfall during month")

#Get effect size at average month
contrasts(p$month_fct) <- contr.sum(nlevels(p$month_fct))
pothole_mod <- lm(n ~ mamdani + month_n + month_fct,
data = p[p$type == "closed",])
summary(pothole_mod)
##
## Call:
## lm(formula = n ~ mamdani + month_n + month_fct, data = p[p$type ==
## "closed", ])
##
## Residuals:
## Min 1Q Median 3Q Max
## -1369.87 -218.85 37.88 216.19 1649.95
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1140.30 86.37 13.202 < 2e-16 ***
## mamdaniTRUE 956.95 192.00 4.984 2.24e-06 ***
## month_n -11.95 1.24 -9.634 < 2e-16 ***
## month_fct1 162.94 135.68 1.201 0.232269
## month_fct2 335.89 135.62 2.477 0.014731 *
## month_fct3 1384.39 135.58 10.211 < 2e-16 ***
## month_fct4 492.98 135.55 3.637 0.000416 ***
## month_fct5 119.02 135.52 0.878 0.381671
## month_fct6 452.88 135.51 3.342 0.001125 **
## month_fct7 -380.90 135.51 -2.811 0.005818 **
## month_fct8 -572.58 135.52 -4.225 4.83e-05 ***
## month_fct9 -652.53 141.84 -4.601 1.10e-05 ***
## month_fct10 -674.68 141.87 -4.756 5.83e-06 ***
## month_fct11 -718.73 141.91 -5.065 1.59e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 468.4 on 114 degrees of freedom
## Multiple R-squared: 0.7438, Adjusted R-squared: 0.7146
## F-statistic: 25.46 on 13 and 114 DF, p-value: < 2.2e-16
pothole_mod_glm <- glm(n ~ mamdani + month_n + month_fct,
family = "poisson",
data = p[p$type == "closed",])
summary(pothole_mod_glm)
##
## Call:
## glm(formula = n ~ mamdani + month_n + month_fct, family = "poisson",
## data = p[p$type == "closed", ])
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 7.057e+00 4.795e-03 1471.62 <2e-16 ***
## mamdaniTRUE 5.282e-01 9.006e-03 58.65 <2e-16 ***
## month_n -6.479e-03 6.229e-05 -104.00 <2e-16 ***
## month_fct1 1.371e-01 6.393e-03 21.44 <2e-16 ***
## month_fct2 2.172e-01 6.187e-03 35.10 <2e-16 ***
## month_fct3 6.000e-01 5.270e-03 113.86 <2e-16 ***
## month_fct4 2.872e-01 6.031e-03 47.62 <2e-16 ***
## month_fct5 1.185e-01 6.511e-03 18.20 <2e-16 ***
## month_fct6 2.731e-01 6.100e-03 44.78 <2e-16 ***
## month_fct7 -1.695e-01 7.455e-03 -22.74 <2e-16 ***
## month_fct8 -3.098e-01 7.976e-03 -38.84 <2e-16 ***
## month_fct9 -3.831e-01 8.694e-03 -44.06 <2e-16 ***
## month_fct10 -4.059e-01 8.815e-03 -46.05 <2e-16 ***
## month_fct11 -4.495e-01 9.026e-03 -49.80 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 47664 on 127 degrees of freedom
## Residual deviance: 9612 on 114 degrees of freedom
## AIC: 10828
##
## Number of Fisher Scoring iterations: 4
(exp(coef(pothole_mod_glm)["mamdaniTRUE"]) - 1) * 100
## mamdaniTRUE
## 69.58471
pothole_mod_glm_snow <- glm(n ~ mamdani + month_n + month_fct + snow + snow_lag1 + snow_lag2 + snow_lag3 + snow_lag4 + snow_lag5 + snow_lag6,
family = "poisson",
data = p[p$type == "closed",])
summary(pothole_mod_glm_snow)
##
## Call:
## glm(formula = n ~ mamdani + month_n + month_fct + snow + snow_lag1 +
## snow_lag2 + snow_lag3 + snow_lag4 + snow_lag5 + snow_lag6,
## family = "poisson", data = p[p$type == "closed", ])
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 7.041e+00 4.857e-03 1449.549 < 2e-16 ***
## mamdaniTRUE 2.714e-01 1.174e-02 23.120 < 2e-16 ***
## month_n -5.186e-03 7.462e-05 -69.500 < 2e-16 ***
## month_fct1 3.320e-01 7.537e-03 44.041 < 2e-16 ***
## month_fct2 3.411e-01 7.794e-03 43.772 < 2e-16 ***
## month_fct3 5.477e-01 7.208e-03 75.979 < 2e-16 ***
## month_fct4 9.803e-02 7.978e-03 12.287 < 2e-16 ***
## month_fct5 -1.149e-01 8.571e-03 -13.401 < 2e-16 ***
## month_fct6 8.387e-02 8.331e-03 10.067 < 2e-16 ***
## month_fct7 -2.531e-01 9.455e-03 -26.770 < 2e-16 ***
## month_fct8 -2.838e-01 9.050e-03 -31.358 < 2e-16 ***
## month_fct9 -3.102e-01 9.132e-03 -33.969 < 2e-16 ***
## month_fct10 -3.108e-01 9.314e-03 -33.373 < 2e-16 ***
## month_fct11 -3.448e-01 9.514e-03 -36.244 < 2e-16 ***
## snow -1.088e-02 5.124e-04 -21.233 < 2e-16 ***
## snow_lag1 3.019e-03 4.595e-04 6.571 5.00e-11 ***
## snow_lag2 1.453e-02 4.433e-04 32.772 < 2e-16 ***
## snow_lag3 1.384e-02 4.893e-04 28.278 < 2e-16 ***
## snow_lag4 1.575e-02 5.067e-04 31.080 < 2e-16 ***
## snow_lag5 1.145e-02 5.449e-04 21.021 < 2e-16 ***
## snow_lag6 4.886e-03 6.177e-04 7.910 2.57e-15 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 47664.5 on 127 degrees of freedom
## Residual deviance: 6486.6 on 107 degrees of freedom
## AIC: 7717
##
## Number of Fisher Scoring iterations: 4
(exp(coef(pothole_mod_glm_snow)["mamdaniTRUE"]) - 1) * 100
## mamdaniTRUE
## 31.18487