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

🔖 キーワード索引

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

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

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

💡 30秒で分かる結論

🍰 まずはやさしく

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

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

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

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

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

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

最頻値の直感

オレンジ色の階級(74.4〜77.8千円)が11都道府県を含み、 最も多い → これが最頻階級。 連続データではビンの設定によって変わるので、 中点を取って「最頻階級の代表値」とする慣習があります。

💡 平均は「重心」、 中央値は「順位の真ん中」、 そして最頻値は「分布のピーク」。 同じデータに対する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}) $$

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

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

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

分布の形状

分布の形状

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

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

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

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

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

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

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

KDEでの最頻値

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}')
📤 出力 ピーク位置のスカラー(例:約 76.5 千円)と KDE 曲線。
💬 解説:ヒストグラムは bin 幅に依存して「見かけの最頻値」が動くが、KDE のピークの方が安定。bandwidth 設定(Scott/Silverman)の影響を理解しておくと迷わない。

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

直感で輪郭が見えたら、 次節の厳密な定義に進んで「入力 → 出力の対応」を確認する。 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

# 連続データ → 階級分けが必要
📤 出力 ModeResult(mode=array(['A']), count=array([15]))
💬 解説:scipy 1.9 から API が変わり、keepdims=False が推奨。複数の最頻値があるときは最小のものが返る点に注意。

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番目の最頻値
📤 出力 頻度降順の Series(例:A: 15, B: 8, C: 3)。
💬 解説:value_counts(normalize=True) で割合に変換可能。SSDSE-B-2026 の都道府県別カテゴリ集計で日常的に使う基本操作。

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]
📤 出力 'A'(mode)または ['A'](multimode、複数の最頻値)。
💬 解説:小規模スクリプトや競プロで便利。pandas を import するほどでもない場面で使うとコードが軽くなる。

連続データの最頻値(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
# ── この抜粋で使うデータを用意します ──
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, grid_size=1000):
    kde = stats.gaussian_kde(data)
    xx = np.linspace(data.min(), data.max(), grid_size)
    density = kde(xx)
    return xx[np.argmax(density)]

mode_est = continuous_mode(df['L322101'].dropna().values / 1e3)
print(f'連続データの最頻値(KDE): {mode_est:.2f}')
📤 出力 ピーク位置のスカラーと、bw 別の KDE 曲線比較。
💬 解説:bandwidth が狭すぎると擬似ピークが乱立、広すぎるとピークが消える。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
# ── この抜粋で使うデータを用意します(架空)──
# 欠損のあるカテゴリ列を最頻値で埋める例。SSDSE-B-2026 には
# カテゴリ列も欠損も無いので、<架空の>小さな表をここで作る。
import numpy as np
from sklearn.impute import SimpleImputer

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

# カテゴリ列の最頻値補完
imputer = SimpleImputer(strategy='most_frequent')
X_imputed = imputer.fit_transform(X_categorical)
print(X_imputed.ravel())
📤 出力 欠損のない X_imputed。各列で最頻カテゴリが NaN を置換。
💬 解説:数値列にも適用可能だが、数値はメジアン補完('median')が推奨。SSDSE-B-2026 ではほぼ欠損がないが、結合や外部データで欠損が混じる場合に役立つ。

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

「全部 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)
📤 出力 ModeResult(mode=..., count=...) のタプル。
💬 解説:axis=0 で列ごと、axis=1 で行ごと、axis=None で全体の最頻値。多次元データの集計で便利。

② pandas df.mode()

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

🎯 目的:DataFrame に対し df.mode() で各列の最頻値を一括取得(複数の最頻値があれば複数行を返す pandas の特殊仕様)。
📥 入力df(任意の DataFrame)。
1
2
print(df['category'].mode())  # 複数あれば全部
print(df['category'].value_counts().idxmax())  # 最頻値(最初)
📤 出力 DataFrame(最頻値が複数列の場合は NaN 埋めの追加行)。
💬 解説:df.mode().iloc[0] でトップ最頻値だけ取り出すのが定石。SSDSE-B-2026 のような数値中心データでは「ほぼ単一の最頻値」が普通。

③ 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)
📤 出力 X_imputed(NaN 無し)。
💬 解説:数値列も対象になるため、カテゴリ列だけに適用したいときは ColumnTransformer で列を絞る。SSDSE 演習の欠損対処テンプレとして再利用可能。

④ 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))
📤 出力 ピーク位置のスカラーと、密度曲線データ。
💬 解説:ヒストグラムの bin 依存性を回避できるのが利点。bandwidth 設定で結果が変わるため、複数の bw で確認するロバスト性チェックが推奨。

⑤ 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
📤 出力 Counter({'A': 15, 'B': 8}) と most_common(1) で最頻ペア。
💬 解説:pandas を読み込まない素の Python スクリプトや、ログ解析で重宝する。最頻値だけでなく頻度全体を扱える点が statistics.mode より強い。

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

まず環境をそろえます。 必要なライブラリを入れ、 matplotlib の日本語フォント(Hiragino Sans)を設定し、 SSDSE を encoding='cp932' で読み込んで shapehead()describe() を確認します。 この後の節では、 食料費・教育費・住居費(L322101・L322108・L322102)の分布を pairplot で眺め、 連続量では「同じ値が 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
# 最頻値 を 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)
x = df23['総人口'].astype(float)
print('y stats:', y.describe().round(3).to_dict())
print('x stats:', x.describe().round(0).to_dict())

# 4) 最頻値 の本処理(このページの主題)
#    — 具体実装は同カテゴリの個別ページにも掲載
print('---- 最頻値 結果 ----')
print('mean y:', y.mean().round(3), '/ std y:', round(y.std(), 3))
print('mean x:', x.mean().round(0), '/ std x:', round(x.std(), 0))
print('corr(x, y):', y.corr(x).round(3))

うまく動かないときは ①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 の挙動が変更され、 デフォルトの keepdimsaxis の解釈が異なります。 旧コードがそのまま動かないことがある。 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 を読み込み、カテゴリ列に対し mode() / value_counts() を併用して最頻値とその根拠(件数)を一画面で把握する。
📥 入力data/raw/SSDSE-B-2026.csv(cp932)、対象カテゴリ列。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 基本パターン
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns

# データ読み込み
df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1])

# 基本統計量
df.describe()

# 可視化
sns.pairplot(df[['L322101', 'L322108', 'L322102']])  # 食料費・教育費・住居費
plt.show()
📤 出力 最頻値と上位 5 件の頻度テーブル。
💬 解説:「最頻値だけ」より「最頻値+頻度分布」を並べて表示することで、最頻値の妥当性(圧倒的多数か僅差か)を判断できる。

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

このページの上にある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 のピーク ビニング カテゴリ変数の最頻値