【標準得点】統計学や機械学習で登場するZ値(Zスコア)をわかりやすく解説

模試で国語が80点、数学が60点だったとき、あなたはどちらの成績が「よかった」と言えるでしょうか。点数だけ見れば国語ですが、数学はみんなが解けない難問だらけで平均が40点、国語は易しくて平均が75点だったとしたら、話はまったく変わってきます。「点数そのもの」ではなく「みんなの中での立ち位置」で測りたい — この当たり前の欲求に、統計学はひとつの明快な答えを用意しています。それがZスコア(標準得点)です。

Zスコアは、データの値から平均を引き、標準偏差で割るという、たった2ステップの変換です。これだけで、平均も単位もバラバラなデータを「平均0・標準偏差1」という共通の物差しに乗せ替えることができます。受験でおなじみの偏差値もこのZスコアを少し化粧直ししたものですし、機械学習で回帰や分類の精度を底上げする特徴量の標準化(StandardScaler)、品質管理や異常検知での外れ値検出も、すべてZスコアが土台になっています。

本記事の内容

  • Zスコアの直感的な意味と数学的定義 $z=(x-\mu)/\sigma$
  • 標準化すると「平均0・分散1」になる理由の導出
  • 偏差値との関係、正規分布を使った確率計算、外れ値検出への応用
  • 機械学習での特徴量標準化、min-max正規化との違い
  • NumPy / scikit-learn によるPython実装と結果の考察

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

平均・分散・標準偏差という基本統計量を扱うので、それらの定義に不安がある場合は先に確認しておきましょう。

Zスコアを直感で理解する — 「基準を揃える」とは

Zスコアの核心は「ものさしを揃える」ことにあります。冒頭の模試の例をもう一度考えてみましょう。

国語: あなた80点、平均75点、標準偏差5点。数学: あなた60点、平均40点、標準偏差10点。素点だけなら国語の勝ちですが、「平均からどれだけ抜け出しているか」を、その科目の「ばらつき1個分」を単位にして測り直すと景色が変わります。国語は平均より5点上で、これは標準偏差ちょうど1個分。数学は平均より20点上で、これは標準偏差2個分です。つまり数学のほうが、集団の中でずっと突き抜けているのです。

この「平均からの距離を、標準偏差を単位にして測った値」こそがZスコアです。長さをcmで測るかインチで測るかが場面で変わるように、データのばらつきの大きさは科目や測定対象ごとにバラバラです。Zスコアは、その「ばらつき1個分」を共通の目盛りとして採用することで、異なる対象を公平に比較できるようにします。

もう少し噛み砕くと、私たちが何かを「すごい」「異常だ」と感じるとき、無意識に2つの情報を使っています。ひとつは「平均からどれだけ離れているか」、もうひとつは「そもそもこの集団はどれくらいバラつくものなのか」です。身長180cmが珍しいのは、平均(約170cm)から離れているうえに、身長という量がせいぜい数cm〜十数cmしかバラつかないからです。一方、月収が平均より10万円高くても、月収という量はもともと数十万円のオーダーでバラつくので、それほど驚きません。Zスコアはこの2つの情報を $z=(x-\mu)/\sigma$ という1個の数にまとめてくれます。分子が「平均からの離れ具合」、分母が「その集団の標準的なバラつき」で、両者の比を取ることで「バラつきを基準にしてどれだけ珍しいか」が一発で出るのです。

ここで「平均で中心を合わせる」だけでは不十分なことに注意しましょう。中心を合わせただけだと、国語の偏差(点数−平均)と数学の偏差を直接比べることになりますが、両者の単位(バラつきの大きさ)が違うので公平ではありません。標準偏差で割って初めて、両者が「無次元(単位なし)」の同じ尺度になり、リンゴとミカンを足し引きできるようになります。この「単位を消す」効果こそが、Zスコアが分野を超えて使われる最大の理由です。

身長データの標準化前後の分布。元データは平均165cm・標準偏差8cmだが、Zスコア化すると平均0・標準偏差1の標準正規分布に重なる

