knitr::opts_chunk$set(warning =FALSE, message =FALSE)options(scipen =999)library(tidyverse)library(glue)library(sf)library(DT)library(flextable)nicknames <- readxl::read_excel("../Necessary_Files/muni_shortnames.xlsx")cook_sums <-read_csv("../Output/ptaxsim_cook_level_2006to2023_new.csv") muni_sums <-read_csv("../Output/ptaxsim_muni_level_2006to2023_new.csv")muni_mc_sums <-read_csv("../Output/ptaxsim_muni_MC_2006to2023_new.csv") |>rename_all(~str_replace(., "muni_mc_", ""))muni_cl_sums <-read_csv("../Output/ptaxsim_muni_class_summaries_2006to2023.csv") |>left_join(nicknames)muni_shp <-read_sf("../Necessary_Files/muni_shp.gpkg")knitr::opts_chunk$set(warning =FALSE, message =FALSE)set_flextable_defaults(theme_fun = theme_vanilla, padding =2,line_spacing =1,big.mark =",", )options(DT.options =list())FitFlextableToPage <-function(ft, pgwidth =6){ ft_out <- ft |>autofit() ft_out <-width(ft_out, width =dim(ft_out)$widths*pgwidth /(flextable_dim(ft_out)$widths))return(ft_out)}pin_data <-read_csv(paste0("../Output/Dont_Upload/0_joined_PIN_data_", params$year, "_test.csv"))eq_factor <-read_csv("../Necessary_Files/eq_factor.csv") |>filter(year == params$year) |>select(eq_factor = eq_factor_final) |>as.numeric()incentive_majorclasses <-c("6", "7A", "7B", "8A", "8B")commercial_classes <-c(401:435, 490, 491, 492, 496:499,500:535,590, 591, 592, 597:599, 700:799,800:835, 891, 892, 897, 899) industrial_classes <-c(480:489,493, 550:589, 593,600:699,850:890, 893 )cmap_colors =c("#1e478e", "#6dae4f", "#d3b42b", "#008fd5", "#ca3428", "#ade0ee", "#3e6730", "#d0e4a4")# All have less than 50 percent of their taxed EAV within Cook Countycross_county_lines <-c(# very small amounts in Cook County, like less than 15%:# Deer Park, "Frankfort", "Homer Glen", "Oak Brook", "East Dundee", "University Park", "030270000", "030440000", "030585000", "030890000", "030320000", "031280000",# # "Bensenville", "Hinsdale", "Roselle", "Deerfield", Elgin, "030080000", "030560000", "031120000", "030280000", "030340000", "030270000",# Closer to ~50% in Cook County# Buffalo Grove, Bartlett, Burr Ridge, Hanover Park, Steger "030150000","030050000", "030180000","030500000", "031210000" )cross_county_line <-c("Deer Park", "Frankfort", "Homer Glen", "Oak Brook", "East Dundee", "University Park", "Bensenville", "Hinsdale", "Roselle", "Deerfield", "Elgin","Buffalo Grove", "Bartlett", "Burr Ridge", "Hanover Park", "Steger" )
Municipalities that are dropped due to having EAV outside of Cook County: Frankfort, Homer Glen, Oak Brook, East Dundee, University Park, Bensenville, Hinsdale, Roselle, Deer Park, Deerfield.
Code
# Workaround for identifying more project IDs. # Used Appeal ID to create unique identifier to group PINs.bor <-read_csv("../Output/borappeals.csv") |>mutate(project_appellant =paste(project_id, sep ="-", appellant))# modelsummary::datasummary_skim(bor)# Cleaned PIN-Project list after cleaning the commercial valuation dataset found online. # Another temporary work-around until we (maybe) have full keypin list:proj_xwalk <-read_csv("../Output/all_keypins.csv") # all commercial valuation properties but made with not-quite-clean data from commercial valuation dataset on Cook County Data Portal (which was made from combining the Methodology worksheets) # Values are also only the FIRST PASS assessments and do not include appeals or changes in values# Join project IDs to PINs:pin_data <- pin_data |>left_join(proj_xwalk)
Code
# original class_dict variables already in 0_joined data# but I do want the new-ish variables (comparable properties, and land use type) I created in the file to be brought in:class_dict <-read_csv("../Necessary_Files/class_dict_expanded.csv") |>select(class_code, comparable_props, land_use=Alea_cat)pin_data <- pin_data |>left_join(class_dict, by =c("class"="class_code")) |>mutate(clean_name =ifelse(is.na(clean_name), "Unincorporated", clean_name))
Code
# BOR data source shortfall: We only have the data if they appeal!# sales databor_pins <- bor |>group_by(pin) |>arrange(desc(tax_year)) |>summarize(pin =first(pin), # grabs first occurrence of unique PINclass_bor =list(unique(class)),appellant =first(appellant),project_id =first(project_id), timesappealed =n() ) |>mutate(proj_appellant =paste(project_id, "-", appellant))pin_data <- pin_data |>left_join(bor_pins, by ="pin")# now do it the other way and comparepin_data <- pin_data |>mutate( both_ids = project_id,both_ids =ifelse(is.na(both_ids), keypin, both_ids),both_ids =ifelse(is.na(both_ids) &between(class, 300, 899), pin, both_ids))
Total Value should equal Current Taxable Value + non-Taxable Value where non-Taxable Value = Value in TIF Increment + Reduced Value from Policy Choices where Reduced Value = Tax Exempt Value from Homeowners exemptions or abatements + Reduced Taxable Value from lower levels of assessments due to incentive classifications:
where
where
Cook County Total Value
Taxed Value refers to what taxing agencies did tax to pay for their levies. We use the portion of the tax bill that does NOT go to TIFs to calculate the portion of the composite levy paid by each PIN and then sum up from there.
Table 10.1: FMV of PINs in Cook County Taxed FMV represents the property value that was actually taxed by local taxing jurisdictions(equal to the amount levied) but converted to FMV. We use the the portion of an individuals tax bill that does NOT go to a TIF to calculate the composite levy for taxing jursidictions. This means that the “levy” actually represents the amount collected by the taxing agencies, not the amount that was levied. Therefore the composite levy does not include unpaid taxbills.
Code
tbl <- cook_sums |>filter(year ==params$year) |>mutate(cty_pct_fmv_both_incent = cty_fmv_incentive / cty_fmv_comandind ,cty_pct_PC_both_incent = cty_PC_withincents / cty_PC_comandind ) |>select(cty_fmv_comandind, #cty_fmv, cty_pct_fmv_both_incent, cty_pct_fmv_incentinTIF, cty_pct_PC_both_incent, cty_PC_comandind, cty_PC_incents_inTIFs, #cty_pct_PC_both_incent_inTIF, cty_pct_fmv_incents_tif_increment) |>mutate(across(contains("pct_"), scales::percent, accuracy = .01))tbl |>flextable() |>align(align ="right") |>set_header_labels(cty_fmv_comandind ='Com. & Ind. FMV',# cty_fmv = 'Total FMV in Cook',cty_pct_fmv_both_incent ='% of Com. & Ind. FMV w/ Incent.',cty_pct_fmv_incentinTIF ='% of Com. & Ind. FMV w/ Incent. in TIF',cty_pct_fmv_incents_tif_increment ='% of Com. & Ind. FMV in TIF Increment',cty_PC_comandind ='PIN Count',cty_PC_incents_inTIFs ="Incent. PINs in TIF",cty_pct_PC_both_incent ='% of Com. & Ind. PINs w/ Incent.',cty_pct_PC_both_incent_inTIF ='% of Incent. PINs in TIF' ) |>FitFlextableToPage()
Table 10.2: Commercial and Industrial PINs in Cook County
11.25% of industrial and commercial PINs (aka "revenue producing PINs") FMV has an incentive classification (4.55% when using PIN counts). Of the PINs that have incentive classification, 41.52% of the FMV is located within a TIF (4.55% when using PIN counts).
4.15% of commercial PIN FMV has an incentive classification (1.25% when using PIN counts). Of the PINs that have incentive classification, 55.89% of the FMV is located within a TIF (40.54% when using PIN counts).
36.74% of industrial FMV has an incentive classification (13.71% when using PIN counts). Of the PINs that have incentive classification, 35.70% of the FMV is located within a TIF ( 44.74% when using PIN counts).
Table 10.6: Untaxable AV in Cook County. Taxed AV represents the property value that was actually taxed by local taxing jurisdictions.
Code
cook_sums |>filter(year == params$year) |>select(cty_fmv, cty_fmv_inTIF, cty_fmv_tif_increment, cty_fmv_incentive, cty_fmv_incents_inTIFs, cty_fmv_incents_tif_increment) |>flextable() |>set_header_labels(cty_fmv ='Total FMV', cty_fmv_inTIF ='FMV in TIFs',cty_fmv_tif_increment ='TIF Increment FMV' ,cty_fmv_incents_inTIFs ='FMV from Incent. Class in TIF',cty_fmv_incentive ="FMV with Incent.Class.", cty_fmv_incents_tif_increment ='FMV with Incent. Class. in TIF Increment') |>FitFlextableToPage()
Table 10.7: FMV of properties with incentive classifications and TIF increment. Value in TIFs, value within the TIF that can be taxed by local taxing jurisdictions, value of properties that have reduced levels of assessments from incentive classifications, and the value that is both in a TIF and has a reduced LOA.
Taxed value is the amount of value that was actually taxed in order to pay for taxing agencies levies. It includes frozen EAV within an area + taxable EAV for residential properties net exemptions and abatements. It also includes the equalized assessed value of incentive properties at their current, lower assessment ratios. final_tax_to_dist is used to calculate the amount that was collected by local government agencies and then divided by the tax rate to calculate the amount of value that was taxed, or the taxable equalized assessed value (TEAV).
The Taxed Value, when converted to the Fair Market Value (FMV) represents the amount of value that was taxed out of the full FMV available in Cook County.
Untaxable EAV includes homeowner exemptions for 200 level properties, abatements for other property class types, EAV in the TIF increment, and EAV that has been reduced due to incentive classifications.
Code
cook_MC_sums <-read_csv("../Output/ptaxsim_cook_MC_level_2006to2023_new.csv") cook_MC_sums |>filter(year == params$year) |>mutate(across(contains(c("pct_", "rate")), scales::percent, accuracy = .01)) |>mutate(across(is.numeric, round, digits =0)) |>select("Property Type"= class_group, "Homeowner Exempt FMV"= cty_mc_fmv_exemptions,"Abated FMV"= cty_mc_fmv_abatements,"$0 Bill Count"= cty_mc_zero_bill,"$ Levy Paid"= cty_mc_levy,# "% of Levy Paid" = pct_mc_levy_paid, "FMV in Major Class"= cty_mc_fmv,"Taxed AV"= cty_mc_av_taxed,# "Project Count" = cty_mc_projects,"Avg Composite Tax Rate"= cty_mc_current_rate_avg,'FMV in TIFs'= cty_mc_fmv_inTIF, 'TIF Increment FMV'= cty_mc_fmv_tif_increment) |>flextable() |>align(align ="right")
Municipality Level Stats
Ignore stats for these Municipalities. Simple rounding errors may cause bizarre results for rate changes & other calculations. These municipalities are dropped from summary tables in this website but are included in exported files.
Frankfort has 1 PIN in Cook County
East Dundee has 2
Homer Glen has 3
University Park has 4
Oak Brook, Deer Park, Deerfield, & Bensenville each have less than 75 PINs in Cook County, IL
Figure 11.1: Percent of Municipality FMV with Incentive Classification % = FMV from Incentive Class properties / Muni FMV
Code
table2 <- pin_data |>filter(land_use !="Land") |>group_by(clean_name, incent_prop) |># projects can be counted twice if the project has incentive and normal commercial/industrial prop classes.summarize(pin_count =n(),project_count =n_distinct(keypin), av_adjusted=sum(ifelse(between(class, 600, 899), av*2.5, av)),av=sum(av, na.rm=TRUE),fmv=sum(fmv)) datatable(table2,rownames=FALSE,colnames =c('Municipality'='clean_name', 'Incentivized?'='incent_prop', 'PIN Count'='pin_count', 'Project Count'='project_count', 'Taxable AV'='av','AV w/o Incentive Classification'='av_adjusted','FMV'='fmv')) |>formatCurrency(c('Taxable AV', 'AV w/o Incentive Classification', 'FMV'), digits =0)
Table 11.4: PINs and value summarized by if the property has an incentive class or not in a municipality. AV Adjusted is the amount of assessed value that could be taxed if the property were assessed at 25% instead of the lower level of assessment of approximately 10%.
Share of Commercial & Industrial FMV with Incentive Classification
Code
muni_incent_share <- pin_data |># drop munis mostly outside of Cook and unincorporated PINsfilter(!agency_num %in% cross_county_line &!is.na(clean_name) ) |>filter(land_use =="Industrial"| land_use =="Commercial") |>group_by(clean_name, agency_num) |>summarize(pin_count =n(),incent_PC =sum(ifelse(class >=600& class <900, 1, 0), na.rm=TRUE),fmv_w_incent =sum(ifelse(class >=600& class <900, fmv, 0), na.rm =TRUE),# project_count = n_distinct(keypin),fmv_group =sum(fmv, na.rm=TRUE),comind_fmv =sum(fmv, na.rm=TRUE),pins_inTIF =sum(in_tif, na.rm=TRUE)) |>mutate(fmv_w_incent =ifelse(fmv_w_incent ==0, NA, fmv_w_incent),pct_fmv_w_incent = fmv_w_incent/comind_fmv,pct_fmv_w_incent =ifelse(is.na(pct_fmv_w_incent), 0, pct_fmv_w_incent)) |>select(clean_name, pct_fmv_w_incent, agency_num, fmv_w_incent, comind_fmv) muni_count <-n_distinct(muni_incent_share$clean_name)no_incents <-n_distinct(muni_incent_share$clean_name[muni_incent_share$pct_fmv_w_incent ==0])median =round(muni_count/2)median_5 =c( (median-2) : (median+2) )bottom_5 =c( (muni_count-4) : muni_count )muni_incentshare_slice <- muni_incent_share |>ungroup() |>filter(!agency_num %in% cross_county_lines) |>mutate(pct_fmv_w_incentclass = fmv_w_incent/comind_fmv,pct_fmv_w_incentclass =ifelse(is.na(pct_fmv_w_incentclass), 0, pct_fmv_w_incentclass)) |>select(clean_name, pct_fmv_w_incentclass) |>arrange(desc(pct_fmv_w_incentclass)) |>mutate(pct_fmv_w_incentclass = scales::percent(pct_fmv_w_incentclass, accuracy =0.01 ) ) |>slice(c(1:5, median_5))muni_incentshare_slice |>flextable() |>border_remove() |>align(j =2, align ="right", part ="all") |>hline_top() |>hline(i =c(5,10)) |>set_header_labels(clean_name ="Municipality", pct_fmv_w_incentclass ="% FMV with\nIncent. Class.") |>add_footer_lines(top =FALSE, values =c(paste0("There are ", no_incents, " municipalities that do not use incentives and have a majority of their taxable EAV within Cook County.") )) |>bold(i =8) |>set_table_properties( layout ="autofit")
Table 11.5: Municipalities with the largest share of Commercial and Industrial property with incentive classification. Uses values obtained from PTAXSIM, and levels of assessment from CCAO’s Github.
Table 12.1: Change in taxable EAV due to Incentive Classification
$15 Billion EAV is tax exempt due to homeowners exemptions. All incentive properties combined only have $4 billion EAV that is tax exempt (due to the decreased level of assessment which results in less AV, and therefore, EAV)
Estimates for Revenue Shifted to Non-Incentive Class Properties
Uses old current tax rate and multiplies it by the new taxbase.
Code
burden_shift <- pin_data |>filter(!agency_num %in% cross_county_lines &!is.na(clean_name) & clean_name!="Unincorporated" ) |>summarize(# for homestead exemptionsmostnaive_forgone_tax_amt_exe =sum(tax_amt_exe), # more accurate but still uses current tax rate instead of recalculated tax rate:forgonerev_from_exemptions =sum(ifelse(class >=200& class <300, (((av*eq_factor) - (taxed_av*eq_factor))) * tax_code_rate, 0), na.rm=TRUE),# amount of EAV from taxing an additional 15% of the AV if incentive properties didn't exist# using current tax rate for each property at the tax code levelforgonerev_from_comind_incents =sum(ifelse(class >=600& class <900, (((taxed_av*eq_factor)*0.25- (taxed_av*eq_factor))) * tax_code_rate, 0), na.rm=TRUE),forgonerev_commerc_incents =sum(ifelse(class >=600& class <900& class %in% commercial_classes, (((taxed_av*eq_factor)*0.25- (taxed_av*eq_factor))) * tax_code_rate, 0), na.rm=TRUE),forgonerev_indust_incents =sum(ifelse(class >=600& class <900& class %in% industrial_classes, (((taxed_av*eq_factor)*0.25- (taxed_av*eq_factor))) * tax_code_rate, 0), na.rm=TRUE),# forgonerev_noTIFs = rate_current/100 * ,# TIF increment above the frozen EAVforgonerev_TIFs =sum(fmv_tif_increment * loa * eq_factor*tax_code_rate, na.rm=TRUE),# if incentive properties had no tax value (i.e. owners left, or fully tax exempt)# also equal to the current amount collected from incentive propertiesforgonerev_vacant =sum(ifelse(class >=600& class <900, taxed_av*eq_factor * tax_code_rate, 0), na.rm =TRUE) )|>rename(`Naive Est. Homeowner Exemptions`= mostnaive_forgone_tax_amt_exe,`Homeowner Exemptions`= forgonerev_from_exemptions,`C&I Incentives`= forgonerev_from_comind_incents,`Commercial Incentive`= forgonerev_commerc_incents,`Industrial Incentive`= forgonerev_indust_incents,`TIFs`= forgonerev_TIFs,`Incent Props become Vacant`= forgonerev_vacant ) burden_shift |>flextable()
Change in Composite Property Tax Rate Due to Incentives and other Policy Scenarios
Tables - Difference in Composite Tax Rates
Code
muni_ratechange_full <- muni_ratechange |>select(clean_name, rate_current, rate_noInc, change_noInc) |>arrange(desc(change_noInc) )muni_count <-n_distinct(muni_ratechange_full$clean_name)no_incents <-n_distinct(muni_ratechange_full$clean_name[muni_ratechange_full$change_noInc <0.0001])median =round(muni_count/2)median_5 =c( (median-2) : (median+2) )bottom_5 =c( (muni_count-4) : muni_count )table8 <- muni_ratechange_full|>slice(c(1:5, median_5)) table8 |>mutate(across(is.numeric, scales::percent, accuracy =0.01) ) |>flextable() |>border_remove() |>hline_top() |>hline(i =c(5,10)) |>set_header_labels(clean_name ="Municipality", rate_current ="Current Comp.\nTax Rate", rate_noInc ="Tax Rate if No\nIncent. Class.",change_noInc ="Rate Change") |>bold(i =8) |>add_footer_lines(paste0("There are ", no_incents, " municipalities that do not use incentives and have a majority of their taxable EAV within Cook County."), top =FALSE) |>set_table_properties( layout ="autofit") |>align(j =2:4, align ="right", part =c("all"))
Table 12.2: Composite Tax Rate Change from hypothetical scenario of taxing incentive property at 25% of their FMV instead of 10% of their FMV.
Figure 12.1: Hypothetical change in composite tax rate if all value that currently receives incentive classification became assessed at 25%.
Code
muni_ratechange_full <- muni_ratechange |>mutate(change_vacant=rate_vacant-rate_current)|>select(clean_name, rate_current, rate_vacant, change_vacant) |>arrange(desc(change_vacant))muni_count <-n_distinct(muni_ratechange_full$clean_name)no_incents <-n_distinct(muni_ratechange_full$clean_name[abs(muni_ratechange_full$change_vacant) <0.0001])median =round(muni_count/2)median_5 =c( (median-2) : (median+2) )bottom_5 =c( (muni_count-4) : muni_count )table9 <- muni_ratechange_full|>slice(c(1:5, median_5)) table9 |>mutate(across(is.numeric, scales::percent, accuracy =0.01) ) |>flextable() |>border_remove() |>hline_top() |>hline(i =c(5,10)) |>set_header_labels(clean_name ="Municipality", rate_current ="Current Comp.\nTax Rate", rate_vacant ="Tax Rate if No\nIncent. Class.",change_vacant ="Rate Change") |>bold(i =8) |>add_footer_lines(paste0("There are ", no_incents, " municipalities that do not use incentives and have a majority of their taxable EAV within Cook County."), top =FALSE) |>set_table_properties( layout ="autofit") |>align(j =2:4, align ="right", part =c("all"))
Table 12.3: Composite Tax Rate Change Maximum increase in composite property tax rate due to incentives. (five largest and five median). Scenario from if properties that currently receive incentives lost all their value (i.e. most extreme scenario for if we didn’t have incentives and nobody used the land so it had no value.)
Code
# as a dot graph ## # create order of dotsorder <- muni_ratechange |>as_tibble() |>filter(change_noInc >0) |>arrange(change_noInc) |>select(clean_name, change_noInc) |>distinct()# make dot graphmuni_ratechange |>filter(change_noInc > .005) |>filter(change_noInc >0) |>select(clean_name, rate_current, rate_noInc, change_noInc) |>distinct() |>pivot_longer(c("rate_current", "rate_noInc"), names_to ="type", values_to ="tax_rate") |>left_join(order) |>filter(change_noInc >0 ) |>mutate(clean_name =if_else(clean_name =="Mc Cook", "McCook", clean_name)) |>ggplot(aes(x = tax_rate, y=reorder(clean_name, change_noInc)))+geom_line(aes(group = clean_name))+geom_point(aes(fill=type), size=3, pch =21, color ="black" )+theme_minimal() +theme( legend.title =element_blank(),plot.title.position ="plot",plot.background =element_rect(fill='transparent', color=NA) #transparent plot bg )+scale_fill_brewer(palette="Paired", labels =c("Incentives", "No Incentives"), direction =1) +labs(title ="Difference in Composite Tax Rate if Assessed at 25%",subtitle ="Ordered by Comp. Rate Change", x ="Composite Tax Rate (%)", y ="")
Figure 12.2: Ordered by amount of change in the composite tax rate.
Code
# as a dot graph ## # create order of dotsorder <- muni_ratechange |>as_tibble() |>filter(change_noInc >0) |>arrange(rate_current) |>select(clean_name, rate_current)# make dot graphmuni_ratechange |>filter(change_noInc > .005) |>select(clean_name, rate_current, rate_noInc) |>distinct() |>arrange(rate_current) |>pivot_longer(c("rate_current", "rate_noInc"), names_to ="type", values_to ="tax_rate") |>inner_join(order) |>ggplot(aes(x = tax_rate, y=reorder(clean_name, rate_current)))+geom_line(aes(group = clean_name))+geom_point(aes(fill=type), size=3, pch =21, color ="black" )+theme_minimal() +theme( legend.title =element_blank(),plot.title.position ="plot",plot.background =element_rect(fill='transparent', color=NA) #transparent plot bg )+scale_x_continuous(labels = scales::percent)+scale_fill_brewer(palette="Paired", labels =c("Incentives", "No Incentives"), direction =1)+labs(title ="Difference in Composite Tax Rate if Assessed at 25%",subtitle ="Ordered by Current Composite Tax Rate", x ="Composite Tax Rate (%)", y ="")
Figure 12.3: Change in tax rate if incentive properties were assessed at 25% of their FMV instead of their reduced level of assessment. Only shows municipalities that had more than 1/2 percentage point change in tax rate.
Code
# as a dot graph ## # create order of dotsorder <- muni_ratechange |>as_tibble() |>filter(change_noInc >0) |>arrange(rate_current) |>select(clean_name, rate_current) |>distinct()# make dot graphmuni_ratechange |>filter(change_noInc >0) |>select(clean_name, rate_current, rate_noInc, #rate_neither, rate_vacant, rate_noExe) |>distinct() |>arrange(rate_current) |>pivot_longer(c("rate_current", "rate_noInc", "rate_vacant", "rate_noExe"# ,# "rate_neither"), names_to ="type", values_to ="tax_rate") |>inner_join(order) |>ggplot(aes(x = tax_rate, y=reorder(clean_name, rate_current)))+geom_line(aes(group = clean_name))+geom_point(aes(fill=type), size=3, pch =21, color ="black" )+theme_minimal() +theme( legend.title =element_blank(),legend.position ="bottom",plot.title.position ="plot",plot.background =element_rect(fill='transparent', color=NA) #transparent plot bg )+scale_fill_brewer(palette ="RdGy",labels =c("Current Rate", # "No Exemps & LoA is 25%","No Exemptions", "No Incentives:\nLoA 25%","Incententive Classification\nLoA = 0%" ), direction =-1) +scale_x_continuous(labels = scales::percent)+labs(title ="Composite Tax Rate Scenarios",subtitle ="Ordered by Current Composite Tax Rate", x ="Composite Tax Rate (%)", y ="")
Figure 12.4: Multiple taxrate scenarios. All municipalities that had a taxrate change from altering the level of assessment for incentive class properties.
Code
# as a dot graph ## # create order of dotsorder <- muni_ratechange |>as_tibble() |>filter(change_noInc > .005) |>arrange(rate_current) |>select(clean_name, rate_current) |>distinct()# make dot graphfigure9_data <- muni_ratechange |>filter(change_noInc > .005) |>select(clean_name, rate_current, rate_noInc, rate_vacant) |>distinct() |>arrange(rate_current) |>pivot_longer(c("rate_current", "rate_noInc", "rate_vacant" ), names_to ="type", values_to ="tax_rate") |>inner_join(order) figure9_data|>ggplot(aes(x = tax_rate, y=reorder(clean_name, rate_current)))+geom_line(aes(group = clean_name))+geom_point(aes(fill=type), size=3, pch =21, color ="black" )+theme_minimal() +theme( legend.title =element_blank(),legend.position ="bottom",plot.title.position ="plot",plot.background =element_rect(fill='transparent', color=NA) #transparent plot bg )+scale_fill_brewer(palette ="Greys", direction =-1,labels =c("Current Rate", "No Incentive Classes: \nLoA = 25%","Incentive Classification\nLoA = 0%") )+scale_x_continuous(labels = scales::percent)+labs(title ="Composite Tax Rate Scenarios",subtitle ="Ordered by Current Composite Tax Rate", x ="Composite Tax Rate (%)", y ="")
Figure 12.5: Figure 9 in Incentive Report. Only shows municipalities that had more than 1/2 percentage point change in tax rate.
Export Tables
Code
library(readxl)# tablelist <- list(# "Muni Stats" = munilevel,# "Muni Rate Change" = muni_ratechange,# # "Cook Sums" = table_cook,# "Cook Class Sums" = cty_MC_table,# "Cook Rate Change" = cook_ratechange# )#writexl::write_xlsx(tablelist, "Output/calculations_report_content_20240927.xlsx")# # readme <- c(# # "Muni names and share of FMV with incentive property",# "Muni names and share of FMV with incentive property",# "Muni names and share of FMV with incentive property",# # "Muni Share_all includes all municipalities and their share of FMV with incentives out of all FMV in the municipality.",# "IndustShare_all is same as Indust_share but includes all munis.",# "CommercShare_all is same as Commerc_share but includes all munis.") %>% # as.data.frame()if(params$year ==2022){paper_tables <-list(# "README"= readme,# Table 2 is from yearly trends. Incentive FMV by year# Figure 1 is from yearly trends. Bar Chart - Aggregate Incentive FMV by year# Figure 2 is from yearly trends. Line Chart - Indexed Incentive FMV# Figure 3 is from yearly trends. Line Chart - FMV for single and multi family vs C&I FMV# Figure 5. Line Chart - Increase in FMV indexed to 2011 for Select property types"Table 3"= commerc_top10,"Table 4"= indust_top10,# Table 5 is from yearly trends file"Figure 4"= figure7,"Figure 5A"= figure7B,"figure 5B"= figure7C,# Table 6 is from yearly trends file"Table 8"= table8, # if assessment ratio was 25% instead of 10%"Table 9"= table9, # if properties with incentives were vacant (i.e. 0 FMV)"Figure 9 data"= figure9_data, # dot plot # Figure X is from yearly trends. FMV Growth by Incent Class and Land Use# Table X is from yearly trends. Table for figure X# Table X+1 is from yearly trends. Change from vacant land to incentive PIN# Table X+2. Regression models"Muni Share_all"= muni_incent_share,"IndustShare_all"= indust_share_full,"Commerc_Share_all"= commerc_share_full# "All Cook Rate Scenarios" = cook_ratechange)writexl::write_xlsx(paper_tables, "../Output/incentive_report_tables_2025_03_25.xlsx")}