#!/usr/bin/env python # coding: utf-8 # ### Семинар 5: проверка статистических гипотез # Загрузим таблицу с оценками студентов по разным курсам из csv-файла по ссылке (ФИО студентов зашифрованы): # In[1]: import pandas as pd # In[2]: df = pd.read_csv("http://math-info.hse.ru/f/2017-18/py-prog/scores2.csv") # Посмотрим на нее: # In[ ]: df # Удалим строки с пропущенными значениями: # In[3]: df = df.dropna() # Выведем общую информацию по датафрейму: # In[4]: df.info() # Выведем описательные статистики по всем количественным показателям в датафрейме: # In[5]: df.describe() # Попроверяем гипотезы на основе имеющихся данных – воспользуемся библиотекой `scipy`. # In[6]: from scipy import stats # **Гипотеза о равенстве среднего числу** # Проверим гипотезу о равенстве средней оценки студентов по экономике 6 на 5%-ном уровне значимости. # # $H_0: \mu_{econ} = 6$. # # Альтернатива в Python всегда двусторонняя (по умолчанию), то есть: # # $H_1: \mu_{econ} \ne 6$. # Давайте исходить из предположения, что выборка оценок по экономике взята из нормального распределения. Строго говоря, это не так, потому что шкала оценок – порядковая, и оценки принимают всего 10 значений (по факту, даже меньше, потому что оценки взяты из рейтинга после пересдач и оценок ниже 4 в базе нет). Давайте посмотрим на гистограмму для оценок по экономике: импортируем модуль `pyplot` из библиотеки для графики `matplotlib` и скажем Python выводить графики прямо в файле `.ipynb`, а не в отдельном окне (`% matplotlib inline`:) # In[7]: import matplotlib.pyplot as plt get_ipython().run_line_magic('', 'matplotlib inline') # In[8]: # hist - гистограмма df['econ'].plot('hist') # Если мы все же предположим, что распределение нормальное (просто выборка маленькая и по ней незаметно), мы сможем использовать критерий Стьюдента для одной выборки (*1-sample t-test*): # In[9]: stats.ttest_1samp(df['econ'], 6) # Уровень значимости мы приняли равным 5%, значит, $\alpha = 0.05$. # # p-value > $\alpha$, следовательно, на имеющихся данных на 5% уровне значимости нет оснований отвергнуть нулевую гипотезу в пользу альтернативы (это статистический вывод). Средняя оценка студентов по экономике равна 6 (это содержательный вывод). # Если бы мы проверяли гипотезу о равенстве средней оценке по экномике 5, ситуация была бы обратной, и нулевую гипотезу следовало бы отвергнуть: # In[10]: stats.ttest_1samp(df['econ'], 5) # Значит, разница всего в один балл является существенной для наших данных (несложно угадать, почему, если вспомнить, что 5 баллов – это «удовлетворительно», а 6 баллов – уже «хорошо»). # **Гипотеза о равенстве средних** # Сравним средние оценки юношей и девушек, сгруппировав строки по показателю `male`: # In[11]: groups = df.groupby('male') groups.mean() # Сохраним оценки по теории игр (`game`), сгруппированные по полу, в переменные `male_game` и `female_game`. # In[12]: male_game = df[df['male'] == 1]['game'] female_game = df[df['male'] == 0]['game'] # Проверим на 10%-ном уровне значимости гипотезу о равенстве средних оценок по теории игр у юношей и девушек (опять же в предположении о том, что обе выборки взяты из нормального распределения): # # $H_0: \mu_{male} = \mu_{female}$ # # $H_1: \mu_{male} \ne \mu_{female}$ (альтернативы в Python всегда двусторонние) # In[13]: # ind - потому что две выборки независимы stats.ttest_ind(female_game, male_game) # На имеющихся данных, на уровне значимости 10% (и на меньшем) нет оснований отвергнуть нулевую гипотезу. Средние оценки по теории игр у юношей и девушек можно считать равными. # Проделам то же с оценками по политической истории (`phist`): # In[14]: male_phist = df[df['male'] == 1]['phist'] female_phist = df[df['male'] == 0]['phist'] # In[15]: stats.ttest_ind(female_phist, male_phist) # Тут ситуация уже менее однозначная – все зависит от уровня значимости (подумайте, при каких уровнях значимости нулевая гипотеза будет отвергаться, а при каких – нет). # Точно так же можем сравнить оценки по разным курсам (в разных столбцах, например, по разным частям «Математики и статистики»). # In[16]: stats.ttest_ind(df.mstat, df.mstat2) # **Гипотеза о равенстве нулю коэффициента корреляции** # Немного визуализации # In[17]: from pandas.tools import plotting # Матрица диаграмм рассеяния для выбранных столбцов (как *scattermatrix* в R): # In[18]: get_ipython().run_line_magic('', 'matplotlib inline') plotting.scatter_matrix(df[['mstat', 'mstat2', 'econ', 'eng']]) # Коэффициенты корреляции # Оценим связь между оценками за курс «Математика и статистика 1» и «Математика и статистика 2». # # $H_0: \rho = 0$ (связи нет, коэффициент корреляции не является статистически значимым) # # $H_1: \rho \ne 0$ (связь есть, коэффцициент корреляции является статистически значимым) # In[19]: stats.pearsonr(df.mstat, df.mstat2) # коэффициент Пирсона # Интерпретация: связь прямая (положительная) и сильная, нулевая гипотеза о незначимости коэффициеинта корреляции отвергается (на любом конвенциональном уровне значимости), есть значимая связь между оценками по двум частям курса «Математика и статистика». # In[20]: stats.spearmanr(df.mstat, df.mstat2) # коэффициент Спирмена (более уместен здесь - шкала порядковая)