FDOC Returns to Incarceration

This document presents an ongoing investigation into returns to incarceration in Florida.

The Florida Department of Corrections makes its OBIS database accessible for public download here.

This document is an ongoing mining of that data. Keep an eye out for my newsletter (which doesn’t exist yet) for updates, or press F5 to refresh.

Inital Look

Show code
prop_returned <- round(dim(returners_a)[1]/dim(Root)[1],2)
mean_incarcerations <- round((sum(returners_a$times_in) + dim(first_timers)[1])/dim(Root)[1],2)

new_data <- data.frame(times_in_bins = rep("First FDOC Commitment", dim(first_timers)[1]))
combined_data <- rbind(returners_a %>% select(times_in_bins), new_data)
ggplot(combined_data, aes(x = "", fill = times_in_bins)) +
  geom_bar(width = 1, stat = "count") +
  coord_polar("y", start = 0) +
  scale_fill_manual(values = c("#2c7bb6", "#abd9e9" ,"#ffffbf", "#fdae61", "#e6e6e6", "#7f3b00")) +
  theme_void() +  # Remove axis and grid lines
  labs(title = "Times Incarcerated, Currently Incarcerated FDOC Population", fill = "Times FDOC Incarcerated")

Amazingly, a full 49% of our currently incarcerated population has served time previously. The Florida Department of Corrections (FDOC) seems to appreciate repeat customers; I’ve heard them say so myself. Furthermore, the average number of times a person has been incarcerated across the entire population is 2.17. In other words, the average person currently incarcerated in FDOC has been incarcerated more than twice before.

What does this information imply about the argument for incarceration as a deterrent?

Regarding the argument on incarceration as a deterrent, I pose this question: How many crimes has the threat of incarceration prevented YOU from committing?

If your answer is “none,” then you are likely in the majority.

If your response is “none, but I’m not a criminal,” then it is worth reflecting on the following: Who are the criminals? What do they look like? Where do they come from? Which neighborhoods do they reside in? How comfortable are you with your answers?

Time Free Since Last Release

Next, we should examine the amount of time that those who are currently incarcerated in Florida were free in between their current and their last incarceration:

Show code
quartiles <- round(quantile(returners_a$TimeOut, probs = c(0.25, 0.5, 0.75))/365.25, 1)

color_palette <- c("#ffffff", "#e6e6e6", "#bfbfbf", "#808080", "#404040", "#000000")



# Create the first plot (plota)
plota <- ggplot(returners_a, aes(x = 1, y = TimeOut / 365.25, color = prev_TimeServed_bins, group = 1)) +
  geom_sina(alpha = 0.5, position = 'dodge') +
  geom_violin(alpha = 0.1, color = "black") +
  scale_color_manual(values = color_palette, name = 'Served') +
  ylab("Years Free") +
  theme_void() +  # Remove axis and grid lines
  theme(axis.text.y = element_text()) +  # Keep y-axis labels
  labs(title = "Years Free, Shaded by Previous Fl. Time Served")


color_palette <- c("#ffffff", "#e6e6e6", "#404040", "#000000")

# Create the second plot (plotb)
plotb <- ggplot(returners_a, aes(x = 1, y = TimeOut / 365.25, color = times_in_bins, group = 1)) +
  geom_sina(alpha = 0.5) +
  geom_violin(alpha = 0.1, color = "black") +
  scale_color_manual(values = color_palette, name = 'Number of Bids') +
  ylab(NULL) +
  theme_void() +  # Remove axis and grid lines
  theme(axis.text.y = element_text()) +  # Keep y-axis labels
  labs(title = "Years Free, Shaded by Number of Incarcerations")

# Customize plot margins for both plots
plota <- plota + theme(plot.margin = margin(0, 0, 0, 0, unit = "pt"))
plotb <- plotb + theme(plot.margin = margin(0, 0, 0, 0, unit = "pt"))

# Arrange the plots using grid.arrange
grid.arrange(plota, plotb, ncol = 2, top = "Respite Amidst Most Recent Incarcerations, Current FDOC Population")

