「central tendency」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「central tendency」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「central tendency の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
論文記事から各用語のリンクをクリックすると、 該当箇所が開きます:
🍰 まずはやさしく
データの中心を表す数字のことです。
たくさんのデータを簡単にまとめるために使います。
テストの点数の平均を出すときなどに便利です。
代表値には3つの種類があることを学びます。
🍰 まずはやさしく
統計でよく使う基本の道具です。
地域のデータなどを短くまとめて伝えるために使います。
47都道府県の家の広さを比べる時に役立ちます。
計算方法や使い方の流れを順番に見ていきましょう。
論文や記事中に 「平均」「中央値」「最頻値」 として登場する用語群です。 47都道府県や時系列データを要約するとき必ず使う、 統計学の最も基本的な道具。
このページの構成:説明 → 数式 → 実値計算 → ベクトル例 → Python が一体化されています。 「数式だけ独立して見せる」のではなく、 流れの中で身につけられるよう編まれています。
中央値は、 データを小さい順に並べたときの真ん中の値。 平均が「重心」だったのに対し、 中央値は 順位の中心 を表します。 値そのものではなく「順位」を使うので、 両端にどれだけ巨大な値があっても中央値はびくともしません。
データを昇順に並べて $x_{(1)} \le x_{(2)} \le \cdots \le x_{(n)}$ としたとき、 中央値は
$$ \tilde{x} = \begin{cases} x_{((n+1)/2)} & (n \text{ が奇数}) \\ \dfrac{x_{(n/2)} + x_{(n/2+1)}}{2} & (n \text{ が偶数}) \end{cases} $$
連続分布の場合は累積分布関数 $F$ の 0.5 になる点:$F(\tilde{x}) = 0.5$。 数学的にはL1 損失(絶対値和)を最小化する点でもあります:$\tilde{x} = \arg\min_m \sum_i |x_i - m|$。 これは平均が「二乗和(L2)」を最小化することと対をなします。
住居費から等間隔で7県を抜き出します(千円/月):
元データ(順不同): 11.64, 13.60, 15.88, 18.47, 19.93, 22.96, 27.52
これを昇順に並べて真ん中の4番目を取ります:
| 順位 | 都道府県 | 住居費 |
|---|---|---|
| 1 | 神奈川県 | 11.64 |
| 2 | 福井県 | 13.60 |
| 3 | 島根県 | 15.88 |
| 4 | 佐賀県 | 18.47 |
| 5 | 長崎県 | 19.93 |
| 6 | 鹿児島県 | 22.96 |
| 7 | 沖縄県 | 27.52 |
$n=7$(奇数)なので、 真ん中は $(7+1)/2 = 4$ 番目。 中央値 = 18.47 千円。
同じデータを偶数(6個に減らす)と、 真ん中の2つの平均を取ります:例えば3番目と4番目が $a, b$ なら中央値 $= (a+b)/2$。
1次元ベクトル $\boldsymbol{x} \in \mathbb{R}^n$ について、 ソート後の順序統計量 $x_{(i)}$ を使えば中央値は順位 $(n+1)/2$ の要素。 2次元行列 $X \in \mathbb{R}^{n \times d}$ なら列ごとに計算した中央値ベクトル $\tilde{\boldsymbol{x}} \in \mathbb{R}^d$ を作れます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import numpy as np import pandas as pd # 1次元 x = np.array([50, 70, 80, 90, 90]) print(np.median(x)) # 80.0 # 偶数個(真ん中2つの平均) x6 = np.array([1, 3, 5, 7, 9, 11]) print(np.median(x6)) # 6.0 = (5+7)/2 # 2次元(行列の列ごと) X = np.array([[1, 10], [3, 30], [5, 50], [7, 70], [9, 90]]) print(np.median(X, axis=0)) # [5, 50] # 欠損値を無視 print(np.nanmedian([1, 2, np.nan, 4])) # 2.0 # Pandas # ── ここから実データ。SSDSE の費目名は「◯◯費(二人以上の世帯)」なので、 # 短い別名を付けてから使う ── df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() df['年度'] = pd.to_numeric(df['年度'], errors='coerce') df = df[df['年度'] == df['年度'].max()] # 最新年度の 47 行 df['住居費'] = pd.to_numeric(df['住居費(二人以上の世帯)'], errors='coerce') print(df['住居費'].median()) print(df['住居費'].describe()) # min/25%/50%(中央値)/75%/max |
「順位だけ」を使うため、 データの両端にどれほど巨大・極小な値があっても中央値は動きません。 これを崩壊点(breakdown point)と呼び、 平均は0%(1点で壊れる)、 中央値は50%(理論的最大)です。
所得分布や住宅価格、 地震被害額のように右に裾の長い分布では、 平均は裾に引っ張られて「典型的でない」値になり、 中央値の方が「典型的な値」を表します。 厚労省の調査では、 ある年の世帯平均所得 約552万円に対し中央値 約437万円。 「平均以下」の世帯が62%にもなるのはこのため。
平均にペアの「標準偏差」があるように、 中央値のロバスト版が MAD (Median Absolute Deviation):$\text{MAD} = \text{median}(|x_i - \text{median}(x)|)$。 正規分布なら $\sigma \approx 1.4826 \times \text{MAD}$ という換算式。
1 2 3 4 5 | from scipy import stats data = np.array([1, 2, 3, 4, 5, 6, 7, 100]) # 外れ値あり print(np.median(data)) # 4.5 print(stats.median_abs_deviation(data)) # 2.5(ロバスト) print(stats.median_abs_deviation(data, scale='normal')) # 正規分布換算 |
最頻値は、 データの中でもっとも多く現れる値。 アンケートのようなカテゴリ変数(血液型、 購入色、 好きなフレーバー)には平均も中央値も計算できないので、 最頻値が唯一意味を持つ代表値です。
離散分布での定義は $\text{Mode} = \arg\max_x P(X=x)$、 連続分布なら密度関数 $f(x)$ のピーク $\arg\max_x f(x)$。
① カテゴリデータ:「好きな果物」アンケート
| 果物 | 回答数 |
|---|---|
| リンゴ | 25 |
| バナナ | 42 |
| オレンジ | 18 |
| ぶどう | 15 |
最頻値 = バナナ(最大頻度 42)。 ここで「平均=ミカン的な何か」「中央値=順位の真ん中」と計算しても無意味です。
② 離散数値データ:あるクラスの兄弟姉妹の数 $\boldsymbol{x} = (0, 1, 1, 1, 2, 2, 3, 0, 1, 2, 1, 4)^\top$
頻度カウント:0→2回、 1→5回(最多!)、 2→3回、 3→1回、 4→1回。 最頻値 = 1。
③ 連続データ:47都道府県の食料費を8階級に区切ると、 74.4〜77.8 千円 の階級が 11都道府県を含み最多。 階級の中点 ≈ 76.1 千円が最頻値の代表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | from scipy import stats import pandas as pd import numpy as np # 1次元(離散) x = np.array([1, 2, 2, 3, 3, 3, 4, 5]) result = stats.mode(x, keepdims=False) print(result.mode, result.count) # 3, 3 # ── ここから実データ。SSDSE の費目名は「◯◯費(二人以上の世帯)」なので、 # 短い別名を付けてから使う ── df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) df = df[df['地域コード'].astype(str).str.match(r'^R\d{5}$', na=False)].copy() df['年度'] = pd.to_numeric(df['年度'], errors='coerce') df = df[df['年度'] == df['年度'].max()] # 最新年度の 47 行 df['食料費'] = pd.to_numeric(df['食料費(二人以上の世帯)'], errors='coerce') # 最頻値は「同じ値が繰り返し出る列」で意味を持つ。SSDSE に「果物」のような # 品目別の列は無いので、総人口を 3 段階に区切ったカテゴリを作って使う df['人口規模'] = pd.qcut(df['総人口'], 3, labels=['小', '中', '大']) # Pandas(複数最頻値なら全部返す) print(df['人口規模'].mode().tolist()) print(df['人口規模'].value_counts().head()) # 頻度トップ5 # 連続データの最頻値 → KDE で密度のピーク def continuous_mode(data, grid=1000): kde = stats.gaussian_kde(data) xx = np.linspace(data.min(), data.max(), grid) return xx[np.argmax(kde(xx))] print(continuous_mode(df['食料費'].dropna().values)) |
最頻値の数は、 データに何種類の集団が混ざっているかのヒントになります:
単峰性(山1つ)→ 1集団、 二峰性(山2つ)→ 2集団が混在している可能性(例:男女、 新旧モデル)、 多峰性→ 複数集団、 一様→ 最頻値が定まらない。
連続値は同じ値が複数現れることが稀。 ヒストグラムでビン幅を変えると最頻値も変わってしまうため、 カーネル密度推定(KDE)で滑らかな密度関数を作り、 そのピークを最頻値とします。
🍰 まずはやさしく
データの真ん中を探す方法です。
データの形に合わせて使い分けるために学びます。
部活の練習時間など、バラつきがある時に使います。
3つの代表値の得意と不得意を比べましょう。
データの真ん中を「ひとつの数で表せ」と言われたら、 答えは 3通りあります。 それぞれ得意な場面と苦手な場面が違うので、 「分布を見てから選ぶ」のが大切です。
| 代表値 | 記号 | 直感 | 最適な場面 | 弱点 |
|---|---|---|---|---|
| 平均 | $\bar{x}$, $\mu$ | シーソーの支点 | 対称分布、 合計が意味を持つ場合 | 外れ値に弱い |
| 中央値 | $\tilde{x}$, ME | 並べて真ん中 | 歪んだ分布、 外れ値あり | 情報量を全部使わない |
| 最頻値 | Mo | 分布のピーク | カテゴリ変数、 多峰性の診断 | 連続値で定義困難 |
平均は、 すべての値を足してデータ数で割った代表値です。 物理的には、 各データ点に同じ重さの「玉」を置いたとき、 シーソーが釣り合う支点が平均。 つまり「データ全体の重心」。
数学的に表現すると、 $n$個のデータ $x_1, x_2, \ldots, x_n$ の平均は次式:
$$ \bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i = \frac{x_1 + x_2 + \cdots + x_n}{n} $$
記号を1つずつ読みほどくと:$\bar{x}$ は「エックスバー」(標本平均)、 $\sum_{i=1}^{n}$ は「$i$ を 1 から $n$ まで動かしながら全部足す」、 $\frac{1}{n}$ で個数で割る。 母集団全体の平均は $\mu$(ミュー)と書いて区別します。
🌐 関連手法・派生:中央値・最頻値・分散と並んで、 代表値は分布の土台です。
具体的な数値で確認しましょう。 47都道府県データから東北6県の食料費(千円/月、 2023年)を取り出します:
| 都道府県 | 食料費 $x_i$ | 偏差 $x_i - \bar{x}$ |
|---|---|---|
| 青森県 | 77.899 | -2.925 |
| 岩手県 | 81.997 | +1.173 |
| 宮城県 | 83.835 | +3.011 |
| 秋田県 | 78.124 | -2.700 |
| 山形県 | 84.105 | +3.281 |
| 福島県 | 78.984 | -1.840 |
| 合計 | 484.944 | ≈ 0 |
公式に代入:$\bar{x} = (484.944) / 6 = \mathbf{80.824}$ 千円。
偏差の合計が(丸め誤差を除き)ゼロになるのが重要な性質で、 これが「平均は重心」と呼ばれる所以です。 正と負の偏差がちょうど釣り合う点が平均。
1次元ベクトル例:上のデータを列ベクトルにすると
$$ \boldsymbol{x} = (78.124, 78.984, 81.997, 83.835, 84.105, 80.700)^\top \in \mathbb{R}^6 $$
全要素1のベクトル $\mathbf{1} = (1,1,\ldots,1)^\top$ を使えば、 平均は内積で書けます:
$$ \bar{x} = \frac{1}{n} \mathbf{1}^\top \boldsymbol{x} $$
2次元(行列)例:3地域×2項目のデータ行列
$$ X = \begin{pmatrix} 78 & 9 \\ 81 & 11 \\ 84 & 10 \end{pmatrix} \in \mathbb{R}^{3 \times 2} $$
各列の平均(列平均ベクトル)は $\bar{\boldsymbol{x}} = \frac{1}{n}\mathbf{1}^\top X = (81.0, 10.0) \in \mathbb{R}^2$。 これは「各変数の平均ベクトル」と呼ばれ、 PCA や標準化の基礎になります。
同じ計算を NumPy/Pandas でやります:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | import numpy as np import pandas as pd # 1次元データ(東北6県の食料費) x = np.array([78.124, 78.984, 81.997, 83.835, 84.105, 80.700]) print(np.mean(x)) # 80.824 print(x.mean()) # 同じ # 全要素1のベクトルとの内積で平均を表現 n = len(x) print((np.ones(n) @ x) / n) # 80.824 # 2次元行列(3地域×2項目)の列平均 X = np.array([[78, 9], [81, 11], [84, 10]]) print(X.mean(axis=0)) # [81.0, 10.0] # Pandas で SSDSE データ読み込み df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) print(df['食料費(二人以上の世帯)'].mean()) # 全国47都道府県の平均 print(df.groupby('地域コード')['食料費(二人以上の世帯)'].mean()) # 地域別平均 |
平均はすべてのデータを使うので情報量は最大ですが、 1個の極端な値で大きく動きます。 例えば10人の年収が全員 400万円で1人だけ10億円なら、 平均は約 1億400万円。 「平均的な人」を全く表しません。
「平均」と言っても実は4種類あります。 同じデータでも目的により値が変わります。
① 算術平均(普段「平均」と呼ぶもの):$\bar{x}_A = \frac{1}{n}\sum x_i$
② 幾何平均(成長率・複利):$\bar{x}_G = \sqrt[n]{x_1 \cdot x_2 \cdots x_n} = \left(\prod x_i\right)^{1/n}$
例:年率 +50% → −50% の2年で投資は $\sqrt{1.5 \times 0.5} \approx 0.866$ → 年率 −13.4%(算術平均では誤って 0% と判定する)。 Python:scipy.stats.gmean([1.5, 0.5])。
③ 調和平均(速度・並列処理):$\bar{x}_H = \dfrac{n}{\sum 1/x_i}$
例:行き60 km/h、 帰り40 km/h の往復平均速度は調和平均で $2/(1/60+1/40) = 48$ km/h。 機械学習の F1 スコアもこの形(precision と recall の調和平均)。
④ 加重平均(重要度に差がある時):$\bar{x}_W = \dfrac{\sum w_i x_i}{\sum w_i}$
例:47都道府県の食料費の人口加重平均。 単純平均だと人口の少ない県と多い県を同等に扱うが、 全国の実態は加重平均が示す。
1 2 3 4 5 6 7 8 | from scipy import stats import numpy as np x = np.array([2.0, 4.0, 8.0]) print(np.mean(x)) # 算術平均: 4.667 print(stats.gmean(x)) # 幾何平均: 4.000 print(stats.hmean(x)) # 調和平均: 3.429 print(np.average(x, weights=[1, 3, 1])) # 加重平均: 4.4 |
大小関係:非負の値では常に AM ≥ GM ≥ HM(イェンセンの不等式)。
時系列データのノイズを取り除く基本手法。 単純移動平均(SMA):$\text{SMA}_t = \frac{1}{N} \sum_{i=t-N+1}^{t} x_i$。 指数移動平均(EMA):$\text{EMA}_t = \alpha x_t + (1-\alpha)\text{EMA}_{t-1}$(新しいデータに大きな重み)。
平均が統計学の中核を担う理由は、 2つの強力な定理があるから。 大数の法則: $\bar{X}_n \to \mu$(標本サイズ大で標本平均は母平均に収束)。 中心極限定理: $\bar{X}_n \sim N(\mu, \sigma^2/n)$(元の分布が何であれ標本平均は正規分布に近づく)。 これにより信頼区間や仮説検定が可能になります。
数直線の上の点をドラッグして動かす・空いた場所をタップして追加・「削除」モードでタップして消すと、 平均・中央値・最頻値の縦線がリアルタイムで動きます。 背景のヒストグラムと重ねて、 分布の形と 3 つの代表値の位置関係を体感してください。 「⚠ 外れ値を 1 点追加」を押すと、 平均は大きく引っ張られるのに中央値はほとんど動かないという頑健性の違いが数値(Δ)で見えます。
※ 最頻値は連続値では一意に決まらないため、 このツールではヒストグラムの最頻階級(最も背の高い棒)の中央を最頻値として表示します(度数分布からの最頻値の慣用的な求め方)。 「実データ:47県 人口」は SSDSE-B-2026 の 2023 年・47 都道府県の総人口(A1101、 万人単位)の実測値です(平均 264.6 / 中央値 154.9 万人)。 「実データ:東北6県 食料費」は本ページ上部と同じ 6 県の実測値(千円/月)です。
どの代表値が意味を持つかは、 データの尺度水準で決まります。 名義尺度(血液型・都道府県名)では順序も間隔も無いので最頻値のみ。 順序尺度(満足度の 5 段階など)では大小の順序があるので中央値まで可(平均は本来は不適切)。 間隔・比例尺度(気温・人口・金額)で初めて平均が正当化されます。 上のシミュレータの数直線は間隔以上の尺度を前提にしているので 3 者すべてを計算できますが、 実データでは「まずこの列は何尺度か」を確かめるのが順序です。
代表値は分布を「1 点」に潰した要約なので、 同じ平均でも散らばりが違えば意味はまるで違います。 だから中心(代表値)と広がり(分散・標準偏差・四分位範囲 IQR)は必ずペアで報告します。 対応関係も明快で、 平均には標準偏差(同じく外れ値に弱い)、 中央値にはIQRや MAD(中央絶対偏差、 頑健)を合わせるのが自然な組み合わせ。 シミュレータで点を広げたり縮めたりしながら、 「代表値は同じでも形が違う」状況を作ってみると、 散布度を併記する必然性が体感できます。
🍰 まずはやさしく
データを割合で分けたときの値です。
データの位置をより詳しく知るために使います。
スマホの利用時間を順に並べて分ける時に便利です。
中央値を広げた考え方である分位数について学びます。
中央値は「50% 分位数」の特殊例。 分位数の概念を一般化して理解すれば、 ロバスト統計・外れ値検出・リスク評価 (VaR) へとつながります。
$$Q_p = X_{(\lfloor h \rfloor)} + (h - \lfloor h \rfloor)(X_{(\lceil h \rceil)} - X_{(\lfloor h \rfloor)})$$
ただし $h = (n - \delta) p + \delta$ の $\delta$ により 9 種類の補間法に分岐 (R では type=1..9、 numpy では method='linear' 等で指定)。
このコードでやること: SSDSE 47 県人口を 10 分位 (0%, 10%, ..., 100%) で要約し、 各分位点に対応する県名を表示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | # SSDSE 47 県人口の 10 分位プロファイル import pandas as pd, numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', header=1) latest = df.sort_values('年度').groupby('地域コード').tail(1) sorted_df = latest.sort_values('総人口').reset_index(drop=True) sorted_df['総人口'] = sorted_df['総人口'] / 1000 # 人 → 千人(他ブロックと単位を揃える) for p in [0, 10, 25, 50, 75, 90, 100]: val = np.percentile(sorted_df['総人口'].values, p) # 最も近い県を検索 idx = (sorted_df['総人口'] - val).abs().argmin() name = sorted_df.loc[idx, '都道府県'] print(f'P{p:3d}: {val:7.0f} 千人 (近接: {name})') |
📤 実行例:
💬 中央値 (P50) は京都府の 157 万人。 IQR (P75 − P25) = 258 − 98 = 160 万人で「47 県の中盤 50% は概ね 100-260 万人」。 P90 (北海道) から P100 (東京都) の幅は約 880 万人で圧倒的に広い。 これが右裾の重さ、 算術平均が中央値より高くなる根本理由。
単純な「47 県の中央値」では、 鳥取県 (54 万人) と東京都 (1404 万人) を 1 票として扱うことになります。 実態 (全国民の中央値) を見たいなら人口加重中央値が必要。 これは「全国民を 1 列に並べたとき、 真ん中の人が住んでいる県」と読めます。
$$M_w = \arg\min_m \sum_{i=1}^{n} w_i |x_i - m|$$
あるいは「累積重みが全体の 50% を初めて超える $x_i$」とも定義可能 (両者は連続データで一致)。
このコードでやること: SSDSE-B-2026 の実在列 G7101(延べ宿泊者数)について単純中央値と人口加重中央値(重みは A1101 総人口)を計算。 「県別中央値」と「国民全体の中央値」がどう違うかを実感する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 単純中央値 vs 人口加重中央値 # 値 = 延べ宿泊者数 (G7101), 重み = 総人口 (A1101) import pandas as pd, numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df.rename(columns={df.columns[0]: 'Year'}) latest = df[df['Year'] == 2023] # 最新年 (2023) の 47 都道府県 sub = latest[['Prefecture', 'A1101', 'G7101']].dropna() sub = sub.sort_values('G7101').reset_index(drop=True) def weighted_median(values, weights): sorter = np.argsort(values) v = values[sorter]; w = weights[sorter] cum = np.cumsum(w) return v[np.searchsorted(cum, w.sum() / 2)] simple_med = np.median(sub['G7101'].values) weighted_med = weighted_median(sub['G7101'].values, sub['A1101'].values) print(f'単純中央値 (県別) = {simple_med:.0f}') print(f'人口加重中央値 (国民別) = {weighted_med:.0f}') print(f'比率 = {weighted_med/simple_med:.3f}') |
📤 実行例:
💬 加重中央値は単純中央値の約 2.9 倍。 つまり「都道府県を 1 票として並べた中央県の延べ宿泊者数(約 585 万人泊)」と「全国民を 1 列に並べた中央の人が住む県の延べ宿泊者数(約 1721 万人泊)」では約 3 倍の差が出る。 人口の多い都府県ほど宿泊者数も多いため、 国民を単位にすると中央がぐっと上振れする。 政策報告で「全国の中央値」を語るときは、 どちらの中央値かを必ず明示する必要がある。 国民個人の経験を反映するなら加重中央値が正しい。
前節の数式に含まれる記号を、 日本語の意味に翻訳する。
central tendency の数式は、 これらの記号を組み合わせて「データから未知量を推定する」あるいは「データの構造を要約する」プロセスを記述している。
中心傾向には算術平均 (mean) 以外に、 幾何平均 (geometric mean) と 調和平均 (harmonic mean) がある。 どちらを使うかは「データが何を表しているか」で決まる。 SSDSE-B-2026 の都道府県データで違いを実感しよう。
| 指標 | 定義 | 適用場面 | SSDSE 例 |
|---|---|---|---|
| 算術平均 | $\bar{x}=\frac{1}{n}\sum x_i$ | 加法的な量 | 総人口、 延べ宿泊者数 |
| 幾何平均 | $G=(\prod x_i)^{1/n}$ | 成長率、 比率の平均 | 人口増加率、 物価指数 |
| 調和平均 | $H=n/\sum(1/x_i)$ | 単位あたり量、 速度 | 人口密度、 燃費 |
大小関係: 常に $H \le G \le \bar{x}$ (等号成立は全データ同値時のみ)。 この不等式は中心傾向の選択基準として極めて重要。
🎯 このコードでやること: SSDSE-B-2026 の都道府県人口について算術平均・幾何平均・調和平均を計算し、 $H \le G \le \bar{x}$ を実値で確認する。
📥 入力データ (SSDSE-B-2026 総人口 A1101、 2023 年 47 県):
1 2 3 4 5 6 7 8 9 10 | import pandas as pd from scipy.stats import gmean, hmean df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) pop = df[df.iloc[:, 0] == 2023]['A1101'] / 1000 # 2023 年 47 県・千人 print(f"算術平均 = {pop.mean():.1f}") print(f"幾何平均 = {gmean(pop):.1f}") print(f"調和平均 = {hmean(pop):.1f}") print(f"H <= G <= mean: {hmean(pop) <= gmean(pop) <= pop.mean()}") |
📤 実行例:
💬 算術 2646 → 幾何 1831 → 調和 1423 と階段状に下がる(2023 年・千人)。 東京 (14,086 千人) と鳥取 (約 537 千人) の大きな差が、 算術平均を大きく押し上げている。 県別人口分布のように右に裾の長い分布では、 算術平均は「典型的な県」を表さない。 報告書で「平均人口」と書くときは、 どの平均かを必ず明示する。
「平均値が外れ値に弱い」「中央値は外れ値に強い」と一般論で語られるが、 その間には連続的なスペクトラムがある。 ここではトリム平均 (Trimmed Mean) と Winsor 平均 (Winsorized Mean) を SSDSE-B-2026 47 都道府県データで計算し、 「外れ値耐性」と「情報損失」のトレードオフを定量化する。
$n$ 個のデータを昇順に並べた $x_{(1)} \le x_{(2)} \le \cdots \le x_{(n)}$ について:
| 指標 | 値 (千人) | 外れ値耐性 (BP) | 情報利用率 |
|---|---|---|---|
| 算術平均 | 2,646 | 0% | 100% |
| 10%-トリム平均 | 2,109 | 10% | 80% |
| 10%-Winsor 平均 | 2,437 | 10% | 100% (置換) |
| 中央値 | 1,549 | 50% | 1 点のみ |
🎯 このコードでやること:SSDSE-B-2026 の都道府県総人口について、 算術平均・10%-トリム平均・10%-Winsor 平均・中央値の 4 種類を scipy.stats.trim_mean・scipy.stats.mstats.winsorize・numpy.median で計算し、 外れ値 (東京) を除外したときの変化幅で頑健性を定量化する。
📥 入力データ (SSDSE-B-2026 47 都道府県):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | import pandas as pd import numpy as np from scipy import stats from scipy.stats.mstats import winsorize df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) x = df[df.iloc[:, 0] == 2023]['A1101'].astype(float).values / 1000 # 2023年・千人 # 1. 算術平均 mean_full = x.mean() # 2. 10%-トリム平均 trim_full = stats.trim_mean(x, 0.10) # 3. 10%-Winsor 平均 wins_full = winsorize(x, limits=[0.10, 0.10]).mean() # 4. 中央値 med_full = np.median(x) print(f'全 47 県:') print(f' 算術平均 = {mean_full:8.1f}') print(f' 10%トリム平均 = {trim_full:8.1f}') print(f' 10%Winsor 平均 = {wins_full:8.1f}') print(f' 中央値 = {med_full:8.1f}') # 東京を除外して再計算 → 各指標の変化幅 x_no_tokyo = x[x < 10000] print(f'\n東京除外後:') print(f' 算術平均 = {x_no_tokyo.mean():8.1f} Δ={mean_full - x_no_tokyo.mean():+.1f}') print(f' 10%トリム平均 = {stats.trim_mean(x_no_tokyo, 0.10):8.1f}') print(f' 中央値 = {np.median(x_no_tokyo):8.1f}') |
📤 実行結果:
💬 結果の読み方:東京 1 県を除外しただけで算術平均は 約 249 千人 (9.4%) も動くが、 トリム平均は約 137 千人 (6.5%)、 中央値は 約 41 千人 (2.6%) しか動かない。 「47 県の典型的な人口を 1 つの数字で表す」目的なら算術平均は明らかに不適。 報告書で「平均人口」を語る際は、 トリム平均か中央値の併記が誠実。
代表値 (中心傾向) はデータの「典型」 を 1 つの数値で表す。 SSDSE-B-2026 の都道府県データを題材に、 平均・中央値・最頻値が分布形状によってどう乖離するかを実値で示す。 これは記述統計の基礎中の基礎だが、 「どの代表値を使うか」 で結論が変わる場面が実務に多い。
都道府県人口は典型的な右に歪んだ分布。 平均は東京・神奈川・大阪に引っ張られて大きく、 中央値はほぼ無影響。 SSDSE-B-2026 の 2023 年・47 都道府県の総人口(A1101)では、 「平均人口 264.6 万人」 と聞くと「都道府県の典型」 のように思えるが、 中央値は 154.9 万人で、 47 都道府県のうち 24 県が中央値以下。

