Introduction

This report analyzes U.S. residential home values from 2000 to 2025 using the Zillow Home Value Index (ZHVI). The ZHVI tracks the typical home value for single-family homes and condos across all 50 states and Washington D.C. The data is pulled directly from Zillow’s public research database and updated monthly.

The goal of this analysis is to tell a data-driven story about how U.S. home values have evolved over 25 years — through two major economic shocks, a prolonged recovery, and an unprecedented post-pandemic surge. Five visualizations are used to build that story from the national level down to the state level.

Dataset Overview

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
import matplotlib.cm as cm
from matplotlib.ticker import FuncFormatter
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')

state_url = (
    'https://files.zillowstatic.com/research/public_csvs/zhvi/'
    'State_zhvi_uc_sfrcondo_tier_0.33_0.67_sm_sa_month.csv'
)
df_states = pd.read_csv(state_url)

date_cols = [c for c in df_states.columns if c.startswith('2')]

national_ts = df_states[date_cols].mean(axis=0).reset_index()
national_ts.columns = ['date', 'zhvi']
national_ts['date'] = pd.to_datetime(national_ts['date'])
national_ts = national_ts[national_ts['date'] >= '2000-01-01'].reset_index(drop=True)

latest_col = date_cols[-1]
df_snap = df_states[['RegionName', latest_col]].copy()
df_snap.columns = ['State', 'MedianHomeValue']
df_snap = df_snap.dropna().sort_values('MedianHomeValue', ascending=False)

print("=== Descriptive Stats: National ZHVI ===")
## === Descriptive Stats: National ZHVI ===
print(national_ts['zhvi'].describe().apply(lambda x: f'${x:,.0f}'))
## count        $314
## mean     $226,450
## std       $70,697
## min      $126,143
## 25%      $179,394
## 50%      $206,907
## 75%      $254,755
## max      $377,362
## Name: zhvi, dtype: object
print(f"\nMost recent data month: {latest_col}")
## 
## Most recent data month: 2026-02-28
print("\nTop 5 most expensive states:")
## 
## Top 5 most expensive states:
print(df_snap.head(5).to_string(index=False))
##                State  MedianHomeValue
##               Hawaii    823969.886707
##           California    765036.019732
##        Massachusetts    642386.737927
##           Washington    592562.267438
## District of Columbia    574199.078791
print("\nTop 5 most affordable states:")
## 
## Top 5 most affordable states:
print(df_snap.tail(5).to_string(index=False))
##         State  MedianHomeValue
##      Arkansas    219753.934115
##      Oklahoma    216242.122759
##     Louisiana    208930.126233
##   Mississippi    189895.113507
## West Virginia    169779.858230

The dataset contains 51 regions (50 states plus Washington D.C.) and over 300 monthly data points per region. The national median home value has ranged from roughly $125,000 to over $370,000 across the full time period. As of the most recent data, Hawaii and California sit at the top of the market while West Virginia and Mississippi remain the most affordable states in the country.

Visualization 1: National Home Values Over Time

fig, ax = plt.subplots(figsize=(12, 5))
ax.plot(national_ts['date'], national_ts['zhvi'], color='steelblue', linewidth=1.8)
ax.axvspan(pd.Timestamp('2007-12-01'), pd.Timestamp('2012-01-01'), alpha=0.1, color='red', label='2008 Crisis')
ax.axvspan(pd.Timestamp('2020-03-01'), pd.Timestamp('2022-12-01'), alpha=0.1, color='green', label='COVID Boom')
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, p: f'${x/1000:.0f}K'))
ax.set_xlabel('Year', fontsize=11)
ax.set_ylabel('Typical Home Value (USD)', fontsize=11)
ax.set_title('U.S. Home Values Over Time: 2000–2025\nZillow Home Value Index (ZHVI)', fontsize=13)
ax.legend(fontsize=9)
ax.grid(axis='y', linestyle='--', alpha=0.5)
plt.tight_layout()
plt.show();

This line chart establishes the foundation of the entire report. The national ZHVI climbed steadily through the early 2000s housing boom before collapsing during the 2008 financial crisis, shaded in red. What followed was a slow, grinding recovery that lasted nearly a decade. Then came COVID-19. Beginning in mid-2020, home values surged at a pace the market had never seen before — driven by low interest rates, remote work demand, and constrained housing supply. The shaded green region captures that two-year window where the market essentially repriced itself. By 2025, the national median sits nearly three times higher than it was at the start of the century.

Visualization 2: Most Expensive vs. Most Affordable States

df_sorted = df_snap.sort_values('MedianHomeValue', ascending=True)
df_plot = pd.concat([df_sorted.head(10), df_sorted.tail(10)]).reset_index(drop=True)
colors = ['tomato'] * 10 + ['steelblue'] * 10
fig, ax = plt.subplots(figsize=(10, 9))
ax.barh(df_plot['State'], df_plot['MedianHomeValue'], color=colors, edgecolor='white', height=0.6)
ax.xaxis.set_major_formatter(FuncFormatter(lambda x, p: f'${x/1000:.0f}K'))
ax.set_xlabel('Typical Home Value (USD)', fontsize=11)
ax.set_title(f'U.S. Home Values by State: Top 10 vs. Bottom 10 ({latest_col[:7]})\nZillow Home Value Index (ZHVI)', fontsize=13)
ax.axhline(y=9.5, color='gray', linewidth=0.8, linestyle='--')
ax.grid(axis='x', linestyle='--', alpha=0.5)
ax.legend(handles=[mpatches.Patch(color='steelblue', label='Most Expensive'), mpatches.Patch(color='tomato', label='Most Affordable')], fontsize=9)
plt.tight_layout()
plt.show();

