「日本の平均年収は約460万円」と聞いて、「自分の周りはもっと少ないのに、なぜこんなに高いの?」と感じたことはありませんか。あるいは「平均気温」「平均寿命」「テストの平均点」——私たちは日々、たくさんの数字を1つの「代表的な値」に要約して受け取っています。ところが、この「代表値」を平均で取るか中央値で取るかによって、同じデータがまったく違う印象を与えることがあります。年収の例で言えば、ごく一部の超高所得者が平均を大きく押し上げているため、「平均年収」は「多くの人が実際に得ている所得」とはかけ離れているのです。
データを1つの数値に要約する「代表値」には、大きく分けて平均(mean)・中央値(median)・最頻値(mode) の三本柱があります。どれもデータの「真ん中」を表そうとしますが、その捉え方はまったく異なります。平均はすべての値を均(なら)した重心、中央値は順番に並べたときのちょうど真ん中、最頻値は最も頻繁に現れる値です。どれを選ぶかで、外れ値への強さ、歪んだデータでの妥当性、扱えるデータの種類が変わってきます。
この区別を理解することは、統計のあらゆる場面で効いてきます。たとえば、機械学習の特徴量を要約して欠損値を補完するとき(外れ値があるなら平均ではなく中央値で埋めるべき)、A/Bテストやアンケート結果を報告するとき(歪んだ指標は中央値で語るべき)、そして所得格差や不動産価格のように裾の長い分布を扱うとき。代表値の選択を誤ると、データが語る真実を取り違えてしまいます。
本記事の内容
- 平均・中央値・最頻値それぞれの直感的な意味と数学的定義
- 算術平均・幾何平均・調和平均・加重平均という「平均の家族」とその使い分け
- 中央値がなぜ外れ値に頑健なのか、その理由
- カテゴリデータで唯一意味を持つ最頻値
- 歪度と「平均・中央値・最頻値」の大小関係、外れ値感度の比較
- 対数正規データ・所得分布・不動産価格でどの代表値を使うべきか
- トリム平均、Simpsonのパラドックスといった実務上の落とし穴
- Pythonでの実装と可視化による直感の裏付け
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
代表値とは — データを1点に要約する
たくさんの数字が並んだデータを目の前にしたとき、私たちはまず「で、結局どのくらいなの?」と知りたくなります。30人のクラスのテストの点数を全部眺めても全体像はつかめませんが、「だいたい70点くらい」と言われれば一気にイメージできます。この「だいたいこのくらい」を1つの数値で表したものが代表値です。
代表値は、分布の「中心位置」を捉える量だと考えるとよいでしょう。データが数直線上にばらまかれているとき、その「重心」「真ん中」「山の頂上」のどこを中心とみなすか——その立場の違いが、平均・中央値・最頻値という3つの代表値を生み出します。

