Как выполнить корреляционный анализ в pandas с функцией pd.corr
Пройдите тест, узнайте какой профессии подходите
Для кого эта статья:
- аналитики данных и статистики
- студенты и начинающие специалисты в области аналитики
- профессионалы, работающие с данными и интересующиеся методами их анализа
Обнаружение скрытых взаимосвязей в данных — одна из самых мощных способностей аналитика. Корреляционный анализ помогает увидеть то, что невооруженным глазом заметить невозможно: как цены на недвижимость связаны с уровнем преступности, как успеваемость зависит от времени сна, или какие метрики вашего бизнеса действительно влияют на прибыль. В 2025 году библиотека pandas остается золотым стандартом для таких задач, а функция pd.corr()
— это ваш швейцарский нож для быстрого и эффективного выявления этих закономерностей. 🔍 Давайте разберемся, как использовать этот инструмент на полную мощность.
Хотите стать экспертом в анализе данных и корреляционном анализе с pandas? Курс «Аналитик данных» с нуля от Skypro погружает вас в мир python и pandas с первых занятий! Вы не просто научитесь выполнять корреляционный анализ, но сможете проводить комплексные исследования на реальных данных. Наши выпускники уже через 7 месяцев находят работу в крупнейших аналитических отделах. Присоединяйтесь!
Основы корреляционного анализа с pd.corr
Корреляционный анализ — это статистический метод, определяющий степень связи между переменными. Представьте его как детектор отношений в мире данных. Коэффициент корреляции варьируется от -1 до +1, где:
- +1 указывает на идеальную положительную связь (одна переменная растет — другая тоже растет)
- 0 означает отсутствие линейной связи
- -1 означает идеальную отрицательную связь (одна растет — другая падает)
Функция pd.corr()
в библиотеке pandas — это элегантное решение для вычисления корреляций между всеми числовыми столбцами DataFrame. Вот простейший пример использования:
import pandas as pd
import numpy as np
# Создаем простой DataFrame
data = {
'sales': [20, 25, 30, 35, 40],
'advertising': [5, 7, 10, 12, 15],
'temperature': [15, 20, 18, 25, 30],
'competitor_price': [22, 21, 20, 19, 18]
}
df = pd.DataFrame(data)
# Вычисляем корреляционную матрицу
correlation_matrix = df.corr()
print(correlation_matrix)
Это сгенерирует матрицу корреляций Пирсона между всеми числовыми столбцами нашего датафрейма. Фактически, мы получаем карту взаимосвязей для всех наших данных одним вызовом функции. 🧠
Александр Громов, ведущий аналитик данных:
Когда я только начинал работать с анализом финансовых данных, мне приходилось часами вручную проверять связи между десятками метрик. Однажды мне поручили проанализировать факторы, влияющие на доходность портфеля из 50+ ценных бумаг. Я думал, что это займет неделю. Коллега показал мне, как использовать
pd.corr()
и настроить визуализацию. За час я обнаружил, что один, казалось бы, незначительный индикатор имел корреляцию 0.87 с доходностью в кризисные периоды — что полностью противоречило нашей инвестиционной теории. Теперь корреляционный анализ с pandas — первое, с чего я начинаю любое исследование.
Важно понимать, что корреляция не означает причинно-следственную связь. Это лишь указание на то, что переменные изменяются вместе определенным образом. Например, продажи мороженого и количество утоплений могут коррелировать, но не потому что мороженое вызывает утопления, а потому что оба показателя увеличиваются в жаркую погоду.
Интерпретация коэффициента корреляции | Значение | Практический пример |
---|---|---|
0.00 – 0.19 | Очень слабая связь | Рост человека и его IQ |
0.20 – 0.39 | Слабая связь | Время просмотра ТВ и оценки в школе |
0.40 – 0.59 | Умеренная связь | Часы тренировок и снижение веса |
0.60 – 0.79 | Сильная связь | Количество сигарет и риск заболеваний лёгких |
0.80 – 1.00 | Очень сильная связь | Рост затрат на рекламу и объем продаж |