上の図は、身長データ(平均165cm、標準偏差8cm)を標準化する前後を比べたものです。左の元データは「165cmを中心に8cm程度の広がり」を持っていますが、右のZスコアに変換すると、分布の形(山なりのなだらかさ)はそのまま保たれたまま、中心が0に、広がりが1に揃っていることが読み取れます。標準化は分布を歪めたり潰したりするのではなく、目盛りを付け替えているだけだ、という点がポイントです。

この「中心を0に、ばらつきを1に揃える」操作を、次は数式として正確に書き下していきましょう。

Zスコアの定義 — $z=(x-\mu)/\sigma$

Zスコアは、平均からの距離を標準偏差で割ったものです。式の前に意味を一言で言えば、「そのデータが平均から標準偏差いくつ分離れているか」を表す無次元の数です。

標準偏差を $\sigma$、平均を $\mu$ としたとき、ある値 $x$ のZスコア(Z値、標準得点)は次のように定義されます。

$$ \begin{equation} z = \frac{x – \mu}{\sigma} \end{equation} $$

式の意味を分解してみましょう。分子の $x – \mu$ は「平均からのズレ(偏差)」です。これがプラスなら平均より上、マイナスなら平均より下にいることを示します。そのズレを分母の $\sigma$ で割ることで、「ズレが標準偏差の何個分か」に換算されます。

たとえば $x=9$、$\mu=6$、$\sigma=2$ なら、

$$ z = \frac{9 – 6}{2} = \frac{3}{2} = 1.5 $$

となり、「平均より標準偏差1.5個分だけ上にいる」と読めます。$z=0$ なら平均ちょうど、$z=-1$ なら平均より標準偏差1個分だけ下、という具合です。

この変換は、幾何的には2つの単純な操作の組み合わせとして理解できます。

Zスコア変換の幾何的な意味。元データの数直線から平均を引いて平行移動し、標準偏差で割って拡大縮小する2段階の操作

上の図は $x=9$($\mu=6,\sigma=2$)が $z=1.5$ に変換される過程を3本の数直線で表したものです。①まず平均 $\mu$ を引くことで、平均が原点0に来るように全体を平行移動します。これで $x-\mu=3$ になります。②次に標準偏差 $\sigma$ で割ることで、ばらつき1個分が長さ1になるように拡大縮小します。結果として $z=3/2=1.5$ が得られます。Zスコア化とは、この「平行移動」と「スケール変更」をセットで行う操作なのだ、と図から直感的につかめます。

機械学習の分野では、データ全体を一斉にこのZスコアへ変換することを標準化(standardization)基準化と呼びます。英語では Z-score normalization とも言います。データセット $\bm{X} = (x_1, x_2, \dots, x_n)$ の各要素 $x_i$ について、

$$ \begin{equation} z_i = \frac{x_i – \mu}{\sigma}, \quad \mu = \frac{1}{n}\sum_{i=1}^{n} x_i, \quad \sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(x_i – \mu)^2} \end{equation} $$

と計算します。標準化するためには、事前にデータ $\bm{X}$ の平均 $\mu$ と標準偏差 $\sigma$ を求めておく必要があります。これは後で機械学習に応用するとき、「学習データで求めた $\mu, \sigma$ をテストデータにも使う」という重要な注意点につながります。

ひとつ補足しておくと、標準偏差 $\sigma$ の計算には2つの流儀があります。上の式のように $n$ で割る母標準偏差と、$n-1$ で割る不偏標準偏差です。標本から母集団のばらつきを推定したい統計的な場面では $n-1$ を使い(NumPyでは ddof=1)、データそのものを変換するだけの前処理(scikit-learnの StandardScaler など)では $n$ で割るのが標準です(ddof=0)。Zスコアを大量データで計算する場合、$n$ と $n-1$ の違いは無視できるほど小さいので、どちらを使っても実用上の結論は変わりません。ただし「平均0・分散1になる」という性質を厳密に語るときは、平均・分散の計算と割り算の $\sigma$ で同じ流儀をそろえる必要がある、という点だけ頭に入れておきましょう。

