論文一覧に戻る 📚 用語解説(ジャストインタイム型データサイエンス教育)
最頻値
Mode (Mo)
データの中で最も頻繁に現れる値。 代表値の1つだが、 連続データではビンの取り方で変わる。
記述統計Mo最頻mode

🔖 キーワード索引

「mode」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「mode」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。

mode統計分析SSDSE-B-2026前提条件適用範囲落とし穴関連手法Python 実装検証方法

これらのキーワードは「mode の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。

💡 30秒で分かる結論

🍰 まずはやさしく

一番人気の値のことです。

データのピークを知るために使います。

店で一番売れた商品を探すときなどです。

最頻値の定義と特徴について読みます。

👁️ 直感 — 最頻値は「ピークの位置」

ヒストグラムを描いたとき、 最も高いバーに対応する値が最頻値です。 47都道府県の家計食料費(2023年・ SSDSE-B-2026)を例に見ます。

2023 年度 47 都道府県の食料費(二人以上の世帯)の 8 階級ヒストグラム。74.4〜77.8 千円の階級が 11 都道府県で最も多く、オレンジ色で示し、その中点 76.1 千円と平均 80.6 千円に線を引く

範囲(71.1〜97.8 千円)を 8 等分した階級のうち、 オレンジ色の階級(74.4〜77.8千円)が11都道府県(茨城・群馬・福井・岐阜・和歌山・島根・山口・徳島・香川・佐賀・長崎)を含み、 最も多い → これが最頻階級で、 中点は 76.1 千円。 平均 80.6 千円は右の裾(最大 97.8 千円)に引っ張られて、 最頻階級より右にある。 連続データではビンの設定によって変わるので、 中点を取って「最頻階級の代表値」とする慣習があります。

💡 平均は「重心」、 中央値は「順位の真ん中」、 そして最頻値は「分布のピーク」。 同じデータに対する3つの代表値はそれぞれ違う側面を見ています。

📍 あなたが今見ているもの

🍰 まずはやさしく

データの中で最も多く出る値です。

代表的な数値として使います。

都道府県のデータを分析するときに役立ちます。

定義から実装までを順番に読みます。

論文中に 「最頻値」として登場する用語。

最頻値 とは:データの中で最も頻繁に現れる値。 平均・中央値と並ぶ代表値の1つ。

本ページでは「mode」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。

「mode」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。

🎨 直感で掴む — 最頻値 の本質

🍰 まずはやさしく

データの山の一番高いところです。

どんな値に集中しているか分かります。

スマホの利用時間の分布などで考えます。

道具としての使い方を直感的に読みます。

最頻値は「もっとも頻繁に現れる値」。 平均・中央値とは違って、 カテゴリーデータでも使える。 SSDSE-B-2026 の都道府県の合計特殊出生率(小数第 2 位まで)の最頻値は約 1.30 付近に集中。 一方、 ヒストグラムで山が 2 つ(東京圏:低い vs 九州・北陸:高い)あれば「双峰分布」で、 最頻値の解釈には注意が必要。

💡 ポイント:最頻値 を初めて学ぶときは「正確な定義」より「どんな問題を解くための道具か」を先に押さえてください。 数式は次の「📐 数式」セクションで丁寧に展開します。
📌 最頻値が直感的に感じづらいときは、 SSDSE-B-2026 の「都道府県人口」や「合計特殊出生率」を pandas で value_counts() してみてください。 順位 1 位の値(最頻値)と 2 位の差が小さいほど「ピークがブロード」、 差が大きいほど「ピークが鋭い」という解釈が体感できます。

📐 数式と読み方

🍰 まずはやさしく

確率が最大になる値のことです。

数式で正しく定義するために使います。

テストの点数の分布などで考えます。

数式や山の数による見分け方を読みます。

① 離散分布での最頻値

確率質量関数 p(x) について:

$$ \text{Mode} = \arg\max_{x} p(x) $$

読み方:「ピー オブ エックス を最大化する エックス」。 つまり「確率が最大になる値」。

② 連続分布での最頻値

確率密度関数 f(x) について:

$$ \text{Mode} = \arg\max_{x} f(x) $$

「密度関数のピーク(極大点)の位置」。 微分してゼロになる点(停留点)の中で最大値を取る点。

③ 代表値の3者関係(経験則)

歪んだ単峰分布で次の関係が成立することが多い(Pearson の経験式):

$$ \text{Mean} - \text{Mode} \approx 3 (\text{Mean} - \text{Median}) $$

これを使えば、 中央値と平均から最頻値を概算できます。

🔢 単峰性・ 二峰性 — 集団の混在を診断

最頻値の数(モード数)は、 データに何種類の集団が混ざっているかのヒント。

説明用の合成データ(各 1,000 点)で描いた単峰・二峰・一様の 3 つのヒストグラム。単峰の最頻値は約 48、二峰の峰は約 30 と約 70

上の図は説明用の合成データ(SSDSE-B-2026 ではない。 seed 0 の乱数で、 単峰 = 平均 50・標準偏差 10 の正規乱数、 二峰 = 平均 30 と 70 の正規乱数を 500 点ずつ、 一様 = 0〜100 の一様乱数、 各 1,000 点)。 ガウス KDE のピークは単峰で 47.8(真の山の位置 50 から標本のぶれでずれる)、 二峰で 30.4 と 69.7 の 2 か所に出る。

分布の形状

二峰性を見つけたら、 「何が2集団に分けているのか」を探りましょう。 別変数で層別すると因果のヒントが見えます。

📊 3つの代表値の位置関係 — 分布の歪みを診断

平均・ 中央値・ 最頻値の並び方から、 分布の歪み(skewness)が分かります。

2023 年度 47 都道府県の死亡率・総人口・高齢化率のヒストグラムと KDE に、平均・中央値・最頻値(KDE のピーク)の線を引いた 3 枚の図

図は SSDSE-B-2026 の 2023 年度 47 都道府県の実データ(最頻値はガウス KDE のピーク)。 ほぼ対称な死亡率(人口千人当たり、 歪度 −0.06)は平均 14.10・中央値 14.09・最頻値 14.16 がほぼ重なる。 右に歪む総人口(歪度 +2.22)は最頻値 139 万人 < 中央値 155 万人 < 平均 265 万人、 左に歪む高齢化率(歪度 −0.56)は平均 31.59% < 中央値 31.78% < 最頻値 32.75% と、 下の表の並びになる。

