🪐

【解説記事】4次の中心積率を求めるアルゴリズム

に公開

目的

この記事では、4次の中心積率を求めるアルゴリズム を紹介します。☺️
4次の中心積率 も、データの分布 を把握するために使われる統計量で、尖度 と呼ばれます。特に、データの分布に於ける 裾の厚さ と、中央にどれくらいデータが密集しているかを表します。4次の中心積率 も、データの分布を把握する目的等で使われます。🤔

状況

今年は、アルゴリズム と、統計数理 に関するスキル強化を抱負として掲げています。
今月、財団法人 実務教育研究所の『現代統計実務講座』の受講を終え、復習も兼ね、この取り組みを始めました。今回で、十三回目です。🧐

複雑さ(課題)

統計量は、ギリシャ文字を使って、表されます。統計量を求めるには、多くの計算をする必要があります。このため、手順の理解なくして、統計量を求めることはできません。😓 そこで、計算手順を一手ずつ書き出し、フローチャートで可視化することを思いつきました。

4次の中心積率を求める数式

4次の中心積率 の数式です。

\mu_4 = \frac{1}{n} \sum_{i=1}^{n} (x_i - \bar{x})^4

数式の記号の意味

記号 読み方 役割
mu_4 4次の中心積率 4次の中心積率、データの 尖度 を表します。
n エヌ 標本の大きさ(数)を表します。
x_i エックス・アイ 個々のデータ、i番目のデータを表します。
bar{x} エックス・バー 標本平均を表します。
(x_i - bar{x}) 偏差 個々のデータから、標本平均を引いた差を表します。

問い

この記事の問いは、4次の中心積率を求めるアルゴリズムは、どうなっているか? です。

今回は、二組のクラスの数学の成績を例題に取り上げます。平均値分散 が全く同じ二組のクラスの違いを、4次の中心積率 を求め、二組のクラスの分布の違いを分析します。🤔

答え

分析の手順は、いつも通りです。

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

結果

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

先ずは、アルゴリズムの箇条書きします。

  1. クラス毎に生徒を数える。
  2. クラス毎に点数を足す。
  3. クラス毎の合計点を生徒数で割る。
  4. 各生徒の点数から、クラス毎の平均点を引く。
  5. 点数差を四乗する。
  6. クラス毎に、点数差を足す。
  7. クラス毎に、偏差の四乗和を、各クラスの生徒数で割る。

4次の中心積率 のアルゴリズムは、3次の中心積率 のデータから平均値を引いた 偏差四乗 に変えただけです。😁

2. フローチャート化

次に、箇条書きをフローチャートに興します。🤔

3. 詳細設計

一本道のアルゴリズムを、詳細設計します。☺️

データ構造

詳細設計に基づくデータ構造は、以下の通りです。

データ データ型 変数名
クラス毎の生徒数 クラス毎の生徒数 整数型 n
クラス毎の点数 クラス毎の数学の点数 リスト型 scores
各生徒の点数 各生徒の数学の点数 整数型 score
クラス毎の平均点 クラス毎の数学の平均点 浮動小数点型 mean
偏差 各生徒の点数と、クラス毎の平均点の差 浮動小数点型 deviation
クラス毎の偏差の四乗 クラス毎の偏差を四乗した値 リスト型 fourth_powers

4. プログラム化

詳細設計に基づくプログラミング

  1. で書き出した詳細設計を基に、プログラミングしたソースコードは、以下の通りです。
def calculate_4th_moment(scores):
    """
    指定されたアルゴリズムの手順に沿って4次の中心積率を計算する関数
    """
    # 2. クラスの生徒を数える
    n = len(scores)
    
    # 3. クラスの点数を足す
    total_score = sum(scores)
    
    # 4. 合計点を生徒数で割り、平均点を出す
    mean = total_score / n
    
    # 5. 各生徒の点数から平均点を引く(偏差)
    # 6. 点数差(偏差)を四乗する
    fourth_powers = []
    for score in scores:
        deviation = score - mean # 手順5
        fourth_power = deviation ** 4 # 手順6
        fourth_powers.append(fourth_power)
        
    # 7. 点数差(偏差の四乗)を足す
    sum_fourth_powers = sum(fourth_powers)
    
    # 8. 偏差の四乗和を生徒数で割る
    fourth_moment = sum_fourth_powers / n
    
    return fourth_moment

# --- シミュレーションデータの準備 ---
# クラスA: 平均付近に極端に集中し、一部に外れ値がある(尖った分布)
# クラスB: 全体的に平均から等しく散らばっている(平らな分布)
# ※両クラスとも 平均=50, 分散=200 になるよう調整しています
class_a = [50, 50, 50, 50, 50, 50, 50, 50, 30, 70]
class_b = [36, 36, 36, 36, 36, 64, 64, 64, 64, 64]

# 実行
m4_a = calculate_4th_moment(class_a)
m4_b = calculate_4th_moment(class_b)

print(f"クラスAの4次の中心積率: {m4_a}")
print(f"クラスBの4次の中心積率: {m4_b}")

リファクタリング

上記のソースコードを研ぎ澄ましたソースコードが、以下のソースコードです。

  1. 中間リストの排除
  2. ガード節の追加
  3. データの管理方法
def calculate_4th_moment(scores):
    """
    4次の中心積率を計算する(リファクタリング版)
    """
    n = len(scores)
    if n == 0:
        return 0.0
    
    # 手順3-4: 平均の算出
    mean = sum(scores) / n
    
    # 手順5-7: 偏差の4乗和の算出(ジェネレータ式によるメモリ節約)
    # リストを作らずに直接合計値を計算します
    sum_fourth_powers = sum((score - mean)**4 for score in scores)
    
    # 手順8: 4次の中心積率の算出
    return sum_fourth_powers / n

# --- シミュレーションデータの準備 ---
classes = {
    "クラスA (尖った分布)": [50, 50, 50, 50, 50, 50, 50, 50, 30, 70],
    "クラスB (平らな分布)": [36, 36, 36, 36, 36, 64, 64, 64, 64, 64]
}

# 実行と分析表示
for name, scores in classes.items():
    m4 = calculate_4th_moment(scores)
    print(f"{name} の4次の中心積率: {m4:>10.1f}")

示唆

  • 4次の中心積率 は、データの 尖度 とも呼ばれます。
  • 3次の中心積率 同様、あまり意識に上る統計量ではありませんが、データの中央への密集度合いを把握するのに役立ちます。
  • まだまだカバーし切れていない統計量が沢山あり、統計量アルゴリズムの深淵さを感じています。検定推定 は、まだ先になりそうです。😓

結論

  • 4次の中心積率 は、データの 尖度 とも呼ばれます。
  • 3次の中心積率 同様、あまり意識に上る統計量ではありませんが、データの中央への密集度合いを把握するのに役立ちます。🤔
  • 記事も溜まってきたので、そろそろ、古い記事の研ぎ澄ましをします。😓

出所

Discussion