{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Когнитивные технологии\n", "\n", "*Алла Тамбовцева*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Библиотека `scipy` для статистики" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Библиотека `scipy` (сокращение от *scientific Python*) включает в себя разные модули, позволяющие выполнять научные расчеты, решать задачи оптимизации, генерировать выборки из (псевдо)случайных величин с заданными параметрами, реализовывать статистические тесты и создавать статистические модели." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Импортируем библиотеку `pandas` и модуль `stats` из библиотеки `scipy`. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "import scipy.stats as st\n", "import pandas as pd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Загрузим базу данных (датафрейм) из csv-файла. Описание данных см.[здесь](https://vincentarelbundock.github.io/Rdatasets/doc/datasets/swiss.html)." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv('https://raw.githubusercontent.com/allatambov/Py-programming-3/master/add/swiss.csv')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0FertilityAgricultureExaminationEducationCatholicInfant.Mortality
0Courtelary80.217.015129.9622.2
1Delemont83.145.16984.8422.2
2Franches-Mnt92.539.75593.4020.2
3Moutier85.836.512733.7720.3
4Neuveville76.943.517155.1620.6
\n", "
" ], "text/plain": [ " Unnamed: 0 Fertility Agriculture Examination Education Catholic \\\n", "0 Courtelary 80.2 17.0 15 12 9.96 \n", "1 Delemont 83.1 45.1 6 9 84.84 \n", "2 Franches-Mnt 92.5 39.7 5 5 93.40 \n", "3 Moutier 85.8 36.5 12 7 33.77 \n", "4 Neuveville 76.9 43.5 17 15 5.16 \n", "\n", " Infant.Mortality \n", "0 22.2 \n", "1 22.2 \n", "2 20.2 \n", "3 20.3 \n", "4 20.6 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Далее мы попробуем реализовать различные статистические тесты (применить статистические критерии) для сравнения средних значений или распределений в двух выборках.\n", "\n", "Предположим, что нам необходимо сравнить средние значения уровня детской смертности в кантонах Швейцарии, где преобладает католическое население и где преобладает протестантское население. Сформируем две выборки на основе имеющихся данных: выберем соответствующие строки в таблице и возьмем столбец `Infant.Mortality`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0FertilityAgricultureExaminationEducationCatholicInfant.Mortality
1Delemont83.145.16984.8422.2
2Franches-Mnt92.539.75593.4020.2
5Porrentruy76.135.39790.5726.6
6Broye83.870.216792.8523.6
7Glane92.467.814897.1624.9
8Gruyere82.453.312797.6721.0
9Sarine82.945.2161391.3824.4
10Veveyse87.164.514698.6124.5
30Conthey75.585.93299.7115.1
31Entremont69.384.97699.6819.8
32Herens77.389.752100.0018.3
33Martigwy70.578.212698.9619.4
34Monthey79.464.97398.2220.2
35St Maurice65.075.99999.0617.8
36Sierre92.284.63399.4616.3
37Sion79.363.1131396.8318.1
45Rive Droite44.746.6162950.4318.2
46Rive Gauche42.827.7222958.3319.3
\n", "
" ], "text/plain": [ " Unnamed: 0 Fertility Agriculture Examination Education Catholic \\\n", "1 Delemont 83.1 45.1 6 9 84.84 \n", "2 Franches-Mnt 92.5 39.7 5 5 93.40 \n", "5 Porrentruy 76.1 35.3 9 7 90.57 \n", "6 Broye 83.8 70.2 16 7 92.85 \n", "7 Glane 92.4 67.8 14 8 97.16 \n", "8 Gruyere 82.4 53.3 12 7 97.67 \n", "9 Sarine 82.9 45.2 16 13 91.38 \n", "10 Veveyse 87.1 64.5 14 6 98.61 \n", "30 Conthey 75.5 85.9 3 2 99.71 \n", "31 Entremont 69.3 84.9 7 6 99.68 \n", "32 Herens 77.3 89.7 5 2 100.00 \n", "33 Martigwy 70.5 78.2 12 6 98.96 \n", "34 Monthey 79.4 64.9 7 3 98.22 \n", "35 St Maurice 65.0 75.9 9 9 99.06 \n", "36 Sierre 92.2 84.6 3 3 99.46 \n", "37 Sion 79.3 63.1 13 13 96.83 \n", "45 Rive Droite 44.7 46.6 16 29 50.43 \n", "46 Rive Gauche 42.8 27.7 22 29 58.33 \n", "\n", " Infant.Mortality \n", "1 22.2 \n", "2 20.2 \n", "5 26.6 \n", "6 23.6 \n", "7 24.9 \n", "8 21.0 \n", "9 24.4 \n", "10 24.5 \n", "30 15.1 \n", "31 19.8 \n", "32 18.3 \n", "33 19.4 \n", "34 20.2 \n", "35 17.8 \n", "36 16.3 \n", "37 18.1 \n", "45 18.2 \n", "46 19.3 " ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.Catholic > 50] # для иллюстрации" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 22.2\n", "2 20.2\n", "5 26.6\n", "6 23.6\n", "7 24.9\n", "8 21.0\n", "9 24.4\n", "10 24.5\n", "30 15.1\n", "31 19.8\n", "32 18.3\n", "33 19.4\n", "34 20.2\n", "35 17.8\n", "36 16.3\n", "37 18.1\n", "45 18.2\n", "46 19.3\n", "Name: Infant.Mortality, dtype: float64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sample1 = df[df.Catholic > 50][\"Infant.Mortality\"] # выборка 1\n", "sample1" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 22.2\n", "3 20.3\n", "4 20.6\n", "11 16.5\n", "12 19.1\n", "13 22.7\n", "14 18.7\n", "15 21.2\n", "16 20.0\n", "17 20.2\n", "18 10.8\n", "19 20.0\n", "20 18.0\n", "21 22.4\n", "22 16.7\n", "23 15.3\n", "24 21.0\n", "25 23.8\n", "26 18.0\n", "27 16.3\n", "28 20.9\n", "29 22.5\n", "38 20.3\n", "39 20.5\n", "40 18.9\n", "41 23.0\n", "42 20.0\n", "43 19.5\n", "44 18.0\n", "Name: Infant.Mortality, dtype: float64" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sample2 = df[df.Catholic <= 50][\"Infant.Mortality\"] # выборка 2\n", "sample2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь приступим к формальной проверке гипотез." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### T-test (критерий Стьюдента для двух выборок)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "T-test используется для сравнения средних значений двух генеральных совокупностей в предположении, что обе выборки взяты из нормального распределения. Существует две разновидности t-теста: t-тест для независимых выборок и t-тест для связных (парных) выборок. В связных выборках объекты связаны друг с другом. Пример связных выборок: значения уровня смертности в одних и тех же кантонах до и после какой-нибудь реформы)\n", "\n", "*Нулевая гипотеза:* средние значения двух генеральных совокупностей, откуда взяты выборки, равны, то есть $H_0: a_1=a_2$.\n", "\n", "*Альтернативная гипотеза:* средние значения двух генеральных совокупностей не равны, то есть: $H_1: a_1 \\ne a_2$\n", "\n", "В `stats` в t-тесте в качестве альтернативной гипотезы используется двусторонняя альтернатива (средние *не равны*) и всегда выводится соответствующее p-value (*two-tailed*). То же будет характерно для всех последующих тестов. Так как наши выборки независимы, нам нужна функция `ttest_ind()`, от *independent*." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Ttest_indResult(statistic=1.1297965130690064, pvalue=0.26454837328688746)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st.ttest_ind(sample1, sample2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Что возвращает эта функция? Наблюдаемое значение t-статистики и p-value. Результат понятный, только более лакончиный по сравнению с тем, что выводит R и другие статистические пакеты.\n", "\n", "*Выводы:* так как p-value больше любого конвенционального уровня значимости (1%, 5%, 10%), на имеющихся данных на любом разумном уровне значимости нет оснований отвергнуть нулевую гипотезу. Средний уровень детской смертности в католических и протестантских районах можно считать одинаковым." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "По умолчанию считается, что дисперсии генеральных овокупностей равны. Часто это бывает не так, и такое предположение без формальной проверки и без содержательных соображений может казаться нереалистичным. Если мы предполагаем, что дисперсии генеральных совокупностей не равны, то это можно учесть, добавив аргумент `equal_var`:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Ttest_indResult(statistic=1.0863471703503398, pvalue=0.28551301767919196)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st.ttest_ind(sample1, sample2, equal_var = False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Принципиальных отличий в данном случае в результатах не наблюдается. А формально проверить гипотезу о равенстве дисперсий двух генеральных совокупностей (которые описываются двумя случайными величинами) можно с помощью F-критерия.\n", "\n", "*Нулевая гипотеза:* дисперсии двух генеральных совокупностей равны, то есть $H_0: \\sigma_1^2 = \\sigma_2^2$\n", "\n", "*Альтернативная гипотеза:* дисперсии двух генеральных совокупностей не равны, то есть $H_1: \\sigma_1^2 \\ne \\sigma_2^2$.\n", "\n", "Реализовать F-тест, который нам нужен именно для этого случая, в Python сразу не получится: встроенная функция `f_oneway()` используется для однофакторного дисперсионного анализа (ANOVA), речь о котором пойдёт далее. Можно попробовать реализовать этот тест «вручную», рассчитав частное выборочных дисперсий и поработав с F-распределением, но давайте пойдём другим путём и воспользуемся другими критериями для сравнения дисперсий, которые явно встроены в Python.\n", "\n", "Например, тест Левена:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "LeveneResult(statistic=1.0380526498527436, pvalue=0.3137214012581385)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st.levene(sample1, sample2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "На любом разумном уровне значимости нет оснований отвергнуть нулевую гипотезу о равенстве дисперсий." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Wilcoxon test & Mann-Whitney test (две выборки)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если мы не можем считать распределение генеральных совокупностей, откуда взяты выборки, нормальным, то следует использовать методы, основанные не на самих наблюдениях в выборках, а на их рангах. Для сравнения распределений (иногда речь идет о сравнении медиан) используются тесты Уилкоксона и Манна-Уитни. Начнем с теста Уилкоксона (не проверяем, является ли распределение данных нормальным, просто для примера используем те же выборки)." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "Unequal N in wilcoxon. Aborting.", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mst\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwilcoxon\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msample1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msample2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/scipy/stats/morestats.py\u001b[0m in \u001b[0;36mwilcoxon\u001b[0;34m(x, y, zero_method, correction)\u001b[0m\n\u001b[1;32m 2374\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmap\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0masarray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2375\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0my\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2376\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mValueError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Unequal N in wilcoxon. Aborting.'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2377\u001b[0m \u001b[0md\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mx\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0my\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2378\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mValueError\u001b[0m: Unequal N in wilcoxon. Aborting." ] } ], "source": [ "st.wilcoxon(sample1, sample2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Неудача! Проблема в том, что реализация критерия Уилкоксона в `stats` требует, чтобы выборки были одинакового размера. Но это ограничение можно обойти, просто выбрав другой критерий – критерий Манна-Уитни, который используется для аналогичных задач. \n", "\n", "*Нулевая гипотеза:* выборки взяты из одного и того же распределения, то есть $H_0: F(x) = G(x)$\n", "\n", "*Альтернативная гипотеза:* выборки взяты из разных распределений, то есть $H_1: F(x) \\ne G(x)$." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "MannwhitneyuResult(statistic=235.5, pvalue=0.2920645577220585)" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st.mannwhitneyu(sample1, sample2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Опять же, на имеющихся данных на любом уровне значимости нет оснований отвергнуть нулевую гипотезу. Выборки взяты из одного и того же распределения." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ANOVA" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Если выборок больше, чем две, то использовать указанные выше критерии нельзя. В предположении, что все выборки взяты из нормального распределения, для сравнения средних значений более чем в двух группах используется однофакторный дисперсионный анализ (ANOVA, *analysis of variance*). \n", "\n", "*Нулевая гипотеза*: средние значения по всем $k$ группам (во всех генеральных совокупностях) равны, то есть $H_0: a_1 = a_2 = \\dots = a_k$\n", "\n", "*Альтернативная гипотеза*: средние значения по всем группам (во всех генеральных совокупностях) не равны.\n", "\n", "Чтобы не создавать искусственные группы на основе данных в *swiss*, загрузим таблицу с весами цыплят, которых кормили разным кормом :) Описание см. [здесь](https://vincentarelbundock.github.io/Rdatasets/doc/datasets/chickwts.html)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "dat = pd.read_csv('https://raw.githubusercontent.com/allatambov/Py-programming-3/master/add/chickwts.csv')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0weightfeed
01179horsebean
12160horsebean
23136horsebean
34227horsebean
45217horsebean
\n", "
" ], "text/plain": [ " Unnamed: 0 weight feed\n", "0 1 179 horsebean\n", "1 2 160 horsebean\n", "2 3 136 horsebean\n", "3 4 227 horsebean\n", "4 5 217 horsebean" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dat.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Задание:** разбить датафрейм на группы с помощью `groupby` по переменной `feed` и сохранить значения `weight` в словарь." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Решение:*" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "wgt = {}\n", "for name, d in dat.groupby('feed'):\n", " wgt[name] = d.weight" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'casein': 59 368\n", " 60 390\n", " 61 379\n", " 62 260\n", " 63 404\n", " 64 318\n", " 65 352\n", " 66 359\n", " 67 216\n", " 68 222\n", " 69 283\n", " 70 332\n", " Name: weight, dtype: int64, 'horsebean': 0 179\n", " 1 160\n", " 2 136\n", " 3 227\n", " 4 217\n", " 5 168\n", " 6 108\n", " 7 124\n", " 8 143\n", " 9 140\n", " Name: weight, dtype: int64, 'linseed': 10 309\n", " 11 229\n", " 12 181\n", " 13 141\n", " 14 260\n", " 15 203\n", " 16 148\n", " 17 169\n", " 18 213\n", " 19 257\n", " 20 244\n", " 21 271\n", " Name: weight, dtype: int64, 'meatmeal': 48 325\n", " 49 257\n", " 50 303\n", " 51 315\n", " 52 380\n", " 53 153\n", " 54 263\n", " 55 242\n", " 56 206\n", " 57 344\n", " 58 258\n", " Name: weight, dtype: int64, 'soybean': 22 243\n", " 23 230\n", " 24 248\n", " 25 327\n", " 26 329\n", " 27 250\n", " 28 193\n", " 29 271\n", " 30 316\n", " 31 267\n", " 32 199\n", " 33 171\n", " 34 158\n", " 35 248\n", " Name: weight, dtype: int64, 'sunflower': 36 423\n", " 37 340\n", " 38 392\n", " 39 339\n", " 40 341\n", " 41 226\n", " 42 320\n", " 43 295\n", " 44 334\n", " 45 322\n", " 46 297\n", " 47 318\n", " Name: weight, dtype: int64}" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "wgt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Теперь ANOVA (`f_oneway` от *One-Way ANOVA*):" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "F_onewayResult(statistic=15.364799774712534, pvalue=5.936419853471331e-10)" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st.f_oneway(wgt['casein'], wgt['horsebean'], wgt['linseed'], wgt['meatmeal'], wgt['soybean'], wgt['sunflower'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Функция возвращает наблюдаемое значение F-статистики и p-value. В данном случае p-value близко к 0, поэтому гипотезу о равенстве средних генеральных совокупностей по группам можно отвергнуть на 1% уровне значимости. Средний вес цыплят, которых кормили разным кормом, отличается (ещё бы, *horsebean* или *sunflower*!)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Kruskal-Wallis test" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Критерий Краскела-Уоллиса используется, когда нам необходимо сравнить распределения более, чем в двух группах в предположении, что выборки взяты не из нормального распределения (распределения неизвестны). \n", "\n", "*Нулевая гипотеза*: выборки взяты из одного и того же распределения, то есть: $H_0: F(x) = G(x) = \\dots = H(x)$\n", "\n", "*Альтернативная гипотеза*: выборки взяты из разных распределений." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "KruskalResult(statistic=37.34271769425624, pvalue=5.112829511937094e-07)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "st.kruskal(wgt['casein'], wgt['horsebean'], wgt['linseed'], wgt['meatmeal'], wgt['soybean'], wgt['sunflower'])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.5" } }, "nbformat": 4, "nbformat_minor": 2 }