Introduction

I’m a junior data analyst working for a business intelligence consultant. My client is a public sector oversight agency that wants to better understand systemic vulnerabilties in public procurement. They suspect that certain patterns in contract awards and spending may indicate inefficiencies, concentration risk, or potential integrity issues. They have asked me to use data to identify where the vulnerabilities may exist and to provide actionable, data-driven recommendations.

Business Task

The business task is to analyze public procurement data to identify patterns that may signal vulnerabilities. Specifically, the client wants to know:

  • Which suppliers or contractors receive a disproportionately high share of total spending.

  • Whether certain departments, categories, or time periods show unusual spending patterns.

  • Where potential risks such as over-concentration, inconsistent pricing, or irregular award patterns may exist.

Success will be defined by delivering clear insights, supported by data and visualizations, that help the client prioritize areas for further investigation or policy improvements.

Stakeholders and Audience

Primary stakeholders: Public procurement office, oversight agency, internal audit teams.

Secondary stakeholders: Taxpayers, policymakers, external auditors, civil society organizations.

Intended audience for this report: Senior managers and analyst at the oversight agency, as well as potential employers reviewing this case study as part of an analytics portfolio.

How Insights Will Help

The insights from this analysis will help the client:

  • Identify areas of procurement that may warrant deeper review.

  • Understand where spending is highly concentrated or irregular.

  • Support decisions about monitoring, controls, and policy changes to strengthen procurement integrity.

Data Sources

For this project, I’m using contract-level procurement data from the Florida Accountability Contract Tracking System (FACTS). Facts is the statewide repository for contracts, grants, and purchase orders across all Florida agencies. I exported a CSV file of contracts for 2025 fiscal year to create a manageable dataset for analysis.

Source: Florida Accountability Contract Tracking System (FACTS)

URL: https://facts.fldfs.com

File name: florida_procurement_contracts.csv

Location in my project: data_raw/florida_procurement_contracts.csv

Why I chose it: FACTS provides real statewide procurement data with contract values, vendors, dates, and agency information. This structure allows me to analyze spending patterns, supplier concentration, and potential systemic vulnerabilities.

Process

For this project, I cleaned the raw FACTS dataset by removing empty columns, standardizing column names, converting date fields, and ensuring numeric fields were properly formatted. I also checked for missing values, duplicates, and inconsistent vendor names. These steps ensured the dataset was accurate, consistent, and ready for analysis.

contracts_raw <- read_csv("data_raw/florida_procurement_contracts.csv")
## New names:
## • `` -> `...53`
## • `` -> `...54`
## • `` -> `...55`
## • `` -> `...56`
## • `` -> `...57`
## • `` -> `...58`
## • `` -> `...59`
## • `` -> `...60`
## • `` -> `...61`
## • `` -> `...62`
## • `` -> `...63`
## • `` -> `...64`
## • `` -> `...65`
## • `` -> `...66`
## • `` -> `...67`
## • `` -> `...68`
## • `` -> `...69`
## • `` -> `...70`
## • `` -> `...71`
## • `` -> `...72`
## • `` -> `...73`
## • `` -> `...74`
## • `` -> `...75`
## Warning: One or more parsing issues, call `problems()` on your data frame for details,
## e.g.:
##   dat <- vroom(...)
##   problems(dat)
## Rows: 58865 Columns: 75
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (36): Agency Name, Vendor/Grantor Name, Type, Agency Contract ID, PO Num...
## dbl  (5): Original Contract Amount, Total Amount, Recurring Budgetary Amount...
## lgl (34): Grant Award ID, Grant Award Date, Administrative Cost Percentage, ...
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
contracts_clean <- contracts_raw %>%
  clean_names()
library(lubridate)

contracts_clean <- contracts_clean %>%
  mutate(
    begin_date = mdy(begin_date), original_end_date = mdy(original_end_date), new_end_date = mdy(new_end_date), contract_execution_date = mdy(contract_execution_date), po_order_date = mdy(po_order_date)
  )
contracts_clean <- contracts_clean %>%
  select(where(~ !all(is.na(.))))
