Pandas DataFrame の kurtosis メソッドとは?

2024-04-02

Pandas DataFrame の kurtosis メソッド

メソッドの詳細

構文

df.kurtosis(axis=0, skipna=None, level=None, numeric_only=None, **kwargs)

引数

  • axis : {0, 1, ‘index’, ‘columns’}, default 0
    • 0または'index':行方向に尖度を計算
    • 1または'columns':列方向に尖度を計算
  • skipna : bool, default None
    • Trueの場合、欠損値(NaN)を無視して計算
    • Falseの場合、欠損値を含む行/列は計算対象に含める
  • level : int or str, optional
    • MultiIndex の場合、指定されたレベルで尖度を計算
  • numeric_only : bool, default None
    • Trueの場合、数値型(float、int、bool)の列のみを対象に計算
    • Falseの場合、すべての列を対象に計算
  • **kwargs : 追加引数

戻り値

  • Series 型
    • 各列/行の尖度

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3, 4], 'b': [5, 6, 7, 8]})

# 列方向の尖度
df.kurtosis(axis=1)

# 行方向の尖度
df.kurtosis(axis=0)

# 欠損値を含む列の尖度
df['c'] = [np.nan, 10, 11, 12]
df.kurtosis(axis=1, skipna=False)

# 数値型列のみの尖度
df.kurtosis(axis=1, numeric_only=True)

出力例

a    -1.2
b    -1.2
dtype: float64

a    -1.2
b    -1.2
dtype: float64

a    0.0
b    -1.2
c    0.0
dtype: float64

a    -1.2
b    -1.2
dtype: float64

補足

  • 尖度の値が 0 より大きい場合、分布は正規分布よりも尖っていることを示します。
  • 一般的に、尖度の値が 3 より大きい場合、分布は尖度が高い(leptokurtic)とみなされます。


Pandas DataFrame.kurtosis サンプルコード

データフレームの準備

import pandas as pd

df = pd.DataFrame({
    'a': [1, 2, 3, 4],
    'b': [5, 6, 7, 8],
    'c': [np.nan, 10, 11, 12],
    'd': ['a', 'b', 'c', 'd']
})

列方向の尖度

# 列方向の尖度
df.kurtosis(axis=1)

# 出力例
# a   -1.200000
# b   -1.200000
# c    0.000000
# d   -1.200000
# dtype: float64

行方向の尖度

# 行方向の尖度
df.kurtosis(axis=0)

# 出力例
# a    0.0
# b    0.0
# c   -0.6
# d    2.4
# dtype: float64

欠損値を含む列の尖度

# 欠損値を含む列の尖度 (skipna=False)
df.kurtosis(axis=1, skipna=False)

# 出力例
# a   -1.200000
# b   -1.200000
# c    0.875000
# d   -1.200000
# dtype: float64

数値型列のみの尖度

# 数値型列のみの尖度 (numeric_only=True)
df.kurtosis(axis=1, numeric_only=True)

# 出力例
# a   -1.200000
# b   -1.200000
# dtype: float64

特定レベルの尖度 (MultiIndex の場合)

# 特定レベルの尖度 (MultiIndex の場合)
df = pd.DataFrame({
    ('a', 'x'): [1, 2, 3, 4],
    ('a', 'y'): [5, 6, 7, 8],
    ('b', 'x'): [np.nan, 10, 11, 12],
    ('b', 'y'): ['a', 'b', 'c', 'd']
})

df.kurtosis(axis=1, level=0)

# 出力例
# a   -1.200000
# b    0.000000
# dtype: float64

特定列の尖度

# 特定列の尖度
df['a'].kurtosis()

# 出力例
# -1.2

Pandas グループ化と尖度

# Pandas グループ化と尖度
df.groupby('a').kurtosis()

# 出力例
#     a    b
# 1  1.0  0.0
# 2  2.0  0.0
# 3  3.0  0.0
# 4  4.0  0.0

尖度と可視化

# 尖度と可視化
import seaborn as sns

sns.displot(df, kind="kde")
sns.rugplot(df)

# 図表: 各列の分布と尖度を可視化

尖度と正規分布の比較

# 尖度と正規分布の比較
import scipy.stats as stats

# 正規分布からのサンプルデータ
norm_data = stats.norm(0, 1).rvs(100)

# 比較用のデータフレーム
df_norm = pd.DataFrame({'norm': norm_data})

# 尖度の比較
df.kurtosis(axis=1).compare(df_norm.kurtosis(axis=1))

# 出力例
# a    0.000000
# b    0.000000
# c    0.000000
# d    0.000000


Pandas DataFrame.kurtosis 以外の方法

scipy.stats.kurtosis

from scipy import stats

# 列方向の尖度
stats.kurtosis(df['a'])

# 出力例: -1.2000000000000002

# 行方向の尖度
stats.kurtosis(df, axis=0)

# 出力例:
# a    0.0
# b    0.0
# c   -0.6
# d    2.4
# dtype: float64

自作関数

以下のコードは、尖度を計算する自作関数の例です。

