Medicare Advantage, Part D, Medicaid
MA hedis national rates
Rows
N/A
Columns
16
History
2019 to 2025
Card
yesgrain, traps, filters
Typed tools
0
What it is
- 1National-rollup quality scores for Medicare Advantage (MA) health plans, parsed from CMS's annual HEDIS MA Public Use Files (PUFs).
- 2Each row is one HEDIS quality indicator (e.g. breast cancer screening, controlling high blood pressure, controlling diabetes HbA1c) for one report year, giving the enrollment-weighted national average performance rate across all reporting MA contracts.
- 3It is a quality/outcomes benchmark layer that sits alongside the cost data (a quality denominator for value/cost-effectiveness analysis of MA plans), not a price/rate table despite the column name "weighted_rate".
Grain
| Key | Grain |
|---|---|
indicator_keyreport_year |
|
How to read it
- 1Trend a quality measure nationally over time, joining on the stable indicator_key (not measure_code).
- 2Example: SELECT report_year, weighted_rate, contracts_count, eligible_population FROM hedis_national_rates WHERE indicator_key='200700_20' ORDER BY report_year; -> returns the enrollment-weighted national Controlling-High-Blood-Pressure rate for MA each available year (2019 ~74.5%, ... through 2025), answering 'how has MA plan performance on blood-pressure control changed nationally?'.
- 3To list one year's full scorecard: SELECT measure_code, measure_name, weighted_rate FROM hedis_national_rates WHERE report_year=2024 ORDER BY weighted_rate DESC (remembering some measures are lower-is-better).
Traps
- 1NOT a cost/price table despite 'national_rates' and 'weighted_rate' — these are HEDIS clinical QUALITY rates (percent of eligible members meeting a quality measure), at the NATIONAL level only. There is no contract/plan/state/county/NPI dimension; you cannot get a per-plan or per-region rate from this table.
- 2measure_code and measure_name are point-in-time LABELS that drift across years, not stable keys. The same clinical indicator is recoded by CMS/NCQA over time (e.g. HbA1c Control <8% = indicator_key 200707_20 shows as measure_code CDC in 2019-2022, HBD in 2023-2024, GSD in 2025; some indicators carry up to 4 different measure_names). ALWAYS join/trend on indicator_key, never on measure_code, or you will break time series and double-count.
- 3weighted_rate polarity is mixed: for most measures higher=better, but for overuse/avoidance measures (UOP multiple prescribers, HDO/UOD high-dose opioids, PSA non-recommended screening) LOWER is better. Ranking measures by raw weighted_rate or averaging across measures without normalizing polarity gives nonsense.
- 4Year 2020 is MISSING entirely (no 2020 MA HEDIS PUF due to COVID reporting relief) — the 6 periods are 2019, 2021, 2022, 2023, 2024, 2025, so any year-over-year delta logic must skip the 2019->2021 gap.
- 5Unbalanced panel: only 57 of 95 indicators appear in all 6 years; 4 appear in just 1 year (e.g. ABA / 200005_20 only in 2019, then retired). Do not assume every indicator exists every year — a missing (indicator_key, year) means the measure wasn't reported that year, not a value of 0.
- 6The grain is exactly (indicator_key, report_year) — 471 rows. The profiler reported a 5-column superset that included contracts_count (a measured value) and the report_year-derived dates; those are NOT part of the key. is_current does not exist and is unnecessary: one immutable sha256 per year, single asserted_at (2026-05-15), no duplicate snapshots.
- 7contracts_count and eligible_population are NATIONAL denominators rolled across all reporting contracts (eligible_population reaches ~32.5M; counts grow year over year with MA enrollment). They are not per-contract figures, and low contracts_count (down to 47) flags thinly-reported indicators whose national rate is less robust.
Columns (16)
| Column | Type | Meaning |
|---|---|---|
measure_code | string | Short HEDIS measure abbreviation, e.g. ABA (Adult BMI Assessment), CBP (Controlling High Blood Pressure), BCS/BCS-E (Breast Cancer Screening), CDC/HBD/GSD (diabetes care). 35 distinct values. CAUTION: this is a point-in-time label, not a stable id — for the SAME indicator_key the code drifts across years as NCQA recodes measures (e.g. indicator 200707_20 = HbA1c Control <8% appears as CDC in 2019-2022, HBD in 2023-2024, GSD in 2025). Do not use it as the cross-year join key; use indicator_key. |
measure_name | string | Human-readable label for the specific indicator/sub-stratum, e.g. 'Controlling High Blood Pressure', or a bare sub-label like '(Total)', '(51-75)', '30 days (Total)', 'HbA1c Control (<8%)'. Also point-in-time and drifts: one indicator_key can carry up to 4 different names across the 6 years (CMS rewords labels). Often it is just the stratum qualifier, not the full measure title. |
indicator_key | string | The stable CMS PUF indicator identifier, formatted '<numeric_id>_<suffix>' where suffix is '10' or '20'. THE durable cross-year join key (95 distinct ids; one indicator_key tracks the same clinical indicator over time even when measure_code/measure_name change). The numeric prefix is the CMS indicator number; the _10/_20 suffix is a fixed PUF coding qualifier (248 rows _10, 223 rows _20). NOT unique on its own (recurs every year) — must be paired with report_year. |
weighted_rate | double | Enrollment-weighted national average performance rate for the indicator, as a percent 0-100 (observed min 0.58, max 98.38; all 471 rows in [0,100], zero nulls). It is the contract-level rates weighted by each MA contract's eligible population, rolled to one national number. POLARITY VARIES: for most measures higher is better (e.g. TRC ~90%, statin therapy ~88%), but for 'overuse'/avoidance measures lower is better (e.g. UOP opioid multiple-prescribers 0.79%, HDO/UOD high-dose opioids, PSA non-recommended screening). Do not assume higher = better. |
contracts_count | int | Number of MA contracts that reported this indicator and were rolled into the national rate (observed 47-630, no nulls). A measured denominator/coverage figure that grows over the years as MA enrollment expands — NOT a key column (the profiler mistakenly included it). Low counts (e.g. 47) flag thinly-reported indicators where the national rate is less robust. |
eligible_population | int | Total national eligible-member count (the measure denominator) summed across reporting contracts (observed ~3.2M to ~32.5M, no nulls). This is the national denominator, not per-contract; it climbs year over year with MA growth. Used as the weight behind weighted_rate. |
report_year | int | CMS HEDIS PUF report year (int): 2019, 2021, 2022, 2023, 2024, 2025. NOTE 2020 is absent — no 2020 MA HEDIS PUF (COVID reporting suspension). Half of the (indicator_key, report_year) grain. Rows per year: 2019=68, 2021=64, 2022=85, 2023=82, 2024=88, 2025=84. |
observed_period | date | Date = January 1 of report_year (derived, redundant with report_year; aligned 471/471). Represents the measurement/reporting period anchor, not a sub-annual period. |
asserted_at | date | Date this record was asserted/loaded into the silver layer. Constant 2026-05-15 for every row (single ingestion event). Effectively a load-batch stamp, not a business date. |
effective_period_start | date | Date = January 1 of report_year (derived; aligned 471/471). Start of the year the rate is effective for. Functionally equal to report_year — the profiler used it as the time column. |
effective_period_end | date | Date = December 31 of report_year (derived; aligned 471/471). End of the effective year. Together with effective_period_start it just bounds the report_year calendar window. |
cms_vintage_sequence | int | Integer revision-sequence of the CMS source vintage. Constant = 1 across all rows (only the first/original vintage of each year's PUF has been loaded; no restatements ingested yet). A versioning hook for future CMS file re-releases. |
parse_revision | int | Internal parser revision number for the extraction. Constant = 1 (single parser version used for the whole load). Provenance/reproducibility field. |
parser_artifact_hash | string | SHA256 of the parser artifact that produced the row (provenance). 6 distinct values — one per source file/year — so it co-varies with the year's source ZIP, identifying which parser run emitted each year's rows. |
source_url | string | CMS download URL of the origin HEDIS MA PUF ZIP, e.g. https://www.cms.gov/files/zip/ma-hedis-pufs-2024.zip. Exactly 6 distinct values, one per report_year (1:1 file-to-year). Note URL naming differs by year (hedis-ma-puf-2019.zip vs ma-hedis-pufs-2021.zip). |
sha256_content_hash | string | SHA256 of the source file's content (provenance/integrity). 6 distinct values, one per year. Confirms a single immutable snapshot per year — total rows 471 = distinct (sha256_content_hash, indicator_key), so there is no duplicate-snapshot fan-out and no dedup is required. |
Query it
describe_data_source(source_fqn="medicare_silver.hedis_national_rates") # the card, live query_substrate(sql="SELECT * FROM medicare_silver.hedis_national_rates WHERE indicator_key = '<value>' AND report_year = '<value>' LIMIT 100")
| Item | Value |
|---|---|
| Typed tools that read it | none; raw SQL |
| Identity key | measure_code |
| Join | how_to_join(source_fqn="medicare_silver.hedis_national_rates") |
| Raw door | Athena (read-only via query_substrate): medicare_silver.hedis_national_rates |
| Note | Grain-governed; live in Glue / query_substrate. Source family ma_hedis_annual. get_hedis and get_hedis_national_benchmark read the documented names of medicare_semantic.vw_hedis_national_rates_v2 since 2026-09-30; this table is unchanged and stays the physical storage. |
This page as markdown: /docs-md/data/medicare_silver_hedis_national_rates.md · every page in one file: /llms-full.txt