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

基本統計量② 分散と標準偏差でデータの散らばりを学ぶ!初心者でもわかるデータ分析の基礎

リンドくん

リンドくん

先生、前回は平均値について学びましたけど、データを見るときって平均だけで十分なんですか?

たなべ

たなべ

鋭い質問だね!実は平均だけではデータの本当の姿は見えないんだ。
たとえば、クラスのテストの平均点が同じ70点でも、みんな同じくらいの点数なのか、それとも0点と100点が混在しているのかでは、全然違うよね。

リンドくん

リンドくん

あ、確かに!同じ平均でも全然意味が違ってきますね。

たなべ

たなべ

そう!そこで登場するのが分散標準偏差なんだ。
これらを使えば、データがどれくらいバラついているかを数値で表現できるようになるよ。

データ分析を始めたばかりの方にとって、「分散」や「標準偏差」という言葉は少し難しく感じるかもしれません。
しかし、これらはデータの特徴を理解する上で欠かせない基本統計量なのです。

前回の記事では平均値について学びましたが、平均値だけではデータの全体像を把握することはできません。
たとえば、2つのクラスのテスト結果の平均点がどちらも70点だったとしても、片方のクラスは全員が65点から75点の間に収まっているのに対し、もう片方のクラスは0点から100点まで大きくバラついているかもしれません。

このようなデータの散らばり具合を数値で表現するのが、分散と標準偏差です。本記事では、これらの概念を初心者の方でも理解できるよう、身近な例を使いながら丁寧に解説していきます。

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

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

✓ 再立ち上げ

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

HackATA公式Webサイト

データの散らばりとは何か

リンドくん

リンドくん

「データの散らばり」って、具体的にどういうことなんですか?

たなべ

たなべ

たとえば、通勤時間を考えてみよう。
Aさんは毎日30分ちょうど、Bさんは20分のときも40分のときもある。どちらも平均は30分だけど、安定性は全然違うよね?

データの散らばりとは、データがどれくらいバラついているかを示す指標です。これを理解することで、平均値だけでは見えなかったデータの特徴が明らかになります。

なぜ散らばりを知る必要があるのか

平均値は確かに重要な指標ですが、それだけでは不十分な場合が多くあります。以下のような例を考えてみましょう。

例① 学生のテスト成績

  • クラスA: 全員が68点~72点の範囲(平均70点)
  • クラスB: 0点~100点まで幅広く分布(平均70点)

どちらのクラスも平均点は同じ70点ですが、クラスAは生徒の理解度が均一である一方、クラスBは理解度に大きな差があることがわかります。このような違いは、平均値だけでは判断できません。

例② 気温のデータ

  • 都市A: 年間を通して20度~25度(平均22.5度)
  • 都市B: 夏は35度、冬は10度(平均22.5度)

平均気温が同じでも、実際の住み心地は全く異なります。都市Aは年中過ごしやすい気候ですが、都市Bは季節による寒暖差が激しいことになります。

データの散らばりを表現する方法

データの散らばり具合を数値化する代表的な指標が分散標準偏差です。

  • 分散: 各データが平均からどれくらい離れているかを2乗して平均したもの
  • 標準偏差: 分散の平方根で、元のデータと同じ単位で散らばりを表現

これらの指標を使うことで、データの特徴をより正確に把握できるようになります。次のセクションでは、分散について詳しく見ていきましょう。

分散とは - データのバラつきを数値化する

リンドくん

リンドくん

分散って、どうやって計算するんですか?難しそうで...

たなべ

たなべ

大丈夫!基本的な考え方はシンプルなんだ。
各データと平均値の差を2乗して、その平均を取るだけだよ。順を追って説明していくね。

分散の基本的な考え方

分散は、データが平均値からどれくらい離れているかを表す指標です。計算の手順は以下の通りです。

  1. 平均値を計算する
  2. 各データから平均値を引く(偏差を求める)
  3. 偏差を2乗する
  4. 2乗した値の平均を取る

なぜ2乗するのかというと、単純に差を取っただけでは正の値と負の値が打ち消し合ってしまうからです。2乗することで、すべての値を正の数にして、バラつきの大きさを正確に測ることができます。

分散の計算例

実際に簡単な例で計算してみましょう。5人の学生のテスト点数が以下の通りだったとします。

データ: 60, 70, 80, 70, 90

ステップ① 平均値を計算

