フリーキーズ | 独学プログラミング

確率分布の基礎!正規分布と標準化を偏差値の仕組みで理解しよう

リンドくん

リンドくん

たなべ先生、データサイエンスを勉強してるんですけど、「正規分布」とか「標準化」とか出てきて混乱してます...

たなべ

たなべ

確かに最初は難しそうに感じるよね。
でも君も学生時代に経験してる偏差値の仕組みそのものなんだよ。身近な例から理解していけば、意外とシンプルなんだ。

データサイエンスや機械学習を学び始めると、必ず出会うのが確率分布という概念です。
その中でも最も重要なのが正規分布であり、データを比較しやすくする標準化という手法です。

「統計学って数式ばかりで難しそう...」と感じる方も多いのではないでしょうか。
しかし、これらの概念は実は私たちの身近なところで使われています。特に偏差値は、まさに正規分布と標準化の実用例そのものなのです。

この記事では、データサイエンス初心者の方でも理解できるよう、偏差値の仕組みを通じて正規分布と標準化を段階的に解説していきます。

オンラインコミュニティ運営しています

HackATAは、IT技術を習得する人のために広く開かれたオンラインコミュニティです。 現在、無料コミュニティとして開放していますので、ご気軽に参加してください。

✓ 再立ち上げ

✓ コミュニティの方向性について意見募集中

HackATA公式Webサイト

そもそも確率分布とは何か

リンドくん

リンドくん

「確率分布」って言葉自体がよく分からないんですが...

たなべ

たなべ

データの「ばらつき方」のパターンだと考えてみて。
例えば、クラス全員のテストの点数を見たとき、どんな点数の人が何人いるか、その分布の仕方を表したものなんだ。

データのばらつきを理解する

確率分布とは、データがどのような値を取りやすいか、その傾向を表したものです。

例えば、100人の生徒が数学のテストを受けたとしましょう。全員の点数を記録すると、以下のような傾向が見えてきます。

  • 平均点付近に多くの生徒が集まる
  • 満点や0点に近い人は少ない
  • 平均から離れるほど人数が減っていく

この「データの散らばり方」を数学的に表現したものが確率分布なのです。

正規分布の特徴

数ある確率分布の中でも、正規分布は最も重要で、自然界や社会のあらゆる現象で見られます。

正規分布には以下のような特徴があります。

  • 左右対称な釣鐘型のグラフになる
  • 平均値を中心にデータが集まる
  • 平均から離れるほどデータの出現頻度が指数関数的に減少する
  • 68-95-99.7ルールが成り立つ(後述)

身長、体重、テストの点数、測定誤差など、多くの現実のデータが正規分布に従います。
これは「中心極限定理」という重要な統計学の定理に基づいています。

なぜ正規分布が重要なのか

データサイエンスや機械学習において、正規分布が重要な理由は以下の通りです。

  • 多くの統計手法の前提となっている
  • データの特徴を数値化しやすい(平均と標準偏差の2つだけで表現可能)
  • 予測や推定に活用できる
  • 機械学習の前処理(標準化)で使われる

このように、正規分布はデータ分析の基礎中の基礎となる概念なのです。

平均・分散・標準偏差を理解しよう

リンドくん

リンドくん

正規分布を理解するには、まず何を知っておけばいいですか?

たなべ

たなべ

平均分散標準偏差という3つの指標が基本になるよ。
これらはデータの「中心」と「ばらつき」を数値で表すものなんだ。

平均(mean)- データの中心

平均は、データの中心的な値を表します。全てのデータを足し合わせて、データの個数で割ったものです。

import numpy as np

# テストの点数データ
scores = [65, 70, 75, 80, 85, 90, 95]

# 平均の計算
mean = np.mean(scores)
print(f"平均点: {mean}")  # 平均点: 80.0

平均は「データの代表値」として最もよく使われますが、外れ値(極端な値)に影響を受けやすいという特徴があります。

分散(variance)- ばらつきの大きさ

分散は、各データが平均からどれだけ離れているかを表す指標です。

具体的には、各データと平均との差を2乗したものの平均値です。

# 分散の計算
variance = np.var(scores)
print(f"分散: {variance:.2f}")  # 分散: 85.71

# 手動計算で理解を深める
mean = np.mean(scores)
squared_diff = [(x - mean)**2 for x in scores]
variance_manual = np.mean(squared_diff)
print(f"手動計算の分散: {variance_manual:.2f}")

分散が大きいほどデータのばらつきが大きく、小さいほどデータが平均に集中していることを意味します。

標準偏差(standard deviation)- 実感できるばらつき

標準偏差は、分散の平方根を取ったものです。元のデータと同じ単位になるため、より直感的に理解しやすくなります。

