論文中に 「標準化」として登場する用語。
標準化 とは:各値を「(値−平均)/標準偏差」に変換し、平均0・分散1に揃える。単位の違う変数の比較・統合に必須。
標準化(standardization, z-score normalization)は、 異なる単位・スケールの変数を「平均0、 標準偏差1」に揃える前処理。
変数1(平均100)と変数2(平均50)でスケールが大きく違うと、 直接比較できません。 標準化すれば両方とも同じスケールに。
$$ z = \frac{x - \mu}{\sigma} $$
z は無次元で、 「平均から何標準偏差離れているか」を表します。
| 手法 | 標準化必要? | 理由 |
|---|---|---|
| k-NN, SVM | ✅ 必須 | 距離に基づくため |
| k-means | ✅ 必須 | 距離に基づくため |
| PCA | ✅ 必須 | 分散を比較するため |
| 線形回帰 | ○ 推奨 | 係数比較・正則化のため |
| Ridge, LASSO | ✅ 必須 | 正則化が公平に効くため |
| ニューラルネット | ✅ 必須 | 学習の安定化 |
| 決定木 / RF / XGB | ❌ 不要 | スケール不変 |
(x - min) / (max - min) で 0〜1 に押し込む。 ニューラルネット入力に。
中央値と IQR を使う。 外れ値に強い。
各サンプルベクトルのノルムを 1 に。 テキスト分析でよく使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler # 標準化 scaler = StandardScaler() X_train_std = scaler.fit_transform(X_train) X_test_std = scaler.transform(X_test) # 重要: テストはtransformのみ # Min-Max scaler = MinMaxScaler(feature_range=(0, 1)) # Robust(外れ値に強い) scaler = RobustScaler() # pipeline で漏れなく from sklearn.pipeline import Pipeline pipe = Pipeline([ ('scaler', StandardScaler()), ('model', LinearRegression()) ]) pipe.fit(X_train, y_train) |
外れ値が多いデータでは StandardScaler は影響を受けます。 中央値と IQR を使う Robust Scaler が安全:
$$ z = \frac{x - \text{median}}{IQR} $$
Cross-validation で「fit を訓練データのみ」「transform をテストデータにも」を正しく行うため、 sklearn の Pipeline を必ず使う。 これを怠るとデータリークが起きる。
| 目的 | 1変数 | 2変数 | 多変量 |
|---|---|---|---|
| 記述 | 平均, 中央値, 分散 | 相関, 共分散 | PCA, 因子分析 |
| 可視化 | ヒストグラム, 箱ひげ | 散布図, ヒートマップ | 散布図行列, バイプロット |
| 予測 | 時系列モデル | 単回帰 | 重回帰, Ridge, LASSO |
| 分類 | ロジスティック回帰 | 判別分析 | SVM, RF, NN |
| グループ化 | 階級分け | 2次元クラスタリング | k-means, 階層クラスタリング |
| 検定 | 1標本t検定 | 2標本t検定, χ² | ANOVA, MANOVA |
| n | 推奨手法 |
|---|---|
| n < 10 | 記述統計のみ、 ノンパラ検定、 ベイズ統計 |
| 10 ≤ n < 30 | t検定, ブートストラップ, 単回帰 |
| 30 ≤ n < 200 | 重回帰, ANOVA, 階層クラスタリング |
| 200 ≤ n < 10000 | 複雑な回帰, RF, GBM, k-means |
| n ≥ 10000 | 深層学習, 大規模分散学習 |
| ライブラリ | 用途 |
|---|---|
| numpy | 数値計算の基礎、 行列演算 |
| pandas | データフレーム、 表操作 |
| scipy | 統計関数、 最適化、 線形代数 |
| statsmodels | 古典統計、 検定、 回帰分析の詳細 |
| scikit-learn | 機械学習、 前処理、 評価 |
| matplotlib | 基本可視化 |
| seaborn | 統計的可視化(高級) |
| plotly | インタラクティブ可視化 |
| xgboost / lightgbm | 勾配ブースティング |
| PyTorch / TensorFlow | 深層学習 |
このページで扱った概念を、 学習効率のためにまとめます。 これを毎日見ることで、 統計の基礎が体に染み込みます。
| 記号 | 意味 | 読み方 |
|---|---|---|
| μ | 母平均 | ミュー |
| σ | 母標準偏差 | シグマ |
| σ² | 母分散 | シグマ二乗 |
| x̄ | 標本平均 | エックスバー |
| s | 標本標準偏差 | エス |
| n | 標本サイズ | エヌ |
| p | p値、 比率 | ピー |
| α | 有意水準 | アルファ |
| β | 回帰係数、 第二種誤り率 | ベータ |
| r | 相関係数 | アール |
| R² | 決定係数 | アール二乗 |
| Σ | 総和記号、 共分散行列 | シグマ大文字 |
| N(μ, σ²) | 正規分布 | ノーマル ミュー シグマ二乗 |
| t(df) | t分布 | ティー |
| χ²(df) | カイ二乗分布 | カイ二乗 |
| F(d1, d2) | F分布 | エフ |
| H₀, H₁ | 帰無仮説、 対立仮説 | エイチゼロ、 エイチワン |
| E[X] | 期待値 | エクスペクタンス |
| Var(X) | 分散 | バリアンス |
| Cov(X, Y) | 共分散 | カバリアンス |
💡 統計学・データサイエンスは「記号の意味を理解する」ことが最初の壁。 各記号が何を表すか、 公式の中での役割を覚えてしまえば、 後はパターンの組合せで様々な手法が理解できます。
(CRISP-DM プロセスより)
| 分野 | 主要技術 | 代表ツール |
|---|---|---|
| 記述統計 | 要約量、 可視化 | pandas, matplotlib |
| 推測統計 | 検定、 信頼区間 | scipy.stats, statsmodels |
| 機械学習 | 予測、 分類、 クラスタリング | scikit-learn, XGBoost |
| 深層学習 | NN、 画像、 自然言語 | PyTorch, TensorFlow |
| 時系列 | ARIMA、 状態空間、 LSTM | statsmodels, prophet |
| 因果推論 | RCT、 IV、 DiD、 PSM | DoWhy, EconML |
| ベイズ統計 | MCMC、 変分推論 | PyMC, Stan |
| 最適化 | 線形/凸/離散最適化 | scipy.optimize, cvxpy |
これらは互いに深く関連します:
標準化 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 前処理 › 変換 › 標準化
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「標準化」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「標準化」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 ジャストインタイム学習のヒント:3つの視点を行き来することで、 概念を多角的に理解できます。 包含マップやツリーマップはズーム/ドリルダウンで大分類から細部まで探索できます。
標準化に関連するキーワードを 機能別 に索引化しました。 検索時の語彙拡張、 関連語の発見、 章間ナビゲーションに役立ちます。
| カテゴリ | キーワード(日本語) | キーワード(英語) |
|---|---|---|
| 基本概念 | 標準化、 Zスコア化、 平均0分散1化、 中心化(センタリング)、 スケーリング | standardization, z-score, scaling, centering, normalization |
| 派生・関連手法 | Min-Max正規化、 Robustスケーリング、 単位ベクトル化、 対数変換、 Box-Cox変換、 Yeo-Johnson変換 | Min-Max scaling, RobustScaler, unit vector, log transform, Box-Cox, Yeo-Johnson |
| 理論基盤 | 平均、 分散、 標準偏差、 共分散、 相関係数、 線形変換 | mean, variance, standard deviation, covariance, correlation, linear transformation |
| 応用先 | 主成分分析、 k平均法、 サポートベクターマシン、 ニューラルネットワーク、 リッジ回帰、 ラッソ回帰 | PCA, k-means, SVM, neural network, ridge, lasso |
| 実装ライブラリ | scikit-learn、 SciPy、 NumPy、 pandas、 statsmodels | StandardScaler, scipy.stats.zscore, numpy, DataFrame, statsmodels |
| 注意点 | データリーケージ、 訓練・テスト分割、 fit_transform、 transform、 パイプライン | data leakage, train-test split, fit_transform, transform, Pipeline |
独立行政法人 統計センターの公的データ SSDSE-B(地域経済データ、 47都道府県×複数年) を使って、 標準化の具体的な計算を体験します。
| 都道府県 | 人口(万人) | 平均所得(万円) | 完全失業率(%) |
|---|---|---|---|
| 東京都 | 1396 | 532 | 2.4 |
| 神奈川県 | 923 | 443 | 2.5 |
| 大阪府 | 881 | 379 | 3.1 |
| 愛知県 | 754 | 391 | 2.0 |
| 鳥取県 | 55 | 274 | 2.7 |
単位が 万人・万円・% とバラバラなので、 そのまま距離計算(k-means等)すると 人口の数値が大きく寄与し過ぎる。 そこで標準化を適用します。
47都道府県の人口データから 平均 μ ≈ 270、 標準偏差 σ ≈ 280 が得られたとします。
東京都の標準化値 z = (1396 − 270) / 280 ≈ +4.02(平均から4σも上)
神奈川県 z = (923 − 270) / 280 ≈ +2.33、 鳥取県 z = (55 − 270) / 280 ≈ −0.77
| 都道府県 | 人口 z | 所得 z | 失業率 z |
|---|---|---|---|
| 東京都 | +4.02 | +3.81 | −1.05 |
| 神奈川県 | +2.33 | +1.46 | −0.83 |
| 大阪府 | +2.18 | −0.22 | +0.49 |
| 愛知県 | +1.73 | +0.10 | −1.93 |
| 鳥取県 | −0.77 | −2.59 | +0.05 |
💡 標準化後はすべて 「平均0からのσ単位の距離」 という共通スケールに揃うため、 k-meansや主成分分析、 距離ベースの近傍法でも公平に扱える。
標準化は 4 つの代表的なライブラリ で実装できます。 用途に応じて使い分けましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sklearn.linear_model import Ridge df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) X = df[['人口', '平均所得', '完全失業率']] y = df['消費支出'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # Pipelineで漏れなくfit pipe = Pipeline([ ('scaler', StandardScaler()), ('model', Ridge(alpha=1.0)) ]) pipe.fit(X_train, y_train) print('R^2:', pipe.score(X_test, y_test)) |
1 2 3 4 5 6 7 8 9 | import pandas as pd from scipy.stats import zscore df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) # ddof=1 で標本標準偏差。 NaN は nan_policy='omit' で除外 df_std = df[['人口', '平均所得', '完全失業率']].apply( lambda x: zscore(x, ddof=1, nan_policy='omit') ) print(df_std.describe()) # mean ≈ 0, std ≈ 1 |
1 2 3 4 5 6 7 8 9 10 11 | import numpy as np import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) X = df[['人口', '平均所得', '完全失業率']].to_numpy() mu = X.mean(axis=0) # 各列の平均 sigma = X.std(axis=0, ddof=0) # 母標準偏差(scikit-learnと同じ) X_std = (X - mu) / sigma print('mean:', X_std.mean(axis=0).round(6)) print('std :', X_std.std(axis=0).round(6)) |
1 2 3 4 5 6 7 8 9 | import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) cols = ['人口', '平均所得', '完全失業率'] # ddof=1 がpandasのデフォルト df_std = (df[cols] - df[cols].mean()) / df[cols].std() df_std.columns = [c + '_z' for c in cols] df_combined = pd.concat([df, df_std], axis=1) print(df_combined.head()) |
1 2 3 4 5 6 7 8 | from sklearn.preprocessing import RobustScaler import pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2024.csv', encoding='shift_jis', skiprows=1) X = df[['人口', '平均所得', '完全失業率']] scaler = RobustScaler() # 中央値とIQRを使う X_robust = scaler.fit_transform(X) print(pd.DataFrame(X_robust, columns=X.columns).describe()) |
| 手法 | 中心 | スケール | 外れ値耐性 |
|---|---|---|---|
| StandardScaler | 平均 | 標準偏差 | 弱い |
| MinMaxScaler | 最小値 | 最大−最小 | 弱い |
| RobustScaler | 中央値 | IQR | 強い |
| MaxAbsScaler | 0 | |max| | 弱い |