上の図は、左右対称な正規分布の例です。対称な分布では、重心(平均)も、真ん中(中央値)も、山の頂上(最頻値)もすべて同じ点に重なります。つまり対称なデータでは、どの代表値を使っても結果は変わりません。3つの代表値が「分かれる」のは、分布が歪んだときです。本記事の核心は、まさにこの「分布が歪んだときに何が起きるか」にあります。
それでは、3つの代表値を1つずつ、直感と定義の両面から見ていきましょう。まずは最もなじみ深い「平均」からです。
算術平均と「平均の家族」
算術平均 — 均してならす重心
「平均」と聞いてまず思い浮かべるのは、全部足して個数で割る計算でしょう。5人の身長が 160, 165, 170, 175, 180 cm なら、足して 850、5 で割って 170 cm。これが算術平均(arithmetic mean) です。
イメージとしては、シーソーの支点です。データ点を数直線上の同じ重さのおもりだと思うと、算術平均はちょうどシーソーが釣り合う支点の位置になります。すべてのデータが平等に「綱引き」をして決まる、それが算術平均です。
データ $x_1, x_2, \dots, x_n$ に対して、算術平均 $\bar{x}$ は次で定義されます。
$$ \begin{equation} \bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i \end{equation} $$
この式は「すべての値を足し合わせ、データ数で割る」をそのまま表しています。確率変数 $X$ の文脈では、これは期待値 $E[X]$ の標本版にあたります(詳しくは期待値の記事を参照)。
算術平均には「重心」であることの数学的な裏付けがあります。各データ点からの偏差の総和がゼロになる点、それが算術平均なのです。
$$ \sum_{i=1}^{n} (x_i – \bar{x}) = \sum_{i=1}^{n} x_i – n\bar{x} = n\bar{x} – n\bar{x} = 0 $$
ここで $\sum x_i = n\bar{x}$(定義の両辺に $n$ を掛けた式)を代入しました。プラス方向の偏差とマイナス方向の偏差がぴったり打ち消し合う点——これがシーソーの支点である理由です。
もう一つ、算術平均には「二乗誤差を最小にする点」という重要な性質があります。各データからの距離の二乗和 $\sum_i (x_i – c)^2$ を最小にする $c$ を求めてみましょう。$c$ で微分してゼロと置くと、
$$ \frac{d}{dc}\sum_{i=1}^{n}(x_i – c)^2 = -2\sum_{i=1}^{n}(x_i – c) = 0 $$
となります。この式を $c$ について解くと $\sum_i x_i = nc$、すなわち $c = \bar{x}$。つまり算術平均は「二乗距離の合計を最小化する代表値」 です。後で出てくる中央値が「絶対距離の合計を最小化する代表値」であることと、きれいに対をなしています。この「何を最小化するか」の違いが、外れ値への強さの違いを生む根本原因なのです。
平均にはいくつもの種類がある
ところが「平均」は算術平均だけではありません。データの性質によっては、別の「ならし方」のほうが適切な場合があります。代表的なのが幾何平均と調和平均です。
幾何平均(geometric mean) は、掛け算的な量(比率・倍率・成長率)の平均に使います。
$$ \begin{equation} G = \left(\prod_{i=1}^{n} x_i\right)^{1/n} = \sqrt[n]{x_1 x_2 \cdots x_n} \end{equation} $$
たとえば、ある投資が1年目に2倍、2年目に8倍になったとします。「平均何倍になったか」を算術平均で $(2+8)/2 = 5$ 倍とするのは誤りです。2年で $2 \times 8 = 16$ 倍になったのだから、平均成長率は $\sqrt{16} = 4$ 倍。これが幾何平均です。掛け合わせて元に戻る「真ん中の倍率」を与えてくれます。
幾何平均には重要な別解釈があります。両辺の対数を取ると、
$$ \log G = \frac{1}{n}\sum_{i=1}^{n} \log x_i $$
つまり幾何平均は「対数を取った値の算術平均」を、再び指数に戻したものです。この性質は、後で対数正規分布を扱うときに決定的な役割を果たします。
幾何平均が活きる場面は投資収益率だけではありません。前年比 1.1 倍・0.9 倍・1.2 倍と変動する指標の「平均的な変化率」、複数のスケールが混在する評価指標(画像の解像度比とフレームレート比など)の総合スコア、人口やバクテリアの増殖率——掛け算で積み上がる量はすべて幾何平均が自然な中心を与えます。逆に、こうした量に算術平均を使うと系統的に過大評価してしまうので注意が必要です。
調和平均(harmonic mean) は、速さや割合(レート)の平均に使います。
$$ \begin{equation} H = \frac{n}{\sum_{i=1}^{n} \frac{1}{x_i}} \end{equation} $$
往復の平均速度がその典型です。行きを時速 30 km、帰りを時速 60 km で走ったとき、平均速度は $(30+60)/2 = 45$ km/h ではありません。同じ距離を進むのにかかる時間が違うからです。正しくは調和平均 $H = 2/(1/30 + 1/60) = 40$ km/h になります。「逆数の算術平均の逆数」という、ややこしいが本質的な計算です。
なぜ逆数を取るのかを片道 $d$ km で確かめましょう。行きにかかる時間は $d/30$ 時間、帰りは $d/60$ 時間、合計距離は $2d$ km です。平均速度は「総距離 ÷ 総時間」なので、
$$ \text{平均速度} = \frac{2d}{\frac{d}{30} + \frac{d}{60}} = \frac{2}{\frac{1}{30} + \frac{1}{60}} = 40 \ \text{km/h} $$
となります。距離 $d$ が約分で消え、まさに調和平均の式そのものが現れました。速度のように「分母(時間)あたりの量」を平均するときは、単純な算術平均ではなく調和平均が正しい——これは多くの人がつまずくポイントです。
3つの平均には大小関係がある
実は、同じデータに対してこの3つの平均を計算すると、必ず次の不等式が成り立ちます(すべての値が正のとき)。
$$ \begin{equation} H \leq G \leq \bar{x} \end{equation} $$
これは AM-GM-HM不等式(算術・幾何・調和平均の不等式)と呼ばれる有名な関係です。等号が成立するのは、すべての値が等しいときだけ。データにばらつきがあるほど、3つの平均は離れていきます。Pythonで確かめてみましょう。
import numpy as np
# 2つの値で確認
a, b = 1.0, 4.0
am = (a + b) / 2 # 算術平均
gm = np.sqrt(a * b) # 幾何平均
hm = 2 / (1/a + 1/b) # 調和平均
print(f"算術平均 AM = {am:.4f}")
print(f"幾何平均 GM = {gm:.4f}")
print(f"調和平均 HM = {hm:.4f}")
print(f"HM <= GM <= AM ? {hm <= gm <= am}")
# 多数の乱数で不等式を検証
rng = np.random.default_rng(3)
x = rng.uniform(0.5, 5, (100000, 2))
AM = x.mean(axis=1)
GM = np.sqrt(x.prod(axis=1))
HM = 2 / (1/x).sum(axis=1)
print(f"\nHM <= GM が全件成立: {np.all(HM <= GM + 1e-12)}")
print(f"GM <= AM が全件成立: {np.all(GM <= AM + 1e-12)}")
出力では AM = 2.5000、GM = 2.0000、HM = 1.6000 となり、確かに $H \leq G \leq \bar{x}$ が成り立ちます。さらに10万組の乱数すべてでこの不等式が破れないことが確認できます。3つの平均は決して順序を入れ替えないのです。下の図でこの関係を視覚化します。

