論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
指数平滑法
Exponential Smoothing
過去の値を「直近ほど重く・遠いほど軽く」加重平均する時系列予測。Holt法はトレンドにも対応。
時系列指数平滑Holt法
📍 文脈💡 30秒結論

📍 あなたが今見ているもの

論文中に 「指数平滑法」として登場する用語。

指数平滑法 とは:過去の値を「直近ほど重く・遠いほど軽く」加重平均する時系列予測。Holt法はトレンドにも対応。

💡 30秒で分かる結論

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['食料費', '教育費', '住居費']])
plt.show()

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定stats.ttest_ind()
回帰stats.linregress()
分布フィッティングstats.norm.fit()

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

📚 統計学習の総合ガイド

🎯 学習目標

このページの概念をマスターすることで、 以下のスキルが身につきます:

📊 SSDSE-B-2026 データの構造

このコンペの主要データセット(SSDSE-B-2026)の構造:

🔍 主要な変数群

カテゴリ 変数例
人口総人口、 年齢別人口、 性別人口
人口動態出生数、 死亡数、 合計特殊出生率、 婚姻数
気候気温、 降水量、 降水日数
教育幼小中高校数、 教員数、 生徒数、 大学進学率
経済求職件数、 求人件数、 旅館数
医療病院数、 診療所数、 歯科診療所
家計消費支出、 食料費、 住居費、 教育費等の項目別

💡 ジャストインタイム型学習

このガイドは「必要なときに必要な知識」を提供する設計:

🛠️ Python データサイエンス環境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 必須ライブラリのインストール
pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn

# 標準的なインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score, mean_squared_error

# 日本語表示の設定(matplotlib)
plt.rcParams['font.family'] = 'Hiragino Sans'
plt.rcParams['axes.unicode_minus'] = False

# データ読み込み(SSDSE は cp932 エンコーディング)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932')
print(df.shape)
print(df.head())
print(df.describe())

🌟 効果的なEDAテンプレート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def quick_eda(df, target=None):
    """探索的データ分析の基本テンプレート"""
    print(f"Shape: {df.shape}")
    print(f"\nColumn types:\n{df.dtypes}")
    print(f"\nMissing values:\n{df.isnull().sum()}")
    print(f"\nBasic stats:\n{df.describe()}")

    # 数値列の可視化
    numeric_cols = df.select_dtypes(include=[np.number]).columns
    df[numeric_cols].hist(bins=20, figsize=(15, 10))
    plt.tight_layout()
    plt.show()

    # 相関ヒートマップ
    if len(numeric_cols) > 1:
        plt.figure(figsize=(12, 10))
        sns.heatmap(df[numeric_cols].corr(), annot=True, fmt='.2f',
                    cmap='RdBu_r', center=0)
        plt.show()

    # ターゲットがあれば散布図行列
    if target and target in df.columns:
        sns.pairplot(df[numeric_cols[:5]], hue=target if df[target].dtype == 'O' else None)
        plt.show()

📈 報告書テンプレート

分析結果を報告する際の標準的な構成:

  1. 背景・目的:なぜこの分析が必要か
  2. データ:出所、 サンプルサイズ、 期間
  3. 方法:使用した統計手法、 仮定
  4. 結果:図表、 統計量、 検定結果
  5. 解釈:結果が何を意味するか
  6. 限界:分析の制約
  7. 結論:要点まとめ、 今後の課題

🗺️ 統計手法選択フローチャート

Q1: 何を知りたい?

Q2: データの種類は?

Q3: サンプルサイズは?

Q4: 仮定は?

📏 効果量の参照表

p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:

統計量 効果量
2群平均差Cohen's d0.20.50.8
相関r0.10.30.5
線形回帰0.020.130.26
ANOVAη² (eta²)0.010.060.14
χ²Cramér's V0.10.30.5
ロジスティックOdds Ratio1.52.54.0

🚀 実務応用の深掘り

