📚 背景知識(読んでから問題へ)
データを渡されたとき、まず「このデータの典型的な値は何か?」を把握したくなります。 その「典型的な値」を表す方法が 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で以下を計算し、結果を出力するコードを書いてください。
- 平均(小数点以下2桁まで)
- 中央値
- 最頻値
使っていいライブラリ: statistics(Python標準ライブラリ)または numpy
🔍 ヒント(段階的開示)
ヒント1 — 方向性
タスク1:
- まず小さい順に並べ替えてみましょう
- 中央値は「真ん中」の位置を数えます(7個なら何番目?)
statisticsモジュールにmean,median,modeという関数がありますimport statisticsから始めてみましょう
ヒント2 — アプローチ
タスク1の計算:
- 並び替え: [1, 2, 3, 4, 5, 5, 5]
- 合計: 1+2+3+4+5+5+5 = ?
- 7個のデータの「真ん中」は何番目?
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
:.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 — 分散と標準偏差(「ばらつき」を数値で表す方法)