正規分布とは?わかりやすく解説|式・標準偏差(68-95-99.7)・標準正規分布との違いをPythonで確認
正規分布とは、平均値を中心に左右対称の釣り鐘型に広がる確率分布で、「平均(μ)」と「標準偏差(σ)」の2つの数だけで形が決まります。平均から±1σの範囲にデータの約68.3%、±2σに約95.4%、±3σに約99.7%が入るのが特徴です。
テストの点数や測定の誤差など、「たくさんの小さな要因が足し合わさって決まる値」は正規分布に近い形になることが多く、統計学や機械学習の多くの手法の土台になっています。この記事では、正規分布の意味・式・標準偏差との関係・標準正規分布との違いを、Pythonで実際に計算した値を使って説明します。
正規分布をわかりやすく言うと
正規分布(ガウス分布とも呼ばれます)は、次のような形をした分布です。
- 平均のところがいちばん高い山になっている(平均・中央値・最頻値が一致する)
- 平均を中心に左右対称
- 平均から離れるほどなだらかに低くなり、両端はどこまでも0に近づく(0にはならない)
山の位置を決めるのが平均μ(ミュー)、山の横幅を決めるのが標準偏差σ(シグマ)です。μが大きくなると山全体が右へ動き、σが大きくなると山は低く横に広がります。σが小さいと、平均のまわりに集中した細く高い山になります。正規分布を記号で書くときは、平均と分散(σの2乗)を使って N(μ, σ²) と表します。
正規分布の式(確率密度関数)
正規分布の確率密度関数は次の式です。
f(x) = 1 / (√(2π) σ) × exp( −(x − μ)² / (2σ²) )
式の意味は、次の3つに分けると読みやすくなります。
(x − μ)²:xが平均からどれだけ離れているか(離れるほど大きい)exp(−…):離れるほど値が急速に小さくなる部分。これが釣り鐘型を作る1 / (√(2π) σ):曲線の下の面積の合計がちょうど1になるように調整する係数
式をそのままPythonで書いて、標準ライブラリの statistics.NormalDist の結果と比べてみます。
import math
from statistics import NormalDist
def pdf(x, mu, sigma):
return 1 / (math.sqrt(2 * math.pi) * sigma) * math.exp(-(x - mu) ** 2 / (2 * sigma ** 2))
print(pdf(0, 0, 1))
print(NormalDist(0, 1).pdf(0))
print(pdf(70, 60, 10), NormalDist(60, 10).pdf(70))
0.3989422804014327
0.3989422804014327
0.02419707245191434 0.024197072451914336
手で書いた式とライブラリの値が一致しました(最後の桁の違いは浮動小数点の丸めによるものです)。注意したいのは、確率密度の値そのものは「その値になる確率」ではないことです。正規分布のような連続的な分布では、確率は範囲の面積で考えます。たとえば「70点以下になる確率」は、曲線の下の70より左側の面積です。この面積を求める関数が累積分布関数(CDF)で、詳しくは「累積確率分布(CDF)とは」で解説しています。
正規分布と標準偏差:68-95-99.7ルール
正規分布では、平均から標準偏差いくつ分の範囲に何%のデータが入るかが、μやσの値に関係なく決まっています。Pythonで計算した値は次のとおりです。
from statistics import NormalDist
z = NormalDist(mu=0, sigma=1)
for k in (1, 2, 3, 4):
p = z.cdf(k) - z.cdf(-k)
print(f"±{k}σ の範囲に入る割合: {p:.6f} (外側: {1 - p:.6f})")
±1σ の範囲に入る割合: 0.682689 (外側: 0.317311)
±2σ の範囲に入る割合: 0.954500 (外側: 0.045500)
±3σ の範囲に入る割合: 0.997300 (外側: 0.002700)
±4σ の範囲に入る割合: 0.999937 (外側: 0.000063)
| 範囲 | 範囲内に入る割合 | 範囲の外になる割合 |
|---|---|---|
| μ ± 1σ | 約68.27% | 約31.73%(およそ3回に1回) |
| μ ± 2σ | 約95.45% | 約4.55%(およそ22回に1回) |
| μ ± 3σ | 約99.73% | 約0.27%(およそ370回に1回) |
| μ ± 4σ | 約99.9937% | 約0.0063%(およそ1万6千回に1回) |
このうち最初の3行を「68-95-99.7ルール」と呼びます。品質管理で「3σを超えたら異常を疑う」という考え方があるのは、正規分布なら±3σの外に出るのは約0.27%しか起こらないからです。なお、ちょうど95%になる範囲は±2σではなく±1.96σです。
from scipy import stats
print(stats.norm.cdf(1.96) - stats.norm.cdf(-1.96))
print(stats.norm.ppf(0.975))
0.950004209703559
1.959963984540054
統計の検定や信頼区間で「1.96」という数が出てくるのはこのためです。
正規分布と標準正規分布の違い
標準正規分布は、正規分布のうち平均が0、標準偏差が1のものです。どんな正規分布も、値を次の式で変換すると標準正規分布になります。
z = (x − μ) / σ
このzをzスコア(標準化得点)と呼びます。「平均から標準偏差いくつ分離れているか」を表す数なので、平均や単位が違うデータどうしでも比べられるようになります。
| 正規分布 | 標準正規分布 | |
|---|---|---|
| 平均 | μ(任意) | 0 |
| 標準偏差 | σ(任意の正の数) | 1 |
| 記号 | N(μ, σ²) | N(0, 1) |
| 使いどころ | 実際のデータの分布を表す | 確率の計算・表の参照・異なるデータの比較 |
例:平均60点・標準偏差10点のテストで75点だったら
点数が平均60点・標準偏差10点の正規分布に従うと仮定した例(数値は説明用の仮のもの)で計算してみます。
from statistics import NormalDist
score = NormalDist(mu=60, sigma=10)
x = 75
z = (x - score.mean) / score.stdev
print("z =", z)
print("75点以下の割合:", round(score.cdf(75), 4))
print("75点より上の割合:", round(1 - score.cdf(75), 4))
print("上位5%の境目:", round(score.inv_cdf(0.95), 2))
print("偏差値:", 50 + 10 * z)
z = 1.5
75点以下の割合: 0.9332
75点より上の割合: 0.0668
上位5%の境目: 76.45
偏差値: 65.0
75点はzスコア1.5で、75点より上の人は約6.7%と計算できます。いわゆる偏差値は「50 + 10 × z」で求める値なので、このとき65になります。偏差値から上位何%かを読み取れるのは、点数の分布が正規分布に近いときだけだという点には注意が必要です。標準化の計算方法は「Zスコア正規化(標準化)とは」でも扱っています。
なぜ正規分布はよく現れるのか:中心極限定理
正規分布が統計の中心にある理由は、中心極限定理にあります。元のデータがどんな分布でも(極端な場合を除き)、たくさん集めて平均を取ると、その平均の分布は正規分布に近づくという定理です。
サイコロで確かめてみます。1個のサイコロの目は1〜6が同じ確率で出る「平らな」分布で、正規分布とはまったく違う形です。これをn個振って平均を取る、という操作を10万回くり返し、平均の分布の歪度(左右の偏り)と尖度(正規分布と比べた尖り具合、正規分布なら0)を見ます。
import numpy as np
from scipy import stats
rng = np.random.default_rng(1)
# サイコロを n 個振って平均を取る、を 10万回くり返す
for n in (1, 2, 10, 30):
means = rng.integers(1, 7, size=(100_000, n)).mean(axis=1)
print(f"n={n:2d} 平均={means.mean():.3f} 標準偏差={means.std():.3f} 歪度={stats.skew(means):+.3f} 尖度={stats.kurtosis(means):+.3f}")
n= 1 平均=3.497 標準偏差=1.709 歪度=+0.000 尖度=-1.270
n= 2 平均=3.498 標準偏差=1.209 歪度=+0.005 尖度=-0.636
n=10 平均=3.500 標準偏差=0.539 歪度=+0.004 尖度=-0.124
n=30 平均=3.500 標準偏差=0.312 歪度=-0.004 尖度=-0.044
nが増えるにつれて尖度が0(正規分布の値)に近づき、標準偏差は1/√nの割合で小さくなっています。テストの合計点や測定誤差のように「多数の小さな要因の合計」で決まる値が正規分布に近くなるのは、この性質によるものです。
Pythonで正規分布の乱数を作って確かめる
NumPyでは Generator.normal で正規分布に従う乱数を作れます。10万個作って、平均・標準偏差と68-95-99.7ルールが成り立つかを確認します。
import numpy as np
rng = np.random.default_rng(0)
x = rng.normal(loc=60, scale=10, size=100_000)
print("平均:", round(x.mean(), 3))
print("標準偏差:", round(x.std(), 3))
for k in (1, 2, 3):
inside = np.mean(np.abs(x - 60) <= 10 * k)
print(f"±{k}σ の割合: {inside:.4f}")
平均: 59.991
標準偏差: 10.001
±1σ の割合: 0.6839
±2σ の割合: 0.9546
±3σ の割合: 0.9971
乱数なので理論値とぴったり同じにはなりませんが、ほぼ0.683・0.954・0.997になっています。上のコードはPython 3.12.15、NumPy 2.5.4、SciPy 1.18.1で実行しました(2026年10月14日)。関数の詳細はstatistics.NormalDist、scipy.stats.norm、numpy.random.Generator.normalの公式ドキュメントにあります。
データが正規分布に従うかを確かめる方法
実際のデータが正規分布に従うとは限りません。収入や待ち時間のように、右に長く裾を引く分布はよくあります。確認の方法は主に3つです。
- グラフで見る:ヒストグラムで山が1つで左右対称か、Q-Qプロットで点が直線に乗るかを見る
- 数値で見る:歪度(0から離れるほど左右に偏る)と尖度(0から離れるほど正規分布と尖り方が違う)を計算する
- 検定する:シャピロ・ウィルク検定などで「正規分布に従う」という仮説を検定する
import numpy as np
from scipy import stats
rng = np.random.default_rng(2)
normal_data = rng.normal(0, 1, 200)
skewed_data = rng.exponential(1, 200)
for name, d in (("正規分布から生成", normal_data), ("指数分布から生成", skewed_data)):
stat, p = stats.shapiro(d)
print(f"{name}: W={stat:.3f}, p値={p:.4f}")
正規分布から生成: W=0.996, p値=0.8987
指数分布から生成: W=0.838, p値=0.0000
p値が小さい(0.05未満など)ときは「正規分布に従う」とは言いにくいと判断します。ただし、p値が大きくても「正規分布である」と証明されたわけではなく、データが多いとわずかなずれでもp値が小さくなる点には注意が必要です。検定はグラフと合わせて使うのが基本です。p値の考え方は「p値とは?」で解説しています。
機械学習での正規分布の使われ方
機械学習でも正規分布はあちこちに出てきます。ただし「どの手法もデータが正規分布であることを前提にしている」わけではありません。代表的な使われ方を整理します。
| 場面 | 正規分布の役割 |
|---|---|
| 線形回帰 | 誤差が正規分布に従うと仮定すると、係数の検定や予測区間を計算できる。予測そのもの(最小二乗法)には正規性は必須ではない |
| ガウシアンナイーブベイズ | 各特徴量がクラスごとに正規分布に従うと仮定して分類する |
| 混合ガウスモデル(GMM) | 複数の正規分布の重ね合わせで複雑な分布を表し、クラスタリングに使う |
| 異常検知 | 平均から何σ離れているか(zスコア)で外れ値を見つける |
| ニューラルネットワークの重みの初期化 | 平均0の正規分布から初期値を取る方法がよく使われる |
| 前処理(標準化) | 特徴量を平均0・標準偏差1にそろえる。分布の形そのものは変わらない点に注意 |
機械学習の全体像は「機械学習とは?」、scikit-learnでの実際の使い方は「scikit-learnの使い方入門」にまとめています。
よくある質問
Q. 正規分布とは何ですか?
平均を中心に左右対称の釣り鐘型をした確率分布です。平均と標準偏差の2つで形が決まり、平均から±1σに約68.3%、±2σに約95.4%、±3σに約99.7%のデータが入ります。
Q. 正規分布と標準正規分布の違いは何ですか?
標準正規分布は、正規分布のうち平均が0、標準偏差が1のものです。どんな正規分布の値も、平均を引いて標準偏差で割る(zスコアに変換する)と標準正規分布で扱えます。
Q. 正規分布で4σの外側になる確率はどれくらいですか?
平均から±4σの範囲に入る割合は約99.9937%で、外側になるのは約0.0063%、およそ1万6千回に1回です。±3σの外側は約0.27%です。
Q. 正規分布の式のσとμは何を表していますか?
μは分布の中心(平均)、σは広がり(標準偏差)を表します。μを変えると山が左右に動き、σを大きくすると山が低く横に広がります。
Q. Pythonで正規分布の確率を計算するにはどうすればよいですか?
標準ライブラリの statistics.NormalDist を使うと、pdf(確率密度)、cdf(その値以下になる確率)、inv_cdf(確率から値を逆算)を追加のインストールなしで計算できます。SciPyの scipy.stats.norm でも同じ計算ができます。
まとめ
- 正規分布は平均μと標準偏差σで決まる、左右対称の釣り鐘型の分布
- ±1σに約68.3%、±2σに約95.4%、±3σに約99.7%、±4σに約99.994%が入る
- 標準正規分布は平均0・標準偏差1の正規分布で、zスコアに変換すれば比較や確率計算に使える
- 平均を取った値が正規分布に近づくのは中心極限定理による
- 実際のデータが正規分布かどうかは、グラフ・歪度と尖度・検定で確かめてから使う
統計の考え方は、式を眺めるより手元で計算して数字を確かめると理解が進みます。テックジムは東京・永田町の東京本校で、自分のペースでPythonの課題を進め、わからないところはトレーナーに質問できる通学型のプログラミングスクールです。無料講座もあります。統計検定などで体系的に学びたい場合は「統計検定の勉強方法」も参考にしてください。
正規分布は、テックジムのAIエンジニア養成コースの第6章「AIのための統計学入門」で扱っています。機械学習とディープラーニングを16章で順に学ぶコースで、章ごとに実務での使いどころ(想定案件)が示されています。





