Расчет p-value и подгонка данных под теорию в Python

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для подгонки эмпирического распределения под теоретическое с использованием библиотеки Scipy вам потребуется выполнить следующие шаги:

  1. Импортировать модуль stats: from scipy import stats.
  2. Выбрать модель теоретического распределения, например, нормальное: stats.norm.
  3. Подобрать параметры распределения для ваших данных: используйте params = stats.norm.fit(data).

Пример кода на Python:

Python
Скопировать код
from scipy import stats
import numpy as np

# Используемые эмпирические данные
data = np.array([...])

# Подгонка модели и получение параметров распределения
params = stats.norm.fit(data)
print(f"Среднее: {params[0]}, Стандартное отклонение: {params[1]}")

Для проверки точности аппроксимации используйте статистические тесты или визуализацию. Убедитесь, что выбранная вами модель точно описывает ваши данные.

Кинга Идем в IT: пошаговый план для смены профессии

Исследование всех доступных распределений

Рассмотрим процесс анализа всех потенциально подходящих распределений, доступных в Scipy:

Python
Скопировать код
from scipy import stats
import numpy as np
import warnings

# Рассматриваемые эмпирические данные
data = np.array([...])
sse = {}  # Словарь для хранения сумм квадратичных ошибок

for dist_name in dir(stats):
    if isinstance(getattr(stats, dist_name), stats.rv_continuous):
        distribution = getattr(stats, dist_name)
        with warnings.catch_warnings():
            warnings.filterwarnings('ignore')

            # Подгонка распределения и расчёт суммы квадратных ошибок
            params = distribution.fit(data) 
            fitted_pdf = distribution.pdf(np.sort(data), *params[:-2], loc=params[-2], scale=params[-1])
            sse[dist_name] = np.sum(np.power(data – fitted_pdf, 2.0))

# Выбор распределения, наилучшим образом описывающего данные
best_fit = min(sse, key=sse.get)

Исправление данных

Чтобы улучшить визуальное представление аппроксимации, особенно при работе с целочисленными данными, используйте метод сглаживания:

Python
Скопировать код
from scipy.ndimage.filters import gaussian_filter1d

# fitted_pdf – плотность вероятности подогнанного распределения
smooth_pdf = gaussian_filter1d(fitted_pdf, sigma=2.0)  # Мы получили сглаженную кривую!

Приглаживание поможет вам получить более ровные и эстетически приятные аппроксимации, которые будут более точно отражать распределение ваших данных.

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

Для сравнения различных теоретических распределений используйте визуальный анализ, аналогично подбору собственного образа (одежды):

Python
Скопировать код
scipy.stats.fit(data) # Это ваш персональный стилист по работе с данными!

Особенности работы с нестандартными данными

В некоторых случаях данные не следуют стандартным распределениям. В этих ситуациях:

Выбор наиболее подходящих моделей

Для выбора между несколькими моделями вы можете использовать критерии AIC, BIC или логарифм правдоподобия:

Python
Скопировать код
aic = 2 * num_params – 2 * log_likelihood  # Чем меньше значение AIC, тем лучше
bic = log(n) * num_params – 2 * log_likelihood  # Меньшее значение BIC также предпочтительно

Прогноз на будущее

С помощью подогнанной модели вы можете оценить вероятность появления новых данных:

Python
Скопировать код
p_value = distribution.sf(new_data_point, *params)  # Здесь вычисляется вероятность появления новой точки данных

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

Полезные функции �scipy.stats

При анализе дискретных распределений полезно знать о следующих функциях:

  • bincount: Отлично подходит для обработки целочисленных данных.
  • cumsum: Полезна для вычисления накопительной суммы.

Также для получения дополнительных знаний полезно обратиться к статьям о функциях хвостового распределения, таким как ccdf, на ресурсах вроде Wikipedia.

Полезные материалы

  1. Статистические функции (scipy.stats) — Руководство SciPy v1.12.0 — основной ресурс по статистическому моделированию в Scipy.
  2. numpy – Подгонка эмпирического распределения под теоретические с использованием Scipy (Python)? – Stack Overflow — обсуждение вопросов подгонки распределений на сайте Stack Overflow.
  3. Независимый t-тест на Python | Scientifically Sound — руководство по проведению статистических t-тестов в Python.
  4. scipy.stats.kstest — Руководство SciPy v1.12.0 — подробное описание теста Колмогорова-Смирнова для сравнения распределений.
  5. Сравнение распределений с помощью теста хи-квадрат на соответствие — обзор для любителей статистики и методов основанных на "хи-квадрате".
  6. 1.3.6.2. Связанные распределения — необходимы материалы от Национального института стандартов и технологий по распределениям и методу моментов.