分布の形代表値の並び例
対称平均 = 中央値 = 最頻値身長、 IQ、 体重
右に歪み(正の歪度)最頻値 < 中央値 < 平均所得、 株価、 都市人口
左に歪み(負の歪度)平均 < 中央値 < 最頻値テスト点数(簡単な問題)

「平均が中央値より大きい」と気づいたら、 右に歪んだ分布 → 外れ値の影響を疑う、 が基本的な診断手順。

🎯 KDE(カーネル密度推定)で最頻値を推定

連続データでは、 ヒストグラムのビン幅で最頻値が変わってしまう問題があります。 そこでKDE(kernel density estimation)で滑らかに密度を推定し、 そのピークを最頻値とします。

2023 年度 47 都道府県の食料費の密度ヒストグラムにガウス KDE の曲線を重ね、KDE のピーク 76.5 千円に破線を引いた図

図は上の食料費(2023 年度 47 都道府県)に scipy の gaussian_kde(既定のバンド幅)を当てたもの。 KDE のピークは 76.5 千円で、 ヒストグラムの最頻階級の中点 76.1 千円とほぼ同じ位置に来るが、 こちらはビンの境界の取り方に左右されない。 85 千円付近にも小さな肩がある。

KDE の数式

$$ \hat{f}(x) = \frac{1}{n h} \sum_{i=1}^{n} K\left(\frac{x - x_i}{h}\right) $$

各データ点を中心とした小さな山(カーネル)を足し合わせて、 滑らかな密度関数を作る方法。 ヒストグラムを連続化したような図になります。

Python での KDE

🎯 目的:離散値の最頻値とは別に、連続値で KDE(カーネル密度推定)のピーク位置を「最頻値」として推定する手法を紹介。
📥 入力:x(連続値の 1 次元配列、例:SSDSE-B-2026 の食料費 L322101)。scipy.stats.gaussian_kde を使用。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# ── この抜粋で使うデータを用意します ──
import numpy as np
import pandas as pd
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]        # 2023 年の 47 都道府県

data = df['L322101'].dropna().values / 1e3   # 食料費(千円)
kde = stats.gaussian_kde(data)

# 細かいグリッドで密度を計算
xx = np.linspace(data.min(), data.max(), 1000)
density = kde(xx)

# 最頻値 = 密度がピークの位置
mode_estimate = xx[np.argmax(density)]
print(f'KDE最頻値: {mode_estimate:.2f}')
📤 出力 KDE最頻値: 76.48
💬 解説:2023 年 47 都道府県の食料費は 1 か月あたり 71.1〜97.8 千円に散らばり、KDE の山の頂点は 76.48 千円。平均 80.60 千円・中央値 79.94 千円より低い側にあるのは、分布が高い側に裾を引いているため。ヒストグラムは bin 幅に依存して「見かけの最頻値」が動くが、KDE ならバンド幅(既定は Scott 則)を決めれば 1 点に定まる。

📐 数式または定義 — 最頻値 の形式的表現

直感で輪郭が見えたら、 次節の厳密な定義に進んで「入力 → 出力の対応」を確認する。 SSDSE-B-2026 のような実データに当てはめながら読むと記憶に残りやすい。

【最頻値の定義(離散・連続)】
$$ \mathrm{Mode}(X) = \arg\max_k P(X=k) \quad (離散) \qquad \mathrm{Mode}(X) = \arg\max_x f(x) \quad (連続) $$
この数式は「最頻値 がどう計算されるか」を最短で示したもの。 記号の意味は次の「🔬 数式を言葉で読み解く」で 1 つずつ解説します。
📚 数式が苦手な方へ:1 つの長い式を一度に理解しようとせず、 記号ごとに「言葉に翻訳」するのが王道。 紙に書き写してから、 自分の言葉で音読してみてください。

🔬 数式を言葉で読み解く — 最頻値 の記号辞書

上の数式に出てくる各記号が何を表すかを、 言葉で翻訳します。 1 つずつ自分の言葉で言い換えられるようになると、 論文や教科書のスピードが一気に上がります。

記号意味(言葉での説明)
$P(X=k)$離散の場合の確率質量
$f(x)$連続の場合の確率密度
単峰山が 1 つ
双峰山が 2 つ — 集団が混在しているシグナル
KDEカーネル密度推定で連続データの最頻値を求める
📌 読み下しのコツ:左から右に「主語 → 述語 → 目的語」と見立てて、 「これは何を、 どうしている式か?」と一文で要約してみてください。 慣れれば 5 秒で読めます。

🧮 計算ステップ — カテゴリと数値の両方

1️⃣ カテゴリデータの最頻値(最も簡単)

例:あるアンケートで「好きな果物」を集計:

果物回答数
リンゴ25
バナナ42
オレンジ18
ぶどう15

最頻値 = バナナ(最大頻度42)。 カテゴリ変数では最頻値が唯一意味のある代表値です(平均・中央値は計算できない)。

2️⃣ 離散数値データの最頻値

例:あるクラスの兄弟姉妹の数:

[0, 1, 1, 1, 2, 2, 3, 0, 1, 2, 1, 4]

頻度をカウント:

最頻値 = 1。 兄弟姉妹が1人いる人が最も多いという意味。

3️⃣ 連続データの最頻値(階級分け)

連続データではまったく同じ値が複数あることは稀。 そこで「階級(ビン)に分けて、 最も件数の多い階級の中点を最頻値とする」のが伝統的手法。

  1. データを階級(ビン)に分ける(ビン数は √n や Sturges, Scott, FD ルールなど)
  2. 各階級の頻度(件数)を数える
  3. 最も件数が多い階級が「最頻階級」
  4. 最頻階級の中点を最頻値とする(または下記の補正式)

4️⃣ 補正式(より精緻な推定)

King の公式:

$$ \text{Mode} \approx L + \frac{f_1 - f_0}{(f_1 - f_0) + (f_1 - f_2)} \cdot h $$

隣接階級の頻度比から、 階級内の「どこに山があるか」を推定します。

🧮 SSDSE-B 実値計算例:47都道府県データでの最頻値

SSDSE-B-2026 2023年データには都道府県別の家計支出が連続値として並んでいるので、 各値はほぼ一意で「最頻値」は単純には決まりません。 そこで、 連続値をビニングしてから最頻ビンを求めます。

📊 ステップ1:消費支出を 30 千円刻みでビニング

