Oregon FQHC Landscape

Data Engineering
Healthcare
Python
Automated analysis of Health Center Service Delivery Sites
Author

E. Pitzer

Published

December 7, 2025

Introduction

NoteProject Context

This analysis uses Data sourced from HRSA Data Warehouse and validated via pytest before every deployment. We perform an aggregate analysis on statistics (patient count, health center numbers) pulled from the sample data (Oregon). To learn more about how the CI/CD pipeline was built and the project is structured, view the Technical Architecture page.

At a Glance

We are currently tracking 328 service delivery sites operated by 33 organizations.

Collectively, these organizations serve 646,289 patients (Note: Includes total patient volume for multi-state organizations operating in Oregon).

Statewide Payer Mix

Breakdown of the total patient population served by Oregon FQHCs (2024 UDS).

Code
# Calculate Statewide Totals (using deduped organization data to avoid double counting)
df_orgs = df.drop_duplicates(subset='bhcmis_id')

total_pop = df_orgs['total_patients'].sum()
total_medicaid = df_orgs['medicaid'].sum()
total_uninsured = df_orgs['uninsured'].sum()
total_other = total_pop - (total_medicaid + total_uninsured)

# Create a mini dataframe for the pie chart
mix_data = pd.DataFrame({
    'Category': ['Medicaid', 'Uninsured', 'Other (Private/Medicare)'],
    'Patients': [total_medicaid, total_uninsured, total_other]
})

fig_pie = px.pie(
    mix_data, 
    values='Patients', 
    names='Category',
    color='Category',
    color_discrete_map={
        'Medicaid': '#2c7bb6',    # Blue
        'Uninsured': '#d7191c',   # Red
        'Other (Private/Medicare)': '#abd9e9' # Light Blue
    },
    hole=0.4, 
    height=400,
    title=f"Total Patients (Org Level): {total_pop:,.0f}*"
)

# Add an annotation explaining the asterisk
fig_pie.add_annotation(
    text="*Includes non-OR patients for multi-state orgs",
    x=0.5, y=-0.15, showarrow=False, font=dict(size=12, color="gray")
)

fig_pie.update_traces(textinfo='percent+label')

# --- THE FIX: ADD BOTTOM MARGIN ---
fig_pie.update_layout(
    margin=dict(t=50, b=80, l=0, r=0) # b=80 gives space for the footnote
)

fig_pie.show()
Figure 1: Aggregate Payer Mix (Statewide)

Interactive Map

  • Size: Total Patients Served
  • Color: Percent of Patients on Medicaid
  • Hover for details
Code
fig = px.scatter_mapbox(
    df, 
    lat="latitude", 
    lon="longitude", 
    hover_name="site_name",
    hover_data={
        "latitude": False,
        "longitude": False,
        "total_patients": False, 
        "pct_medicaid": False,
        "uninsured": False,
        "medicaid": False,
        "organization": True,
        "city": True,
        "Patients (fmt)": True,
        "Medicaid %": True
    },
    size="total_patients",
    color="pct_medicaid",
    color_continuous_scale="Viridis", 
    size_max=25,
    zoom=5.5, 
    center={"lat": 44.0, "lon": -120.5},
    height=600,
    title="Oregon FQHCs: Patient Volume & Medicaid Density"
)

fig.update_layout(
    mapbox_style="carto-positron",
    margin={"r":0,"t":40,"l":0,"b":0},
    coloraxis_colorbar=dict(
        title="% Medicaid",
        thickness=15,
        len=0.5,
        yanchor="bottom", y=0.1,
        xanchor="left", x=0.02,
        bgcolor="rgba(255,255,255,0.8)"
    )
)
fig.show()
Figure 2: Map of Health Center Sites

Analysis: Scale vs. Safety Net (Organization Level)

Is there a relationship between the size of a Health Center Organization and its payer mix?

The data reveals a weak positive correlation between organization size and Medicaid volume. Larger organizations tend to serve a slightly higher percentage of Medicaid patients.

Overall however, the data shows you don’t have to be a giant mega-clinic to be a safety net provider. Small clinics in Oregon are doing just as much heavy lifting relative to their size.

  • 10th Percentile: 43% Medicaid
  • Median Site: 62% Medicaid
  • 90th Percentile: 76% Medicaid
Code
# Filter to unique organizations for valid regression
df_trend = df.drop_duplicates(subset='bhcmis_id')
df_trend = df_trend[df_trend['total_patients'] > 100]

fig_corr = px.scatter(
    df_trend, 
    x="total_patients", 
    y="pct_medicaid",
    hover_name="organization", # Changed to Org Name
    # Update tooltips to be explicit about "Organization" scope
    hover_data={
        "total_patients": False, 
        "pct_medicaid": False, 
        "Patients (fmt)": True, 
        "Medicaid %": True
    },
    trendline="ols",
    labels={"total_patients": "Total Org Patients", "pct_medicaid": "Org Medicaid %"}, # Explicit Axis Labels
    title="Organization Size vs. Medicaid %",
    height=500
)

fig_corr.update_layout(yaxis_tickformat='.0%')
fig_corr.show()
Figure 3: Correlation: Org Patient Volume vs. Medicaid %

Search & Explore Data

Sort by Uninsured or Medicaid to find high-need areas.

Code
display_cols = ['organization', 'site_name', 'city', 'total_patients', 'pct_medicaid', 'pct_uninsured']
df_display = df[display_cols].copy()
df_display.columns = ['Organization', 'Site', 'City', 'Org Total Patients', '% Medicaid', '% Uninsured']

df_display['% Medicaid'] = df_display['% Medicaid'].apply(lambda x: f"{x:.1%}")
df_display['% Uninsured'] = df_display['% Uninsured'].apply(lambda x: f"{x:.1%}")

show(df_display, classes="display nowrap compact", paging=True, searching=True)
Table 1
Loading ITables v2.5.2 from the internet... (need help?)

Data Preview

Below is a sample of the raw data feeding this report.

Code
# Display a clean table of just a few relevant columns
# USING CORRECTED COLUMN NAME
display_cols = ['site_name', 'city', 'county', 'type']
df[display_cols].sample(5)
Table 2: Recent Site Data Entry
site_name city county type
2 Lane County Mental Health Eugene Lane Federally Qualified Health Center (FQHC)
138 NHC Mobile Medical Portland Washington Federally Qualified Health Center (FQHC)
298 LETTY OWINGS CENTER Portland Multnomah Federally Qualified Health Center (FQHC)
25 Jefferson High School Student Health Center Portland Multnomah Federally Qualified Health Center (FQHC)
155 UMPQUA COMM HLTH CTR @ DRAIN Drain Douglas Federally Qualified Health Center (FQHC)