また、Zスコアの符号と大きさには明確な読み方があります。符号は「平均より上か下か」、絶対値は「どれだけ珍しいか」を表します。$|z|$ が0に近いほど平均的でありふれた値、$|z|$ が大きいほど集団から外れた珍しい値です。この「珍しさのものさし」という解釈が、後で見る外れ値検出の直接の根拠になります。

では、この変換を施すと結果のデータはどんな性質を持つのでしょうか。次の章で確かめます。

標準化の意味と性質 — なぜ平均0・分散1になるのか

標準化の最も大切な性質は、変換後のデータは必ず平均0・分散1(標準偏差1)になることです。これは「たまたまそうなる」のではなく、定義から数学的に保証されています。導出してみましょう。

まず、標準化後の平均 $\bar{z}$ を計算します。Zスコアの定義 $z_i = (x_i – \mu)/\sigma$ を代入すると、

$$ \begin{align} \bar{z} &= \frac{1}{n}\sum_{i=1}^{n} z_i = \frac{1}{n}\sum_{i=1}^{n} \frac{x_i – \mu}{\sigma} \end{align} $$

ここで $\sigma$ は $i$ によらない定数なので、和の外に出せます。

$$ \begin{align} \bar{z} &= \frac{1}{\sigma} \cdot \frac{1}{n}\sum_{i=1}^{n} (x_i – \mu) \end{align} $$

和の中を分配すると $\frac{1}{n}\sum x_i = \mu$ であり、$\frac{1}{n}\sum \mu = \mu$ なので、

$$ \begin{align} \bar{z} &= \frac{1}{\sigma}\left( \mu – \mu \right) = 0 \end{align} $$

となり、標準化後の平均は必ず0になります。「平均を引く」操作が効いていることがわかります。

次に分散を求めます。平均が0であることを使うと、標準化後の分散 $V[z]$ は、

$$ \begin{align} V[z] &= \frac{1}{n}\sum_{i=1}^{n} (z_i – \bar{z})^2 = \frac{1}{n}\sum_{i=1}^{n} z_i^2 \end{align} $$

ここで $z_i = (x_i – \mu)/\sigma$ を代入します。

$$ \begin{align} V[z] &= \frac{1}{n}\sum_{i=1}^{n} \left( \frac{x_i – \mu}{\sigma} \right)^2 = \frac{1}{\sigma^2} \cdot \frac{1}{n}\sum_{i=1}^{n} (x_i – \mu)^2 \end{align} $$

最後に、$\frac{1}{n}\sum (x_i – \mu)^2$ はまさに元データの分散 $\sigma^2$ の定義そのものです。これを代入すると、

$$ \begin{align} V[z] &= \frac{1}{\sigma^2} \cdot \sigma^2 = 1 \end{align} $$

となり、標準化後の分散は必ず1、したがって標準偏差も1になります。「標準偏差で割る」操作がばらつきを1に正規化しているわけです。

3科目(国語・数学・英語)の素点分布と標準化後の分布。素点では平均もばらつきもバラバラだが、標準化後はすべて平均0・分散1に重なる

上の図は、平均もばらつきも異なる3科目(国語・数学・英語)の分布を標準化したものです。左の素点ではそれぞれ中心も広がりもバラバラですが、右の標準化後では3科目すべてがほぼ重なり合い、平均0・分散1の共通の土俵に乗っていることが確認できます。凡例の数値もそれぞれ平均がほぼ0.00、分散がほぼ1.00になっており、先ほどの導出と一致しています。

なお、ここで一点強調しておきたいのは、標準化は分布の「形」を変えないということです。平均を引くのは平行移動、標準偏差で割るのは一様な拡大縮小であり、どちらもデータ点どうしの相対的な順序や間隔の比を保つ線形変換です。したがって、もとが右に歪んだ分布なら標準化後も右に歪んだまま、二峰性(山が2つ)なら二峰性のまま残ります。「標準化すれば正規分布になる」というのはよくある誤解で、正しくは「もとが正規分布なら標準化後は標準正規分布になる」だけです。歪んだデータを正規分布に近づけたいなら、対数変換やBox-Cox変換といった非線形変換が別途必要になります。標準化はあくまで「位置とスケールを揃える」操作であって、「形を整える」操作ではない、と区別しておきましょう。

