Statsmodels – статистический анализ

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Введение в Statsmodels

Statsmodels — это мощная библиотека Python, предназначенная для выполнения статистического анализа данных. Она обеспечивает инструменты для построения регрессионных моделей, оценки параметров, проверки статистических гипотез и анализа временных рядов. Statsmodels широко применяется в эконометрике, биостатистике и социальных науках, обеспечивая глубокую статистическую интерпретацию результатов.

Ключевые возможности библиотеки Statsmodels

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

Statsmodels предоставляет обширные возможности для регрессионного анализа, включая обычные наименьшие квадраты (OLS), обобщенные линейные модели (GLM), робастную регрессию и модели панельных данных. Библиотека поддерживает как параметрические, так и непараметрические методы оценки.

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

Модуль временных рядов включает модели ARIMA, SARIMA, экспоненциального сглаживания, векторной авторегрессии (VAR) и многие другие. Доступны функции для проверки стационарности, декомпозиции рядов и прогнозирования.

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

Библиотека содержит широкий набор статистических тестов: t-тесты, F-тесты, тесты на нормальность, тесты на равенство дисперсий, тесты на автокорреляцию и многие другие.

Дисперсионный анализ

Поддерживаются одно- и многофакторные модели ANOVA, ANCOVA, повторных измерений и смешанных эффектов.

Непараметрические методы

Включены методы ядерной оценки плотности, непараметрической регрессии и тесты на основе рангов.

Установка и подключение Statsmodels

Установка библиотеки

Установка библиотеки выполняется стандартной командой:

pip install statsmodels

Для получения дополнительных функций можно установить с полными зависимостями:

pip install statsmodels[complete]

Импорт необходимых компонентов

import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.tsa.api as tsa
import statsmodels.stats.api as sms

Структура библиотеки и основные модули

Основные API-интерфейсы

statsmodels.api — классический интерфейс с прямым указанием матриц данных

statsmodels.formula.api — интерфейс на основе формул, аналогичный R

statsmodels.tsa — модуль для анализа временных рядов

statsmodels.stats — статистические тесты и диагностика

statsmodels.graphics — визуализация результатов

Работа с данными и подготовка

Statsmodels оптимально работает с pandas.DataFrame:

import pandas as pd
import numpy as np

# Загрузка данных
data = pd.read_csv("dataset.csv")

# Проверка на пропущенные значения
print(data.isnull().sum())

# Базовая статистика
print(data.describe())

Линейная регрессия (OLS)

Классический интерфейс

import statsmodels.api as sm

# Подготовка данных
X = data[["x1", "x2", "x3"]]
X = sm.add_constant(X)  # добавление константы
y = data["y"]

# Построение модели
model = sm.OLS(y, X).fit()
print(model.summary())

# Извлечение коэффициентов
print("Коэффициенты:", model.params)
print("P-значения:", model.pvalues)
print("R-квадрат:", model.rsquared)

Формульный интерфейс

import statsmodels.formula.api as smf

# Использование формул
model = smf.ols("y ~ x1 + x2 + x3", data=data).fit()
print(model.summary())

# Взаимодействие переменных
model_interaction = smf.ols("y ~ x1 * x2 + x3", data=data).fit()

# Категориальные переменные
model_cat = smf.ols("y ~ C(category) + x1", data=data).fit()

Обобщенные линейные модели (GLM)

Логистическая регрессия

# Бинарная логистическая регрессия
model = smf.logit("y ~ x1 + x2", data=data).fit()
print(model.summary())

# Предсказания
predictions = model.predict(data)
print("Предсказанные вероятности:", predictions.head())

Пуассоновская регрессия

# Для счетных данных
model = smf.poisson("count ~ x1 + x2", data=data).fit()
print(model.summary())

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

Однофакторный ANOVA

# Построение модели
model = smf.ols("score ~ C(group)", data=data).fit()

# Таблица ANOVA
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)

Многофакторный ANOVA

# Двухфакторный анализ
model = smf.ols("score ~ C(factor1) + C(factor2) + C(factor1):C(factor2)", data=data).fit()
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)

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

Модели ARIMA

from statsmodels.tsa.arima.model import ARIMA

# Построение модели ARIMA
model = ARIMA(data["series"], order=(1, 1, 1))
results = model.fit()
print(results.summary())

# Прогнозирование
forecast = results.forecast(steps=10)
print("Прогноз:", forecast)

Сезонная декомпозиция

from statsmodels.tsa.seasonal import seasonal_decompose

# Декомпозиция временного ряда
decomposition = seasonal_decompose(data["series"], model='additive', period=12)
decomposition.plot()

Проверка стационарности

from statsmodels.tsa.stattools import adfuller

# Тест Дики-Фуллера
result = adfuller(data["series"])
print("ADF статистика:", result[0])
print("P-значение:", result[1])

Статистические тесты

Тесты на нормальность

from scipy.stats import shapiro, normaltest

# Тест Шапиро-Уилка
stat, p_value = shapiro(data["x"])
print(f"Статистика: {stat}, P-значение: {p_value}")

