【解説記事】最頻値を求めるアルゴリズム
目的
この記事では、最頻値 を求めるアルゴリズムを解説します。😏
最頻値 は、データの中で、最も多く出現する値 を指します。身近な例では、人気ランキング が挙げられます。今回は、とある高校の学生の星座を数え、最頻値 を求めます。😁
状況
今年は、アルゴリズム と、統計数理 に関する技能強化を目標に掲げています。💪
昨年末から、身近な題材を使って、アルゴリズムを分析する練習を始めました。今回は 六回目 です。6️⃣
複雑さ(課題)
統計量は、ギリシャ文字を使って、表されます。ギリシャ文字は計算手順を表しているため、手順の理解なくして、読み解くことはできません。そこで、手順を一手ずつ書き出し、フローチャートで整理・可視化することを思いつきました。💡
問い
この記事の問いは、最頻値を求めるアルゴリズムは、どうなっているか? です。🤔
今回は、架空の高校に於ける、学生の星座を数え、最も多い星座の 最頻値 を求めます。⭐️
答え
アルゴリズムを分析する手順は、いつもの通りです。
- アルゴリズムの箇条書き
- フローチャート化
- 詳細設計
- プログラム化
結果
1. アルゴリズムの箇条書き
先ずは、アルゴリズムを箇条書きします。🤔
最頻値 のアルゴリズムは、三ステップで構成されています。
ポイントは、生徒を数えた後、降順 で並び替えている点です。
- 星座毎に、生徒の数を数える。
- 数の多い順(降順)に並び替える。
- 最も多い星座を最頻値にする。
2. フローチャート化
- の箇条書きを、フローチャートにします。
特筆すべきことはなく、箇条書きをそのまま興したものです。

3. 詳細設計
続いて、詳細設計です。2. で描いたフローチャートを詳細化します。
最頻値 のアルゴリズムは、出現回数によって分岐が分かれます。
最頻値 である以上、最低2回は出現する必要があります。
2回以上、出現する値がない場合、データ内に 最頻値 はなく、処理は終了します。
2回以上、出現する値がある場合、同じ回数出現したかどうかで、再び分岐が分かれます。
同じ回数出現した値が複数ある場合、データ内に 最頻値 が複数存在することになります。
どれか一つの値が最も多く出現した場合、その値が 最頻値 になります。🙂

4. プログラム化
最後に、プログラム化します。
def find_mode_constellations(data):
# 1. 星座の出現回数を数える
counts = {}
for constellation in data:
if constellation in counts:
counts[constellation] += 1
else:
counts[constellation] = 1
# 2. 全て数えたか? (forループ終了で完了)
if not counts:
return "データが空です。"
# 3. 2回以上出現した星座があるか?
max_count = max(counts.values())
if max_count < 2:
return "データの中に最頻値は存在しない。"
# 4. 同じ回数出現した星座が存在するか?
# 最も多い回数(max_count)と同じ回数の星座をすべて抽出します
modes = [constellation for constellation, count in counts.items() if count == max_count]
# アルゴリズムの指示通り、該当するものを全て返します
return modes
# --- テスト用のデータ ---
seiza_list = ["牡羊座", "牡牛座", "双子座", "牡羊座", "蟹座", "双子座", "獅子座", "蠍座", "天秤座", "山羊座"]
result = find_mode_constellations(seiza_list)
print(f"最頻値: {result}")
示唆
- 最頻値 は、データの中で最も頻繁に現れる数を現します。データに依存するため、複数の 最頻値 が存在するデータや、逆に 最頻値 が存在しないデータもあります。🤔
- 最小値 や 最大値 は、値の大きさに応じて並び替える統計量であるのに対し、最頻値 は値そのものより、値の出現回数 を使う点が面白いと感じます。🙂
- Gemini で調べた所、小売業、例えば靴屋等で商品の発注を行う際、機会ロスを避けるため、最も売れているサイズを 最頻値 として発注する事例の紹介があり、成る程と思いました。🧐
結論
- 次回は、分散 を求めるアルゴリズムを取り上げます。
- 統計量アルゴリズムの奥深さを感じ始めている今日、この頃です。🤔
Discussion