この「どんなデータも平均0・分散1にできる」という性質が、Zスコアをこれほど広く使われる道具にしています。次は、最も身近な応用である偏差値との関係を見ていきましょう。

偏差値との関係 — $T = 50 + 10z$

受験でおなじみの偏差値は、実はZスコアそのものです。ただ、Zスコアは平均0・標準偏差1なので、値が $-3$ から $+3$ あたりの小さな数になり、しかも半分はマイナスです。「偏差値マイナス1.5」と言われてもピンと来ませんし、マイナスの成績は気分も良くありません。そこで、扱いやすいように平均50・標準偏差10に置き直したものが偏差値です。

偏差値 $T$ はZスコア $z$ から次の線形変換で得られます。

$$ \begin{equation} T = 50 + 10z = 50 + 10 \cdot \frac{x – \mu}{\sigma} \end{equation} $$

この式の意味は明快です。平均($z=0$)の人は偏差値50になり、標準偏差1個分上($z=1$)なら偏差値60、2個分上($z=2$)なら偏差値70、逆に1個分下($z=-1$)なら偏差値40になります。

偏差値とZスコアの線形関係。横軸z、縦軸が偏差値で、z=0が偏差値50、z=1が60、z=2が70と直線で対応する

上の図は偏差値 $T$ とZスコア $z$ の関係を直線で示したものです。両者は完全な直線(線形変換)の関係にあり、Zスコアを10倍して50を足しているだけだとひと目でわかります。偏差値70が「すごい」と感じられるのは、それが $z=2$、つまり標準偏差2個分も平均を上回っており、正規分布なら上位約2.3%に入る位置だからです。

偏差値もZスコアも「平均からの相対位置」を表す点では同じですが、Zスコアのまま扱う最大の利点は、正規分布の確率と直接結びつけられることです。次はその確率計算を見ていきます。

正規分布での確率計算 — 標準正規分布と68-95-99.7ルール

元データが正規分布に従うとき、標準化すると標準正規分布 $N(0, 1)$(平均0・分散1の正規分布)になります。標準正規分布は1種類しかないので、その確率を一度表にしておけば、どんな正規分布のデータでもZスコアに直して確率を読み取れます。これがZスコアの大きな実用的価値です。

標準正規分布の確率密度関数は次の形をしています。

$$ \begin{equation} \phi(z) = \frac{1}{\sqrt{2\pi}} \exp\!\left( -\frac{z^2}{2} \right) \end{equation} $$

そして「Zスコアが $z$ 以下になる確率」を表す累積分布関数を $\Phi(z) = P(Z \leq z)$ と書きます。

正規分布には覚えておくと便利な経験則、いわゆる68-95-99.7ルールがあります。

$$ \begin{align} P(|z| \leq 1) &\approx 0.683 \quad (\text{平均} \pm 1\sigma) \\ P(|z| \leq 2) &\approx 0.954 \quad (\text{平均} \pm 2\sigma) \\ P(|z| \leq 3) &\approx 0.997 \quad (\text{平均} \pm 3\sigma) \end{align} $$

つまり、データの約68%は平均から標準偏差1個分以内に、約95%は2個分以内に、約99.7%は3個分以内に収まる、ということです。

標準正規分布と±kσの確率。±1σで68.3%、±2σで95.4%、±3σで99.7%の面積が塗り分けられている

上の図は標準正規分布の曲線と、$\pm1\sigma, \pm2\sigma, \pm3\sigma$ の範囲の面積(確率)を塗り分けたものです。中心に近いほど密度が高く、$\pm1\sigma$ の狭い範囲だけで全体の約68%を占めていることが視覚的にわかります。逆に $|z|>3$ の裾の部分は全体のわずか0.3%しかなく、「Zスコアが3を超えるのは非常に珍しい」という事実が、次の外れ値検出の根拠になります。