# Тест Д'Агостино
stat, p_value = normaltest(data["x"])
print(f"Статистика: {stat}, P-значение: {p_value}")

Тесты на равенство средних

from scipy.stats import ttest_ind, ttest_1samp

# Двухвыборочный t-тест
group1 = data[data["group"] == "A"]["value"]
group2 = data[data["group"] == "B"]["value"]
stat, p_value = ttest_ind(group1, group2)
print(f"T-статистика: {stat}, P-значение: {p_value}")

# Одновыборочный t-тест
stat, p_value = ttest_1samp(data["x"], popmean=0)
print(f"T-статистика: {stat}, P-значение: {p_value}")

Диагностика моделей

Анализ остатков

# Получение остатков
residuals = model.resid

# Q-Q график
sm.qqplot(residuals, line="s")
plt.title("Q-Q график остатков")
plt.show()

# Тест на гетероскедастичность
from statsmodels.stats.diagnostic import het_breuschpagan
stat, p_value, _, _ = het_breuschpagan(residuals, model.model.exog)
print(f"Тест Бреуша-Пагана: статистика={stat}, p-значение={p_value}")

Влиятельные наблюдения

# Анализ влияния
influence = model.get_influence()
summary_frame = influence.summary_frame()

# Расстояние Кука
cooks_distance = summary_frame["cooks_d"]
print("Наблюдения с большим влиянием:", cooks_distance[cooks_distance > 0.5])

Визуализация результатов

Диагностические графики

import matplotlib.pyplot as plt

# График остатков против предсказанных значений
fig, ax = plt.subplots(figsize=(8, 6))
ax.scatter(model.fittedvalues, residuals)
ax.axhline(y=0, color='r', linestyle='--')
ax.set_xlabel('Предсказанные значения')
ax.set_ylabel('Остатки')
ax.set_title('Остатки против предсказанных значений')
plt.show()

# Парциальная регрессия
sm.graphics.plot_partregress_grid(model, fig=plt.figure(figsize=(12, 8)))
plt.show()

Графики временных рядов

# Автокорреляция
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf

fig, axes = plt.subplots(2, 1, figsize=(12, 8))
plot_acf(data["series"], ax=axes[0], lags=20)
plot_pacf(data["series"], ax=axes[1], lags=20)
plt.show()

Таблица основных методов и функций

Категория Метод/Функция Описание
Регрессия sm.OLS() Обычные наименьшие квадраты
  sm.GLM() Обобщенные линейные модели
  sm.RLM() Робастная регрессия
  smf.ols() OLS с формульным интерфейсом
  smf.logit() Логистическая регрессия
  smf.poisson() Пуассоновская регрессия
Временные ряды ARIMA() Модель ARIMA
  SARIMAX() Сезонная ARIMA с экзогенными переменными
  ExponentialSmoothing() Экспоненциальное сглаживание
  VAR() Векторная авторегрессия
  seasonal_decompose() Сезонная декомпозиция
  adfuller() Тест Дики-Фуллера
  acf() Автокорреляционная функция
  pacf() Частичная автокорреляционная функция
Статистические тесты ttest_1samp() Одновыборочный t-тест
  ttest_ind() Двухвыборочный t-тест
  shapiro() Тест Шапиро-Уилка
  normaltest() Тест Д'Агостино
  levene() Тест Ливеня
  bartlett() Тест Бартлетта
  chi2_contingency() Хи-квадрат тест
Диагностика het_breuschpagan() Тест на гетероскедастичность
  durbin_watson() Тест Дарбина-Уотсона
  jarque_bera() Тест Жарка-Бера
  get_influence() Анализ влияния
Визуализация qqplot() Q-Q график
  plot_acf() График автокорреляции
  plot_pacf() График частичной автокорреляции
  plot_partregress() График парциальной регрессии
  plot_regress_exog() Диагностические графики
Вспомогательные add_constant() Добавление константы
  summary() Сводка результатов
  params Коэффициенты модели
  pvalues P-значения
  rsquared Коэффициент детерминации
  predict() Предсказания
  conf_int() Доверительные интервалы

Практические примеры применения

Анализ эффективности маркетинговых кампаний

# Многомерная регрессия для анализа влияния различных каналов
model = smf.ols("sales ~ tv_spend + radio_spend + online_spend + C(season)", data=marketing_data).fit()

# Анализ значимости каналов
print("Значимые каналы:")
for var, pval in model.pvalues.items():
    if pval < 0.05:
        print(f"{var}: p-значение = {pval:.4f}")

Прогнозирование финансовых показателей

# Модель для временного ряда цен акций
model = ARIMA(stock_prices, order=(2, 1, 1))
results = model.fit()

# Прогноз на 30 дней
forecast = results.forecast(steps=30)
conf_int = results.get_forecast(steps=30).conf_int()

print("Прогноз цены через 30 дней:", forecast[-1])

Анализ A/B тестов

