Как построить распределение в Python

Как построить распределение в python

Как построить распределение в python

При работе с данными часто требуется наглядно отразить их структуру: выявить плотность значений, форму выборки, наличие выбросов. В Python для этого применяют функции из библиотек matplotlib, seaborn и scipy. Каждая из них позволяет строить гистограммы, графики плотности вероятности и комбинированные визуализации.

Чтобы корректно отобразить распределение, необходимо учитывать размер выборки, шаг бинов и тип данных. Например, для числовых последовательностей оптимальное количество бинов можно рассчитать по правилу Фридмана–Диакониса, что уменьшает искажения при малом объеме данных. Для категориальных переменных лучше использовать частотные диаграммы, а не плотности.

При построении распределений важно оценивать не только визуальную форму, но и числовые характеристики: среднее, дисперсию, коэффициенты асимметрии и эксцесса. Эти метрики можно получить с помощью numpy или scipy.stats и сравнить их с графическим представлением, что повышает точность анализа.

В дальнейших разделах статьи будут показаны практические примеры: построение гистограмм с matplotlib, графиков плотности с seaborn, а также наложение эмпирического распределения на теоретическое для проверки гипотез о виде выборки.

Выбор библиотеки для работы с распределениями

Выбор библиотеки для работы с распределениями

scipy.stats – основной инструмент для моделирования распределений. Он содержит более 100 встроенных функций плотности и распределения, поддержку параметризации (среднее, дисперсия, сдвиг, масштаб) и методы для генерации случайных величин. Оптимален для строгих статистических задач.

numpy.random обеспечивает быстрый генератор псевдослучайных чисел и стандартные распределения (нормальное, биномиальное, пуассоновское и др.). Подходит для симуляций, когда не требуется расширенный статистический функционал.

statsmodels полезен для задач, где важно не только распределение, но и оценка параметров, тесты и регрессионный анализ. Его функции позволяют подгонять распределения под реальные данные и сравнивать результаты.

matplotlib и seaborn незаменимы для визуализации. Первая подходит для гибкой настройки гистограмм и кривых плотности, вторая – для быстрого построения информативных графиков, включая kdeplot и histplot.

Рекомендация: для научных расчётов использовать scipy.stats, для массовых симуляций – numpy.random, для анализа данных – statsmodels, для визуализации – комбинацию matplotlib и seaborn.

Создание выборки случайных данных

Создание выборки случайных данных

Для генерации выборки в Python чаще всего применяются функции из модуля numpy.random. Например, равномерное распределение создаётся вызовом numpy.random.uniform(low, high, size), где low и high задают границы интервала, а size определяет количество элементов.

При моделировании нормального распределения используется numpy.random.normal(loc, scale, size), где loc – математическое ожидание, scale – стандартное отклонение. Для проверки статистических гипотез удобно брать выборку не менее 1000 элементов.

Дискретные величины формируются через numpy.random.randint(low, high, size). Например, numpy.random.randint(0, 10, 50) создаст массив из 50 целых чисел от 0 до 9.

Чтобы результаты можно было воспроизвести, рекомендуется фиксировать генератор случайных чисел вызовом numpy.random.seed(номер_состояния).

Построение гистограммы с помощью matplotlib

Для визуализации распределения значений массива удобно использовать функцию hist() из библиотеки matplotlib.pyplot. Она автоматически разбивает данные на интервалы и подсчитывает количество элементов в каждом из них.

Пример построения гистограммы для выборки из нормального распределения:

import numpy as np
import matplotlib.pyplot as plt
data = np.random.normal(loc=0, scale=1, size=1000)
plt.hist(data, bins=20, edgecolor='black')
plt.xlabel('Значения')
plt.ylabel('Частота')
plt.title('Гистограмма выборки')
plt.show()

Параметры функции hist():

