in Data Science

Шпаргалка по статистическому анализу

В этом посте я собрал самую нужную информацию, касающуюся базовых вещей, которые можно проанлизировать в наборе данных. Это касается сравнения средних, дисперсия, как между двумя группами, так и для большего числа.

Помимо этого стоит оценить удобную шпаргалку по анализу данных.

Статистические критерии для численных переменных

Если данные сгруппированны (например, уровень сахара в крови до приёма таблеток у одних и тех же людей, и после), то можно применять следущие критерии однородности средних:

pre = data[:,0]
post = data[:,1]
 
# парный Т-тест. Когда измеряется однородность средних в двух разных группах
t_statistic, p_value = stats.ttest_1samp(post - pre, 0)
 
# p < 0.05 => альтернативная гипотеза:
# средние не совпадают
print("paired t-test", p_value)
 
# Если предположение о нормальости распределения не выполняется или, например, 
# данные принадлежат упорядоченной шкале(!), то используем критерий Уилкоксона
z_statistic, p_value = stats.wilcoxon(post - pre)
print("paired wilcoxon-test", p_value)

Если данные никак не сгруппированы и между ними нет связи, но сравнить мат ожидания очень хочется, то можно это сделать следующим образом:

from numpy import genfromtxt, mean, std
import scipy.stats as stats
import matplotlib.pyplot as plt
    # Критерий Стьюдента для двух выборок
    # Нулевая гипотеза: мат ожидания для двух групп равны
    # Причём должно выполнится предположение о равной дисперсии
    # (способы проверки которого приведены ниже)
    # Это верно для независимых групп: например, результаты экзамена для мальчиков и девочек
    # И для зависимых групп: например, как один и тот же класс сдал 2 разных экзамена.
    t_statistic, p_value = stats.ttest_ind(group1, group2)
 
    # p_value < 0.05 => альтернативная гипотеза:
    # с 5% вероятностью ошибки первого рода у нас будет разное мат. ожидание
    print("two-sample t-test", p_value)
 
    # Если данные не распределены нормально, применяем критерий Манна-Уитни, также известный как 
    # Критерий Уилкоксона для двух выборок
    u, p_value = stats.mannwhitneyu(group1, group2)
    print("two-sample wilcoxon-test", p_value)
ANOVA

Теперь рассмотрим случай, когда выборок больше, чем 2.

group1 = data[data[:,1]==1,0]
    group2 = data[data[:,1]==2,0]
    group3 = data[data[:,1]==3,0]
 
    # Вначале проверяем, что дисперсия совпадает, при помощи критерия Левене
    (W,p) = stats.levene(group1, group2, group3)
    if p

Не отходя от кассы проверяем эквивалентность Т-критерия и ANOVA:

    # Рассчитываем значение F- и T- статистики ...
    F_statistic, pVal = stats.f_oneway(data['father'], data['m3other'])
    t_val, pVal_t = stats.ttest_ind(data['father'], data['mother'])
 
    # ... and show that t**2 = F
    print('\nT^2 == F: ------------------------------------------')
    print('From the t-test we get t^2={0:5.3f}, and from the F-test F={1:5.3f}'.format(t_val**2, F_statistic))
 
    # численное сравнение
    np.testing.assert_almost_equal(t_val**2, F_statistic)
Множественное сравнение

Нулевая гипотеза ANOVA предполагает, что мат. ожидания совпадают.

Однако сама по себе эта информация бесполезна. Поэтому нужно знать, для каких пар объектов гипотеза откланяется. При этом нужно провести серию сравнению по одному для каждой пары. Обычно для этого используется Т-критерий Стьюдента.

В итоге, приходится разбираться с проблемой множественных испытаний: необходимо компенсировать риск получения значимого результата, даже когда на самом деле нулевая гипотеза верна. Для этого необходимо корректировать вероятность p при помощи одного из следующих методов:

  • Tukey HSD
  • Бонферрони
  • Холмса
    from statsmodels.stats.multicomp import (pairwise_tukeyhsd,
                                             MultiComparison)
    from statsmodels.formula.api import ols
    from statsmodels.stats.anova import anova_lm
    # Вначале односторонняя ANOVA
    df = pd.DataFrame(dta2)
    model = ols('StressReduction ~ C(Treatment)',df).fit()
 
    anovaResults =  anova_lm(model)
    print(anovaResults)
    if anovaResults['PR(>F)'][0] < 0.05:
        print('One of the groups is different.')
 
    #Множественная проверка
    mod = MultiComparison(dta2['StressReduction'], dta2['Treatment'])
    print(mod.tukeyhsd().summary())
 
    # Синтаксический синоним:
    res2 = pairwise_tukeyhsd(dta2['StressReduction'], dta2['Treatment'])
    #print res2[0]
 
    # Вывод названий групп:
    print(mod.groupsunique)
 
    # Вместо использования Tukey HSD, можно использовать парный критерий Стьюдента
    # Предварительно скорректировав при помощи метода Холма
    rtp = mod.allpairtest(stats.ttest_rel, method='Holm')
    print(rtp[0])
 
    # И метода Бонферрони
    print(mod.allpairtest(stats.ttest_rel, method='b')[0])
 
    # При использовании этого подхода на каждом шаге вычисляется отклонение.
    # При этом чтобы получить общую дисперсию, нужно использовать несколько хаков
    # которые если что валяются тут:
    # (http://jpktd.blogspot.co.at/2013/03/multiple-comparison-and-tukey-hsd-or_25.html)
    res2 = pairwise_tukeyhsd(dta2['StressReduction'], dta2['Treatment'])
    studentized_mean = res2.meandiffs
    studentized_variance = res2.variance
 
    t_stat = (studentized_mean / studentized_variance) / np.sqrt(2)
    dof = len(dta2) - len(mod.groupsunique)
    my_pvalues = stats.t.sf(np.abs(t_stat), dof) * 2  # two-sided
 
    # и вывод результатов с коррекцией Бонферрони
    from statsmodels.stats.multitest import multipletests
    res_b = multipletests(my_pvalues, method='b')
