【初心者向け】Pandas DataFrameでkurtosisを使ってデータ分布を分析しよう!


pandas.DataFrame.kurtosis 関数は、Pandas DataFrame の各列の「尖り具合」を表す統計量である kurtosis(尖度) を計算します。

尖度とは?

尖度は、データ分布の ピークの高さ裾の広がり を表す指標です。

  • 尖度が低い データ分布は、平坦で、裾が薄く、ピークが低い状態です。これは、異常値 が少ないことを示唆します。
  • 尖度が高い データ分布は、中央付近に集中し、裾が厚く、ピークが尖っています。これは、異常値 が存在する可能性が高いことを示唆します。

kurtosis の値

  • 負の値: 平坦な分布(異常値の可能性が低い)
  • 正の値: 尖った分布(異常値の可能性が高い)
  • 0: 正規分布

用途

  • 金融データ分析: 金融データは、異常値の影響を受けやすいので、kurtosis を用いて異常値を検出することが重要です。
  • データ分布の比較: 異なるデータセットの kurtosis 値を比較することで、それぞれの分布の形状を比較することができます。
  • 異常値の検出: 高い kurtosis 値を持つ列は、異常値が存在する可能性が高いので、詳細な調査が必要です。

基本的な使い方

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 各列の尖度を計算
kurtosis = df.kurtosis()

print(kurtosis)

出力

col1    0.000000
col2    0.000000
dtype: float64

オプション

  • numeric_only: True の場合、数値列のみを対象に計算します。False の場合、すべての列を対象に計算します。
  • level: MultiIndex データフレームの場合、計算対象のレベルを指定します。
  • skipna: True の場合、欠損値を無視して計算します。False の場合、欠損値を含むすべての値を使用して計算します。
  • axis: 尖度を計算する軸を指定します。デフォルトは 0(行方向)。1 を指定すると列方向に計算します。

例:欠損値を無視して計算

kurtosis = df.kurtosis(skipna=True)

print(kurtosis)

出力

col1    NaN
col2    0.000000
dtype: float64

例:列方向に計算

kurtosis = df.kurtosis(axis=1)

print(kurtosis)
0    0.000000
1    0.000000
dtype: float64


基本的な使い方

この例では、簡単なデータフレームを作成し、各列の尖度を計算します。

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 各列の尖度を計算
kurtosis = df.kurtosis()

print(kurtosis)

出力

col1    0.000000
col2    0.000000
dtype: float64

欠損値を無視して計算

この例では、欠損値を含むデータフレームを作成し、欠損値を無視して各列の尖度を計算します。

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, None], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 欠損値を無視して各列の尖度を計算
kurtosis = df.kurtosis(skipna=True)

print(kurtosis)

出力

col1    NaN
col2    0.000000
dtype: float64

列方向に計算

この例では、データフレームを作成し、列方向に尖度を計算します。

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 列方向に尖度を計算
kurtosis = df.kurtosis(axis=1)

print(kurtosis)

出力

0    0.000000
1    0.000000
dtype: float64

MultiIndex データフレームの特定レベルで計算

この例では、MultiIndex データフレームを作成し、特定のレベルで尖度を計算します。

import pandas as pd

# データフレームを作成
index = pd.MultiIndex.from_tuples([('A', 1), ('A', 2), ('B', 1), ('B', 2)],
                                 names=('group', 'number'))
data = {'col1': [1, 2, 3, 4], 'col2': [5, 6, 7, 8]}
df = pd.DataFrame(data, index=index)

# 特定のレベルで尖度を計算
kurtosis = df.kurtosis(level='group')

print(kurtosis)

出力

group
A    0.000000
B    0.000000
dtype: float64

この例では、データフレームを作成し、数値列のみを対象に尖度を計算します。

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10], 'col3': ['a', 'b', 'c', 'd', 'e']}
df = pd.DataFrame(data)

# 数値列のみを対象に尖度を計算
kurtosis = df.kurtosis(numeric_only=True)

print(kurtosis)
col1    0.000000
col2    0.000000
dtype: float64
  • Pandas には、データ分布
  • 尖度以外にも、データ分布の形状を理解する指標として、偏度(skewness)分散(variance) などがあります。これらの指標と合わせて分析することで、より詳細なデータ分布の分析を行うことができます。


describe() 関数

describe() 関数は、データフレームの主要な統計量を要約した便利なツールです。kurtosis 値もこの要約に含まれています。

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 主要な統計量を表示
print(df.describe())

出力

          col1       col2
count    5.000000    5.000000
mean    3.000000    7.000000
std     1.581139    1.581139
min     1.000000    6.000000
25%     2.000000    6.500000
50%     3.000000    7.000000
75%     4.000000    7.500000
max     5.000000    10.000000
kurtosis  0.000000    0.000000
skew     0.000000    0.000000

Series.kurt() メソッド

kurtosis 値は、Series オブジェクトに対しても計算できます。

import pandas as pd

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 各列の尖度を計算
kurtosis = df['col1'].kurt()
print(kurtosis)

# または
kurtosis = df.col1.kurt()
print(kurtosis)

出力

0.000000

scipy.stats.kurtosis() 関数

SciPy ライブラリからも kurtosis 値を計算することができます。

import pandas as pd
from scipy.stats import kurtosis

# データフレームを作成
data = {'col1': [1, 2, 3, 4, 5], 'col2': [6, 7, 8, 9, 10]}
df = pd.DataFrame(data)

# 各列の尖度を計算
kurtosis = kurtosis(df['col1'])
print(kurtosis)

# または
kurtosis = kurtosis(df.col1)
print(kurtosis)

出力

0.0

これらの方法は、それぞれ異なる利点と欠点があります。

  • scipy.stats.kurtosis() 関数は、SciPy ライブラリがインストールされている必要があるという点で、他の方法よりも複雑です。ただし、より多くのオプションと柔軟性を提供します。
  • Series.kurt() メソッドは、個々の列の kurtosis 値を簡単に計算できます。ただし、複数の列の値を同時に比較することはできません。
  • describe() 関数は、kurtosis 値を含め、データフレームの主要な統計量を簡単に確認できます。ただし、個々の列に焦点を当てることはできません。

状況に応じて、最適な方法を選択してください。

  • 特定のデータ分析タスクに合わせて、最適なツールを選択することが重要です。
  • 上記以外にも、moments ライブラリや statsmodels ライブラリなど、kurtosis 値を計算するためのライブラリや関数はいくつかあります。