🪐
【解説記事】4次の中心積率を求めるアルゴリズム
目的
この記事では、4次の中心積率を求めるアルゴリズム を紹介します。☺️
4次の中心積率 も、データの分布 を把握するために使われる統計量で、尖度 と呼ばれます。特に、データの分布に於ける 裾の厚さ と、中央にどれくらいデータが密集しているかを表します。4次の中心積率 も、データの分布を把握する目的等で使われます。🤔
状況
今年は、アルゴリズム と、統計数理 に関するスキル強化を抱負として掲げています。
今月、財団法人 実務教育研究所の『現代統計実務講座』の受講を終え、復習も兼ね、この取り組みを始めました。今回で、十三回目です。🧐
複雑さ(課題)
統計量は、ギリシャ文字を使って、表されます。統計量を求めるには、多くの計算をする必要があります。このため、手順の理解なくして、統計量を求めることはできません。😓 そこで、計算手順を一手ずつ書き出し、フローチャートで可視化することを思いつきました。
4次の中心積率を求める数式
4次の中心積率 の数式です。
数式の記号の意味
| 記号 | 読み方 | 役割 |
|---|---|---|
| 4次の中心積率 | 4次の中心積率、データの 尖度 を表します。 | |
| エヌ | 標本の大きさ(数)を表します。 | |
| エックス・アイ | 個々のデータ、i番目のデータを表します。 | |
| エックス・バー | 標本平均を表します。 | |
| 偏差 | 個々のデータから、標本平均を引いた差を表します。 |
問い
この記事の問いは、4次の中心積率を求めるアルゴリズムは、どうなっているか? です。
今回は、二組のクラスの数学の成績を例題に取り上げます。平均値、分散 が全く同じ二組のクラスの違いを、4次の中心積率 を求め、二組のクラスの分布の違いを分析します。🤔
答え
分析の手順は、いつも通りです。
- アルゴリズムの箇条書き
- フローチャート化
- 詳細設計
- プログラム化
結果
1. アルゴリズムの箇条書き
先ずは、アルゴリズムの箇条書きします。
- クラス毎に生徒を数える。
- クラス毎に点数を足す。
- クラス毎の合計点を生徒数で割る。
- 各生徒の点数から、クラス毎の平均点を引く。
- 点数差を四乗する。
- クラス毎に、点数差を足す。
- クラス毎に、偏差の四乗和を、各クラスの生徒数で割る。
4次の中心積率 のアルゴリズムは、3次の中心積率 のデータから平均値を引いた 偏差 を 四乗 に変えただけです。😁
2. フローチャート化
次に、箇条書きをフローチャートに興します。🤔

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

データ構造
詳細設計に基づくデータ構造は、以下の通りです。
| データ | 値 | データ型 | 変数名 |
|---|---|---|---|
| クラス毎の生徒数 | クラス毎の生徒数 | 整数型 | n |
| クラス毎の点数 | クラス毎の数学の点数 | リスト型 | scores |
| 各生徒の点数 | 各生徒の数学の点数 | 整数型 | score |
| クラス毎の平均点 | クラス毎の数学の平均点 | 浮動小数点型 | mean |
| 偏差 | 各生徒の点数と、クラス毎の平均点の差 | 浮動小数点型 | deviation |
| クラス毎の偏差の四乗 | クラス毎の偏差を四乗した値 | リスト型 | fourth_powers |
4. プログラム化
詳細設計に基づくプログラミング
- で書き出した詳細設計を基に、プログラミングしたソースコードは、以下の通りです。
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}")
リファクタリング
上記のソースコードを研ぎ澄ましたソースコードが、以下のソースコードです。
- 中間リストの排除
- ガード節の追加
- データの管理方法
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