Подробный практический гайд по статистике на Python

Этот практический гайд по статистике на Python — ваш надёжный проводник в мир анализа, визуализации и интерпретации данных. От простых описательных показателей до регрессий и временных рядов — с примерами, кодом и реальными задачами. Всё, что нужно, чтобы уверенно применять статистику на практике.

MachineLearning – в нашем телеграм канале, мы показываем на примере как использовать  AI, который может генерировать готовые проекты, код, разбираем все что нужно знать в области ИИ.
🔝 А здесь мы собрали целую кладезь полезных ИИ ресурсов для прокачки навыков https://t.me/addlist/2Ls

Поехали!

1. Описательная статистика

Краткая теория. Описательная статистика занимается суммарным описанием и представлением свойств набора данных. Основные показатели включают меры центральной тенденции (например, среднее, медиана, мода) и меры разброса (дисперсия, стандартное отклонение, диапазон, квантили). Среднее арифметическое отражает «типичное» значение набора данных, но чувствительно к выбросам (не робастно), тогда как медиана – центральное значение – более устойчива к экстремальным значениям. Дисперсия и стандартное отклонение характеризуют разброс данных вокруг среднего: стандартное отклонение – это среднее отклонение наблюдений от среднего значения. Для наглядности данных используются таблицы и графики (гистограммы, коробчатые диаграммы и т.д.), которые помогают выявить распределение и аномальные значения. 

Инструменты Python. В Python описательную статистику удобно рассчитывать с помощью библиотек NumPy и pandas. NumPy предоставляет функции для вычисления среднего np.mean(), медианы np.median(), стандартного отклонения np.std() и др. Библиотека pandas позволяет быстро получать основные статистики методом DataFrame.describe(), который выводит количество наблюдений, среднее, стандартное отклонение, минимальное и максимальное значения, квартили и медиану. Также существует модуль statistics в стандартной библиотеке (например, statistics.meanstatistics.median). Для визуализации распределения данных часто используются Matplotlib и Seaborn: гистограммы (plt.hist или seaborn.histplot) показывают форму распределения, а коробчатые диаграммы (plt.boxplot или seaborn.boxplot) отображают медиану, квартили и возможные выбросы. 

Практический пример (описание данных). Предположим, у нас есть выборка доходов 200 людей (в тыс. у.е.). Рассчитаем для нее основные описательные статистики с помощью pandas и numpy: среднее, медиану, стандартное отклонение, а также выведем описательную сводку и построим гистограмму распределения:

import numpy as np
import pandas as pd

# Сгенерируем выборку доходов (логнормальное распределение для наглядности)
np.random.seed(42)
income = np.random.lognormal(mean=3.0, sigma=0.7, size=200)  # модель распределения доходов
# Рассчитаем описательные статистики
mean_val = np.mean(income)
median_val = np.median(income)
std_val = np.std(income, ddof=0)
print(f"Средний доход: {mean_val:.2f} тыс. у.е.")
print(f"Медианный доход: {median_val:.2f} тыс. у.е.")
print(f"Стандартное отклонение: {std_val:.2f} тыс. у.е.")

# Описательная сводка через pandas
df = pd.DataFrame({'Доход': income})
print(df['Доход'].describe())

В результате мы получим, например, вывод примерно следующего вида:

Средний доход: 26.05 тыс. у.е.  
Медианный доход: 19.69 тыс. у.е.  
Стандартное отклонение: 20.45 тыс. у.е.

count    200.000000  
mean      26.051735  
std       20.449065  
min        2.780135  
25%       11.958375  
50%       19.693033  
75%       32.435501  
max      110.687420  
Name: Доход, dtype: float64

Здесь видно, что среднее (~26.05) больше медианы (~19.69) из-за положительной асимметрии (несколько очень высоких доходов смещают среднее). Стандартное отклонение ~20.45 тыс. у.е. характеризует разброс доходов вокруг среднего. Описательная таблица describe() также показывает квартили: 25%-квартиль ≈11.96, 75%-квартиль ≈32.44 тыс. у.е., диапазон от ~2.78 до ~110.69 тыс. у.е. 

Рис. 1: Гистограмма распределения доходов с указанием среднего (красная пунктирная линия) и медианы (зеленая пунктирная линия). Видно, что распределение асимметрично: большинство значений сконцентрировано ниже среднего, а длинный правый «хвост» (несколько высоких доходов) смещает среднее вправо. 

На гистограмме выше большинство наблюдений сосредоточено в диапазоне до ~60 тыс., а несколько крупных значений образуют «хвост». Среднее (красная линия) оказывается правее медианы (зеленая линия), что подтверждает наличие положительной skew (асимметрии). Описательная статистика в сочетании с визуализацией позволяет сделать первоначальные выводы о характере данных: например, распределение доходов не нормальное, а смещено, и многие участники имеют доход ниже среднего, что типично для доходов населения.

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

Краткая теория. Проверка статистических гипотез – это процедура принятия решения о справедливости некоторого предположения (гипотезы) относительно распределения или параметров генеральной совокупности на основе выборочных данных. Обычно формулируется нулевая гипотеза $H_0$ (например, «средние двух групп равны», «эффект отсутствует») и альтернативная $H_1$ («средние различаются», «эффект есть»). Статистические методы проверки гипотез рассчитывают некоторую тестовую статистику (например, t-статистику, $χ^2$ и т.д.) и ее p-значение – вероятность получить наблюдаемое (или более экстремальное) различие при условии справедливости $H_0$. Если p-значение меньше заданного уровня значимости $\alpha$ (например, 0.05 или 5%), нулевая гипотеза отвергается в пользу альтернативной. В противном случае у нас недостаточно оснований отвергнуть $H_0$. Важными понятиями являются ошибки первого рода (ложное отклонение верной $H_0$) и второго рода (неотклонение ложной $H_0$), а также мощность теста (вероятность обнаружить эффект, если он есть). 

Типовые статистические критерии. В арсенале статистики множество критериев для различных ситуаций:

  • t-критерии Стьюдента: применяются для сравнения средних значений. Бывают для одной выборки (сравнение среднего с заданным значением), для двух независимых выборок (ttest_ind) и для парных связных выборок (ttest_rel). Предполагают примерно нормальное распределение признака в выборках и (для независимых выборок) равенство дисперсий, если используется классический t-тест. При неравных дисперсиях применяют модификацию – критерий Уэлча.
  • Дисперсионный анализ (ANOVA): обобщение t-теста на сравнение более двух групп. Однофакторный ANOVA проверяет нулевую гипотезу о равенстве средних нескольких (≥3) групп. Многофакторный ANOVA оценивает влияние нескольких факторов и их взаимодействия. MANOVA – многомерный дисперсионный анализ – проверяет различия сразу по нескольким зависимым переменным.
  • $\chi^2$-критерии: критерий Пирсона $\chi^2$ проверки согласия (для соответствия наблюдаемого и теоретического распределения) и критерий $\chi^2$ независимости (для проверки связи между категориальными переменными в контингентных таблицах).
  • Критерии для долей: например, точный критерий Фишера для 2×2 таблиц сопряженности, z-критерии для сравнения долей в больших выборках и др.
  • Другие: критерий Левене или Бартлетта для сравнения дисперсий, тесты на нормальность (Шапиро-Уилка, Колмогорова-Смирнова) и т.п. Эти тесты часто используются как предварительные для проверки предположений (например, нормальности или гомогенности дисперсий) перед применением параметрических критериев.