典型的なプロジェクトの流れ

  1. 問題理解:ステークホルダーとの対話、 KGI/KPI 設定
  2. データ収集:内部DB、 公的データ(SSDSE等)、 API
  3. EDA:データの全体像把握、 異常検出
  4. 仮説立案:ドメイン知識からの仮説
  5. モデリング:シンプルから複雑へ段階的に
  6. 検証:CV、 ホールドアウト、 A/Bテスト
  7. 解釈:可視化、 SHAP、 部分依存プロット
  8. 展開:本番デプロイ、 監視

ベストプラクティス

論文・コンペでよく使う言い回し

日本語 英語
統計的に有意statistically significant
効果量effect size
95%信頼区間95% confidence interval (CI)
標本サイズsample size
検出力statistical power
第1種の誤りType I error / false positive
第2種の誤りType II error / false negative
多重比較問題multiple comparisons problem
過学習overfitting
汎化性能generalization
交差検証cross-validation (CV)

統計データ活用コンペでのコツ

🗺️ 概念マップ — 3つの視点で体系を理解する

指数平滑法 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 体系階層に未登録

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「指数平滑法」は緑色でハイライト

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「指数平滑法」は緑色でハイライト

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。

🔖 キーワード索引 — 拡張版

指数平滑法(Exponential Smoothing)に関連する用語を、 モデル・パラメータ・状態空間表現 別に索引化します。

カテゴリキーワード(日本語)キーワード(英語)
基本モデル単純指数平滑、 ホルト法(二重平滑)、 ホルト・ウィンタース法(三重平滑)SES, Holt's, Holt-Winters, ETS
パラメータ平滑化係数(α、 β、 γ)、 減衰係数(φ)、 季節周期alpha, beta, gamma, phi, seasonal period
構成要素水準(level)、 トレンド、 季節成分、 残差level, trend, seasonal, residual
関連モデルARIMA、 SARIMA、 状態空間モデル、 ProphetARIMA, SARIMA, state space, Prophet, DLM
評価指標MAE、 RMSE、 MAPE、 MASE、 AIC、 BICMAE, RMSE, MAPE, MASE, AIC, BIC
実装statsmodels、 prophet、 sktime、 pmdarima、 dartsstatsmodels.tsa, prophet, sktime, darts

🧮 SSDSE-A による月次データ平滑化 — 実値計算例

SSDSE-A から「東京都の月次消費支出(円)」12ヶ月分を取り出し、 単純指数平滑を実行します。

① 元データの月次推移

消費支出(千円)α=0.3 平滑値α=0.7 平滑値
1月320320.0320.0
2月285309.5295.5
3月340318.7326.7
4月295311.6304.5
5月310311.1308.4
12月410(年末増)355.2390.5

② 平滑化の漸化式

Sₜ = α · yₜ + (1 − α) · Sₜ₋₁
例:S₂ = 0.3 × 285 + 0.7 × 320 = 309.5(α=0.3 の場合)
S₂ = 0.7 × 285 + 0.3 × 320 = 295.5(α=0.7 の場合、 直近重視)

③ α の選び方

α = 0.1〜0.3:ノイズが多いデータ、 長期トレンド重視
α = 0.4〜0.6:中庸
α = 0.7〜0.9:直近データ重視、 急変動への追従
自動最適化は 最尤推定 または MSE 最小化

