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.
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.
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.
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.
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)
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.
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.
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)
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.
Strengthen oversight for high-spend vendors. A small number of vendors receive a large share of statewide and agency-level spending. Agencies should periodically review these vendors to ensure pricing, performance, and contract renewals remain competitive and justified.
Increase competition where feasible. Several top vendors rely heavily on non-competitive procurement methods. Agencies should evaluate whether competitive solicitations could be used more often, especially for recurring services or high-value contracts.
Review justification for non-competitive awards. Non-competitive methods can be appropriate, but they require strong documentation. Agencies should ensure that exemption or sole-source justifications are complete, current, and aligned with policy.
Diversify the supplier base. Agencies with high vendor concentration may benefit from identifying alternative suppliers, conducting market research, or breaking large contracts into smaller competitive opportunities.
Monitor procurement patterns over time. Concentration and procurement-method trends should be reviewed annually to detect emerging risks, shifts in vendor behavior, or changes in market conditions.
Together, these actions can help agencies strengthen procurement integrity, reduce dependency on a small group of vendors, and ensure that public funds are spent through transparent and competitive processes. The findings from this analysis provide a foundation for ongoing monitoring and future audits.
While there is no evidence of intentional wrongdoing or improper financial relationships between agency employees and vendors, the combination of high vendor concentration, recurring non‑competitive procurement methods, and limited transparency creates structural vulnerabilities. These conditions do not imply corruption, but they increase the likelihood that oversight gaps, favoritism, or undue influence could occur without strong controls.
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.