contracts_clean %>%
  group_by(agency_name) %>%
  summarise(
    total_spend = sum(total_amount, na.rm = TRUE), contract_count = n()
  ) %>%
  arrange(desc(total_spend))
## # A tibble: 30 × 3
##    agency_name                               total_spend contract_count
##    <chr>                                           <dbl>          <int>
##  1 AGENCY FOR HEALTH CARE ADMINISTRATION     7155147793.            544
##  2 DEPARTMENT OF ELDER AFFAIRS                173896784.            162
##  3 DEPARTMENT OF HEALTH                       171554168.          18687
##  4 DEPARTMENT OF TRANSPORTATION               109531694.           2527
##  5 DEPARTMENT OF CHILDREN AND FAMILIES         62958586.           5734
##  6 DEPARTMENT OF COMMERCE                      61810603.            235
##  7 DEPARTMENT OF CORRECTIONS                   57510860.          10426
##  8 FISH AND WILDLIFE CONSERVATION COMMISSION   54068171.           2222
##  9 DEPARTMENT OF MANAGEMENT SERVICES           40242677.            578
## 10 EXECUTIVE OFFICE OF THE GOVERNOR            35407609.            117
## # ℹ 20 more rows

To understand statewide procurement patterns, I began by examining total spending by agency. This helps identify which agencies drive the largest share of contract activity and where procurement oversight may have the greatest impact. I calculated both the total dollar amount and the number of contracts for each agency to get a balanced view of spending volume and contract frequency.

Analyze

vendor_summary <- contracts_clean %>%
  group_by(vendor_grantor_name) %>%
  summarise(
    total_spend = sum(total_amount, na.rm = TRUE),
    contract_count = n()
  ) %>%
  arrange(desc(total_spend))
total_statewide_spend <- sum(contracts_clean$total_amount, na.rm = TRUE)
top10 <- vendor_summary %>%
  slice_max(total_spend, n = 10) %>%
  mutate(share = total_spend / total_statewide_spend)
agency_vendor_concentration <- contracts_clean %>%
  group_by(agency_name, vendor_grantor_name) %>%
  summarise(
    total_spend = sum(total_amount, na.rm = TRUE), contract_count = n(), .groups = "drop"
  ) %>%
  arrange(agency_name, desc(total_spend))
agency_focus <- "AGENCY FOR HEALTH CARE ADMINISTRATION"

agency_data <- agency_vendor_concentration %>%
  filter(agency_name == agency_focus) %>%
  arrange(desc(total_spend))
agency_name vendor_grantor_name total_spend contract_count
AGENCY FOR HEALTH CARE ADMINISTRATION SUNSHINE STATE HEALTH PLAN INC. 7148668228.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION KPMG LLP 1495770.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION SENTINEL TECHNOLOGIES, INC. 753251.43 4
AGENCY FOR HEALTH CARE ADMINISTRATION MYERS AND STAUFFER LC 579145.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION INSIGHT PUBLIC SECTOR, INC. 403932.97 56
AGENCY FOR HEALTH CARE ADMINISTRATION RAMCOTEK CONSULTING LLC. 353335.00 3
AGENCY FOR HEALTH CARE ADMINISTRATION CDW GOVERNMENT LLC 316128.86 13
AGENCY FOR HEALTH CARE ADMINISTRATION PROCOM CONSULTING, INC. 316000.00 3
AGENCY FOR HEALTH CARE ADMINISTRATION EXECUTIVE OFFICE FURNITURE, INC 249858.29 10
AGENCY FOR HEALTH CARE ADMINISTRATION KLC CONSULTING, INC. 233000.00 3
AGENCY FOR HEALTH CARE ADMINISTRATION DEFINED SOFTWARE DEVELOPMENT, L 187500.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION REVOLUTION TECHNOLOGIES, LLC 165984.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION DEPOSITION SOLUTIONS LLC 150000.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION BARKLEY SECURITY AGENCY, INC. 125000.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION BOYDEN GRAY & ASSOCIATES, PLLC 115000.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION DELL MARKETING L.P. 111725.31 4
AGENCY FOR HEALTH CARE ADMINISTRATION DEXIAN, LLC 97000.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION VITAVER & ASSOCIATES, INC. 74000.00 1
AGENCY FOR HEALTH CARE ADMINISTRATION CENTURION SECURITY GROUP, LLC 72654.72 3
AGENCY FOR HEALTH CARE ADMINISTRATION SODAK SYSTEMS LLC 65000.00 1
library(ggplot2)
library(scales)
## 
## Attaching package: 'scales'
## The following object is masked from 'package:purrr':
## 
##     discard
## The following object is masked from 'package:readr':
## 
##     col_factor
vendor_summary %>%
  slice_max(total_spend, n = 10) %>%
  ggplot(aes(x = reorder(vendor_grantor_name, total_spend), y = total_spend)) +
  geom_col(fill = "#2C3E50") +
  coord_flip() +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Top 10 Vendors by Total Spend",
    x = "Vendor",
    y = "Total Spend ($)"
  )

