Определяем скосы в распределениях
Зачастую случайные величины распределены не симметрично и имеют скосы. Рассмотрим, как их правильно определять на примере следующего набора данных:
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 - отрицательно скошенный.