論文中に 「指数平滑法」として登場する用語。
指数平滑法 とは:過去の値を「直近ほど重く・遠いほど軽く」加重平均する時系列予測。Holt法はトレンドにも対応。
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データは、 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、 効果量 |
このページの概念をマスターすることで、 以下のスキルが身につきます:
このコンペの主要データセット(SSDSE-B-2026)の構造:
| カテゴリ | 変数例 |
|---|---|
| 人口 | 総人口、 年齢別人口、 性別人口 |
| 人口動態 | 出生数、 死亡数、 合計特殊出生率、 婚姻数 |
| 気候 | 気温、 降水量、 降水日数 |
| 教育 | 幼小中高校数、 教員数、 生徒数、 大学進学率 |
| 経済 | 求職件数、 求人件数、 旅館数 |
| 医療 | 病院数、 診療所数、 歯科診療所 |
| 家計 | 消費支出、 食料費、 住居費、 教育費等の項目別 |
このガイドは「必要なときに必要な知識」を提供する設計:
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()) |
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() |
分析結果を報告する際の標準的な構成:
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
| 統計量 | 効果量 | 小 | 中 | 大 |
|---|---|---|---|---|
| 2群平均差 | Cohen's d | 0.2 | 0.5 | 0.8 |
| 相関 | r | 0.1 | 0.3 | 0.5 |
| 線形回帰 | R² | 0.02 | 0.13 | 0.26 |
| ANOVA | η² (eta²) | 0.01 | 0.06 | 0.14 |
| χ² | Cramér's V | 0.1 | 0.3 | 0.5 |
| ロジスティック | Odds Ratio | 1.5 | 2.5 | 4.0 |
| 日本語 | 英語 |
|---|---|
| 統計的に有意 | 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つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 体系階層に未登録
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「指数平滑法」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「指数平滑法」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
指数平滑法(Exponential Smoothing)に関連する用語を、 モデル・パラメータ・状態空間表現 別に索引化します。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 基本モデル | 単純指数平滑、 ホルト法(二重平滑)、 ホルト・ウィンタース法(三重平滑) | SES, Holt's, Holt-Winters, ETS |
| パラメータ | 平滑化係数(α、 β、 γ)、 減衰係数(φ)、 季節周期 | alpha, beta, gamma, phi, seasonal period |
| 構成要素 | 水準(level)、 トレンド、 季節成分、 残差 | level, trend, seasonal, residual |
| 関連モデル | ARIMA、 SARIMA、 状態空間モデル、 Prophet | ARIMA, SARIMA, state space, Prophet, DLM |
| 評価指標 | MAE、 RMSE、 MAPE、 MASE、 AIC、 BIC | MAE, RMSE, MAPE, MASE, AIC, BIC |
| 実装 | statsmodels、 prophet、 sktime、 pmdarima、 darts | statsmodels.tsa, prophet, sktime, darts |
SSDSE-A から「東京都の月次消費支出(円)」12ヶ月分を取り出し、 単純指数平滑を実行します。
| 月 | 消費支出(千円) | α=0.3 平滑値 | α=0.7 平滑値 |
|---|---|---|---|
| 1月 | 320 | 320.0 | 320.0 |
| 2月 | 285 | 309.5 | 295.5 |
| 3月 | 340 | 318.7 | 326.7 |
| 4月 | 295 | 311.6 | 304.5 |
| 5月 | 310 | 311.1 | 308.4 |
| 12月 | 410(年末増) | 355.2 | 390.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 最小化。
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()) |
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()) # 予測区間付き |
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) |
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) |
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)) |