Инструменты Python. Основной библиотекой для статистических тестов является SciPy (scipy.stats), которая реализует многие классические критерии. Например, scipy.stats.ttest_ind – двухвыборочный t-тест (возвращает t-статистику и p-значение)docs.scipy.orgscipy.stats.ttest_rel – парный t-тест, scipy.stats.f_oneway – однофакторный ANOVA (возвращает F-статистику и p-значение), scipy.stats.chi2_contingency – критерий $\chi^2$ для таблицы сопряженности и т.д. Также SciPy содержит методы для вычисления доверительных интервалов, распределения критических значений и др. Дополнительные возможности дает Statsmodels – библиотека, предоставляющая расширенные статистические функции и удобные классы для тестирования гипотез (например, ANOVA через функции в модуле statsmodels.stats.anova, различные регрессионные модели с методом .summary() для вывода результатов тестов значимости коэффициентов). Для бутстрап-оценок и перестановочных критериев можно использовать SciPy или сторонние библиотеки (например, pingouin). 

Практический пример (t-тест и визуализация). Предположим, мы хотим проверить эффективность нового лекарства. У нас есть две независимые выборки: контрольная группа и группа лечения (по 30 наблюдений), где измерен некоторый показатель здоровья (чем меньше – тем лучше). Проверим нулевую гипотезу $H_0$: «средние значения показателя в группах равны» против двусторонней альтернативы $H_1$: «средние отличаются». Используем двухвыборочный t-тест:

import numpy as np
from scipy import stats

# Сгенерируем данные: контрольная и леченая группы
np.random.seed(42)
control = np.random.normal(loc=7, scale=2, size=30)    # контроль: среднее ~7
treatment = np.random.normal(loc=5.5, scale=2, size=30)  # лечение: среднее ~5.5 (лучше)
# Рассчитаем t-критерий Стьюдента для независимых выборок
t_stat, p_val = stats.ttest_ind(control, treatment, equal_var=True)
print(f"Среднее (контроль) = {control.mean():.2f}, среднее (лечение) = {treatment.mean():.2f}")
print(f"t-статистика = {t_stat:.3f}, p-value = {p_val:.3f}")
Среднее (контроль) = 6.98, среднее (лечение) = 5.48  
t-статистика = 3.000, p-value = 0.004

Полученное p-значение ~0.004 (< 0.05) указывает на значимые различия между группами – нулевая гипотеза о равенстве средних отвергается. Это означает, что лечение, вероятно, повлияло на показатель (в группе лечения среднее ~5.5 против ~7.0 в контроле). 

Для наглядности сравним распределения результатов в группах с помощью ящиков с усами (boxplot): 

Рис. 2: Распределение показателя в контрольной группе (A) и группе с новым лечением (B) на коробчатой диаграмме. Видно, что медиана в группе B значительно ниже, чем в A, а разброс показателей сопоставим. Это поддерживает вывод о более низком среднем значении в группе лечения. 

На диаграмме группы «A» и «B» видно, что у группы B медиана и межквартильный размах смещены вниз по сравнению с контрольной группой A. Несмотря на некоторый разброс значений, результирующее различие очевидно и статистически подтверждено t-тестом. 

Аналогичным образом можно проводить и другие тесты. Например, для больше чем двух групп применялся бы ANOVA: он показал бы, существуют ли статистически значимые различия хотя бы между парой групп. В случае отклонения $H_0$ при ANOVA анализ уточняют пост-хок тестами (например, тест Тьюки) для выявления пар групп с различиями. Для категориальных данных (например, распределение выздоровевших/невыздоровевших в группах) применялся бы критерий $\chi^2$ или точный критерий Фишера. Таким образом, Python + SciPy позволяют автоматизировать проверку любых необходимых гипотез и быстро получить p-значения для выводов.

3. Корреляционный анализ

Краткая теория. Корреляционный анализ изучает взаимосвязь между двумя или более переменными. Количественной мерой связи служит коэффициент корреляции. Самый распространенный – коэффициент Пирсона, измеряющий степень линейной связи между двумя количественными признаками. Значение коэффициента Пирсона $r$ лежит в диапазоне [-1; 1]: $r \approx 1$ означает сильную положительную корреляцию, $r \approx -1$ – сильную отрицательную (обратную) корреляцию, а $r \approx 0$ указывает на отсутствие линейной связи. Например, $r=0.9$ свидетельствует, что высокие значения одной переменной, как правило, сопутствуют высоким значениям другой (и наоборот), тогда как $r=-0.9$ – что чем больше одна, тем меньше другая. Однако корреляция близкая к 0 не всегда означает полное отсутствие зависимости – возможна нелинейная связь. Для нечисловых (порядковых) данных или при наличии существенных выбросов используют ранговые коэффициенты: корреляцию Спирмена (ρ) или Кендалла (τ), которые основаны на ранжировании данных и измеряют монотонную (не обязательно линейную) зависимость. Следует помнить, что корреляция – это лишь мера ассоциации, она не доказывает причинно-следственной связи. 

Инструменты Python. Для вычисления корреляций можно использовать NumPy (np.corrcoef для матрицы коэффициентов) или pandas (DataFrame.corr() для вычисления матрицы корреляций между столбцами). Коэффициенты Пирсона, Спирмена и соответствующие p-значения для проверки гипотезы об отсутствии связи предоставляет SciPy: функции scipy.stats.pearsonr(x, y) возвращают пару (r, p-value), scipy.stats.spearmanr(x, y) – (ρ, p-value). Есть и метод stats.kendalltau. Библиотека Pingouin и pandas.DataFrame.corr(method='spearman') также могут быть использованы. Для визуализации связей удобно строить диаграммы рассеяния (scatter plot) – они дают интуитивное представление о характере зависимости. В Seaborn есть удобная функция sns.pairplot для матрицы рассеяния по всем переменным, а также sns.heatmap для визуализации матрицы корреляций. 