消費支出ビン(千円/月) 該当県数 代表的な県
220-2501愛媛
250-28012青森・秋田・福井 等
280-31024(最頻)北海道・岩手・宮城 等
310-3408山形・栃木・富山 等
340-3702埼玉・東京

最頻ビンは 280-310 千円(24県)。 「典型的な都道府県の消費支出水準」がここに集中。 中央値(約 301 千円)・平均(約 296 千円)・最頻ビン中点(295 千円)はいずれも近く、 ほぼ対称な単峰分布であることが分かります。

📊 ステップ2:KDE のピーク(連続的な最頻値)

ヒストグラムだとビン幅で答えが変わるので、 カーネル密度推定(KDE)でなめらかな密度関数を作り、 そのピーク位置を「最頻値」とする手法も標準的。 同じデータでバンド幅を変えると:

バンド幅の選択は探索的。 Silverman の経験則や CV による選択を組み合わせます。

📊 ステップ3:カテゴリ変数の最頻値

SSDSE で「主要産業」のようなカテゴリ列があれば、 value_counts() で最頻カテゴリが分かります。 47県のうち「製造業が最大の産業」「サービス業が最大」など。

🧮 実値で計算してみる — SSDSE-B-2026 で 最頻値 を体感

数式だけでは「分かった気になる」だけで終わりがち。 ここで SSDSE-B-2026(教育用標準データセット — 47 都道府県 × 100+ 指標、 2012-2023 年度)の実値を当てはめて、 最頻値 の挙動を電卓的に追体験します。

👉 計算例:SSDSE-B-2026 で 47 都道府県を「合計特殊出生率」で 0.05 刻みのビンに分けると、 最頻ビンは [1.30, 1.35) で 9 県(石川・山梨・長野・岐阜・和歌山・岡山・広島・愛媛・高知)。 一方で「総人口」は対数変換しないと最頻値が最小ビンに集中して情報量がない(左に集中、 右裾が長い)。

SSDSE-B-2026 は 統計センターの SSDSE 配布ページ から CSV を直接ダウンロードできます。 本サイトでは data/raw/SSDSE-B-2026.csv に配置している前提でコードを書いています。

🧮 数式に値を入れて手で計算する: 最頻値

合成データで単峰・双峰の最頻値を計算する。

Step 1: 単峰

x = [1, 2, 3, 3, 3, 4, 5] 3 が 3 回 → 最頻値 = 3

Step 2: 双峰

x = [1, 2, 2, 3, 4, 4, 5] 2 と 4 が 2 回 → 双峰 (multimodal)

Step 3: 連続データ (階級)

階級 0-10: 5 件 階級 10-20: 12 件 ← 最頻階級 階級 20-30: 8 件 最頻階級の代表値 = 15 (中心)

🐍 Python で再現

1
2
3
4
5
6
import numpy as np
from scipy import stats
x1 = np.array([1, 2, 3, 3, 3, 4, 5])
x2 = np.array([1, 2, 2, 3, 4, 4, 5])
print(f"単峰 mode: {stats.mode(x1, keepdims=True).mode[0]}")
print(f"双峰 (scipy は最小返す): {stats.mode(x2, keepdims=True).mode[0]}")

📤 実行結果

単峰 mode: 3 双峰 (scipy は最小返す): 2

💬 手計算 (Step 1) 3 と Python 出力が完全一致。

🐍 Python での計算

scipy.stats — 基本の最頻値

🎯 目的:離散データに対し scipy.stats.mode で最頻値を 1 行で取得する最も基本的な使い方。
📥 入力:arr(カテゴリまたは数値の 1 次元配列)、keepdims 引数。
1
2
3
4
5
6
7
8
from scipy import stats

# 整数データ
arr = [1, 2, 2, 3, 3, 3, 4, 5]
result = stats.mode(arr, keepdims=False)
print(f'最頻値: {result.mode}, 頻度: {result.count}')  # 3, 3

# 連続データ → 階級分けが必要
📤 出力 最頻値: 3, 頻度: 3
💬 解説:8 個の整数のうち 3 が 3 回現れるので、最頻値 3・頻度 3 となりコメントどおり。keepdims=False にするとスカラーで返るので、そのまま f 文字列に入れられる。同率 1 位が複数あると最小の値だけが返る点に注意。

pandas — value_counts で頻度

🎯 目的:Series の値別出現回数を頻度順に取得し、最頻値とその件数を同時に把握する pandas の定番パターン。
📥 入力:df['category'](カテゴリ列)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# ── この抜粋で使うデータを用意します(架空)──
# SSDSE-B-2026 にカテゴリの列は無いので、名義尺度の最頻値を試すための
# <架空の>アンケート集計をここで作る。
import pandas as pd

df = pd.DataFrame({
    '果物': ['りんご', 'みかん', 'りんご', 'ぶどう', 'みかん', 'りんご'],
    '産地': ['青森', '愛媛', '長野', '山梨', '和歌山', '青森'],
})

# カテゴリデータの最頻値
print(df['果物'].mode())              # Series で最頻値(複数あれば複数返す)
print(df['果物'].value_counts().head())  # 上位5位の頻度

# 全列の最頻値
print(df.mode().iloc[0])              # 各列の1番目の最頻値
📤 出力 0 りんご Name: 果物, dtype: object 果物 りんご 3 みかん 2 ぶどう 1 Name: count, dtype: int64 果物 りんご 産地 青森 Name: 0, dtype: object
💬 解説:6 件の回答でりんごが 3 件と半数を占め、最頻値はりんご。産地の最頻値が青森になるのは、青森だけが 2 回現れ他の 4 産地は 1 回ずつだから。df.mode().iloc[0] は列ごとに別々の最頻値を並べるだけで、「りんご×青森」という組み合わせが最も多いという意味ではない。value_counts(normalize=True) にすれば割合(りんご 0.5)で見られる。

statistics — 標準ライブラリ

🎯 目的:外部ライブラリ不要、Python 標準の statistics.mode / multimode で最頻値を取り出す軽量パターン。
📥 入力:リスト or タプル(例:['A', 'B', 'A', 'C'])。
1
2
3
4
5
6
7
import statistics

# 単一最頻値(同率なら最初のもの)
statistics.mode([1, 2, 2, 3, 3, 3, 4])  # 3