# 標準偏差の計算
std = np.std(scores)
print(f"標準偏差: {std:.2f}")  # 標準偏差: 9.26

# または分散から計算
std_from_var = np.sqrt(variance)
print(f"分散から計算した標準偏差: {std_from_var:.2f}")

例えば、テストの標準偏差が9.26点なら、「多くの生徒は平均点±9.26点の範囲に収まっている」と解釈できます。

正規分布における68-95-99.7ルール

正規分布においては、以下の重要なルールが成り立ちます。

  • 平均±1標準偏差の範囲に約68%のデータが含まれる
  • 平均±2標準偏差の範囲に約95%のデータが含まれる
  • 平均±3標準偏差の範囲に約99.7%のデータが含まれる

このルールは、データの分布を理解する上で非常に便利です。

標準化とは - 異なるデータを同じ土俵で比較する

リンドくん

リンドくん

数学のテストで80点、英語のテストで70点だったんですけど、どっちが良い成績なのか分からないんです...

たなべ

たなべ

それを解決するのが標準化なんだ!
それぞれのテストの平均点や難易度が違うから、単純に点数を比べても意味がない。でも標準化すれば、公平に比較できるようになるよ。

標準化(standardization)の目的

標準化とは、異なるスケールのデータを同じ基準で比較できるように変換する手法です。

具体的には、各データから平均を引いて標準偏差で割ることで、平均0、標準偏差1の分布に変換します。

数式で表すと以下のようになります。

z = (x - μ) / σ
  • z: 標準化された値(zスコア)
  • x: 元のデータ
  • μ: 平均
  • σ: 標準偏差

Pythonで標準化を実装

import numpy as np

# 数学のテストデータ
math_scores = [60, 65, 70, 75, 80, 85, 90]
# 英語のテストデータ
english_scores = [50, 55, 60, 65, 70, 75, 80]

# それぞれの平均と標準偏差
math_mean = np.mean(math_scores)
math_std = np.std(math_scores)
english_mean = np.mean(english_scores)
english_std = np.std(english_scores)

print(f"数学 - 平均: {math_mean}, 標準偏差: {math_std:.2f}")
print(f"英語 - 平均: {english_mean}, 標準偏差: {english_std:.2f}")

# ある生徒のスコア
student_math = 80
student_english = 70

# 標準化
z_math = (student_math - math_mean) / math_std
z_english = (student_english - english_mean) / english_std

print(f"\n数学80点のzスコア: {z_math:.2f}")
print(f"英語70点のzスコア: {z_english:.2f}")

このコードを実行すると、両方のzスコアが計算され、どちらの科目の成績が相対的に良いかを客観的に比較できます。

標準化の利点

標準化には以下のような利点があります。

  • 異なる単位のデータを比較できる(身長cmと体重kgなど)
  • 外れ値の影響を軽減できる
  • 機械学習アルゴリズムの学習効率を向上させる
  • データの解釈が容易になる(平均からどれだけ離れているか)

多くの機械学習アルゴリズムでは、入力データの標準化が前処理の基本となっています。

偏差値の仕組みを理解する

リンドくん

リンドくん

偏差値って、結局何なんですか?いつも50とか60とか出てましたけど...

たなべ

たなべ

偏差値は標準化したスコアを見やすくしたものなんだよ。
平均を50、標準偏差を10になるように調整してるんだ。だから偏差値50は「ちょうど平均」という意味になる。

偏差値の計算式

偏差値は、標準化(zスコア)を平均50、標準偏差10になるように変換したものです。

偏差値 = 50 + 10 × z
     = 50 + 10 × (得点 - 平均) / 標準偏差

この変換により、以下のようなメリットが生まれます。

  • 負の値が出ない(理解しやすい)
  • 50が平均と直感的に分かる
  • 小数点以下が少なく扱いやすい

Pythonで偏差値を計算

import numpy as np
import matplotlib.pyplot as plt