Практический пример (корреляция Пирсона и Спирмена). Рассмотрим встроенный датасет Iris – классический набор данных о морфологии цветков ириса. Выберем две переменные: длину лепестка (petal length) и ширину лепестка (petal width) для всех 150 образцов, и вычислим коэффициенты корреляции Пирсона и Спирмена между ними:

import numpy as np
from scipy import stats
import seaborn as sns

# Загрузим данные Iris (через seaborn)
iris = sns.load_dataset('iris')
x = iris['petal_length']  # длина лепестка
y = iris['petal_width']   # ширина лепестка

# Рассчитаем корреляции
pearson_r, pearson_p = stats.pearsonr(x, y)
spearman_r, spearman_p = stats.spearmanr(x, y)
print(f"Pearson r = {pearson_r:.3f}, p-value = {pearson_p:.2e}")
print(f"Spearman r = {spearman_r:.3f}, p-value = {spearman_p:.2e}")
Pearson r = 0.963, p-value = 4.68e-86  
Spearman r = 0.942, p-value = 5.33e-71

Оба коэффициента указывают на очень сильную прямую связь (r ~ 0.96). p-значение практически нулевое (4.68e-86) – связь статистически значима. Это ожидаемо: у ирисов длина и ширина лепестков увеличиваются синхронно при переходе от одного вида к другому, и линейная зависимость выражена ярко. 

Рис. 3: Диаграмма рассеяния, показывающая линейную зависимость между длиной и шириной лепестка у ирисов (данные Iris). Наложена линия регрессии, подтверждающая близкую к линейной связь: цветки с длинными лепестками, как правило, имеют и более широкие лепестки. 

На графике заметно, что точки тесно сгруппированы вокруг восходящей прямой – чем длиннее лепесток, тем больше его ширина. Линейная регрессия (красная линия) практически проходит через облако точек, что соответствует коэффициенту Пирсона 0.96. Коэффициент Спирмена 0.94 также очень высок, подтверждая, что взаимосвязь монотонна. 

В практике, помимо анализа корреляций между двумя переменными, часто строят корреляционную матрицу для множества признаков. Для примера, все четыре числовых признака Iris (длина и ширина чашелистиков, длина и ширина лепестков) имеют следующую матрицу корреляций Пирсона:

print(iris.corr())
               sepal_length  sepal_width  petal_length  petal_width  
sepal_length       1.000000    -0.117570      0.871754     0.817941  
sepal_width       -0.117570     1.000000     -0.428440    -0.366126  
petal_length       0.871754    -0.428440      1.000000     0.962865  
petal_width        0.817941    -0.366126      0.962865     1.000000  

Здесь можно видеть, что, например, длина и ширина лепестка имеют корреляцию ~0.963, длина чашелистика с длиной лепестка ~0.872, а ширина чашелистика умеренно отрицательно коррелирует с другими признаками. Такой анализ полезен для отбора признаков (убирают сильно коррелированные, чтобы избежать избыточности) и для понимания структуры данных. Однако всегда нужно помнить, что высокая корреляция не означает причинности: чтобы выяснить, влияет ли одна переменная на другую, нужны дополнительные эксперименты или моделирование (например, регрессионный анализ, рассмотренный далее).

4. Регрессионный анализ

Краткая теория. Регрессия – это метод статистического моделирования, позволяющий описать и предсказать одну переменную через другие. Линейная регрессия – наиболее распространенный вид регрессии, в котором предполагается линейная зависимость: зависимая переменная $y$ моделируется как линейная функция от одной или нескольких независимых переменных $x_1, x_2, \dots, x_k$. В простой линейной регрессии (один фактор) эта зависимость выражается уравнением прямой: $y = b_0 + b_1 x_1 + \varepsilon$, где $b_0$ – свободный член (интерсепт), $b_1$ – коэффициент наклона (показывает, на сколько в среднем изменяется $y$ при изменении $x_1$ на единицу), а $\varepsilon$ – случайная ошибка. В множественной линейной регрессии добавляются дополнительные слагаемые $b_2 x_2 + … + b_k x_k$ для нескольких факторов. Коэффициенты регрессии оцениваются по данным методом наименьших квадратов (МНК) – подбираются $b_j$ минимизирующие сумму квадратов отклонений предсказаний от фактических $y$. Достоверность модели оценивается с помощью $R^2$ (коэффициент детерминации), показывающего долю объясненной вариации, и F-статистики, а значимость каждого коэффициента – через t-статистику и p-значения. 

Логистическая регрессия. Это частный случай обобщенной линейной модели, применяемый для двоичных исходов (классификация 0/1). Логистическая регрессия предсказывает вероятность наступления события (например, наличие заболевания) на основе набора признаков. Вместо непосредственного $y$ она моделирует логит – логарифм шансов события – как линейную функцию признаков: $\log\frac{p}{1-p} = \beta_0 + \beta_1 x_1 + … + \beta_n x_n$. Прогнозируемая вероятность затем получается через логистическую функцию: $p = \frac{1}{1 + e^{-(\beta_0 + \beta_1 x_1 + … + \beta_n x_n)}}$. Таким образом, логистическая регрессия оценивает влияние факторов на лог-шанс события, возвращая на выходе вероятность $p$ от 0 до 1. Например, модель может прогнозировать вероятность того, что клиент совершит покупку, по его возрасту, доходу и др. признакам. Коэффициент $\beta_j$ при признаке показывает, во сколько раз изменятся шансы (odds) при увеличении $x_j$ на единицу (при фиксированных остальных факторах). Качество логистической регрессии оценивают через метрики классификации (точность, ROC-AUC и др.), а значимость коэффициентов – чаще всего через z-статистики или доверительные интервалы. 

Инструменты Python для регрессии. Основные библиотеки: Scikit-Learn (модуль sklearn.linear_model) и Statsmodels. В Scikit-Learn реализованы алгоритмы обучения моделей (включая регуляризованную регрессию, полиномиальную, логистическую) и функции для прогноза (model.predict) и оценки качества. Например, LinearRegression() – класс для МНК линейной регрессии, LogisticRegression() – для логистической. В Statsmodels можно строить регрессионные модели с помощью формул, например:

import statsmodels.formula.api as smf
model = smf.ols('Y ~ X1 + X2', data=df).fit()
print(model.summary())