The first chart shows the national trend. This one shows where that trend hits differently depending on where you live. The gap between the most and least expensive states is striking. Hawaii and California both exceed $700,000 in median home value, while West Virginia sits below $175,000. This is not just a coastal vs. inland story — it reflects differences in job markets, population density, land scarcity, and local economic conditions. For someone trying to buy a first home, the state they live in matters as much as anything else about the market.

Visualization 3: Year-over-Year Growth Rate

national_ts['yoy_pct'] = national_ts['zhvi'].pct_change(12) * 100
yoy = national_ts.dropna(subset=['yoy_pct']).copy()
bar_colors = ['steelblue' if v >= 0 else 'tomato' for v in yoy['yoy_pct']]
fig, ax = plt.subplots(figsize=(12, 5))
ax.bar(yoy['date'], yoy['yoy_pct'], color=bar_colors, width=25, edgecolor='none')
ax.axhline(y=0, color='black', linewidth=0.8)
ax.yaxis.set_major_formatter(FuncFormatter(lambda x, p: f'{x:.1f}%'))
ax.set_xlabel('Year', fontsize=11)
ax.set_ylabel('Year-over-Year Change (%)', fontsize=11)
ax.set_title('U.S. Home Value Growth Rate: Year-over-Year % Change\nZillow Home Value Index (ZHVI)', fontsize=13)
ax.grid(axis='y', linestyle='--', alpha=0.5)
ax.legend(handles=[mpatches.Patch(color='steelblue', label='Appreciation'), mpatches.Patch(color='tomato', label='Depreciation')], fontsize=9)
plt.tight_layout()
plt.show();

The first chart shows the level of home values. This one shows the speed. The year-over-year percentage change makes the 2021–2022 period impossible to ignore — annual appreciation briefly exceeded 15%, a rate not seen at any point in the prior two decades. The red bars around 2008–2012 show the only sustained period of national depreciation in the dataset. What this chart adds to the story is perspective on velocity. A market that looks stable on a trend line can still be moving very fast underneath. The post-COVID spike in this chart is the clearest evidence of how dislocated the market became in a short window of time.

Visualization 5: Heatmap — All States by Year

year_cols = {}
for col in date_cols:
    year = col[:4]
    if year not in year_cols and int(year) >= 2005:
        year_cols[year] = col
years_to_show = sorted([y for y in year_cols.keys() if int(y) % 2 == 1])
cols_to_use = [year_cols[y] for y in years_to_show]
df_heat = df_states[['RegionName'] + cols_to_use].copy().dropna()
df_heat = df_heat.set_index('RegionName')
df_heat.columns = years_to_show
df_heat = df_heat.sort_values(years_to_show[-1], ascending=False)
df_heat_k = df_heat / 1000
fig, ax = plt.subplots(figsize=(14, 13))
sns.heatmap(df_heat_k, cmap='YlOrRd', linewidths=0.4, linecolor='white', annot=True, fmt='.0f', annot_kws={'size': 7}, cbar_kws={'label': 'Median Home Value ($000s)', 'shrink': 0.6}, ax=ax)
ax.set_xlabel('Year', fontsize=11)
ax.set_ylabel('State', fontsize=11)
ax.set_title('Median Home Value by State and Year ($000s)\nZillow Home Value Index (ZHVI)', fontsize=13)
ax.tick_params(axis='x', labelsize=9, rotation=0)
ax.tick_params(axis='y', labelsize=8)
plt.tight_layout()
plt.show();

This heatmap brings everything together. Every state, every other year from 2005 to 2025, with color intensity reflecting home value. The darkening of the entire grid from left to right confirms the national appreciation trend. But the real story is in the contrast between rows. States at the top of the chart — Hawaii, California, Massachusetts — have been dark orange for years. States at the bottom have barely changed shade. The 2021 and 2023 columns are noticeably darker than those immediately before them, a visual confirmation of the post-COVID repricing seen in Charts 1 and 3. This chart works as a summary — it lets you scan the entire dataset in one view.

Conclusion

Taken together, these five visualizations tell a consistent story. U.S. home values have appreciated significantly over 25 years, but that appreciation has not been evenly distributed across time or geography. Two events — the 2008 financial crisis and the COVID-19 pandemic — define the modern housing market. The crisis created a lost decade of value for millions of homeowners. The pandemic created the fastest appreciation cycle on record. Where you live determines how much of that story applies to you. High-cost coastal states have pulled further ahead while affordable interior markets have remained largely flat. For anyone trying to understand housing affordability, the data makes clear that the problem is structural and has been building for a long time.