It is evident from the visuals that a majority of individuals currently incarcerated in Florida with a history of previous FDOC incarceration did not have a significant period of freedom before their current imprisonment. Interestingly, there is also a pattern where individuals who had served long sentences in the past or multiple sentences were unable to remain free for long before being incarcerated again. These patterns are shown by the darker points towards the bottom of the visuals. While one might (naively) expect that spending more time in prison or having multiple sentences would make individuals better equipped to stay out longer and remain free, in reality it is not surprising to see evidence here that the longer someone is inside, the less equipped they are to navigate the challenges after release.

Time Free

Show code
quartile_table <- data.frame(
  "Quartile" = c("Q1", "Median (Q2)", "Q3"),
  Years_Free = quartiles
)

kable(quartile_table) %>% 
  kable_styling(latex_options = "hold_position")
Quartile Years_Free
25% Q1 1.8
50% Median (Q2) 3.2
75% Q3 5.7

For individuals who are currently incarcerated and have previously served time in Florida, a quarter of them were returned to prison in less than 1.8 years after their most recent release, while half of them were not out longer than 3.2 years. Furthermore, only 25% of them managed to stay out of prison for more than 5.7 years.

It is clear that many people are going back to prison very quickly, which raises concerns.

Think about this, however: having 3.2 years of freedom is actually enough time for someone to regain some responsibilities and dignity – it is already difficult to regain these once (or maybe gain them for the first time), but to only have a fleeting taste of them? I do not know that I could recover from something like that.

Charges

Show code
returners_hist <- merge(returners_a, Offenses_CPS, by = 'DCNumber')
returners_hist$adjudicationcharge_descr <- as.factor(returners_hist$adjudicationcharge_descr)

charges <- returners_hist %>%
  group_by(adjudicationcharge_descr) %>%
  summarize(charge_count = n()) %>%
  arrange(desc(charge_count))

raw_charges <- rbind(Offenses_CPS %>% select(adjudicationcharge_descr), Offenses_PRPR %>% select(adjudicationcharge_descr))
raw_charges$adjudicationcharge_descr <- gsub("[+$]", "", raw_charges$adjudicationcharge_descr)
raw_charges$adjudicationcharge_descr <- as.factor(raw_charges$adjudicationcharge_descr)
charges_counts <- raw_charges %>%
  group_by(adjudicationcharge_descr) %>%
  summarize(charge_count = n()) %>%
  arrange(desc(charge_count))

Currently incarcerated individuals are associated with 1,124 different charges across all past and current incarcerations.

Show code
datatable(unique(charges_counts), options = list(scrollX = TRUE, pageLength = 10, lengthMenu = c(10, 20, 50)))

In order to proceed, I had to reduce these 1,124 categories to something workable, I needed more general categories of crimes – drug crimes, violent crimes, etc. Categorizing crimes is a time-consuming process that requires making multiple classification decisions, so I encourage everyone to review the crime categorizations by clicking the disclosure triangle icon next to “View Crime Category Mappings”. If any errors or inconsistencies are found, or if you wish to suggest an alternative classification framework, please don’t hesitate to contact me.

Show code
kable(result) %>% 
  kable_styling(latex_options = "hold_position")
