見出し画像

初めてでもわかる標準化

はじめに

データサイエンスを学び始めると、必ず出てくる言葉――「標準化」。
なんとなく聞いたことはあるけれど、「なぜ平均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)))

いいなと思ったら応援しよう!