たとえば「偏差値60以上は上位何%か」を知りたければ、偏差値60は $z=1$ なので、$P(z > 1) = 1 – \Phi(1) \approx 1 – 0.841 = 0.159$、すなわち上位約16%だと計算できます。このようにZスコアは確率への変換器として働きます。

確率に直せるということは、「めったに起きない値」を判定できるということです。これを使った外れ値検出を次に見ましょう。

外れ値検出への利用 — $|z| > 3$ を異常とみなす

データに混ざった異常な値(外れ値)を見つけたいとき、Zスコアは最もシンプルな道具のひとつです。先ほどの68-95-99.7ルールから、正規分布なら $|z|>3$ となる確率はわずか約0.3%でした。逆に言えば、もしあるデータ点のZスコアが $|z|>3$ なら、それは「正常なばらつきとしては起こりにくすぎる」値であり、外れ値の候補だと判断できます。

判定ルールはきわめて単純です。

$$ \begin{equation} \left| z_i \right| = \left| \frac{x_i – \mu}{\sigma} \right| > 3 \quad \Rightarrow \quad x_i \text{ は外れ値の候補} \end{equation} $$

しきい値を3にするのが一般的ですが、もっと厳しく2.5にしたり、緩く3.5にしたりと、用途に応じて調整します。

Zスコアによる外れ値検出。各データ点のZスコアを散布図にし、|z|>3の点をX印で外れ値として強調表示

上の図は、平均50・標準偏差5のデータに意図的に外れ値(78, 20, 72)を混ぜ、各点のZスコアをプロットしたものです。大多数の点は $\pm3$ の帯(薄い緑の領域)の中に収まっていますが、仕込んだ外れ値だけが帯の外($|z|>3$)に飛び出してX印で強調されているのが読み取れます。Zスコアにするだけで、「集団から見て異常な値」が機械的に拾えることがわかります。

なぜしきい値を3にするのが定番なのかも、確率の言葉で説明できます。正規分布のもとで $|z|>3$ となる確率は約0.27%、おおよそ370回に1回の珍しさです。これくらい稀なら「ただのばらつき」ではなく「何か特別な原因がある」と疑うのが妥当だ、という相場観からこのしきい値が広く使われています。逆に $|z|>2$(約4.6%、22回に1回)まで緩めると、正常なデータも頻繁に引っかかってしまうので、外れ値検出としては敏感すぎます。

ただし注意点があります。この方法は平均 $\mu$ と標準偏差 $\sigma$ を使いますが、これらの統計量自体が外れ値の影響を強く受けます。極端な値が混じると平均も標準偏差も引っ張られ、本来の外れ値が「思ったほどZスコアが大きくならない」ことがあります(マスキング効果)。たとえば1個だけ桁違いに大きな値があると、標準偏差 $\sigma$ がその値のせいで大きくなり、結果として $|z|$ が3を超えにくくなって取りこぼす、という皮肉な現象が起こります。外れ値に頑健な検出をしたい場合は、外れ値に引きずられにくい中央値と四分位範囲(IQR)を使う方法(修正Zスコアなど)が有効で、これは四分位数・箱ひげ図・IQRの記事で扱っています。Zスコアによる外れ値検出は「正規分布に近く、外れ値が少数」という前提のもとで手軽に使える方法だ、と位置づけておきましょう。

外れ値検出は「個々の値の異常さ」を測る応用でした。次は、機械学習でデータ全体を前処理する応用に進みます。

機械学習での特徴量標準化 — StandardScaler

機械学習では、回帰や分類のモデルを学習させる前に、入力となる特徴量を標準化することがほぼ定番の前処理になっています。説明変数を標準化すると、回帰モデルの精度や学習の速さが向上することが経験的に、そして理論的にも知られています。

なぜ効くのでしょうか。たとえば「年収(数百万円)」と「年齢(数十)」という2つの特徴量があると、スケールが100倍以上違います。勾配降下法で重みを更新するとき、このスケールの差は損失関数の形をいびつにし、収束を遅くします。標準化して両方を平均0・分散1に揃えると、各特徴量が対等に扱われ、最適化が素直に進みます。