左の棒グラフは $a=1, b=4$ の場合の3平均の位置、右の散布図は10万組の乱数で「幾何平均・調和平均が常に算術平均以下($y=x$ の下側)」になることを示しています。すべての点が対角線の下に張り付いており、不等式が例外なく成り立つことが一目でわかります。
加重平均 — 重みをつけてならす
最後に、データごとに「重要度」が異なる場合の平均が加重平均(weighted mean) です。各値 $x_i$ に重み $w_i$ を付けて、
$$ \begin{equation} \bar{x}_w = \frac{\sum_{i=1}^{n} w_i x_i}{\sum_{i=1}^{n} w_i} \end{equation} $$
と定義します。たとえば成績評価で「中間試験40%・期末試験60%」のように科目に重みをつける場合や、複数地点の人口で重みづけして地域の平均所得を出す場合に使います。すべての重みが等しい($w_i = 1$)とき、加重平均は普通の算術平均に一致します。算術平均は加重平均の特別な場合なのです。
ここまでで「平均」という言葉が実は一族であることがわかりました。しかし平均には共通の弱点があります——外れ値に弱いのです。次は、その弱点を克服する中央値を見ていきましょう。
中央値と頑健性
中央値 — 順番に並べた真ん中
中央値(median) は、データを小さい順に並べたときちょうど真ん中に来る値です。5人の年収が 300, 350, 400, 450, 1500 万円なら、真ん中の 400 万円が中央値です。ここで注目してほしいのは、一番右の 1500 万円という飛び抜けた値があっても、中央値は微動だにしないという点です。
イメージとしては、行列の真ん中の人です。背の順に並んだ列で「ちょうど真ん中の人の身長」を聞かれたら、列の端に巨人が1人混じっていても答えは変わりません。端の人がどれだけ極端でも、真ん中の人は真ん中のままだからです。
データ数を $n$、小さい順に並べ替えた値を $x_{(1)} \leq x_{(2)} \leq \dots \leq x_{(n)}$ とすると、中央値は次で定義されます。
$$ \begin{equation} \mathrm{median} = \begin{cases} x_{\left(\frac{n+1}{2}\right)} & (n \text{ が奇数}) \\[1.2ex] \dfrac{1}{2}\left(x_{\left(\frac{n}{2}\right)} + x_{\left(\frac{n}{2}+1\right)}\right) & (n \text{ が偶数}) \end{cases} \end{equation} $$
奇数個ならちょうど真ん中の1個、偶数個なら真ん中2個の平均を取ります。定義に「足して割る」が出てくるのは偶数の場合だけで、本質はあくまで「順位の真ん中」です。
なぜ中央値は外れ値に頑健なのか
中央値の頑健性(robustness)の正体は、順位しか見ていないことにあります。平均はすべての値の大きさを足し合わせるので、1つの値が極端に大きくなれば総和が膨らみ、平均も引きずられます。一方で中央値は「真ん中が誰か」という順位の情報だけを使うため、端の値がどれだけ極端でも順位は変わらず、中央値も動きません。
数学的に言えば、中央値は絶対距離の合計 $\sum_i |x_i – c|$ を最小化する点です。先ほど算術平均が「二乗距離の合計」を最小化したのと対照的です。二乗距離は外れ値の寄与を $(x_i – c)^2$ と二乗で増幅するため、遠い1点が最適解 $c$ を大きく引っ張ります。一方、絶対距離は遠い点も近い点も $|x_i – c|$ と一次でしか効かないため、極端な値の影響が抑えられます。「誤差をどう測るか」の選択が、そのまま頑健性の差として現れているのです。
この違いを数値実験で確かめましょう。9個の安定したデータに、1つだけ外れ値を加えて、その外れ値を徐々に大きくしていきます。
import numpy as np
base = np.array([3, 4, 4, 5, 5, 5, 6, 6, 7], dtype=float)
for outlier in [7, 20, 50, 100, 1000]:
d = np.append(base, outlier)
print(f"外れ値={outlier:5.0f}: 平均={d.mean():7.2f}, 中央値={np.median(d):.2f}")
出力を見ると、外れ値を 7 から 1000 まで大きくしていくと、平均は 5.20 から 104.5 へと際限なく膨れ上がるのに対し、中央値は一貫して 5.0 のまま動きません。これが頑健性です。下のグラフでこの様子を連続的に追ってみます。

