FDOC Disciplinary Data

This document presents an ongoing investigation into the data available through the FDLE on FDOC Disciplinary actions. (Investigation begun 2023-10-28, it’s still in very rough and preliminary form)

Thank you Max at Community Spring for bringing to my attention that the FDLE collects incarceration data from the Florida Department of Corrections. This investigation will utilize that data, which is available from the Florida Department of Law Enforcement, but I would not recommend looking at the FDLE dashboard because it’s not very useful.

Initializing Investigation

Rule Violation Allegations

Show code
# All this is for figure 1
fill_order <- c("Disciplinary Confinement", "Loss of Gain Time", "Cashless Canteen Denial","Privilege Suspension - Other","Verbal Reprimand","Loss of Future Gain Time","Disciplinary Squad","Extra Duty","Restitution Payment","Alternative Housing","Privilege Suspension - Mail, Visitation","Privilege Suspension - Visitation","Privilege Suspension - Mail","Restricted Labor Squad","Disciplinary Confinement Part Time")
fill_order <- rev(fill_order)
disc$INCARCERATION_DISCIPLINARY_ACTION_TYPE_DESC <- factor(
  disc$INCARCERATION_DISCIPLINARY_ACTION_TYPE_DESC, 
  levels = fill_order, ordered = TRUE
)
ggplot(disc, aes(x = reorder(INCARCERATION_DISCIPLINARY_VIOLATION_TYPE_DESC, INCARCERATION_DISCIPLINARY_VIOLATION_TYPE_DESC, function(x) length(x)), fill = INCARCERATION_DISCIPLINARY_ACTION_TYPE_DESC)) +
  geom_bar() +
  scale_fill_manual(values = c(
    "Disciplinary Confinement" = "#015F97", "Loss of Gain Time" = "#E47237",
    "Cashless Canteen Denial" = "#DDB835", "Privilege Suspension - Other" = "#3F8A24",
    "Verbal Reprimand" = "#F0EADC", "Loss of Future Gain Time" = "#C84F68",
    "Disciplinary Squad" = "#99C285", "Extra Duty" = "#7C3655",
    "Restitution Payment" = "#5D395F", "Alternative Housing" = "#ADA193",
    "Privilege Suspension - Mail, Visitation" = "#627F7B", "Privilege Suspension - Visitation" = "#DDAC6D",
    "Privilege Suspension - Mail" = "#3F8A24", "Restricted Labor Squad" = "#8D422F",
    "Disciplinary Confinement Part Time" = "black"
  )) +
  xlab("Count of Active FDOC Disciplinary Action") +
  ylab("Count") +
  ggtitle("Disciplinary Violation Allegations Against FDOC Population Feb 2022- Sep 2023, Colored by Outcome") +
  labs(caption = "Figure 1") +
  theme_minimal() +
  coord_flip() +
  theme(
    axis.text.y = element_text(hjust = 1, vjust = 0.5, face="bold", size = 12.5),
    legend.title = element_blank(),
    legend.position = "bottom",
    plot.background = element_rect(fill = "#ECE5D8"),
    panel.grid.major = element_line(color = "gray", linewidth = 0.2),
    panel.grid.minor = element_line(color = alpha("gray", 0.2), size = 1)
  )

The plot above displays the counts of rule violation accusations made by FDOC staff against currently incarcerated individuals in the Florida Department of Corrections, and it uses different colors to represent the outcomes of the disciplinary process.

It is important to note that the plot shows the count of rule violations themselves, not the count of individuals who have been charged or faced consequences for these actions. It is common for individuals to be charged with multiple violations for a single action. For example, throwing a tray to the ground can result in charges of both disorderly conduct and destruction of state property. In such cases, a person could expect to be confined for 30 days and lose 30 days of previously-earned gain time, along with whatever else gets thrown at them.

These plots provide valuable information. However, it’s important to consider that when looking at the incidence of outcomes among individuals charged with rule violations, the results may look different. For example, it is likely that nearly 100% of those actually incarcerated (currently this data still includes those on parole, etc.) who have been accused of ‘disorderly conduct’ have ended up in confinement with that charge. The presence of multiple disorderly conduct charges and the concurrent punishments (such as loss of gain time) during confinement is here obscuring the true measure of reliance that FDOC has on confinement.

Collapsing Rule Violations into Categories

Processing the 104 individual rule violations can be overwhelming. It would be more useful to categorize them into a smaller number of categories. For instance, violations such as ‘disobeying a verbal or written order’, ‘disrespect of someone in authority’, and ‘disorderly conduct’ could be categorized under ‘officer got mad’, along with many others. I will make the rule violation categories now.

Show code
# All for plot
fill_order <- c("Disciplinary Confinement", "Loss of Gain Time", "Cashless Canteen Denial","Privilege Suspension - Other","Verbal Reprimand","Loss of Future Gain Time","Disciplinary Squad","Extra Duty","Restitution Payment","Alternative Housing","Privilege Suspension - Mail, Visitation","Privilege Suspension - Visitation","Privilege Suspension - Mail","Restricted Labor Squad","Disciplinary Confinement Part Time")