特徴量標準化が勾配降下に与える効果。標準化なしでは損失の等高線が細長くジグザグに収束するが、標準化ありでは等高線がほぼ円でまっすぐ最小へ収束する

上の図は、損失関数の等高線と勾配降下法の軌跡を、標準化なし(左)とあり(右)で比べたものです。左ではスケール差のせいで等高線が細長い楕円になり、勾配降下がジグザグに振動しながらなかなか中心(最小値)に届きません。一方、標準化後の右では等高線がほぼ真円になり、軌跡が最短距離でまっすぐ最小値へ向かっているのが読み取れます。これが「標準化すると学習が速く安定する」ことの幾何的な理由です。

なぜ距離ベースの手法で標準化が効くのかは、ユークリッド距離の式を見ると明らかです。2点 $\bm{a}, \bm{b}$ の距離は $\sqrt{\sum_j (a_j – b_j)^2}$ で計算されますが、もし特徴量 $j$ のスケールだけが極端に大きいと、その項が和をほぼ独占してしまい、他の特徴量がまったく効かなくなります。年収(数百万)と年齢(数十)を素のままユークリッド距離に放り込むと、距離はほぼ年収だけで決まり、年齢の情報は無視されるのです。各特徴量を標準化して分散1に揃えれば、すべての特徴量が距離に対等に寄与するようになります。

正則化を使う線形モデル(リッジ回帰、ラッソ、ロジスティック回帰)でも事情は似ています。正則化項は重みの大きさにペナルティをかけますが、スケールの大きい特徴量は小さな重みでも出力に効くため、ペナルティが特徴量ごとに不公平にかかってしまいます。標準化して土俵を揃えることで、正則化が全特徴量に公平に働くようになります。

距離を使うアルゴリズム(k近傍法、k-means、SVM)や、正則化を使う手法(リッジ回帰、ロジスティック回帰)、主成分分析(PCA)では、標準化はほぼ必須です。一方、決定木やランダムフォレスト、勾配ブースティングのように「ある特徴量がしきい値より大きいか小さいか」だけを見る手法では、単調変換でしかない標準化は分割結果を変えないため、標準化はあまり問題になりません。「自分が使うアルゴリズムは距離・内積・正則化に依存するか?」を判断基準にすると、標準化が要るかどうかを見極められます。

ここで実務上きわめて重要な注意点があります。標準化に使う $\mu$ と $\sigma$ は必ず学習データから計算し、その同じ値をテストデータにも適用します。テストデータで改めて $\mu, \sigma$ を求めてしまうと、テストの情報が前処理に漏れ込み(データリーク)、評価が甘くなります。scikit-learn の StandardScaler が「fit は学習データだけ、transform は両方」という設計になっているのはこのためです。

標準化はスケール変換の代表格ですが、別のスケール変換である min-max 正規化とどう違うのでしょうか。次で比較します。

min-max正規化との違い

データのスケールを揃える方法はZスコア標準化だけではありません。よく使われるもう一つの手法が min-max正規化で、データを $[0, 1]$ の範囲に押し込めます。

$$ \begin{equation} x’ = \frac{x – x_{\min}}{x_{\max} – x_{\min}} \end{equation} $$

最小値が0、最大値が1に対応し、その間に線形に配置されます。両者の使い分けの勘所を整理すると次のようになります。

観点 Zスコア標準化 min-max正規化
変換後の中心 平均0 固定されない
変換後の範囲 固定されない(理論上 $\pm\infty$) $[0, 1]$ に固定
外れ値への耐性 比較的強い 弱い(1点の極値で全体が縮む)
向く場面 正規分布的、確率計算、距離・正則化 範囲固定が必要(画像の画素、一部のNN)

元データ・Zスコア標準化・min-max正規化の3つのヒストグラム比較。外れ値1点があると、min-maxは正常データが狭い範囲に圧縮される