# 複数最頻値(同率全部)
statistics.multimode([1, 2, 2, 3, 3, 4])  # [2, 3]
📤 出力 (print していないので標準出力は無い。対話環境で評価すると statistics.mode は 3、multimode は [2, 3] を返す)
💬 解説:1 つ目のリストは 3 が 3 回で単独首位なので mode は 3。2 つ目は 2 と 3 が 2 回ずつ並ぶので、multimode は [2, 3] と両方を返す。statistics.mode は同率のとき最初に現れた値を返すだけなので、多峰かどうかを確かめたいときは multimode を使う。

連続データの最頻値(KDE)

🎯 目的:連続値の最頻値を KDE 経由で求める:bandwidth を変えて感度を確認し、ピーク位置のロバスト性を検証する。
📥 入力:x(連続値配列)、bw_method(Scott/Silverman/数値)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# ── この抜粋で使うデータを用意します ──
import numpy as np
import pandas as pd
from scipy import stats

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]          # 2023 年の 47 都道府県


def continuous_mode(data, bw_method=None, grid_size=1000):
    kde = stats.gaussian_kde(data, bw_method=bw_method)
    xx = np.linspace(data.min(), data.max(), grid_size)
    density = kde(xx)
    # 密度の山(両隣より高い点)の数も数えて、擬似ピークの乱立を見る
    n_peaks = int(np.sum((density[1:-1] > density[:-2]) & (density[1:-1] > density[2:])))
    return xx[np.argmax(density)], n_peaks

data = df['L322101'].dropna().values / 1e3   # 食料費(千円)
for bw in ['scott', 'silverman', 0.1, 0.5, 1.0]:
    mode_est, n_peaks = continuous_mode(data, bw_method=bw)
    print(f'bw={str(bw):9s} 最頻値(KDE): {mode_est:.2f} 千円 / 山の数: {n_peaks}')
📤 出力 bw=scott 最頻値(KDE): 76.48 千円 / 山の数: 1 bw=silverman 最頻値(KDE): 76.64 千円 / 山の数: 1 bw=0.1 最頻値(KDE): 76.35 千円 / 山の数: 8 bw=0.5 最頻値(KDE): 76.70 千円 / 山の数: 1 bw=1.0 最頻値(KDE): 79.48 千円 / 山の数: 1
💬 解説:Scott・Silverman・0.5 では山が 1 つで、最頻値は 76.48〜76.70 千円とほとんど動かない。bw=0.1 まで狭めると 47 県の個々の値を拾って山が 8 つに割れ、bw=1.0 まで広げると山がならされて頂点が 79.48 千円と中央値 79.94 千円の近くまで寄る。Scott や Silverman の経験則から始め、前後に振っても頂点が動かないかを確かめる。

🤖 機械学習での最頻値

① 欠損値の補完(mode imputation)

カテゴリ変数の欠損は、 最頻値で埋めるのが王道:

🎯 目的:scikit-learn の SimpleImputer(strategy='most_frequent') でカテゴリ欠損を最頻値で補完するパイプラインの基本部品。
📥 入力:X(欠損 NaN を含む DataFrame)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ── この抜粋で使うデータを用意します(架空)──
# 欠損のあるカテゴリ列を最頻値で埋める例。SSDSE-B-2026 には
# カテゴリ列も欠損も無いので、<架空の>小さな表をここで作る。
import numpy as np
from sklearn.impute import SimpleImputer

X_categorical = np.array([['りんご'], ['みかん'], [None],
                          ['りんご'], [None], ['りんご']], dtype=object)

# カテゴリ列の最頻値補完(欠損が None なので missing_values=None を指定する。
# 既定の np.nan のままだと None は欠損とみなされず、そのまま残る)
imputer = SimpleImputer(strategy='most_frequent', missing_values=None)
X_imputed = imputer.fit_transform(X_categorical)
print(X_imputed.ravel())
📤 出力 ['りんご' 'みかん' 'りんご' 'りんご' 'りんご' 'りんご']
💬 解説:欠損でない 4 件のうちりんごが 3 件なので、2 つの None がどちらもりんごで埋まり、補完後はりんご 5・みかん 1 になる。最頻値補完は多数派をさらに増やすので、欠損が多い列ではカテゴリの比率が大きく歪む。missing_values を欠損の表し方(None か np.nan か)に合わせないと、何も埋まらないまま通ってしまう。

② 分類問題のベースライン

「全部 majority class(最頻クラス)と予測する」分類器は、 機械学習モデルが超えるべき最低限のベースライン。 sklearn.dummy.DummyClassifier(strategy='most_frequent')。

③ 決定木の葉ノード予測

分類木では、 各葉ノードの最頻クラスを予測値とします。 回帰木の「平均」に対応。

④ アンサンブル投票

ランダムフォレストなどのアンサンブルで分類するとき、 複数の木の予測の最頻値(majority vote)を最終予測とします。

⑤ k-NN分類

k近傍法では、 周囲 k 個のラベルの最頻値を予測クラスとします。

🚧 最頻値の落とし穴

1️⃣ ビン幅で最頻値が変わる

連続データの最頻値は、 階級幅次第で値が変わる。 KDE を使うか、 複数のビン設定で比較しましょう。

2️⃣ サンプルサイズが小さいと不安定

n=10 のデータでは、 偶然一致した値が「最頻値」になりがち。 n が大きくないと信頼できません。

3️⃣ 最頻値が複数あるとき(多峰性)

複数のピークがある分布で1つだけ最頻値と呼ぶのは誤解の元。 「2つのモードがある」と素直に書きましょう。 集団が混在している可能性を疑う。

4️⃣ カテゴリ変数では平均・中央値が使えない

逆に、 名義尺度(性別、 職業)では最頻値が唯一の代表値。 順序尺度なら中央値も使える。 間隔・比例尺度なら平均も。

5️⃣ 一様分布では意味がない

すべての値が等頻度なら、 最頻値は定義できない(または全部)。 ヒストグラムを描いて分布の形を確認してから使う。

🐍 Python 実装バリエーション

① scipy.stats.mode

🎯 目的:数値配列に対する scipy.stats.mode の最小限の使い方。NumPy 配列の高速処理に向く。
📥 入力:arr(np.ndarray)、axis(2 次元時の集計軸)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# ── この抜粋で使うデータを用意します(架空)──
import pandas as pd
from scipy import stats

df = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A']})

# scipy の mode は数値向け。文字列は pandas の mode を使う
vals, counts = pd.factorize(df['category'])
result = stats.mode(vals, keepdims=False)
print(counts[result.mode], result.count)
📤 出力 A 3
💬 解説:pd.factorize で A→0・B→1・C→2 の整数に置き換えてから stats.mode にかけ、最頻の番号 0 を元のラベルに戻して A、その回数 3 を表示している。6 件中 A が 3 件。scipy の mode は数値配列向けなので、文字列はこのように番号化するか pandas の mode を使う。