crime_category Top_3_counts
Abuse/Neglect Crimes AGGRAVATED CHILD ABUSE, 1085; WILLFUL CHILD ABUSE, 889; CHILD NEGLECT, 583
Burglary, Theft, Property Crimes BURGUNOCCSTRUC/CV OR ATT., 42369; BURG/DWELL/OCCUP.CONVEY, 29840; GRAND THEFT,300 L/5,000, 27729
Crimes of Incarceration/Criminal Identity BATT.LEO/FIRFGT/EMS/ETC., 6780; RESISTING OFFICER W/VIOLEN., 5510; FLEE LEO/NO REGARD, 4237
Drug Offenses COCAINE - POSSESSION, 21831; COCAINE-SALE/MANUF/DELIV., 16806; POSS.CONTROL.SUBS/OTHER, 12225
Motor Vehicle Crimes DRIV W/LIC S/R/C/D FELONY, 6170; DUI MANSLAUGHTER, 1177; FELONY DWLSR, 773
Other FEL/DELI W/GUN/CONC WPN/AMMO, 19081; CARRYING CONCEALED FIREARM, 4211; SHOOT/THROW MISSILE-BLDG/VEH., 2951
Sex Crimes POSS PHOTO ETC CHILD SEX PERF, 29524; SEX BAT BY ADULT/VCTM LT 12, 7443; L/L MOLEST V<12 OFF 18, 4992
Violent Crimes ROBB. GUN OR DEADLY WPN, 28564; ROBB. NO GUN/DDLY.WPN, 12381; AGG ASSLT-W/WPN NO INTENT TO K, 11135
White-Collar and Fraud UTTER FORGED INSTRUMENT, 5970; FALS INF. TO PWNBRKR<300, 4861; FORGERY/UTTERING, 3074

Aside: Limitation Caused by Poor Data Coding – Probation/Parole/Conditional Release Violations

While I initially intended to analyze probation/parole violations among individuals currently incarcerated with a previous history of incarceration using this data, it is not currently possible to conduct a straightforward analysis. This is because the Florida Department of Corrections categorizes individuals who are currently incarcerated and have violated their probation/parole under the charge for which they were originally sentenced to probation or parole.

For instance, let’s consider the following record, with all identifying information censored. This person was initially incarcerated in 1961 for an unspecified sexual battery crime and received a life sentence. It is important to note that the meaning of a life sentence in 1961 differed significantly from its present-day interpretation. They were released on parole in 1967. After 17 years of freedom, they were arrested in Orange County. Although they were not apparently convicted of a new crime, their detainment resulted in the revocation of their parole, and they have been in prison ever since.

Screenshot 2023-09-04 at 11.27.33 AM

Figure 1: Source: Screenshot 2023-10-16 at 17.15.00 PM | Florida Department of Corrections

However, the FDOC incorrectly lists this person as currently in prison for the 1961 unspecified sexual battery offense. There are several issues with this, the most significant being that it is not true. This person is NOT in prison for any form of sexual battery, but rather is still ensnared in the legal fallout from the 1961 conviction – after 17 years of freedom, these are different things, certainly.

Proportions of Persons Associated with Charges

Show code
ordered_first_timers <- result_first_timers %>% arrange(Category)
ordered_second_timers <- result_second_timers %>% arrange(Category)
ordered_third_timers <- result_third_timers %>% arrange(Category)
ordered_fourth_timers <- result_fourth_timers %>% arrange(Category)
ordered_fifth_timers <- result_fifth_timers %>% arrange(Category)
ordered_six_more_timers <- result_six_or_more_timers %>% arrange(Category)
pros_across_times <- cbind(ordered_first_timers,
                           ordered_second_timers[2],
                           ordered_third_timers[2],
                           ordered_fourth_timers[2],
                           ordered_fifth_timers[2],
                           ordered_six_more_timers[2])
new_column_names <- c("Crime Category", "First Commit.", "Second Commit.", "Third Commit.", "Fourth Commit.", "Fifth Commit.", "Sixth+ Commit.")
names(pros_across_times) <- new_column_names

Proportions of Crime Category by Number of Prison Commitments, Currently Incarcerated FDOC

Show code
# Pivot the data
data_long <- pros_across_times %>%
  pivot_longer(cols = -`Crime Category`, names_to = "Commit", values_to = "Value")

# Define the custom order for Commit
custom_order <- c("First Commit.", "Second Commit.", "Third Commit.", "Fourth Commit.", "Fifth Commit.", "Sixth+ Commit.")

# Apply the custom order to the Commit variable
data_long$Commit <- factor(data_long$Commit, levels = custom_order)