上の図は、外れ値を1点含むデータに対して両手法を適用した結果です。Zスコア標準化(中央)では外れ値があっても大多数のデータは見やすく広がったままですが、min-max正規化(右)では外れ値が最大値になってしまい、正常なデータが [0, 0.4] あたりの狭い範囲に押し込められています。min-maxは範囲を $[0,1]$ に固定できる利点がある一方、極端な値1個に全体が引きずられる弱点があることが視覚的にわかります。確率計算や外れ値の影響を抑えたい場面ではZスコアが、入力範囲をきっちり固定したい場面ではmin-maxが向いている、と覚えておきましょう。

ここまでで理論と使い分けが揃いました。実際にコードで手を動かして、これらの性質を確かめてみましょう。

Pythonでの実装

まずは標準化を自前で実装し、定義どおり平均0・分散1になることを確認します。

import numpy as np

# 平均165・標準偏差8の身長データ(正規分布から生成)
rng = np.random.default_rng(1)
x = rng.normal(165, 8, 2000)

# Zスコア標準化(定義どおり)
mu = x.mean()
sigma = x.std()  # 母標準偏差(ddof=0)
z = (x - mu) / sigma

print(f"元データ:   平均={mu:.3f}, 標準偏差={sigma:.3f}")
print(f"標準化後:   平均={z.mean():.6f}, 標準偏差={z.std():.6f}")

# 特定の値のZスコア
x0 = 181.0  # 平均より2σ高い身長
print(f"x={x0}cm のZスコア = {(x0 - mu) / sigma:.3f}")

実行すると、元データの平均は約165、標準偏差は約8なのに対し、標準化後は平均が $0$(浮動小数点誤差レベル)、標準偏差が $1.000000$ になります。先ほど数式で導出した「標準化後は必ず平均0・分散1」という性質が、数値計算でもぴたりと確認できます。$x=181$cm のZスコアは約2となり、「平均より標準偏差2個分高い」ことが数値からも読み取れます。

次に、正規分布の確率計算をSciPyで行ってみます。68-95-99.7ルールと、偏差値60が上位何%かを確かめます。

from scipy import stats

# 68-95-99.7ルールの検証
for k in [1, 2, 3]:
    p = stats.norm.cdf(k) - stats.norm.cdf(-k)
    print(f"P(|z| <= {k}) = {p:.4f}")

# 偏差値60 = z=1.0 は上位何%か
z_val = 1.0
upper = 1 - stats.norm.cdf(z_val)
print(f"偏差値60 (z={z_val}) は上位 {upper * 100:.1f}%")

# 両側95%に対応するz(z=1.96)
print(f"両側95%のz = {stats.norm.ppf(0.975):.4f}")

出力では、$P(|z|\leq1)\approx0.6827$、$P(|z|\leq2)\approx0.9545$、$P(|z|\leq3)\approx0.9973$ となり、68-95-99.7ルールが正確に再現されます。偏差値60は上位約15.9%、両側95%に対応するZスコアは約1.96であることも確認できます。Zスコアを通せば、正規分布のあらゆる確率がこのように数値で求まります。

続いて、Zスコアによる外れ値検出を実装します。

import numpy as np

rng = np.random.default_rng(3)
data = np.append(rng.normal(50, 5, 200), [78, 20, 72])  # 外れ値を混入

mu, sigma = data.mean(), data.std()
z = (data - mu) / sigma

# |z| > 3 を外れ値とみなす
outliers = data[np.abs(z) > 3]
print(f"検出された外れ値: {np.sort(outliers)}")
print(f"外れ値のZスコア: {np.sort(z[np.abs(z) > 3])}")

実行すると、仕込んだ外れ値(20, 72, 78)が |z| > 3 の条件で検出されます。それぞれのZスコアの絶対値が3を超えていることが出力からわかり、「集団から見て標準偏差3個分以上離れた値」を機械的に拾えていることが確認できます。

最後に、機械学習の前処理として scikit-learn の StandardScaler を使う例です。学習データで fit し、その統計量をテストデータにも transform する流れを示します。

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 年収(円)と年齢という、スケールが大きく異なる2特徴量
rng = np.random.default_rng(7)
income = rng.normal(5_000_000, 1_500_000, 500)
age = rng.normal(40, 10, 500)
X = np.column_stack([income, age])