Подготовка данных для работы с pd.corr()
Перед тем как применять корреляционный анализ, необходимо правильно подготовить данные. Функция pd.corr()
работает только с числовыми столбцами, автоматически исключая нечисловые типы. Вот шаги, которые стоит предпринять для получения надежных результатов:
- Очистка данных от пропусков: корреляционный анализ чувствителен к пропущенным значениям. Можно использовать
df.dropna()
илиdf.fillna()
- Преобразование категориальных переменных: чтобы включить их в анализ, используйте кодирование (например, one-hot encoding)
- Удаление выбросов: экстремальные значения могут искажать корреляции
- Проверка нормальности распределения: особенно важно для корреляции Пирсона
Вот пример предварительной обработки данных:
# Загружаем тестовый датасет
df = pd.read_csv('financial_data.csv')
# Проверяем типы данных
print(df.dtypes)
# Обрабатываем пропуски
df = df.dropna() # или df.fillna(df.mean())
# Преобразуем категориальные переменные с помощью one-hot encoding
df = pd.get_dummies(df, columns=['region', 'customer_segment'])
# Обнаруживаем и удаляем выбросы для столбца 'revenue'
Q1 = df['revenue'].quantile(0.25)
Q3 = df['revenue'].quantile(0.75)
IQR = Q3 – Q1
df = df[~((df['revenue'] < (Q1 – 1.5 * IQR)) | (df['revenue'] > (Q3 + 1.5 * IQR)))]
# Теперь можем выполнить корреляционный анализ
corr_matrix = df.corr()
Особое внимание стоит уделить масштабированию данных. Хотя корреляционный анализ сам по себе не требует приведения переменных к одному масштабу (в отличие от некоторых методов машинного обучения), правильное масштабирование может облегчить интерпретацию и визуализацию результатов. 📊
Также важно учитывать, что некоторые связи между переменными могут быть нелинейными, а стандартный корреляционный анализ обнаруживает только линейные отношения. Поэтому иногда полезно применять трансформации к данным перед анализом:
# Логарифмическая трансформация для выявления нелинейных связей
df['log_revenue'] = np.log(df['revenue'] + 1) # +1 чтобы избежать log(0)
df['sqrt_marketing'] = np.sqrt(df['marketing_spend'])
# Теперь можем оценить корреляции с трансформированными переменными
transformed_corr = df.corr()
Не забывайте проверять данные на мультиколлинеарность — высокую корреляцию между независимыми переменными. Это особенно важно, если после корреляционного анализа вы планируете строить регрессионные модели. В 2025 году автоматическое обнаружение мультиколлинеарности стало стандартной практикой в анализе данных.
Методы корреляции и параметры функции pd.corr
Функция pd.corr()
предлагает несколько методов расчета корреляции, каждый из которых имеет свои особенности и области применения. Выбор правильного метода критически важен для получения достоверных результатов. 🔬
Основные параметры функции pd.corr()
:
DataFrame.corr(method='pearson', min_periods=1, numeric_only=True)
Рассмотрим каждый параметр и доступные методы корреляции:
Метод | Описание | Когда использовать | Требования к данным |
---|---|---|---|
pearson (по умолчанию) | Измеряет линейную зависимость между переменными | Для непрерывных данных с линейными отношениями | Числовые данные, желательно нормально распределенные |
kendall | Ранговая корреляция, учитывающая согласованность пар наблюдений | Для порядковых данных, устойчив к выбросам | Любые данные, которые можно ранжировать |
spearman | Ранговый аналог корреляции Пирсона | Для обнаружения монотонных зависимостей, не обязательно линейных | Любые данные, которые можно ранжировать |
Параметр min_periods
определяет минимальное количество наблюдений, необходимых для расчета корреляции. Это особенно полезно при работе с данными, содержащими пропущенные значения.
Параметр numeric_only
указывает, следует ли включать только числовые столбцы в расчет (по умолчанию True).
Вот пример использования различных методов корреляции:
# Сравним различные методы корреляции
pearson_corr = df.corr(method='pearson')
kendall_corr = df.corr(method='kendall')
spearman_corr = df.corr(method='spearman')
# Выводим разницу между методами для конкретной пары переменных
print(f"Pearson correlation between revenue and marketing: {pearson_corr.loc['revenue', 'marketing_spend']:.3f}")
print(f"Kendall correlation between revenue and marketing: {kendall_corr.loc['revenue', 'marketing_spend']:.3f}")
print(f"Spearman correlation between revenue and marketing: {spearman_corr.loc['revenue', 'marketing_spend']:.3f}")
При выборе метода корреляции рекомендуется учитывать характеристики ваших данных:
- Корреляция Пирсона обнаруживает линейные взаимосвязи и чувствительна к выбросам. Если ваши данные содержат экстремальные значения, результаты могут быть искажены.
- Корреляция Спирмена менее чувствительна к выбросам и нелинейным отношениям. Она работает с ранжированными данными, что делает её надежной для широкого спектра распределений.
- Корреляция Кендалла также устойчива к выбросам и часто предпочтительна для небольших выборок данных, а также когда точные значения рангов имеют большое значение.
Для более специализированных задач можно использовать другие инструменты, например, функцию scipy.stats.pointbiserialr()
для расчета корреляции между бинарной и непрерывной переменными.
Елена Соколова, руководитель аналитического отдела:
В нашем проекте по анализу поведения пользователей мобильного приложения мы столкнулись с данными, которые имели явно нелинейный характер. Когда мы попытались использовать стандартную корреляцию Пирсона, результаты показали очень слабую связь между частотой использования приложения и внутриигровыми покупками — всего 0.22. Это противоречило нашей бизнес-интуиции.
Перейдя на метод Спирмена, мы обнаружили корреляцию 0.78! Оказалось, что связь была сильной, но не линейной — после определенного порога частоты использования вероятность покупки резко возрастала. Это открытие позволило нам перестроить модель монетизации и увеличить конверсию на 34%. С тех пор мы всегда проверяем данные несколькими методами корреляции, чтобы не упустить реально существующие связи.
Помимо стандартных методов, можно также использовать частичные корреляции для контроля влияния третьих переменных, что особенно важно при работе со сложными многомерными данными. Для этого потребуется дополнительная библиотека, например, pingouin
:
import pingouin as pg
# Рассчитываем частичную корреляцию между revenue и marketing_spend,
# контролируя влияние customer_age
partial_corr = pg.partial_corr(data=df, x='revenue', y='marketing_spend', covar='customer_age')
print(partial_corr)
Визуализация корреляционных матриц в pandas
Визуализация корреляционных матриц — мощный инструмент для быстрого обнаружения закономерностей в данных. Хорошая визуализация может мгновенно выявить важные взаимосвязи, которые могут быть незаметны при изучении таблиц с числами. 🎨
Стандартный подход к визуализации корреляционной матрицы использует тепловую карту (heatmap):
import matplotlib.pyplot as plt
import seaborn as sns
# Вычисляем корреляционную матрицу
correlation_matrix = df.corr()
# Создаем тепловую карту
plt.figure(figsize=(12, 10))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1, fmt='.2f')
plt.title('Корреляционная матрица')
plt.tight_layout()
plt.show()
Параметры, которые стоит настроить для улучшения визуализации:
- annot=True — отображает числовые значения корреляций в ячейках
- cmap — цветовая схема (coolwarm, viridis, BrBG и др.)
- vmin=-1, vmax=1 — обеспечивает единую цветовую шкалу
- fmt='.2f' — форматирует числа до двух знаков после запятой
Для больших датасетов с десятками переменных визуализация всей корреляционной матрицы может стать нечитаемой. В таких случаях полезны следующие подходы:
- Фильтрация и выбор наиболее значимых корреляций:
# Выбираем только высокие корреляции (по модулю > 0.5)
threshold = 0.5
high_corr = correlation_matrix[abs(correlation_matrix) > threshold]
high_corr = high_corr.stack().reset_index()
high_corr.columns = ['Variable 1', 'Variable 2', 'Correlation']
high_corr = high_corr[high_corr['Variable 1'] != high_corr['Variable 2']] # Удаляем диагональ
# Сортируем по абсолютному значению корреляции
high_corr['abs_correlation'] = abs(high_corr['Correlation'])
high_corr = high_corr.sort_values('abs_correlation', ascending=False)
print(high_corr[['Variable 1', 'Variable 2', 'Correlation']])
- Визуализация корреляций с целевой переменной:
# Если у нас есть целевая переменная, например 'revenue'
target_correlations = correlation_matrix['revenue'].sort_values(ascending=False)
# Создаем горизонтальную столбчатую диаграмму
plt.figure(figsize=(10, 8))
target_correlations[1:].plot(kind='barh') # [1:] чтобы исключить корреляцию с самим собой
plt.title('Корреляция переменных с выручкой')
plt.axvline(x=0, color='r', linestyle='-')
plt.tight_layout()
plt.show()
- Кластеризованные тепловые карты для обнаружения групп связанных переменных:
# Перестановка строк и столбцов на основе иерархической кластеризации
sns.clustermap(correlation_matrix,
annot=True,
cmap='coolwarm',
vmin=-1,
vmax=1,
fmt='.2f',
figsize=(12, 12),
linewidths=.5)
plt.title('Кластеризованная корреляционная матрица')
plt.tight_layout()
plt.show()
Дополнительные приемы для улучшения визуализации корреляционных матриц:
- Использование треугольных матриц для устранения избыточной информации
- Добавление уровней значимости (p-values) к визуализации
- Применение интерактивных визуализаций с библиотеками Plotly или Bokeh
- Создание сетевых графов для представления сложных взаимосвязей
Для очень больших наборов данных или при автоматизированном анализе можно использовать библиотеки автоматической визуализации, такие как pandas-profiling или sweetviz, которые генерируют интерактивные отчеты с корреляционными матрицами и дополнительной статистикой.
Не уверены, подходит ли вам карьера аналитика данных? Тест на профориентацию от Skypro поможет определить, насколько аналитика соответствует вашим сильным сторонам. За 5 минут вы узнаете, стоит ли инвестировать время в освоение pandas и корреляционного анализа, или ваши таланты лежат в другой области. Тест разработан опытными HR-специалистами технологических компаний и учитывает реальные требования рынка 2025 года.
Интерпретация результатов и практические рекомендации
Корреляционный анализ — мощный инструмент, но его истинная ценность проявляется только при правильной интерпретации результатов. В 2025 году правильное объяснение корреляций стало ещё более важным в эпоху алгоритмической прозрачности и доказательной аналитики. 🧐
Вот ключевые принципы интерпретации корреляционных матриц:
- Корреляция ≠ причинно-следственная связь. Этот принцип нельзя повторять достаточно часто. Сильная корреляция означает только то, что переменные изменяются вместе определенным образом.
- Учитывайте контекст данных. Корреляция 0.3 может быть очень значимой в одной области (например, образовании) и незначительной в другой (например, в биомедицине).
- Проверяйте на скрытые переменные. Часто корреляция является результатом влияния третьей переменной на обе исследуемые.
- Остерегайтесь мультиколлинеарности. Высокие корреляции между предикторами могут создавать проблемы в регрессионном анализе.
- Визуально проверяйте отношения. Диаграммы рассеяния помогают увидеть нелинейные отношения, которые корреляция может пропустить.
Практический подход к анализу корреляционных матриц включает следующие шаги:
# Получаем корреляционную матрицу
corr_matrix = df.corr()
# Проверяем корреляции с целевой переменной (например, 'revenue')
target_corrs = corr_matrix['revenue'].sort_values(ascending=False)
print("Корреляции с целевой переменной:")
print(target_corrs)
# Создаем диаграммы рассеяния для проверки наиболее сильных корреляций
top_features = target_corrs[1:6].index # 5 наиболее коррелированных признаков
for feature in top_features:
plt.figure(figsize=(8, 6))
plt.scatter(df[feature], df['revenue'], alpha=0.5)
plt.title(f'Связь между {feature} и revenue')
plt.xlabel(feature)
plt.ylabel('revenue')
# Добавляем линию тренда
z = np.polyfit(df[feature], df['revenue'], 1)
p = np.poly1d(z)
plt.plot(df[feature], p(df[feature]), "r--")
# Добавляем коэффициент корреляции на график
correlation = corr_matrix.loc['revenue', feature]
plt.annotate(f'r = {correlation:.2f}', xy=(0.7, 0.9), xycoords='axes fraction')
plt.show()
Для дальнейшего анализа стоит проверить статистическую значимость корреляций:
from scipy.stats import pearsonr
# Создадим функцию для подсчета p-values
def calculate_pvalues(df):
df_columns = df.columns.tolist()
pvalues = pd.DataFrame(index=df_columns, columns=df_columns)
for i in df_columns:
for j in df_columns:
pvalues.loc[i, j] = pearsonr(df[i].dropna(), df[j].dropna())[1]
return pvalues
# Получаем матрицу p-значений
pvalues_matrix = calculate_pvalues(df[df.columns])
print("P-values для корреляций:")
print(pvalues_matrix)
# Визуализируем значимые корреляции (p < 0.05)
significant_mask = pvalues_matrix < 0.05
significant_corr = corr_matrix * significant_mask
plt.figure(figsize=(12, 10))
sns.heatmap(significant_corr, cmap='coolwarm', annot=True, fmt='.2f', vmin=-1, vmax=1)
plt.title('Статистически значимые корреляции (p < 0.05)')
plt.tight_layout()
plt.show()
Практические рекомендации по использованию результатов корреляционного анализа:
- Для отбора признаков: используйте корреляции для выбора наиболее информативных признаков для моделирования, исключая сильно коррелирующие между собой переменные.
- Для бизнес-выводов: фокусируйтесь на обнаружении действенных взаимосвязей, которые могут привести к реальным улучшениям.
- Для генерации гипотез: используйте неожиданные корреляции как источник новых гипотез для дальнейшего исследования.
- Для мониторинга: отслеживайте изменения в корреляциях со временем, что может указывать на структурные изменения в данных или процессах.
Особые случаи и ловушки при интерпретации:
- Симпсонов парадокс: когда корреляция в общей популяции отличается от корреляций в подгруппах
- Нелинейные отношения: корреляция Пирсона может показывать низкие значения для сильных нелинейных связей
- Сезонность и тренды: могут создавать "ложные" корреляции во временных рядах
- Смещение выборки: корреляции, обнаруженные в одной выборке, могут не воспроизводиться в другой
Современные практики рекомендуют дополнять корреляционный анализ другими методами, такими как частичная корреляция, факторный анализ или причинно-следственное моделирование, для более глубокого понимания взаимосвязей в данных.
За пять простых шагов — от подготовки данных до визуализации корреляционных матриц — вы получили мощный инструмент для обнаружения скрытых взаимосвязей в ваших данных. Функция
pd.corr()
в pandas — это не просто линия кода, а окно в мир неочевидных закономерностей. Помните главное: корреляция указывает на взаимосвязь, но не объясняет её причину. Настоящее мастерство приходит с опытом сочетания корреляционного анализа с предметными знаниями. Так что не останавливайтесь на выявлении корреляций — задавайте вопрос "почему?" и превращайте статистические находки в ценные инсайты, которые изменят ваш бизнес, исследование или карьеру аналитика данных.