平均 = (60 + 70 + 80 + 70 + 90) ÷ 5 = 370 ÷ 5 = 74
ステップ② 各データから平均値を引く(偏差)
60 - 74 = -14
70 - 74 = -4
80 - 74 = 6
70 - 74 = -4
90 - 74 = 16

ステップ③ 偏差を2乗する

(-14)² = 196
(-4)² = 16
6² = 36
(-4)² = 16
16² = 256

ステップ④ 2乗した値の平均を取る

分散 = (196 + 16 + 36 + 16 + 256) ÷ 5 = 520 ÷ 5 = 104

このように、分散は104となります。

分散の解釈

分散の値が大きいほど、データのバラつきが大きいことを意味します。分散が小さければ、データは平均値の周りに集まっていることになります。

ただし、分散には一つ注意点があります。
それは単位が元のデータの2乗になっていることです。点数のデータであれば「点²」という、ちょっと直感的に理解しにくい単位になってしまいます。

この問題を解決するのが、次に説明する標準偏差なのです。

標準偏差 - 分散をわかりやすくした指標

リンドくん

リンドくん

分散の単位が2乗になるって、確かに使いにくいですね...

たなべ

たなべ

そうなんだよ。だから実務では標準偏差の方がよく使われるんだ。
標準偏差は分散の平方根を取るから、元のデータと同じ単位になって直感的に理解しやすいんだよ。

標準偏差とは

標準偏差は、分散の平方根(ルート)を取った値です。
記号では「σ(シグマ)」や「SD(Standard Deviation)」で表されます。

先ほどの例で計算した分散104から標準偏差を求めると、以下のようになります。

標準偏差 = √104 ≈ 10.2

これにより、データのバラつきを「約10.2点」という、元のデータと同じ単位で表現できるようになりました。

標準偏差の解釈

標準偏差は、データの約68%が平均±1標準偏差の範囲に収まるという特徴があります(正規分布の場合)。

先ほどの例では、平均が74点、標準偏差が約10.2点なので、大部分のデータは以下の範囲に収まることが期待されます。

74 - 10.2 ≈ 63.8点 ~ 74 + 10.2 ≈ 84.2点

実際のデータ(60, 70, 80, 70, 90)を見ると、5つ中4つがこの範囲に入っており、おおよその予測が当たっていることがわかります。

標準偏差の実用的な使い方

標準偏差は、以下のような場面で活用されます。

  • 品質管理: 製品のばらつきを管理する
  • 投資分析: 株価の変動リスクを評価する
  • 学力分析: 生徒の学力の均一性を判断する
  • 医療統計: 検査値の正常範囲を設定する

このように、標準偏差は実社会の様々な場面で使われている重要な指標なのです。

Pythonで分散と標準偏差を計算してみよう

リンドくん

リンドくん

Pythonで計算してみたいです!

たなべ

たなべ

いいね!PythonにはNumPyという便利なライブラリがあって、簡単に計算できるんだよ。
もちろん、標準ライブラリだけでも計算できるから、両方の方法を見ていこう。

基本的な計算方法

まずは、標準ライブラリのstatisticsモジュールを使った方法を見てみましょう。

import statistics

# テストの点数データ
scores = [60, 70, 80, 70, 90]

# 平均値
mean = statistics.mean(scores)
print(f"平均値: {mean}")

# 分散(母分散)
variance = statistics.pvariance(scores)
print(f"分散: {variance}")

# 標準偏差(母標準偏差)
std_dev = statistics.pstdev(scores)
print(f"標準偏差: {std_dev:.2f}")

実行結果は以下。

平均値: 74.0
分散: 104.0
標準偏差: 10.20

NumPyを使った計算

データサイエンスでは、NumPyを使うのが一般的です。より高速で、大量のデータも効率的に処理できます。

import numpy as np

# テストの点数データ
scores = np.array([60, 70, 80, 70, 90])

# 平均値
mean = np.mean(scores)
print(f"平均値: {mean}")

# 分散
variance = np.var(scores)
print(f"分散: {variance}")

# 標準偏差
std_dev = np.std(scores)
print(f"標準偏差: {std_dev:.2f}")

# データと平均の差を視覚的に確認
print("\n各データの偏差:")
for i, score in enumerate(scores):
    deviation = score - mean
    print(f"データ{i+1}: {score}点 → 偏差: {deviation:+.1f}")

実行結果は以下。

平均値: 74.0
分散: 104.0
標準偏差: 10.20

各データの偏差:
データ1: 60点 → 偏差: -14.0
データ2: 70点 → 偏差: -4.0
データ3: 80点 → 偏差: +6.0
データ4: 70点 → 偏差: -4.0
データ5: 90点 → 偏差: +16.0

2つのクラスを比較

2つのクラスのテスト結果を比較して、散らばりの違いを確認してみましょう。

import numpy as np
import matplotlib.pyplot as plt

# クラスAとクラスBのテスト点数
class_a = np.array([68, 70, 72, 69, 71, 70, 73, 68, 72, 71])
class_b = np.array([50, 60, 85, 90, 55, 95, 45, 80, 75, 65])

# 平均値
mean_a = np.mean(class_a)
mean_b = np.mean(class_b)

# 標準偏差
std_a = np.std(class_a)
std_b = np.std(class_b)

print("クラスA")
print(f"  平均点: {mean_a:.1f}点")
print(f"  標準偏差: {std_a:.2f}点")
print(f"  データの散らばり: 小さい(均一)")

print("\nクラスB")
print(f"  平均点: {mean_b:.1f}点")
print(f"  標準偏差: {std_b:.2f}点")
print(f"  データの散らばり: 大きい(不均一)")

# 両クラスの比較
print(f"\n標準偏差の差: {std_b - std_a:.2f}点")
print("→ クラスBの方が{:.1f}倍バラついている".format(std_b / std_a))

実行結果:

クラスA
  平均点: 70.4点
  標準偏差: 1.50点
  データの散らばり: 小さい(均一)

クラスB
  平均点: 70.0点
  標準偏差: 16.93点
  データの散らばり: 大きい(不均一)

標準偏差の差: 15.43点
→ クラスBの方が11.3倍バラついている

このように、平均点はほぼ同じでも、標準偏差を見ることでクラスAは生徒の理解度が均一であり、クラスBは理解度に大きな差があることが数値で確認できます。

母集団と標本の違い - ddofパラメータについて

リンドくん

リンドくん

先生、NumPyで計算したときとstatisticsモジュールで計算したときで、微妙に値が違うことがあるんですけど...

たなべ

たなべ

いい気づきだね!それは母集団の分散か標本の分散かで計算方法が少し違うからなんだ。
これは統計学の重要な概念だから、しっかり理解しておこう。

母集団と標本の違い

統計学では、以下の2つの概念を区別します。

  • 母集団: 調査対象となる全体のデータ
  • 標本: 母集団から抽出した一部のデータ

たとえば、「日本全国の高校生のテスト成績」が母集団だとすると、「ある1校のクラスの成績」は標本になります。

分散の計算方法の違い

母分散(母集団の分散)
σ² = Σ(xᵢ - μ)² / N
標本分散(不偏分散)
s² = Σ(xᵢ - x̄)² / (N - 1)

標本分散では、分母がN-1になっています。これは自由度の補正と呼ばれ、標本から母集団の分散を推定する際のバイアスを減らすためです。

Pythonでの使い分け

NumPyではddof(Delta Degrees of Freedom)パラメータで制御できます。

import numpy as np

data = np.array([60, 70, 80, 70, 90])

# 母分散・母標準偏差(ddof=0、デフォルト)
var_population = np.var(data, ddof=0)
std_population = np.std(data, ddof=0)

# 標本分散・標本標準偏差(ddof=1)
var_sample = np.var(data, ddof=1)
std_sample = np.std(data, ddof=1)

print("母集団として扱う場合:")
print(f"  分散: {var_population:.2f}")
print(f"  標準偏差: {std_population:.2f}")

print("\n標本として扱う場合:")
print(f"  分散: {var_sample:.2f}")
print(f"  標準偏差: {std_sample:.2f}")

print(f"\n差: {var_sample - var_population:.2f}")

実行結果:

母集団として扱う場合:
  分散: 104.00
  標準偏差: 10.20

標本として扱う場合:
  分散: 130.00
  標準偏差: 11.40

差: 26.00

実務ではどちらを使うか

実際のデータ分析では、標本分散(ddof=1)を使うことが多いです。
なぜなら、私たちが扱うデータのほとんどは母集団全体ではなく、そこから抽出された標本だからです。

ただし、データ量が十分に多い場合は、どちらを使っても結果にほとんど差は出ません。

分散・標準偏差を使った実践的なデータ分析

リンドくん

リンドくん

実際のデータ分析では、どんな風に使うんですか?

たなべ

たなべ

たとえば、異常値の検出データの品質チェックなんかに使えるよ。
実践的な例をいくつか見ていこう!

例① 異常値(外れ値)の検出