横軸に外れ値の大きさ、縦軸に代表値を取りました。外れ値が大きくなるにつれ、平均(赤)は一直線に上昇していくのに対し、中央値(青)は完全に水平です。統計学では「1つの観測値を無限大にしても破綻しない」という頑健性の度合いをブレークダウンポイントと呼びますが、中央値はデータの半分が汚染されても耐えるという、極めて高い頑健性を持っています。
中央値はこのように外れ値に強い一方で、扱えるのは「順序がつけられるデータ」だけです。では、順序すらつけられないデータ——たとえば「好きな色」のようなカテゴリ——にはどんな代表値を使えばよいのでしょうか。
最頻値とカテゴリデータ
最頻値 — 最も多く現れる値
最頻値(mode) は、データの中で最も頻繁に出現する値です。たとえばアンケートで「赤・青・緑・黄・黒」のうち最も回答数が多かった色——それが最頻値です。分布で言えば「山の頂上」にあたります。
最頻値が決定的に重要なのは、カテゴリデータ(質的データ) を扱うときです。「好きな色」「血液型」「都道府県」のようなデータには、足し算も大小比較もできません。「赤 + 青 ÷ 2」に意味はないし、「赤 < 青」という順序もありません。平均も中央値も計算不可能です。こうしたデータで唯一意味を持つ代表値が、最頻値なのです。
機械学習の文脈でも最頻値は欠かせません。欠損値を補完するとき、数値特徴量なら平均や中央値で埋めますが、カテゴリ特徴量(性別・職業・地域など)は最頻値で埋めるのが定石です。scikit-learn の SimpleImputer に strategy="most_frequent" という選択肢があるのは、まさにこのためです。「どの代表値で欠損を埋めるか」は前処理の質を左右する地味だが重要な判断であり、その出発点が代表値の理解にあります。

上の棒グラフは「好きな色」アンケートの結果です。最も回答数の多い「青」が最頻値で、緑の枠で強調しています。色には足し算も順序もないため、「平均的な色」も「真ん中の色」も存在しません。最も多く選ばれた色を代表値とする以外に道はないのです。
import numpy as np
from scipy import stats
# 数値データの最頻値
data = np.array([3, 4, 4, 5, 5, 5, 6, 6, 7])
m = stats.mode(data, keepdims=False)
print(f"数値データの最頻値: {m.mode}(出現回数 {m.count})")
# カテゴリデータの最頻値
colors = ["赤", "青", "青", "緑", "青", "黒", "赤", "青", "黒", "黒"]
vals, counts = np.unique(colors, return_counts=True)
mode_color = vals[np.argmax(counts)]
print(f"カテゴリの最頻値: {mode_color}")
for v, c in zip(vals, counts):
print(f" {v}: {c}回")
出力では数値データの最頻値が 5(3回出現)、カテゴリデータの最頻値が「青」(4回)と求まります。scipy.stats.mode は数値配列に対して最頻値とその出現回数を返してくれます。カテゴリの場合は出現回数を数えて最大のものを選べばよいわけです。
最頻値の注意点
最頻値には注意すべき点があります。第一に、最頻値は複数存在しうること。山が2つある分布(二峰性分布)では最頻値も2つになります。たとえば「子どもと大人が混在する集団の身長」のように本質的に2つのグループが混ざったデータでは、最頻値が2つ現れること自体が「集団が単一でない」という重要な情報を運びます。第二に、連続データでは「まったく同じ値」がほとんど出現しないため、ヒストグラムの区間(ビン)で区切ってから最も度数の高い区間を最頻値とするか、密度推定の山の頂点を使う必要があります。このとき区間幅の取り方で最頻値の位置が変わってしまうため、最頻値は平均や中央値に比べて「定義が安定しにくい」代表値だという点も覚えておきましょう。
なお、最頻値は順序のあるデータ(順序尺度)でも使えます。「不満・やや不満・普通・やや満足・満足」のようなアンケートの5段階評価では、平均を取るのは厳密には不適切(各段階の間隔が等しい保証がない)ですが、最頻値や中央値なら安心して使えます。データの「尺度水準」によって使える代表値が変わる、というのは記述統計の基本作法です。
ここまでで3つの代表値が出そろいました。対称なデータでは一致するこの3つが、歪んだデータではどのように分かれるのか——いよいよ本記事の核心に入ります。
三者の関係と歪度
歪んだ分布では3つが分かれる
冒頭の図で見たように、左右対称な分布では平均・中央値・最頻値は同じ点に重なります。しかし現実のデータの多くは左右非対称、つまり歪んで(skewed) います。所得、家賃、待ち時間、ファイルサイズ——いずれも「大きいほうに長い裾」を引く右歪み(正の歪度)の分布です。
このような右に歪んだ分布では、3つの代表値が次の順序で並びます。
$$ \begin{equation} \text{最頻値} \leq \text{中央値} \leq \text{平均} \end{equation} $$
直感的に理解しましょう。最頻値は「山の頂上」なので、データが密集している左側に位置します。平均は「重心」なので、右に伸びた長い裾に引っ張られて右側に寄ります。中央値は「順位の真ん中」なので、ちょうどその間に来ます。裾が引っ張る力を最も強く受けるのが平均、まったく受けないのが最頻値、というわけです。