Параметр Назначение Пример
bins Количество или границы интервалов bins=30
density Нормировка частот до вероятностей density=True
range Ограничение интервала данных range=(-3, 3)
color Цвет столбцов color='skyblue'
edgecolor Цвет границ столбцов edgecolor='black'

Для анализа плотности распределения полезно комбинировать hist() с графиком функции плотности вероятности, рассчитанной через scipy.stats или ядровую оценку плотности из seaborn. Это позволяет сопоставить эмпирические данные с теоретической моделью.

Использование seaborn для визуализации плотности

Библиотека seaborn предоставляет функцию kdeplot, позволяющую строить оценку плотности распределения на основе ядровых методов. Для числового массива достаточно вызвать sns.kdeplot(data, fill=True), чтобы получить гладкую кривую и закрашенную область под ней.

При работе с большими выборками рекомендуется указывать параметр bw_adjust, контролирующий степень сглаживания. Например, bw_adjust=0.5 сделает кривую более детализированной, а bw_adjust=2 сгладит шум.

Для сравнения нескольких выборок удобно передавать их в один вызов с параметром hue. В таком случае seaborn отобразит плотности разных групп на одной оси, что облегчает анализ различий между ними.

Если данные содержат выбросы, полезно ограничить диапазон оси с помощью аргумента clip. Это позволяет сосредоточиться на центральной части распределения и избежать искажений графика.

Применение scipy.stats для моделирования распределений

Модуль scipy.stats содержит более 100 вероятностных распределений с готовыми методами для генерации случайных величин, оценки параметров и вычисления функций плотности/распределения.

  • Создание распределения: любой объект распределения инициализируется вызовом с параметрами. Например, нормальное распределение: norm(loc=0, scale=1).
  • Генерация данных: метод .rvs(size=n) возвращает выборку случайных чисел. Это удобно для симуляций и тестирования.
  • Функции распределения:
    • .pdf(x) – плотность вероятности;
    • .cdf(x) – функция распределения;
    • .ppf(q) – квантиль.
  • Оценка параметров: метод .fit(data) подбирает параметры распределения под эмпирические данные.
  • Сравнение моделей: статистики kstest или chisquare позволяют проверить согласие выборки с теоретическим распределением.

Пример генерации 1000 наблюдений из распределения Стьюдента с 10 степенями свободы и оценки параметров:


from scipy.stats import t
data = t.rvs(df=10, size=1000)
params = t.fit(data)

Для комбинирования нескольких распределений полезно использовать rv_continuous и rv_discrete как базовые классы и создавать собственные модели.

Сравнение эмпирических данных с теоретическим распределением

Сравнение эмпирических данных с теоретическим распределением

Для проверки соответствия эмпирических данных теоретическому распределению в Python используют библиотеку scipy.stats и визуализацию через matplotlib или seaborn. Начнем с построения гистограммы данных и наложения плотности теоретического распределения. Например, для нормального распределения:

from scipy.stats import norm

import matplotlib.pyplot as plt

import numpy as np

data = np.random.normal(loc=5, scale=2, size=1000)

xmin, xmax = min(data), max(data)

x = np.linspace(xmin, xmax, 100)

p = norm.pdf(x, np.mean(data), np.std(data))

plt.hist(data, bins=30, density=True, alpha=0.6)

plt.plot(x, p, ‘r’, linewidth=2)

plt.show()

Для количественной оценки совпадения распределений применяют тест Kolmogorov-Smirnov или Chi-squared. Например, тест Колмогорова-Смирнова:

from scipy.stats import kstest

statistic, p_value = kstest(data, ‘norm’, args=(np.mean(data), np.std(data)))

print(f’Statistic: {statistic}, p-value: {p_value}’)

Если p-value > 0.05, отклонять гипотезу о соответствии данных нормальному распределению не требуется. Для визуального анализа полезно строить Q-Q график, который показывает отклонения на хвостах распределения:

import scipy.stats as stats

import matplotlib.pyplot as plt