# Сравнение конверсий между группами
contingency_table = pd.crosstab(data["group"], data["converted"])
chi2, p_value, dof, expected = chi2_contingency(contingency_table)

print(f"Хи-квадрат статистика: {chi2}")
print(f"P-значение: {p_value}")

# Логистическая регрессия для учета дополнительных факторов
model = smf.logit("converted ~ C(group) + age + income", data=data).fit()
print(model.summary())

Оптимизация производительности

Работа с большими данными

# Использование чанков для больших датасетов
def process_in_chunks(data, chunk_size=10000):
    results = []
    for chunk in pd.read_csv(data, chunksize=chunk_size):
        model = smf.ols("y ~ x1 + x2", data=chunk).fit()
        results.append(model.params)
    return pd.concat(results)

Кэширование результатов

# Сохранение результатов модели
import pickle

# Сохранение
with open('model_results.pkl', 'wb') as f:
    pickle.dump(model, f)

# Загрузка
with open('model_results.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

Интеграция с другими библиотеками

Связь с Scikit-learn

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# Предобработка данных
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Разделение данных
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2)

# Построение модели в Statsmodels
X_train_sm = sm.add_constant(X_train)
model = sm.OLS(y_train, X_train_sm).fit()

Визуализация с Seaborn

import seaborn as sns

# Корреляционная матрица
correlation_matrix = data.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Корреляционная матрица переменных')
plt.show()

# Парные графики
sns.pairplot(data, hue='category')
plt.show()

Часто задаваемые вопросы

В чем отличие Statsmodels от Scikit-learn?

Statsmodels ориентирован на статистическое моделирование и интерпретацию результатов, предоставляя подробную статистику, p-значения, доверительные интервалы. Scikit-learn сосредоточен на машинном обучении и предсказательной точности.

Как работать с категориальными переменными?

В формульном интерфейсе используйте синтаксис C(variable). В классическом интерфейсе предварительно преобразуйте переменные в dummy-переменные с помощью pd.get_dummies().

Как выбрать подходящую модель временных рядов?

Начните с анализа структуры данных: проверьте стационарность, наличие сезонности и тренда. Для нестационарных рядов используйте ARIMA, для сезонных - SARIMA, для множественных рядов - VAR.

Как интерпретировать результаты summary()?

Обратите внимание на коэффициенты, их стандартные ошибки, t-статистики и p-значения. R-squared показывает долю объясненной дисперсии. F-статистика тестирует общую значимость модели.

Можно ли использовать Statsmodels для нелинейных зависимостей?

Да, через полиномиальные термы в формулах, сплайны, или обобщенные аддитивные модели. Также доступны нелинейные методы наименьших квадратов.

Как обрабатывать пропущенные значения?

Statsmodels автоматически исключает наблюдения с пропущенными значениями. Для контроля используйте параметр missing='drop' или предварительно обработайте данные.

Лучшие практики использования

Проверка предпосылок модели

# Проверка линейности
sm.graphics.plot_partregress_grid(model)

# Проверка нормальности остатков
sm.qqplot(model.resid, line='s')

# Проверка независимости
from statsmodels.stats.diagnostic import durbin_watson
dw_stat = durbin_watson(model.resid)
print(f"Статистика Дарбина-Уотсона: {dw_stat}")

Кросс-валидация

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LinearRegression

# Сравнение с sklearn для валидации
lr = LinearRegression()
scores = cross_val_score(lr, X, y, cv=5, scoring='r2')
print(f"Средний R² при кросс-валидации: {scores.mean():.4f}")

Документирование анализа

# Создание отчета
report = f"""
Анализ модели:
- R²: {model.rsquared:.4f}
- Скорректированный R²: {model.rsquared_adj:.4f}
- F-статистика: {model.fvalue:.4f}
- P-значение F-теста: {model.f_pvalue:.4f}
- Количество наблюдений: {model.nobs}
"""
print(report)

Заключение: когда и зачем использовать Statsmodels

Statsmodels является незаменимым инструментом для серьезного статистического анализа в Python. Библиотека особенно ценна в следующих случаях:

Исследовательский анализ данных: когда необходимо понять структуру данных, выявить закономерности и проверить статистические гипотезы.

Научные исследования: для получения статистически обоснованных выводов с указанием уровней значимости и доверительных интервалов.

Эконометрический анализ: при построении моделей экономических процессов, анализе панельных данных и временных рядов.

Бизнес-аналитика: для анализа эффективности маркетинговых кампаний, A/B тестирования и прогнозирования ключевых показателей.

Академические проекты: когда требуется детальная статистическая интерпретация результатов и соответствие научным стандартам.

Благодаря тесной интеграции с экосистемой Python (Pandas, NumPy, Matplotlib), богатой функциональности и подробной документации, Statsmodels представляет собой мощный инструмент для решения широкого спектра задач статистического анализа. Выбор между Statsmodels и другими библиотеками должен основываться на конкретных потребностях проекта: если важны интерпретируемость и статистическая строгость, Statsmodels является оптимальным выбором.

Рекомендаций