初めてでもわかる標準化
はじめに
データサイエンスを学び始めると、必ず出てくる言葉――「標準化」。
なんとなく聞いたことはあるけれど、「なぜ平均0・分散1にするのか?」と問われると、言葉が詰まってしまう人も多いのではないでしょうか。
この記事では、数式が苦手でも“腑に落ちる”ように、標準化の考え方をやさしく解説していきます。
対象は、DS検定の学習者やデータサイエンス初学者です。
読後には、「あ、そういうことか!」と自然に言葉にできるようになるはずです。
なぜ標準化が必要なのか
データ分析では、さまざまな単位の数値を同時に扱います。
たとえば「身長(cm)」と「年収(万円)」をそのまま一緒に分析したらどうなるでしょうか?
数値の桁が大きい「年収」のほうが、距離や重みの計算で強く効いてしまいます。
すると、モデルが“年収ばかり見る”偏った判断をしてしまうのです。
このような「単位の違いによる不公平さ」をなくすために行うのが、標準化(Standardization)です。
標準化は、すべての特徴量を「同じ物差し」で比べられるようにするための、最も基本的で大切な前処理です。
標準化とは?
一言で言うと、
「データの平均を0、ばらつきの大きさを1にそろえる操作」
標準化の式はシンプルです。
(データ − 平均) ÷ 標準偏差
この計算をすると、データは平均0・分散1の新しいスケールに変換されます。
これを「Zスコア」と呼びます。
たとえば、ある人の身長が170cm、平均が160cm、標準偏差が5cmだとします。
この人のZスコアは
(170−160) ÷ 5 = 2.0
となり、「平均より2σ(標準偏差2つ分)高い」という意味になります。
このように、標準化はデータを「単位のない“σ基準”」に変えることで、どんな指標でも同じ基準で比べられるようにしてくれるのです。
🔍 平均0・分散1になる理由
まず、平均が0になる理由はシンプルです。
平均からのズレ(データ−平均)を全員分足すと、上にずれた分と下にずれた分がちょうど打ち消し合うからです。
次に、分散が1になる理由をもう少し丁寧に見てみましょう。
分散は「ズレを二乗して平均したもの」でしたね。
標準化では、ズレを標準偏差(σ)で割ることで「ズレを1/σ倍」に縮めています。
長さを1/σ倍に縮めると、その二乗(面積に相当する値)は1/σ²倍に縮みます。
もともと分散はσ²なので、
σ² ÷ σ² = 1
となり、分散が1に統一されるわけです。
つまり、「ズレの大きさをそのデータ自身のばらつきで割って、どれくらい“相対的に”離れているかを見る」のが標準化なのです。
二乗する理由
ズレにはプラスとマイナスがあります。
平均より上の人もいれば、下の人もいます。
そのまま足すと±が打ち消し合って0になってしまうので、“広がり”を正しく測るために二乗するのです。
また、二乗には「大きく外れた値を強くカウントする」という性質もあります。
統計学ではこの性質を利用して、「ばらつき」や「誤差」を測るときに二乗を使います。
機械学習でも、損失関数や距離計算など、ほとんどが“二乗の世界”で成り立っています。
なぜ「標準偏差」で割るのか?
それは、広がりの単位そのものでスケールをそろえるためです。
標準偏差は「データ全体のばらつきの単位」を表しています。
これを基準にすれば、すべての特徴量を“ばらつき1単位”で表すことができるのです。
つまり、
ズレの大きさ(分子)を
そのデータのばらつきの単位(分母)で割る
ことで、「ズレ/ズレの単位=1単位あたりのズレ」が求まります。
この「単位を消す」ことこそが、標準化の本質です。
標準化のメリット
① 単位をそろえて公平に比較できる
身長も年収も温度も、同じ基準で距離や差を計算できるようになります。
② 学習の安定化
勾配降下法を使うアルゴリズムでは、スケールがそろっているほど収束が早く、安定します。
③ モデルの性能向上
距離や内積を扱う手法(KNN、SVM、線形回帰、PCAなど)では、特徴量の影響が偏らなくなります。
④ 確率的な解釈が可能になる
Zスコアを使えば、「平均から何σ離れているか」で確率的に異常値を検出できます。
似た概念との違い
標準化(Standardization)は「平均0・分散1」に変換する方法。
一方、正規化(Normalization)は「最小0・最大1」にスケーリングするだけの方法です。
どちらも“スケールをそろえる”前処理ですが、
標準化は確率的な解釈や勾配法に強い
正規化は範囲を制御したいときに使う
と覚えておくとよいでしょう。
また、外れ値が多いデータでは、中央値や四分位範囲を使う「ロバストスケーリング(RobustScaler)」も有効です。
データサイエンスでの応用
標準化は、ほぼすべての“距離・内積・勾配”ベースの手法で使われます。
代表的なものは以下のとおりです。
線形回帰・ロジスティック回帰
K近傍法(KNN)
サポートベクターマシン(SVM)
主成分分析(PCA)
ニューラルネットワークの前処理
逆に、決定木やランダムフォレストなどの“木系モデル”は、スケールに影響されないため標準化は不要です。
事例で考える
2つの特徴量を持つデータを考えます。
1つは0〜200の範囲、もう1つは0〜1の範囲のデータです。
このままK近傍法を使うと、距離計算で0〜200の特徴量が圧倒的に支配し、
もう1つの特徴量の影響はほとんど消えてしまいます。
ところが、標準化して両方の広がりを「1」にそろえると、
どちらの特徴量も同じ重みで距離に寄与し、分類の精度が向上します。
これが、標準化が“公平な比較”を生み出す実例です。
よくある疑問への答え
Q1. なぜ二乗するの?
符号を消して“広がり”を正しく測るため。大きなズレを強調できる利点もあります。
Q2. なぜ標準偏差で割るの?
広がりの単位そのものでスケールをそろえると、分散が1に統一されるからです。
Q3. 正規分布じゃないと使えない?
いいえ。正規分布ならZスコアで確率を読めるだけで、非正規でも問題なく使えます。
Q4. 標準化しないほうがいいケースは?
木系モデルや、すでに同じスケールの特徴量しかない場合です。
まとめ
標準化は、「平均0・分散1」にそろえる前処理です。
データの単位をなくし、特徴量を公平に比較できるようにします。
ズレを標準偏差で割ることで、ばらつきの単位を共通化し、モデルの学習を安定化させます。
標準化は「見た目を整える」操作ではなく、「分析の公平さを確保するための基本ルール」です。
Pythonサンプルコード
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import numpy as np
# ダミーデータ
rng = np.random.RandomState(0)
X = np.c_[rng.normal(170, 10, 500), rng.normal(500, 200, 500)]
y = (X[:, 0] + 0.01 * X[:, 1] > 170).astype(int)
X_tr, X_te, y_tr, y_te = train_test_split(X, y, stratify=y, random_state=0)
pipe = make_pipeline(
StandardScaler(), # ここで標準化
LogisticRegression(max_iter=1000)
)
pipe.fit(X_tr, y_tr)
print("Accuracy:", accuracy_score(y_te, pipe.predict(X_te)))