🐈

【Python】変動性の指標:標準偏差(Standard Deviation)と分散(Variance)

に公開

今日は統計の世界でスーパーヒーローのような存在、「標準偏差」と「分散」について学んでいきましょう。

1. そもそも変動性って何?🤔

「平均」という言葉を聞いたことがあると思います。

例えば、あるクラスのテスト平均点が75点だったとしましょう。

でも、平均点だけでは実はクラスの様子が十分にわかりません。

例えば次の2つのクラスを考えてみましょう:

  • クラスA:全員が74点〜76点
  • クラスB:半分の人が100点、半分の人が50点

両方のクラスの平均点は75点ですが、点数のばらつき具合はまったく違いますよね!

このような「データのばらつき具合」を数値で表すのが「分散」と「標準偏差」です。

2. 分散(Variance)とは?🎯

分散は、「データの値が平均からどれくらい離れているか」を表す指標。

計算方法はシンプル!

  1. まず平均を計算します
  2. 各データから平均を引きます(これを「偏差」と呼びます)
  3. その偏差を二乗します(マイナスをプラスにするため)
  4. 二乗した偏差の平均を取ります

これで分散の完成です!

数式で書くと少し難しく見えますが、やっていることはこれだけです。

3. 標準偏差(Standard Deviation)とは?📏

標準偏差は、分散の平方根(ルート)です。

なぜ平方根を取るのかというと、分散の単位は元のデータの単位の二乗になっているため、元の単位に戻すためです。

例えばテストの点数の分散は「点²」という変な単位になってしまいますが、標準偏差なら「点」という元の単位になります。

4. Pythonで実際に計算してみよう!💻

さあ、実際にPythonで計算してみましょう!

import numpy as np
# 2つのクラスのテスト結果
class_A = [74, 75, 75, 76, 76, 74, 75, 75, 76, 74]
class_B = [50, 50, 50, 100, 100, 50, 100, 50, 100, 100]
# 平均を計算
mean_A = np.mean(class_A)
mean_B = np.mean(class_B)
print(f"クラスAの平均点: {mean_A}")
print(f"クラスBの平均点: {mean_B}")
# 分散を計算
variance_A = np.var(class_A)
variance_B = np.var(class_B)
print(f"クラスAの分散: {variance_A}")
print(f"クラスBの分散: {variance_B}")
# 標準偏差を計算
standard_deviation_A = np.std(class_A)
standard_deviation_B = np.std(class_B)
print(f"クラスAの標準偏差: {standard_deviation_A}")
print(f"クラスBの標準偏差: {standard_deviation_B}")

実行結果はこんな感じになります:

クラスAの平均点: 75.0
クラスBの平均点: 75.0
クラスAの分散: 0.6
クラスBの分散: 625.0
クラスAの標準偏差: 0.7745966692414834
クラスBの標準偏差: 25.0

同じ平均点なのに、分散と標準偏差がこんなに違うんですね!

クラスBの方がデータのばらつきが大きいことが数値でハッキリわかります。

5. 手作業で計算してみよう!✍️

NumPyを使わずに、自分で計算するとどうなるでしょうか?

以下のコードで試してみましょう:

# 分散と標準偏差を計算
def calculate_variance_manually(data):
    # 平均を計算
    mean = sum(data) / len(data)
    
    # 偏差の二乗の合計を計算
    sum_of_squared_deviations = 0
    for value in data:
        deviation = value - mean
        sum_of_squared_deviations += deviation ** 2
    
    # 分散を計算(偏差の二乗の平均)
    variance = sum_of_squared_deviations / len(data)
    
    # 標準偏差を計算(分散の平方根)
    standard_deviation = variance ** 0.5
    
    return variance, standard_deviation

class_A = [74, 75, 75, 76, 76, 74, 75, 75, 76, 74]
class_B = [50, 50, 50, 100, 100, 50, 100, 50, 100, 100]

variance_A_manual, standard_deviation_A_manual = calculate_variance_manually(class_A)
variance_B_manual, standard_deviation_B_manual = calculate_variance_manually(class_B)
print(f"手作業で計算したクラスAの分散: {variance_A_manual}")
print(f"手作業で計算したクラスBの分散: {variance_B_manual}")
print(f"手作業で計算したクラスAの標準偏差: {standard_deviation_A_manual}")
print(f"手作業で計算したクラスBの標準偏差: {standard_deviation_B_manual}")

実行結果:

手作業で計算したクラスAの分散: 0.6
手作業で計算したクラスBの分散: 625.0
手作業で計算したクラスAの標準偏差: 0.7745966692414834
手作業で計算したクラスBの標準偏差: 25.0

6. 母集団と標本の違い 🔍

じつは統計には「母集団の分散・標準偏差」と「標本の分散・標準偏差」という2種類があります。

  • 母集団:データ全体
  • 標本:データの一部(サンプル)

標本から計算するときは、分母を n ではなく n-1 にします。

これを、不偏分散(Unbiased Variance、または、Sample Variance)といいます。

import numpy as np

class_A = [74, 75, 75, 76, 76, 74, 75, 75, 76, 74]
class_B = [50, 50, 50, 100, 100, 50, 100, 50, 100, 100]

# NumPyでの不偏分散(ddof=1 を指定)
unbiased_variance_A = np.var(class_A, ddof=1)
unbiased_variance_B = np.var(class_B, ddof=1)
sample_standard_deviation_A = np.std(class_A, ddof=1)
sample_standard_deviation_B = np.std(class_B, ddof=1)

print(f"クラスAの不偏分散: {unbiased_variance_A}")
print(f"クラスBの不偏分散: {unbiased_variance_B}")
print(f"クラスAの標本標準偏差: {sample_standard_deviation_A}")
print(f"クラスBの標本標準偏差: {sample_standard_deviation_B}")

結果:

クラスAの不偏分散: 0.6666666666666666
クラスBの不偏分散: 694.4444444444445
クラスAの標本標準偏差: 0.816496580927726
クラスBの標本標準偏差: 26.352313834736496

7. 分散と標準偏差の活用例 🚀

分散と標準偏差は様々な場面で使われています:

分野 活用例
教育 テスト結果のばらつきを評価する
金融 株価の変動リスクを測定する
製造業 製品の品質のばらつきを管理する
気象学 気温や降水量の変動を分析する
スポーツ 選手のパフォーマンスの安定性を評価する

8. まとめ 🎉

今日は分散と標準偏差について学びました!

  • 分散:データの値が平均からどれくらい離れているかを示す指標
  • 標準偏差:分散の平方根で、元のデータと同じ単位で表される

これらの指標は、データのばらつき具合を数値化するのに役立ちます。

平均だけではわからない「データの性質」を理解するのに必須のツールです!

Discussion