上の図は右に歪んだ分布の例です。緑の最頻値が山の頂上(最も左)、赤の平均が裾に引かれて最も右、青の中央値がその間に位置しています。左に歪んだ分布(負の歪度)では、この順序がそっくり逆転し「平均 ≤ 中央値 ≤ 最頻値」となります。
歪度との関係
なぜ平均が最も右に来るのか、もう少し丁寧に考えましょう。平均は全データの総和で決まるため、右の裾にある「数は少ないが値が桁違いに大きい」観測値が、その値の大きさに比例して総和に寄与します。たとえば100万円の家賃の物件が1件あれば、それだけで平均を大きく押し上げます。一方、中央値は順位だけを見るので、その物件は「上から1番目」という1つの順位を占めるにすぎず、影響は限定的です。最頻値に至っては、最も密集した区間の外にあるその物件を完全に無視します。「裾の重さをどれだけ感じるか」が3者で段階的に異なる——これが順序が生まれる本質です。
この大小関係は、分布の歪度(skewness) という量と直結しています。歪度は分布の非対称性を測る指標で、3次のモーメントで定義されます(モーメントについては確率・統計におけるモーメントの記事を参照)。
$$ \begin{equation} \gamma_1 = E\!\left[\left(\frac{X – \mu}{\sigma}\right)^3\right] \end{equation} $$
ここで $\mu$ は平均、$\sigma$ は標準偏差です。$\gamma_1 > 0$ なら右歪み(平均が中央値より大きい)、$\gamma_1 < 0$ なら左歪み、$\gamma_1 = 0$ なら対称です。経験的には次の近似関係が知られています。
$$ \text{平均} – \text{最頻値} \approx 3\,(\text{平均} – \text{中央値}) $$
これは「中央値は最頻値と平均のおよそ1:2の内分点に来る」ことを意味し、ピアソンの経験則と呼ばれます。歪みが強いほど3つの代表値の間隔が広がります。Pythonで歪度と代表値の関係を確認しましょう。
import numpy as np
from scipy import stats
rng = np.random.default_rng(1)
data = rng.lognormal(mean=0.0, sigma=0.7, size=500000)
mean = data.mean()
median = np.median(data)
# 連続分布の最頻値はヒストグラムのピークで近似
hist, edges = np.histogram(data, bins=300, range=(0, 8))
mode_approx = (edges[np.argmax(hist)] + edges[np.argmax(hist)+1]) / 2
skew = stats.skew(data)
print(f"歪度 = {skew:.3f}(正なら右歪み)")
print(f"最頻値(近似)= {mode_approx:.3f}")
print(f"中央値 = {median:.3f}")
print(f"平均 = {mean:.3f}")
print(f"最頻値 <= 中央値 <= 平均 ? "
f"{mode_approx <= median <= mean}")
出力では歪度が約 +3.0 の大きな正の値となり、最頻値(約0.6)≤ 中央値(約1.0)≤ 平均(約1.3)という順序がきれいに成り立ちます。歪度が正、つまり右に裾を引く分布では、確かに理論どおりの大小関係が現れることが数値で裏付けられました。
3つの代表値がこのように分かれることがわかると、次に気になるのは「どれくらい外れ値の影響を受けやすいのか」という定量的な比較です。これを次のセクションで詳しく見ます。
外れ値の影響を比較する
感度の違いを定量化する
前のセクションで中央値が外れ値に頑健だと述べましたが、平均・中央値・最頻値の3つを並べて、外れ値混入時にどう振る舞うかを比較してみましょう。クリーンなデータに外れ値を混ぜ、各代表値がどれだけ「ずれる」かを測ります。
import numpy as np
from scipy import stats
rng = np.random.default_rng(6)
clean = rng.normal(50, 8, 500) # 真の中心は50付近
# 外れ値を5%混入
n_out = 25
contaminated = np.concatenate([clean, rng.normal(300, 30, n_out)])
for name, d in [("クリーン", clean), ("外れ値混入", contaminated)]:
mean = d.mean()
median = np.median(d)
hist, edges = np.histogram(d, bins=50)
mode_approx = (edges[np.argmax(hist)] + edges[np.argmax(hist)+1]) / 2
print(f"{name:8s}: 平均={mean:6.2f}, 中央値={median:6.2f}, "
f"最頻値={mode_approx:6.2f}")
出力を見ると、クリーンなデータでは3つの代表値がいずれも50付近で一致します。ところが外れ値を5%混入させると、平均は約62まで大きく跳ね上がるのに対し、中央値と最頻値はほぼ50のまま動きません。たった5%の汚染で平均が12も狂うのに対し、中央値はびくともしない——この差が「頑健性」の実用的な意味です。
トリム平均 — 平均と中央値の中間
平均の「すべての情報を使う」長所と、中央値の「外れ値に強い」長所を両取りしたいときに使うのがトリム平均(trimmed mean) です。データの両端から一定割合を切り捨ててから、残りで算術平均を取ります。
たとえば「10%トリム平均」なら、小さいほうの10%と大きいほうの10%を捨て、中央の80%だけで平均します。フィギュアスケートの採点で最高点と最低点を除外するのと同じ発想です。切り捨てる割合を0%にすれば普通の平均、50%に近づければ中央値に一致します。トリム平均は、その両極端の連続的な中間に位置するのです。
import numpy as np
from scipy import stats
rng = np.random.default_rng(6)
clean = rng.normal(50, 8, 200)
contaminated = np.concatenate([clean, rng.normal(200, 20, 12)])
print(f"通常の平均 (0%トリム): {contaminated.mean():.2f}")
print(f"10%トリム平均 : {stats.trim_mean(contaminated, 0.1):.2f}")
print(f"20%トリム平均 : {stats.trim_mean(contaminated, 0.2):.2f}")
print(f"中央値 : {np.median(contaminated):.2f}")
出力では、通常の平均が外れ値に引っ張られて高い値を示すのに対し、トリム平均は切り捨て割合を増やすほど中央値に近づいていきます。scipy.stats.trim_mean がこの計算を担ってくれます。下の図でその連続的な変化を確認します。

