Day 001 — 記述統計入門(平均・中央値・最頻値)

2026-04-09 白 / Phase 1 理論+コーディング 記述統計入門

📚 背景知識(読んでから問題へ)

データを渡されたとき、まず「このデータの典型的な値は何か?」を把握したくなります。 その「典型的な値」を表す方法が 3種類 あります。

平均(Mean)

「全員で山分けしたら一人いくら?」という感覚。全データを足して、個数で割る。

📌
例: テストの点数が [60, 70, 80, 90, 100] のとき → 平均 = (60+70+80+90+100) / 5 = 80点

中央値(Median)

「全員を点数順に並べたとき、真ん中の人の点数」。データを小さい順に並べて、ちょうど真ん中の値。

  • 例(奇数個): [60, 70, 80, 90, 100] → 中央値 = 80点
  • 例(偶数個): [60, 70, 80, 90] → 中央値 = (70+80)/2 = 75点

最頻値(Mode)

「一番よく出てくる値」。

📌
例: [60, 70, 70, 80, 100] → 最頻値 = 70点(2回登場)

なぜ3種類も必要なの?

「年収の平均が600万円」と言われても、ほとんどの人が400万円以下で、一部の億万長者が平均を引き上げているかもしれません。→ このとき中央値を見ると実態に近い。

状況使うべき統計量
外れ値(異常値)が少ない平均
外れ値がある / 年収・家賃など中央値
カテゴリデータ(血液型・職業)最頻値

📝 問題

以下のデータは、あるECサイトの商品レビュースコア(1〜5点)7件です。

scores = [3, 5, 2, 5, 4, 5, 1]

タスク1(理論):
上のデータの「平均」「中央値」「最頻値」をそれぞれ手計算で求めてください。

タスク2(コーディング):
Pythonで以下を計算し、結果を出力するコードを書いてください。

  1. 平均(小数点以下2桁まで)
  2. 中央値
  3. 最頻値

使っていいライブラリ: statistics(Python標準ライブラリ)または numpy

🔍 ヒント(段階的開示)

ヒント1 — 方向性
タスク1:
  • まず小さい順に並べ替えてみましょう
  • 中央値は「真ん中」の位置を数えます(7個なら何番目?)
タスク2:
  • statistics モジュールに mean, median, mode という関数があります
  • import statistics から始めてみましょう
ヒント2 — アプローチ
タスク1の計算:
  • 並び替え: [1, 2, 3, 4, 5, 5, 5]
  • 合計: 1+2+3+4+5+5+5 = ?
  • 7個のデータの「真ん中」は何番目?
タスク2のコード骨格:
import statistics

scores = [3, 5, 2, 5, 4, 5, 1]

mean_val = statistics.mean(scores)
median_val = statistics.median(scores)
mode_val = statistics.mode(scores)

print(f"平均: {mean_val:.2f}")
print(f"中央値: {median_val}")
print(f"最頻値: {mode_val}")
ヒント3 — ほぼ答え
手計算:
  • 並び替え: [1, 2, 3, 4, 5, 5, 5]
  • 合計: 25 → 平均 = 25 / 7 ≈ 3.57
  • 7個の真ん中 = 4番目の値 → 中央値 = 4
  • 5が3回登場 → 最頻値 = 5
コードはヒント2の通りで動きます。:.2f は「小数点以下2桁まで表示」という書き方です。

模範解答

import statistics

scores = [3, 5, 2, 5, 4, 5, 1]

# 平均
mean_val = statistics.mean(scores)

# 中央値
median_val = statistics.median(scores)

# 最頻値
mode_val = statistics.mode(scores)

print(f"データ: {scores}")
print(f"並び替え後: {sorted(scores)}")
print(f"平均:   {mean_val:.2f}")   # → 3.57
print(f"中央値: {median_val}")     # → 4
print(f"最頻値: {mode_val}")       # → 5
▶ 出力を見る
データ: [3, 5, 2, 5, 4, 5, 1]
並び替え後: [1, 2, 3, 4, 5, 5, 5]
平均:   3.57
中央値: 4
最頻値: 5
手計算の答え: 平均: 25/7 ≈ 3.57 / 中央値: 4番目の値 = 4 / 最頻値: 最もよく出る5 = 5

🪜 Step-by-Step 解説

1
データを「目で見る」形に整理する
scores = [3, 5, 2, 5, 4, 5, 1]
sorted_scores = sorted(scores)
print(sorted_scores)  # [1, 2, 3, 4, 5, 5, 5]
数値は小さい順に並べることで、「分布の形」が見えやすくなります。Kaggleでも最初にデータをsortedしたりdescribe()で全体像を掴む習慣が大切。
2
平均を計算する
import statistics
mean_val = statistics.mean(scores)
print(f"平均: {mean_val:.2f}")  # 3.57
statistics.mean() はPythonの標準ライブラリなのでインストール不要。:.2f は「float型を小数点2桁で表示」するフォーマット指定。
3
中央値を計算する
median_val = statistics.median(scores)
print(f"中央値: {median_val}")  # 4
statistics.median() は自動で並び替えてくれます。レビュースコアの場合、平均3.57よりも中央値4のほうが「実際のユーザー体験」に近い。
4
最頻値を計算する
mode_val = statistics.mode(scores)
print(f"最頻値: {mode_val}")  # 5
statistics.mode() は最もよく出る値を返します。このデータでは「5点(最高評価)が最も多い」→ 商品は概ね好評。

📐 数学・統計の補足(文系向け)

⚠️
平均の落とし穴: 「平均 = データの真ん中」ではありません。

年収の例: [200, 300, 350, 400, 5000]万円

  • 平均: 1250万円(5000万円の人が引き上げている)
  • 中央値: 350万円(こちらが実態に近い)

このように外れ値(異常に大きい/小さい値)があると、平均は実態から離れます。→ データを見たら必ず平均と中央値の両方を確認するのがデータサイエンティストの習慣。

「偶数個のときの中央値」:
データが偶数個の場合は、真ん中2つの平均を取ります。
[1, 3, 5, 7, 9, 11] → 中央値 = (5+7)/2 = 6

🏆 Kaggleでの実践的な使い方

Kaggleのほぼ全コンペで最初に行うのが EDA(Exploratory Data Analysis: 探索的データ分析)。その第一歩が記述統計の確認です。

import pandas as pd

# Kaggleでよく使う書き方
df = pd.read_csv('train.csv')

# 全数値列の記述統計を一括確認
print(df.describe())
# count, mean, std, min, 25%, 50%(=中央値), 75%, max が表示される
💡
describe()mean=平均、50%=中央値、std=標準偏差(次回学ぶ「ばらつき」の指標)。実際のKaggleコンペ(例: House Prices)では「家の価格の分布が右に歪んでいる」を平均と中央値の差から発見し、対数変換で対処するという手法が定番です。

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
平均=代表値として常に最適学校では平均を使うことが多いから外れ値があるときは中央値が実態に近い
偶数個のとき中央値が迷う「真ん中の1個」と思い込む偶数個なら真ん中2つの平均を取る
statistics.mode() でエラー最頻値が複数ある場合 Python 3.7以前はエラーPython 3.8+なら小さい方を返す。複数対応はscipy.stats.modeを使う
平均と中央値が近ければ正規分布「似てれば同じ」という誤解あくまで参考。ヒストグラムで形を確認すること

🚀 次のステップ

  • 発展: numpy を使って同じことをやってみましょう(np.mean(), np.median()
  • 次回予告: Day 002 — 分散と標準偏差(「ばらつき」を数値で表す方法)

🎯 自己評価

自分の回答

気づき・メモ