library(ggplot2)
library(scales)

agency_data %>%
  slice_max(total_spend, n = 10) %>%
  ggplot(aes(x = reorder(vendor_grantor_name, total_spend), y = total_spend)) +
  geom_col(fill = "#1F4E79") +
  coord_flip() +
  scale_y_continuous(labels = comma) +
  labs(
    title = paste("Top 10 Vendors for", agency_focus),
    x = "Vendor",
    y = "Total Spend ($)"
  )

competitive_methods <- c(
  "Invitation to Bid",
  "Request for Proposal",
  "Competitive Solicitation",
  "Invitation to Negotiate",
  "ITB",
  "RFP",
  "RFQ",
  "Competitive Bid"
)
procurement_simple <- contracts_clean %>%
  semi_join(top10, by = "vendor_grantor_name") %>%
  mutate(procurement_type = if_else(
    method_of_procurement %in% competitive_methods,
    "Competitive",
    "Non-Competitive"
  )) %>%
  count(vendor_grantor_name, procurement_type)
library(ggplot2)

ggplot(procurement_simple, aes(
  x = reorder(vendor_grantor_name, n),
  y = n,
  fill = procurement_type
)) +
  geom_col(position = "dodge") +
  coord_flip() +
  labs(
    title = "Competitive vs. Non Competitive Contracts",
    x = "Vendor",
    y = "Number of Contracts",
    fill = "Procurement Type"
  ) +
  theme_minimal(base_size = 12)

Share

The goal of this section is to present the key findings from my analysis in a clear, stakeholder-friendly way. I focus on vendor concentration, agency-level patterns, and procurement-method risk to highlight where Florida’s procurement system may be most vulnerable to integrity and performance risks.

Statewide vendor concentration

## # A tibble: 20 × 3
##    vendor_grantor_name             total_spend contract_count
##    <chr>                                 <dbl>          <int>
##  1 SUNSHINE STATE HEALTH PLAN INC. 7148668228               1
##  2 ALMA DDB LLC                      48016287               1
##  3 ALLIANCE FOR AGING, INC.          28858835.              2
##  4 INSIGHT PUBLIC SECTOR, INC.       25317352.            783
##  5 KPMG LLP                          22960182.             12
##  6 RVO HEALTH, LLC                   20850000               1
##  7 MID-FLORIDA AAA INC               20091341.              2
##  8 DELL MARKETING L.P.               19794793.           2181
##  9 SENIOR CONNECTION CENTER INC      19081024.              2
## 10 AREA AGENCY ON AGING OF SOUTHWE   18740262.              2
## 11 AREAWIDE COUNCIL ON AGING OF BR   18329441.              2
## 12 AAA-PALM BEACH/TREASURE COAST     16817101.              2
## 13 AREA AGENCY ON AGING OF PASCO-P   13060823.              2
## 14 BROWARD COUNTY, FLORIDA           12161252.             38
## 15 NORTHEAST FLORIDA AREA AGENCY O   12001133.              2
## 16 AREA AGENCY ON AGING OF CENTRAL   11779896.              2
## 17 DELOITTE CONSULTING, LLP          11043920.              2
## 18 CITY OF SANIBEL                    9920000               1
## 19 RSM US LLP                         9310515               8
## 20 CARAHSOFT TECHNOLOGY CORPORATIO    8154032.             48
vendor_summary %>%
  slice_max(total_spend, n = 10) %>%
  ggplot(aes(x = reorder(vendor_grantor_name, total_spend), y = total_spend)) +
  geom_col(fill = "#2C3E50") +
  coord_flip() +
  scale_y_continuous(labels = comma) +
  labs(
    title = "Top 10 Vendors by Total Spend",
    x = "Vendor",
    y = "Total Spend ($)"
  )