stats.probplot(data, dist=»norm», plot=plt)

plt.show()

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

from scipy.stats import poisson

mu = np.mean(data)

x = np.arange(min(data), max(data)+1)

plt.hist(data, bins=range(min(data), max(data)+2), density=True, alpha=0.6)

plt.plot(x, poisson.pmf(x, mu), ‘ro’)

plt.show()

Важная рекомендация: визуальное совпадение гистограммы и теоретической кривой не гарантирует статистической значимости, поэтому всегда комбинируйте графики с количественными тестами. Для больших выборок Chi-squared тест показывает чувствительные отклонения даже при малых несоответствиях, а для малых – Kolmogorov-Smirnov более устойчив.

Сохранение графика распределения в файл

Для сохранения графика распределения в Python чаще всего используют библиотеку matplotlib. Основная функция для этого – savefig(), которая позволяет сохранять изображение в различных форматах, включая PNG, PDF, SVG и JPEG.

Пример сохранения гистограммы распределения:

import matplotlib.pyplot as plt
import numpy as np
data = np.random.normal(0, 1, 1000)
plt.hist(data, bins=30, color='skyblue', edgecolor='black')
plt.title("Гистограмма распределения")
plt.xlabel("Значение")
plt.ylabel("Частота")
plt.savefig("histogram.png", dpi=300, bbox_inches='tight')
plt.close()

Рекомендации при сохранении графика:

  • dpi – задаёт разрешение. Для публикаций оптимально использовать 300 или выше.
  • bbox_inches='tight' – убирает лишние поля вокруг графика.
  • Формат файла определяется расширением в имени файла: .png, .pdf, .svg.
  • Перед повторным созданием графика используйте plt.close(), чтобы избежать наложения старых данных.
  • Для прозрачного фона добавьте transparent=True.

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

Вопрос-ответ:

Какие библиотеки лучше использовать для построения распределений в Python?

Для работы с распределениями часто применяют библиотеки numpy, scipy и matplotlib. NumPy позволяет генерировать данные с нужным распределением и проводить базовые операции. SciPy предлагает готовые функции для стандартных распределений, например, нормального или экспоненциального. Matplotlib помогает визуализировать результаты, строя гистограммы или плотности распределений. Комбинация этих инструментов позволяет как создавать данные, так и наглядно представлять их свойства.

Как построить гистограмму для случайных данных?

Для гистограммы сначала нужно получить массив данных. С помощью функции numpy.random можно сгенерировать случайные значения нужного распределения, например, нормального. Далее matplotlib.pyplot.hist строит график, где по оси X откладываются интервалы, а по оси Y — количество элементов в каждом интервале. Дополнительно можно настроить количество корзин (bins), цвет, прозрачность и нормировку, чтобы гистограмма отображала плотность распределения.

Чем отличается гистограмма от графика плотности распределения?

Гистограмма показывает частоту попадания значений в определённые интервалы, то есть как много точек попало в каждый «корзинный» диапазон. График плотности, например с использованием функции scipy.stats.gaussian_kde, отображает непрерывную кривую, которая приближает распределение данных. График плотности удобен, если нужно видеть форму распределения без дискретизации, а гистограмма хорошо подходит для визуального анализа конкретного числа наблюдений в интервалах.

Как визуально сравнить два распределения на одном графике?

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

Как проверить, что данные соответствуют нормальному распределению?

Для проверки используют визуальные и статистические методы. Визуально можно построить гистограмму или график плотности и сравнить форму с колоколообразной кривой. Статистически применяют тесты, такие как Shapiro-Wilk или Kolmogorov-Smirnov, которые проверяют гипотезу о нормальности. Кроме того, на графике Q-Q plot точки, выстроенные по диагонали, указывают на близость распределения к нормальному. Эти методы помогают оценить, насколько данные соответствуют ожидаемой модели.

Ссылка на основную публикацию