Критерий Крускала-Уаллиса

Этот критерий используется, если мы сравниванием между собой больше чем 3 группы, законы распределения которых отличаются от нормального. Синтаксис:

from scipy.stats.mstats import kruskalwallis
    # Применение критерия Крускала-Уаллиса
    h, p = kruskalwallis(city1, city2, city3, city4)
 
    # Вывод
    if p

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

С этой шкалой переменных всё очень просто. Напомню, что порядковыми называются те переменные, для которых задано отношение порядка, но их нельзя сравнивать между собой количественно. Например, “Хорошо” и “Отлично”. Ясно, что “Отлично” по шкале будет стоять выше, чем “Хорошо”, но вот насколько: в 2 или в 3 раза сказать нельзя.

Для анализа двух ранжированных групп чаще всего используется критерий Манна-Уитни.

Для анализа трёх и более групп используется критерий Крускала-Уаллеса.

    n = 235
    p = 1/6.
 
    # Вероятность того, что мы получим не меньше чем checkVal количество "6"
    bd = stats.binom(n,p)
    p_oneTail = bd.sf(checkVal-1) 
 
    # Вероятность случаного выпадения 6, или большего значения.
    p_twoTail = stats.binom_test(checkVal, n, p)

С помощью этого кода можно, например определить, вероятность того, что не меньше чем 60% клиентов останутся довольны сервисом, а также можно посчитать вероятность того, что сервис их просто удолетворяет.

Статистические критерии для категориальных переменых

Наиболее часто используются критерии типа хи-квадрат, которые применяются для проверки принадлежности к одному распределению и критерий Фишера, который определяет тоже самое, но является более частоупотребимым, особенно на маленьких выборках

# Enter the data
    obs = np.array([[1,5], [8,2]])

    #Вот так вот считается критерий Фишера
    fisher_result = stats.fisher_exact(obs)

    print('\nFISHER --------------------------------------------------------')
    print(('The probability of obtaining a distribution at least as extreme '
    + 'as the one that was actually observed, assuming that the null ' +
    'hypothesis is true, is: {0:5.3f}.'.format(fisher_result[1])))

Проверка корреляции

А проверить корреляцию можно при помощи критерией Пирсона, Спирмана и Кендала, которые также реализованы в SciPy:

    # Данные
    x = data[:,0]
    y = data[:,1]
 
    # 3 различных способа подсчитать корреляцию
    corr = {}
    corr['pearson'], _ = stats.pearsonr(x,y)
    corr['spearman'], _ = stats.spearmanr(x,y)
    corr['kendall'], _ = stats.kendalltau(x,y)
Характеристики

Переменная отклика

Категориальная Численная
Категориальные Хи-квадрат, Логистическая регрессия t-критерий, ANOVA (Analysis
of Varirance), Линейная регрессия
Численные Логистическая регрессия Линейная регрессия, Коэффициент корреляции Пирсоа
Категориальные и численные Логистическая регрессия Линейная регрессия, Ковариационный анализ

Хи-квадрат

Критерий Хи-квадрат используется тогда, когда анализируются категориальные переменные (ответы “да”/”скорее всего нет” и подобные). Этот критерий можо применять какждый раз, когда используется кросс-таб, для того, чтобы узнать статистическую занчимость связи между категориальным откликом (например, человек является покупателем марки) и характеристикой (например, человек является женщиной).

ANOVA (Analysis of Variance)

ANOVA используется для анализа влияния факторных переменных на количественную зависимую. По сути дела, позволяет сравнить между собой мат. ожидание для различных групп данных, которые как раз и задаются факторной переменной. Также можно использовать для подтверждения гипотезы о том, что отклонение от среднего значения не отличается внутри групп от среднего по выборке.

Односторонняя ANOVA. Позволяет проанализировать отклонение численной зависимой переменной, основываясь на одной факторной независимой. Используется для проверки гипотезы о том, что несколько мат. ожиданий равны и является продолжением двух-выборочного Т-критерия.