左はヒストグラム上での各代表値の位置、右は切り捨て割合を0%から40%まで変化させたときのトリム平均の軌跡です。切り捨てを増やすほどトリム平均(オレンジ)が通常の平均(赤の点線)から離れ、中央値(青の破線)へとなめらかに近づいていく様子がわかります。トリム平均は「全データを使いたいが外れ値だけは無視したい」という実務の要請に応える、バランスの取れた代表値です。
外れ値への強さがわかったところで、いよいよ実践的な問い——「結局、どの場面でどの代表値を使えばよいのか」に答えていきます。
どの代表値を使うべきか
判断の指針
ここまでの議論をまとめると、代表値の選択はおおよそ次の指針に従います。
- 対称でばらつきが穏やかなデータ → 平均が最適。すべての情報を使え、数学的にも扱いやすい(分散・標準偏差と一貫する)
- 歪んだデータ・外れ値があるデータ → 中央値。裾の影響を受けず「典型的な値」を表す
- 掛け算的な量(成長率・比率) → 幾何平均。対数スケールで自然な中心になる
- 速さ・レートの平均 → 調和平均
- カテゴリデータ(順序なし) → 最頻値。ほかに選択肢がない
- 外れ値を排除しつつ平均的情報も使いたい → トリム平均
実務でよくあるのは「平均と中央値を両方報告する」という選択です。両者が近ければデータは概ね対称で、平均を信頼してよいというサインになります。逆に両者が大きく離れていれば「このデータは歪んでいる、または外れ値がある」という警告であり、中央値を主役に据えるべきだとわかります。つまり、2つの代表値を並べること自体が、分布の素性を診断する道具になるのです。報告の手間を惜しまず両方を示すのが、誠実なデータ提示の作法と言えるでしょう。
対数正規データはどう扱うか
特に注意すべきは、対数正規分布に従うデータです。所得、株価、都市の人口、生物の体重など、自然界・社会には対数正規データがあふれています。これらは「対数を取ると正規分布になる」という性質を持ちます。
対数正規データでは、算術平均は裾に引っ張られて「典型値」から大きく外れます。一方、中央値や幾何平均は、対数スケールでの対称性をうまく捉えるため、より「典型的な値」を表します。実は対数正規分布では中央値と幾何平均が一致するという美しい性質があります。
import numpy as np
rng = np.random.default_rng(5)
mu, sigma = 1.0, 0.9
data = rng.lognormal(mean=mu, sigma=sigma, size=200000)
mean = data.mean()
median = np.median(data)
gm = np.exp(np.log(data).mean()) # 幾何平均 = exp(対数の平均)
print(f"算術平均 = {mean:.3f}(裾に引っ張られる)")
print(f"中央値 = {median:.3f}")
print(f"幾何平均 = {gm:.3f}(中央値とほぼ一致)")
print(f"理論中央値 = exp(mu) = {np.exp(mu):.3f}")
出力では、算術平均が中央値・幾何平均より明確に大きくなる一方、中央値と幾何平均はほぼ同じ値になり、しかも理論値 $e^{\mu}$ とよく一致します。対数正規データの「典型値」を語るなら、算術平均ではなく中央値(=幾何平均)を使うべきだ、ということがはっきりわかります。下の図で視覚的に確認します。

