September 8, 2022

Определяем скосы в распределениях

Зачастую случайные величины распределены не симметрично и имеют скосы. Рассмотрим, как их правильно определять на примере следующего набора данных:

import pandas as pd
import numpy as np

np.random.seed(0)
ser = pd.Series(np.random.normal(10, 2, size=100))
ser.iloc[range(int(ser.shape[0]*0.6), ser.shape[0])] = ser.iloc[range(int(ser.shape[0]*0.6), ser.shape[0])]**1.2

Если построить график плотности распределения, можно заметить, что оно скошено вправо (положительный скос):

ser.plot.kde()

Также для визуального определения скоса информативна диаграмма размаха (видно, что большие значения находятся выше медианы):

ser.plot.box()

Для установления факта скоса проще всего посчитать разность среднего и медианы. Если она положительна, то скос положительный, если отрицательна, то и скос отрицательный:

ser.mean() - ser.median(), ser.median(), ser.mean()

Факт скоса и его степень также устанавливаются специальным коэффициентом асимметрии (skewness):

ser.shape[0]/((ser.shape[0]-1)* (ser.shape[0]-2))*((ser - ser.mean())**3).sum()\
                                                            /ser.std(ddof=1)**3

еще проще посчитать с помощью метода skew:

ser.skew()

Если коэффициент асимметрии больше 0, то датасет положительно скошенный, меньше 0 - отрицательно скошенный.