4
3

More than 1 year has passed since last update.

歪度(わいど Skewness)・尖度(せんど Kurtosis)というクセ。

Posted at

統計検定2級を取得すべく統計の学習を再開しましたが、歪度・尖度というクセを見つけたので忘れないためにメモ書き。
一応、pythonでもどのように見るのかも調べたので、書こうと思います。

適度に統計ならではの用語が出てきたりしたときは説明しようと思いますが、pythonの基礎らへんは飛ばします

歪度

まずは概要からいきましょう。

漢字のとおりにどの程度「歪んでいるか?」を表す指標の一つです。
この歪みとは、正規表現(normal distribution)からの歪みを意味します。(やはり全ての物事は正規表現から始まる)

数値的に計算することもありますので、式を載せておくと以下。
$$ \frac{n}{(n-1)(n-2)}\sum_{i=1}^{n}(\frac{x_i - \bar{x}}{s})^3 $$

マイナスもプラスも0もとります。

実際に検定を受けるときはこの式を覚えておかないと爆死することはないです(多分です。保証はできないですw)
(実際に後ほどpythonで書くので、ここで手計算の例は省略。)

通常の統計においても頻繁に出る代物でもないので、用語や必要に迫られた時に検索するスタンスで個人的には良いと思っています。

独特な表現方法

この歪度ですが、表現が少し特殊です。

歪度 > 0

歪度が非負な数をとるときの形状は左に山がある状態で、右にいくほど平坦になります。
これを「右裾が長い」と表現したり、「左に偏っている」と表現したりします。
スクリーンショット 2021-10-20 16.32.42.png

感覚として正の値を取ると右に大きくなるようなイメージをしがちですが、あくまで歪度が0であるとは上記のような図をイメージしておきましょう。

歪度 < 0

逆に負の数を取ればこの反対です。
左裾が長い、右に偏っている、と表現します。
スクリーンショット 2021-10-20 16.36.49.png

歪度 = 0

歪度0とは、簡単にいえば正規表現に代表される、左右対称な状態を意味します。

尖度

裾の広がり具合を知りたいときに使われ、
漢字の通り、正規表現から「どのくらい尖っているのか?」を表します

式は歪度よりも複雑であり、以下。
$$ \frac{n(n+1)}{(n-1)(n-2)(n-3)}\sum_{i=1}^{n}(\frac{x_i - \bar{x}}{s})^4 - \frac{3(n-1)^2}{(n-2)(n-3)}$$
もしくは
$$ \frac{n\sum_{i=1}^{n} (x_i - \bar{x})^4}{(\sum_{i=1}^{n} (x_i - \bar{x})^2)^2}$$

マイナスもプラスも0もとります。

グラフに関してはわりとイメージしやすく、大きくなればなるほど尖った形状を表現します。
例えば、t分布などは自由度が大きくなるにつれて尖度が大きくなります。
スクリーンショット 2021-10-20 16.56.48.png

pythonでの歪度・尖度の実装

以前にkaggleでもちらっと見かけた記憶があるのですが、忘れたので自分で実装します。

ちなみに英語では歪度・尖度それぞれ「skewness」・「kurtosis」と言われ、投資でも「skew指数」とかで使われたりします
(オプションとかの話なので、内容の理解はしてないです)

簡単にirisのデータで見ていきます。
実はskew, kurt関数がpandas.DataFrameにはあるので、それ使うだけなんですよね。


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris


iris = load_iris()
data = pd.DataFrame(iris.data, columns=iris.feature_names)

# 描画準備
col = len(data.columns)
_, axes =  plt.subplots(1, col, figsize=(18, 5))

for i, var in enumerate(data.columns):
  sns.histplot(x=var, data=data, ax=axes[i], kde=True)
  axes[i].set_title('Skewness: {} \n Kurtosis: {}'.format(data[var].skew(), data[var].kurt()), fontsize=15)

plt.tight_layout()
plt.show()

スクリーンショット 2021-10-20 17.30.37.png

わかりやすくタイトルにそれぞれの指数を入れました。
確かに右に山があるとskewnessは負の値を取っていたり、尖っているものの尖度は他に比べ大きかったりと外観の理解はできたのではないでしょうか?

いろんなデータセットでも試してみるとおもしろいです!

終わり

ちょっと普段の機械学習では見かけないようなものと遭遇しましたので、書いておきました
またなんかあれば書きます!

参考にさせていただいた記事

https://bellcurve.jp/statistics/course/17950.html <- このサイトは神と思っている
pandasで歪度(Skewness)と尖度(Kurtosis)を計算

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3