Medicare Advantage, Part D, Medicaid
MA plan payment — Part C (contract x plan x year)
Rows
40,014
Columns
13
History
2015 to 2024
Card
yesgrain, traps, filters
Typed tools
0
What it is
- 1CMS Medicare Advantage (Part C) plan payment summary: for each MA contract+plan, the year's average risk-adjusted Part A/B payment per member per month, the average enrollee risk score, and the average rebate PMPM.
- 2It quantifies what Medicare pays MA plans (the government's cost of MA), sourced from CMS's annual public 'plan payment data' ZIP files.
Grain
| Key | Grain |
|---|---|
contract_idplan_idpayment_year |
|
How to read it
- 1Benchmark what Medicare pays a given MA plan and how rich its rebate-funded extra benefits are, risk-adjusted.
- 2Example: SELECT payment_year, avg_ab_pmpm_payment, avg_part_c_risk_score, avg_rebate_pmpm_payment FROM medicare_silver.ma_plan_payment_part_c WHERE contract_id='H0028' AND plan_id='007' ORDER BY payment_year; -> the year-by-year per-member-per-month CMS payment, population risk score, and rebate for that specific plan.
- 3Aggregate by contract_id (not contract_name) for an insurer view, or by payment_year + plan_type for market trends; weight carefully since values are plan-level averages, not enrollment-weighted totals.
Traps
- 1GRAIN IS contract_id x plan_id x payment_year (40,014 = total). The profiler's 5-column key (adding contract_name + plan_type + bronze_publication_id) is a redundant SUPERSET: within any single year (contract_id, plan_id) is already unique, and bronze_publication_id is 1:1 with payment_year. Do NOT key on or GROUP BY contract_name/plan_type to dedup — they are attributes.
- 2contract_name is NOT stable across years: the same contract_id can carry up to 4 different names over 2015-2024 (organizations rebrand/merge). Join and aggregate on contract_id, not on the name; treating (contract_id, contract_name) as a fixed pair will double-count.
- 3avg_rebate_pmpm_payment = 0.0 is a MEANINGFUL zero (plan receives no rebate), present in 3,844 rows — NOT a null and NOT missing data. All MSA plans are $0 by design, and EGWP plans (plan_id >= '800', 3,509 rows) average near-zero rebate (~$11.6 vs ~$132 for individual-market plans). Filtering out zeros will bias rebate stats upward and drop legitimate plans.
- 4No is_current / no snapshot dedup needed: there is exactly ONE publication per payment_year (10 bronze_publication_ids, 10 source_urls, 10 sha256 hashes), all asserted_at on 2026-05-18. asserted_at is the pipeline LOAD time, not a content date — never use it as the time axis; use payment_year.
- 5Unbalanced panel + plan-ID semantics: only 1,004 of ~9,783 plans appear in all 10 years (2,100 appear in just one) — plans enter/exit, so cross-year trends need care. Also numeric precision differs by vintage: 2015-2023 payment/rebate values are rounded to 2 decimals, but 2024 carries full-precision decimals (a source/parser artifact) — round before exact-equality comparisons across years.
- 6Scope: this is PLAN-level (PBP), aggregate, average-PMPM data — it is the only contract-x-plan-x-year payment table; it is NOT beneficiary-level, NOT monthly, and contains no benchmark/bid or county-rate columns. The three measures (avg AB PMPM payment, avg Part C risk score, avg rebate PMPM) are the entire payment fact set.
Columns (13)
| Column | Type | Meaning |
|---|---|---|
payment_year | int | CMS Medicare Advantage payment year (calendar year), int 2015-2024. The temporal dimension and part of the grain key. Maps 1:1 to bronze_publication_id and source_url (one CMS annual ZIP per year). NOT a snapshot/load date — it is the substantive year the payment data describes. |
contract_id | string | CMS MA contract identifier, 5-char string. Always 'H'+4 digits (39,232 rows, all plan types) or 'R'+4 digits (782 rows, exclusively Regional PPO). 1,047 distinct contracts. Part of the grain key. Join key to other MA contract-level tables (e.g. Star Ratings, enrollment). |
plan_id | string | CMS Plan Benefit Package (PBP) ID within a contract, zero-padded 3-char string (always length 3, e.g. '007', '438', '815'). 518 distinct values. Part of the grain key. plan_id >= '800' (3,509 rows) are employer/union group plans (EGWP) — they have near-zero rebates (avg $11.6 PMPM vs $132 for individual-market plans). The full plan = contract_id + plan_id (a.k.a. H#####-### / CCN-style ID). |
contract_name | string | Legal/marketing name of the contracting organization (e.g. 'AETNA LIFE INSURANCE COMPANY', 'KAISER FOUNDATION HP OF CO'). 890 distinct. ATTRIBUTE of contract_id, NOT part of the minimal key. WARNING: it is NOT stable — the same contract_id can carry up to 4 different names across years (e.g. H5928 rebrands), so do not treat (contract_id, contract_name) as a fixed pair; key on contract_id. |
plan_type | string | MA plan-type category. 6 observed values: HMO (27,183), Local PPO (11,576), Regional PPO (782, always R-prefix contracts), PFFS (416), MSA (54), 'Medicare-Medicaid Plan HMOPOS' (3). Attribute of the plan, not part of the minimal key. MSA plans structurally always have $0 rebate. |
avg_ab_pmpm_payment | double | Average Part A & B benefit payment per member per month (USD), the core risk-adjusted CMS payment to the plan for covering standard Medicare benefits. double, 0% null, never zero. Range 238.6 to 1,360.02, mean ~813. Rises over time (2015 avg $694 -> 2024 avg $880). This is the headline MA Part C cost-to-Medicare figure in this table. |
avg_part_c_risk_score | double | Average Part C (CMS-HCC) risk score for the plan's enrollees. double, 0% null, never zero. Range 0.398 to 4.11, mean ~1.135 (1.0 = average-risk beneficiary). Drives the AB payment: higher = sicker/costlier population. Highest scores (>3.7) concentrate in 2024 and special-needs-type plans. |
avg_rebate_pmpm_payment | double | Average MA rebate payment per member per month (USD) — the portion of the plan's bid-below-benchmark savings CMS returns to fund extra benefits/reduced premiums. double, 0% null. Range 0 to 958.0, mean ~122. 3,844 rows are exactly 0.0 — a MEANINGFUL zero (no rebate), not a null: all 54 MSA rows are $0 by design, PFFS/Regional PPO over-represented, and EGWP (plan_id>=800) plans average near-zero. |
source_url | string | CMS download URL for the originating annual 'plan payment data' ZIP. 10 distinct (one per payment_year). Provenance only; URL pattern changes year to year (e.g. .../downloads/2015-payment-data.zip vs /files/zip/2024-plan-payment-zip-file.zip). |
sha256_content_hash | string | SHA-256 of the ingested source file content. 10 distinct (one per year). Provenance/immutability fingerprint of the raw CMS file; identical for all rows from the same year. |
bronze_publication_id | string | Internal bronze-layer publication identifier, format 'ma_plan_payment_<year>_<hash8>' (e.g. ma_plan_payment_2024_53379284). 10 distinct, maps 1:1 to payment_year. This is the snapshot/ingestion unit — because there is exactly one publication per year, there is no is_current flag and no multi-snapshot dedup to worry about. |
asserted_at | timestamp | Timestamp the row was asserted into silver. 10 distinct values, ALL on 2026-05-18 (within ~2 minutes of each other, one per year-file loaded sequentially). This is pipeline load time, NOT a data-content date — do not use it for time-series analysis; use payment_year. |
parser_artifact_hash | string | Hash of the parser code/artifact that produced these rows. Exactly 1 distinct value across the entire table — all 40,014 rows parsed by the same parser version. Lineage/reproducibility field. |
Query it
describe_data_source(source_fqn="medicare_silver.ma_plan_payment_part_c") # the card, live query_substrate(sql="SELECT * FROM medicare_silver.ma_plan_payment_part_c WHERE contract_id = '<value>' AND plan_id = '<value>' AND payment_year = '<value>' LIMIT 100")
| Item | Value |
|---|---|
| Typed tools that read it | none; raw SQL |
| Identity key | contract_id |
| Join | how_to_join(source_fqn="medicare_silver.ma_plan_payment_part_c") |
| Raw door | Athena (read-only via query_substrate): medicare_silver.ma_plan_payment_part_c |
This page as markdown: /docs-md/data/medicare_silver_ma_plan_payment_part_c.md · every page in one file: /llms-full.txt