② pandas df.mode()

複数の最頻値があるとき全部返すので、 結果が可変長になる。

🎯 目的:DataFrame に対し df.mode() で各列の最頻値を一括取得(複数の最頻値があれば複数行を返す pandas の特殊仕様)。
📥 入力:df(任意の DataFrame)。
1
2
print(df['category'].mode())  # 複数あれば全部
print(df['category'].value_counts().idxmax())  # 最頻値(最初)
📤 出力 0 A Name: category, dtype: object A
💬 解説:A が 3 件で単独首位なので、Series.mode() は A の 1 行だけを返し、value_counts().idxmax() も A。同率首位があると mode() は全部を返し、idxmax() は先に数えた 1 つだけを返すので、結果が 1 つとは限らないことを前提にコードを書く。

③ scikit-learn — SimpleImputer で最頻値補完

🎯 目的:scikit-learn の Pipeline に組み込んで前処理段階で最頻値補完を行うパターン。本番モデル構築の標準ステップ。
📥 入力:X(NaN を含む特徴量)。SimpleImputer(strategy='most_frequent')。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ── この抜粋で使うデータを用意します(架空)──
# 欠損を最頻値で埋める例。SSDSE-B-2026 には欠損が無いので、
# <架空の>小さな行列をここで作る。
import numpy as np
from sklearn.impute import SimpleImputer

X = np.array([[1.0, 10.0], [1.0, np.nan], [2.0, 10.0],
              [np.nan, 20.0], [1.0, 10.0]])

imp = SimpleImputer(strategy='most_frequent')
X_filled = imp.fit_transform(X)
print(X_filled)
📤 出力 [[ 1. 10.] [ 1. 10.] [ 2. 10.] [ 1. 20.] [ 1. 10.]]
💬 解説:1 列目は 1.0 が 3 回・2.0 が 1 回なので 4 行目の NaN が 1.0 に、2 列目は 10.0 が 3 回・20.0 が 1 回なので 2 行目の NaN が 10.0 に埋まった。数値列にも最頻値が効いてしまうので、カテゴリ列だけに適用したいときは ColumnTransformer で列を絞る。

④ scipy.stats.gaussian_kde — 連続値の最頻値(KDE ピーク)

🎯 目的:連続データの最頻値を KDE のピークとして定義する:np.argmax(kde(grid)) で滑らかな最頻点を取得する数値手法。
📥 入力:x(連続値配列)、評価グリッド(np.linspace)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ── この抜粋で使うデータを用意します ──
import pandas as pd
import numpy as np
from scipy.stats import gaussian_kde

df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023].copy()   # 2023 年の 47 都道府県
df['income'] = df['L3221'].astype(float)     # 消費支出を所得の代わりに使う

kde = gaussian_kde(df['income'])
xs = np.linspace(df['income'].min(), df['income'].max(), 1000)
print("mode_kde=", round(xs[np.argmax(kde(xs))], 1))
📤 出力 mode_kde= 302902.7
💬 解説:2023 年 47 都道府県の 1 か月あたり消費支出 L3221 の KDE の頂点は 302,902.7 円で、平均 295,856 円よりやや高い側にある。コードは消費支出を「所得の代わり」と呼んでいるが、支出と所得は別の量なので、所得の最頻値として読まない。

⑤ collections.Counter — Python 標準ライブラリ

🎯 目的:Python 標準ライブラリの collections.Counter で「最頻値 + 上位 k 件の頻度」を 1 行で取り出す軽量パターン。
📥 入力:リストや文字列(イテラブルなら何でも可)。
1
2
3
4
5
6
7
8
# ── この抜粋で使うデータを用意します(架空)──
import pandas as pd
from collections import Counter

df = pd.DataFrame({'category': ['A', 'B', 'A', 'C', 'B', 'A', 'C', 'A']})

counter = Counter(df['category'])
print(counter.most_common(3))  # top 3
📤 出力 [('A', 4), ('B', 2), ('C', 2)]
💬 解説:8 件中 A が 4 件で最頻値、B と C は 2 件ずつで同率。most_common は同じ回数なら先に現れた順(B が先)に並べるので、B が 2 位・C が 3 位になるのは件数の差ではない。最頻値だけでなく頻度全体を扱える点が statistics.mode より便利。

🐍 Python 実装 — 最頻値 を SSDSE-B-2026 で動かす

まず環境をそろえます。 必要なライブラリを入れ、 matplotlib の日本語フォント(Hiragino Sans)を設定し、 SSDSE を encoding='cp932' で読み込んで shape・head()・describe() を確認します。 この後のコードでは、 小数 2 桁で値が重なる合計特殊出生率と、 47 県すべてが異なる値の総人口を並べ、 連続量では「同じ値が 2 度現れない」ため最頻値が素朴には定義できないことを確認します。 ヒストグラムのビン幅や KDE のバンド幅を変えると最頻値が動く、 というのがこのページの主題です。 エンコーディングを指定し忘れると UnicodeDecodeError で止まるのが最初の関門なので、 ここだけは丸暗記して構いません。