The statewide vendor summary shows that a relatively small number of vendors account for a large share of total spending. The bar chart highlights the top vendors by total spend, making it clear which entities dominate the statewide contracting landscape. This concentration can be efficient in some cases, but it can also increase risk if oversight is weak or if competition is limited.

Agency-level vendor concentration

## # A tibble: 20 × 4
##    agency_name                    vendor_grantor_name total_spend contract_count
##    <chr>                          <chr>                     <dbl>          <int>
##  1 AGENCY FOR HEALTH CARE ADMINI… SUNSHINE STATE HEA… 7148668228               1
##  2 AGENCY FOR HEALTH CARE ADMINI… KPMG LLP               1495770               1
##  3 AGENCY FOR HEALTH CARE ADMINI… SENTINEL TECHNOLOG…     753251.              4
##  4 AGENCY FOR HEALTH CARE ADMINI… MYERS AND STAUFFER…     579145               1
##  5 AGENCY FOR HEALTH CARE ADMINI… INSIGHT PUBLIC SEC…     403933.             56
##  6 AGENCY FOR HEALTH CARE ADMINI… RAMCOTEK CONSULTIN…     353335               3
##  7 AGENCY FOR HEALTH CARE ADMINI… CDW GOVERNMENT LLC      316129.             13
##  8 AGENCY FOR HEALTH CARE ADMINI… PROCOM CONSULTING,…     316000               3
##  9 AGENCY FOR HEALTH CARE ADMINI… EXECUTIVE OFFICE F…     249858.             10
## 10 AGENCY FOR HEALTH CARE ADMINI… KLC CONSULTING, IN…     233000               3
## 11 AGENCY FOR HEALTH CARE ADMINI… DEFINED SOFTWARE D…     187500               1
## 12 AGENCY FOR HEALTH CARE ADMINI… REVOLUTION TECHNOL…     165984               1
## 13 AGENCY FOR HEALTH CARE ADMINI… DEPOSITION SOLUTIO…     150000               1
## 14 AGENCY FOR HEALTH CARE ADMINI… BARKLEY SECURITY A…     125000               1
## 15 AGENCY FOR HEALTH CARE ADMINI… BOYDEN GRAY & ASSO…     115000               1
## 16 AGENCY FOR HEALTH CARE ADMINI… DELL MARKETING L.P.     111725.              4
## 17 AGENCY FOR HEALTH CARE ADMINI… DEXIAN, LLC              97000               1
## 18 AGENCY FOR HEALTH CARE ADMINI… VITAVER & ASSOCIAT…      74000               1
## 19 AGENCY FOR HEALTH CARE ADMINI… CENTURION SECURITY…      72655.              3
## 20 AGENCY FOR HEALTH CARE ADMINI… SODAK SYSTEMS LLC        65000               1
agency_data %>%
  slice_max(total_spend, n = 10) %>%
  ggplot(aes(x = reorder(vendor_grantor_name, total_spend), y = total_spend)) +
  geom_col(fill = "#1F4E79") +
  coord_flip() +
  scale_y_continuous(labels = comma) +
  labs(
    title = paste("Top 10 Vendors for", agency_focus),
    x = "Vendor",
    y = "Total Spend ($)"
  )

The agency-level view shows how spending is distributed within a single organization. In this case, a small number of vendors receive a large share of the agency’s total spend. This level of concentration can indicate operational efficiency, but it can also create risk if the agency becomes dependent on a limited supplier base or if competition is not consistently applied. Understanding these patterns helps identify where oversight or diversification may be needed.