disc %>%
  mutate(violation_category = unlist(violation_category)) %>%
  ggplot(aes(x = reorder(violation_category, violation_category, function(x) length(x)), fill = INCARCERATION_DISCIPLINARY_ACTION_TYPE_DESC)) +
  geom_bar() +
  scale_fill_manual(values = c(
    "Disciplinary Confinement" = "#015F97", "Loss of Gain Time" = "#E47237",
    "Cashless Canteen Denial" = "#DDB835", "Privilege Suspension - Other" = "#3F8A24",
    "Verbal Reprimand" = "#F0EADC", "Loss of Future Gain Time" = "#000000",
    "Disciplinary Squad" = "#99C285", "Extra Duty" = "#7C3655",
    "Restitution Payment" = "#5D395F", "Alternative Housing" = "#DF678C",
    "Privilege Suspension - Mail, Visitation" = "#627F7B", "Privilege Suspension - Visitation" = "#DDAC6D",
    "Privilege Suspension - Mail" = "#3F8A24", "Restricted Labor Squad" = "#8D422F",
    "Disciplinary Confinement Part Time" = "#FED95D"
  )) +
  xlab("Categories of Rule Violation") +
  ylab("Count") +
  ggtitle("Categories of Disciplinary Violation Allegations Against FDOC Population Feb 2022- Sep 2023, Colored by Outcome") +
  labs(caption = "Figure 2", face = 'bold') +
  theme_minimal() +
  coord_flip() +
  theme(
    axis.text.y = element_text(hjust = 1, vjust = 0.5, face = "bold", size = 12.5),  # Make y-axis text bold
    axis.title = element_text(face = "bold"),  # Make axis titles bold
    legend.title = element_text(face = "bold"),  # Make legend title bold
    legend.position = "bottom",
    plot.title = element_text(face = "bold"),  # Make plot title bold
    plot.caption = element_text(face = "bold"),  # Make caption bold
    axis.text.x = element_text(size = 12.5), # Adjust x-axis label size
    plot.background = element_rect(fill = "#ECE5D8"),
    panel.grid.major = element_line(color = "gray", linewidth = 0.2),
    panel.grid.minor = element_line(color = alpha("gray", 0.2), size = 1)
  )

Okay now let’s look at it from the other direction – let’s see, of those in confinement, what all they are in for.

Show code
# All for plot
conf <- disc %>% 
  filter(INCARCERATION_DISCIPLINARY_ACTION_TYPE_DESC == 'Disciplinary Confinement') %>%
  merge(root %>% select(INCARCERATION_SUPERVISION_ID, RACE_CODE, ETHNICITY_CODE), by = "INCARCERATION_SUPERVISION_ID") %>% select(-"INCARCERATION_SUPERVISION_ID")

conf <- conf %>%
  mutate(Race_Ethnicity = ifelse(ETHNICITY_CODE == 'Hispanic or Latino', 'Hispanic or Latino', as.character(RACE_CODE)))
conf$Race_Ethnicity <- as.factor(conf$Race_Ethnicity)

ggplot(conf, aes(x = reorder(INCARCERATION_DISCIPLINARY_VIOLATION_TYPE_DESC, INCARCERATION_DISCIPLINARY_VIOLATION_TYPE_DESC, function(x) length(x)), fill = Race_Ethnicity)) +
  geom_bar() +
  xlab("Count of Active FDOC Disciplinary Action") +
  ylab("Count") +
  ggtitle("Disciplinary Violation Allegations Levied Against Currently Incarcerated FDOC Population, Colored by Race") +
  labs(caption = "Figure 3", face = 'bold') +
  theme_minimal() +
  coord_flip() +
  theme(
    axis.text.y = element_text(hjust = 1, vjust = 0.5, face = "bold", size = 12.5),
    legend.title = element_blank(),
    legend.position = "bottom",
    plot.background = element_rect(fill = "#ECE5D8"),
    panel.grid.major = element_line(color = "gray", linewidth = 0.2),
    panel.grid.minor = element_line(color = alpha("gray", 0.2), size = 1)
  )

Show code
# All for plot
conf %>%
  mutate(violation_category = unlist(violation_category)) %>%
  ggplot(aes(x = reorder(violation_category, violation_category, function(x) length(x)), fill = Race_Ethnicity)) +
  geom_bar() +
  xlab("Categories of Rule Violation") +
  ylab("Count") +
  ggtitle("Categories of Disciplinary Violation Allegations Resulting in Disc. Confinement\nFeb 2022 - Sep 2023") +
  labs(caption = "Figure 4") +
  theme_minimal() +
  coord_flip() +
  theme(
    axis.text.y = element_text(hjust = 1, vjust = 0.5, face = "bold", size = 10.5),
    axis.title = element_text(face = "bold"),  # Make axis titles bold
    legend.title = element_text(face = "bold"),  # Make legend title bold
    legend.position = "bottom",
    plot.title = element_text(face = "bold"),  # Make plot title bold
    plot.caption = element_text(face = "bold"),  # Make caption bold
    axis.text.x = element_text(size = 8), # Adjust x-axis label size
    plot.background = element_rect(fill = "#ECE5D8"),
    panel.grid.major = element_line(color = "gray", linewidth = 0.2),
    panel.grid.minor = element_line(color = alpha("gray", 0.2), size = 1)
  )

more soon

There is still a ton of work remaining for this investigation.