📥 入力例(SSDSE-B-2026 の 2023 年・47 都道府県から 3 行) 都道府県 SSDSE-B-2026(年度) A4103(合計特殊出生率) A1101(総人口) 北海道 2,023 1.06 5,092,000 東京都 2,023 0.99 14,086,000 沖縄県 2,023 1.6 1,468,000 …(全 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
30
# 最頻値 を SSDSE-B-2026 で確かめる最小コード
import pandas as pd
import numpy as np

# 1) SSDSE-B-2026(教育用標準データセット)を読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=1)
print('shape:', df.shape)        # (564, 112) — 47 都道府県 × 12 年度
print('cols head:', list(df.columns[:8]))

# 2) 直近年度(2023 年度)に絞る
df23 = df[df['年度'] == 2023].copy()
print('rows in 2023:', len(df23))

# 3) 最頻値 を動かすために必要な列だけ取り出す
y = df23['合計特殊出生率'].astype(float)   # 小数 2 桁で公表 → 同じ値が重なる
x = df23['総人口'].astype(float)           # ほぼ全県で値が異なる連続量

# 4) 最頻値 の本処理(このページの主題)
print('---- 最頻値 結果 ----')
# 離散的な値: そのまま数えて一番多い値
vc = y.value_counts()
print('合計特殊出生率 上位 3 値:', vc.head(3).to_dict())
print('最頻値 (mode):', y.mode().tolist(), '/ 平均:', round(y.mean(), 3), '/ 中央値:', y.median())
# 連続量: 値そのものは重ならないので、階級に分けて最も度数の多い階級を最頻値とみなす
print('総人口の異なる値の数:', x.nunique(), '/ 47 県')
bins = np.arange(0, 15_000_001, 1_000_000)
cnt = pd.cut(x, bins=bins, right=False).value_counts().sort_index()
top = cnt.idxmax()
print(f'総人口の最頻階級: {top.left/1e4:.0f}〜{top.right/1e4:.0f} 万人 ({cnt.max()} 県) '
      f'/ 階級値 {top.mid/1e4:.0f} 万人 / 平均 {x.mean()/1e4:.1f} 万人 / 中央値 {x.median()/1e4:.1f} 万人')
📤 実行例(実測) shape: (564, 112) cols head: ['年度', '地域コード', '都道府県', '総人口', '総人口(男)', '総人口(女)', '日本人人口', '日本人人口(男)'] rows in 2023: 47 ---- 最頻値 結果 ---- 合計特殊出生率 上位 3 値: {1.29: 3, 1.46: 3, 1.32: 2} 最頻値 (mode): [1.29, 1.46] / 平均: 1.293 / 中央値: 1.3 総人口の異なる値の数: 47 / 47 県 総人口の最頻階級: 100〜200 万人 (21 県) / 階級値 150 万人 / 平均 264.6 万人 / 中央値 154.9 万人

💬 2023 年の合計特殊出生率は小数 2 桁で公表されるため値が重なり、1.29 と 1.46 がどちらも 3 県で並んで最頻値が 2 つになった。平均 1.293・中央値 1.30 とは違い、最頻値は 1 県の値が変わるだけで入れ替わるほど不安定。総人口は 47 県すべてが異なる値なので値そのものの最頻値は意味を持たず、100 万人刻みにすると 100〜200 万人の階級に 21 県が集まり、階級値 150 万人は中央値 154.9 万人に近く、東京都に引っ張られた平均 264.6 万人からは遠い。

うまく動かないときは ①data/raw/SSDSE-B-2026.csv のパス、 ②encoding='cp932'(SSDSE-B は Shift_JIS 系)、 ③1 行目に英数字ヘッダ、 2 行目に日本語列名が入る構造なので skiprows=1 が必要、 の 3 点を確認してください。

⚠️ 最頻値の落とし穴(深掘り版・6件)

① 連続値で「最頻値」を直接計算する意味のなさ

連続値(家計支出・身長・体重)では、 各値はほぼ一意なので「重複した最頻値」は存在しません。 scipy.stats.mode は機械的に「最も小さい値」を返すだけで意味不明。 連続値の最頻値はビニングかKDE のピークでしか定義できない。 統計の教科書で「平均・中央値・最頻値」と並べられていても、 連続値での最頻値の計算は丁寧に注意することが必要。

② ビン幅で答えが変わる

ヒストグラムでビンが「1万円幅」と「10万円幅」では、 最頻ビンが大きく違う場所に動く可能性があります。 Sturges、 Scott、 Freedman-Diaconis などビン幅選択法はいくつかあり、 結論が変わる場合がある。 必ず複数のビン幅で確認し、 安定して見えるピークだけを信用する。

③ 多峰分布で「最頻値」と単数形で報告する

「男女混合の身長分布」「2種類の顧客層の購買額」などは双峰になることが多い。 これを「最頻値 = 168cm」と単一の値で報告すると、 実は男性ピーク 175cm と女性ピーク 160cm の谷である情報が失われる。 必ずヒストグラム or KDE で形を確認し、 多峰なら「最頻値は 168cm と 165cm の 2つ」のように複数を報告。

④ scipy.stats.mode のバージョン互換性

SciPy 1.9 以降で scipy.stats.mode の挙動が変更され、 デフォルトの keepdims や axis の解釈が異なります。 旧コードがそのまま動かないことがある。 FutureWarning を見たら、 引数を明示的に書く。 pandas の df.mode() は安定だが、 複数の最頻値がある場合「全部」を返すので長さが可変になることに注意。

⑤ 欠損値の扱い

「NaN が最頻値」と判定されてしまうケースがあります。 例:80% が欠損のデータでは NaN そのものが最頻値になる。 必ず dropna() してから最頻値を計算するか、 NaN を「不明」というカテゴリとして意味づけする判断をした上で計算する。 機械学習の前処理でカテゴリ欠損を「最頻値で補完」する場合、 NaN を一緒に数えない設計に。

⑥ 「最頻値で欠損補完」が分布を歪める

機械学習で欠損を「最頻値で埋める」のは標準テクニックですが、 多用すると分布が最頻値に偏り、 分散が過小評価されます。 また、 欠損が MAR(ランダム)でない場合、 「最頻値」がそもそも真の値の代表として不適切。 多重代入法(MICE)や IterativeImputer の方が一般に優れる。 欠損補完の方法を変えて、 下流の予測精度が変わるか必ず比較。

⚠️ よくある落とし穴 — 最頻値 で初学者がやりがちなミス

この用語を実務で使うときにつまずきやすい点を、 失敗パターン別に整理しました。 1 度経験すれば回避できるものばかりですが、 先に知っておくと事故が大幅に減ります。

❌ 連続データの最頻値を「最頻値」と呼ぶ
連続値はビン幅次第で変わる。 KDE 推定の山が安定。
❌ 双峰なのに 1 つだけ報告
2 つの山がある分布で 1 つだけ報告すると分布の本質を見落とす。
❌ 最頻値が複数
完全に同数の値があれば最頻値は複数(マルチモーダル)。 報告に工夫を。
🛡 最頻値固有の防御策:「連続値 → ビン幅 or KDE を必ず宣言 → ヒストグラム形状を必ず描いて単峰性を確認 → NaN を dropna してから mode() を呼ぶ」の 3 ステップを徹底すれば、 単峰/多峰の見落とし・欠損値の混入・ビン幅依存の 3 大事故は回避できます。

🗺️ 概念マップ — 3つの視点で体系を理解する

最頻値 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。

📍 体系階層のパス

🌐 統計・データサイエンス › 記述統計 › 中心傾向 › 最頻値

① 🔗 関係マップ — 「他の手法とどう繋がっているか」

中心に 最頻値 を置き、 そこから 平均・中央値・ヒストグラム・KDE・クラスタリング・分散 など 計 14 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語とあとから読む用語が分かります。 ノードはドラッグで動かせ、 ホイールでズーム、 クリックでその用語のページへ遷移します。

凡例:現在の用語上位カテゴリ兄弟(並列)前提発展形応用先2階層先

② ⭕ 包含マップ — 「どのカテゴリに含まれているか」

大きな円が小さな円を包含する Circle Packing 図。 「最頻値」は緑色でハイライト。

📍現在地:統計・データサイエンス

③ 🌳 ツリーマップ — 「面積で見るボリューム比較」

長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「最頻値」は緑色でハイライト。

🎯 3つのマップの使い分け

マップ 分かること こんな時に見る
🔗 関係マップ手法間の横の関係(前提→発展→応用)「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ分類体系の入れ子構造(上位⊃下位)「この手法はどんなジャンルに属する?」
🌳 ツリーマップ分野の規模比較(面積=ボリューム)「データサイエンス全体の俯瞰像」

💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 最頻値 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → 中心傾向 → 最頻値 という入れ子の位置を示します。 「中心傾向には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。

🔗 隣接手法への橋渡し

「最頻値」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。

最頻値は名義尺度に唯一適用できる代表値である。 平均・中央値と対比的に押さえることで、 SSDSE-B-2026 のカテゴリ列 (都道府県、地域区分など) を扱うときの判断基準が明確になる。

🌳 3つの代表値の使い分けフロー

  1. データの尺度は?
    • 名義(性別、 国) → 最頻値のみ
    • 順序(5段階評価) → 中央値・最頻値
    • 間隔・比例(温度、 身長) → 3つ全部
  2. 目的は?
    • 「典型的な人」「ピークの値」 → 最頻値
    • 「中位の人」 → 中央値
    • 「合計が意味を持つ計算」 → 平均
  3. 分布の形を診断したい → 3つ全部を併記して、 並び方から歪み・多峰性を読み取る

📜 最頻値の歴史

📖 包括的解説 — この概念を完全マスター

📍 学習の3ステップ

  1. 定義を理解する:この概念は何か? 数式や条件を確認
  2. 具体例を見る:実データ(SSDSE 等)で計算してみる
  3. 応用する:自分のデータに適用、 結果を解釈

🔧 Python実装パターン

🎯 目的:SSDSE-B-2026 を読み込み、値が重なる列(ここでは小数 2 桁で公表される合計特殊出生率 A4103)に対し mode() / value_counts() を併用して最頻値とその根拠(件数)を一画面で把握する。
📥 入力:data/raw/SSDSE-B-2026.csv(cp932)、2023 年の合計特殊出生率 A4103。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 基本パターン: 最頻値と、その根拠になる頻度を一緒に見る
import pandas as pd

# データ読み込み(2023 年の 47 都道府県)
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])
df = df[df['SSDSE-B-2026'] == 2023]

