🎲

【解説記事】最頻値を求めるアルゴリズム

に公開

目的

この記事では、最頻値 を求めるアルゴリズムを解説します。😏
最頻値 は、データの中で、最も多く出現する値 を指します。身近な例では、人気ランキング が挙げられます。今回は、とある高校の学生の星座を数え、最頻値 を求めます。😁

状況

今年は、アルゴリズム と、統計数理 に関する技能強化を目標に掲げています。💪
昨年末から、身近な題材を使って、アルゴリズムを分析する練習を始めました。今回は 六回目 です。6️⃣

複雑さ(課題)

統計量は、ギリシャ文字を使って、表されます。ギリシャ文字は計算手順を表しているため、手順の理解なくして、読み解くことはできません。そこで、手順を一手ずつ書き出し、フローチャートで整理・可視化することを思いつきました。💡

問い

この記事の問いは、最頻値を求めるアルゴリズムは、どうなっているか? です。🤔

今回は、架空の高校に於ける、学生の星座を数え、最も多い星座の 最頻値 を求めます。⭐️

答え

アルゴリズムを分析する手順は、いつもの通りです。

  1. アルゴリズムの箇条書き
  2. フローチャート化
  3. 詳細設計
  4. プログラム化

結果

1. アルゴリズムの箇条書き

先ずは、アルゴリズムを箇条書きします。🤔
最頻値 のアルゴリズムは、三ステップで構成されています。
ポイントは、生徒を数えた後、降順 で並び替えている点です。

  1. 星座毎に、生徒の数を数える。
  2. 数の多い順(降順)に並び替える。
  3. 最も多い星座を最頻値にする。

2. フローチャート化

  1. の箇条書きを、フローチャートにします。
    特筆すべきことはなく、箇条書きをそのまま興したものです。

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