# Create the ggplot
ggplot(data_long, aes(x = Commit, y = Value, color = `Crime Category`, 
                      group = `Crime Category`, linetype = `Crime Category`)) +
  geom_line(linewidth = 2) +
  geom_point(aes(shape = `Crime Category`), size = 3.5) +
  labs(x = "Commitment", y = "Percent", title = "Percent Currently Associated with Crime Category Across Number of FDOC Stays") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
  theme(legend.position = "bottom")

Show code
kable(pros_across_times) %>% 
  kable_styling(latex_options = "hold_position")
Crime Category First Commit. Second Commit. Third Commit. Fourth Commit. Fifth Commit. Sixth+ Commit.
Abuse/Neglect Crimes 4.6 2.2 1.9 1.2 1.2 0.5
Burglary, Theft, Property Crimes 16.5 25.9 27.0 26.9 32.2 36.1
Crimes of Incarceration/Criminal Identity 8.4 11.4 12.2 13.7 11.9 10.3
Drug Offenses 14.8 21.9 26.5 29.8 31.5 34.1
Motor Vehicle Crimes 4.3 3.5 4.8 6.2 5.5 6.2
Other 22.7 33.7 30.5 24.2 22.5 14.9
Sex Crimes 17.0 4.5 2.9 2.2 1.6 1.6
Violent Crimes 37.5 37.1 33.4 32.1 29.6 25.5
White-Collar and Fraud 0.9 1.0 1.8 1.9 1.6 1.4

Okay, so among those currently incarcerated for their first commitment, 4.6% of them have Abuse/Neglect crimes associated with their current incarceration. However, this percentage drops to 2.2% for those serving time for their second incarceration. Furthermore, we see a further decrease to 1.9% across the population of those who are serving their third sentence in FDOC, and so on.

Show code
# I'm running a Mann-Kendall test for trends, really I should prob run a chi squared, but I don't know how to account
# for the overlaping crime categories (rape, for example, is both a sex and violent crime) - Mann-Kendall should suffice
# our investigation, however. If you feel that chi squared or another test is needed then reach out and we'll make it happen.
mannkendall_results <- apply(pros_across_times[,-1], MARGIN=1, FUN=MannKendall)

# Add the results as a new column to the data frame
pros_across_times$tau <- sapply(mannkendall_results,function(x) x$tau)
pros_across_times$pvalue <- sapply(mannkendall_results,function(x) x$sl)
sigs_across_times <- pros_across_times %>%
  filter(pvalue<= 0.05) %>%
  select(`Crime Category`, tau, pvalue)
kable(sigs_across_times) %>% 
  kable_styling(latex_options = "hold_position")
Crime Category tau pvalue
Abuse/Neglect Crimes -0.9660917 0.0128989
Burglary, Theft, Property Crimes 0.8666666 0.0241705
Drug Offenses 0.9999999 0.0085349
Sex Crimes -0.9660917 0.0128989
Violent Crimes -0.9999999 0.0085349

We do have strong statistical evidence that indicates a trend of decreasing Abuse/Neglect Crimes, Sex Crimes, and Violent Crimes. We also see in increase in the percentage of Burglary, Theft, Property Crimes, as well as Drug Offenses.

Next Steps

I can create a table for individual crime adjudications, similar to how I presented a table and graph displaying proportions of crime categories across successive incarcerations. This table would show statistically significant trends based on the number of incarcerations. However, conducting this analysis poses a challenge due to the large number of potential adjudications. To mitigate the risk of type 1 errors, I am currently exploring more conservative tests that can be applied, in addition to the Mann-Kendall test.

Following that, I will analyze correlations and relationships among multiple incarcerations per individual — I will compare the current charges of individuals currently incarcerated with their charges of previous incarcerations.

Finally, I will examine this data based on the county of last conviction.

I anticipate identifying further analysis opportunities as I complete these tasks.

Interactive Visual

Unfortunately, it does not appear to be possible to embed a D3 dynamic visual within a Distill website. Please click the link to view the visual. Interactive Viz