# SSDSE-B にカテゴリ列は無いので、小数 2 桁で公表され値が重なる合計特殊出生率 A4103 を使う
tfr = df['A4103']
print('最頻値:', tfr.mode().tolist())
print('上位 5 件の頻度:')
print(tfr.value_counts().head(5).to_string())
print('異なる値の数:', tfr.nunique(), '/', len(tfr), '県')
📤 出力 最頻値: [1.29, 1.46] 上位 5 件の頻度: A4103 1.29 3 1.46 3 1.32 2 1.14 2 1.40 2 異なる値の数: 31 / 47 県
💬 解説:最頻値は 1.29(愛知・三重・兵庫)と 1.46(福井・島根・佐賀)の 2 つで、どちらも 3 県だけ。2 県で重なる値が 12 個、1 県だけの値が 17 個あり、47 県が 31 通りの値に散らばっているので、首位と 2 位の差は 1 県分しかない。最頻値を代表値として報告する前に、このように頻度表を並べて僅差かどうかを確かめる。

📚 統計概念マップでの位置

このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。

🎯 SSDSE-B-2026 で挑戦

統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:

💡 よく使うコマンド集

機能 Python (pandas) Python (scipy)
要約統計df.describe()stats.describe()
平均df.mean()np.mean()
標準偏差df.std()np.std()
相関df.corr()stats.pearsonr()
t検定—stats.ttest_ind()
回帰—stats.linregress()
分布フィッティング—stats.norm.fit()

🚧 一般的な落とし穴と対策

📊 結果報告の標準フォーマット

🌐 関連分野での応用

🎓 さらに学ぶための文献

🔗 統計用語ネットワーク

この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。

主要な関連概念のグループ

グループ 主要概念
記述統計平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数
可視化ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ
推測統計標本平均、 標準誤差、 信頼区間、 p値、 有意水準
確率分布正規分布、 t分布、 χ²分布、 F分布、 二項分布
仮説検定t検定、 F検定、 χ²検定、 ノンパラ検定
回帰単回帰、 重回帰、 OLS、 Ridge、 LASSO
分類ロジスティック回帰、 決定木、 SVM、 k-NN
教師なし学習クラスタリング、 PCA、 因子分析
時系列ARIMA、 VAR、 指数平滑法、 自己相関
因果推論DiD、 IV、 傾向スコア、 交絡変数
前処理標準化、 正規化、 欠損値処理、 多重共線性対策
評価R²、 残差、 CV、 RMSE、 効果量

学習順序の推奨

  1. 記述統計(平均、 分散、 標準偏差)
  2. 可視化(ヒストグラム、 散布図)
  3. 確率分布(正規分布)
  4. 推測統計(標準誤差、 信頼区間、 p値)
  5. 仮説検定(t検定、 χ²検定)
  6. 相関と回帰(単回帰、 重回帰)
  7. 多変量解析(PCA、 クラスタリング)
  8. 機械学習(決定木、 RF、 NN)
  9. 時系列・因果推論(応用)

📝 実践練習 — SSDSE-B-2026 で挑戦

初級課題

  1. 東北6県の家計食料費の基本統計量を計算
  2. 食料費のヒストグラムを描く
  3. 食料費と教育費の散布図を描く
  4. 都道府県を「東日本/西日本」に分け、 平均を比較

中級課題

  1. 家計支出 5項目で相関行列を作成、 ヒートマップ可視化
  2. 食料費 → 教育費の単回帰を実行、 残差分析
  3. 家計5項目で PCA を実施、 バイプロット表示
  4. k-means (k=3) で都道府県をクラスタリング、 解釈

