February 4, 2021

Проверка математических гипотез

Рассмотрим сценарий проведения в период протестов в Белоруссии  социологического опроса с участием 400 граждан. Из них 215 ответили положительно на вопрос о поддержке действующего Президента, а 185 - отрицательно. После  опроса сторонники власти заявляют о том, что большая часть населения -  на стороне главы государства, а их оппоненты  настаивают на  статистической незначимости перевеса. Как проверить, кто из них прав,  используя инструментарий теории вероятностей и математической  статистики?

Немного отвлечемся и представим данные в пригодном для анализа виде. Итак, наш  опрос можно рассматривать как серию из 400 испытаний, в каждом из  которых фигурирует независимая от остальных и одинаково распределенная с  ними случайная величина Zi, принимающая значение 1 (человек высказался в  поддержку А. Лукашенко) или 0 (против) с вероятностями p и (1-p). В  теории вероятностей это называют схемой испытаний Бернулли, при этом  верно, что математическое ожидание каждого эксперимента m=p, а дисперсия  var= p*(1-p) (подробнее об этих понятиях написано здесь).

Следующим трюком является формулирование ряда свойств, характерных для больших выборок:

  • среднее  количество, высказавшихся в поддержку - 215/400 - это состоятельная и  несмещенная оценка  вероятности поддержки Президента p;
  • распределение  случайной величины Zср равной сумме Zi, деленной на их количество n  (выборочное среднее), имеет нормальный вид с математическим ожиданием   m_ср = m и дисперсией var_ср = var/n (следует из центральной предельной  теоремы и некоторых других свойств, подробнее читай здесь и здесь).

Напомню,  что нормальное распределение имеет следующий колоколообразный вид (на  графике основная доля значений случайной величины сосредоточена вокруг  6, а вероятности остальных убывают по мере удаления от 6):

Изюминкой второго свойства является тот факт, что независимо от закона исходных  распределений при их большом количестве среднее от суммы распределено  нормально. Для графического подтверждения этого свойства можно задать  произвольное распределение, например, равномерное на отрезке 0.3-0.7  (среднее = 0.5, дисперсия = 0.013):

Теперь отобразим график среднего от суммы из 400 таких распределений (для 1000 точек):

Как мы и могли ожидать, оно имеет нормальное распределение со средним 0.5 и дисперсией 3.22e-05 (~= 0.013/400).

Зададим другое изначальное распределение, например, экспоненциальное с параметром 2 (среднее = 0.5, дисперсия = 0.25)

Теперь отобразим график среднего от суммы из 400 таких распределений (для 1000 точек):

Опять распределение  имеет нормальный вид со средним 0.5 и дисперсией 0.0006 (~= 0.25/400).

Таким  образом, можно полагать, что доля поддерживающих президента лиц имеет  нормальное распределение со средним m_ср=p=215/400=0.5375 и дисперсией  var_ср=p*(1-p)/n=0.0006.

Для проверки гипотезы о том, что истинная p=0.5 (соответственно, перевес в нескольких поддержавших статистически не значим):

  • принимается уровень значимости (5% или 1%), вероятность  наблюдаемых данных ниже которого приводит к отклонению гипотезы;
  • составляется  случайная величина Z_ст = (Zср - p)/√var_ср,  которая должна быть  распределена нормально со средним 0 и стандартным отклонением 1 (мы  фактически нормировали нашу величину, так как отняли математическое  ожидание и разделили на стандартное отклонение - √var_ср)
  • проверяется  вероятность получения выборочного среднего Zср на таком же или большем  расстоянии от p чем  m_ср. Эта вероятность эквивалентна вероятности  |(Zср - p)/√var_ср| > |(m_ср - p)/√var_ср| и равна 2*F(-|m_ср -  p)/√var_ср|), где  F - кумулятивная функция  стандартного нормального  распределения (Z_ст).

Подсчитам  t = (m_ср - p)/√var_ср ( t -статистика) = 1.53, следовательно,  2*F(-1.53) = 2*0.063 = 0.13. Так как получившееся значение >0.05,  гипотеза о том, что истинная вероятность поддержки Президента Белоруссии  равна 0.5, не отклоняется.

Таким образом, перевес количества поддерживающих Президента лиц признается статистически не значимым на критическом уровне 0.05.

Ниже представляю код на языке Python для получения вышеуказанных графиков:

import scipy.stats as stats
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

SMALL_SIZE = 12
MEDIUM_SIZE = 14
BIGGER_SIZE = 18

plt.rc('font', size=MEDIUM_SIZE)          # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE)     # fontsize of the axes title
plt.rc('axes', labelsize=MEDIUM_SIZE)    # fontsize of the x and y labels
plt.rc('xtick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('ytick', labelsize=SMALL_SIZE)    # fontsize of the tick labels
plt.rc('legend', fontsize=SMALL_SIZE)    # legend fontsize
plt.rc('figure', titlesize=BIGGER_SIZE)  # fontsize of the figure title

if __name__=='__main__':  

   x = np.linspace(0,3,1000)
   distr = stats.expon(scale=1./2)

# distr = stats.uniform(loc = 0.3, scale = 0.4)
# x = np.linspace(0.3,0.7,1000)

   plt.plot(x,distr.pdf(x))
   mean, var, skew, kurt = distr.stats(moments='mvsk')

   n_distr = 400
   n_point_new = 1000            
   distr_whole = [[distr.rvs() for _ in range(n_point_new)] for _ in range(n_distr)]
   df = pd.DataFrame(distr_whole)
   means = df.mean(axis=0)

   sns.kdeplot(means)

   means.var()