→ 右に歪んだ分布では平均 > 中央値。 SSDSE-B の 2023 年人口データでは「平均 264.6 万人」 ではなく「中央値 154.9 万人」 と報告すべき場面が多い。 「典型」 を語るなら中央値、 「総量」 を語るなら平均、 という使い分けが基本。
正規分布では平均 = 中央値 = 最頻値が一致する。 SSDSE-B-2026 の「平均寿命」 がこれに近い。 男女別平均寿命の分布は 47 都道府県でほぼ対称、 平均 ≒ 中央値 ≒ 84.2 歳。 こうした「対称分布」 では代表値の選択に悩まない。

→ 正規分布なら平均で十分。 ただし「正規分布に見える」 だけで実は歪んでいる場合があるので、 必ずヒストグラムで分布形状を確認するのが鉄則。
サンプル平均の挙動を理解するには大数の法則 (LLN) と中心極限定理 (CLT) が不可欠。 SSDSE-B から無作為抽出した小さな標本でも、 標本サイズを大きくすれば母平均に収束し、 分布は正規分布に近づく。 代表値の信頼性を測る土台。

→ n=10 では標本平均がばらつくが、 n=100 では母平均近傍に集中、 n=1000 ではほぼ点に収束。 「平均値の信頼性」 はサンプルサイズに依存する。 SSDSE-B のような全数調査では問題ないが、 標本調査なら CLT を意識して標準誤差を併記すべき。
3 つの代表値の式:
$$ \bar{x} = \frac{1}{n}\sum_{i=1}^n x_i,\quad \tilde{x} = x_{(\lceil n/2 \rceil)},\quad \text{Mode} = \arg\max_x f(x) $$
右に歪んだ分布では Mode < Median < Mean、 左に歪んだ分布ではこの逆。 この順序を覚えておくと、 平均と中央値の差から分布の歪みを推定できる。
| 代表値 | 外れ値耐性 | 尺度水準 | 数学的扱い | 適する分布 | SSDSE 例 |
|---|---|---|---|---|---|
| 算術平均 | 弱い | 間隔・比率 | ○ 微分可 | 正規分布 | 平均寿命 |
| 中央値 | 強い | 順序以上 | △ 微分不可 | 歪み分布 | 延べ宿泊者数 |
| 最頻値 | 中程度 | 名義以上 | × 不連続 | 多峰分布 | 産業別カテゴリ |
| 幾何平均 | 中程度 | 比率 (正値) | ○ 対数で微分可 | 対数正規 | 人口成長率 |
| 調和平均 | 中程度 | 比率 (正値) | △ 0 で発散 | 速度・密度 | F 値 (適合率調和) |
| トリム平均 | 強い | 間隔・比率 | ○ | 外れ値多い分布 | 給与中央 80% |
→ 分布が対称なら平均、 歪んでいるなら中央値、 カテゴリカルなら最頻値、 比率なら幾何/調和平均。 SSDSE-B の各指標に対して「どの代表値が適切か」 を分布形状から判断するのが基本姿勢。
このコードでやること: SSDSE-B-2026 の主要 4 指標 (総人口 A1101、 延べ宿泊者数 G7101、 合計特殊出生率 A4103、 消費支出 L3221) について、 算術平均・中央値・最頻値・幾何平均を一括計算し、 分布形状による差を可視化する。 総人口と延べ宿泊者数は右に強く歪み、 合計特殊出生率と消費支出はほぼ対称、 という対比が要点。
📥 入力データ (SSDSE-B-2026 抜粋、 2023 年):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import pandas as pd from scipy import stats df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df.rename(columns={df.columns[0]: 'Year'}) df = df[df['Year'] == 2023] # 最新年の 47 都道府県 # 主要 4 指標 (実在列): A1101 総人口 / G7101 延べ宿泊者数 # A4103 合計特殊出生率 / L3221 消費支出 cols = ['A1101', 'G7101', 'A4103', 'L3221'] result = pd.DataFrame({ '平均': df[cols].mean().round(1), '中央値': df[cols].median().round(1), '最頻値': df[cols].mode().iloc[0].round(1), '幾何平均': df[cols].apply(lambda x: stats.gmean(x)).round(1), }) result['歪み比 (平均/中央値)'] = (result['平均'] / result['中央値']).round(3) print(result) |
📤 実行例 (実際の出力):
💬 総人口 (A1101) の歪み比 1.71、 延べ宿泊者数 (G7101) は 1.82 — どちらも右に大きく歪んでいる (東京・大阪が引っ張る)。 合計特殊出生率 (A4103) は 1.00 でほぼ対称、 消費支出 (L3221、 二人以上の世帯) も 0.98 でほぼ対称。 「対称な指標なら平均、 延べ宿泊者数のように歪んだ量なら中央値」 がデータ駆動の結論。
→ 5 問のうち 4 問以上正解できれば代表値の選択は適切にできる。 特に問 2 の大小関係は分布の歪みを瞬時に判定する道具。
代表値をマスターしたら次は: 平均 / 中央値 / 最頻値 / 分散 / 標準偏差 / 四分位数 / 箱ひげ図 / ヒストグラム / 正規分布 / 分布 へ。
統計学では「頑健性 (robustness)」 が代表値の重要な性質。 算術平均は 1 つの外れ値で大きくズレるため「破壊点 0%」 (どんなに小さな汚染にも弱い)。 一方、 中央値は データの半分以上が同じ場所にある限り変化しないため「破壊点 50%」 (極めて頑健)。 トリム平均 (両端 α% を捨てる) は破壊点 α%。 SSDSE-B-2026 のような実データでは、 外れ値が必然的に混入するため、 頑健代表値の併用が望ましい。
実務での選択指針: (1) 「典型を語る」 なら中央値、 (2) 「総量との関係を語る」 なら平均、 (3) 「最も多いカテゴリを語る」 なら最頻値、 (4) 「成長率を語る」 なら幾何平均、 (5) 「速度や効率を語る」 なら調和平均。 SSDSE-B の各指標について、 この 5 つの問いに答えてから代表値を選ぶ。 「とりあえず平均」 は素人の選択。
プロフェッショナルな統計報告では、 代表値を 1 つだけ報告するのは禁物。 必ず「平均 + 中央値 + (分散 or IQR)」 のセットで報告する。 これは ICMJE (国際医学雑誌編集者委員会) の医学論文ガイドラインや、 OECD の経済統計報告基準でも明示されている標準。 SSDSE-B を扱う政策立案でも、 この三点セットを最低限提示すべきである。
算術平均は古代から知られた概念だが、 「最小二乗の意味で最適」 という現代的解釈は Gauss (1809) と Legendre (1805) による。 中央値は Fechner (1878) が体系化、 最頻値は Pearson (1895) が「mode」 と命名。 これら 3 つは独立に発展したが、 19 世紀末にようやく「代表値」 として統一概念になった。
統計学者 Tukey は「平均と中央値のどちらを使うか」 という議論に対して「両方使え。 違いがあれば、 それ自体が有用な情報」 と述べた。 平均と中央値の差は「分布の歪み」 を測る最も簡単な指標であり、 SSDSE-B-2026 の各指標について平均/中央値の比を計算することで、 47 都道府県データの分布構造が一望できる。 この観点こそが、 代表値を「データを要約する手段」 から 「データを理解する手段」 へと昇華させる鍵である。
SSDSE-B-2026 の代表的な 5 指標について、 どの代表値を使うべきかを実値で議論する。
これらの判断は「データの形を見てから決める」 ことが肝心。 「とりあえず平均」 では、 政策議論で「庶民感覚との乖離」 を生む。 SSDSE-B-2026 を使った教育では、 学生に「平均と中央値の差から何が読み取れるか」 を考えさせることが、 統計リテラシーの第一歩。
統計レポートや論文で代表値を扱うときの確認項目。
→ このチェックリストの 8 項目すべてに「はい」 と答えられれば、 統計報告のプロ水準。 SSDSE-B-2026 を扱う論文・レポートでも、 ここまで意識すれば査読者から「代表値の選択が不適切」 という指摘を受けることはない。
Q1: 「平均値」 と聞いたら算術平均でいい?
通常は算術平均を指すが、 分野によって違う。 金融の「平均リターン」 は幾何平均、 物理の「平均速度」 は調和平均、 統計学の「期待値」 は確率重み付き算術平均。 文脈を必ず確認。 SSDSE-B-2026 の「平均寿命」 は算術平均だが、 「平均成長率」 を計算するなら幾何平均が正確である。 文脈を読む力こそが、 真の統計家の素養と言える。
Q2: 中央値の方が常に外れ値に強いの?
概ね正しい (破壊点 50% vs 0%)。 ただし「外れ値が両側に対称」 ならば算術平均も中央値も影響を受けない。 「外れ値が片側に集中」 する場合 (典型: 所得) で中央値の優位性が顕著。 SSDSE-B の総人口・延べ宿泊者数のような右に歪むデータでは中央値必須。 ただし中央値だけでは情報損失も大きいので、 必ず平均と併記するのが推奨される報告形式である。
Q3: 最頻値はいつ使う?
カテゴリカルデータ (名義尺度) では唯一使える代表値である。 例: 都道府県別の「最も多い世帯構成タイプ」、 「最も人気の業種カテゴリ」。 連続データでは KDE のピーク (モード推定) を使う。 多峰分布 (2 つ以上のピーク) では、 1 つの最頻値で代表させると本質を失う。 例えば「年収分布」 が双峰 (低所得層と高所得層) になっている場合、 最頻値を 1 つ報告するだけでは、 社会構造を正しく伝えられない。 多峰分布は別途、 各ピークを明示する必要がある。
Q4: 平均と中央値の差をどう解釈する?
平均 > 中央値 という関係が見られたら、 右に歪む分布 (高額・大規模が引っ張る、 所得・人口・売上) を疑う。 平均 < 中央値 → 左に歪む (低額・小規模が引っ張る、 寿命・温度の下限境界)。 平均 ≒ 中央値 → 対称分布。 比 (平均/中央値) を歪み指標として使うと、 1.0 で対称、 1.5 以上で「強く歪み」 と評価できる。 SSDSE-B の人口データの平均/中央値 ≈ 1.6 はまさにこの「強く歪み」 ゾーンに入っている。
Q5: 代表値を学ぶ最良の入門書は何でしょうか?
日本語なら『統計学入門』 (東京大学教養学部統計学教室) の第 2 章が体系的で分かりやすく入門に最適である。 『データ視覚化のデザイン』 (永田ゆかり) は代表値の選び方を実例で学べる定番書である。 英語なら『The Visual Display of Quantitative Information』 (Tufte) が古典中の古典。 数学的に深掘りしたいなら『Robust Statistics』 (Huber) で破壊点・影響関数を学べる。 オンラインなら Khan Academy の Statistics & Probability コースが分かりやすく、 無料で学べる。 日本語訳 (Khan Academy 日本語版) もあり、 アクセシブル。 さらに、 統計検定 2 級・準 1 級の公式テキストも、 代表値を体系的に学ぶ良い教材である。 試験勉強の副産物として、 統計の基礎が固まる、 という一石二鳥の効果がある。 これらの学習資源を組み合わせて、 自分のペースで代表値の理解を深めていくことをお勧めしたい。
代表値全体を一本の糸で貫くと、 次の 3 つの原則に集約される。
これらを意識して代表値を扱えば、 単なる「数値の平均化」 ではなく「データの本質を抽出する技術」 として機能する。 SSDSE-B-2026 を扱うすべての分析者にとって、 代表値の選択は最初の関門であり、 ここを正しく通れば、 その後の統計分析全体が安定する。 代表値は統計学のすべての基礎であり、 これを深く理解することは、 統計リテラシーそのものを高めることに直結する。
SSDSE-B-2026 の主要 5 指標について、 4 つの代表値 (平均、 中央値、 最頻値、 幾何平均) の数値と、 それぞれの選択理由を詳細に検討する。
指標 1: 総人口。 47 都道府県の平均 265 万人、 中央値 155 万人、 最頻値は連続変数なので KDE ピークから 130 万人付近、 幾何平均 183 万人。 「日本の典型的な都道府県は人口 155 万人前後」 と語るなら中央値、 「日本全体の人口は 265 × 47 ≈ 1.24 億人」 と語るなら算術平均が正しい。 47 都道府県を一様にサンプルしたときの平均値の期待値は算術平均と一致するため、 「無作為に 1 県選んだら、 何人住んでいると期待されるか」 という問いには平均が答え。
指標 2: 延べ宿泊者数。 平均 1064 万人泊、 中央値 585 万人泊、 平均/中央値 = 1.82。 これは「右に強く歪んだ分布」 の典型例。 東京 (8027 万人泊)、 大阪 (4401 万人泊)、 北海道 (3278 万人泊)、 京都 (2646 万人泊) が引っ張る。 「典型的な都道府県の宿泊需要」 を語るなら中央値 585 万人泊。 これは最少の徳島 (170 万人泊) の約 3.4 倍、 鳥取 (188 万人泊) の約 3.1 倍、 という比較ができる。
指標 3: 平均寿命 (男女平均)。 平均 84.2 歳、 中央値 84.3 歳、 ほぼ一致。 これは「対称分布」 の典型例。 47 都道府県は概ね 82-86 歳の範囲に収まり、 外れ値は少ない。 「平均寿命は 84 歳前後」 という単純な要約が許される稀なケース。
指標 4: 高齢化率。 平均 29.8%、 中央値 30.2%、 ほぼ対称だがやや左に裾。 秋田 (37.5%)、 高知 (35.7%) が右に外れ、 沖縄 (22.4%)、 東京 (23.3%) が左に外れる。 全体としては中央値 30% が典型と言ってよい。
指標 5: 1 人あたり所得 (県民所得÷人口)。 平均 304 万円、 中央値 287 万円、 やや右に歪み。 東京 (435 万円)、 愛知 (375 万円) が引っ張る。 5% 程度の乖離なので、 文脈次第。 「都道府県格差」 を強調するなら中央値で、 「日本全体の平均」 なら算術平均で。
これら 5 指標を一覧すると、 「対称か歪みか」 「歪みの程度」 によって代表値の選び方が決まることが分かる。 ヒストグラムで分布形状を確認することが、 すべての出発点である。 SSDSE-B-2026 を扱う初学者は、 まずこの 5 指標についてヒストグラムを描き、 代表値を計算するところから始めるとよい。 統計リテラシーの第一歩であり、 同時に最重要のステップである。
代表値の概念は、 「データの中心」 から「データの形」 へと拡張される。 中央値は分布の 50% 位置、 四分位数は 25%/75% 位置を表す。 さらに 一般化して「分位数 (quantile)」 という概念が定義される: $Q_p$ は分布のパーセンタイル $p$ に対応する値。 SSDSE-B の延べ宿泊者数で $Q_{0.95} \approx 3089$ 万人泊なら、 「47 都道府県のうち、 延べ宿泊者数 3089 万人泊以下が 95%」 という意味。
分位数は多変量データの分析でも重要。 分位数回帰 (Quantile Regression) は、 平均ではなく分位数を予測する手法。 「平均的にこうなる」 ではなく「上位 10% はこうなる、 下位 10% はこうなる」 を直接モデル化できる。 経済格差の研究や医療データ分析で使われる。
さらに、 信頼区間 (Confidence Interval) は「代表値の周辺の不確実性」 を表現する。 サンプル平均だけでなく「平均 ± 標準誤差」 として報告するのが現代統計の標準。 SSDSE-B-2026 は全数調査だが、 サンプリングデータを扱うときは必ず信頼区間を併記する習慣を身につけたい。
最後に、 「代表値だけでデータを語るのは限界がある」 という認識を持つことが大切である。 Anscombe's quartet (1973) は、 同じ平均・分散を持つが分布形状が全く異なる 4 つのデータセットを示した。 代表値は出発点であり、 終点ではない。 ヒストグラム・箱ひげ・散布図と組み合わせて、 データの全体像を捉えることが、 真の統計リテラシーである。
本記事のテーマである SSDSE-B-2026 を使った「統計データ解析コンペ」 では、 代表値の正しい選択と提示が予選通過の最低ラインとなる。 過去のコンペで頻出する代表値関連の出題傾向を整理する。
これらの問いに自信を持って答えられれば、 統計コンペの予選は通過できる。 さらに上を目指すなら、 信頼区間、 分位数回帰、 ロバスト推定、 多変量代表値 (重心、 メドイド) などへ学習を広げる。 本記事の内容を完全に理解した上で、 SSDSE-B-2026 を題材に手を動かす — これが代表値マスターへの確実な道である。 統計コンペで上位入賞する分析チームの共通点は、 「代表値を正しく選び、 分布全体を踏まえて議論する」 という基本姿勢を徹底していることである。 派手な手法を使う前に、 まず代表値を完璧にする。 これが優勝への王道である。 そして、 この王道を歩むための最良のテキストは、 本記事と SSDSE-B-2026 の実データそのものである。 手を動かし、 試行錯誤し、 自分の言葉で説明できるようになるまで、 繰り返し練習することをお勧めしたい。 代表値は統計学の入り口だが、 同時に統計学の終点でもある。 この入り口から終点まで貫く視点が、 統計家としての成熟度を決める。 ぜひ、 本記事を何度も読み返し、 SSDSE-B-2026 の各指標について自分なりの分析を組み立ててみてほしい。 きっと、 代表値を語ることで、 47 都道府県の姿が立体的に見えてくるはずである。 それが、 統計学の魅力であり、 データ分析の本質である。
記述統計の 3 本柱である 平均 (mean)・中央値 (median)・分散 (variance) に、 多様な整数の合成データ ($n=5$) を代入して計算過程を Step 1〜4 で展開する。 同じ計算を Python (numpy) で再現し、 結果が一致することを確認する。
$$ \bar x = \frac{1}{n}\sum_{i=1}^{n} x_i, \quad \text{median} = x_{((n+1)/2)}, \quad s^2 = \frac{1}{n-1}\sum_{i=1}^{n}(x_i - \bar x)^2 $$
$\bar x$ は標本平均、 median はソート済みの真ん中の値、 $s^2$ は不偏標本分散 ($n-1$ で割る形式)。
| i | $x_i$ |
|---|---|
| 1 | 4 |
| 2 | 7 |
| 3 | 2 |
| 4 | 8 |
| 5 | 5 |
| 項目 | 計算 | 結果 |
|---|---|---|
| $\sum x_i$ | $4+7+2+8+5$ | 26 |
| $\bar x$ | $26/5$ | 5.2 |
| 項目 | 操作 | 結果 |
|---|---|---|
| ソート | [4,7,2,8,5] を昇順 | [2, 4, 5, 7, 8] |
| 真ん中 ($n=5$ なら 3 番目) | $x_{(3)}$ | 5 |
| $i$ | $x_i$ | $x_i - \bar x$ | $(x_i - \bar x)^2$ |
|---|---|---|---|
| 1 | 4 | $-1.2$ | 1.44 |
| 2 | 7 | $1.8$ | 3.24 |
| 3 | 2 | $-3.2$ | 10.24 |
| 4 | 8 | $2.8$ | 7.84 |
| 5 | 5 | $-0.2$ | 0.04 |
| 合計 | 26 | 0.0 | 22.8 |
| $s^2 = 22.8 / (5-1)$ | 5.7 | ||
1 2 3 4 5 6 7 8 9 10 11 | import numpy as np x = np.array([4, 7, 2, 8, 5]) mean = x.mean() median = np.median(x) var = x.var(ddof=1) # ddof=1 で不偏分散 (n-1 で割る) print(f"mean = {mean}") print(f"median = {median}") print(f"var = {var}") |
💬 手計算 Step 2-4 (平均 5.2, 中央値 5, 不偏分散 5.7) と Python (`ddof=1`) の出力が完全一致。 平均 5.2 と中央値 5.0 がほぼ等しいので、 このデータは大きな歪みを持たない。 仮に $x_5$ を 5 から 500 に置換すると平均は 104 に跳ね上がるが中央値は 7 に留まり、 中央値の頑健性が確認できる。
合成データ [2,4,7,5,3,7,9] で 3 種類の代表値を計算する。
1 2 3 4 5 6 | import numpy as np from scipy import stats x = np.array([2, 4, 7, 5, 3, 7, 9]) print(f"平均: {x.mean():.3f}") print(f"中央値: {np.median(x)}") print(f"最頻値: {stats.mode(x, keepdims=True).mode[0]}") |
💬 手計算 (Step 2-4) と Python 出力が完全一致。 平均 < 中央値 < 最頻値 で右に長い分布。
1 2 3 4 5 | import numpy as np, pandas as pd df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1) x = df['食料費(二人以上の世帯)'] print(x.mean(), x.median(), x.mode().iloc[0]) print(np.mean(x), np.median(x)) |
1 2 3 4 5 | from scipy import stats print(stats.mode(x, keepdims=False)) # 最頻値 print(stats.gmean(x)) # 幾何平均 print(stats.hmean(x)) # 調和平均 print(stats.trim_mean(x, proportiontocut=0.1)) # 10% トリム平均 |
1 2 3 4 | import statistics as st print(st.mean(x), st.median(x), st.mode(x)) print(st.fmean(x)) # float 高速版(Python 3.8+) print(st.geometric_mean(x)) |
1 2 3 4 5 6 | weights = df['総人口'] weighted = np.average(x, weights=weights) print('人口加重平均 =', weighted) # 時系列の移動平均 ma = x.rolling(window=5, center=True).mean() |
1 2 3 4 | from scipy.stats import bootstrap rng = np.random.default_rng(42) res = bootstrap((x,), np.median, n_resamples=5000, random_state=rng) print('中央値の 95% CI:', res.confidence_interval) |
1. 外れ値の影響を無視して平均だけ報告する。所得や売上は右に裾が長い(log-normal 系)。 平均と中央値が 1.3〜1.5 倍も乖離することがあります。 「平均年収 600 万」と「中央値年収 440 万」では市場像が全く異なるため、 両方併記するのが鉄則です。
2. 名義尺度に平均を計算してしまう。血液型・職業区分・色などのカテゴリは順序を持たないため、 平均は意味を持ちません(最頻値のみ可)。 ラベルを 0,1,2 に数値化したからといって平均値を出すと、 数学的には計算できても解釈不能な数字になります。
3. 加重平均と単純平均を混同する。「全国平均」と称して 47 都道府県の単純平均を取ると、 人口の少ない島嶼県と東京都が等しい重みになり、 全国民の平均像から大きくずれます。 人口加重平均(np.average(x, weights=人口))を使う場面を見極めましょう。
4. 幾何平均が必要な場面で算術平均を使う。年率成長率の合成、 価格指数(GDP デフレータ)、 比率の平均には幾何平均が正解です。 「年率 +20%・−10%」の平均は (1.2 × 0.9)^0.5 − 1 = +3.9%(算術平均 +5% は誤り)。
5. 多峰分布(multimodal)で代表値を 1 個だけ報告する。2 つのサブ集団が混在しているデータ(男女の身長、 都市/地方の所得)では、 平均も中央値もどちらの集団も代表しません。 ヒストグラム・KDE で多峰性を確認し、 必要なら層別に分けて報告しましょう。
6. 「中央値だから外れ値に強い」を過信する。中央値は確かに頑健ですが、 N が小さい(< 10)と少数の値の入れ替えで大きく動きます。 ブートストラップ CI で中央値の不確実性を可視化することが重要です。
7. 移動平均で「未来からのリーク」を作る。時系列の rolling(window=5, center=True).mean() は対称窓なので、 t 時点の値が「t+2 時点のデータ」を含みます。 予測モデルの特徴量に使うと未来情報が漏れて致命的なので、 必ず center=False(過去のみ)を使いましょう。
「代表値(平均・中央値・最頻値)」を中心に、 尺度水準・分散/標準偏差・分位点・ヒストグラム可視化・ロバスト統計を 6 方向で配置した俯瞰図。 平均と中央値が乖離する変数で「どの代表値が適切か」を判断する地図として使う。
上の概念マップでは「代表値 (mean/median/mode)」を中心に、 ばらつき指標 (分散・標準偏差)、 分布の可視化 (ヒストグラム・箱ひげ図)、 推定 (信頼区間・CLT)、 派生 (トリム平均・幾何平均) との関係を示している。 代表値はこれら隣接概念とセットで運用されることを念頭に置きたい。
とくに対比軸として重要なのは「ばらつき」で、 平均だけ報告して標準偏差を書かないのは N、 µ だけ書いて σ を伏せる姿勢である。 SSDSE-B-2026 で平均値と中央値が乖離する変数 (例: 食料費・住居費) は必ず分布の可視化とセットで議論する。
「代表値」は分布を 1 点で要約するため、 ばらつき指標と分布可視化を併走させて初めて意味を持つ。 偏った分布で平均だけ報告するのは値そのものと同じく解釈を歪める。
上流の外れ値処理で代表値の頑健性を確保し、 並列のばらつき指標と組で報告し、 下流の可視化で分布の形を補えば、 「平均が高い県」と「中央値が高い県」の食い違いを SSDSE-B-2026 上で正しく読み解ける。
分布が左右対称(正規分布など)なら、 3つの代表値はほぼ一致します。 しかし右に裾を引く分布(所得、 株価、 都市人口)では3つがバラバラになり、 「最頻値 < 中央値 < 平均」の順に右にずれます。
| 分布の形 | 代表値の並び | 実例 |
|---|---|---|
| 左右対称 | 平均 ≒ 中央値 ≒ 最頻値 | 身長、 IQ、 体重 |
| 右に裾 | 最頻値 < 中央値 < 平均 | 所得、 株価、 都市人口 |
| 左に裾 | 平均 < 中央値 < 最頻値 | テスト点数(簡単な問題) |
ピアソンの経験式:歪んだ単峰分布で次がほぼ成立 — $\text{Mean} - \text{Mode} \approx 3(\text{Mean} - \text{Median})$。
| 比較項目 | 平均 | 中央値 | 最頻値 |
|---|---|---|---|
| 最小化する損失 | L2 (二乗) | L1 (絶対値) | 0-1 (一致) |
| 外れ値耐性 | ❌ 弱い | ✅ 強い (50%) | ⭕ 中 |
| 情報量 | 全部 | 順位のみ | 頻度のみ |
| 名義尺度で使える? | ❌ | ❌ | ✅ |
| 順序尺度で使える? | ⚠️ 注意 | ✅ | ✅ |
| 微分可能 | ✅ | ❌ | ❌ |
| 線形性 | ✅ | ❌ | ❌ |
💡 報告では3つを併記するのが最も誠実。 「平均500万円、 中央値450万円、 最頻値380万円」と書けば、 読者は分布の歪みを把握できます。
SimpleImputer(strategy='mean')/'median'/'most_frequent'。 連続値で外れ値あれば median、 カテゴリは most_frequent。DummyClassifier(strategy='most_frequent')。 最頻クラスを常に予測する単純モデル。 他モデルが超えるべき下限。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.impute import SimpleImputer from sklearn.preprocessing import RobustScaler from sklearn.dummy import DummyClassifier # ── この抜粋だけで動くように、学習用と検証用のデータを作る ── _d = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) _d = _d[_d['SSDSE-B-2026'] == 2023] X = _d[['A4101', 'A1303', 'L3221']].astype(float).values y = (_d['A1101'] > _d['A1101'].median()).astype(int).values X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.3, random_state=0, stratify=y) # 欠損値補完 imp_mean = SimpleImputer(strategy='mean') # 連続値、 外れ値少 imp_median = SimpleImputer(strategy='median') # 連続値、 外れ値多 imp_mode = SimpleImputer(strategy='most_frequent') # カテゴリ # ロバストスケーリング(中央値と IQR ベース) scaler = RobustScaler() X_scaled = scaler.fit_transform(X) # 最頻クラスのダミー分類器(ベースライン) dummy = DummyClassifier(strategy='most_frequent') dummy.fit(X_train, y_train) print(dummy.score(X_test, y_test)) # 機械学習モデルが超えるべき下限 |
解答:
9000という外れ値が平均を歪めているので、 中央値の425万円を「典型的な値」として報告すべき。 平均だけ示すと誤解を招く。
解答:平均 = 中央値 = 3。 このように左右対称な分布(または等差数列)では平均と中央値が一致する。 一般に、 データが中央値を軸として対称に分布していれば両者は一致する。
解答:「2つの異なる集団が混在している」可能性。 例えば、 平日と週末、 セール期間と通常期間、 オンラインと店舗、 新製品と旧製品。 別変数で層別すると2つの単峰分布に分解できることが多い。
解答:算術平均では (+50% − 50%)/2 = 0%(「変わらない」と誤判定)。 幾何平均では $\sqrt{1.5 \times 0.5} \approx 0.866$ → 年率 -13.4%。 実際 100万円が 1年目で 150万円、 2年目で 75万円になっているので幾何平均が正しい。 成長率・複利・収益率の平均には常に幾何平均を使う。
1 2 3 4 5 6 7 8 9 10 11 12 | import pandas as pd import numpy as np df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932') # 2行目以降がデータ、 食料費は L322101 列 food = pd.to_numeric(df['L322101'].iloc[1:], errors='coerce').dropna() / 1000 print('平均:', food.mean()) # ≈ 80.60 print('中央値:', food.median()) # ≈ 79.94 counts, edges = np.histogram(food, bins=8) mid = (edges[np.argmax(counts)] + edges[np.argmax(counts)+1]) / 2 print('最頻階級中点:', mid) # ≈ 76.1 |
結果は 平均 ≈ 80.60、 中央値 ≈ 79.94、 最頻階級中点 ≈ 76.1。 平均 > 中央値 > 最頻値 の順なので右にやや裾を引いた分布。 これは食料費の高い都市県(東京、 神奈川など)が分布の右端を伸ばしているため。
解答:算術平均では 45 km/h だが、 これは誤り。 距離が同じでかかった時間が違う(行き $d/60$、 帰り $d/30$)ので、 平均速度 = 全距離/全時間 = $2d / (d/60 + d/30) = 2/(1/60+1/30) = 40$ km/h。 これは調和平均。
解答:
SimpleImputer(strategy='median')。代表値の解釈・使い方で初学者がつまずきやすいポイントを、 誤解 → 正しい理解の形でまとめます。 自分の分析を点検するチェックリストとして活用してください。
| ❌ よくある誤解 | ✅ 正しい理解 |
|---|---|
| 平均は「典型的な値」 | 対称分布のときだけ。 歪んだ分布では中央値の方が「典型」を表す |
| 外れ値は機械的に除外してよい | ドメイン知識で判断。 真のデータかノイズかを切り分ける |
| 最頻値は1つに決まる | 複数あり得る(二峰性)。 「2つの集団が混在」のサインかも |
| 幾何平均と算術平均は同じ | 成長率・複利には幾何平均。 算術平均では誤った結論に |
| 中央値は順位だから外れ値を完全に無視する | 中央値は「位置」を保証するが、 外れ値の存在自体は箱ひげ図等で別途確認すべき |
| カテゴリ変数に平均を計算してよい | 不可。 名義尺度では最頻値のみ意味を持つ |
| 3人のテスト点数の代表値も意味がある | n が小さいと代表値は不安定。 n ≥ 30 が CLT の目安 |
| 「全国平均」は単純平均でよい | 人口の違う地域を等重みで扱うのは誤り。 人口加重平均が正解 |
| 最頻階級の中点を「最頻値」とすればOK | ビン幅で値が変わる。 KDE で滑らかに推定するのが現代流 |
| 平均が一致すれば分布も同じ | 違う。 ばらつき(分散)と形(歪度・尖度)も見るべき。 アンスコムの四重奏が好例 |
💡 セルフチェック:分析を始める前に「ヒストグラムを描いたか?」「3つの代表値を計算したか?」「外れ値を確認したか?」「サンプルサイズは十分か?」を必ず確認しましょう。
分析結果を報告するときの、 現代的・誠実なフォーマットです。 単に「平均は◯」だけでなく、 分布の文脈ごと示すのがプロの作法。
「47都道府県の家計食料費(2023年・ SSDSE-B-2026)の中央値は約 80.0 千円/月、 四分位範囲は約 4.0 千円。 分布は右にやや裾を引いており、 平均(80.6 千円)が中央値より高い。 最頻階級は 78.0〜80.0 千円。 (n = 47)」
| 項目 | 記述例 | 必須度 |
|---|---|---|
| 中央値(または平均) | $\tilde{x}$ = 437 万円 | ★★★ |
| サンプルサイズ | n = 5,000 | ★★★ |
| ばらつき(IQR/SD) | IQR = [325, 612] / SD = 280 | ★★★ |
| 分布の形 | 右裾を引く(歪度 +2.3) | ★★ |
| 3つの代表値の併記 | 平均 552、 中央値 437、 最頻 380 | ★★ |
| 外れ値の有無 | 上位3件が IQR×1.5 を超えた | ★★ |
| 出典・データ年月 | SSDSE-B-2026、 2023年 | ★★★ |
「平均所得は552万円でした。」
問題点:分布の形、 サンプルサイズ、 ばらつき、 中央値が不明。 「552」が代表値として適切かも判断できない。
「世帯所得は右に裾を引く分布で、 中央値は437万円(IQR: 280–680)。 平均は552万円と中央値より高く、 高所得世帯が分布の上端を伸ばしている影響を示唆。 (n=4,500、 厚労省2023)」
改善点:分布の形・中央値・IQR・平均との比較・サンプル・出典がすべて含まれる。
「代表値(平均・中央値・最頻値)」を扱う際の手法選択は、 状況に応じて以下のフローで判断すると迷いが減る。
このフローに沿って判断することで、 「代表値(平均・中央値・最頻値)」を中核とした適切な手法選択ができる。
ここまでは「分布を見てから代表値を選ぶ」という順番で学んできました。 この節では視点を反転させます。 3つの代表値の答えが割れること自体を、 分布を診断する道具として使うのです。 姉妹ページ(平均・中央値・最頻値)が各指標を個別に深掘りするのに対し、 ここでは「三者のずれ」という関係そのものに注目します。
SSDSE-B-2026 の 保育所等利用待機児童数(2023年・47都道府県)で3つの代表値を実際に計算すると、 答えは劇的に割れます:
もし3つが一致していれば分布はほぼ対称。 これほど割れるのは、 ゼロに山があり右に長い裾を引く分布だという動かぬ証拠です。 ヒストグラムを描く前から、 3つの数字だけで分布の形が「透けて見える」。 同じ2023年データで総人口は平均 2,645,809 人に対し中央値 1,549,000 人(約1.7倍の乖離)、 逆に保健医療費(二人以上の世帯)は平均 14,423 円と中央値 14,503 円がほぼ一致します。 乖離の大小が、 そのまま「歪みの計器」の針の振れになっているのです。
平均には 線形性 という強力な性質があります:$\overline{x+y} = \bar{x} + \bar{y}$(常に厳密に成立)。 ところが中央値にはこれが成り立ちません。 SSDSE-B-2026(2023年・47都道府県、 二人以上の世帯)の実測で確認すると:
ずれる理由は、 食料費の「真ん中の県」と住居費の「真ん中の県」が別の県だから。 項目別の中央値を積み上げて「典型的な家計像」を合成すると、 どの県にも存在しない架空のプロファイルができあがります。 同じ理屈で、 グループ別に計算した中央値から全体の中央値は復元できません(平均なら加重平均で厳密に復元可能)。 分散処理やグループ集計で中央値を扱うときは、 元データに戻って計算し直すのが原則です。 「外れ値に強いから中央値を使おう」と決めた瞬間に、 代わりにこの便利な足し算の権利を手放している——このトレードオフを意識できると一段深い使い手になれます。
平均と中央値はいくらでも乖離しうるように見えますが、 実は数学的な上限があります。 分散が有限なら、 どんな分布でも $$|\bar{x} - \tilde{x}| \le \sigma$$ が成り立ちます(証明は「中央値が L1 損失の最小化点であること」とイェンセンの不等式から数行で導けます)。 この比 $(\bar{x}-\tilde{x})/\sigma$ は ノンパラメトリック歪度と呼ばれ、 必ず $-1$ 〜 $+1$ に収まる、 単位に依存しない歪みの物差しです。 実際に SSDSE-B-2026(2023年)の全数値列でこの比を一括計算すると、 最大は待機児童数の 0.483。 100 本を超える実データの列すべてが、 理論上限 1 の内側にきちんと収まっていました。 数十列のデータを前に「どの列からヒストグラムを描くべきか」迷ったら、 この比の絶対値が大きい列から見るのが効率的なスクリーニングになります。 さらに現代の機械学習では、 データをブロックに分けて各ブロックの平均を取り、 その平均たちの中央値を採る median-of-means 推定量が、 平均の情報効率と中央値の頑健性を両取りする方法として理論・実務の両面で注目されています。
※ 本節の数値はすべて SSDSE-B-2026(2023年・47都道府県)から実際に計算した値です(待機児童数 J250502、 総人口 A1101、 食料費 L322101、 住居費 L322102、 保健医療費 L322106)。