左は元のスケールでのヒストグラムで、強い右歪みのために算術平均(赤)が分布の山から大きく右にずれています。右は対数スケールに変換したもので、ここでは分布が対称な正規分布になり、中央値と幾何平均が分布の中心にぴったり重なります。「対数で対称になるなら、対数の世界で中心を取るべき」——これが幾何平均・中央値が対数正規データに適する理由です。
代表値の選び方がわかったところで、ここまで説明したすべてを1つのPythonコードに統合し、実データ風の例で実装してみましょう。
Pythonでの実装
代表値をまとめて計算する関数
実務では、データを渡すと全代表値を一度に計算してくれる関数があると便利です。これまでの議論を1つにまとめた実装を作ります。
import numpy as np
from scipy import stats
def describe_center(data, bins=50):
"""データの代表値をまとめて返す"""
data = np.asarray(data, dtype=float)
hist, edges = np.histogram(data, bins=bins)
mode_idx = np.argmax(hist)
result = {
"算術平均": data.mean(),
"中央値": np.median(data),
"最頻値(近似)": (edges[mode_idx] + edges[mode_idx + 1]) / 2,
"幾何平均": np.exp(np.log(data[data > 0]).mean()),
"調和平均": stats.hmean(data[data > 0]),
"10%トリム平均": stats.trim_mean(data, 0.1),
"歪度": stats.skew(data),
}
return result
# 右に歪んだデータで試す
rng = np.random.default_rng(0)
sample = rng.lognormal(mean=1.0, sigma=0.8, size=10000)
for name, val in describe_center(sample).items():
print(f"{name:14s}: {val:8.3f}")
出力を見ると、右歪みデータでは「最頻値 < 幾何平均 ≈ 中央値 < 算術平均」という順序が現れ、歪度は正の値になります。1つの関数ですべての代表値を一望できるため、新しいデータに出会ったとき「どの代表値で語るべきか」をすぐ判断できます。調和平均が最も小さく、算術平均が最も大きいという、AM-GM-HM不等式どおりの並びも確認できます。
箱ひげ図で代表値の関係を可視化する
最後に、データの分布と代表値の関係を一目で把握できる箱ひげ図(boxplot) を見ておきましょう。箱ひげ図は中央値・四分位数・外れ値を一度に表示でき、平均との位置関係から歪みを読み取れます。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import font_manager
# 日本語フォント設定
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP"]:
if any(cand == f.name for f in font_manager.fontManager.ttflist):
plt.rcParams["font.family"] = cand
break
plt.rcParams["axes.unicode_minus"] = False
rng = np.random.default_rng(10)
sym = rng.normal(50, 10, 2000) # 対称
skew = rng.lognormal(mean=3.6, sigma=0.5, size=2000) # 右歪み
fig, ax = plt.subplots(figsize=(9, 5))
ax.boxplot([sym, skew], orientation="horizontal",
showmeans=True, meanline=True,
medianprops=dict(color="#1f77b4", lw=2),
meanprops=dict(color="#d62728", lw=2, ls=":"))
ax.set_yticklabels(["対称な分布", "右に歪んだ分布"])
ax.set_xlabel("値")
plt.tight_layout()
plt.show()

箱ひげ図では、箱の中の実線が中央値、点線が平均を表します。上段の対称な分布では中央値と平均がほぼ一致し、箱も左右対称です。下段の右歪み分布では、箱が左に偏り、外れ値(右側の点)に引っ張られて平均(赤の点線)が中央値(青の実線)より右にずれているのがわかります。「平均が中央値の右にある=右歪み」 という読み取りは、データの素性を見抜く実用的なテクニックです。
実装が固まったところで、現実のデータで代表値の選択が決定的に効く応用例を3つ見ていきましょう。
応用 — 所得・不動産・Simpsonのパラドックス
所得分布 — なぜ「中位所得」を使うのか
政府統計が「平均所得」とともに必ず「中位所得(中央値)」を報告するのには理由があります。所得は典型的な右歪み分布で、一部の超高所得者が平均を大きく押し上げるからです。「平均所得」は実感とかけ離れた数字になりがちで、「中位所得」のほうが「普通の世帯」の実態を表します。
import numpy as np
rng = np.random.default_rng(7)
income = rng.lognormal(mean=np.log(400), sigma=0.6, size=100000)
mean = income.mean()
median = np.median(income)
below_mean = np.mean(income < mean) * 100
print(f"平均所得 = {mean:.0f} 万円")
print(f"中位所得 = {median:.0f} 万円")
print(f"平均を下回る世帯の割合 = {below_mean:.1f}%")
出力では、平均所得が中位所得より2〜3割高くなり、しかも全世帯の6割前後が平均を下回るという結果になります。「平均」という言葉から多くの人が想像する「真ん中」とは裏腹に、平均所得を超えるのは少数派なのです。だからこそ「典型的な世帯」を語るには中央値が適切なのです。
この性質は、政策議論や報道でしばしば誤解の種になります。「平均所得が上がった」というニュースは、必ずしも「多くの人の暮らしが良くなった」を意味しません。ごく一部の超高所得層の所得が大きく伸びただけでも平均は上がるからです。格差や生活実感を論じるなら中央値、あるいは所得の各分位点(上位10%・下位10%など)まで見る必要があります。代表値1つで世の中を語ることの危うさが、所得という身近な例によく表れています。