Procurement-method risk

top10_methods <- contracts_clean %>%
  semi_join(top10, by = "vendor_grantor_name") %>%
  count(vendor_grantor_name, method_of_procurement, sort = TRUE)

top10_methods
## # A tibble: 27 × 3
##    vendor_grantor_name         method_of_procurement                           n
##    <chr>                       <chr>                                       <int>
##  1 DELL MARKETING L.P.         Alternate contract source [s. 287.042(16),…  2107
##  2 INSIGHT PUBLIC SECTOR, INC. Alternate contract source [s. 287.042(16),…   745
##  3 DELL MARKETING L.P.         Purchase under $2,500 [Rule 60A-1.002(2), …    52
##  4 INSIGHT PUBLIC SECTOR, INC. Purchase under $2,500 [Rule 60A-1.002(2), …    26
##  5 KPMG LLP                    State term contract with Request For Quote…    10
##  6 DELL MARKETING L.P.         Informally quoted purchase not exceeding C…     8
##  7 DELL MARKETING L.P.         State term contract with Request For Quote…     5
##  8 DELL MARKETING L.P.         State term contract without Request For Qu…     5
##  9 INSIGHT PUBLIC SECTOR, INC. Informally quoted purchase not exceeding C…     5
## 10 ALLIANCE FOR AGING, INC.    Exempt, Federal or state law prescribes wi…     2
## # ℹ 17 more rows
# your competitive vs non-competitive bar chart code

library(ggplot2)

ggplot(procurement_simple, aes(
  x = reorder(vendor_grantor_name, n),
  y = n,
  fill = procurement_type
)) +
  geom_col(position = "dodge") +
  coord_flip() +
  labs(
    title = "Competitive vs. Non Competitive Contracts",
    x = "Vendor",
    y = "Number of Contracts",
    fill = "Procurement Type"
  ) +
  theme_minimal(base_size = 12)

This visualization shows how the top vendors receive their contracts in terms of procurement method. Non-competitive methods, such as exemptions or sole-source awards, can be appropriate in limited situations but reduce market competition and transparency. Vendors with a high number of non-competitive contracts may represent elevated procurement risk and could warrant closer review to ensure that exceptions are justified and well documented.

Across statewide, agency-level, and procurement-method views, a consistent pattern emerges: a small group of vendors receives a large share of spending, and some rely heavily on non-competitive awards. While this does not indicate wrongdoing on its own, it highlights structural vulnerabilities where stronger competition, clearer justification for exceptions, or additional oversight could reduce risk.

Act

This section translates the analytical findings into clear, actionable recommendations for stakeholders. The goal is to highlight where oversight, competition, or process improvements could reduce procurement risk and strengthen transparency.

Case study summary

This case study analyzes statewide procurement patterns in Florida using contract-level data from the Florida Accountability Contract Tracking System (FACTS). The goal was to identify structural vulnerabilities in vendor concentration, agency-level spending, and procurement-method usage that may elevate integrity and performance risks within the state’s contracting system.

Using R for data cleaning, transformation, and visualization, I examined how public funds flow across vendors and agencies, focusing on high-spend entities and the balance between competitive and non-competitive procurement methods. The analysis revealed that a small group of vendors receives a disproportionately large share of statewide and agency-specific spending, and several of these vendors rely heavily on non-competitive awards such as exemptions or sole-source contracts. While these patterns do not indicate wrongdoing, they highlight systemic conditions where oversight gaps, limited competition, or vendor dependency could increase procurement risk.

The Share phase translated these findings into clear, stakeholder-ready visuals, including statewide vendor concentration charts, agency-level spending distributions, and a competitive vs. non-competitive procurement-method comparison. These visuals help decision-makers quickly understand where risk is concentrated and why certain vendors or procurement practices may warrant closer review.

In the Act phase, I developed actionable recommendations to strengthen procurement integrity, including increasing competition where feasible, improving justification for non-competitive awards, diversifying supplier bases, and conducting periodic reviews of high-spend vendors. Together, these steps support a more transparent, competitive, and resilient procurement environment.