Introduction

Poverty is not distributed evenly across Florida counties and educational attainment tends to play an important role within poverty rates. In this brief report I use county level poverty and educational attainment data from Florida to examine three parts of this story. First, I will show how many counties fall into 3 categories of poverty groups, those being: low, moderate and high poverty groups. Following this I examine how poverty rates are distributed within those three subgroups. As a final visual I will compare average poverty percentages across education levels to show how poverty tends to decline as educational attainment increases.

Data prepartion

For this section I will begin by simply loading the packages, read in the data, clean the column names and prepare the variables that will be used for analysis.

I. Load Packages

library(here)
library(tidyverse)
library(janitor)
library(RColorBrewer)
library(ggbeeswarm)

II. Read Data

florida <- read_csv(here("data", "Florida_Poverty_Education.csv"))
head(florida)
## # A tibble: 6 × 8
##   GEOID    County total_population Percent below\n pove…¹ Pov Percent \n>High …²
##   <chr>    <chr>             <dbl>                  <dbl>                  <dbl>
## 1 0500000… Alach…           264520                   19.7                   33.9
## 2 0500000… Baker…            25161                   13.1                   25.8
## 3 0500000… Bay C…           178417                   11.7                   23.6
## 4 0500000… Bradf…            23884                   19.1                   33.3
## 5 0500000… Breva…           612448                    9.9                   20.5
## 6 0500000… Browa…          1927838                   12.2                   21.8
## # ℹ abbreviated names: ¹​`Percent below\n poverty level`,
## #   ²​`Pov Percent \n>High school`
## # ℹ 3 more variables: `Pov. Percent\nHigh school Grad` <dbl>,
## #   `Pov. Percent\nSome college, associate's degree` <dbl>,
## #   `Pov. Percent Bachelor's \ndegree or higher` <dbl>

III. Clean the Data

In this section I cleaned up the column names, renamed those same columns to use shorter labels, converted the numeric fields and slected only the columns needed for the overall report.

fl_clean <- florida %>%
  clean_names() %>%
  rename(
    poverty_rate = percent_below_poverty_level,
    pov_less_hs = pov_percent_high_school,
    pov_hs_grad = pov_percent_high_school_grad,
    pov_some_college = pov_percent_some_college_associates_degree,
    pov_bachelors_plus = pov_percent_bachelors_degree_or_higher
  ) %>%
  mutate(
    county = str_remove(county, ", Florida"),
    total_population = as.numeric(total_population),
    poverty_rate = as.numeric(poverty_rate),
    pov_less_hs = as.numeric(pov_less_hs),
    pov_hs_grad = as.numeric(pov_hs_grad),
    pov_some_college = as.numeric(pov_some_college),
    pov_bachelors_plus = as.numeric(pov_bachelors_plus)
  ) %>%
  select(
    geoid,
    county,
    total_population,
    poverty_rate,
    pov_less_hs,
    pov_hs_grad,
    pov_some_college,
    pov_bachelors_plus
  )

head(fl_clean)
## # A tibble: 6 × 8
##   geoid          county    total_population poverty_rate pov_less_hs pov_hs_grad
##   <chr>          <chr>                <dbl>        <dbl>       <dbl>       <dbl>
## 1 0500000US12001 Alachua …           264520         19.7        33.9        18.5
## 2 0500000US12003 Baker Co…            25161         13.1        25.8        10.8
## 3 0500000US12005 Bay Coun…           178417         11.7        23.6        13.5
## 4 0500000US12007 Bradford…            23884         19.1        33.3        17.8
## 5 0500000US12009 Brevard …           612448          9.9        20.5        11.8
## 6 0500000US12011 Broward …          1927838         12.2        21.8        15.4
## # ℹ 2 more variables: pov_some_college <dbl>, pov_bachelors_plus <dbl>

IV. Create a Poverty Group Variable

In order to make the county comparisons I will have to group the counties into the low, moderate, and high poverty categories based on their overall poverty rates. I then order them into levels going from low to high poverty

fl_clean <- fl_clean %>%
  mutate(
    poverty_group = case_when(
      poverty_rate < 12 ~ "Low Poverty",
      poverty_rate < 18 ~ "Moderate Poverty",
      TRUE ~ "High Poverty"
    )
  )

fl_clean$poverty_group <- factor(
  fl_clean$poverty_group,
  levels = c("Low Poverty", "Moderate Poverty", "High Poverty")
)

head(fl_clean)
## # A tibble: 6 × 9
##   geoid          county    total_population poverty_rate pov_less_hs pov_hs_grad
##   <chr>          <chr>                <dbl>        <dbl>       <dbl>       <dbl>
## 1 0500000US12001 Alachua …           264520         19.7        33.9        18.5
## 2 0500000US12003 Baker Co…            25161         13.1        25.8        10.8
## 3 0500000US12005 Bay Coun…           178417         11.7        23.6        13.5
## 4 0500000US12007 Bradford…            23884         19.1        33.3        17.8
## 5 0500000US12009 Brevard …           612448          9.9        20.5        11.8
## 6 0500000US12011 Broward …          1927838         12.2        21.8        15.4
## # ℹ 3 more variables: pov_some_college <dbl>, pov_bachelors_plus <dbl>,
## #   poverty_group <fct>

