平均だけでは見えないばらつき:ヒストグラムと箱ひげ図で分布を確認する
AIを使いこなすClaudeで執筆し、GPTで自動校閲・修正しています。

平均が同じでも、データの中身が同じとは限りません。平均の裏にあるばらつきや偏りは、ヒストグラムで「形」を、箱ひげ図で「中央値・四分位・外れ値」を見ると判断できます。 手順は次のとおりです。 1. ヒストグラムで山の数、偏り、すその長さを見る。 2. 箱ひげ図で中央値と箱の幅(中央の約半分のデータが入る範囲)を読む。 3. 平均と中央値のずれを確認する。 この記事では、平均がどちらも30分になる架空データ2組を使って、実際に見比べます。
説明用の例:平均はどちらも30分
次のデータは、読み方を示すために私が作った「説明用の例」です。実在の店や調査の結果ではありません。「2つの店の配送時間(分)を20件ずつ記録した」という設定です。
- A店:26, 27, 28, 28, 29, 29, 29, 30, 30, 30, 30, 30, 31, 31, 31, 31, 32, 32, 33, 33
- B店:18, 19, 20, 21, 21, 22, 22, 23, 24, 24, 25, 26, 28, 29, 30, 32, 36, 45, 60, 75
合計はどちらも600分、平均はどちらも30分です。平均だけを見ると、2店は同じに見えます。
- 平均、A店:30、B店:30
- 中央値、A店:30、B店:24.5
- 第1四分位数、A店:29、B店:21.75
- 第3四分位数、A店:31、B店:30.5
- 最小〜最大、A店:26〜33、B店:18〜75
四分位数は、データを小さい順に並べ、pandasの既定の線形補間で求めた値です。
ヒストグラムで形を見る
ヒストグラムは、値を区間(階級)に分けて、各区間に何件入るかを棒で表します。pandasのDataFrame.histでは、区間数の既定値は10です。binsには整数のほか、区間の端を並べたリストも渡せます。2組を比べるときは、区間の端を揃えるのが大切です。ここでは5分刻みにしました(区間は「以上〜未満」)。
区間(分) A店 B店
15〜20 - ■■ (2)
20〜25 - ■■■■■■■ (7)
25〜30 ■■■■■■■ (7) ■■■■ (4)
30〜35 ■■■■■■■■■■■■■ (13) ■■■ (3)
35〜40 - ■ (1)
40〜45 - -
45〜50 - ■ (1)
50〜55 - -
55〜60 - -
60〜65 - ■ (1)
65〜70 - -
70〜75 - -
75〜80 - ■ (1)A店は25〜35分の2区間にすべて収まり、平均の周りに集まっています。B店は20〜25分に山があり、右に長いすそが伸びています。B店の20件のうち12件は、平均の30分より短い時間です。平均の30分は、B店の「典型的な1件」ではありません。少数の遅い配送が平均を押し上げています。
箱ひげ図の各部の読み取りメモ
箱ひげ図は、四分位数を使って分布を要約します。総務省統計局の「なるほど統計学園」の箱ひげ図の解説によると、箱の中央の線は中央値であって平均値ではありません。同ページの図ではひげは最小値・最大値を表しますが、ひげの定義は図によって異なるため確認が必要です。複数のデータを並べて比較しやすい点が、ヒストグラムとの違いです。
- 箱の下端、意味:第1四分位数(下から25%の位置)、A店:29、B店:21.75
- 箱の中の線、意味:中央値、A店:30、B店:24.5
- 箱の上端、意味:第3四分位数(75%の位置)、A店:31、B店:30.5
- 箱の高さ、意味:四分位範囲(IQR)。中央の約半分が入る幅、A店:2、B店:8.75
- ひげ、意味:箱の外側のデータの広がり、A店:26〜33、B店:18〜36
- 点、意味:ひげの外にある外れ値の候補、A店:なし、B店:45, 60, 75
ひげの定義には注意が必要です。統計局のページでは、掲載例のひげは最小値と最大値を表し、10パーセンタイル点を使う流儀もあると説明しています。一方、pandasのDataFrame.boxplotで使われるMatplotlibの既定では、ひげは箱の端から「IQRの1.5倍」以内にある最も遠いデータまで伸び、それより外側は点で描かれます。上の表は後者で計算しています。B店の上側の境界は 30.5 + 1.5×8.75 = 43.625 なので、45・60・75が点になり、ひげは36で止まります。
箱ひげ図を見るときのメモをまとめます。
- 箱が低く細ければ、中央付近のデータがそろっている。
- 中央線が箱の下寄りで、上のひげや点が長ければ、右にすそが伸びた分布。B店がこれにあたる。
- 平均値は箱ひげ図に描かれない。中央線と平均を混同しない。
- 点は「削除してよい値」ではない。入力ミスなのか、実際に起きた遅れなのかは、元の記録で確認する。
平均と中央値の差で判断する
作った図からどう判断するかを、表にしました。これは読み方の目安であり、統計的な基準ではありません。
- 平均 ≒ 中央値、箱が細い、考えられること:まとまりがよい、次にすること:平均で代表させてよいか、目的に照らして確認
- 平均 > 中央値、上に長いひげや点、考えられること:一部の大きな値が平均を押し上げている、次にすること:点の元記録を確認し、中央値も併記する
- 箱は同じでも点が多い、考えられること:通常時は安定だが、例外が出る、次にすること:例外の発生条件(曜日・時間帯など)を探す
- ヒストグラムに山が2つ、考えられること:性質の違うデータが混ざっている可能性、次にすること:条件別に分けて、もう一度描く
データ件数が少ないと、区間の取り方で形が変わります。区間の幅を2〜3通り試して、印象が大きく変わらないかも確かめましょう。
AIに任せる作業と、人が確認すること
図の作成や読み取りの下書きは、AIに任せられます。ただし、渡すデータは説明用の値か、個人や取引先が分からない形に整えたものにしてください。業務の生データをそのまま貼ることは避けます。
依頼文の例です。
次は配送時間(分)の記録です。A店・B店はそれぞれ20件で、説明用の仮データです。
A店:26,27,28,28,29,29,29,30,30,30,30,30,31,31,31,31,32,32,33,33
B店:18,19,20,21,21,22,22,23,24,24,25,26,28,29,30,32,36,45,60,75
1. pandasで、5分刻みの共通の区間(15〜80)のヒストグラムと、箱ひげ図を作るコードを書いてください。
2. 平均・中央値・四分位数を表にしてください。計算方法も書いてください。
3. 箱ひげ図のひげの定義(1.5×IQRか、最小〜最大か)を明記して、
外れ値の候補の値を挙げてください。
4. 「平均が同じだから同じ傾向」と言えない理由を、初心者向けに3文で説明してください。AIの回答を受け取ったら、人が次の点を確認します。
- 区間の端や「以上・未満」が、自分の想定と合っているか。
- 四分位数の計算方法と、ひげの定義が書かれているか。
- 外れ値の候補を、勝手に除外した前提で説明していないか。
- 数値が手元の合計や件数(今回なら20件、合計600分)と合っているか。
手元で確認するコード
次のコードは、上のデータを描くための例です。環境に合わせて動作を確認してください。
import pandas as pd
import matplotlib.pyplot as plt
a = [26,27,28,28,29,29,29,30,30,30,30,30,31,31,31,31,32,32,33,33]
b = [18,19,20,21,21,22,22,23,24,24,25,26,28,29,30,32,36,45,60,75]
df = pd.DataFrame({"A": a, "B": b})
print(df.mean())
print(df.median())
print(df.quantile([0.25, 0.5, 0.75]))
df.hist(bins=list(range(15, 85, 5))) # 区間の端を共通にする
plt.figure()
df.boxplot() # 既定のひげは1.5×IQR
plt.show()出力した四分位数は、pandasの既定の線形補間による表の値と一致する想定です。ヒストグラムの区間が違う場合は、区間の端を揃えているか確認します。
平均を報告するときは、中央値と箱ひげ図を一緒に出すだけで、読み手の誤解は大きく減ります。

