library(glue)
ptaxsim_db_conn <- DBI::dbConnect(RSQLite::SQLite(), "./ptaxsim.db/ptaxsim-2021.0.4.db")
# has EAV values, extensions by agency_num
agency_dt <- DBI::dbGetQuery(
ptaxsim_db_conn,
"SELECT *
FROM agency
WHERE year = 2021
"
)
# grabs all unique muni names & numbs
# don't forget Cicero
muni_agency_names <- DBI::dbGetQuery(
ptaxsim_db_conn,
"SELECT DISTINCT agency_num, agency_name, minor_type
FROM agency_info
WHERE minor_type = 'MUNI'
OR agency_num = '020060000'
"
)
# list of all taxcodes in municipalities.
# This does NOT include unincorporated tax codes!!
doltchi_tax_codes <- DBI::dbGetQuery(
ptaxsim_db_conn,
glue_sql("
SELECT*
FROM tax_code
WHERE (agency_num = '030210000' OR agency_num = '030310000')
AND year = 2021
",
.con = ptaxsim_db_conn
)
) %>% mutate(tax_code = as.character(tax_code_num))
taxbills_current <- read_csv("./Output/1_Get_All_Pins-CookPinTaxbills_2021_Actual.csv")
# 22,453,875 tax bills in 2021 in municipalities (incorporated areas).
# 22,972,902 tax bills in all of Cook County in 2021 (incorporated and unincorporated)
# DOES INCLUDE unincorporated tax bills based on how we pulled the data in Step 1.
# 1,825,816 billed properties with 14-digit PINs for incorporated areras
# 1,864,594 billed properties in Cook county (incorporated and unincorporated)
#
pin14_bills_current <- taxbills_current %>%
group_by(tax_code, class, pin) %>%
mutate(total_bill = final_tax_to_dist + final_tax_to_tif) %>% # from each taxing agency
summarize(total_billed = sum(total_bill, na.rm = TRUE), # total on someone's property tax bill
av = first(av),
eav = first(eav),
pin_count_in_parcel = n(),
final_tax_to_dist = sum(final_tax_to_dist, na.rm = TRUE),
final_tax_to_tif = sum(final_tax_to_tif, na.rm = TRUE),
tax_amt_exe = sum(tax_amt_exe, na.rm = TRUE), # revenue lost due to exemptions
tax_amt_pre_exe = sum(tax_amt_pre_exe, na.rm = TRUE), # total rev before all exemptions
tax_amt_post_exe = sum(tax_amt_post_exe, na.rm = TRUE), # total rev after all exemptions
rpm_tif_to_cps = sum(rpm_tif_to_cps, na.rm = TRUE), # not used
rpm_tif_to_rpm = sum(rpm_tif_to_rpm, na.rm=TRUE), # not used
rpm_tif_to_dist = sum(rpm_tif_to_dist, na.rm=TRUE), # not used
tif_share = mean(tif_share, na.rm=TRUE), # not used
) %>%
mutate(propclass_1dig = str_sub(class, 1, 1))
head(pin14_bills_current)
DoltonChicago <- pin14_bills_current %>%
filter(tax_code %in% doltchi_tax_codes$tax_code_num) %>%
filter(class != "0")
DoltonChicago <- DoltonChicago %>%
mutate(tax_code = as.character(tax_code))%>%
left_join(doltchi_tax_codes) %>%
group_by(agency_num, class) %>% arrange(av)
write_csv(DoltonChicago, "./Output/Cholton_taxbills.csv")
nicknames <- readxl::read_excel("./Necessary_Files/muni_shortnames.xlsx")
class_dict <- read_csv("./Necessary_Files/class_dict.csv")
taxcode_taxrates <- read_csv("./Output/2_taxcode_taxrates.csv")
DoltonChicago <- read_csv("./Output/Cholton_taxbills.csv") %>%
arrange(av) %>%
left_join(taxcode_taxrates) %>%
mutate(propclass_1dig = str_sub(class, 1, 1))
Max composite tax rate in a tax code in Chicago is 9.1% and minimum composite tax rate is 6.7%. Chicago has 665 tax codes.
Max composite tax rate in a tax code in Dolton is 27.9% and minimum composite tax rate is 22.9%. Dolton has 13 tax codes.
# DoltonChicago %>%
# group_by(agency_num, tax_code) %>%
# summarize(max_comprate = max(tax_rate_current),
# min_comprate = min(tax_rate_current)) %>% arrange(-max_comprate)
DoltonChicago %>% group_by(agency_num) %>%
summarize(max_comprate = max(tax_rate_current, na.rm=TRUE),
mean_comprate = mean(tax_rate_current, na.rm=TRUE),
min_comprate = min(tax_rate_current, na.rm=TRUE)) %>% arrange(-mean_comprate)
## # A tibble: 2 × 4
## agency_num max_comprate mean_comprate min_comprate
## <chr> <dbl> <dbl> <dbl>
## 1 030310000 0.279 0.252 0.229
## 2 030210000 0.0908 0.0671 0.0670
DoltonChicago %>% filter(agency_num == "030310000") %>%
group_by(agency_num, class) %>%
summarize(max_comprate = max(tax_rate_current, na.rm=TRUE),
mean_comprate = mean(tax_rate_current, na.rm=TRUE),
min_comprate = min(tax_rate_current, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav),
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe)) %>%
arrange(-pin_count) %>% head() %>% kbl()
| agency_num | class | max_comprate | mean_comprate | min_comprate | pin_count | av | eav | tax_amt_post_exe | tax_amt_exe | tax_amt_pre_exe |
|---|---|---|---|---|---|---|---|---|---|---|
| 030310000 | 203 | 0.27915 | 0.2517154 | 0.22937 | 3609 | 8462.172 | 25409.362 | 3971.0875 | 2351.644 | 6322.732 |
| 030310000 | 234 | 0.27915 | 0.2437240 | 0.22937 | 2374 | 11825.945 | 35509.757 | 5704.2086 | 2924.786 | 8628.995 |
| 030310000 | 202 | 0.27915 | 0.2637175 | 0.22937 | 990 | 4833.689 | 14514.148 | 2225.9500 | 1615.417 | 3839.347 |
| 030310000 | 211 | 0.27915 | 0.2555963 | 0.22937 | 286 | 14033.490 | 42138.364 | 9064.7549 | 1370.885 | 10435.640 |
| 030310000 | 100 | 0.27915 | 0.2578337 | 0.22937 | 221 | 6529.937 | 19607.348 | 5015.0933 | 0.000 | 5015.093 |
| 030310000 | 299 | 0.27915 | 0.2618058 | 0.22937 | 221 | 2607.186 | 7828.552 | 665.1598 | 1384.339 | 2049.500 |
DoltonChicago %>% filter(agency_num == "030210000") %>%
group_by(agency_num, class) %>%
summarize(max_comprate = max(tax_rate_current, na.rm=TRUE),
mean_comprate = mean(tax_rate_current, na.rm=TRUE),
min_comprate = min(tax_rate_current, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav),
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe)) %>%
arrange(-pin_count) %>% head() %>% kbl()
| agency_num | class | max_comprate | mean_comprate | min_comprate | pin_count | av | eav | tax_amt_post_exe | tax_amt_exe | tax_amt_pre_exe |
|---|---|---|---|---|---|---|---|---|---|---|
| 030210000 | 299 | 0.08435 | 0.0671080 | 0.06697 | 286419 | 25845.293 | 77605.65 | 4879.667 | 333.8783 | 5213.531 |
| 030210000 | 203 | 0.08244 | 0.0670568 | 0.06697 | 134808 | 21963.844 | 65950.83 | 3504.307 | 917.8658 | 4422.150 |
| 030210000 | 211 | 0.09078 | 0.0670501 | 0.06697 | 120872 | 36681.360 | 110143.14 | 6528.777 | 858.2396 | 7387.016 |
| 030210000 | 202 | 0.08244 | 0.0670643 | 0.06697 | 55917 | 16138.675 | 48459.62 | 2488.226 | 761.6435 | 3249.829 |
| 030210000 | 205 | 0.09078 | 0.0670673 | 0.06697 | 36918 | 30049.316 | 90229.10 | 5194.381 | 856.2097 | 6050.591 |
| 030210000 | 100 | 0.09078 | 0.0671145 | 0.06697 | 32109 | 6197.712 | 18609.82 | 1254.988 | 0.0000 | 1254.988 |
DoltonChicago %>%
filter(class == "203") %>%
arrange(av)%>%
group_by(agency_num, class) %>%
summarize(medianbill = median(total_billed),
meanbill = mean(total_billed),
medianAV = median(av),
meanAV = mean(av),
)%>%
# pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values") %>%
kbl(caption= "Chicago and Dolton, Class 203, Measures of the Middle", digits=0, booktabs = T) %>%
kable_styling(full_width = T)
| agency_num | class | medianbill | meanbill | medianAV | meanAV |
|---|---|---|---|---|---|
| 030210000 | 203 | 3151 | 3504 | 20000 | 21964 |
| 030310000 | 203 | 4152 | 3971 | 8874 | 8462 |
DoltonChicago %>%
filter(class == "205") %>%
group_by(agency_num, class) %>%
summarize(medianbill = median(total_billed),
meanbill = mean(total_billed),
medianAV = median(av),
meanAV = mean(av),
)%>%
# pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values") %>%
kbl(caption= "Chicago and Dolton, Class 205, Measures of the Middle", digits=0, booktabs = T) %>%
kable_styling(full_width = T)
| agency_num | class | medianbill | meanbill | medianAV | meanAV |
|---|---|---|---|---|---|
| 030210000 | 205 | 4168 | 5194 | 25000 | 30049 |
| 030310000 | 205 | 3515 | 4006 | 6980 | 7834 |
DoltonChicago %>%
filter(class == "211") %>%
group_by(agency_num, class) %>%
summarize(medianbill = median(total_billed),
meanbill = mean(total_billed),
medianAV = median(av),
meanAV = mean(av),
)%>%
# pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values") %>%
kbl(caption= "Chicago and Dolton, Class 211, Measures of the Middle", digits=0, booktabs = T) %>%
kable_styling(full_width = T)
| agency_num | class | medianbill | meanbill | medianAV | meanAV |
|---|---|---|---|---|---|
| 030210000 | 211 | 4640 | 6529 | 28000 | 36681 |
| 030310000 | 211 | 8878 | 9065 | 15192 | 14033 |
DoltonChicago %>%
filter(class == "234") %>%
group_by(agency_num, class) %>%
summarize(medianbill = median(total_billed),
meanbill = mean(total_billed),
medianAV = median(av),
meanAV = mean(av),
)%>%
# pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values") %>%
kbl(caption= "Chicago and Dolton, Class 234, Measures of the Middle", digits=0, booktabs = T) %>%
kable_styling(full_width = T)
| agency_num | class | medianbill | meanbill | medianAV | meanAV |
|---|---|---|---|---|---|
| 030210000 | 234 | 2420 | 2953 | 15999 | 18781 |
| 030310000 | 234 | 6043 | 5704 | 11990 | 11826 |
Chicago has 655 tax codes in its borders and Dolton has 13 tax codes in its borders.
One story residence, any age, 1,000 to 1,800 sq. ft.
DoltonChicago %>%
filter(agency_num == "030210000" ) %>% #& class == "203" & between(av,9950,10050)) %>%
group_by(tax_code) %>%
summarize(count = n(),
avg_current_comprate = mean(tax_rate_current, na.rm=TRUE)
) %>% arrange(-avg_current_comprate) %>% head()
## # A tibble: 6 × 3
## tax_code count avg_current_comprate
## <dbl> <int> <dbl>
## 1 70039 212 0.0908
## 2 70048 89 0.0844
## 3 72185 214 0.0824
## 4 70071 78 0.0790
## 5 77098 125 0.0782
## 6 72157 35 0.0758
DoltonChicago %>%
filter(agency_num == "030310000") %>% # & class == "203" & between(av, 9950, 10050)) %>%
group_by(tax_code) %>%
summarize(count = n(),
avg_current_comprate = mean(tax_rate_current, na.rm=TRUE)
) %>% arrange(-avg_current_comprate) %>% head()
## # A tibble: 6 × 3
## tax_code count avg_current_comprate
## <dbl> <int> <dbl>
## 1 37035 4038 0.279
## 2 37039 259 0.230
## 3 37034 4486 0.229
## 4 37036 83 NaN
## 5 37037 36 NaN
## 6 37038 5 NaN
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions….
For property class 203 PINs with assessed values between $9,000 and $11,000, the average change in tax bill would be $75 more in Chicago and $205 more in Dolton compared to their current tax bills ($1475 and $4312 respectively).
The “average” property tax payer would think they are saving $624 in Chicago and $2708 in Dolton due to exemptions. This number appears on their taxbill and calculated by the full EAV * current tax rate and does NOT consider the change in tax rate that would occur if levies are held constant and all EAV became taxable.
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & class == "203" & between(av,9000,11000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & class == "203" & between(av, 9000, 11000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Class 203 Comparison, AV ~ $10,000 (9000-11000 range)") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 1475 | bill_current | 4312 |
| bill_hyp | 1550 | bill_hyp | 4517 |
| bill_change | 74 | bill_change | 205 |
| tax_amt_post_exe | 1475 | tax_amt_post_exe | 4312 |
| tax_amt_exe | 624 | tax_amt_exe | 2708 |
| tax_amt_pre_exe | 2099 | tax_amt_pre_exe | 7020 |
| pin_count | 4801 | pin_count | 1466 |
| av | 10424 | av | 9769 |
| eav | 31301 | eav | 29333 |
Changing the range of PINs included in the calculation alters the “Median Property Statistic”
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions….
For property class 203 PINs with assessed values between $8,000 and $12,000, the average change in tax bill would be $98 more in Chicago and $55 more in Dolton compared to their current tax bills ($1513 and $4342 respectively).
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & class == "203" & between(av,8000,12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & class == "203" & between(av, 8000, 12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Major Class 2 Comparison, AV ~ $10,000 (AV range $8000-$12000)") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago Class 203, 8K-12K Property Stats" = 2, "Dolton Class 203, 8L-12K AV Property Stats" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 1513 | bill_current | 4342 |
| bill_hyp | 1611 | bill_hyp | 4396 |
| bill_change | 98 | bill_change | 55 |
| tax_amt_post_exe | 1513 | tax_amt_post_exe | 4342 |
| tax_amt_exe | 676 | tax_amt_exe | 2519 |
| tax_amt_pre_exe | 2190 | tax_amt_pre_exe | 6860 |
| pin_count | 10480 | pin_count | 2541 |
| av | 10871 | av | 9380 |
| eav | 32643 | eav | 28166 |
Average and median tax bills and assessed values are calculated below for ALL property class types within the the broader “Residential” property class type (property classes that have the first digit “2”, or Major Class Type 2)
The median AV is used to select a range of pins (based on their AV) to calculate the average current bill, hypothetical bill, and hypothetical change in tax bill for a “median property”.
This is done because some properties receive multiple exemptions while others receive none. Using the literal median pin can skew the summary statistics of that specific pin receives no exemptions or multiple exemptions. The average for the range of “median PINs” is created to smooth out the variation within the observations.
DoltonChicago %>%
filter(propclass_1dig == "2") %>%
arrange(av) %>%
group_by(agency_num) %>%
summarize(medianbill = median(total_billed),
meanbill = mean(total_billed),
medianAV = median(av),
meanAV = mean(av),
pin_count = n()
)%>%
# pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values") %>%
kbl(caption= "Chicago and Dolton, Major Class 2, Measures of the Middle", digits=0, booktabs = T) %>%
kable_styling(full_width = T)
| agency_num | medianbill | meanbill | medianAV | meanAV | pin_count |
|---|---|---|---|---|---|
| 030210000 | 3619 | 5244 | 21119 | 29123 | 732952 |
| 030310000 | 4304 | 4364 | 9132 | 8929 | 8275 |
#
# DoltonChicago %>%
# filter(propclass_1dig == "3") %>%
# arrange(av) %>%
# group_by(agency_num) %>%
# summarize(medianbill = median(total_billed),
# meanbill = mean(total_billed),
# medianAV = median(av),
# meanAV = mean(av),
# pin_count = n()
# )%>%
# # pivot_longer(medianbill:meanAV, names_to = "Stats", values_to = "Values") %>%
# kbl(caption= "Chicago and Dolton, Major Class 3, Measures of the Middle", digits=0, booktabs = T) %>%
# kable_styling(full_width = T)
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $1570 (an $14 increase from $1556) and Dolton’s would be $4610 (a $30 increase from $4580).
On average, residents would think they “saved” $501 in Chicago and $2588 in Dolton (based on tax_amt_exe which also shows up on their tax bill based on the “naive” pre-tax exemption tax bill amount on the tax bill). The amount saved per person will depend on how many exemptions they qualified for in the first place. This is a rough average for all types of exemptions and includes those that received no exemptions and multiiple exemptions.
Values were calculated by selecting pins with AVs between $9000 and $11,000 and then calculating the average current bill, change in bill, and other statistics seen in the table. Pin count tells you the number of pins that were included in the AV range used for the “median property.”
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & propclass_1dig == "2" & between(av,9000,11000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & propclass_1dig == "2" & between(av, 9000, 11000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Major Class 2 Comparison, AV ~ $10,000 (AV range $9000-$11000)") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 1556 | bill_current | 4580 |
| bill_hyp | 1570 | bill_hyp | 4610 |
| bill_change | 14 | bill_change | 30 |
| tax_amt_post_exe | 1556 | tax_amt_post_exe | 4580 |
| tax_amt_exe | 501 | tax_amt_exe | 2588 |
| tax_amt_pre_exe | 2057 | tax_amt_pre_exe | 7168 |
| pin_count | 34215 | pin_count | 1823 |
| av | 10199 | av | 9869 |
| eav | 30623 | eav | 29635 |
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & propclass_1dig == "2" & between(av,8000,12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & propclass_1dig == "2" & between(av, 8000, 12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Major Class 2 Comparison, AV ~ $10,000 (AV range $8000-$12000)") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 25 |
| bill_current | 1579 | bill_current | 4796 |
| bill_hyp | 1592 | bill_hyp | 4698 |
| bill_change | 13 | bill_change | -99 |
| tax_amt_post_exe | 1579 | tax_amt_post_exe | 4796 |
| tax_amt_exe | 504 | tax_amt_exe | 2539 |
| tax_amt_pre_exe | 2083 | tax_amt_pre_exe | 7335 |
| pin_count | 62480 | pin_count | 3885 |
| av | 10329 | av | 9943 |
| eav | 31015 | eav | 29855 |
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $1592 (an $13 increase from $1579) and Dolton’s would be $4598 (a $99 DECREASE from $4596).
Values were calculated by selecting pins with AVs between $8000 and $12,000 and then calculating the average current bill, change in bill, and other statistics seen in the table. Pin count tells you the number of pins that were included in the AV range used for the “median property.”
Increasing the number of pins included in the measurement of “average bill” and “average bill change” completely changed the results for Dolton. Using the “median” value must be done super carefully.
If we “removed” only homeowners exemptions or only senior exemptions, then the median statistic would be more reliable… potentially.
Two or more story residence, over 62 years, up to 2,200 sq. ft
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & class == "205" & between(av,8000,12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & class == "205" & between(av, 8000, 12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Class 205 Comparison, AV ~ $10,000 (8000 to 12000 AV range)") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 27 |
| bill_current | 1503 | bill_current | 5147 |
| bill_hyp | 1530 | bill_hyp | 4755 |
| bill_change | 27 | bill_change | -392 |
| tax_amt_post_exe | 1503 | tax_amt_post_exe | 5147 |
| tax_amt_exe | 622 | tax_amt_exe | 2353 |
| tax_amt_pre_exe | 2124 | tax_amt_pre_exe | 7500 |
| pin_count | 2832 | pin_count | 55 |
| av | 10544 | av | 9427 |
| eav | 31660 | eav | 28305 |
Two to six residential apartments, any age.
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & class == "211" & between(av,17000,19000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & class == "211" & between(av, 17000, 19000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Class 211 Comparison, AV ~ $18,000") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 3040 | bill_current | 11459 |
| bill_hyp | 2782 | bill_hyp | 8211 |
| bill_change | -258 | bill_change | -3249 |
| tax_amt_post_exe | 3040 | tax_amt_post_exe | 11459 |
| tax_amt_exe | 628 | tax_amt_exe | 1231 |
| tax_amt_pre_exe | 3668 | tax_amt_pre_exe | 12690 |
| pin_count | 6747 | pin_count | 54 |
| av | 18217 | av | 17707 |
| eav | 54701 | eav | 53170 |
Split level residence, with a lower level below grade, all ages, all sizes
Chi3 <- DoltonChicago %>%
filter(agency_num == "030210000" & class == "234" & between(av,12000,13000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
Dol3 <- DoltonChicago %>%
filter(agency_num == "030310000" & class == "234" & between(av, 12450, 12750)) %>%
summarize(
comp_taxrate = mean(tax_code_rate, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe, na.rm=TRUE),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe, na.rm=TRUE),
tax_amt_pre_exe = mean(tax_amt_pre_exe, na.rm=TRUE),
pin_count = n(),
av = mean(av),
eav = mean(eav)) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi3, Dol3)
kbl(both_dt, booktabs = T, digits = 0,
caption = "Property Class 234 Comparison, AV ~ $12,500") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 1763 | bill_current | 5944 |
| bill_hyp | 1824 | bill_hyp | 5861 |
| bill_change | 61 | bill_change | -82 |
| tax_amt_post_exe | 1763 | tax_amt_post_exe | 5944 |
| tax_amt_exe | 779 | tax_amt_exe | 3176 |
| tax_amt_pre_exe | 2542 | tax_amt_pre_exe | 9120 |
| pin_count | 591 | pin_count | 215 |
| av | 12613 | av | 12606 |
| eav | 37872 | eav | 37851 |
## Chicago #
Chi1 <- DoltonChicago %>%
arrange(av)%>%
filter(agency_num == "030210000" & class == "203" & between(av,18000,22000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
hypothetical_taxrate = mean(taxrate_new, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
# kbl(caption= "Chicago, Class 203, Tax Bill ~$3150", digits=0, booktabs = T)
## Dolton ##
Dol1<- DoltonChicago %>%
arrange(av) %>%
filter(agency_num == "030310000" & class == "203" & between(av,8000,12000)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
hypothetical_taxrate = mean(taxrate_new, na.rm=TRUE),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
both_dt <- cbind(Chi1, Dol1)
kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Chicago Median AV vs Dolton Median AV") %>%
kable_styling(full_width = T) %>%
add_header_above(c("Chicago Median AV 203 Property" = 2, "Dolton Median AV 203 Property" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| hypothetical_taxrate | 0 | hypothetical_taxrate | 0 |
| bill_current | 3132 | bill_current | 4342 |
| bill_hyp | 3280 | bill_hyp | 4396 |
| bill_change | 148 | bill_change | 55 |
| tax_amt_post_exe | 3132 | tax_amt_post_exe | 4342 |
| tax_amt_exe | 897 | tax_amt_exe | 2519 |
| tax_amt_pre_exe | 4029 | tax_amt_pre_exe | 6860 |
| pin_count | 28012 | pin_count | 2541 |
| av | 20009 | av | 9380 |
| eav | 60082 | eav | 28166 |
## Chicago #
Chi1 <- DoltonChicago %>%
arrange(av)%>%
filter(agency_num == "030210000" & class == "203" & between(total_billed,3100,3300)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")
# kbl(caption= "Chicago, Class 203, Tax Bill ~$3150", digits=0, booktabs = T)
## Dolton ##
Dol1<- DoltonChicago %>%
arrange(av) %>%
filter(agency_num == "030310000" & class == "203" & between(total_billed,3100,3300)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values") #%>%
# kbl(caption= "Dolton, Class 203, Tax Bill ~ $3150", digits=0, booktabs = T)
# av =
#exempt eav =
both_dt <- cbind(Chi1, Dol1)
kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Tax Bill ~ $3,150 (Chicago's median current bill)") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 25 |
| bill_current | 3181 | bill_current | 3194 |
| bill_hyp | 3268 | bill_hyp | 3408 |
| bill_change | 87 | bill_change | 214 |
| tax_amt_post_exe | 3181 | tax_amt_post_exe | 3194 |
| tax_amt_exe | 822 | tax_amt_exe | 2164 |
| tax_amt_pre_exe | 4003 | tax_amt_pre_exe | 5358 |
| pin_count | 6292 | pin_count | 84 |
| av | 19884 | av | 7156 |
| eav | 59706 | eav | 21487 |
Chi1a <- DoltonChicago %>% filter(agency_num == "030210000" & class == "203" & between(total_billed,4100,4200)) %>%
arrange(av)%>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(comp_taxrate:eav, names_to = "Stats", values_to = "Values")
# kbl(caption= "Chicago, Class 203, Tax Bill ~$3150", digits=0, booktabs = T)
## Chicago ##
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
#DoltonChicago %>% filter(agency_num == "030310000" & class == "203" & between(total_billed,3140,3160))
Dol1a <- DoltonChicago %>% filter(agency_num == "030310000" & class == "203" & between(total_billed,4100,4200)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)) %>%
pivot_longer(comp_taxrate:eav, names_to = "Stats", values_to = "Values") #%>%
# kbl(caption= "Dolton, Class 203, Tax Bill ~ $3150", digits=0, booktabs = T)
# av =
#exempt eav =
both_dt <- cbind(Chi1a, Dol1a)
kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Tax Bill ~ $4150 (Dolton's median current bill)") %>%
kable_styling(full_width = T) %>%
add_header_above(c("Chicago" = 2, "Dolton" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 4158 | bill_current | 4151 |
| bill_hyp | 4193 | bill_hyp | 4202 |
| bill_change | 35 | bill_change | 52 |
| tax_amt_post_exe | 4158 | tax_amt_post_exe | 4151 |
| tax_amt_exe | 901 | tax_amt_exe | 2431 |
| tax_amt_pre_exe | 5059 | tax_amt_pre_exe | 6581 |
| pin_count | 1173 | pin_count | 79 |
| av | 25133 | av | 9068 |
| eav | 75468 | eav | 27228 |
both_dt <- cbind(Chi1, Dol1a)
kbl(both_dt, booktabs = T, digits = 0, caption = "Property Class 203 Comparison, Median Dolton vs Median Chicago") %>%
kable_styling(full_width = T)%>%
add_header_above(c("Chicago Median 203 Property" = 2, "Dolton Median 203 Property" = 2))
| Stats | Values | Stats | Values |
|---|---|---|---|
| comp_taxrate | 7 | comp_taxrate | 24 |
| bill_current | 3181 | bill_current | 4151 |
| bill_hyp | 3268 | bill_hyp | 4202 |
| bill_change | 87 | bill_change | 52 |
| tax_amt_post_exe | 3181 | tax_amt_post_exe | 4151 |
| tax_amt_exe | 822 | tax_amt_exe | 2431 |
| tax_amt_pre_exe | 4003 | tax_amt_pre_exe | 6581 |
| pin_count | 6292 | pin_count | 79 |
| av | 19884 | av | 9068 |
| eav | 59706 | eav | 27228 |
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $3644 (an $87 increase from $3557) and Dolton’s would be $3692 (a $136 increase from $3555).
DoltonChicago %>%
filter(agency_num == "030210000" & class == "203" & between(tax_amt_post_exe, 3500, 3600)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Chicago, Class 203, Current Bill ~ $3,550", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 7 |
| bill_current | 3557 |
| bill_hyp | 3644 |
| bill_change | 87 |
| tax_amt_post_exe | 3557 |
| tax_amt_exe | 846 |
| tax_amt_pre_exe | 4403 |
| pin_count | 3141 |
| av | 21866 |
| eav | 65656 |
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
DoltonChicago %>%
filter(agency_num == "030310000" & class == "203" & between(tax_amt_post_exe,3500,3600)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Dolton, Class 203, Current Bill ~ $3,550", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 24 |
| bill_current | 3555 |
| bill_hyp | 3692 |
| bill_change | 137 |
| tax_amt_post_exe | 3555 |
| tax_amt_exe | 2190 |
| tax_amt_pre_exe | 5745 |
| pin_count | 55 |
| av | 8129 |
| eav | 24408 |
Value was chosen randomly as roughly between the median property AV in Dolton and Chicago.
For post-exemption bills around $3700: Chicago has $26,448 AV and $79,420 in EAV. Chicago’s Composite tax rate for the properties examined is 6.7%. Dolton has an AV of $7,631 and $22,914 in EAV. Dolton’s average composite tax rate for the properties examined was 24.2%.
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $4503 (an $802 increase from $3700) and Dolton’s would be $3479 (a $220 DECREASE from $3700).
## Chicago ##
DoltonChicago %>%
filter(agency_num == "030210000" & class == "203" & between(tax_amt_post_exe, 3695, 3705)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Chicago NOT ENOGUH PINS, Class 203, Current Bill ~$3,700", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 7 |
| bill_current | 3700 |
| bill_hyp | 4503 |
| bill_change | 803 |
| tax_amt_exe | 1626 |
| tax_amt_pre_exe | 5325 |
| pin_count | 47 |
| av | 26449 |
| eav | 79418 |
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
## Dolton ##
DoltonChicago %>%
filter(agency_num == "030310000" & class == "203" & between(tax_amt_post_exe,3695,3705)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_pre_exe = mean(tax_amt_pre_exe), # the naive amount that appears on peoples taxbills
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Dolton NOT ENOUGH PINS, Class 203, Current Bill ~ $3,700" , digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 24 |
| bill_current | 3700 |
| bill_hyp | 3479 |
| bill_change | -221 |
| tax_amt_pre_exe | 5421 |
| pin_count | 4 |
| av | 7631 |
| eav | 22914 |
Expanded taxbill range:
## Chicago ##
DoltonChicago %>%
filter(agency_num == "030210000" & class == "203" & between(tax_amt_post_exe, 3600, 3800)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Chicago, Class 203, Current Bill ~$3,700", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 7 |
| bill_current | 3713 |
| bill_hyp | 3679 |
| bill_change | -34 |
| tax_amt_exe | 719 |
| tax_amt_pre_exe | 4431 |
| pin_count | 5195 |
| av | 22013 |
| eav | 66098 |
# Chicago only has 2 pins that are similar to Dolton's median pin (which had a lot of matches)
## Dolton ##
DoltonChicago %>%
filter(agency_num == "030310000" & class == "203" & between(tax_amt_post_exe,3600,3800)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_pre_exe = mean(tax_amt_pre_exe), # the naive amount that appears on peoples taxbills
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Dolton, Class 203, Current Bill ~ $3,700", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 24 |
| bill_current | 3703 |
| bill_hyp | 3870 |
| bill_change | 167 |
| tax_amt_pre_exe | 5987 |
| pin_count | 124 |
| av | 8462 |
| eav | 25408 |
For pre exemption tax bills around $3700 in Chicago, average AV is $18,378, EAV is $55,184. Average current taxbill is $2901.
Chicago’s Composite tax rate for the properties examined is 6.7%. Dolton’s average composite tax rate for the properties examiend was 24.2%.
For pre exemption tax bills around $3700 in Dolton, average AV is $5,235, EAV is $15,719. Average current taxbill is $3044.
If holding the levy constant and acknowledging the change in tax rates that would occur from having additional taxable EAV within the taxing jurisdictions, Chicago’s hypothetical tax bill would be $2990 (an $89 increase from $2901) and Dolton’s would be $2377 (a $667 DECREASE from $3044).
Uses a tax bill range of 3600 to 3800 to increase “median pins” used for summary stats.
## Chicago ##
DoltonChicago %>%
filter(agency_num == "030210000" & class == "203" & between(tax_amt_pre_exe, 3600, 3800)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_post_exe = mean(tax_amt_post_exe),
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Chicago, Class 203, Naive Pre-Exemp Bill ~ $3,700", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 7 |
| bill_current | 2737 |
| bill_hyp | 2898 |
| bill_change | 161 |
| tax_amt_post_exe | 2737 |
| tax_amt_exe | 895 |
| tax_amt_pre_exe | 3632 |
| pin_count | 6162 |
| av | 18023 |
| eav | 54119 |
## Dolton ##
DoltonChicago %>%
filter(agency_num == "030310000" & class == "203" & between(tax_amt_pre_exe,3600,3800)) %>%
summarize(
comp_taxrate = mean(tax_code_rate),
bill_current = mean(tax_amt_post_exe),
bill_hyp = mean(eav*taxrate_new, na.rm=TRUE),
bill_change = bill_hyp - bill_current,
tax_amt_exe = mean(tax_amt_exe),
tax_amt_pre_exe = mean(tax_amt_pre_exe),
pin_count = n(),
av = mean(av),
eav = mean(eav)
) %>%
pivot_longer(cols = comp_taxrate:eav, names_to = "Stats", values_to = "Values")%>%
kbl(caption= "Dolton, Class 203, Naive Pre-Exemp Bill ~ $3,700", digits=0)
| Stats | Values |
|---|---|
| comp_taxrate | 26 |
| bill_current | 1850 |
| bill_hyp | 2361 |
| bill_change | 512 |
| tax_amt_exe | 1833 |
| tax_amt_pre_exe | 3683 |
| pin_count | 29 |
| av | 4796 |
| eav | 14401 |