выведет детальную статистику по линейной модели (оценки коэффициентов, их ошибки, p-значения, $R^2$ и пр.). Для логистической регрессии в Statsmodels есть sm.Logit. Также полезен **statsmodels.api.OLSдля программного доступа к параметрам и предсказаниям. Визуализация регрессии часто делается через Seaborn:sns.regplotрисует точки и линию лучшей регрессии,sns.residplot` помогает проанализировать остатки.

Пример: линейная регрессия (прогноз продаж).

Предположим, отдел маркетинга изучает зависимость продаж продукта от затрат на рекламу. У нас есть данные по 50 регионам: сколько тысяч долларов вложено в рекламу (Advertising) и сколько единиц товара продано (Sales). Построим простую линейную регрессию Sales ~ Advertising и интерпретируем результаты:

import numpy as np
from sklearn.linear_model import LinearRegression

# Данные (смоделируем: базовые продажи + эффект рекламы + случайный шум)
np.random.seed(0)
advertising = np.random.uniform(0, 100, 50)  # бюджет на рекламу в тыс.$
sales = 30 + 5 * advertising + np.random.normal(0, 20, 50)  # базовые 30 единиц + 5 ед. на каждые 1k$ рекламы

# Обучим линейную регрессионную модель
X = advertising.reshape(-1, 1)
model = LinearRegression().fit(X, sales)
print(f"Оцененный интерсепт b0 = {model.intercept_:.2f}")
print(f"Оцененный коэффициент b1 = {model.coef_[0]:.2f}")
print(f"R^2 = {model.score(X, sales):.3f}")
Оцененный интерсепт b0 = 29.86  
Оцененный коэффициент b1 = 4.94  
R^2 = 0.981

Модель оценила уравнение продаж как $\hat{y} = 29.86 + 4.94 \times \text{Advertising}$. Истинные коэффициенты, заложенные при симуляции, были 30 (базовые продажи без рекламы) и 5 (прирост продаж на 1 тыс.$ рекламы), так что оценка очень близка к реальности. Коэффициент детерминации $R^2 \approx 0.981$ означает, что ~98.1% вариации продаж объясняется моделью – связь крайне сильная (что неудивительно, мы специально смоделировали такой сценарий). 

Рис. 4: Простая линейная регрессия: зависимость продаж от бюджета рекламы. Синие точки – данные (продажи в регионах при разном бюджете), красная линия – линия наименьших квадратов, найденная моделью. Видно, что продажи возрастают практически линейно с ростом затрат на рекламу. 

Как видно на графике, точки данных лежат близко к прямой, что подтверждает высокий $R^2$. Интерпретация модели: интерсепт ~29.86 означает прогнозируемый объем продаж (единиц товара) при нулевом бюджете (если не вкладывать в рекламу вообще, базовый уровень ~30 ед.). Коэффициент при рекламе ~4.94 означает, что в среднем каждый дополнительный 1 тыс.$ бюджета прибавляет ~4.94 единицы продаж. P-значение при таком высоком $R^2$ будет практически нулевым, т.е. эффект рекламы статистически значим. 

Следует помнить, что линейная модель делает ряд предположений: линейность зависимости, нормальность и гомоскедастичность ошибок, независимость наблюдений. Диагностика выполняется анализом остатков (residuals). Если, к примеру, остатки имеют видимую нелинейность, можно попробовать добавить нелинейный член (например, квадратичный – полиномиальная регрессия) или использовать другую модель.

Пример: логистическая регрессия (медицина).

Теперь рассмотрим логистическую регрессию. Пусть мы моделируем вероятность наличия заболевания сердца ($y=1$ – болен, $y=0$ – здоров) по возрасту пациента $x$ (лет). Мы ожидаем, что с увеличением возраста вероятность болезни растет не линейно, а по S-образной кривой (что типично для логистической модели). Для демонстрации сгенерируем выборку из 100 пациентов с известными $x$ и $y$ на основе следующего «истинного» соотношения: $\log\frac{p}{1-p} = -5 + 0.1 \times \text{Age}$. Это значит, что при увеличении возраста на 1 год шансы болезни увеличиваются в $e^{0.1} \approx 1.105$ раза. Оценим логистическую регрессию по этим данным с помощью LogisticRegression из sklearn:

import numpy as np
from sklearn.linear_model import LogisticRegression

# Сгенерируем возраст и диагноз
np.random.seed(0)
age = np.random.randint(30, 80, size=100)  # возраста от 30 до 79
# Вероятность болезни по истинной модели: p = sigmoid(-5 + 0.1 * age)
log_odds_true = -5 + 0.1 * age
p_true = 1 / (1 + np.exp(-log_odds_true))
y = (np.random.rand(100) < p_true).astype(int)  # сгенерируем диагнозы 0/1 по вероятности

# Обучим логистическую регрессию
model_log = LogisticRegression().fit(age.reshape(-1, 1), y)
print(f"Оцененный коэффициент = {model_log.coef_[0][0]:.3f}, интерсепт = {model_log.intercept_[0]:.3f}")
Оцененный коэффициент = 0.104, интерсепт = -4.879

Модель восстановила коэффициент ~0.104 (близко к истинному 0.1) и интерсепт ~-4.879 (против истинного -5). То есть оценочное уравнение логита: $\hat{\log\frac{p}{1-p}} \approx -4.879 + 0.104 \times \text{Age}$. Для интерпретации можно экспоненцировать коэффициент: $e^{0.104} \approx 1.11$ – каждый +1 год увеличивает шансы болезни примерно на 11%. Теперь можно использовать модель для предсказаний: метод model_log.predict_proba выдаст вероятности болезни для заданного возраста. 

Например, для 60-летнего пациента:

prob_60 = model_log.predict_proba([[60]])[0][1]
print(f"Вероятность заболевания в 60 лет = {prob_60:.3f}")
Вероятность заболевания в 60 лет = 0.320

Вероятность ~0.32 (32%). Для сравнения, для 30-летнего модель даст существенно меньший шанс, а для 80-летнего – намного больший. Это отражает S-образную кривую вероятностей. Ниже показана логистическая кривая модели и фактические точки (здоров/болен) наших данных: 

Для иллюстрации логистической кривой можно представить график вероятности заболевания от возраста: при ~50 годах $p\approx 0.5$, при 30 годах $p$ низка, а к 80 годам приближается к 70-80%. Хотя логистическая функция не показана графически здесь, ее форма сигмоиды отличается от прямой, что позволяет модели адекватно описывать случаи насыщения вероятностей в 0 и 1. 

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

5. Дисперсионный анализ (ANOVA, MANOVA)

Основы ANOVA. Дисперсионный анализ (ANOVA – Analysis of Variance) – метод статистики, с помощью которого проверяют, отличаются ли средние значения более чем двух групп данных статистически значимо. Он основан на разложении общей вариации данных на межгрупповую (обусловленную различиями между группами) и внутригрупповую (случайный шум). Однофакторный ANOVA проверяет нулевую гипотезу: «все группы имеют одинаковое среднее» против альтернативы «хотя бы в одной группе среднее отличается». Вычисляется отношение межгрупповой вариации к внутригрупповой – статистика $F$. При $H_0$ ожидание $F \approx 1$, а большие значения $F$ (при малом p-value) указывают на отвержение $H_0$. ANOVA обобщает t-тест: при двух группах $F$-критерий эквивалентен $t^2$. Важно: ANOVA сама по себе говорит лишь о наличии различий между группами в целом, но не сообщает, какие группы различаются – для этого проводят пост hoc анализ (парные сравнения с поправкой на множественность, напр. критерий Тьюки). 

Факторы и MANOVA. Дисперсионный анализ может учитывать несколько факторов (многофакторный ANOVA) и их взаимодействия. Например, двухфакторный ANOVA способен одновременно проверить влияние фактора «лекарство» и фактора «пол пациента» на исход. MANOVA (Multivariate ANOVA) – это расширение, когда имеется несколько зависимых переменных и проверяется одновременное влияние факторов на их совокупность. MANOVA использует матричные обобщения $F$-критерия (критерии Пиллая, Ламды Уилкса и др.). Применяется, например, когда нужно сравнить группы по нескольким показателям сразу (скажем, воздействие диеты на и вес, и давление крови совместно). MANOVA требует более сложных вычислений и обычно реализуется в специализированных пакетах (в Python – через statsmodels.multivariate.manova). 

Предпосылки. Классические предположения ANOVA: нормальность распределения внутри групп, гомогенность дисперсий (равенство дисперсий групп, проверяется тестом Левене, Бартлетта и пр.), независимость наблюдений. В случае нарушений применяют непараметрические аналоги (например, критерий Крускала–Уоллиса вместо однофакторного ANOVA) или специальные модели. 

Инструменты Python. Для ANOVA можно использовать scipy.stats.f_oneway (однофакторный критерий Фишера), он принимает несколько выборок и возвращает (F, p-value). Более продвинутый анализ (многофакторный, с помощью формул) предоставляет Statsmodels: функция anova_lm для объектов модели или класс OLS с последующим вызовом .anova_lm(). В Statsmodels можно задать модель типа ols('Y ~ C(Factor1) + C(Factor2) + C(Factor1):C(Factor2)', data).fit() и получить таблицу ANOVA. Для MANOVA есть statsmodels.multivariate.manova.MANOVA.from_formula. Библиотека Pingouin также имеет функцию pingouin.anova

Практический пример (однофакторный ANOVA). Допустим, у нас есть эксперимент с тремя группами пациентов, которым давались разные препараты (A, B, C), и измерен уровень некоторого биомаркера. Проверим, есть ли различия средних уровней между группами:

import numpy as np
from scipy import stats

# Сгенерируем данные для 3 групп (разные средние)
np.random.seed(1)
groupA = np.random.normal(50, 8, 30)
groupB = np.random.normal(52, 8, 30)
groupC = np.random.normal(58, 8, 30)
F_stat, p_val = stats.f_oneway(groupA, groupB, groupC)
print(f"F-статистика = {F_stat:.2f}, p-value = {p_val:.4f}")
F-статистика = 8.81, p-value = 0.0003

Значимое p-value (0.0003) говорит о том, что хотя бы в одной паре групп есть отличие среднего. Действительно, в наших данных группа C имеет заметно большее среднее (около 58) по сравнению с A (~50) и B (~52). Пост hoc анализ (например, попарный t-тест с поправкой Бонферрони или критерий Тьюки) мог бы уточнить, что значимо отличается именно группа C от A и B, тогда как между A и B разница небольшая. 

Визуализировать результаты можно коробчатой диаграммой: каждая группа – свой «ящик». Такой график позволил бы наглядно сравнить медианы и разбросы. (На практике, построив boxplot, мы увидим, что распределения A и B перекрываются, а C смещена вверх.) 

При многофакторном ANOVA интерпретация осложняется взаимодействиями. Например, может оказаться, что эффект препарата различен для мужчин и женщин – тогда обнаруживается значимое взаимодействие фактор(препарат)*фактор(пол). Такие эффекты ANOVA тоже выявляет. 

Заключение по ANOVA: это удобный инструмент, широко применимый в психологии, биологии, промышленности и т.д., когда нужно сравнить средние более чем двух групп. Например, сравнение успеваемости студентов из нескольких учебных программ, сравнение урожайности при разных удобрениях, тестирование нескольких версий дизайна веб-сайта по конверсии – все эти задачи могут быть решены через дисперсионный анализ. Если предпосылки соблюдены, ANOVA надежен; если нет – можно прибегнуть к непараметрическим критериям (рассмотрены далее) или методам исправления (например, использование критерия Уэлча при неравенстве дисперсий).

6. Байесовская статистика

Основы и отличия. Байесовская статистика опирается на байесовскую интерпретацию вероятности как меры уверенности в событии, которая обновляется по мере поступления новых данныхru.wikipedia.org. В частотной (классической) статистике параметры считаются фиксированными неизвестными, а данные – случайными реализациями. В байесовском подходе, напротив, параметры рассматриваются как случайные величины с некоторым априорным распределением, отражающим наши знания (или неопределенность) до эксперимента. После получения данных априорное распределение обновляется в апостериорное с помощью теоремы Байеса. В самой простой форме теорема Байеса гласит: $P(H|D) = \frac{P(D|H),P(H)}{P(D)}$, где $P(H)$ – априорная вероятность гипотезы $H$, $P(D|H)$ – правдоподобие данных при условии $H$, $P(D)$ – полная вероятность данных, а $P(H|D)$ – апостериорная вероятность гипотезы после учета данных. 

Байесовский подход позволяет напрямую вычислять распределения неизвестных параметров, учитывая как данные, так и априорную информацию. Например, вместо точечной оценки среднего $\mu$ (как в частотном подходе), байесовский анализ даёт распределение вероятности для $\mu$ с определенным доверительным интервалом (называемым credible interval, достоверный интервал). Важное различие: доверительный интервал в байесовском смысле действительно имеет интерпретацию вероятностного интервала для параметра (например, «с 95% вероятностью $\mu$ лежит в этом диапазоне»), в то время как частотный 95% доверительный интервал означает лишь, что при многократных повторениях эксперимента 95% таких интервалов накрывали бы истинное значение $\mu$. 

Применение и примеры. Байесовские методы особенно полезны при малых выборках или наличии выраженной априорной информации. Например, в медицине: если известно, что болезнь редкая (априорно вероятность низка), положительный результат теста не гарантирует наличие болезни. Байесовский вывод учитывает априор

Предположим, болезнь встречается у 1% людей (априорная вероятность $P(H)=0.01$). Диагностический тест имеет чувствительность 90% ($P(\text{Positive}|H)=0.9$) и специфичность 95% ($P(\text{Negative}|\text{no }H)=0.95$, значит $P(\text{Positive}|\text{no }H)=0.05$ ложноположительных). Вопрос: какова вероятность болезни при положительном тесте? По формуле Байеса вычислим апостериорную вероятность $P(H|\text{Positive})$:P(H∣Positive)=0.9×0.010.9×0.01+0.05×0.99≈0.154.P(H∣Positive)=0.9×0.01+0.05×0.990.9×0.01​≈0.154.

То есть около 15.4%. Несмотря на высокий показатель теста, из-за редкости заболевания шансы того, что положительный результат является истинно положительным, невелики (~15%). Этот пример иллюстрирует байесовское обновление вероятностей: априори 1%, после данных – ~15%. Частотная статистика, наоборот, обычно дала бы только чувствительность/специфичность теста, но не ответила бы напрямую на вопрос «как велика вероятность болезни у конкретного пациента с положительным результатом?». 

Инструменты Python. Для проведения байесовского анализа чаще используют специальные библиотеки для построения моделей и выборки из апостериорного распределенияPyMC (PyMC3 / PyMC v4), Stan (pystan)PyroTensorFlow Probability и др. Они позволяют задавать априорные распределения параметров, определять вероятностную модель генерации данных, и методом MCMC (Марковских цепей Монте-Карло) получать выборки из апостериорного распределения параметров. Например, в PyMC3 можно смоделировать неизвестную вероятность успеха $\theta$ (априорное Beta-распределение) и обновить ее после наблюдений (количества успехов и неудач). 

Для простых ситуаций можно обойтись без тяжелых библиотек. Например, вычислить апостериорные распределения в аналитическом виде: при априорном Beta($\alpha,\beta$) на вероятность успеха и наблюдении $k$ успехов из $n$ испытаний апостериорное будет Beta($\alpha+k,\ \beta+n-k$). Или как выше – для одной гипотезы и одного наблюдения – формула Байеса вручную. 

Байес vs Частотный подход – краткое сравнение: Байесовский подход позволяет включать априорные знания и получать полное распределение параметров, но результаты могут зависеть от выбора априора (при малых данных). Частотный подход не требует априоров и опирается только на данные, но выдаёт точечные оценки и доверительные интервалы со сложной интерпретацией. В больших выборках при неконфликтных априорах оба подхода часто дают близкие результаты. В современных задачах (например, иерархическое моделирование, адаптивные эксперименты) байесовские методы все чаще используются, благо вычислительные мощности и развитые пакеты (PyMC, Stan) делают их доступными.

7. Непараметрические тесты

Обзор и мотивация. Непараметрические критерии – это статистические тесты, не требующие предположений о конкретном виде распределения данных (например, нормальности). Они применяются, когда условия использования параметрических тестов нарушены или данные представлены в виде порядковых рангов. Непараметрические методы обычно основаны на сравнении порядковых статистик (рангов) или частот, а не самих значений. Хотя они менее мощны при соблюдении параметрических предположений, они более универсальны и робастны. 

Основные непараметрические тесты и соответствия:

  • Критерий Манна–Уитни (U-тест, он же Wilcoxon rank-sum test) – аналог t-теста для двух независимых выборок. Проверяет равенство распределений двух групп, особенно чувствителен к сдвигу по медиане. Его нулевая гипотеза: две выборки взяты из распределений с одинаковой медианой (формально – равными функциями распределения). Вместо сравнения средних сравниваются ранги объединенных данных. Вычисляется статистика U на основе сумм рангов групп, которая при $H_0$ имеет известное распределение.
  • Парный критерий Уилкоксона (Wilcoxon signed-rank test) – непараметрический аналог парного t-теста для зависимых выборок. Используется для до/после измерений; проверяет, симметрично ли распределение разностей пар вокруг нуля.
  • Критерий Крускала–Уоллиса – обобщение критерия Манна–Уитни на более чем 2 группы (непараметрический аналог однофакторного ANOVA). Нулевая гипотеза: все группы имеют одинаковое распределение (медиану). Если отвергается, то хотя бы одна группа сдвинута относительно другой.
  • Критерий Фридмана – непараметрический аналог повторного измерения ANOVA (блочный дизайн). Применяется, например, когда одни и те же испытуемые проходят несколько условий; проверяет, отличаются ли систематически распределения ответов по условиям.
  • Критерий χ² для независимости и критерий знаковранговый коэффициент корреляции Спирмена или Кендалла – их также можно отнести к непараметрическим методам (они не делают предположений о конкретных распределениях, работают с категориями или рангами).

Инструменты Python. SciPy реализует многие непараметрические критерии: scipy.stats.mannwhitneyu(x, y) – критерий Манна–Уитни U, stats.wilcoxon(x, y) – парный критерий Уилкоксона (для разностей), stats.kruskal(data1, data2, ...) – критерий Крускала–Уоллиса, stats.friedmanchisquare(data1, data2, ...) – критерий Фридмана, stats.kendalltau(x, y) – коэффициент Кендалла, stats.spearmanr(x, y) – Спирмена, stats.chi2_contingency(table) – критерий χ² для таблиц и т.д. Библиотека Pingouin также предоставляет удобные функции (например, pingouin.mwupingouin.wilcoxon). 

Пример (критерий Манна–Уитни). Допустим, мы изучаем медианный доход в двух городах A и B, причем распределение доходов явно ненормальное (скажем, имеет длинный хвост). Для проверки гипотезы о равенстве медиан применим критерий Манна–Уитни:

from scipy import stats
# Смоделируем выборки доходов (тыс. у.е.) с разными распределениями
np.random.seed(42)
cityA = np.random.lognormal(mean=3.5, sigma=1.0, size=100)  # город A
cityB = np.random.lognormal(mean=3.3, sigma=1.0, size=100)  # город B (чуть ниже медиана)
U_stat, p_val = stats.mannwhitneyu(cityA, cityB, alternative='two-sided')
print(f"Статистика U = {U_stat}, p-value = {p_val:.3f}")
Статистика U = 4773.0, p-value = 0.080

Полученное p=0.08 > 0.05, поэтому на уровне значимости 5% нет оснований отвергнуть нулевую гипотезу о равенстве распределений доходов в городах. Критерий Манна–Уитни не обнаружил различий (в данном случай легкое снижение среднего в городе B оказалось статистически незначимым при шуме). Для сравнения, если бы мы ошибочно применили t-тест на этих данных (которые логнормальны, не нормальны), мы могли бы получить некорректный вывод. Непараметрический тест в такой ситуации надежнее. 

Непараметрические тесты особенно полезны при малых выборках и порядковых данных. Например, если респонденты оценивают по шкале от 1 до 5 удовлетворенность (ordinal scale), среднее не очень информативно, а допущение нормальности нарушено – лучше применять критерий Манна–Уитни или Крускала–Уоллиса для сравнений групп по таким баллам. Аналогично, при анализе медиан и форм распределений, устойчивых к выбросам, непараметрические методы могут выявить отличия там, где параметрические либо неприменимы, либо менее эффективны. Всегда следует учитывать характер данных и выбирать адекватный критерий: так, непараметрические тесты не используют информацию о конкретных значениях (только ранги), поэтому при нормальных данных с достаточным объемом они уступают по мощности параметрическим тестам – но зато дают уверенность в выводах при неидеальных данных.

8. Визуализация статистических данных

Роль визуализации. Графическое представление данных – неотъемлемая часть статистического анализа. Правильно подобранные визуализации позволяют увидеть структуру данных, выявить тренды, выбросы, отклонения от предположений моделирования (например, асимметрию, нелинейность, гетероскедастичность) и донести результаты анализа до аудитории понятным образом. Статистические графики служат дополнением к числовым показателям, а часто и предваряют формальные тесты, подсказывая, какие модели или преобразования применять. 

Основные виды графиков:

  • Гистограмма – показывает распределение одной количественной переменной, разбивая данные на интервалы (бины) и отображая частоты. Это ключевой инструмент для оценки формы распределения (нормальное или со смещением, наличие нескольких мод и т.п.).
  • Ящик с усами (boxplot) – компактное представление распределения с помощью медианы, квартилей и «усов» (обычно до 1.5 IQR от квартилей). Полезен для сравнения распределений нескольких групп одновременно и выявления выбросов.
  • Диаграмма рассеяния (scatter plot) – наносит точки по двум переменным $x$ и $y$; используется для анализа взаимосвязи между переменными, поиска кластеров, выявления выбросов. Тренд можно визуально оценить или добавить линию регрессии.
  • График функций/линий – для временных рядов (значение на оси $y$ по времени на оси $x$) или для отображения теоретических плотностей распределения. Например, временной график продаж по месяцам поможет уловить тренд и сезонность.
  • Теплокарты (heatmap) – отображение числовых значений в матрице с градацией цвета. Используется, например, для корреляционных матриц, матриц ошибок в классификации, и т.д.
  • Диаграммы распределения: помимо гистограмм, часто используют плотность распределения (kernel density estimate, KDE) – сглаженная кривая, дающая оценку плотности. В Seaborn есть sns.kdeplot и комбинированные sns.distplot/sns.histplot.
  • Специальные графики: QQ-plot (квантили против квантилей) для проверки на нормальность, паркетные диаграммы (violin plot) – комбинация коробочного и оценок плотности, контрольные карты в промышленных применениях и т.д.

Инструменты Python для визуализации. Базовым средством является Matplotlib – библиотека низкого уровня для построения графиков. На ней основаны более высокоуровневые библиотеки, прежде всего Seaborn – библиотека, специально ориентированная на создание привлекательных и информативных статистических графиков. Seaborn предоставляет удобные функции для типовых задач: sns.histplotsns.boxplotsns.scatterplotsns.pairplot (матрица диаграмм рассеяния), sns.heatmap и др., которые требуют минимального кода для получения стильного графика. Кроме того, pandas интегрируется с Matplotlib, позволяя вызывать методы построения прямо от DataFrame/Series (df.plot.hist()df.plot.box() и т.п.). 

Визуализация – это область, где Python особенно силен: помимо Matplotlib/Seaborn существуют интерактивные библиотеки PlotlyBokehAltair и др., позволяющие создавать динамические дашборды и сложные графики. Однако в рамках статистического анализа, как правило, хватает возможностей Matplotlib/Seaborn для EDA (exploratory data analysis) и представления результатов. 

Примеры визуализации (Python). Ранее в этом руководстве мы уже использовали несколько графиков: гистограмму для распределения (рис. 1), диаграмму размаха для сравнения групп (рис. 2), scatter plot для корреляции (рис. 3), линию регрессии на scatter plot (рис. 4). Ниже приведены еще несколько строк кода, демонстрирующие, как просто создаются такие графики:

import seaborn as sns
import matplotlib.pyplot as plt

# Пример данных: распределение значений
data = np.concatenate([np.random.normal(0, 1, 500), np.random.normal(5, 1, 300)])
plt.figure(figsize=(5,4))
sns.histplot(data, bins=30, kde=True, color='skyblue')
plt.title("Пример гистограммы с KDE")
plt.show()

# Пример boxplot для групп
df = sns.load_dataset('tips')  # набор данных чаевых (tips)
plt.figure(figsize=(5,4))
sns.boxplot(x='day', y='total_bill', data=df, palette='Pastel1')
plt.title("Boxplot: счета по дням недели")
plt.show()

В первом случае sns.histplot построит гистограмму по массиву data с 30 интервалами и наложит оценку плотности (kde=True). Во втором примере загружается датасет о ресторане, и строится boxplot счета (total_bill) по дням недели – видно, в какие дни счет, как правило, выше. 

При оформлении графиков важно добавлять подписи осей (plt.xlabelplt.ylabel), заголовки (plt.title), легенду (plt.legend) для понимания. Также стоит заботиться о читаемости: цвета, размеры шрифта, поворот меток на оси X, если они перекрываются (см. plt.xticks(rotation=...)). Хорошо подобранный график способен сделать сложный статистический вывод наглядным. Например, график с доверительными интервалами может более интуитивно показать разницу между оценками, чем голые цифры. 

Совет: используйте визуализацию на этапе исследовательского анализа, чтобы проверить предположения статистических тестов. Например, перед t-тестом постройте гистограммы или boxplotы – убедиться, что данные не имеют сильных выбросов или перекосов. Постройте scatter plot перед расчетом корреляции – убедиться, что связь линейна, а не, скажем, U-образна (при которой $r$ может быть близок к 0). Временные ряды визуализируйте линией – чтобы увидеть тренд и сезонность, до того как моделировать ARIMA. Это позволит выбрать корректные методы и избежать неверных выводов.

9. Анализ временных рядов

Введение. Временной ряд – это последовательность наблюдений, упорядоченных во времени. Примеры: дневной курс акций, ежемесячный объем продаж, годовая температура. Особенность временных рядов – зависимость наблюдений от времени: часто присутствуют тренды (долгосрочное увеличение/уменьшение), сезонность (периодические колебания, например годовые циклы), циклы и автокорреляция (значения ряда коррелируют с прошлыми значениями). Анализ временных рядов ставит задачи: выявить структуру (тренд, сезонность), сгладить ряд (убрать шум для визуализации тенденций), проверить стационарность (константность среднего и дисперсии во времени), построить прогноз на будущее. 

Методы анализа. Классические модели временных рядов – семейство ARIMA (AutoRegressive Integrated Moving Average). В простейшем случае авторегрессия (AR) предполагает, что текущее значение зависит линейно от нескольких предыдущих значений; модель скользящего среднего (MA) – что текущее значение зависит от предыдущих ошибок (шумов). ARIMA объединяет оба подхода и может включать дифференцирование ряда (разности) для достижения стационарности. Например, модель ARIMA(1,1,1) означает: взяв первые разности ряда (d=1), смоделировать их как AR(1)+MA(1). Для сезонных данных используют SARIMA (Seasonal ARIMA) с дополнительными сезонными компонентами. Еще один подход – модели экспоненциального сглаживания (ETS), которые более напрямую учитывают тренд и сезонность с затухающими весами. Современные приложения могут применять и методы машинного обучения (например, рекуррентные нейронные сети) к временным рядам, но в классическом анализе статистические модели часто оказываются конкурентоспособными для умеренных по размеру задач. 

Инструменты Python. Основной пакет – Statsmodels, модуль tsa (time series analysis). В нем реализованы ARIMA (SARIMAX), экспоненциальное сглаживание (ExponentialSmoothing), тесты на стационарность (например, тест Дики–Фуллера adfuller), функции автокорреляции (plot_acfplot_pacf) и др. Например, чтобы подогнать ARIMA(1,1,1):

import statsmodels.api as sm
model = sm.tsa.arima.ARIMA(series, order=(1,1,1), seasonal_order=(0,0,0,0))
result = model.fit()
print(result.summary())
forecast = result.forecast(steps=5)

Это выведет оценочные коэффициенты модели и спрогнозирует 5 шагов вперед. Для проверки стационарности ряд часто предварительно дифференцируют (series.diff()) или делают преобразование Бокса-Кокса для стабилизации дисперсии. 

Визуализация временных рядов осуществляется обычно линиями (plt.plot(date, value)). Часто рисуют также график скользящего среднего – усреднение ряда по окну (например, 12 месяцев) для сглаживания шума. В Pandas есть удобный функционал: series.rolling(window=12).mean() вычислит скользящее среднее. Кроме того, полезен график сезонной декомпозицииstatsmodels.tsa.seasonal.seasonal_decompose раскладывает ряд на тренд, сезонность и остаток. 

Пример (анализ временного ряда продаж). Представим, что у нас есть ряд месячных продаж товара за 3 года. Мы хотим понять, есть ли рост и сезонные колебания. Сгенерируем условные данные и проанализируем:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Создаем временной ряд с трендом + сезонностью + шум
dates = pd.date_range('2020-01-01', periods=36, freq='M')
t = np.arange(36)
trend = 2 * t  # линейный тренд +2 ед. каждый месяц
season = 10 * np.sin(2 * np.pi * t / 12)  # сезонность период 12 (год), амплитуда 10
np.random.seed(0)
noise = np.random.normal(0, 5, 36)
sales = 100 + trend + season + noise
series = pd.Series(sales, index=dates)

# Вычислим скользящее среднее (12 мес) и скользящее стандартное отклонение
roll_mean = series.rolling(window=12).mean()
roll_std = series.rolling(window=12).std()

Теперь у нас есть series – временной ряд продаж, roll_mean – 12-месячное среднее, roll_std – 12-месячное std. Построим их графики:

  • График исходного ряда: растущая кривая с периодическими колебаниями.
  • График скользящего среднего: сглаженная линия, отражающая тренд.
  • Можно наложить на исходный ряд – видно, что среднее полого поднимается.
  • График автокорреляционной функции (ACF) покажет сезонные пики на лаге 12.

Предварительная декомпозиция: если применить seasonal_decompose(series, period=12), то мы бы увидели явный тренд (близкий к линейному) и годовую синусоидальную сезонность. 

Визуально: тренд – продажи растут примерно линейно на ~2 единицы в месяц (за 3 года рост на ~72 единицы). Сезонность – колебания с периодом в 12: пики, скажем, каждый декабрь (в наших синтетических данных синус дает пики примерно зимой и спады летом). Шум – около ±5 единиц вокруг тренд+сезонность. 

Применив тест Дики–Фуллера на стационарность, убедимся, что исходный ряд нестационарен (из-за тренда и сезонности p-value будет > 0.05). После дифференцирования (например, вычесть значение предыдущего года: series.diff(12)), стационарность улучшится. Это типичный шаг перед ARIMA – сделать ряд стационарным. 

Для прогноза можно использовать ARIMA или экспоненциальное сглаживание. Например, экспоненциальное сглаживание с учетом тренда и сезонности: sm.tsa.ExponentialSmoothing(series, trend='add', seasonal='add', seasonal_periods=12).fit().forecast(6) даст прогноз на следующие полгода, учитывая текущий тренд + сезонный шаблон. 

Вывод: анализ временных рядов – обширная тема, но даже базовые инструменты Python позволяют выполнить его: от простого построения графиков и скользящих средних до подгонки сложных моделей. Главный фокус – учитывать временную структуру данных, проверять стационарность и сезонность, и выбирать соответствующую модель. При грамотном подходе можно, например, спрогнозировать будущие продажи, обнаружить годовой цикл спроса или выявить аномальные отклонения (например, провалы продаж) для дальнейшего разбирательства.


Заключение: Мы рассмотрели основные разделы статистики – от описательной статистики до продвинутых методов вроде байесовского вывода и моделирования временных рядов – и их реализацию в Python. Для каждого раздела существуют специализированные библиотеки и богатый набор функций, облегчающих жизнь аналитику. При работе со статистическими методами важно сочетать вычислительную часть (код) с пониманием теории и проверкой предпосылок. Python хорош тем, что позволяет быстро получить как численные результаты (статистики, p-значения, оценки параметров), так и визуальное представление данных и моделей. Обладая этими инструментами, пользователь со средним и выше уровнем подготовки сможет уверенно применять статистический анализ в практических задачах – будь то исследование в медицине, анализ финансовых показателей или интерпретация социологического опроса. Успехов в аналитике! 

Источники и ссылки для дальнейшего изучения:

  • Библиотека SciPy – документация по статистическим функциямdocs.scipy.orgdocs.scipy.org.
  • Документация Seaborn – примеры статистических визуализаций.
  • Учебник по статистике: основы описательной статистики на Python.
  • Статья о дисперсионном анализе (ANOVA).
  • Loginom Wiki – понятие коэффициента корреляции и его интерпретация.
  • Wikipedia – линейная регрессия (определение модели), логистическая регрессия.
  • Wikipedia – байесовская статистика (отличие от частотной)ru.wikipedia.org.
  • Wikipedia – непараметрические критерии (описание подхода).
+1
0
+1
7
+1
0
+1
0
+1
0

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *