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

基本統計量① 平均・中央値・最頻値をPythonで計算!データ分析の基本

リンドくん

リンドくん

先生、データ分析を始めたいんですけど、「平均」「中央値」「最頻値」って何が違うんですか?全部似たようなものですよね?

たなべ

たなべ

確かに似ているけど、それぞれ違う視点でデータの「真ん中」を表しているんだ。
例えば、RPGで5人のパーティーのレベルが「5, 10, 10, 15, 100」だったとしよう。平均レベルは28だけど、実際にレベル28の人はいないよね?

リンドくん

リンドくん

あ、本当だ!なんか変ですね...

たなべ

たなべ

そうなんだ。だから状況に応じて適切な指標を選ぶことが大切なんだよ。
今日は、この3つの基本統計量をPythonで実際に計算しながら、その違いと使い分けを学んでいこう!

データ分析を始めるとき、最初に覚えるべきなのが基本統計量です。
中でも「平均値」「中央値」「最頻値」は、データの中心傾向を把握するための3大指標として知られています。

これらの指標は一見似ていますが、実はそれぞれ異なる視点でデータの特徴を教えてくれる重要なツールなのです。
例えば、年収データを分析する際、平均年収だけを見ると一部の高額所得者に引っ張られて実態とかけ離れた数値になることがあります。こうした場合、中央値の方がより実態に近い値を示してくれます。

本記事では、Pythonを使ってこれら3つの基本統計量を実際に計算する方法を、初心者の方でも理解できるよう丁寧に解説していきます。

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

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

✓ 再立ち上げ

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

HackATA公式Webサイト

基本統計量とは何か?データの「真ん中」を知る3つの方法

リンドくん

リンドくん

そもそも「基本統計量」って何ですか?難しそうな名前ですね...

たなべ

たなべ

難しく聞こえるけど、実は「データの特徴を数値で表したもの」という意味なんだ。
RPGで例えるなら、パーティー全体の「平均レベル」や「最も多い職業」みたいなものだよ。

基本統計量の役割

基本統計量とは、大量のデータを要約し、その特徴を少数の数値で表現したものです。
データ分析では、何百、何千というデータを全部見ることは現実的ではありません。そこで、データ全体の傾向を掴むために基本統計量を使います。

基本統計量には様々な種類がありますが、最も基本的なのが以下の3つです。

  • 平均値(Mean) → 全データの合計をデータ数で割った値
  • 中央値(Median) → データを小さい順に並べたときの真ん中の値
  • 最頻値(Mode) → 最も頻繁に現れる値

なぜ3つも必要なのか?

「真ん中を知りたいなら平均だけでいいのでは?」と思われるかもしれません。しかし、データの性質によって適切な指標は変わるのです。

例えば、以下のようなRPGパーティーのレベルデータがあったとします。

party_levels = [10, 12, 11, 13, 50]

このデータで平均を計算すると:

average = sum(party_levels) / len(party_levels)
print(f"平均レベル: {average}")  # 19.2

平均レベルは19.2ですが、実際には4人が10-13レベル、1人だけが50レベルという状況です。平均値は極端な値(ここでは50)に引っ張られてしまうため、実態を正しく表していません。

このように、データの分布によって適切な指標を選ぶ必要があるのです。それぞれの特徴を理解して使い分けることが、データ分析の第一歩となります。

平均値(Mean) - 最も基本的な中心の指標

リンドくん

リンドくん

平均値って、学校のテストの平均点みたいなものですよね?

たなべ

たなべ

その通り!平均値は最も直感的でわかりやすい指標なんだ。
ただし、極端な値に影響されやすいという特徴があるから、注意が必要だよ。

平均値の計算方法

平均値は、全データの合計をデータ数で割った値です。数式で表すと以下のようになります。

平均値 = (データの合計) ÷ (データの個数)

Pythonで計算する方法はいくつかあります。

方法① 基本的な計算

# RPGパーティーの攻撃力データ
attack_powers = [45, 52, 48, 50, 55]

# 平均の計算
total = sum(attack_powers)
count = len(attack_powers)
mean_attack = total / count

print(f"平均攻撃力: {mean_attack}")  # 50.0

方法② statisticsモジュールを使用

import statistics

attack_powers = [45, 52, 48, 50, 55]
mean_attack = statistics.mean(attack_powers)

print(f"平均攻撃力: {mean_attack}")  # 50.0
方法③ NumPyを使用(推奨)
import numpy as np

attack_powers = [45, 52, 48, 50, 55]
mean_attack = np.mean(attack_powers)

print(f"平均攻撃力: {mean_attack}")  # 50.0

平均値の特徴と注意点

平均値には以下のような特徴があります。

  • 全データが計算に反映される → すべての値が平均値に影響を与えます
  • 計算が簡単 → 合計して個数で割るだけなので理解しやすい
  • 外れ値に弱い → 極端に大きい(小さい)値があると、大きく影響を受ける

特に最後の「外れ値に弱い」という点は重要です。

# 通常のパーティー
normal_party = [10, 12, 11, 13, 12]
print(f"通常パーティーの平均: {np.mean(normal_party)}")  # 11.6

# レベル100の勇者が1人加入
with_hero = [10, 12, 11, 13, 12, 100]
print(f"勇者加入後の平均: {np.mean(with_hero)}")  # 26.33

このように、1つの極端な値が平均を大きく変えてしまうことがあります。そのため、データに外れ値が含まれる可能性がある場合は、次に紹介する中央値の方が適切なことが多いのです。

中央値(Median) - 外れ値に強い真ん中の値

リンドくん

リンドくん

中央値って、平均値とどう違うんですか?

たなべ

たなべ

中央値はデータを小さい順に並べたときの真ん中の値なんだ。
平均値と違って、極端な値に影響されにくいのが最大の特徴だよ。

中央値の計算方法

中央値は、データを小さい順(または大きい順)に並べ替えたときの真ん中の値です。データ数が奇数の場合と偶数の場合で計算方法が少し異なります。

データ数が奇数の場合

# 5人のパーティーのレベル
levels = [15, 10, 20, 12, 18]

# ステップ1: データをソート
sorted_levels = sorted(levels)  # [10, 12, 15, 18, 20]

# ステップ2: 真ん中の位置を計算
middle_index = len(sorted_levels) // 2  # 2

# ステップ3: 中央値を取得
median = sorted_levels[middle_index]
print(f"中央値: {median}")  # 15

データ数が偶数の場合

# 6人のパーティーのレベル
levels = [15, 10, 20, 12, 18, 14]

# ステップ1: データをソート
sorted_levels = sorted(levels)  # [10, 12, 14, 15, 18, 20]

