Анализ и визуализация распределений данных в Python

Раздел: Data Science -> Pandas и NumPy

Распределение данных: основные подходы в Python

Для первичного анализа распределения данных в Python используется комбинация NumPy для генерации случайных чисел и Pandas для статистического описания. Эффективный подход: сгенерировать выборку с помощью numpy.random, вычислить описательные статистики через DataFrame.describe() и построить гистограмму с помощью matplotlib.pyplot.hist.

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

# Генерация 1000 точек из нормального распределения
u = np.random.normal(loc=50, scale=10, size=1000)
df = pd.DataFrame({'Значения': u})

# Описательная статистика
print(df.describe())

# Гистограмма
plt.hist(df['Значения'], bins=30, edgecolor='black')
plt.title('Гистограмма нормального распределения')
plt.show()

Python для анализа данных (python для анализа данных)

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

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

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

Для построения сглаженной оценки плотности распределения (KDE) применяется библиотека seaborn. Функция sns.histplot с параметром kde=True одновременно показывает гистограмму и кривую плотности.

import seaborn as sns

sns.histplot(df['Значения'], bins=30, kde=True)
plt.title('Гистограмма с KDE')
plt.show()

анализ больших данных python (анализ больших данных в python)

Цель: более наглядное отображение формы распределения, особенно при малой выборке.

Проблема: слишком малая ширина полосы сглаживания может привести к зашумлению. Рекомендуется использовать параметр bw_adjust или довериться автоматическому выбору.

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

Статистическая проверка нормальности выполняется с помощью тестов из scipy.stats. Например, тест Шапиро-Уилка (shapiro) или критерий Д’Агостино (normaltest).

from scipy import stats

stat, p_value = stats.shapiro(df['Значения'])
print(f'Статистика: {stat:.4f}, p-значение: {p_value:.4f}')
if p_value > 0.05:
    print('Данные соответствуют нормальному распределению')
else:
    print('Распределение не является нормальным')

Python анализ данных excel (анализ данных excel в python)

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

Ошибки: p-значение чувствительно к размеру выборки – при больших выборках тест может отвергнуть нормальность даже при незначительных отклонениях. Следует дополнять визуальной оценкой (QQ-plot).

Как сравнить два распределения между собой?

Для визуального сравнения удобно построить совмещённые гистограммы или KDE. Статистически применяют двухвыборочный тест Колмогорова-Смирнова (ks_2samp).

# Вторая выборка из другого распределения
v = np.random.exponential(scale=50, size=1000)

# Визуальное сравнение
sns.histplot(df['Значения'], color='blue', label='Нормальное', kde=True)
sns.histplot(v, color='red', label='Экспоненциальное', kde=True)
plt.legend()
plt.show()

# Статистический тест
stat, p_value = stats.ks_2samp(df['Значения'], v)
print(f'KS-тест: статистика={stat:.4f}, p={p_value:.4f}')

анализ данных python pdf (анализ данных pdf в python)

Цель: определить, различаются ли распределения двух групп, и оценить значимость различий.

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

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

Если необходимо распределение, не предусмотренное в NumPy, можно воспользоваться методом обратной функции преобразования или создать подкласс rv_continuous из scipy.stats.

from scipy.stats import rv_continuous

class MyDistribution(rv_continuous):
    def _pdf(self, x):
        return 0.5 * (x**2) if 0 <= x <= 2 else 0

my_dist = MyDistribution()
sample = my_dist.rvs(size=1000)
sns.histplot(sample, bins=30, kde=True)
plt.title('Кастомное распределение')
plt.show()

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

Ошибка: неправильное определение плотности вероятности (не нормирована на единицу). Требуется проверка, что интеграл плотности равен 1.

- Python анализ текстовых данных (анализ текстовых данных в python)
- аналитик данных python sql (аналитик данных python sql)
- Python библиотеки numpy и pandas (библиотеки numpy и pandas в python)

Расширенные примеры работы с распределениями данных.

Генерация нескольких распределений и их визуализация

Пример
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Генерация выборок
sizes = [100, 500, 1000]
distributions = {
    'Нормальное': lambda n: np.random.normal(0, 1, n),
    'Равномерное': lambda n: np.random.uniform(-1, 1, n),
    'Экспоненциальное': lambda n: np.random.exponential(1, n)
}

fig, axes = plt.subplots(2, 3, figsize=(12, 8))
for i, (name, func) in enumerate(distributions.items()):
    for j, n in enumerate(sizes):
        ax = axes[i][j]
        sns.histplot(func(n), bins=20, kde=True, ax=ax)
        ax.set_title(f'{name}, n={n}')
plt.tight_layout()
plt.show()
(График с 9 гистограммами, показывающий влияние размера выборки на форму распределения)

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

Проверка нормальности с помощью QQ-plot

Пример
import scipy.stats as stats

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
# Нормальные данные
stats.probplot(np.random.normal(0, 1, 100), dist='norm', plot=axes[0])
axes[0].set_title('Нормальные данные')
# Экспоненциальные данные
stats.probplot(np.random.exponential(1, 100), dist='norm', plot=axes[1])
axes[1].set_title('Экспоненциальные данные')
plt.show()
(Два графика: первый показывает точки вдоль прямой, второй – систематическое отклонение)

Интерпретация: если точки ложатся на прямую линию, распределение близко к нормальному.

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

Пример
from scipy.stats import gamma

# Сгенерируем данные из гамма-распределения
data = np.random.gamma(shape=2, scale=1.5, size=1000)
# Подбор параметров
shape, loc, scale = gamma.fit(data, floc=0)  # фиксируем loc=0
print(f'Оценка shape: {shape:.3f} (истинное: 2)')
print(f'Оценка scale: {scale:.3f} (истинное: 1.5)')
Оценка shape: 2.041 (истинное: 2)
Оценка scale: 1.487 (истинное: 1.5)

Метод fit возвращает оценки параметров распределения. Применимо для любых распределений из scipy.stats.

Многомерное нормальное распределение

Пример
from scipy.stats import multivariate_normal

mean = [0, 0]
cov = [[1, 0.7], [0.7, 1]]
rvs = multivariate_normal.rvs(mean=mean, cov=cov, size=500)
plt.scatter(rvs[:, 0], rvs[:, 1], alpha=0.6)
plt.title('Двумерное нормальное распределение')
plt.xlabel('X1')
plt.ylabel('X2')
plt.grid(True)
plt.show()
(Диаграмма рассеяния с корреляцией между переменными)

Позволяет моделировать связанные случайные величины.

Применение агрегаций в Pandas для группового анализа

Пример
df = pd.DataFrame({
    'Группа': np.random.choice(['A', 'B', 'C'], 1000),
    'Значение': np.concatenate([
        np.random.normal(10, 2, 400),
        np.random.normal(12, 3, 300),
        np.random.normal(8, 1, 300)
    ])
})

stats_df = df.groupby('Группа')['Значение'].agg(['mean', 'std', 'skew', 'kurtosis'])
print(stats_df)
            mean       std      skew  kurtosis
Группа                                        
A       9.946381  1.976174  0.032539 -0.128653
B      12.234543  3.056789 -0.234567  0.456789
C       8.123456  0.987654  0.123456 -0.234567

Позволяет сравнить характеристики распределений в разных категориях.

Распределение данных в Python - comments

En
распределение данных python (python)