This is a rough, brief analysis of campaign finance reports that have been filed late, with a focus on how many days late different types of committees file different reports. The Wisconsin Ethics Commission was created by 2015 Wisconsin Act 118. The Act went into effect on June 30, 2016 and the Commission adopted its standard settlement schedule shortly thereafter. The aim of this analysis was to better understand the role of the settlement schedule in motivating campaign finance committees to file reports on time. Reports filed prior to the formation of the Wisconsin Ethics Commission have been filtered out

All data are publically available on cfis.wi.gov. Information contained in campaign finance reports and campaign registration statements may not be sold or utilized by any person for any commercial purpose. Sec. 11.1304(12), Wis. Stats.

lrr <- read_excel("lrr.xlsx", col_types = c("numeric", 
    "text", "date", "numeric", "date", "text", 
    "text", "text", "numeric", "numeric", 
    "text"))
#Generating variables for the number of days late that are capped at 120 and 60. Any report that is filed over 120 days late will show up as being 120 days late. The current settlment schedule for continuing finance reports is maxed out after 120 days. 
lrr$dl_capped_120 <- if_else(lrr$days_late > 119, 120, lrr$days_late)
lrr$dl_capped_60 <- if_else(lrr$days_late > 59, 60, lrr$days_late)
#Number of late reports by committee type 
lrr %>%
  filter(days_late > 0) %>%
  filter(Filing_calendar_id >= 138) %>%
  group_by(com_type) %>%
  count() %>%
  kable(col.names = c("Type", "Count"), align = "c")
Type Count
cand 485
conduit 168
ie 31
leg 2
pac 263
party 131
ref 4
#Number of late reports by report type
lrr %>%
  filter(days_late > 0) %>%
  filter(Filing_calendar_id >= 138) %>%
  group_by(report_code) %>%
  count() %>%
  kable(col.names = c("Report", "Count"), align = "c")
Report Count
FC 125
FE 102
FP 60
JA 265
JU 447
PR 7
SE 32
SP 25
XE 11
XP 10
#Total number of late reports   
lrr %>%
  filter(days_late > 0) %>%
  filter(Filing_calendar_id >= 138) %>%
  count() %>%
  kable(col.names = c("Total"))
Total
1084
#Generating table consisting of only continuing finance reports: January Continuing, July Continuing, and September Report (Fall Continuing). These reports all use the same settlment schedule.
df_cont <- lrr %>%
  filter(days_late > 0) %>%
  filter(Filing_calendar_id >= 138) %>%
  filter(com_type != "ref") %>%
  filter (report_code == "JU" | report_code == "JA" | report_code == "FC")
#Generating table consisting of only election-related finance reports: Fall Pre-Primary, Fall Pre-Election, Spring Pre-Primary, Spring Pre-Election, Special Pre-Primary, Special Pre-Election, and Special Post-Election. These reports all use the same settlment schedule.
df_elect <- lrr  %>%
  filter(days_late > 0) %>%
  filter(Filing_calendar_id >= 138) %>%
  filter(com_type != "ref") %>%
  filter (report_code == "FP" | report_code == "FE" | report_code == "SP" | report_code ==   "SE" | report_code == "XE" | report_code == "PR" | report_code == "XP")
#Total late continuing reports
df_cont %>%
  count() %>%
  kable(col.names = c("Total"))
Total
833
#Total election reports
df_elect %>%
  count() %>%
  kable(col.names = c("Total"))
Total
247
df_cont %>%
  ggplot(aes(x = dl_capped_120)) +
  geom_histogram(binwidth = 5) +
  facet_wrap(~ com_type, scales = "free") +
  labs(y = "Count", x = "Days Late") +
  ggtitle("Continuing Reports Filed Late", subtitle = "2016-2019")+
  theme_igray()

df_elect %>% 
  filter(com_type %in% c("cand", "conduit", "pac", "party")) %>% 
  ggplot(aes(x = dl_capped_120)) +
  geom_histogram(binwidth = 5) +
  facet_wrap(~ com_type, scales = "free") +
  labs(y = "Count", x = "Days Late") +
  ggtitle("Election Reports Filed Late", subtitle = "2016-2019")+
  theme_igray()

ggplot(df_cont, aes(x = dl_capped_120)) +
  geom_histogram(alpha = 0.5, binwidth = 1) +
  geom_histogram(data = df_elect, binwidth = 1, color = "green")+
  labs(x = "Days Late", y = "Number of Reports", title = "Comparison of Late Continuing and Election Reports", subtitle = "2016-2019, capped at 120 days late")+
  theme_minimal()+
  geom_line(aes(x = 2, y = 90), arrow = arrow(length=unit(0.25,"cm"), ends="first", type = "closed"))+
  geom_line(aes(x = 2, y = 60), arrow = arrow(length=unit(0.25,"cm"), ends="first", type = "closed"))+
  geom_label(x = 16, y = 90, label = "Continuing Reports", size = 3)+
  geom_label(x = 16, y = 60, label = "Election Reports", size = 3)+
  geom_label(x = 115, y = 45, label = "120+", size = 3)

ggplot(df_cont, aes(x = dl_capped_60)) +
  geom_histogram(alpha = 0.5, binwidth = 1) +
  geom_histogram(data = df_elect, binwidth = 1, color = "purple")+
  labs(x = "Days Late", y = "Number of Reports", title = "Comparison of Late Continuing and Election Reports", subtitle = "2016-2019, capped at 60 days late")+
  theme_minimal()+
  geom_line(aes(x = 2, y = 90), arrow = arrow(length=unit(0.25,"cm"), ends="first", type = "closed"))+
  geom_line(aes(x = 2, y = 60), arrow = arrow(length=unit(0.25,"cm"), ends="first", type = "closed"))+
  geom_label(x = 9, y = 90, label = "Continuing Reports", size = 3)+
  geom_label(x = 8.25, y = 60, label = "Election Reports", size = 3)+
  geom_label(x = 57, y = 90, label = "60+", size = 3)

ggplot(df_cont, aes(x = dl_capped_120)) +
  geom_density() +
  geom_density(data = df_elect, color = "blue") +
  labs(x = "Days Late", y = "Proportion", title = "Comparison of Late Continuing and Election Reports", subtitle = "2016-2019") +
  theme_minimal()+
  geom_label(x = 16, y = .03, label = "Continuing Reports", size = 3)+
  geom_label(x = 15, y = .005, label = "Election Reports", size = 3)