上級課題

  1. 地域別の家計パターンに有意差があるか ANOVA で検定
  2. 重回帰で教育費を予測、 多重共線性を VIF で確認
  3. Ridge/LASSO で正則化、 CV で α を最適化
  4. 階層クラスタリングと Ward 法で都道府県を分類、 デンドログラム作成

🎮 触って理解する

ヒストグラムのバーをクリック/ドラッグしてデータを盛り、 分布の形を自分で作ってみましょう。 最も度数が高い階級(=最頻階級)がオレンジでハイライトされ、 下の数直線に最頻値・中央値・平均の3つが同時に表示されます。 右に歪ませると 最頻値 < 中央値 < 平均、 二峰性にすると最頻値が2つになる様子、 そしてビン数を変えると最頻値だけが動く様子を体感してください。

平均 – 中央値 – 最頻値 – データ数 0 ビン幅 –
バーをクリック/ドラッグしてデータを足してみましょう。

👁️ 直感

最頻値は「分布のピークの位置」。 平均は分布の重心なので長い裾に引っ張られ、 中央値は順位のちょうど真ん中。 対称な単峰分布では3つがほぼ一致しますが、 右に裾を引くと平均だけが右へ逃げ、 最頻値はピークに居座ります。 上の図で「右に歪み」を押すと、 数直線上で3つが 最頻値 < 中央値 < 平均 の順に並ぶのが見えます。

⚠️ よくある落とし穴

🚀 発展:カテゴリ変数の代表値

平均や中央値が計算できない名義尺度(血液型・都道府県・主要産業など)では、 最頻値(最頻カテゴリ)が唯一意味を持つ代表値です。 pandas なら series.value_counts().idxmax() や series.mode() で求まります。 「最も多い分類」を代表として選ぶ、 という素朴で頑健な発想がここに生きます。

🔗 関連ページ

🧭 解説深化(追記)— 直感・落とし穴・発展

本節は既存の解説を壊さず、 「直感の核」「実務でハマる落とし穴」「発展的な位置づけ」を一段深く追記したものです。 数値はすべて SSDSE-B-2026(cp932・2 行目の日本語名をスキップ・2023 年・47 都道府県)の実測に基づきます(合成例は「架空」と明記)。

👁️ 直感をもう一段 — 「峰の位置」であること

最頻値は分布の峰(ピーク)の位置そのものです。 平均が「重心(てこの支点)」、 中央値が「順位のちょうど真ん中」であるのに対し、 最頻値は「いちばん人口密度が高いところ」を指します。 だからこそ、 名義尺度(血液型・都道府県・主要産業)でも定義できる唯一の代表値です。 平均は加減算できる尺度でしか、 中央値は順序が付く尺度でしか意味を持ちませんが、 「最も多いカテゴリ」はどんな尺度でも数えられます。

📌 外れ値への強さ(SSDSE-B-2026 総人口 A1101・2023 年・実測)
平均 ≈ 2,645,809 人 / 中央値 ≈ 1,549,000 人 / 最小 537,000 人(鳥取)〜 最大 14,086,000 人(東京)。
東京という 1 つの巨大値が平均を中央値の 1.7 倍まで押し上げていますが、 分布の峰は人口の小さい側にあり動きません。 総人口を等幅 4 階級に区切ると各階級の県数は [38, 4, 4, 1]。 最頻階級は最小人口帯で 38 県が集中し、 東京の外れ値には全く引きずられません。 「平均だけが右へ逃げ、 最頻値はピークに居座る」という最頻値の頑健さがそのまま出ています。

🚧 落とし穴(重要・深掘り追記)

🚀 発展 — 歪度・混合分布・モード探索への橋渡し

① 3 代表値の位置関係と歪度

単峰分布では、 平均・中央値・最頻値の並び順が歪度(skewness / 散らばりと分布の形)を語ります。 右に裾を引く(正の歪度)とき 最頻値 < 中央値 < 平均、 左に裾を引くと逆順。 SSDSE-B-2026 の総人口はまさに右歪みで、 実測でも 最頻階級(最小人口帯)< 中央値 1,549,000 < 平均 2,645,809 と教科書どおりに並びます。 Pearson の経験式 Mean − Mode ≈ 3(Mean − Median) を使えば、 平均と中央値から最頻値をおおまかに逆算できます。

なお参考として、 ほぼ対称な合計特殊出生率(A4103・実測)では 最頻階級 [1.30, 1.35)(9 県)・中央値 1.300・平均 1.293 と 3 者がほぼ一致し、 「対称なら 3 代表値は近い」という関係も同時に確認できます。

② 多峰分布と混合分布(mixture)

峰が複数あるとき、 その背後には複数の下位集団が混ざった混合分布が想定できます。 「最頻値が 2 つ」という観察は、 混合ガウスモデル(GMM)や EM アルゴリズムで「いくつの成分から成るか」を推定する出発点になります。 最頻値の数え上げは、 クラスタ数 K を決める素朴な事前探索でもあるわけです。

③ モード探索(mean-shift)への橋渡し

「峰=最頻値」という発想を多次元へ一般化したのが mean-shift(平均シフト)です。 各データ点を KDE 密度の勾配を上る方向へ少しずつ動かし、 最終的に収束した先の峰でグループ分けします。 クラスタ数を事前に決めず、 密度の峰の数だけクラスタが自然に決まる点が k-means と対照的。 最頻値(1 次元の峰)→ KDE(密度の峰)→ mean-shift(多次元の峰探索クラスタリング)という一本の連続した道が見えてきます。 ベイズ的には、 事後分布の峰を点推定に使う MAP 推定や、 平均・中央値の代替として峰を予測する 条件付きモード回帰も、 すべて「最頻値の一般化」として同じ系譜に並びます。

🔗 関連ページ(相対リンク)

補足:関連リンクは html/glossary/ 内の実在ページのみを張っています。 単独の skewness.html は現時点で存在しないため、 歪度の解説は dispersion.html にリンクし本文でも言葉で補いました。 mean-shift の単独ページは未整備のため本文テキストでの言及に留めています。

🔖 キーワード索引(深掘り版)

論文・記事に登場する用語のリンクで該当箇所へジャンプ:

🧮 SSDSE 実値計算 ⚠️ 落とし穴 6選 🐍 Python バリエーション 🔗 関連用語 多峰分布 KDE のピーク ビニング カテゴリ変数の最頻値