K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

05 インフレ調整

中級

04.11.6

05 インフレ調整

最終更新 2025-11-05 読了時間 4 分
まとめ
2013 年の 5 万ドルと 2021 年の 5 万ドルは同じ金額でも買えるものが違うので、金額の時系列をそのまま比べるとインフレ分だけ「増えたように」見えます。消費者物価指数(CPI)で各年の値を同じ年のドルに換算した実質値にすると、この歪みが消えます。このページでは full_fred で FRED から米国世帯所得中央値(MEHOINUSA646N、名目値)を取得し、cpi.inflate(金額, 年) で最新年のドルに換算して新しい列 real_value を作ります。最後に FRED が公開している実質値(MEHOINUSA672N)と重ね描きし、2 本がほぼ一致することで換算が正しいことを確かめます。

直感 #

1990 年のラーメンが 500 円、2020 年が 800 円だったとして、ラーメン屋の売上が 1.6 倍になっていても「客が増えた」とは言えません。値上げの分、つまり CPI で測る物価の上昇を取り除いて初めて数量の変化が見えます。CPI は「同じ買い物かごの値段」を年ごとに指数化したもので、2013 年の金額に「最新年の CPI ÷ 2013 年の CPI」を掛けると、最新年のドルで表した実質値になります。cpi.inflate はこの掛け算を、CPI の表を自分で持たずに 1 行で済ませる関数です。

1. 依存ライブラリと設定 #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import os
import cpi
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

from full_fred.fred import Fred

cpi.update()  # CPI データを最新に更新
fred = Fred()  # 環境変数 FRED_API_KEY が設定されている前提

full_fred は FRED の公式 API を簡単に叩けるラッパーです。


2. FRED から系列を取得するヘルパー #

系列 ID と期間を渡すと、日付をインデックスにした DataFrame を返す関数を作ります。名目値と実質値の 2 系列を同じ形で取るために関数化しています。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def get_fred_data(series_id, start="2013-01-01", end=None):
    df = fred.get_series_df(series_id)[["date", "value"]].copy()
    df["date"] = pd.to_datetime(df["date"])
    df["value"] = pd.to_numeric(df["value"], errors="coerce")
    df = df.set_index("date")
    if end:
        df = df.loc[start:end]
    else:
        df = df.loc[start:]
    return df

3. 名目値(Current Dollar)を取得 #

Median Household Income (MEHOINUSA646N) は「Current Dollars, Not Seasonally Adjusted」、つまりその年のドルで表した名目値として公開されているシリーズです。年次データなので 2013 年以降で 9〜10 行になります。

1
2
data = get_fred_data("MEHOINUSA646N", start="2013-01-01")
data.head()

名目値を折れ線で可視化しておきます。

1
2
3
4
plt.figure(figsize=(12, 6))
sns.lineplot(data=data, x="date", y="value")
plt.title("Median Household Income (nominal)")
plt.show()

4. CPI を使って実質化する #

cpi.inflate(名目額, 西暦) で任意の基準年(既定は最新年)に換算できます。ここでは各年の値を最新年の CPI に合わせます。

1
2
3
data["real_value"] = [
    cpi.inflate(row.value, idx.year) for idx, row in data.iterrows()
]

比較すると、物価上昇を除いた実質額(real_value)は過去の年ほど名目額より大きく見え、2 本の線は基準年に向かって近づきます。

1
2
3
4
5
plt.figure(figsize=(12, 6))
sns.lineplot(data=data, x="date", y="value", label="Nominal (MEHOINUSA646N)")
sns.lineplot(data=data, x="date", y="real_value", label="Adjusted by CPI")
plt.legend()
plt.show()

5. 公開済みの実質値と突き合わせ #

FRED にはすでに「Real Median Household Income (MEHOINUSA672N)」もあります。自前で cpi.inflate した値がこれと一致するかで、換算が正しいかを検証します。

1
2
3
4
5
6
7
data_real = get_fred_data("MEHOINUSA672N", start="2013-01-01")

plt.figure(figsize=(12, 6))
sns.lineplot(data=data_real, x="date", y="value", label="MEHOINUSA672N (real)")
sns.lineplot(data=data, x="date", y="real_value", label="MEHOINUSA646N adjusted")
plt.legend()
plt.show()

グラフがほぼ重なれば、CPI による調整が正しく行われていると判断できます。数百ドル程度の小さな差は、FRED が使う CPI-U-RS と cpi ライブラリの CPI-U の違い、および基準年の違いによるものです。


6. 実務 Tips #

基準年はレポート内で統一します。cpi.inflate(value, year, to=2022) のように to 引数を指定すれば任意の年のドルに換算でき、「2022 年ドル」と一度決めたら全図で同じにしておくと混乱しません。月次データを扱う場合は、年ではなく datetime.date(year, month, 1) を渡すと月次 CPI で換算されます。年で渡すと年平均 CPI になり、同じ年の 1 月と 12 月が同じ比率で補正されてしまいます。国や通貨が異なる場合は、cpi ライブラリは米国専用なので、各国統計局や World Bank API の CPI 表を取り込んで inflate と同じ引数の関数を自作しておくと、残りのコードを変えずに差し替えられます。回帰で「伸び率」を扱うならログ差分でもインフレの大部分は相殺できますが、水準値(何ドルか)を年をまたいで比較するなら CPI での実質化が不可欠です。


7. まとめ #

ステップ内容
FRED から名目値を取得full_fred でシリーズ ID を指定
cpi.inflate で実質化行ごとに CPI を適用して新列を追加
公開済み実質値と比較変換が正しいか検証

名目の世帯所得は 2013 年から 2021 年にかけて見かけ上 1.36 倍に増えていますが、cpi.inflate で最新年のドルに揃えると、過去の値ほど上方に補正されて実質の伸びはずっと小さくなります。換算の正しさは、FRED が公開する実質値 MEHOINUSA672N と重ね描きして数百ドル以内で一致することで確認できます。価格や収益を扱う分析では、基準年を 1 つ決めてこのステップを前処理の最初に入れておきます。