# ステップ2: 真ん中2つの平均を計算
middle1 = sorted_levels[len(sorted_levels) // 2 - 1]  # 14
middle2 = sorted_levels[len(sorted_levels) // 2]      # 15
median = (middle1 + middle2) / 2

print(f"中央値: {median}")  # 14.5
モジュールを使った計算(推奨)
import statistics
import numpy as np

levels = [15, 10, 20, 12, 18, 14]

# statisticsモジュール
median1 = statistics.median(levels)
print(f"中央値(statistics): {median1}")  # 14.5

# NumPy
median2 = np.median(levels)
print(f"中央値(NumPy): {median2}")  # 14.5

中央値の特徴と利用シーン

中央値には以下のような特徴があります。

  • 外れ値に強い → 極端な値があっても影響を受けにくい
  • 順序だけが重要 → 値の大小関係だけで決まる
  • データの実態に近い → 「半分より上か下か」という基準で中心を示す

実際の比較例を見てみましょう。

import numpy as np

# 通常のデータ
normal_data = [10, 12, 11, 13, 12]
print(f"平均: {np.mean(normal_data)}")      # 11.6
print(f"中央値: {np.median(normal_data)}")  # 12.0

# 外れ値を含むデータ
outlier_data = [10, 12, 11, 13, 12, 100]
print(f"平均: {np.mean(outlier_data)}")      # 26.33
print(f"中央値: {np.median(outlier_data)}")  # 12.0

外れ値(100)が加わっても、中央値は変わらないことがわかります。このため、年収データや不動産価格など、極端な値が含まれやすいデータでは、中央値の方が実態を正しく表すことが多いのです。

最頻値(Mode) - 最も出現回数が多い値

リンドくん

リンドくん

最頻値って、あまり聞いたことがないんですが...

たなべ

たなべ

最頻値は「最も多く現れる値」のことだよ。
RPGで言えば「パーティーで最も多い職業」みたいなものだね。カテゴリデータを分析するときに特に役立つんだ。

最頻値の計算方法

最頻値は、データの中で最も頻繁に現れる値のことです。平均値や中央値と違い、数値データだけでなく、文字列などのカテゴリデータにも使えるのが特徴です。

数値データの場合

import statistics

# パーティーメンバーのレベル
levels = [10, 12, 10, 15, 10, 12, 10]

mode_level = statistics.mode(levels)
print(f"最頻値: {mode_level}")  # 10

カテゴリデータの場合

import statistics

# パーティーメンバーの職業
jobs = ["戦士", "魔法使い", "戦士", "僧侶", "戦士", "盗賊"]

mode_job = statistics.mode(jobs)
print(f"最も多い職業: {mode_job}")  # 戦士
複数の最頻値がある場合(multimode)
import statistics

# 同じ回数で最も多い値が複数ある場合
scores = [10, 10, 15, 15, 20]

# Python 3.8以降ならmultimodeを使用
modes = statistics.multimode(scores)
print(f"最頻値(複数): {modes}")  # [10, 15]

最頻値の特徴と利用シーン

最頻値には以下のような特徴があります。

  • カテゴリデータに使える → 数値以外のデータでも分析可能
  • 複数存在することがある → 同じ頻度の値が複数あることも
  • 外れ値の影響を受けない → 出現回数だけを見るため

最頻値が特に役立つのは、以下のようなシーンです。

import statistics
import numpy as np

# 商品のサイズ注文データ
sizes = ["S", "M", "M", "L", "M", "S", "M", "XL", "M"]

most_common_size = statistics.mode(sizes)
print(f"最も売れているサイズ: {most_common_size}")  # M

# 顧客の年齢層データ
ages = [25, 28, 30, 25, 35, 25, 40, 28, 25]

# 最頻値
mode_age = statistics.mode(ages)
print(f"最も多い年齢: {mode_age}")  # 25

# 比較のため平均と中央値も表示
print(f"平均年齢: {np.mean(ages)}")      # 29.0
print(f"中央値年齢: {np.median(ages)}")  # 28.0

このように、「最も一般的な値は何か?」を知りたいときに最頻値は非常に有用です。特に、商品企画やマーケティングの分野で頻繁に使われる指標なのです。

3つの統計量をどう使い分けるか?実践的な判断基準

リンドくん

リンドくん

結局、どの統計量を使えばいいのか迷ってしまいます...

たなべ

たなべ

それは大事なポイントだね。実はデータの性質と分析の目的によって使い分けるんだ。
判断基準を整理してみよう。

データの種類による使い分け

数値データの場合

  • 正規分布に近いデータ → 平均値が最適

    • 例: 身長、体重、テストの点数
  • 外れ値が含まれるデータ → 中央値が適切

    • 例: 年収、不動産価格、Webページの閲覧時間
  • 離散的な数値データ → 最頻値も有用

    • 例: 家族の人数、商品の星評価

カテゴリデータの場合

  • 最頻値のみ使用可能
    • 例: 好きな色、購入した商品カテゴリ、職業

判断フローチャート

def recommend_statistic(data, has_outliers=False, is_categorical=False):
    """
    データの特性に応じて適切な統計量を推奨する関数
    """
    if is_categorical:
        return "最頻値(Mode)を使用してください"
    
    if has_outliers:
        return "中央値(Median)を使用することを推奨します"
    
    # データの分布をチェック(簡易版)
    mean_val = np.mean(data)
    median_val = np.median(data)
    
    # 平均と中央値の差が大きい場合は外れ値の可能性
    diff_ratio = abs(mean_val - median_val) / median_val
    
    if diff_ratio > 0.1:  # 10%以上差がある場合
        return f"中央値(Median)を推奨(平均と{diff_ratio*100:.1f}%の差があります)"
    else:
        return "平均値(Mean)で問題ありません"

# 使用例
normal_data = [10, 12, 11, 13, 12, 11, 13]
outlier_data = [10, 12, 11, 13, 12, 100]

print(recommend_statistic(normal_data))
print(recommend_statistic(outlier_data))

複数の統計量を併用する重要性

実際のデータ分析では、1つの統計量だけでなく、複数を比較することが重要です。

import numpy as np
import statistics

def comprehensive_analysis(data, data_name):
    """
    包括的なデータ分析を行う
    """
    mean_val = np.mean(data)
    median_val = np.median(data)
    
    try:
        mode_val = statistics.mode(data)
    except:
        mode_val = "なし"
    
    print(f"\n=== {data_name} ===")
    print(f"平均値: {mean_val:.2f}")
    print(f"中央値: {median_val:.2f}")
    print(f"最頻値: {mode_val}")
    
    # 平均と中央値の乖離をチェック
    if isinstance(median_val, (int, float)) and median_val != 0:
        diff_ratio = abs(mean_val - median_val) / median_val * 100
        
        if diff_ratio > 10:
            print(f"\n⚠️ 注意: 平均と中央値に{diff_ratio:.1f}%の差があります")
            print("→ 外れ値の影響を受けている可能性があります")
            print("→ 中央値を採用することを推奨します")
        else:
            print(f"\n✓ 平均と中央値の差は{diff_ratio:.1f}%以内です")
            print("→ 平均値で代表しても問題ありません")

# テストケース1: 正常なデータ
normal_scores = [75, 80, 78, 82, 79, 81, 77, 83]
comprehensive_analysis(normal_scores, "通常のテストスコア")

# テストケース2: 外れ値を含むデータ
salary_data = [300, 320, 350, 330, 340, 310, 2000]  # 単位: 万円
comprehensive_analysis(salary_data, "年収データ")

このように、複数の指標を見比べることで、データの偏りや外れ値の存在を発見できるのです。

まとめ

リンドくん

リンドくん

平均・中央値・最頻値の違いと使い分けがよくわかりました!

たなべ

たなべ

素晴らしいね!この3つの統計量はデータ分析の基礎中の基礎なんだ。
これをマスターすれば、より高度な統計分析への道が開けるよ。まずは実際のデータで試してみることが大切だね!

本記事では、データ分析の基本となる平均値・中央値・最頻値について、Pythonでの計算方法を含めて詳しく解説してきました。

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

平均値(Mean)
  • 全データの合計をデータ数で割った値
  • 最も一般的だが、外れ値に弱い
  • 正規分布に近いデータで有効
中央値(Median)
  • データを並べたときの真ん中の値
  • 外れ値に強く、実態を表しやすい
  • 年収や不動産価格など、偏りのあるデータに最適
最頻値(Mode)
  • 最も頻繁に現れる値
  • カテゴリデータにも使える
  • 「最も一般的な値」を知りたいときに有効

データ分析は実践が何より大切です。ぜひ身近なデータ(成績、売上、アクセス数など)を使って、今日学んだ基本統計量を計算してみてください。
実際に手を動かすことで、理解が一層深まるはずです。

この記事をシェア

関連するコンテンツ