X_train, X_test = train_test_split(X, test_size=0.3, random_state=0)

scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)   # 学習データで mu, sigma を学習
X_test_std = scaler.transform(X_test)         # 同じ mu, sigma をテストに適用

print("学習データの平均(標準化前):", scaler.mean_)
print("学習データの標準偏差:", scaler.scale_)
print("標準化後の学習データ 平均:", X_train_std.mean(axis=0).round(6))
print("標準化後の学習データ 標準偏差:", X_train_std.std(axis=0).round(6))
print("標準化後のテストデータ 平均:", X_test_std.mean(axis=0).round(3))

出力を見ると、学習データの標準化後は各特徴量とも平均0・標準偏差1にきれいに揃います。一方、テストデータは学習データの $\mu, \sigma$ で変換しているため、平均は厳密に0ではなく0付近の値になります。これが正しい挙動です。テストデータで改めて統計量を計算しないことで、データリークを防いでいます。scaler.mean_scaler.scale_ に学習した $\mu, \sigma$ が保存されている点も、再現性の観点で重要です。

これらの実装を通して、理論で導いた性質が実データでそのまま成り立つことを確認できました。最後に応用と全体像をまとめます。

応用 — Zスコアが活きる場面

Zスコアは「異なるものさしを共通単位に揃える」という性質ゆえ、分野を問わず広く使われています。代表的な応用を見ておきましょう。

太郎の5科目の成績。素点だけでは得意科目が分からないが、Zスコアに変換すると科目を横断して比較でき、理科が最も得意だと分かる

上の図は、ある生徒の5科目の成績を素点(左)とZスコア(右)で表したものです。素点だけ見ると国語84点が一番高く見えますが、各科目の平均とばらつきを考慮してZスコアにすると、実は理科が最も突出して得意(Zスコア最大)だと判明します。素点という異なる物差しを、Zスコアという共通単位に揃えたからこそ、公平な横断比較ができるわけです。これは複数のテスト結果やKPIを総合評価する場面でそのまま使えます。

標準正規分布の累積分布関数Φ(z)のグラフと、代表的なzに対する下側累積確率・両側確率を示した標準正規分布表

上の図は、Zスコアを確率に変換する「標準正規分布表」を可視化したものです。左の累積分布 $\Phi(z)$ のグラフから、たとえば $z=1.96$ で両側95%、$z=2.58$ で両側99%といった、統計的検定でおなじみの臨界値が読み取れます。Zスコアがこの表を介して確率と結びつくことで、仮説検定や信頼区間の計算へと直接つながります。標準誤差を使った推定については標準誤差と標本分布も合わせて参照してください。

このほか、複数の指標を合成して総合スコアを作る(各指標をZスコア化して足し合わせる)、時系列の異常検知、画像処理での輝度正規化など、Zスコアの応用は枚挙にいとまがありません。共通するのは「単位やスケールの違いを取り払って、純粋に相対位置だけを取り出す」という発想です。

まとめ

本記事では、Zスコア(標準得点)について、定義から応用まで丁寧に解説しました。

  • Zスコアの定義は $z = (x – \mu)/\sigma$ で、「平均から標準偏差いくつ分離れているか」を表す無次元の指標です。
  • 標準化すると必ず平均0・分散1になることを数式で導出しました。分布の形は保たれ、目盛りだけが付け替えられます。
  • 偏差値 $T = 50 + 10z$ はZスコアの線形変換であり、平均50・標準偏差10に置き直したものです。
  • 元データが正規分布なら標準正規分布 $N(0,1)$ になり、68-95-99.7ルールで確率を読み取れます。
  • $|z|>3$ を使った外れ値検出、勾配降下を速める特徴量標準化(StandardScaler)、$[0,1]$ に押し込むmin-max正規化との使い分けまで実装で確認しました。

Zスコアは、統計的検定・推定、機械学習の前処理、異常検知をつなぐ「ものさしを揃える」共通言語です。ここで身につけた標準化の感覚は、これから学ぶ多くのトピックの土台になります。

次のステップとして、以下の記事も参考にしてください。