上の図は所得分布のヒストグラムです。中央値(青の破線)が分布の山の近くにあるのに対し、平均(赤の点線)は高所得の裾に引っ張られて右にずれ、多くの世帯がその平均を下回っています。不動産価格も同じ構造を持ち、「平均住宅価格」より「中央値住宅価格」のほうが市場の実態を表すとされるのは、まさにこの理由によります。
Simpsonのパラドックス — 平均が逆転する罠
最後に、代表値(特に平均)の最も危険な落とし穴であるSimpsonのパラドックスを紹介します。これは「グループごとに見ると一貫してAが優れているのに、全体を合算するとBが優れて見える」という、直感に反する逆転現象です。
import numpy as np
# 治療AとBの成功率(軽症群・重症群)
# 軽症群: Aは少数だが成功率高い, Bは多数
# 重症群: Aは多数, Bは少数
A_light = (81, 87) # (成功, 例数)
A_severe = (192, 263)
B_light = (234, 270)
B_severe = (55, 80)
for name, (a, b) in [("A 軽症", A_light), ("A 重症", A_severe),
("B 軽症", B_light), ("B 重症", B_severe)]:
print(f"{name}: {a/b:.1%}")
A_all = (A_light[0] + A_severe[0]) / (A_light[1] + A_severe[1])
B_all = (B_light[0] + B_severe[0]) / (B_light[1] + B_severe[1])
print(f"\nA 全体: {A_all:.1%}")
print(f"B 全体: {B_all:.1%}")
print(f"全体ではどちらが上? {'A' if A_all > B_all else 'B'}")
出力を見ると、軽症群でも重症群でも治療Aの成功率がBを上回っているにもかかわらず、全体を合算すると治療Bの成功率がAを上回ってしまいます。これがSimpsonのパラドックスです。

上の棒グラフが示すとおり、軽症・重症の両グループでAが勝っているのに、全体(合算)ではBが勝っています。原因は、各群の例数の偏りです。Aは難しい重症群に多く割り当てられ、Bは成功しやすい軽症群に多く割り当てられていました。単純に全体平均を取ると、この「グループ構成の違い」が混入してしまうのです。
この罠を避けるには、データを適切なグループに層別してから比較する必要があります。「全体の平均」を鵜呑みにすると、まったく逆の結論を導きかねません——代表値を扱う上で、これは肝に銘じておくべき教訓です。
Simpsonのパラドックスが教えてくれるのは、「平均は背後の構成を隠してしまう」という代表値全般の限界です。1つの数値に要約するということは、必ず何らかの情報を捨てるということ。だからこそ、代表値だけを見て満足せず、分布の形(ヒストグラムや箱ひげ図)やグループ構成にも目を配る習慣が、データを正しく読む力につながります。
まとめ
本記事では、データを1点に要約する3つの代表値——平均・中央値・最頻値——を、定義から応用まで一気通貫で解説しました。
- 平均 はすべての値を均した「重心」。算術・幾何・調和・加重と一族をなし、$H \leq G \leq \bar{x}$ という不等式で結ばれる。情報を最大限使えるが外れ値に弱い
- 中央値 は順位の「真ん中」。順位しか見ないため外れ値に極めて頑健。歪んだデータの「典型値」を表す
- 最頻値 は最も多く現れる値。カテゴリデータで唯一意味を持つ代表値
- 対称な分布では3つが一致するが、右歪み分布では 最頻値 ≤ 中央値 ≤ 平均 の順に並ぶ(歪度が正)
- 対数正規データでは中央値(=幾何平均)が典型値を表し、所得や不動産価格でも中央値が実態を映す
- トリム平均は平均と中央値の中間に立つ頑健な指標
- 全体平均は Simpsonのパラドックスのような逆転を引き起こすため、層別が必要
代表値の選択は「正しい統計」の出発点です。同じデータでも、平均で語るか中央値で語るかによって伝わる印象はまったく変わります。本記事で身につけた「どの代表値をいつ使うか」の判断は、記述統計から機械学習の前処理、データの可視化まで、あらゆる場面で土台となります。
次のステップとして、代表値の「ばらつき」を測る指標や、2変数の関係を捉える統計量へと進むとよいでしょう。