🍰 まずはやさしく
AIにとっての教科書のようなものです。
モデルにルールを学習させるために使います。
テスト勉強で使う問題集のような役割です。
この章では結論と使いどころを学びます。
訓練データ(Training Data):モデルのパラメータを学習するために使うデータ
A:原理的には可能ですが、 47 サンプルでは深層モデルのパラメータ(数千〜数百万)に対して圧倒的に不足。 線形回帰や決定木が現実解。 深層学習をしたいなら、 多年度(12 年分 = 564 サンプル)に拡張し、 さらに自己教師事前学習で補強しましょう。
A:いいえ。 学習曲線が既にプラトーに達していたら、 増やしても無駄。 質の悪いデータを増やすと逆効果なことすらあります。
A:validation は「ハイパーパラメータ選びや early stopping のための内部用」、 test は「最終発表用の 1 回切り」。 test を何度も見て調整すると、 それは事実上 validation になってしまい、 過適合が起きます。
A:(1) SMOTE などのオーバーサンプリング、 (2) 少数クラスの重み増加(class_weight='balanced')、 (3) 評価指標を accuracy ではなく F1 / ROC-AUC に変える、 のいずれかを使います。
A:(1) 正則化を強める(L1/L2/dropout)、 (2) より単純なモデルを使う、 (3) データ拡張(augmentation)、 (4) 転移学習・事前学習済みモデルの利用、 (5) k-fold CV で全データから情報を絞り出す、 が定石。
A:実装上は test.csv を別フォルダに置き、 EDA すらしない(分布を覗くと、 知らずに過適合が始まる)。 最終的に「これが本番」と決めたモデルで 1 回だけ評価し、 その値を報告。 値が悪くてもモデルを変えてはいけない(変えるなら新しい test を別途用意)。
A:少量(<5%)なら多くのモデルは耐性があります。 ただし深層学習はノイズを「覚え込んでしまう」性質があり、 early stopping や label smoothing が有効。 SSDSE のような公的統計はノイズが少ないので心配無用です。
A:定期的にモデルを再訓練する(オンライン学習、 monthly retrain)。 SSDSE-B の場合、 人口の長期トレンドは緩やかですが、 出生率や転出入は急変するので、 5 年ごとには再学習が必要です。
A:はい、 これは「多重比較問題」と呼ばれます。 100 個のモデルを試して最良のものを選ぶと、 偶然 test に合致した可能性が無視できません。 ボンフェローニ補正や、 nested CV で対処します。
A:必須。 DVC(Data Version Control)、 LakeFS、 MLflow Tracking などで管理。 「どのデータでどの精度が出た」を再現できなければ、 共同研究も regulatory audit も通りません。
訓練データの議論は、「もっとデータを集めれば精度が上がる」「ラベルが正しければ大丈夫」と単純化されがちです。 しかし実務では、 量と質と分布の三つを同時に意識しないと、 学習曲線は思った方向に動きません。 ここでは SSDSE-B-2026(独立行政法人統計センターが公開する 47 都道府県データセット、 教育用標準データセット)の実数値を題材に、 三つの視点(散布の構造、 分布の歪み、 群間比較)を可視化し、 訓練データとして「使える状態」と「使ったら危険な状態」を見分ける目線を養います。
回帰タスクの訓練データを設計する出発点は、 説明変数と目的変数の散布図を眺めることです。 直線関係に見えるのか、 非線形なのか、 外れ値があるのか、 ヘテロスケダスティシティ(分散の不均一)が見えるのかで、 必要な訓練サンプル数や前処理が変わります。 たとえば SSDSE-B-2026 の「総人口(A1101)」と「一般診療所数(I5102)」を散布図にすると、 強い正の相関(r ≒ 0.972)が見える一方、 東京・大阪・神奈川・愛知の 4 都府県が右上に大きく離れて分布し、 残り 43 県はずっと小さなレンジに圧縮されます。 こうしたデータをそのまま線形回帰の訓練データに渡すと、 大都市の影響で勾配が支配され、 地方を「予測すると過大」になる傾向が出ます。
図の見方は次の通りです。 (1) 雲が右肩上がりかどうか → 線形回帰や Ridge が候補。 (2) 雲がカーブしているか → 多項式や決定木、 GBDT を検討。 (3) 雲の外に孤立した点が散っているか → 外れ値除去か、 ロバスト回帰(Huber, RANSAC)を検討。 (4) 雲の幅が右側で広がっているか → ヘテロスケダスティシティ。 対数変換や重み付き回帰が必要。 訓練データの「形」を見ずにモデルだけ差し替えても、 性能は伸びません。
目的変数が大きく歪んでいる訓練データは、 二乗誤差(MSE)で評価すると上位の値に過剰に引きずられます。 SSDSE-B-2026 の「総人口」をヒストグラムにすると、 200 万人未満に 30 県前後が集中し、 1000 万人超に東京 1 県だけが孤立する典型的な右裾分布になります。 こうした分布で平均二乗誤差を最適化すると、 学習器は「とにかく大都市を当てに行く」戦略になり、 地方の予測誤差は無視されます。 対処は (a) 対数変換、 (b) ターゲットの分位変換、 (c) 損失関数を MAE / Huber に切り替える、 のいずれかです。
特に「学習データの分布」と「テストデータの分布」がずれていると、 学習器は学習時に見ていない領域に外挿することになり、 予測精度は急落します。 これを covariate shift と呼びます。 SSDSE-B のように年度違いのデータを学習・テストに分ける場合、 政策変更や経済ショックで分布がずれることがあります。 まずヒストグラムを重ねて分布の重なりを確認し、 重なりが乏しい領域があれば、 そこは「予測できない領域」として最初から除外するのが安全策です。
分類・クラスタリングタスクの訓練データを設計するとき、 各グループの分布が大きく違うかどうかを箱ひげ図で確認します。 たとえば SSDSE-B-2026 の 47 県を KMeans でクラスタリングし、 クラスタ別に「一般診療所数(I5102)」を箱ひげ図で並べると、 大都市圏を含むクラスタは中央値もばらつきも大きく、 地方県中心のクラスタは小さなレンジに収まるという「群間格差」が明確に見えます。 もしこのデータで「クラスタ(都市規模タイプ)を当てる」分類器を作るなら、 群間で重なる部分がどこにあるかが分類精度の上限を決めます。 ここを見ずにロジスティック回帰を投入しても、 重なる範囲では何を入れても予測は揺れます。
群間の差を可視化したら、 次に「群ごとのサンプル数」を必ず点検します。 SSDSE-B の地域ブロックでいえば、 関東 7 都県 vs 四国 4 県のように、 単純な県数ベースで大きな差があります。 サンプル数の少ない群はモデルの予測が不安定になりやすく、 マクロ F1 やバランス精度といった指標で評価しないと、 多数派に引きずられた「見かけ上の高精度」になります。 これも訓練データを「集める前」に決めておく設計事項です。
🍰 まずはやさしく
機械学習でとても重要な言葉です。
分析の基礎を身につけるために使います。
都道府県のデータを使って練習します。
おすすめの読み方と全体の流れを説明します。
このページは「訓練データ(Training Data)」の用語解説です。 機械学習の基礎カテゴリにおける重要概念で、 機械学習の基礎 グループ教材の中で繰り返し登場します。 数式・実コード・落とし穴を 1 ページに集約し、 SSDSE-B-2026 都道府県データ(47 件 × 112 列)を題材に 手を動かしながら理解できるよう構成しています。
別称:学習データ / Training Set。 まず 💡 30秒結論 で全体像を、 次に 🎨 直感 → 📐 数式 → 🧮 実値 → 🐍 Python の順で読むのがおすすめ。
🍰 まずはやさしく
AIが答えを覚えるための教材です。
正しく予測できるようにするために使います。
部活の過去問で傾向を掴む感覚に似ています。
データの分け方と注意点について学びます。
訓練データはモデルが「パラメータを覚える」ための教材です。 良い訓練データの条件:① 量が十分、 ② 偏りが小さい、 ③ ラベル品質が高い、 ④ 本番分布と近い。 4 つのどれが欠けても汎化性能は伸びません。
訓練と検証・テストの境界を保つことが鉄則。 訓練データに 検証・テストの情報が混ざる(リーケージ)と、 報告した精度が本番で再現しません。 47 県データのような小規模では、 ホールドアウトより k 分割 CV が安定。
「訓練データ」と一口にいっても、 実務では train(学習用)・validation(モデル選択用)・test(最終評価用) の 3 つに分けるのが基本です。 SSDSE-B-2026 の 47 都道府県 × 多年度(2012〜2023 年)データを使い、 具体的な分割比率と注意点を見ていきます。
| サンプル数 | train | validation | test | 補足 |
|---|---|---|---|---|
| ~ 100(SSDSE-B 47 県 ×1 年 = 47 サンプル) | 60% | 20% | 20% | k-fold CV を併用必須 |
| 100 ~ 10,000(SSDSE-B 多年度 = 564) | 70% | 15% | 15% | 標準的な比率 |
| 10,000 ~ 1,000,000 | 80% | 10% | 10% | 多くの教科書の例 |
| 1,000,000 以上(深層学習) | 98% | 1% | 1% | val/test も 1% で十分大きい |
SSDSE-B-2026 を単年度(2023 年度)に絞ると 47 サンプルしかなく、 これは 機械学習にとってかなり小規模です。 単純な 60:20:20 分割では test が 9 県しかなく、 評価のばらつきが大きすぎて結論が出せません。 そのため、 SSDSE-B の場合は k-fold(k=5 か k=10)クロスバリデーションと組み合わせるのが正攻法です。
このコードでやること:SSDSE-B-2026 の 47 都道府県を train(30 県)/val(8 県)/test(9 県)に分割し、 各セットの行数と人口の平均を比較する。
📥 入力データ:SSDSE-B-2026.csv(cp932 エンコード、 564 行 × 112 列 = 47 県 × 12 年。 2023 年度でフィルタして 47 行)。 主要列は Prefecture(都道府県名)と A1101(総人口)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import pandas as pd from sklearn.model_selection import train_test_split df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)] X = df[['A1301', 'A1302', 'A1303']] # 15歳未満/15-64/65歳以上 y = df['A1101'] # 総人口 # Step 1: train (38) と test (9) に分割 X_trv, X_te, y_trv, y_te = train_test_split(X, y, test_size=9, random_state=42) # Step 2: train (30) と val (8) に分割 X_tr, X_val, y_tr, y_val = train_test_split(X_trv, y_trv, test_size=8, random_state=42) print(f'train: {len(X_tr)}県, 平均人口 {y_tr.mean():,.0f} 人') print(f'val: {len(X_val)}県, 平均人口 {y_val.mean():,.0f} 人') print(f'test: {len(X_te)}県, 平均人口 {y_te.mean():,.0f} 人') |
📤 実行例:
💬 train の平均人口(約 216 万人)に対し、 test の平均人口(約 441 万人)は 2 倍以上に膨らんでいる(東京・大阪などの大都市が偶然 test 側に偏った)→ 少数サンプルでは分割の偶然による偏り(split bias)が無視できない。 これが SSDSE-B で k-fold CV が事実上必須になる理由です。
🍰 まずはやさしく
学習に使うデータの集まりのことです。
必要なデータの量を決めるために使います。
スマホのアプリが賢くなる仕組みに似ています。
数式とプログラムでの書き方を学びます。
本概念は次のように記述されます(KaTeX で描画)。
英語名 Training Data。 別称:学習データ / Training Set。
「訓練データはいくつ必要ですか?」は最も多い質問の 1 つです。 答えは 「学習曲線(learning curve)を描いて、 まだ右肩下がりなら集める、 プラトーに達していれば不要」。 数式と sklearn の実装を見ていきます。
学習サンプル数 $n$ の関数として、 訓練誤差 $E_{\text{train}}(n)$ と検証誤差 $E_{\text{val}}(n)$ は以下のように振る舞います(PAC-Bayes の典型形):
$$E_{\text{train}}(n) \;\xrightarrow{n\to\infty}\; E^* + \mathcal{O}\!\left(\frac{1}{\sqrt{n}}\right)$$
$$E_{\text{val}}(n) \;\xrightarrow{n\to\infty}\; E^* + \mathcal{O}\!\left(\sqrt{\frac{d \log n}{n}}\right)$$
ここで $E^*$ は 達成可能な最小誤差(ベイズ誤差)、 $d$ はモデルの VC 次元(複雑さの指標)です。
このコードでやること:SSDSE-B-2026 の 47 県で、 サンプル数を 10, 20, 30, 37 と段階的に増やしながら線形回帰の R² を測り、 学習曲線を取得する(cv=5 のため訓練側の上限は 47 × 4/5 ≒ 37 件)。
📥 入力データ:SSDSE-B-2026 の 47 県 × 特徴量(A1301, A1302, A1303 = 年齢 3 区分人口)、 ターゲット(I5102 = 一般診療所数)。 なお A1101(総人口)をターゲットにすると A1301+A1302+A1303 の和そのものになり、 完全なターゲット漏洩(R² = 1.000)になるため、 別領域の列を予測します。
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 sklearn.linear_model import LinearRegression from sklearn.model_selection import learning_curve df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)] X = df[['A1301', 'A1302', 'A1303']].values y = df['I5102'].values # 一般診療所数 sizes, train_sc, val_sc = learning_curve( LinearRegression(), X, y, train_sizes=[10, 20, 30, 37], cv=5, scoring='r2', shuffle=True, random_state=42) for s, t, v in zip(sizes, train_sc.mean(axis=1), val_sc.mean(axis=1)): print(f'n={s}: train R²={t:.3f}, val R²={v:.3f}') |
📤 実行例:
💬 n=30 で val R² が 0.87 前後まで上がり、 それ以降はほぼ横ばい → これ以上データを増やしても線形回帰の性能は大きくは伸びない。 これは「特徴量と目的変数の関係が線形でほぼ説明し尽くされている」ことを意味します。 もし R² がまだ 0.5 だったら、 モデルを変える(Random Forest など)か特徴量を増やすべき、 という診断結果になります。
「訓練データは何件あればよいか」は、 機械学習の最頻出質問のひとつです。 質問の前に「タスクの性質」「モデルの表現力」「ノイズ水準」「許容誤差」の四点を明示しないと答えは出ません。 ここでは、 実務で広く使われている経験則と、 学習理論からの下限見積もりを並べて整理します。 SSDSE-B-2026 のような中規模データセット(2023 年度分で 47 行 × 112 列)に当てはめると、 線形モデルや決定木では十分、 深層学習や勾配ブースティングでは不足、 という判断軸が立ちます。
| 経験則 | 出典・根拠 | 必要 N の目安 | SSDSE-B 47 県への当てはめ |
|---|---|---|---|
| 10:1 ルール(説明変数 1 つに対し最低 10 サンプル) | 医学・社会科学の伝統的指針 | 説明変数 5 個なら 50 件以上 | 説明変数 4 個までなら 47 県で許容範囲 |
| VC 次元の 10 倍 | PAC 学習理論 | 線形分類器なら数十〜数百 | 線形なら 47 件で機能、 多項式は不足 |
| パラメータ数の 10 倍 | 深層学習の「目安」 | 1 万パラメータなら 10 万件 | 深層学習は 47 件では完全に不足 |
| クラスあたり 100 件(画像分類) | ImageNet 系の指針 | 10 クラスなら 1000 件以上 | 地域 8 ブロック分類なら 800 件相当が理想 |
| 統計検出力分析(α=0.05, 1−β=0.8) | Cohen (1988) | 効果量と分散から逆算 | 中程度効果なら 47 県で検出可能 |
| 学習曲線がプラトーに達するまで | 経験ベース | 追加で精度が伸びなくなった点 | 実験で見極める(最も信頼性高い) |
| クロスバリデーション可能な最低限 | k-fold の k を確保 | 5-fold なら 50 件以上、 LOO なら任意 | 47 県は LOO が現実解 |
どの経験則を採用するかは、 タスクとモデルで決めます。 線形モデル+少数変数なら 47 件で機能しますが、 勾配ブースティングや深層学習なら数百〜数十万件のオーダーが必要です。 SSDSE-B-2026 のように「量で勝負できない」データでは、 (1) 特徴量エンジニアリングで情報密度を上げる、 (2) ベイズ的事前分布で正則化する、 (3) ドメイン知識を制約として埋め込む、 のいずれかで補います。 量を増やせないなら、 質と構造で勝負するということです。
| タスク | モデル | 推奨 N | N が不足したときの兆候 |
|---|---|---|---|
| 2 値分類 | ロジスティック回帰 | 200 件〜 | 係数の信頼区間が広い、 CV 精度が揺れる |
| 2 値分類 | XGBoost | 2,000 件〜 | 過適合、 valid と train の差が大きい |
| 多クラス分類 | CNN(画像) | クラス × 1,000 件〜 | マイノリティクラスで再現率が崩壊 |
| 回帰 | 線形回帰 | 100 件〜 | 残差プロットでパターンが見える |
| 回帰 | 勾配ブースティング | 5,000 件〜 | テスト RMSE が学習 RMSE の 2 倍以上 |
| 時系列予測 | ARIMA | 100 期〜 | 予測区間が異常に広がる |
| 時系列予測 | LSTM | 10,000 期〜 | 学習が収束しない、 loss が振動 |
| テキスト分類 | BERT ファインチューニング | クラス × 500 件〜 | 少数クラスを全部ゼロに予測する |
量が確保できても、 質が悪い訓練データではモデルは育ちません。 「質」を構成する要素は、 完全性・正確性・一貫性・代表性・適時性・関連性・解釈可能性・公平性の八つに整理できます。 SSDSE-B-2026 のような公的統計は完全性・正確性・一貫性で高得点ですが、 「47 県という標本は何の母集団を代表するか」という代表性は、 用途次第で慎重に判断する必要があります。
| 質の軸 | 確認方法 | SSDSE-B-2026 での得点 | 代表的な失敗例 |
|---|---|---|---|
| 完全性 (Completeness) | df.isna().sum() で欠損確認 | 高(公的統計、 ほぼ欠損なし) | スクレイピングデータで重要列が 30% 欠損 |
| 正確性 (Accuracy) | 複数ソースとの照合、 外れ値検査 | 高(統計法に基づく集計) | 手入力ラベルで誤字が混在 |
| 一貫性 (Consistency) | 単位・命名規約の統一を点検 | 高(命名規約が厳格) | 同じ意味の列が複数存在し値が違う |
| 代表性 (Representativeness) | 母集団と標本の分布比較 | 中(47 県 = 都道府県集計、 個人レベルではない) | 都市部のスマホアプリログだけで全国を語る |
| 適時性 (Timeliness) | データの参照年と運用時点の比較 | 中(年次更新、 月次変動は捉えない) | 3 年前のデータで現在の意思決定をする |
| 関連性 (Relevance) | タスクの目的と列の対応付け | タスク依存(人口・経済予測には高、 個別行動予測には低) | 関係ない列を片っ端から入れて次元の呪い |
| 解釈可能性 (Interpretability) | 列名・単位・出典の明示 | 高(コードブック完備) | 列名が x1, x2, ... で後から意味が分からない |
| 公平性 (Fairness) | 部分集団別の精度・誤差の比較 | 中(都市・地方で精度差が出やすい) | マイノリティ群の予測誤差が 3 倍大きい |
八つの軸を全部 100 点にするのは現実的ではありません。 「このタスクではどの軸を優先するか」を最初に宣言し、 残りはトレードオフとして許容範囲を決めるのが実務的です。 たとえば SSDSE-B-2026 を使った県別の消費支出(L3221)予測なら、 完全性・正確性・一貫性・解釈可能性が最重要で、 代表性は「都道府県集計レベル」と限定すれば許容、 公平性は「都市・地方の精度差」を必ず別途報告する、 という線引きになります。
データリーケージ(data leakage)とは、 「訓練時に本来知り得ない情報がモデルに漏れ込んでしまい、 学習データ上は高精度に見えるが本番では崩壊する」状態を指します。 訓練データを設計するときに最も恐ろしいバグであり、 静かに起き、 静かに精度を持ち上げ、 本番で初めて露見します。 ここでは代表的な 10 類型を、 SSDSE-B-2026 を含む実務例と一緒に整理します。
| 類型 | 発生例 | 兆候 | 対処 |
|---|---|---|---|
| ①目的変数の派生情報 | 「死亡率」を予測したいのに「死者数 ÷ 人口」を特徴量にしてしまう | 精度が 0.99 を超える | 特徴量と目的変数の派生関係を全部書き出す |
| ②未来情報の混入 | 2025 年予測なのに 2026 年の月次データが含まれる | 時系列で時刻順 CV をすると精度が急落 | 特徴量に「時刻スタンプ」を必ず付ける |
| ③前処理の全データ実施 | train+test 全部で標準化してから分割 | 過剰に滑らかな学習曲線 | Pipeline で分割後に fit_transform |
| ④グループ単位の漏洩 | 同じ患者の異なる時点が train と test 両方にある | 他施設データで精度が崩れる | GroupKFold でグループ単位に分割 |
| ⑤ラベル付け時の参照 | ラベル付け担当者が「特徴量」を見て決めた | 人間が決めた特徴量だけが効く | ラベル付けは盲検で行う |
| ⑥重複サンプル | 同じ行が train と test に重複 | k-NN の精度が k=1 で異常に高い | drop_duplicates() を必ず通す |
| ⑦集計関数の事前計算 | 全期間の平均で「カテゴリ別平均」を計算してから CV | CV 精度と保留テスト精度に乖離 | 集計も fold 内で実施 |
| ⑧情報の高密度な ID | 「ユーザー ID 連番」が時系列を暗黙に含む | ID をシャッフルすると精度が下がる | ID は特徴量に入れない、 もしくは hash 化 |
| ⑨情報含有のテキスト | レビュー本文に「キャンセル」の単語が入っているとキャンセル予測の正解 | テキスト由来の特徴量だけで完璧 | post-event の語彙を除去 |
| ⑩外部公開データの再混入 | 事前学習済みモデルがテスト集合を学習済み | 未公開データでだけ精度が低い | 外部モデルの学習データ範囲を確認 |
リーケージは「異常に良い結果」というシグナルで察知するしかなく、 完全な検出器は存在しません。 SSDSE-B-2026 のようなクロスセクション(横断面)データでは、 ②未来情報の混入や④グループ漏洩は起こりにくい代わりに、 ①目的変数の派生情報(たとえば「失業率」を予測するのに「就業者数」を特徴量にする)や③前処理の全データ実施が起こりがちです。 訓練データを触り始める前に、 各列が「いつ・誰が・どのタイミングで得た情報か」を全部書き出す習慣を持ちましょう。
教師あり学習の訓練データの上限は、 ラベル(教師信号)の品質で決まります。 ラベルが揺らいでいれば、 どれだけ複雑なモデルを投入しても、 揺らぎ以上の精度は出ません。 ラベル設計は、 「定義文書」「複数アノテーターの合意」「曖昧ケースの仲裁ルール」「品質モニタリング」の四点セットで運用するのが定石です。 SSDSE-B-2026 のような公的統計は、 統計法に基づく定義と検査工程があり、 ラベル品質は事実上担保されています。 対して企業内で集めたデータでは、 ラベル付け作業を最も慎重に設計する必要があります。
| 工程 | 目的 | 代表的な手法 | SSDSE-B-2026 への当てはめ |
|---|---|---|---|
| ①ラベル定義 | 何を陽性と呼ぶかを文書化 | 定義書 + ポジ/ネガ例示集 | 「高齢化率 30% 以上を高齢自治体と呼ぶ」など閾値定義 |
| ②ラベル付け担当の訓練 | 複数人で同じ基準を共有 | サンプル 50 件で合意率を測定 | SSDSE は事前定義済みなので不要 |
| ③複数アノテーター | 主観差・誤差を平均化 | 最低 2 人、 重要案件は 3 人以上 | 公的統計は不要、 派生指標を作る場合は実施 |
| ④合意率の測定 | Cohen の κ、 Krippendorff の α | κ > 0.7 が一つの目安 | SSDSE では概念上不要 |
| ⑤曖昧ケースの仲裁 | 専門家のレビュー | 毎週レビュー会 | SSDSE 統計委員会が同等の機能 |
| ⑥定期的な品質監査 | 古いラベルを再確認 | 月次サンプリング監査 | 統計局の改定で対応 |
| ⑦アクティブラーニング | モデルが迷う事例を優先ラベル付け | 不確実性サンプリング | 派生ラベル作成時に有効 |
| ⑧バージョン管理 | ラベル変更の履歴 | git or DVC で管理 | SSDSE-B-2026 という年度自体がバージョン |
SSDSE-B-2026 のような公的統計を「直接」訓練データに使う場合は、 上記の工程の多くは省略できますが、 派生ラベル(たとえば「人口減少自治体かどうか」のフラグ)を作って分類タスクに展開する場合は、 自分で工程を運用する必要があります。 閾値の正当性、 例外処理、 改定時の取り扱いを定義書として整え、 「いつ・誰が・どう決めたか」を残しましょう。
訓練データは「集めただけ」では学習用に使えません。 クラス比のバランス、 時系列のシフト、 サンプリングの偏りを点検し、 必要なら再構成する工程が入ります。 SSDSE-B-2026 のように単年度に絞ると 47 県分しかない小さいデータでも、 「都市・地方の二値分類」「東日本・西日本の比較」のように分割した瞬間に、 群間のサンプル数が不均衡になります。 これを放置すると、 多数派のラベルを返す「定数予測器」と同等の精度で「動いているように見える」モデルが出来上がります。
| 問題 | 兆候 | 対処手段 | 注意点 |
|---|---|---|---|
| クラス不均衡(1:99 など) | accuracy が高いが少数派 recall = 0 | SMOTE / class_weight / 評価指標を F1 に変更 | SMOTE は test fold には適用しない |
| 分布シフト(時系列) | 本番運用で精度が徐々に低下 | 定期再学習、 オンライン学習、 シフト検出器 | 再学習頻度の決定にビジネス判断が必要 |
| 選択バイアス | 特定群が過小代表 | 層化サンプリング、 IPW 重み付け | 重みの誤推定が新たな偏りを生む |
| 自己選択(self-selection) | アンケート回答者だけのデータ | 操作変数法、 Heckman 二段階推定 | SSDSE は全数調査が中心、 リスクは低い |
| サバイバーシップバイアス | 廃業企業が抜けている | 廃業データを別系統から取得 | 取得困難な場合、 結果の解釈を限定する |
| 測定誤差の累積 | 説明変数のノイズが回帰係数を縮める | 誤差in変数モデル、 reliability ratio 補正 | 誤差量を別途推定する必要あり |
SSDSE-B-2026 で 8 地域ブロック分類器を作る場合、 関東 7 都県 vs 北陸 3 県のような不均衡が必ず出ます。 解決策は「最小群を基準に下方サンプリングして全群を 3 県に揃える」か、 「class_weight='balanced' で重みを付ける」か、 「マクロ F1 で評価して全クラス公平に扱う」のいずれかです。 47 県という小さなデータでは下方サンプリングは情報損失が大きいので、 後二者が現実的でしょう。
訓練データを物理的に増やせないとき、 三つの戦略があります。 (1) データ拡張(既存データに変換を加えて疑似的に増やす)、 (2) 合成データ生成(GAN や diffusion model で新規データを作る)、 (3) 半教師あり学習(ラベルなしデータをモデルが自分でラベル付けして使う)。 SSDSE-B-2026 のような構造化数値データでは、 画像のような単純な反転・回転は使えませんが、 別の形のデータ拡張(ノイズ注入、 ブートストラップ、 ミックスアップ)が有効です。
| 戦略 | 想定領域 | 代表手法 | SSDSE-B での適用例 | リスク |
|---|---|---|---|---|
| 回転・反転・クロップ | 画像 | torchvision.transforms | N/A(数値表データ) | 過剰拡張で意味を失う |
| 同義語置換・back-translation | テキスト | nlpaug | N/A | 意味の微妙な変化 |
| ノイズ注入 | 数値表 | 小さなガウスノイズを各特徴量に加算 | 総人口・消費支出に標準偏差の 1% 程度のノイズ | 過大ノイズで分布が崩れる |
| ブートストラップ | 数値表 | 復元抽出でリサンプル | 47 県から復元抽出で 100 セット | 情報量は増えない、 ばらつき推定用 |
| ミックスアップ | 数値・画像両用 | 2 サンプルを線形補間 | 2 県の中間値を「仮想の県」として追加 | 解釈可能性が下がる |
| SMOTE | 分類の少数クラス | k-NN ベースで合成 | 8 地域ブロックの少数群を補強 | test に含めない・境界が不自然になる |
| GAN / Diffusion 合成 | 画像・テキスト・数値 | CTGAN, TabDDPM | 47 県データから「もう一つの日本」を合成 | プライバシー・分布の歪み |
| 半教師あり学習 | ラベルが高価 | pseudo-labeling, FixMatch | 市町村レベルにスケールダウンしてラベル拡張 | 擬似ラベルの誤りが波及する |
| 自己教師あり学習 | ラベルがほぼ無い | contrastive learning, masked autoencoder | 複数年度を時系列タスクとして自己教師化 | プリテキストタスクの選定が難しい |
| 転移学習 | 類似ドメインに既存モデル | 事前学習 + ファインチューニング | 他国の都市データで事前学習 | ドメイン差が大きいと逆効果 |
SSDSE-B-2026 のような小規模データに対しては、 「ブートストラップで不確かさを推定」「SMOTE で少数クラスを補強」「ミックスアップで滑らかさを与える」の三つが現実解です。 GAN や diffusion での合成は、 数百件以上の元データが必要で、 47 件では学習が安定しません。 半教師あり学習は、 「市町村レベルの未ラベルデータを 47 県の擬似ラベルで学習」のように、 解像度を変えて適用すると効果が出ます。
訓練データを正しく扱う最大のコツは、 「前処理は fold 内で fit、 fold 外で transform」を徹底することです。 scikit-learn の Pipeline と ColumnTransformer を組み合わせ、 GroupKFold または時系列なら TimeSeriesSplit で分割すれば、 リーケージは構造的に防げます。 SSDSE-B-2026 で「一般診療所数(I5102)を予測する」回帰タスクを例に、 実装テンプレートを示します。
このコードでやること: SSDSE-B-2026 から 47 県 × 複数列を読み込み、 数値列は標準化、 カテゴリ列は OneHot エンコーディング、 学習器は Ridge 回帰、 評価は 5-fold CV、 という訓練データパイプラインを 1 本にまとめる。
📥 入力データ (SSDSE-B-2026 の先頭部分。 skiprows=[1] で英字コード列を採用):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import pandas as pd from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.linear_model import Ridge from sklearn.model_selection import cross_val_score, KFold df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)].copy() # 地域コードの上2桁から地方ブロックを作る(OneHot用のカテゴリ列) def to_block(code): n = int(code[1:3]) return ['北海道東北','関東','中部','近畿','中国','四国','九州沖縄'][ 0 if n<=7 else 1 if n<=14 else 2 if n<=23 else 3 if n<=30 else 4 if n<=35 else 5 if n<=39 else 6] df['block'] = df['Code'].apply(to_block) y = df['I5102'] # 一般診療所数(目的変数) num_cols = ['A1101', 'A1303', 'A4103'] # 総人口/高齢人口/合計特殊出生率 cat_cols = ['block'] # 地方ブロック X = df[num_cols + cat_cols] pre = ColumnTransformer([ ('num', StandardScaler(), num_cols), ('cat', OneHotEncoder(handle_unknown='ignore'), cat_cols), ]) pipe = Pipeline([('pre', pre), ('model', Ridge(alpha=1.0))]) cv = KFold(n_splits=5, shuffle=True, random_state=0) scores = cross_val_score(pipe, X, y, cv=cv, scoring='r2') print('R^2 each fold:', scores.round(3)) print('mean R^2:', scores.mean().round(3)) |
📤 実行例の出力 (47 県、 シード固定の代表値):
💬 5-fold CV で平均 R² ≒ 0.85 という結果は、 47 県という小さなデータに対しては妥当な水準です。 fold ごとに 0.67〜0.97 と大きく揺らぐのは、 サンプル数が少ないため fold ごとの構成(どの大都市がどの fold に入るか)が結果に影響することを示しています。 信頼性をさらに上げるには、 シードを変えて 10 回繰り返した平均と分散を報告するのが定石です。 重要なのは、 StandardScaler も OneHotEncoder も cross_val_score 内部で fold ごとに fit_transform されるため、 リーケージが構造的に発生しないことです。
訓練データの最終的なボトルネックは、 統計的な必要量ではなく「いくら使えるか」「いつまでに集めるか」「集めてよい範囲はどこか」という三方制約です。 SSDSE-B-2026 のような公開データは原則無料・即時利用可能・倫理的にもクリアという稀有な例ですが、 企業内データや独自収集データではこの三方制約が重くのしかかります。
| 調達方法 | 単価目安 | 所要時間 | 倫理・法務リスク | 向く用途 |
|---|---|---|---|---|
| 公開公的統計(SSDSE 等) | 無料 | 即時 | 低(出典明記が必要) | 教育・社会指標分析 |
| 企業内システムログ | 設備費のみ | 月単位 | 中(個人情報、 社内規程) | 需要予測・異常検知 |
| クラウドソーシング(Lancers/MTurk) | 1 件 数円〜数百円 | 週単位 | 中(労働倫理、 品質ばらつき) | 画像ラベリング・アンケート |
| 専門アノテーター | 1 件 数千〜数万円 | 月単位 | 低〜中 | 医療画像、 法律文書 |
| センサー設置 | 設備 数十〜数百万円 | 月〜年単位 | 中(撮影同意、 周辺住民) | 交通・環境計測 |
| パネル調査(マーケットリサーチ) | 数百〜数千万円 | 月〜年単位 | 中(個人情報・同意) | 消費者行動・ブランド調査 |
| 外部 API(Twitter, 経済データ) | 月額数万〜数百万円 | 即時 | 中〜高(利用規約、 再配布禁止) | トレンド分析・金融 |
| 合成データベンダ | プロジェクト数百万〜 | 月単位 | 低 | プライバシー保護下のシミュレーション |
教育用途や試作段階では SSDSE のような公開データで十分ですが、 本番運用に進む段階で「自社固有のデータをいくらで何件集めるか」という意思決定が必要になります。 そのとき、 学習曲線で「追加 1,000 件あたりの精度向上幅」を測り、 「精度向上 1% で得られるビジネス価値」と比較するのが意思決定の定石です。 価値が下回るなら、 そこで調達は止め、 量より質や特徴量設計に投資を切り替えます。
SSDSE-B-2026 では「総人口(人)」「消費支出(円)」「年平均気温(℃)」と単位が列ごとに異なります。 標準化せずに距離ベースモデル(k-NN, SVM)に投入すると、 桁数の大きい列が距離を支配します。 必ず StandardScaler や MinMaxScaler を通しましょう。
SSDSE-B は都道府県集計データなので、 「個人レベル」の推定には使えません(生態学的誤謬)。 「平均的に高齢化率が高い県は失業率も高い」とは言えても、 「高齢者は失業しやすい」とは言えません。 集計レベルと推論レベルを必ず一致させてください。
SSDSE-B-2026 のデータで 2030 年を予測する場合、 4 年分のラグがあります。 (a) 多年度を結合して時系列モデルを使う、 (b) 単年度モデルを使い「短期的には県の順位は変わらない」という仮定を明示する、 (c) 共変量シフトの可能性を必ず議論する、 の三点が必須です。
「地域ブロック」のようなカテゴリ列は、 (a) OneHotEncoder(独立列)、 (b) OrdinalEncoder(順序がある場合)、 (c) TargetEncoder(目的変数の平均で置換)、 のいずれかを使います。 TargetEncoder はリーケージリスクが高いので、 必ず fold 内で fit してください。
距離ベース(k-NN, SVM, K-Means, PCA)と勾配ベース(NN, 線形回帰の最適化)は標準化必須。 木ベース(決定木, ランダムフォレスト, GBDT)は標準化不要。 ただし正則化が入る Ridge/Lasso は標準化必須です。
右裾分布が強く(歪度 > 1)、 値が正で、 0 以下を取らないなら対数変換が有効。 SSDSE-B の総人口・出生数・着工新設住宅戸数などは対数変換すると分布が対称に近づき、 線形モデルとの相性が劇的に改善します。 0 を含む場合は log1p(=log(1+x))を使います。
(1) MCAR/MAR/MNAR を判定 → (2) MCAR ならリストワイズ削除も可 → (3) MAR なら多重代入法(IterativeImputer, MICE)→ (4) MNAR ならドメイン知識を使った仮定明示。 SSDSE-B は欠損ほぼ無しなので、 この手順は他データセットを併用するときに重要です。
理由なく除去するのは禁物。 SSDSE-B の東京は確かに外れ値ですが、 「東京がない日本」を予測するモデルは現実には使えません。 (a) 外れ値を含むモデルと含まないモデルの両方を作って比較、 (b) ロバスト回帰(Huber, RANSAC)を使う、 (c) 外れ値群と非外れ値群を別モデルに分ける、 のいずれかを検討します。
汎化誤差は概ね 1/√N に比例して減ります。 つまり N=100 → 400 で誤差が半分、 N=400 → 1600 でさらに半分。 倍々に増やすたびに改善幅は同じ量だけ得られますが、 投資対効果は逓減します。 学習曲線で「次の倍増にいくら払えば良いか」を実測しましょう。
(a) クラス不均衡(class_weight='balanced')、 (b) 信頼性の異なるサンプル(測定誤差が小さいものに重く)、 (c) 標本抽出時の確率の逆数(IPW; Inverse Probability Weighting)、 (d) 古いデータほど軽く(時間減衰)、 が代表例です。 SSDSE-B では人口の小さい県の重みを上げて公平性を担保するという使い方もあります。
クロスセクション(横断面)はシャッフル必須(順序に意味がないため)。 時系列は絶対シャッフルしない(未来が訓練に入る)。 グループ構造(患者 ID、 都道府県 ID)がある場合は GroupKFold でグループ単位に分割してから fold 内をシャッフル。 SSDSE-B-2026 単年度ならシャッフル OK、 多年度結合なら年度単位の TimeSeriesSplit が必要です。
(a) 数百万件以下なら全部使う、 (b) 数千万件以上は計算コストとの相談、 (c) 層化サンプリングで部分集合を作り、 学習曲線が飽和していれば部分集合で十分、 (d) GPU メモリの制約があるなら mini-batch でストリーミング学習、 と段階的に判断します。 SSDSE-B の 47 件は当然「全部使う」ケースです。
訓練データは「一度集めて終わり」ではなく、 設計・収集・検査・公開・運用・改定・廃棄まで続くライフサイクルを持ちます。 SSDSE-B-2026 は統計センターが運用する典型例で、 年度ごとに改定され、 古い年度は学習教材として参照され続けます。 自社で訓練データを運用する場合も、 12 工程それぞれに責任者と SLA を決めましょう。
| 工程 | 目的 | 代表的な担当 | SSDSE 等での対応 |
|---|---|---|---|
| ①データ設計 | 何を測るか・誰から取るかを決める | ドメイン専門家+データサイエンティスト | 統計局の調査企画 |
| ②調査票設計 | 質問項目・選択肢・スキップロジック | 調査設計者 | 国勢調査票 |
| ③収集 | 実際にデータを取得 | 調査員・センサー・API | 調査員と Web 回答 |
| ④入力・OCR | 紙票やスキャン画像をデジタル化 | 入力業者・自動 OCR | 紙→電子の自動変換 |
| ⑤検査 | 欠損・矛盾・外れ値を検出 | データ品質担当 | 統計検査ルール |
| ⑥集計 | 必要な粒度に集約 | 統計エンジニア | 県別・市町村別集計 |
| ⑦匿名化 | 個人特定不能化 | プライバシー担当 | k-匿名化・差分プライバシー |
| ⑧公開 | 利用者がアクセスできる形に | 情報公開担当 | e-Stat、 SSDSE 配布 |
| ⑨学習 | モデルに食わせる | 機械学習エンジニア | 教育機関・企業 |
| ⑩運用監視 | モデル精度・データ品質の監視 | SRE・MLOps | 年次精度レポート |
| ⑪改定 | 必要に応じて再収集・再定義 | 統計委員会 | 5 年ごとの基準改定 |
| ⑫廃棄 | 保管期限後に安全に消去 | 情報セキュリティ担当 | 保管 30 年後に破棄手続き |
SSDSE-B-2026 のような教育用標準データセットは、 「設計→公開」の前半工程を統計センターが代行してくれており、 利用者は「学習→運用監視」の後半工程だけに集中できます。 自社でデータを集めるとこの 12 工程を全部運用する必要があり、 体感としては「データ収集 70% + 学習 20% + 運用 10%」くらいの労力配分になります。 訓練データの議論は、 学習側だけでなく上流の設計工程にも常に意識を向ける必要があります。
最後に、 訓練データを使ったプロジェクトで「これだけは確認したい」 30 項目をチェックリスト化します。 印刷して机に貼り、 各プロジェクトの最初・中盤・最後に通してください。 SSDSE-B-2026 を題材にした学習プロジェクトでも、 自社の本番プロジェクトでも、 同じ目線で点検できます。
| No | チェック項目 | クリア条件 |
|---|---|---|
| 1 | 目的変数の定義は文書化されているか | 定義書 1 ページ以上 |
| 2 | 特徴量の出典・取得時刻は記録されているか | 列ごとに source/timestamp |
| 3 | 欠損率は許容範囲か(< 5%) | isna().sum() の上限 |
| 4 | 重複行は除去されているか | drop_duplicates 適用 |
| 5 | 外れ値の取り扱い方針は決まっているか | 除去/保持の理由を記録 |
| 6 | クラス比は確認したか | value_counts 記録 |
| 7 | 分布シフトを確認したか | KS test or PSI |
| 8 | train/valid/test の分割比は記録されているか | 7:1.5:1.5 など明記 |
| 9 | グループ漏洩は確認したか | GroupKFold 使用 |
| 10 | 時系列漏洩は確認したか | TimeSeriesSplit 使用 |
| 11 | 標準化は fold 内で実施しているか | Pipeline 構造 |
| 12 | TargetEncoder のリーケージは検査したか | fold 内 fit のみ |
| 13 | 特徴量と目的変数の派生関係を全列リスト化したか | 派生関係表 |
| 14 | 単位の混在はないか | 単位辞書を作成 |
| 15 | 対数変換すべき列は識別したか | 歪度 1 超の列リスト |
| 16 | カテゴリ列のエンコーディングは適切か | OneHot/Ordinal/Target を選択 |
| 17 | 特徴量数とサンプル数の比は妥当か | サンプル ≥ 特徴量 × 10 |
| 18 | 学習曲線を描いたか | グラフ提出 |
| 19 | CV のシードを変えて再現性を確認したか | 3 シード以上 |
| 20 | 部分集団別の精度を分けて報告したか | セグメント別表 |
| 21 | test は 1 回だけ評価したか | 評価ログ確認 |
| 22 | データのバージョンは記録されているか | DVC/git commit |
| 23 | 前処理コードは再現可能か | Pipeline pickle 保存 |
| 24 | ラベル定義の変更履歴はあるか | 変更ログ |
| 25 | アノテーター間合意率は計測したか | κ ≥ 0.7 |
| 26 | プライバシー要件はクリアしているか | k-匿名化済 |
| 27 | 公平性指標は計測したか | demographic parity 等 |
| 28 | 本番運用時の監視指標は設計したか | drift, performance dashboard |
| 29 | 再学習トリガーは定義したか | 精度低下 / 期間 / イベント |
| 30 | 廃棄ポリシーは決まっているか | 保管期限 + 削除手順 |
30 項目すべてに「Yes」が並んで初めて、 訓練データは「使える状態」と言えます。 SSDSE-B-2026 のような教育用標準データセットでも、 自分のプロジェクトに使う場合は項目 8 以降を自分で運用する必要があり、 これを習慣化することが、 学生から実務家に進む際の最重要スキルになります。
SSDSE-B-2026 を訓練データとして実際のモデル構築に持ち込むとき、 多くの初学者が同じ落とし穴に立て続けに落ちます。 ひとつは「47 件で深層学習をやろうとして全く収束しない」というケース、 ふたつめは「東京・大阪などの都市集中で勾配が支配されて地方の予測が壊れる」ケース、 みっつめは「相関係数が非常に高く見えて喜んだ瞬間に、 目的変数の派生情報が特徴量に混入していたことが発覚する」ケースです。 訓練データの議論は、 単に量と質を測るだけでなく、 「このデータが教師信号として何を教え、 何を教えないのか」を解像度高く言語化することから始まります。
SSDSE-B-2026 を訓練データとして使うときに必ず確認したい三つの問いがあります。 第一に、 「予測したい現象は都道府県という解像度で記述可能か」。 高齢化率や産業構造の地域差は県解像度でも捉えられますが、 個別の労働者の就業選択や個別の家計の消費行動はこの解像度では捉えられません。 第二に、 「予測したい時間軸はこのデータの参照年と整合するか」。 SSDSE-B-2026 の各行は年度単位であり(本ページの分析は 2023 年度分を使用)、 これを使って数年後を予測する場合、 「短期的には県の相対順位は安定」という強い仮定を入れざるを得ません。 第三に、 「予測の単位は県あたりで意味があるか」。 「全国の年間出生数の総計」を予測したい場合、 47 県の出生数(A4101)の合計を取れば良いだけで、 ML モデルは不要かもしれません。 訓練データを選ぶ前に、 解像度・時間軸・集約単位の三点を文書化する習慣を持つと、 後段の作業の質が大きく変わります。
47 件という訓練データサイズで取り得る現実的なモデル戦略は限られます。 第一候補は線形回帰(および正則化版の Ridge / Lasso / ElasticNet)、 第二候補は決定木(深さ 3〜4 程度に制限)、 第三候補は k-NN(k=3〜5)、 第四候補はベイズ線形回帰(事前分布で正則化)です。 勾配ブースティング(XGBoost, LightGBM)は数百件以上、 深層学習は数千件以上で初めて安定し、 47 件では過適合が必発します。 「とにかく最新のモデルを使えば精度が出る」という直感は、 訓練データが小さいときには逆に作用するという事実を、 SSDSE-B-2026 を題材に体験してほしいところです。
47 件の訓練データで信頼性のある精度評価をするには、 Leave-One-Out クロスバリデーション(LOO-CV)が現実解です。 5-fold だと test fold が約 9 件、 10-fold だと約 5 件しかなく、 fold ごとの精度の揺らぎが大きくなります。 LOO なら test fold が常に 1 件で、 47 回の評価結果を平均することで安定した推定が可能です。 ただし計算コストは 5-fold の 9 倍以上になるため、 線形モデルなら問題ありませんが、 グリッドサーチを伴う場合は計算時間との相談になります。 SSDSE-B-2026 の規模では、 LOO-CV を回しても数秒〜数十秒で完了するので、 迷ったら LOO を選ぶのが定石です。
SSDSE-B-2026 の訓練データを使った代表的タスクとして、 (a) 一般診療所数(I5102)の予測(回帰)、 (b) 人口減少県と人口維持県の二値分類、 (c) 8 地域ブロックの多クラス分類、 (d) 47 県のクラスタリング、 の 4 つが挙げられます。 (a) は総人口・高齢人口・出生率を説明変数にした線形回帰(5-fold CV)で R² ≒ 0.87 が出ます(一方、 消費支出 L3221 を同じ説明変数で予測すると CV 平均 R² は 0 を下回り(実測で −0.7 前後 = 平均値予測にも劣る)、 目的変数しだいで難易度が激変する好例です)。 (b) はロジスティック回帰で精度 0.85〜0.90 が出ますが、 「人口減少」の定義(前年比減か、 5 年比減か、 絶対値か)で結果は大きく揺れます。 (c) は地理的に隣接する県同士は似た特徴を持つため、 ランダム分類より遥かに良い精度(マクロ F1 ≒ 0.6〜0.7)が出ますが、 4 都府県のみのブロックなどは過適合します。 (d) は k=3〜5 で「都市部・地方都市・農村・特殊県(沖縄など)」のクラスタが現れます。 それぞれのタスクで「訓練データのどの側面が結果を決めるか」を観察すると、 訓練データという概念への理解が立体的になります。
最後に、 SSDSE-B-2026 を訓練データとして使うときに「やってはいけない 3 つのこと」を挙げます。 第一に、 「東京を外れ値として最初から除去する」のは避けるべきです。 東京は日本の経済活動の集中地点であり、 これを除外したモデルは現実世界では役に立ちません。 第二に、 「47 県を train 40 件 / test 7 件に固定分割して 1 回だけ評価する」のは絶対にダメで、 必ず LOO や 10-fold CV で複数回評価し、 平均と標準偏差を報告してください。 第三に、 「相関係数 0.99 が出たから完璧なモデル」と早合点しないこと。 目的変数の派生情報が特徴量に混じっていないか(たとえば「合計特殊出生率」を予測するのに、 その定義に使う「出生数」をそのまま特徴量に入れていないか)、 リーケージの可能性を疑う癖をつけてください。 これら 3 点を肝に銘じれば、 SSDSE-B-2026 は訓練データとして極めて優秀な教材であり続けます。
訓練データという言葉は、 ともすれば「機械に食わせる素材」のように受け取られがちですが、 実際には「予測したい現象の縮図」であり、 「学習器の挙動を決める教育環境」であり、 「将来の意思決定の根拠」でもあります。 SSDSE-B-2026 を使った学習プロジェクトを通じて、 訓練データを「集める・整える・検査する・使う・運用する」という五拍子を、 ぜひ手を動かして体感してください。 そこで身につく目線は、 どんなモデルや道具を持っても色褪せない、 データサイエンスの根幹です。
訓練データの実務的な扱いを深く身につけるための学習ロードマップとして、 次の段階を順に踏むことを勧めます。 第一段階は、 SSDSE-B-2026 の単年度データで線形回帰 1 本を回し、 学習曲線・残差プロット・係数の信頼区間を読み解けるようになること。 ここで「訓練データのどこを見れば、 モデルの限界が分かるか」という基礎感覚が身につきます。 第二段階は、 同じデータを使って分類タスク(人口減少県判定など)を組み立て、 ROC 曲線・混同行列・適合率・再現率・F1 を読み解けるようになること。 ここで「訓練データのクラス分布が指標選択を左右する」という構造を体得します。 第三段階は、 SSDSE の複数年度を結合して時系列分割を行い、 covariate shift と concept drift を実体験すること。 ここで「訓練データの時間軸が予測能力に決定的な影響を与える」という本質に触れます。
第四段階は、 他の公開データセット(e-Stat の人口動態調査、 RESAS、 国勢調査の市町村集計など)と SSDSE を組み合わせ、 異種データの結合・キーの整備・粒度合わせを経験すること。 ここで「訓練データの 80% は前処理である」という現場の声を、 自分の手で実感します。 第五段階は、 ようやく勾配ブースティングや浅いニューラルネットを試し、 訓練データの量に対するモデル複雑度の感度を体験すること。 47 件で XGBoost を回しても線形回帰に勝てないことや、 数千件でようやく差がつくことを目で見て理解します。 第六段階は、 自分自身が興味を持つテーマ(地域経済、 教育、 医療、 環境など)で「自分のデータセットを作る」プロジェクトに進むことです。 ここに来て初めて、 「訓練データの設計から運用までの 12 工程」という言葉が、 抽象論ではなく自分の生活上の経験になります。
最後にひとつだけ強調したいのは、 「訓練データの議論は、 モデルの議論より圧倒的に難しい」という事実です。 モデルはライブラリの 1 行で差し替えられますが、 訓練データは集め直すのに数ヶ月から数年、 場合によっては数千万円の追加投資が必要です。 だからこそ、 訓練データを触り始める前に「このデータで何を学ぶか・何を学べないか」を 1 ページの文書にまとめる時間を惜しんではいけません。 SSDSE-B-2026 のような優れた教育用標準データセットは、 まさにこの「文書化の練習」を、 安全な環境でできる稀有な舞台です。 学ぶ側・教える側ともに、 ぜひこの恩恵を最大限活用してください。
補足として、 訓練データを巡る論点は、 純粋な技術論にとどまらず、 倫理・法務・経営・社会論の各領域に広がります。 倫理面では「誰のデータを、 誰の同意のもとで、 どのような目的で使うのか」が常に問われます。 SSDSE-B-2026 のような公的統計はこの点で透明性が高く、 統計法に基づく公益利用として位置づけられているため、 倫理的な議論はクリアされています。 一方、 企業内ログや個人情報を含むデータでは、 個人情報保護法、 GDPR、 業界別ガイドラインに照らした適法性の確認が必須です。 法務面では「再配布の可否」「派生著作物の取り扱い」「契約違反のリスク」を、 経営面では「収集コスト対効果」「ベンダロックインの回避」「データ主権の維持」を、 社会論面では「データ格差」「アルゴリズムバイアス」「説明責任」を、 それぞれ意識する必要があります。
これら多面的な論点を全部一人で抱える必要はなく、 法務担当者・倫理委員会・経営層・現場担当者と分担して議論するのが健全です。 ただし、 訓練データの設計者であるデータサイエンティストが「他人事」として扱ってしまうと、 開発が進んでから致命的な問題が発覚するパターンに陥りがちです。 最初の段階で「このプロジェクトで使う訓練データは、 倫理・法務・経営・社会の各観点でクリアか」を簡単な一覧表にまとめ、 関係者全員で署名する習慣を持つと、 後段の手戻りが激減します。 SSDSE-B-2026 のような教育目的のデータセットを使う段階でこの習慣を身につけておけば、 本番プロジェクトに進んだときに自然と発動できる力になります。
訓練データに関する学びは、 「データを集める力」「データを読む力」「データを疑う力」「データを共有する力」「データを廃棄する力」の五つの能力に集約されます。 集める力はサンプリング・調査設計の知識、 読む力は EDA とドメイン知識、 疑う力はリーケージ検出・分布シフト検出・公平性検査、 共有する力はバージョン管理とドキュメント化、 廃棄する力は保管期限と削除手順の運用です。 これらは一夜にして身につくものではなく、 SSDSE-B-2026 のような安全な舞台で何度も繰り返して鍛える必要があります。 本ページの構成は、 まさにその五つの能力を順番に体得することを意図しています。 ぜひ各章を行きつ戻りつしながら、 自分の手元のプロジェクトに引き寄せて読み返してください。 訓練データを深く理解した先にこそ、 機械学習の真の力が見えてきます。
さらに踏み込んでお伝えしたいのは、 訓練データに対する向き合い方が、 そのままデータサイエンティストとしての成熟度を映し出すという観察です。 初学者は「データを与えられたらすぐにモデルを回す」段階にあり、 中級者は「データの前処理と特徴量設計に多くの時間を割く」段階に進み、 上級者は「データの設計段階から関わり、 何をどう測ればモデルが意味のある答えを返すかを議論する」段階に到達します。 この成熟度のステップアップを促す最良の手段は、 SSDSE-B-2026 のような小規模で質の高いデータセットを使って「一気通貫の経験」を何度も繰り返すことです。 大量データを扱う前に、 47 件のデータで設計・収集理解・前処理・モデル・評価・改善の全工程を体験してください。 そこで身につく感覚は、 数百万件のデータを扱うときに必ず生きてきます。
本ページの結びとして、 訓練データという言葉の定義をもう一度確認します。 訓練データとは、 「教師あり学習において、 モデルが入力と正解の対応関係を学ぶために使う、 入力と正解のペア集合」のことです。 ただしこの定義は最低限のもので、 実務的には「予測対象の縮図であり、 学習器の挙動を決める教育環境であり、 将来の意思決定の根拠でもある」という多重の意味を持ちます。 訓練データの選定・整備・運用に責任を持つということは、 単なる前処理担当ではなく、 プロジェクト全体の成否を左右する設計者であるという自覚を持つことに他なりません。 SSDSE-B-2026 を題材に学ぶ皆さんが、 訓練データという概念を浅く通り過ぎることなく、 深く咀嚼してこの先のキャリアに活かしてくださることを願っています。
付録として、 訓練データの議論を一段深く掘りたい読者向けに、 推奨参考書と公開コースをいくつか挙げておきます。 第一に、 Provost & Fawcett 著「データサイエンスのための統計学習」は、 訓練データの設計とビジネス価値接続の橋渡しが秀逸です。 第二に、 Hastie/Tibshirani/Friedman の「The Elements of Statistical Learning」は、 訓練データのサイズとモデル複雑度のトレードオフを理論面で深く扱います。 第三に、 Andrew Ng の Data-Centric AI のオンラインコースは、 「モデル中心からデータ中心へ」というパラダイムシフトを実例で示し、 訓練データの品質改善が精度改善の最短経路であることを体験できます。 第四に、 統計センターが公開している SSDSE シリーズのコードブックは、 公的統計の訓練データ設計の実例として極めて有用です。 これらを順に消化することで、 本ページで触れた論点の解像度が一段上がります。 訓練データの世界に終わりはなく、 学べば学ぶほど新しい風景が見えてきます。 学習の旅を楽しんでください。
最終チェックとして、 訓練データの議論を一文で要約するなら、 「訓練データはモデルの天井であり、 同時にプロジェクトの土台である」となります。 天井であるとは、 訓練データの質と量を超える精度はどんなモデルでも出せないという意味であり、 土台であるとは、 訓練データの設計が間違っていればプロジェクト全体が崩れるという意味です。 SSDSE-B-2026 を題材に、 47 県という限られたデータでこの「天井」と「土台」を両面から体感することが、 これからのデータサイエンス学習者にとって最高の出発点になります。 本ページが、 読者の皆さんの第一歩を支える一助になれば幸いです。 訓練データという概念を、 自分のものとして使いこなしてください。 そこから先のキャリアが大きく開けていきます。
なお、 訓練データに関連する用語として、 検証データ・テストデータ・ラベル・特徴量・サンプル・教師信号・アノテーション・データセット・コーパス・ベンチマーク・データリーケージ・ホールドアウト・クロスバリデーション・サンプリング・層化抽出・ブートストラップなどがあり、 それぞれ別ページで詳しく扱っています。 関連用語のリンクを辿り、 一つひとつの言葉が指す具体的な概念を確認していくと、 訓練データという中心概念の周囲に広がる豊かな知識マップが見えてきます。 ぜひ知識のネットワークを広げて、 機械学習の世界をより深く楽しんでください。 訓練データを通じて、 データサイエンスの楽しさと厳しさの両方を、 思う存分味わってください。 学びの道は長く、 そして奥深く、 訓練データはその大切な扉のひとつに過ぎません。
記号と意味を逐一突き合わせて読みます。 慣れないうちは式を「日本語で読む」ことが理解の近道です。
SSDSE-B 47 県を訓練 70% / テスト 30% に分割し、 訓練データのサイズを変えながら学習曲線 を描きます。
データ出典:SSDSE-B-2026(独立行政法人統計センター)。 47 都道府県 × 複数年(最新 2023)の社会統計データ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)].reset_index(drop=True) X = df[['A1101','A1303']].values # 総人口・65歳以上人口 y = df['A1301'].values # 15歳未満人口 X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) print(f'訓練 n={len(y_tr)}, テスト n={len(y_te)}') print('train_n | RMSE_train | RMSE_test') for n in [5, 10, 15, 20, 25, len(y_tr)]: Xs, ys = X_tr[:n], y_tr[:n] m = LinearRegression().fit(Xs, ys) tr = mean_squared_error(ys, m.predict(Xs)) ** 0.5 te = mean_squared_error(y_te, m.predict(X_te)) ** 0.5 print(f' {n:>5} | {tr:>10,.0f} | {te:>10,.0f}') |
実行結果の要約(random_state を固定しているので、下の値はそのまま再現できます):
| 項目 | 値 |
|---|---|
| 訓練サイズ | 32 県(70%) |
| テストサイズ | 15 県(30%) |
| n=5 RMSE訓練/テスト | 8,451 / 38,853 |
| n=15 RMSE訓練/テスト | 8,744 / 26,829 |
| n=32 RMSE訓練/テスト | 23,254 / 31,801 |
| 傾向 | n増 → 訓練 RMSE は上昇、 テスト RMSE は低下し、 両者が近づいて収束 |
訓練データの「品質」は曖昧な言葉ですが、 実務では以下の 8 項目で診断できます。 SSDSE-B-2026 を例に、 実際の数値で何を見るかを示します。
| 項目 | 確認方法 | SSDSE-B 実値 |
|---|---|---|
| 1. サンプル数 | len(df) | 47 県(2023 年度) / 564 行(12 年パネル) |
| 2. 欠損率 | df.isna().mean() | 全列で 0%(2023 年度、 実測) |
| 3. 重複行 | df.duplicated().sum() | 0 行 |
| 4. 外れ値率 | IQR ×1.5 法 | 人口 A1101:47 県中 9 県(東京・神奈川・大阪など大都市圏)が外れ値 |
| 5. 分布の歪み | 歪度(skewness) | 人口 A1101 の歪度 = 2.22(右に強く歪む) |
| 6. クラス不均衡 | df['label'].value_counts() | 人口 100 万以上:37 県 / 100 万未満:10 県(約 3.7:1 の不均衡) |
| 7. ラベル一貫性 | 複数人のクロスチェック | SSDSE は公式統計なのでラベルノイズなし |
| 8. 時間的整合性 | 年度をまたいだ列定義の安定性 | SSDSE-B は年度間で列定義が一致 |
このコードでやること:SSDSE-B-2026 を読み込み、 上記 8 項目を 1 回の関数呼び出しで診断する。
📥 入力データ:SSDSE-B-2026.csv。 出力は各項目の数値と「問題あり/なし」の判定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import pandas as pd from scipy.stats import skew df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)] y = df['A1101'] # 総人口 print(f'1. サンプル数: {len(df)} 県') print(f'2. 欠損率: {df.isna().mean().mean()*100:.2f}%') print(f'3. 重複行: {df.duplicated().sum()} 行') q1, q3 = y.quantile(0.25), y.quantile(0.75) iqr = q3 - q1 outliers = ((y < q1 - 1.5*iqr) | (y > q3 + 1.5*iqr)).sum() print(f'4. 外れ値: {outliers} 県') print(f'5. 歪度: {skew(y):.2f}') label = (y >= 1_000_000).astype(int) print(f'6. クラス比: 大都市{label.sum()}県 / 小都市{(1-label).sum()}県') |
📤 実行例:
💬 歪度 2.22 が大きい → 人口は対数変換(np.log1p)してから学習すべき。 外れ値 9 県は東京(1409 万)を筆頭とする大都市圏で、 削除ではなく「対数変換で吸収」が定石。 クラス比は 37:10 と不均衡なので、 分類タスクでは class_weight='balanced' や層化抽出(stratify)を検討します。
SSDSE-B-2026 (47 県 × 12 年 = 564 行) を母集団見立てに、 訓練サンプル数 N と テスト誤差の関係を経験則 err = err_min + C/√N で計算する。 N=100 で err=0.30 を観測した想定で、 err=0.05 を達成するための N を逆算する。
1 2 3 4 5 | import numpy as np err_target = 0.05 err_at_100 = 0.30 N = 100 * (err_at_100/err_target)**2 print(f"必要 N: {round(N)}") |
💬 手計算 (Step 2) 3,600 と Python 出力が完全一致。
scikit-learn / pandas を使った最小実装パターン。 上の SSDSE-B 計算と同じスタイルですが、 ここでは「読み込み→前処理→学習→評価」のテンプレを 4 つのスニペットに分けます。
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)].reset_index(drop=True) print(df.shape, df.columns.tolist()[:8]) |
1 2 3 | X = df[['A1101','A1303']].values # 総人口・65歳以上人口 y = df['A1301'].values # 15歳未満人口 print('X shape =', X.shape, ', y shape =', y.shape) |
1 2 3 4 5 6 | from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = RandomForestRegressor(n_estimators=300, random_state=0).fit(X_tr, y_tr) print('R^2 (test) =', model.score(X_te, y_te)) |
1 2 3 4 5 6 | import matplotlib.pyplot as plt pred = model.predict(X_te) plt.scatter(y_te, pred) plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--') plt.xlabel('実測'); plt.ylabel('予測'); plt.title('「訓練データ」関連モデルの予測精度') plt.tight_layout(); plt.savefig('out.png', dpi=150) |
※ 「訓練データ」固有の本格コードは上の 🧮 SSDSE-B 実値計算 節を参照。
SSDSE 公的データを題材に、 訓練データ を実際に動かす最小コードです。 paths は引数に直書きで、 初心者がコピペで動かせる形を優先しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pandas as pd import numpy as np # データ読み込み(SSDSE-B 都道府県・47 県 × 約 112 列) df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)].reset_index(drop=True) print('shape:', df.shape) print('列の先頭:', df.columns.tolist()[:6]) # 必要な列だけ取り出して整形 features = ['A1101', 'A1301', 'A1303', 'A4103'] # 総人口/15歳未満/65歳以上/出生率 df_use = df[features].copy() print(df_use.describe()) |
次に、 訓練データ に固有の処理を加えます。 ここがページごとの「肝」になる部分。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_squared_error, r2_score X = df[['A1101', 'A1303', 'A1301']].fillna(0).values # 総人口/65歳以上/15歳未満 y = df['A4103'].fillna(df['A4103'].median()).values # 合計特殊出生率 X_tr, X_te, y_tr, y_te = train_test_split(X, y, test_size=0.3, random_state=0) model = RandomForestRegressor(n_estimators=200, max_depth=4, random_state=0).fit(X_tr, y_tr) pred_tr = model.predict(X_tr) pred_te = model.predict(X_te) print(f'train R^2 = {r2_score(y_tr, pred_tr):.3f}') print(f'test R^2 = {r2_score(y_te, pred_te):.3f}') print(f'test RMSE = {np.sqrt(mean_squared_error(y_te, pred_te)):.4f}') |
さらに可視化を加えると、 学んだ内容が「眼で」確認できます。
1 2 3 4 5 6 7 8 9 10 11 12 | import matplotlib.pyplot as plt plt.figure(figsize=(7,5)) plt.scatter(y_te, pred_te, alpha=0.7, edgecolor='k') lims = [min(y_te.min(), pred_te.min()), max(y_te.max(), pred_te.max())] plt.plot(lims, lims, 'r--', linewidth=2, label='完全予測ライン') plt.xlabel('実測 出生率') plt.ylabel('予測 出生率') plt.title('訓練データ を使ったモデルの予測精度(SSDSE-B-2026)') plt.legend() plt.tight_layout() plt.savefig('out_training-data.png', dpi=150) |
最後に、 同じ問題を別の角度から見る「クロスバリデーション版」も用意します。
1 2 3 4 5 6 7 8 | from sklearn.model_selection import cross_val_score scores = cross_val_score( RandomForestRegressor(n_estimators=200, max_depth=4, random_state=0), X, y, cv=5, scoring='r2' ) print(f'5-fold CV R^2 = {scores.mean():.3f} (±{scores.std():.3f})') print('各 fold:', np.round(scores, 3)) |
同じ「訓練データ」を使うにも、 データの形・規模・目的によって書き方が変わります。 4 つの典型パターンを示します。
1 2 3 4 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df[df['Code'].str.startswith('R') & (df['SSDSE-B-2026'] == 2023)].reset_index(drop=True) print(df.shape, df.head(3)) |
1 2 3 4 5 6 7 8 9 10 | from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import Ridge pipe = Pipeline([ ('scaler', StandardScaler()), ('model', Ridge(alpha=1.0)), ]) pipe.fit(X_tr, y_tr) print('R^2 =', pipe.score(X_te, y_te)) |
1 2 3 4 5 6 | from sklearn.model_selection import GridSearchCV params = {'model__alpha': [0.01, 0.1, 1.0, 10.0, 100.0]} gs = GridSearchCV(pipe, params, cv=5, scoring='r2', n_jobs=-1) gs.fit(X, y) print('best:', gs.best_params_, 'score:', gs.best_score_) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import matplotlib.pyplot as plt import json pred = gs.predict(X_te) plt.figure(figsize=(7,5)) plt.scatter(y_te, pred, alpha=0.7, edgecolor='k') plt.plot([y_te.min(), y_te.max()], [y_te.min(), y_te.max()], 'r--') plt.xlabel('実測'); plt.ylabel('予測'); plt.title('訓練データ 結果') plt.tight_layout(); plt.savefig('result_training-data.png', dpi=150) with open('result_training-data.json', 'w', encoding='utf-8') as f: json.dump({'best_params': gs.best_params_, 'cv_score': gs.best_score_, 'test_score': gs.score(X_te, y_te)}, f, ensure_ascii=False, indent=2) |
訓練データの量(サンプル数)と質(ノイズ・偏り)が、モデルの学習にどう効くかを手を動かして体感します。
真の関数は y = sin(2πx)(緑)。そこから訓練データ(青丸)を生成し、多項式回帰でモデル(橙)を当てはめます。
左の図が「当てはめの様子」、右の図が「学習曲線(サンプル数 n ごとの汎化誤差)」です。
汎化誤差(テストRMSE)は、ノイズを含まない真の関数に対して全域で測った二乗平均平方根誤差で、値が小さいほど良いモデルです。
n を 5〜10 まで下げて「🎲 再抽選」を何度か押してみてください。橙の曲線が抽選のたびに大きく暴れるはずです。 これがデータ不足による不安定さ(高バリアンス)で、少数の点にモデルが振り回される様子です。 次に n を 150〜200 に上げて再抽選すると、曲線はほとんど動かず真の関数に張り付きます。 「データの量がモデルを決める」──同じアルゴリズムでも、渡すデータで結論が変わるのです。 量と質の一般論は バイアス・バリアンス と 汎化 のページも参照してください。
「もっとデータを集める」以外にも手はあります。 データ拡張(Data Augmentation)は既存データを変換して水増しする手法(本教材では専用ページ未整備のためテキスト補足)。 能動学習(Active Learning)は「効くサンプル」だけを選んでアノテーションし、少ないラベルで効率的に学ぶ考え方(同じく未整備)。 そして近年のデータ中心AI(Data-Centric AI)は、モデルを固めてデータの質を磨くことで性能を上げる潮流です。 ラベルが高コストなら 交差検証 で全データから情報を絞り出し、少量データなら 転移学習 で事前知識を借りるのが定石です。
fit は訓練データだけに対して行い、 テストには transform のみを適用。 これを混同するとデータリーケージになる。訓練データ は、 統計学と計算機科学の流れの中から生まれました。 下の年表はこの分野全体の流れで、 訓練データ 固有の年表ではありません。 この用語がどの時代の産物かを掴むために置いています。
| 時期 | 出来事 | この時代に起きたこと |
|---|---|---|
| 前史 | 統計学・情報理論の基盤整備 | 数式的な土台 |
| 古典期 | 機械学習の黎明(1960〜80 年代) | 「訓練データ」の原型が登場 |
| 展開期 | scikit-learn / TensorFlow など実装の普及(2010〜) | 誰でも 1 行で使える時代に |
| 現代 | 大規模モデル時代(2020〜) | 「訓練データ」の意味が再解釈される |
現代の文脈では、 古典的な定義のままでは説明しきれない使い方も出てきています。 教科書の定義を出発点としつつ、 実務での「変奏」も知っておくとよいでしょう。
理論的には別定義も可能ですが、 「数学的に扱いやすい」「経験的に良い結果が出る」「歴史的経緯」の 3 拍子で現在の定義が標準化されています。 学術論文では別定義を「変種」として議論することもよくあります。
教育用途・探索的分析では十分。 ただし「統計的有意」を主張するには n=47 は不足することが多いので、 解釈は慎重に。 ブートストラップで信頼区間を出すと頑健性が確かめられます。
PyTorch / TensorFlow / XGBoost / LightGBM など多数。 ただし基本的な動作確認は scikit-learn が一番速いので、 まず sklearn で動かしてから他に移植するのがおすすめ。
計算量・メモリの観点でアルゴリズムを切り替える必要があります。 mini-batch 版、 サブサンプリング、 近似アルゴリズムの利用を検討します。 47 県スケールで本質を理解した後の応用課題です。
古典的な定義は原典(教科書や著名論文)、 実装は使用ライブラリのバージョン情報を併記するのが標準。 「Murphy 2012」「Hastie et al. 2009」あたりが定番引用です。
下の「📚 関連グループ教材」セクションのリストが、 推奨される学習順序の一つです。 上位概念から入って詳細に降りる「トップダウン」と、 1 つの具体例から始めて他に広げる「ボトムアップ」、 どちらも一長一短。 自分の学び方に合わせて。
「test で 99% の精度が出た!」が、 実は 訓練データに test の情報が混入していただけだった、 というのは Kaggle でもよくある失敗です。 SSDSE-B-2026 を例に 6 つの典型パターンを示します。
| パターン | 典型例(SSDSE-B) | 予防策 |
|---|---|---|
| 1. ターゲット漏洩 | 人口 A1101 を予測する際、 説明変数に A1301(15歳未満人口)を入れる → ほぼ自明な情報。 | 特徴量がターゲットの「分解」になっていないか確認。 R² が異常に高い場合は要疑い。 |
| 2. 時間漏洩 | 2023 年の人口予測に 2024 年の出生率を使う → 未来情報が紛れ込む。 | 時系列は train_test_split でなく TimeSeriesSplit を使う。 |
| 3. 前処理漏洩 | 全 47 県で StandardScaler.fit してから分割 → test の平均/分散が train に流れ込む。 | Pipeline を使い、 fit は train のみ、 transform は train/val/test 別々。 |
| 4. ID 漏洩 | 地域コード(Code)をそのまま特徴量に入れる → ターゲットと 1:1 で対応してしまう場合。 | ID 列は明示的に drop。 ハッシュ化や one-hot も影響を考慮。 |
| 5. 重複漏洩 | 同じ県の異なる年度を train と test に同居 → モデルが「県名」を覚える。 | GroupKFold でグループ(県)単位の分割。 |
| 6. メタデータ漏洩 | テスト時にしか取得できない情報(事後集計値など)を訓練に使う。 | 「予測時点で本当に取得可能か」を 1 つずつ確認。 |
💡 ルール:test R² が「あまりに良すぎる」ときは、 漏洩を疑え。 SSDSE-B-2026 で総人口 A1101 を予測する場合、 R² > 0.99 なら高確率で漏洩、 R² = 0.7〜0.95 が現実的な値です。
「訓練データ」を中央に置いて、 周辺概念を 5 つの方向に整理します。 これは記憶の足場になります。
| 方向 | 隣接概念 | 関係性 |
|---|---|---|
| 北 (上位) | 教師あり学習 / データ分割 | 訓練データが属する大枠 |
| 南 (下位) | model.fit() / mini-batch / epoch | 訓練データを直接使う処理 |
| 東 (発展) | データ拡張 / 半教師あり / Active Learning | 訓練データ不足を補う発展形 |
| 西 (前提) | train_test_split / 層化抽出 / CV | 訓練データを切り出す基礎手法 |
| 中央 | 訓練データ | 本ページの主役 |
マインドマップは「学んだ用語を整理する道具」として優秀。 紙にこの 5 方向を書き、 自分なりの隣接概念を埋めると、 暗黙的にあった理解構造が可視化されます。
「訓練データ」を本当に理解できたか、 自分でテストできるクイズです。 答えは展開で確認。
模範回答:上の「💡 30秒結論」を参照。 ポイントは「何のために使うか」を最初に言うこと。 定義や数式から入ると相手が引きます。
模範回答:データは観測値で固定、 パラメータは学習で動かす、 出力は計算結果。 上の「📐 数式の構造をもう一度」を参照。
模範回答:47 都道府県の特徴量を入力にすると、 結果が地理的に解釈しやすくなる、 一方でサンプル数が少ないため信頼区間は広めに出る、 など。
模範回答:上の「🌐 似た概念との比較」表を参照。 1 文で言える違いを持っておくと、 「なぜこっちを選んだか」を説明できます。
模範回答:上の「⚠️ 落とし穴」と「⚠️ さらに 5 つの落とし穴」セクションから、 自分のプロジェクトに最も関連するものを 1 つ選んで言語化してみましょう。
訓練データはモデル学習の「燃料」で、 上流の品質確保と下流の評価が直結する。
SSDSE-B-2026 で消費支出(L3221)を予測するなら、 47 県 × 12 年 = 564 行から 60% (338 行) を訓練に。 「東京 2015-2020」が train、 「東京 2021-2022」が test に分かれるとリークなので、 県をグループに GroupKFold を併用。
訓練データの扱いは、 ラベル有無とサイズで 4 通りに分岐する。
SSDSE-B-2026 は全数調査ベースで「ラベル付き + 中規模 (564 行)」なので、 通常の教師あり学習でデータ拡張なしが基本。 ただし県単位で n=47 と捉える場合は CV 必須。
ここまで訓練データを「量」「質」「分割」の観点で見てきました。 このセクションでは姉妹ページ(検証データ・テストデータ・訓練・テスト分割)では扱わない、 もう一段深い視点を追加します。 それは 「訓練データの中の 1 サンプルは、 学習結果に対して同じ発言力を持っていない」という事実です。 n=47 のような小規模データでは、 たった 1 県の有無がモデルの係数を 1 割以上動かすことがあります。 これを SSDSE-B-2026 の実測値で確かめます。
発言力の測り方は単純です。 訓練データから 1 サンプルだけ抜いて学習し直し、 結果(回帰係数)がどれだけ動くかを見るだけ。 動きが大きいサンプルほど、 モデルに強い影響を与えていたことになります。 SSDSE-B-2026 の 2023 年・47 都道府県で、 一般診療所数(I5102)から総人口(A1101)を予測する単回帰を組むと、 全 47 県での傾きは 1038.2(診療所 1 か所あたり約 1038 人)です。 ここから 1 県ずつ抜いて傾きを再計算した結果が下の表です(すべて実測値)。
| 抜いた県 | 残り 46 県での傾き | 全 47 県(1038.2)からの変化 |
|---|---|---|
| 東京都 | 1183.8 | +14.0% |
| 神奈川県 | 1012.7 | −2.5% |
| 大阪府 | 1057.9 | +1.9% |
| 埼玉県 | 1020.8 | −1.7% |
| 愛知県 | 1023.7 | −1.4% |
東京都を抜くと傾きが 14% も跳ね上がるのに対し、 2 位の神奈川県ですら 2.5% しか動きません。 47 サンプルのうち、 実質的に「1 県が回帰直線の向きを握っている」状態です。 理由はてこの原理(レバレッジ)で説明できます。 東京都の一般診療所数 14,894 は 47 県の中央値 1,369 の約 10.9 倍で、 説明変数軸の端に孤立しているため、 回帰直線は東京を通るように強く引っ張られます。 統計量で言えば東京都のレバレッジは h = 0.53 で、 47 サンプルの平均レバレッジ 2/47 ≒ 0.043 の 12 倍超。 「訓練データが 47 件ある」と数えても、 有効な発言権は均等に 1/47 ずつではないのです。
この例の相関係数は r = 0.972 と一見「理想的な訓練データ」に見えます。 しかし東京都を除いても r = 0.969 とほぼ変わらないのに、 傾きは 14% 変わる——つまり 相関の高さは、 個々のサンプルの影響力の偏りを何も保証しないのです。 実害は小規模県の予測に出ます。 全 47 県で学習した直線で鳥取県を予測すると 約 82.1 万人(実測値 820,852 人)ですが、 実際の総人口は 53.7 万人。 大都市に引っ張られた直線が、 最小県を 約 28.4 万人(実測比 +53%)も過大予測します。 さらに危険なのは分割との相互作用で、 東京都が train に入るか test に入るかで「別のモデル」と言ってよいほど結果が変わるため、 ホールドアウト 1 回の評価は乱数シード次第で大きくブレます(本ページ冒頭のコード例でも、 test 9 県の平均人口 4,407,667 人 vs train 30 県の 2,162,600 人と、 分割だけで人口構成が倍以上ずれていました)。 平均 2,645,809 人と中央値 1,549,000 人が 1.7 倍も乖離した右裾分布では、 「平均的な県」を代表するサンプルはそもそも存在しない、 と考えるのが安全です。 対策は (1) 交差検証で「どの県が抜けても結論が変わらないか」を確認する、 (2) 対数変換などでレバレッジを圧縮する、 (3) Huber 回帰などのロバスト回帰(本教材では専用ページ未整備)で影響を頭打ちにする、 (4) 影響力の大きい点を外れ値として機械的に捨てる前に「本当に除外してよい母集団か」を考える、 の 4 点です。 東京都は測定ミスではなく実在する 1400 万人なので、 「予測したい対象に東京都型の地域が含まれるか」という問題設定こそが除外可否を決めます。
「1 点抜きで結果がどう動くか」は、 統計学では 影響度分析(Cook の距離、 DFBETAS など。 本教材では専用ページ未整備)として古くから体系化されています。 機械学習側では同じ発想が influence function(Koh & Liang, 2017)として再発見され、 深層学習モデルでも「この予測に効いた訓練サンプルはどれか」を推定できるようになりました。 さらに各訓練サンプルの貢献をゲーム理論の Shapley 値で配分する Data Shapley(Ghorbani & Zou, 2019)へ発展し、 「価値の低いデータを捨てると精度が上がる」「価値の高いデータだけ追加収集する」というデータ中心 AI(Data-Centric AI)の定量的な土台になっています。 訓練データを「何件あるか」で数える段階から、 「どの 1 件がいくらの価値を持つか」で管理する段階へ——本ページで学んだ量・質・分割に続く第 4 の視点として覚えておくと、 バイアス・バリアンスやデータリーケージの議論も「サンプル単位」の解像度で見直せるようになります。