Анализ и визуализация распределений данных в Python
Распределение данных: основные подходы в 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.
Расширенные примеры работы с распределениями данных.
Генерация нескольких распределений и их визуализация
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
Позволяет сравнить характеристики распределений в разных категориях.