Analysis

The following three plots tell the main story of this report: Florida counties are unevenly distributed across poverty groups, poverty rates vary within those groups, and poverty tends to be higher among lower educational attainment categories.

Plot 1. Number of Counties within each Poverty Group

fl_clean$poverty_group <- factor(
  fl_clean$poverty_group,
  levels = c("Low Poverty", "Moderate Poverty", "High Poverty")
)

plot1 <- ggplot(fl_clean, aes(x = poverty_group, fill = poverty_group)) +
  geom_bar(color = "black") +
  geom_text(
    stat = "count",
    aes(label = after_stat(count)),
    vjust = -0.3
  ) +
  scale_fill_brewer(palette = "YlOrRd") +
 labs(
  title = "Number of Florida Counties in Each Poverty Group",
  x = "Poverty Group",
  y = "Number of Counties",
  fill = "Poverty Group",
  caption = str_wrap(
    "Figure 1. This bar chart shows how many Florida counties fall into the low, moderate, and high poverty groups. Most counties fall into the low poverty group, while the difference between the high and moderate poverty groups is small.",
    width = 100
  )
)

plot1

This bar chart shows that the largest number of Florida counties fall into the low poverty category. However, the difference between the moderate and high poverty groups is much smaller, which suggests that a substantial share of counties still experience elevated poverty levels. This gives a useful overview before looking more closely at how poverty is distributed within each group.

Plot 2. Poverty rates vary within each poverty group.

  plot2 <- ggplot(fl_clean, aes(x = poverty_group, y = poverty_rate, color = poverty_group)) +
  geom_beeswarm(size = 2.5, alpha = 0.8) +
  scale_color_brewer(palette = "Set1") +
  labs(
    title = "Distribution of County Poverty Rates by Poverty Group",
    x = "Poverty Group",
    y = "Percent Below Poverty Level",
    color = "Poverty Group",
    caption = str_wrap(
      " Figure 2. Each point represents a Florida county. The beeswarm layout reduces overlap and makes it easier to compare how county poverty rates are distributed across the low, moderate, and high poverty groups. "
    )
  ) 

plot2

This plot adds more detail than the first one by showing each county individually. Instead of only knowing how many counties belong to each poverty group, it becomes possible to see how tightly clustered or spread out the counties are within each category. The high poverty group shows counties concentrated at much higher poverty values, while the low poverty group remains clustered at the lower end of the scale.

Plot 3. Poverty rates as Educational Attainment increases

The final plot compares average poverty percentages across education levels. In this data set, the education variables represent the percentage of people within each education category who are below the poverty line.

education_long <- fl_clean %>%
  select(county, pov_less_hs, pov_hs_grad, pov_some_college, pov_bachelors_plus) %>%
  pivot_longer(
    cols = c(pov_less_hs, pov_hs_grad, pov_some_college, pov_bachelors_plus),
    names_to = "education_level",
    values_to = "poverty_percent"
  ) %>%
  mutate(
    education_level = recode(
      education_level,
      pov_less_hs = "Less than High School",
      pov_hs_grad = "High School Graduate",
      pov_some_college = "Some College / Associate's",
      pov_bachelors_plus = "Bachelor's or Higher"
    )
  )

plot3 <- education_long %>%
  group_by(education_level) %>%
  summarize(avg_poverty = mean(poverty_percent, na.rm = TRUE)) %>%
  ggplot(aes(x = avg_poverty, y = reorder(education_level, avg_poverty))) +
  geom_point(size = 4, color = "darkblue") +
  labs(
    title = "Poverty Rates Decrease as Educational Attainment Increases",
    x = "Average Poverty Percent",
    y = "Education Level",
    caption = str_wrap(
    " Figure 3. Average poverty rates vary across education levels, with lower educational attainment associated with higher poverty percentages. "
    )
  ) 

plot3

This final plot shows the clearest education related pattern in the report. Individuals with lower levels of educational attainment have much higher average poverty percentages, while those with a bachelor’s degree or higher show the lowest poverty percentage. This supports the that poverty in Florida is closely tied to educational inequality.

Conclusion

These visualizations show that poverty is not evenly distributed across Florida counties and that education is closely related to poverty outcomes. The first plot showed that most counties fall into the low poverty group, but nearly the same amount of counties still fall into moderate and high poverty categories which together are twice the amount of the low poverty amount of counties. The second plot showed the spread of county poverty rates within those groups, making the differences more visible at the county level. The third plot showed that poverty percentages are highest among lower educational attainment groups and lowest among those with a bachelor’s degree or higher. Taken together, these patterns suggest that educational inequality remains strongly connected to poverty across Florida.