Analysis
By Michael LaPick Healthcare Writer
Michael LaPick Healthcare Writer
Michael LaPick is a Healthcare/Medicare data researcher for HealthCare.com and its web properties. Previously, he has written investigative stories for the Poughkeepsie Journal and WAMC NPR Albany, keeping an eye on how Americans spend their money.
Updated on August 29th, 2024
We want to help you make educated healthcare decisions. While this post may have links to lead generation forms, this won’t influence our writing. We adhere to strict editorial standards to provide the most accurate and unbiased information.
"); svg.call(tool_tip); // Append g for best practice const g = svg.append("g"); // Legend color scale const legendColor = d3 .scaleLinear() .domain([0, 200]) .range(["indigo", "cyan"]); ///////// DROPDOWN ///////////////// d3.select("#dropdown") .selectAll("options") // .data(['Premium', 'Beds per 1000', 'Mental Health Workers']) .data([ "Hospitals rated 4+", "65+ preventive care (%)", "Adequate prenatal care (%)", "Life expectancy", "Uninsured (%)", "COVID risk (1-10)", "Cardio deaths/100k", "Healthcare cost index*", "Ambulance ($)", "Dental cleaning ($)", "ER visit ($)", "Angioplasty ($)", "Colonoscopy ($)", "Insurance premium ($)", "Hospital beds/1000 people", "Mental health workers/1000 jobs", "Healthcare workers/1000 jobs", "Nurses/1000 jobs", "Surgeons/1000 people", "Hospital beds/1000 people", "Dental visits past year (%)", ]) .join("option") .text((d) => d) .attr("value", (d) => d); d3.select("#dropdown").on("change", function (d) { let selectedOption = d3.select(this).property("value"); update(selectedOption); }); ///////// DATA WRANGLING /////////// const data = await d3.csv("https://content-static.stg.healthcare.inc/data/HCI_Top_20_Metros.csv"); const map = await d3.json( "https://content-static.stg.healthcare.inc/data/us-states.json" ); // Display map g.selectAll("path") .data(map.features) .enter() .append("path") .attr("d", path) .style("fill", "lightgray"); //////////// LEGEND ////////////////// const legendGroup = svg.append("g").attr( "transform", `translate(${svgWidth / 2}, ${110})` ); const defs = svg.append("defs"); const legendGradientId = "legend-gradient"; const gradient = defs .append("linearGradient") .attr("id", legendGradientId) .selectAll("stop") .data(legendColor.range()) .enter() .append("stop") .attr("stop-color", (d) => d) .attr("offset", (d, i) => `${i * 100}%`); const legendWidth = 200; const legendHeight = 20; const legendGradient = legendGroup .append("rect") .attr("x", -legendWidth / 2) .attr("height", legendHeight) .attr("width", legendWidth) .style("fill", `url(#${legendGradientId})`) .attr("fill-opacity", 0.6); const legendValueLeft = legendGroup .append("text") .attr("class", "legend-value") .attr("x", -legendWidth / 2 - 10) .attr("y", legendHeight / 2 + 5) .style("font-family", "Proxima Nova") .style("font-size", 24) .style("fill", "#454545") .style("text-anchor", "end") .text("Low"); const legendValueRight = legendGroup .append("text") .attr("class", "legend-value") .attr("x", legendWidth / 2 + 10) .attr("y", legendHeight / 2 + 5) .style("font-family", "Proxima Nova") .style("font-size", 24) .style("fill", "#454545") .text("High"); ///////////// PERIPHERALS //////////// svg .append("text") .attr("x", svgWidth / 2) .attr("y", svgHeight - 10) .style("font-size", "14px") .style("text-anchor", "middle") .style("fill", "#454545") .text("Roll over cities for details"); // svg // .append("text") // .attr("class", "title") // .attr("x", svgWidth / 2) // .attr("y", 30) // .style("font-family", "Proxima Nova") // .style("font-size", "40px") // .style("fill", "black") // .style("text-anchor", "middle") // .text("Healthcare Metrics: Top 20 Metros"); ///////////// UPDATE CIRCLE FUNCTION //////////// function update(selectedOption) { // Remove circles before redrawing on update d3.selectAll("circle").remove(); d3.selectAll(".myText").remove(); // Color scale for circles const color = d3 .scaleLinear() .domain(d3.extent(data, (d) => +d[selectedOption])) .range(["indigo", "cyan"]); // Add circles circles = svg .selectAll("myCircles") .data(data) .enter() .append("circle") .attr("cx", function (d) { return projection([d.Long, d.Lat])[0]; }) .attr("cy", function (d) { return projection([d.Long, d.Lat])[1]; }) .attr("class", "circles") .attr("fill", (d) => color(+d[selectedOption])) // Set fill by value .attr("stroke", (d) => color(+d[selectedOption])) .attr("fill-opacity", 0.7) .on("mouseover", mouseover) .on("mouseout", mouseout) .transition() .duration(300) .attr("r", 8); // Add text for city names text = svg .selectAll("myText") .data(data) .enter() .append("text") .attr("x", function (d) { if (d.Metro === "Los Angeles") return projection([d.Long, d.Lat])[0] - 65; else return projection([d.Long, d.Lat])[0] + 12; }) .attr("y", function (d) { if (d.Metro === "Washington D.C.") return projection([d.Long, d.Lat])[1] + 10; else return projection([d.Long, d.Lat])[1]; }) .attr("class", "myText") .attr("dominant-baseline", "middle") .attr("fill", "black") // .attr("fill", (d) => color(+d[selectedOption])) // Set fill by value .style("font-size", "0.6em") .text(d => d.Metro) //////// MOUSE FUNCTIONS //////// function mouseover(d) { d3.select(this).transition().duration(50).attr("stroke-width", 4); // define and store the mouse position current_position = d3.mouse(this); tool_tip.show(); let tipSVG = d3 .select("#tipDiv") .append("svg") .attr("width", 260) .attr("height", 90); // Append text for Metro, metric and value tipSVG .append("text") .attr("x", 10) .attr("y", 20) .style("font-weight", 700) .text(d.Metro); // Append text for health metric tipSVG.append("text") .attr("x", 10) .attr("y", 40) .style("font-weight", 400) .text(selectedOption); tipSVG.append("text") .attr("x", 10) .attr("y", 60) .style("font-weight", 700) // .text(d[selectedOption] !== "" ? d[selectedOption] : "N/A"); .text(selectedOption.slice(-2, -1) === "%" ? d[selectedOption] + "%" : (selectedOption.slice(-2, -1) === "$" ? "$" + d[selectedOption]: d[selectedOption] )); // Legend for tooltip const legendGroup = tipSVG.append("g"); const defs = tipSVG.append("defs"); const legendGradientId = "legend-gradient"; const gradient = defs .append("linearGradient") .attr("id", legendGradientId) .selectAll("stop") .data(legendColor.range()) .enter() .append("stop") .attr("stop-color", (d) => d) .attr("offset", (d, i) => `${i * 100}%`); const legendWidth = 200; const legendHeight = 20; const legendGradient = legendGroup .append("rect") .attr("x", 10) .attr("y", 70) .attr("height", legendHeight) .attr("width", legendWidth) .style("fill", `url(#${legendGradientId})`) .attr("fill-opacity", 0.6); // Normalize data to legend length 200 and draw vertical guide bar on tooltip legend const min = d3.min(data, (d) => +d[selectedOption]); const max = d3.max(data, (d) => +d[selectedOption]); let n = ((d[selectedOption] - min) / (max - min)) * 200; line = tipSVG .append("line") .attr("x1", n + 10) .attr("x2", n + 10) .attr("y1", 70) .attr("y2", 90) .style("stroke-width", 4) .style("stroke", "fuchsia") .attr("class", "line"); } function mouseout() { tool_tip.hide(); d3.select(this).transition().duration(200).attr("stroke-width", 1); } } // Initialize update("Hospitals rated 4+"); })(); }loadD3AndGenerateGraph(generateBlockGraph);});
Healthcare in the United States’ biggest cities matters more than ever as Americans increasingly choose urban lifestyles.
How do America’s most populous metros compare on healthcare? Cost, access and quality vary widely.
An ER visit can run five times as much in San Francisco as in Minneapolis. Dallas has 12 highly rated hospitals while Miami, Atlanta and Detroit have only two each.
Meanwhile, your risk of catching COVID-19 is lowest in Seattle. But beware if you go to Detroit or Miami. Both cities are tops in terms of risk.
From Los Angeles to New York City, HealthCareInsider analyzed the top 20 metropolitan regions to see which offers the best healthcare.
Compare the cities on individual health metrics in the map above, and view the chart and table below for final rankings on cost, quality and access.
Compare Plans Based On Your Needs
Metro | Rank | Score | Cost | Access | Quality |
---|---|---|---|---|---|
Boston | 1 | 78.13 | 23.09 | 27.20 | 27.85 |
Minneapolis-St. Paul | 2 | 68.77 | 21.42 | 21.65 | 25.70 |
Philadelphia | 3 | 61.19 | 21.42 | 25.25 | 14.52 |
Baltimore | 4 | 60.84 | 28.08 | 21.09 | 11.66 |
Seattle | 5 | 59.73 | 14.52 | 16.65 | 28.56 |
Phoenix | 6 | 58.85 | 21.90 | 20.54 | 16.42 |
San Diego | 7 | 58.38 | 14.28 | 17.21 | 26.89 |
Denver | 8 | 57.35 | 18.33 | 14.99 | 24.04 |
Chicago | 9 | 52.87 | 21.18 | 16.93 | 14.76 |
Tampa | 10 | 52.55 | 16.42 | 18.04 | 18.09 |
Washington D.C. | 11 | 51.48 | 17.37 | 13.88 | 20.23 |
Los Angeles | 12 | 51.24 | 12.85 | 18.87 | 19.52 |
New York | 13 | 50.28 | 11.90 | 22.20 | 16.18 |
Detroit | 14 | 47.03 | 19.75 | 21.09 | 6.19 |
Miami | 15 | 46.64 | 18.56 | 18.32 | 9.76 |
San Francisco | 16 | 46.60 | 4.52 | 14.71 | 27.37 |
Houston | 17 | 41.68 | 16.66 | 13.60 | 11.42 |
Riverside-San Bernardino | 18 | 41.29 | 14.52 | 12.49 | 14.28 |
Atlanta | 19 | 38.43 | 19.28 | 7.49 | 11.66 |
Dallas | 20 | 37.32 | 16.18 | 8.05 | 13.09 |
ACCESS
- Hospital Beds Per 1000 People
Best City: San Diego
Worst City: Washington D.C. - Nurses Per 1,000 Jobs
Best City: Philadelphia
Worst City: Washington D.C. - Surgeons Per 1,000 People
Best City: Boston
Worst City: Atlanta - Mental Health And Substance Abuse Social Workers Per 1,000 Jobs
Best City: Boston
Worst City: Houston and Atlanta tie - Total Healthcare Workers Per 1,000 Jobs
Best City: Philadelphia
Worst City: San Francisco - Visits To Dentist Or Dental Clinic In The Previous Year Among Adults Aged 18+ (%)
Best City: Seattle
Worst City: Detroit and Dallas tie
QUALITY
- Hospital Satisfaction: Patient Ratings (1-5)
Best City: Dallas
Worst City: Miami - Percent Receiving Preventive Services 65+
Best City: Washington D.C.
Worst City: New York - Percent Receiving Adequate Prenatal Care
Best City: San Francisco
Worst City: Houston - Life Expectancy
Best City: San Francisco
Worst City: Detroit - Percent Uninsured
Best City: Boston
Worst City: Dallas - COVID Local Risk
Best City: Seattle
Worst City: Detroit and Miami tie - Cardiovascular Deaths Per 100,000
Best City: Boston
Worst City: Miami
COST
- Insurance Premium (average ACA silver plan)
Best City: Atlanta
Worst City: Washington D.C. - Healthcare Cost Index (*average healthcare service prices compared to the national average)
Best City: Baltimore
Worst City: San Francisco - Angioplasty (open blocked coronary arteries)
Best City: Riverside-San Bernardino
Worst City: New York - Ambulance Transportation
Best City: Baltimore
Worst City: Dallas - Emergency Department Visit
Best City: Minneapolis-St. Paul
Worst City: San Francisco - Simple Dental Cleaning
Best City: Boston
Worst City: New York - Average Colonoscopy
Best City: Chicago
Worst City: San Francisco
Call 855-599-3110
Methodology
In order to determine which most populous U.S. cities offers the best healthcare, HealthCareInsider compared 20 urban areas across three categories: 1) Cost, 2) Access, and 3) Quality.
We evaluated these categories using the 20 measures below. For each measure, cities were graded on a 100-point scale. A score of 100 represented the best performance.
Lastly, we added each metro’s score across all measures to rank America’s 20 top cities.
Sources: Data used to create this ranking were collected from the U.S. Bureau of Labor Statistics, Centers for Medicare & Medicaid Services, United States Census Bureau, NYU Langone Health City Health Dashboard, Kaiser Family Foundation, FAIR Health, Turquoise Health and HealthCare.com research.