標準偏差を使って、データの中から異常に大きい値や小さい値を見つけることができます。一般的には、平均±3標準偏差の範囲外のデータを異常値とみなします。

import numpy as np

# センサーデータ(最後の2つが異常値)
sensor_data = np.array([20.1, 20.3, 19.8, 20.5, 20.2, 19.9, 20.4, 
                        20.0, 20.3, 45.0, 20.1, 5.0])

# 平均と標準偏差
mean = np.mean(sensor_data)
std = np.std(sensor_data, ddof=1)

# 異常値の閾値
lower_bound = mean - 3 * std
upper_bound = mean + 3 * std

print(f"平均値: {mean:.2f}")
print(f"標準偏差: {std:.2f}")
print(f"正常範囲: {lower_bound:.2f} ~ {upper_bound:.2f}")

# 異常値を検出
print("\n各データの判定:")
for i, value in enumerate(sensor_data):
    if value < lower_bound or value > upper_bound:
        status = "【異常値】"
    else:
        status = "正常"
    print(f"データ{i+1}: {value:5.1f} → {status}")

実行結果は以下。

平均値: 21.72
標準偏差: 10.99
正常範囲: -11.25 ~ 54.69

各データの判定:
データ1:  20.1 → 正常
データ2:  20.3 → 正常
データ3:  19.8 → 正常
データ4:  20.5 → 正常
データ5:  20.2 → 正常
データ6:  19.9 → 正常
データ7:  20.4 → 正常
データ8:  20.0 → 正常
データ9:  20.3 → 正常
データ10:  45.0 → 正常
データ11:  20.1 → 正常
データ12:   5.0 → 正常

例② データの品質評価

複数のデータソースの品質を標準偏差で比較することができます。

import numpy as np

# 3つの温度センサーのデータ
sensor_1 = np.array([20.0, 20.1, 20.0, 19.9, 20.1, 20.0, 20.1])
sensor_2 = np.array([19.5, 20.5, 19.8, 20.2, 19.7, 20.3, 19.9])
sensor_3 = np.array([18.0, 22.0, 19.0, 21.0, 19.5, 20.5, 20.0])

# 各センサーの統計値
sensors = [sensor_1, sensor_2, sensor_3]
names = ["センサー1", "センサー2", "センサー3"]

print("各センサーの評価:")
for name, data in zip(names, sensors):
    mean = np.mean(data)
    std = np.std(data, ddof=1)
    print(f"\n{name}:")
    print(f"  平均値: {mean:.2f}°C")
    print(f"  標準偏差: {std:.3f}°C")
    
    # 品質評価
    if std < 0.1:
        quality = "優秀(非常に安定)"
    elif std < 0.3:
        quality = "良好(安定)"
    elif std < 0.5:
        quality = "普通(やや不安定)"
    else:
        quality = "要改善(不安定)"
    print(f"  品質: {quality}")

実行結果は以下。

各センサーの評価:

センサー1:
  平均値: 20.03°C
  標準偏差: 0.049°C
  品質: 優秀(非常に安定)

センサー2:
  平均値: 20.00°C
  標準偏差: 0.316°C
  品質: 良好(安定)

センサー3:
  平均値: 20.00°C
  標準偏差: 1.354°C
  品質: 要改善(不安定)

このように、平均値は同じでも標準偏差を見ることで、センサーの品質や安定性を客観的に評価できます。

まとめ

リンドくん

リンドくん

分散と標準偏差のことが、よく理解できました!平均だけじゃなくて、散らばりも見ることが大事なんですね。

たなべ

たなべ

その通り!データ分析では平均(代表値)散らばり(分散・標準偏差)の両方を見ることで、データの本当の姿が見えてくるんだ。
これからデータを見るときは、ぜひ両方をチェックする習慣をつけてみてね。

本記事では、データ分析の基礎となる分散標準偏差について、初心者の方でも理解できるよう段階的に解説してきました。

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

  • 分散は、データが平均からどれくらい離れているかを2乗して平均した値
  • 標準偏差は、分散の平方根で、元のデータと同じ単位で散らばりを表現
  • 平均値が同じでも、標準偏差が異なればデータの特徴は全く違う
  • PythonではNumPyを使うことで簡単に計算できる
  • 実務では標本分散(ddof=1)を使うことが多い

データサイエンスの道のりは長いですが、こうした基礎をしっかりと身につけることで、より高度な分析手法も理解しやすくなります。

この記事をシェア

関連するコンテンツ