Plot = import('https://cdn.jsdelivr.net/npm/@observablehq/[email protected]/+esm')
d3 = require("d3@7")
topojson = require("topojson-client@3")
import {addTooltips} from "@mkfreeman/plot-tooltip"
// transpose data
tenroll = transpose(enroll)
taged = transpose(aged)
tdisabled = transpose(disabled)
// load US States TopoJSON
us = await d3.json("https://cdn.jsdelivr.net/npm/us-atlas@3/states-10m.json")
// convert to GeoJSON
statesGeo = topojson.feature(us, us.objects.states).features
// map FIPS codes to names
stateNames = new Map(Object.entries(us.objects.states.geometries).map(([_, g]) => [g.id, g.properties.name]))
function sumMetric(metric) {
return d3.sum(tenroll, d => d.metric === metric ? d.value : 0);
}
// Aggregate data by state and compute necessary metrics
states = [
{
state: "National",
democratVotes: sumMetric("votes", "democrat"),
republicanVotes: sumMetric("votes", "republican"),
otherVotes: sumMetric("votes", "other"),
medicaid: sumMetric("medicaid_enrollment"),
medicare: sumMetric("total_medicare_enrollees"),
aged: sumMetric("total_aged"),
disabled: sumMetric("total_disabled"),
population: sumMetric("population"),
medicaidPer1000: (sumMetric("medicaid_enrollment") / sumMetric("population")) * 1000,
medicarePer1000: (sumMetric("total_medicare_enrollees") / sumMetric("population")) * 1000,
agedPer1000: (sumMetric("total_aged") / sumMetric("population")) * 1000,
disabledPer1000: (sumMetric("total_disabled") / sumMetric("population")) * 1000
}
,
...d3.groups(tenroll, d => d.state).map(([state, records]) => {
const metrics = Object.fromEntries(records.map(d => [d.metric, d.value]));
const votes = d3.rollup(records.filter(d => d.metric === "votes"), v => d3.sum(v, d => d.value), d => d.party);
const totalVotes = votes.get("democrat") + votes.get("republican") + votes.get("other");
const percentDifference = totalVotes > 0
? ((votes.get("republican") - votes.get("democrat")) / totalVotes) * 100
: 0;
return {
state,
democratVotes: votes.get("democrat") || 0,
republicanVotes: votes.get("republican") || 0,
otherVotes: votes.get("other") || 0,
percentDifference,
medicaid: metrics["medicaid_enrollment"] || 0,
medicare: metrics["total_medicare_enrollees"] || 0,
aged: metrics["total_aged"] || 0,
disabled: metrics["total_disabled"] || 0,
population: metrics["population"] || null,
medicaidPer1000: metrics["medicaidPer1000Eligible"] || 0,
medicarePer1000: metrics["total_medicare_enrolleesPer1000"] || 0,
agedPer1000: metrics["total_agedPer1000"] || 0,
disabledPer1000: metrics["total_disabledPer1000"] || 0
};
})
];
// Create a map of state data for quick lookup
stateDataMap = new Map(states.map(d => [d.state, d]));
// Generate the choropleth map
addTooltips(
Plot.plot({
projection: "albers-usa",
width: 800,
height: 500,
marks: [
Plot.geo(statesGeo, {
fill: d => {
const name = stateNames.get(d.id);
const datum = stateDataMap.get(name);
if (!datum || name === "National") return "#ccc"; // Exclude "National"
return datum.percentDifference > 0 ? "#E65E5E" : "#91A8C7"; // Red for Republican, Blue for Democrat
},
stroke: "#fff",
title: d => {
const name = stateNames.get(d.id);
const datum = stateDataMap.get(name);
if (!datum || name === "National") return `${name}\nNo data available`;
const percentDiff = `${datum.percentDifference > 0 ? "R+" : "D+"} ${Math.abs(datum.percentDifference).toFixed(2)}%`;
return `${name}
${percentDiff}
Democrat Votes: ${datum.democratVotes.toLocaleString()}
Republican Votes: ${datum.republicanVotes.toLocaleString()}`;
}
})
]
})
);
`
NoteTL;DR
- This is a lengthy and complex analysis - this section is highly summarized and should be read in full context.
- Recently passed budget (H. Con. Res. 14) looks to examine Medicare and Medicaid for “waste, fraud, and abuse”.
- Looking at voter results by state alongside populations of Medicare and Medicaid enrollees, 65+ year olds and disabled persons shows Republican states could be more negatively impacted by this budget.
- Though Republican proposed, the party’s actions point away from caring for constituents and toward paranoia about external threat, and lining the already deep pockets of large corporations. The money would be better spent improving the programs that could drastically benefit its own party members.
1 Background
Medicare and Medicaid are government programs designed to provide healthcare coverage for individuals 65 and over, or having certain diseases, or low-income individuals with certain conditions, like pregnancy.
Medicare primarily serves individuals aged 65 and older, as well as younger individuals with specific disabilities or conditions such as End-Stage Renal Disease (ESRD). It is a federal program funded through payroll taxes, premiums, and general revenue.
Medicaid, on the other hand, is a joint federal and state program that provides healthcare coverage to low-income individuals and families. Eligibility and benefits vary by state, and it often covers services not included in Medicare, such as long-term care and personal care services.
2 Context
A recent budget was passed by the Senate to address the deficit.
2.1 H. Con. Res. 14
SEC. 3003. SPENDING REDUCTION RESERVE FUND TO SAVE MORE THAN $2,000,000,000,000. The Chairman of the Committee on the Budget of the Senate may revise the allocations of a committee or committees, aggregates, and other appropriate levels in this resolution for one or more bills, joint resolutions, amendments, amendments between the Houses, motions, or conference reports relating to spending reforms that will— (1) scrutinize line item expenditures, especially non-defense spending that did not exist prior to or has grown significantly since the start of the COVID–19 pandemic; (2) fulfill the President’s promise to protect the old-age, survivors, and disability insurance benefits program under title II of the Social Security Act (42 U.S.C. 401 et seq.), the Medicare program under title XVIII of the Social Security Act (42 U.S.C. 1395 et seq.), or the Medicaid program under title XIX of the Social Security Act (42 U.S.C. 1396 et seq.), including from waste, fraud, and abuse
The resolution introduces ambiguous authority to alter Medicare and Medicaid in the name of “protecting” benefits. There are no specifics on how those changes will reduce the deficit. Cuts are coming-but how and to whom remain uncertain. On an already strained program (32.8 million people enrolled in Medicare Advantage (MA) plans; $462 billion (54%) of total Medicare spending).
The next questions become, who is going to be affected by budget and subsequent policy changes? In particular, because these policies are created by the Trump administration, how many of his constituents could be negatively impacted by these changes, specifically to Medicare and Medicaid?
3 Methods
One way to view this is by visualizing the amount of Medicare and Medicaid users by state against the voting outcome by state. Though a rough estimate, this allows a view of where the majority of Medicare and Medicaid enrollees reside and what the majority of their votes resulted in during the 2024 election. The purpose is not to shame voters, but to examine whether policies like these are negatively impacting the voters that placed this administration into power, and are thereby unheard by their representatives.
Data in this analysis came from the following sources: * Vote counts (2024) - University of Santa Barbara * Total Medicare enrollees, Aged persons (> 65 years old), and disabled persons by state (2021) - CMS * Total Medicaid enrollees - Medicaid.gov * Population estimates (2024, to adjust for population by state) - Census.gov * Potential Medicaid enrollees (used percentage of federal poverty line as a representation of eligibility) - Census.gov through ‘tidycensus’ R package/software
Voting data was collated by the University of Santa Barbara - thank you for your efforts in bringing this important data together.
State-level comaprisons required normalization: adjusting numbers to allow for meaningful comparison across different population sizes. The enrollment and population numbers were divided by the state population and multiplied by 1,000 to account for population differences and give meaningful comparison. This becomes more nuanced when looking at Medicaid, as eligibility criteria differs across states. Since this is difficult data to find, collect, and calculate, I’ve used the census poverty data, looking at the numbers of individuals who are 149% of the federal poverty line or lower. This means they make 49% above the federal poverty line or less. Typically, Medicaid eligibility ranges from 120% - 140%, with 138% being the threshold for most states with expanded Medicaid eligibility.
4 Data
The map below can be explored to show the amounts of Medicare and Medicaid enrollees, the Aged (65 and older) Medicare enrollees, and the disabled Medicare enrollees nationally, compared to a highlighted state.
The next charts show the top states for aged (> 65 years or older), disabled, Medicare enrollees and Medicaid enrollees. Medicare and Medicaid enrolles are normalized (adjusted to compare states relative to each other) to state populations, and eligible populations, respectively. States can be added to compare against others as desired.
5 Discussion
These visuals paint a very interesting picture. Looking at Medicare enrollees per 1,000 individuals, there are three Democratic states and two Republican, two of which also appear in the top five states by Aged population per 1,000 people. This is unsurprising since Medicare is largely an apolitical program - it is more dependent on the population of a state rather than its voting result.
Numbers of Aged and Disabled do show a different picture: three of the top five states for Aged population per 1,000 people, and all five of the top fives states for Disabled population per 1,000 people, were Republican states. While political affilitation cannot be assumed by age or disability, these groups are more concentrated in red states. Federal Medicare policy is shaped by the party in power, so these same states may face greater risk from cuts. In short: voters in Republican-led states could be the most affected by reforms they helped enable. This analysis does not predict specific outcomes, but highlits a possibility worth cosidering: red states may have knowingly or unknowingly, negatively impacted their opportunities for these federal programs as they are being reviewed for efficacy.
I will take a moment to say that, again, looking for “waste, fraud, and abuse” as the figure-heads routinely spout, is important. But following on from my DOGE analysis, the methods that have been illustrated so far are not those of people looking to make positive changes while maintaining services, but instead people who are looking to grind things down to the bare bones and then keep it as a minimum viable product.
Circling back, Medicaid is even more intriguing. Three of the top five states were Democratic states. The complexity stems from Medicaid being joint-funded by the nation and the state. It is unsurpising that more Medicaid enrollees per 1,000 eligible persons are found in Democratic states as these states are more likely to have Medicaid programs and expand them, while Republican states would decrease the funding. So while these potential budget cuts may not seem to impact Republican states negatively, this is linked to having less enrollees due to smaller programs. I would argue that Republican states are more disenfranchised by these cuts as they are less likely to have federal funding if the cuts occur, leading that state to pick up the tab. If the state is already red, it is less likely to fill the funding gap - especially without federal support - leaving more individuals without health insurance.
In my opinion, these programs, while federally funded, should not be seen as “big government” intervention, but more wealth equity. If the wealth is appropriately redistributed (and by that, I mean each individual paying an appropriate amount into their communities - local, state, and federal - relative to what they earn) then we act more like united states: we are as strong as our weakest link, and if we don’t raise them up with us, we are all left behind.
Voroni shows the median incomes by state, adjusted for cost of living. The reason this is important is that: 1) States with lower median incomes tend to have Republican turn out; and 2) Medicaid eligibility is largely based on individual/family income levels.
Without creating another analysis, its important to note that lower incomes are factors of many things, including availability of high income jobs, population, industries, and cost of living. So while one of those is adjusted for, this is not a perfect comparison. But again, it serves to show that red states are typically lower income. When you’re living on less, every dollar counts. Budget reveiws shouldn’t strip these programs to the bone-they should ensure the support is actually felt by the people who need it most.
6 Final thoughts
A budget update can be seemingly insignificant, but I believe this one in particular is controversial. The language is open-ended and makes a very clear shift that the current administration is more fearful of outside impact to borders, than it is of the internal failings affecting its own citizens. By naming the only methods of government aided healthcare as potential pots of “waste, fraud, and abuse” that could be redirected to the grossly enormous $1 trillion defense budget, America chooses to continue to deprioritize its own citizens, provide money to large corporations (namely health insurance companies) while bankrupting its own citizens, and giving record-breaking military spending power to a man who’s already mishandled classified war plans over unsecured messages.
Maybe it’s time we redefine what “national security” really means.