Двухсторонняя ANOVA (Analysis of Covariance с применением функции GLM). Факторная переменная делит выборку на некоторые группы. Используя Обшую Линейную Модель, можно проверить нулевую гипотезу о том, что другие переменные не влияют на мат. ожидание зависимой переменной. Также при помощи этого инструмента можно исследовать влияние факторов на зависимую переменную и понять, насколько они влияют на неё.

Линейная регрессия

Линейная регрессия используется для того, чтобы попытаться понять зависимость между переменными и откликом и получить в результате набор кэффициентов, который позволяют вычислить значение отклика по новым данным.

Коэффициент корреляции Пирсона

Эта статистика используется для того, чтобы установить наличие или отсутствие линейной зависимости между входной и выходной переменных. При этом в случае наличия нелинейной зависимости, результат всё равно будет отрицательным. Поэтому необходимо также анализировать и графики, чтобы понять наличие связи между откликом и незаисимыми переменными.

Т-критерий Стьюдента

Т-критерий Стьюдента использоуется для сравнение мат ожиданий между двумя выборками. Нулевая гипотеза предполагает отсутствие различий. При этом необходимо понимать, что результатом является p-value, которое определяет вероятность достоверности результат, т.е. вероятность верности нулевой гипотезы.

Помимо этого, приведём таблицу наиболее часто применяемых критериев, которые ещё зависят от количества сравниваемых выборок:

 Сравниваемые группы Независимые выборки Зависимые выборки
Выборки номинальных (категориальных) переменных
2 и более Критерий Фишера или критерий Хи-квадрат Критерий МакНемара
Выборки ординальных (упорядоченных) переменных
2 Критерий Манна-Уитни Критерий Уилкоксона
3 и более Критерий Крускала-Валлиса Критерий Фридмана
Выборки численных переменных
2 Критерий Стьюдента и Манна-Уитни Групповой критерий Стьюдента или Уилкоксона
3 и более ANOVA или критерий Крускала-Валлиса Критерий Фридмана или ANOVA для повторяющихся измерений

Список статистических критериев, разбитый по целям применения

Критерии однородности

Эти критерии используются для проверки гипотезы на принадлежность одному и тому же распределению (значит что происходящие процессы имеют схожую природу)

  • Критерий Смирнова
  • Критерий однородности Лемана-Розенблатта. Этот критерий мощнее, кроме тех случаев, когда законы близки.

Эти критерии не способны различать близкие конкурирующие гипотезы при малых объёмах выборок.

Критерии согласия

Параметрические:

  • Хи квадрат Пирсона
  • Критерий отношения правдоподобия (для простых и сложных гипотез)

Непараметрические:

  • Критерий Колмагорова
  • Критерий Смирнова
  • Критерий w^2

Нельзя сравнивтаь близкие законы при малых объёмах выборок.

Мощность критериев при

  • Простой гипотезе: Хи-квадрат > Андерсона Дарлинга > w^2 Мизеса > Колмогорова
  • Сложной гипотезе: Андерсона Дарлинга > w^2 Мизеса > Хи-квадрат Пирсона > Колмогорова
  • При близких гипотезах: Андерсона Дарлигна > w^2 Мизеса

Критерии проверки отклонения распределения

  • Критерий проверки на симметричность
  • Критерий проверки на эксцсс
  • Критерий Шапиро-Уилка
  • Критерий Эпса-Палли
  • Критерий Гири
  • Критерий Шпигельхальтера
  • Критерий D’Агостиньо

Эти критерии справляются лучше с проверкой на нормальность, чем критерии согласия при малых объёмах выборок.

Самый лучший из них: критерий D’Агостиньо.

Критерии проверки однородности средних

  • Критерий Стьюдента (Т-тест) используется при неизвестных, но равных дисперсиях и при соблюдения нормального распределения.
  • F-критерий, используется при неизвестных и различных дисперсиях, при соблюдении гипотезы о нормальности распределения.
  • Критерий Манна-Уитни, Уилкоксона, Краскера-Уолласа.

Критерии проверки однородности дисперсий

Фишера, Бартлета, Кокрена, Хартли.

Основной плюс непараметрических критериев: можно нарушать предположение о нормальности, но при этом должны быть равны средние и выборки должныть быть одинаково распределены.

Критерии проверки гипотез независимости и отсутствия тренда

  • Критерий Аббе. Проверяет выборки с равными мат. ожиданиями на отсутствие систематических изменений.
  • Критерий автокорреляции. Если выборка не случайна, то значение каждого элемента не должно зависеть от соседних величин.
  • Ранговый критерий обнаружения сдвига дисперсии в неизвестной точке.

Мощность критериев: Аббе > Кокса-Стюарта > Бартлета > автокорреляции > Фостера-Стбюарта

 Полезные ссылки:

Статистические тесты в R. Тесты качественных данных

Статистические тесты в R: Тесты количественных данных

Другие статьи по работе с данными в Python

Манипуляция и обработка данных в Python (Data wrangling and munging)

Анализ данных при помощи Python. Основные статистики и обзор данных (Exploratory Analysis)

Анализ данных при помощи Python. Основные статистики и обзор данных (Exploratory Analysis) часть 2

Анализ данных при помощи Python. Графики в pandas и matplotlib.