⚠️ 指数平滑法の落とし穴 — 拡張版(実務で本当に困る5+件)

  1. 季節性を見逃した単純平滑:明確な周期性(月次・週次)があるデータに単純指数平滑(SES)を適用すると、 ピークとボトムを取り損ね、 予測誤差が体系的に偏る。 周期性があれば必ず Holt-Winters(ETS(A,N,A)や(M,N,M))か SARIMA を使う。 自己相関プロット(ACF/PACF)で周期性を事前確認するのが鉄則。
  2. α の手動設定による過剰追従/過剰平滑:α を過剰に大きく(0.9以上)すると平滑値がほぼ生データになり、 ノイズに追従しすぎて予測性能が悪化する。 逆に α を小さく(0.05以下)すると変化に反応が遅れ、 構造変化を捉えられない。 statsmodels の ExponentialSmoothing で optimized=True を使い、 最尤推定で自動決定するのが基本。
  3. 欠損値・不規則間隔の扱い:指数平滑は 等間隔の時系列 を前提とする。 月次データで一部の月がない場合、 補完するか状態空間モデルでミッシングを扱う必要がある。 不規則間隔なら Kalman filter ベースの方法(pykalman、 statsmodels の UnobservedComponents)を検討。
  4. トレンドの線形仮定:Holt's 法は線形トレンドを仮定するため、 長期予測では 無限に発散 してしまう。 現実の経済データは飽和や反転を含むため、 「減衰トレンド(damped trend、 φ<1)」を入れることで長期予測を現実的に保つ。 過剰な楽観/悲観予測を防ぐ。
  5. 外挿(予測区間)の過信:点予測だけ報告して予測区間を示さないと、 予測の不確実性が伝わらない。 statsmodels の get_prediction で 95% 予測区間を計算し、 ファネルチャートで可視化する。 「予測値 ± 2σ」を提示する習慣を。
  6. 構造変化への対応の遅れ:コロナ禍のような 体制変化(regime change) が起きると、 過去データの重みが大きい指数平滑は反応が遅れる。 構造変化点を検出(CUSUM、 Bayesian online change point detection)してモデルを再学習する仕組みが必要。
  7. 加法 vs 乗法モデルの選択:季節振幅がレベルに比例して大きくなる場合(売上が大きい月ほど季節変動も大)は乗法モデル、 一定なら加法モデルを使う。 誤った選択は予測精度に致命的影響。 残差プロットで判断する。

🐍 Python 実装バリエーション — statsmodels / prophet / sktime / darts

① statsmodels(標準ライブラリ、 ETSフレームワーク)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing

df = pd.read_csv('data/raw/SSDSE-A-2024.csv', encoding='shift_jis', skiprows=1)
ts = df['消費支出_東京'].astype(float)

# 単純指数平滑(SES)
ses = ExponentialSmoothing(ts, trend=None, seasonal=None).fit(optimized=True)
print('alpha:', ses.params['smoothing_level'])
print('forecast:', ses.forecast(12))

# Holt-Winters(トレンド + 季節)
hw = ExponentialSmoothing(ts, trend='add', seasonal='add',
                          seasonal_periods=12, damped_trend=True).fit()
print(hw.summary())

② statsmodels の状態空間版(より高機能)

1
2
3
4
5
6
7
from statsmodels.tsa.exponential_smoothing.ets import ETSModel

model = ETSModel(ts, error='add', trend='add', seasonal='add', seasonal_periods=12)
res = model.fit()
print(res.summary())
pred = res.get_prediction(start=len(ts), end=len(ts)+11)
print(pred.summary_frame())  # 予測区間付き

③ Prophet(Meta製、 解釈性◎)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
from prophet import Prophet
import pandas as pd

df = pd.read_csv('data/raw/SSDSE-A-2024.csv', encoding='shift_jis', skiprows=1)
prophet_df = df.rename(columns={'年月': 'ds', '消費支出_東京': 'y'})

m = Prophet(yearly_seasonality=True, weekly_seasonality=False)
m.fit(prophet_df)

future = m.make_future_dataframe(periods=12, freq='M')
forecast = m.predict(future)
print(forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail())
m.plot(forecast)

④ sktime(scikit-learn風の時系列API)

1
2
3
4
5
6
7
8
9
from sktime.forecasting.exp_smoothing import ExponentialSmoothing as SktimeES
from sktime.forecasting.base import ForecastingHorizon
import numpy as np

forecaster = SktimeES(trend='add', seasonal='add', sp=12)
forecaster.fit(ts)
fh = ForecastingHorizon(np.arange(1, 13), is_relative=True)
y_pred = forecaster.predict(fh)
print(y_pred)

⑤ darts(深層学習も含む統一API)

1
2
3
4
5
6
7
8
from darts import TimeSeries
from darts.models import ExponentialSmoothing as DartsES

series = TimeSeries.from_dataframe(df, time_col='年月', value_cols='消費支出_東京')
model = DartsES()
model.fit(series)
pred = model.predict(n=12, num_samples=500)  # サンプリングで予測区間
print(pred.quantile_timeseries(0.05), pred.quantile_timeseries(0.95))