# テストの点数データ
scores = [45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

# 平均と標準偏差
mean = np.mean(scores)
std = np.std(scores)

print(f"平均点: {mean}")
print(f"標準偏差: {std:.2f}")

# 偏差値の計算関数
def calculate_deviation_score(score, mean, std):
    """偏差値を計算する関数"""
    z_score = (score - mean) / std
    deviation_score = 50 + 10 * z_score
    return deviation_score

# 各点数の偏差値を計算
print("\n点数 -> 偏差値")
for score in scores:
    dev_score = calculate_deviation_score(score, mean, std)
    print(f"{score}点 -> 偏差値 {dev_score:.1f}")

# 特定の生徒の偏差値
my_score = 75
my_deviation = calculate_deviation_score(my_score, mean, std)
print(f"\nあなたの点数{my_score}点は、偏差値{my_deviation:.1f}です")

偏差値の解釈

偏差値は以下のように解釈できます。

  • 偏差値50: ちょうど平均
  • 偏差値60: 平均より標準偏差1つ分上(上位約16%)
  • 偏差値70: 平均より標準偏差2つ分上(上位約2.3%)
  • 偏差値40: 平均より標準偏差1つ分下(下位約16%)

正規分布の68-95-99.7ルールから、偏差値40~60の範囲に約68%の人が含まれることが分かります。

偏差値の注意点

偏差値を使う際には、以下の点に注意が必要です。

  • データが正規分布に従っていることが前提
  • 受験者の母集団によって意味が変わる(難関校受験者の中での偏差値50は高い)
  • 科目間での直接比較は慎重に(難易度が異なる)

正規分布を可視化してみよう

リンドくん

リンドくん

実際に正規分布ってどんな形をしているんですか?見てみたいです!

たなべ

たなべ

Pythonを使えば簡単に可視化できるよ。グラフで見ると、理解がグッと深まるからね。

正規分布のグラフを描く

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 日本語フォントの設定(文字化け対策)
plt.rcParams['font.sans-serif'] = ['Arial Unicode MS', 'Hiragino Sans']

# 平均50、標準偏差10の正規分布
mean = 50
std = 10

# x軸の値(20から80まで)
x = np.linspace(20, 80, 1000)

# 正規分布の確率密度関数
y = stats.norm.pdf(x, mean, std)

# グラフの描画
plt.figure(figsize=(10, 6))
plt.plot(x, y, linewidth=2, color='blue')
plt.fill_between(x, y, alpha=0.3, color='blue')

# 平均と標準偏差の位置を示す
plt.axvline(mean, color='red', linestyle='--', label=f'平均: {mean}')
plt.axvline(mean - std, color='orange', linestyle='--', alpha=0.7, label=f'±1標準偏差')
plt.axvline(mean + std, color='orange', linestyle='--', alpha=0.7)
plt.axvline(mean - 2*std, color='green', linestyle='--', alpha=0.5, label=f'±2標準偏差')
plt.axvline(mean + 2*std, color='green', linestyle='--', alpha=0.5)

plt.xlabel('値', fontsize=12)
plt.ylabel('確率密度', fontsize=12)
plt.title('正規分布(平均50、標準偏差10)', fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

ヒストグラムと正規分布の比較

実際のデータがどれだけ正規分布に近いかを確認してみましょう。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# ランダムな正規分布データを生成
np.random.seed(42)
data = np.random.normal(loc=50, scale=10, size=1000)

# ヒストグラムと正規分布曲線の描画
plt.figure(figsize=(10, 6))

# ヒストグラム
plt.hist(data, bins=30, density=True, alpha=0.7, color='skyblue', edgecolor='black')

# 正規分布の曲線
x = np.linspace(data.min(), data.max(), 100)
plt.plot(x, stats.norm.pdf(x, data.mean(), data.std()), 
         'r-', linewidth=2, label='理論的な正規分布')

plt.xlabel('値', fontsize=12)
plt.ylabel('確率密度', fontsize=12)
plt.title('データのヒストグラムと正規分布の比較', fontsize=14)
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()

print(f"データの平均: {data.mean():.2f}")
print(f"データの標準偏差: {data.std():.2f}")

このコードでは、ランダムに生成したデータと理論的な正規分布曲線を重ねて表示することで、実データが正規分布にどれだけ従っているかを視覚的に確認できます。

まとめ

リンドくん

リンドくん

正規分布と標準化の関係がよく分かりました!偏差値の仕組みも理解できて嬉しいです。

たなべ

たなべ

素晴らしいね!この基礎知識は、これからデータサイエンスを学んでいく上で何度も使うことになるよ。
Pythonのコードも実際に動かして、感覚を掴んでいってね。

今回は、確率分布の基礎として正規分布と標準化について、偏差値の仕組みを通じて解説してきました。

重要なポイントをおさらいしましょう。

  • 正規分布は左右対称な釣鐘型で、多くの自然現象や社会現象で見られる
  • 平均・分散・標準偏差でデータの中心とばらつきを表現できる
  • 標準化により異なるスケールのデータを公平に比較できる
  • 偏差値は標準化を分かりやすく表現したもの(平均50、標準偏差10)

これらの概念は、データサイエンスや機械学習の基礎中の基礎です。統計的仮説検定、回帰分析、分類問題など、あらゆる場面で応用されます。

今回紹介したPythonコードを実際に動かしてみることで、理論だけでなく実践的な理解も深まります。ぜひご自身のデータで試してみてください。

この記事をシェア

関連するコンテンツ