def my_kurtosis(data):
  """
  データの尖度を計算する関数

  Args:
    data: 1次元または2次元のデータ

  Returns:
    尖度
  """

  n = len(data)
  mean = np.mean(data)
  std = np.std(data)
  return np.sum((data - mean) ** 4) / (n * std ** 4)

# 列方向の尖度
my_kurtosis(df['a'])

# 出力例: -1.2000000000000002

# 行方向の尖度
my_kurtosis(df, axis=0)

# 出力例:
# a    0.0
# b    0.0
# c   -0.6
# d    2.4
# dtype: float64

Moment generating function (MGF)

モーメント生成関数 (MGF) を用いて尖度を計算することもできます。MGF は、データのすべてのモーメントを生成する関数です。

from sympy import *

def mgf(x):
  """
  モーメント生成関数

  Args:
    x: データ

  Returns:
    モーメント生成関数
  """

  t = Symbol('t')
  return E(exp(t * x))

# 尖度
mgf(df['a']).diff(t, 4).evalf(subs={t: 0})

# 出力例: 1.2

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

  • scipy.stats.kurtosis は、最も簡単で汎用性の高い方法です。
  • 自作関数は、より柔軟な方法で尖度を計算できます。
  • MGF は、より理論的な方法で尖度を計算できます。



52-53週会計年度におけるナノ秒単位のオフセット:pandas.tseries.offsets.FY5253.nanos徹底解説

pandas. tseries. offsets. FY5253. nanosは、52-53週会計年度(4-4-5カレンダーとも呼ばれる)におけるナノ秒単位のオフセットを表します。これは、会計年度を常に同じ曜日に終了させたい企業で使用されます。



pandas Data offsets: CustomBusinessDay.is_year_startの使い方

概要:CustomBusinessDay は、祝日などを除いた営業日ベースの日付オフセットを表すクラスです。is_year_start は、CustomBusinessDay オブジェクトを受け取り、その日付が その年の最初の営業日 かどうかを判定します。 *判定は、以下の条件に基づいて行われます。 日付がその年の1月1日であること 日付がその年の最初の営業日であること


【応用例】Pandasでスケジュール設定:WeekOfMonthオフセットで毎月の第2週に実行するタスクをスケジュール

pandas. tseries. offsets. WeekOfMonth は、月の第 x 週の y 日目 を指定するオフセットです。freqstr 属性はこのオフセットの文字列表現を取得するために使用されます。構文説明weekday (オプション): 週の何番目の曜日を取得するかを指定します。デフォルトは 1 (月曜日) です。


Pandas Data Offsets で日付操作を賢く:Day.is_month_end を使いこなそう

主な機能:日付の加算・減算:1 日、1 週間、1 か月など、さまざまな単位で日付を簡単に操作できます。特定の日付パターンへのアクセス:月末、四半期末、年末など、特定の日付パターンに一致する日付を取得できます。時系列データの分析:DateOffset を使用して、時系列データの分析を容易にすることができます。


BusinessMonthBegin.n の代替方法:DateOffset、自作関数、外部ライブラリ

pandas. tseries. offsets. BusinessMonthBegin. n は、Pandas のデータオフセット機能の一つで、月初めの営業日に移動するためのオブジェクトです。使い方BusinessMonthBegin. n を使用するには、以下の2つの方法があります。



質問:pandas.tseries.offsets.QuarterEnd.isAnchored の役割と使い方をわかりやすく解説してください。

pandas. tseries. offsets. QuarterEnd. isAnchored は、pandas ライブラリで四半期末の日付オフセットを扱う際に使用されるメソッドです。このメソッドは、オフセットが基点に固定されているかどうか を調べます。


pandas.tseries.offsets.CustomBusinessHour.nanos 属性の詳細解説

pandas. tseries. offsets. CustomBusinessHour. nanos は、pandas ライブラリの CustomBusinessHour クラスで使用される属性です。この属性は、ナノ秒単位のカスタムビジネス時間のオフセットを設定するために使用されます。


Pandas Expanding Window と statsmodels

Expanding Window と組み合わせて使用する aggregate 関数は、集計したい関数を指定することで、Window 内のデータを集計することができます。例:上記の例では、aggregate 関数に 'sum' を指定することで、Window 内のデータの累計値を計算しています。


Pandas Expanding Window と sem 関数:時間と共に変化する統計量を計算する強力なツール

sem 関数は、Expanding Window と組み合わせて、データの標準偏差を計算します。これは、データのばらつきを分析するのに役立ちます。以下の例では、Expanding Window と sem 関数を使用して、株価データの標準偏差を計算します。


Pandas Seriesのdt.microseconds属性:マイクロ秒部分の秘密を解き明かす

pandas. Series. dt. microseconds は、pandas の Series オブジェクトに含まれる datetime 型データのマイクロ秒部分を取得するための属性です。属性値dt. microseconds 属性は、Series オブジェクトに含まれる datetime 型データのマイクロ秒部分を表す数値の Series オブジェクトを返します。