Расчет корреляции в Pandas: метод df.corr() для анализа данных

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

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

Для кого эта статья:

  • студенты и начинающие специалисты в области анализа данных
  • профессиональные аналитики и data scientists
  • преподаватели и тренеры в сфере анализа данных и статистики

Анализ корреляций в датасетах — ключевой этап, определяющий успех data-проекта. Метод df.corr() в библиотеке Pandas превратился в золотой стандарт для выявления скрытых связей между признаками. Овладение этим инструментом открывает дорогу к глубоким инсайтам, точным прогнозам и эффективной оптимизации моделей машинного обучения. Исследования показывают: более 78% data-аналитиков используют корреляционный анализ как базовый этап подготовки данных — без него ни один серьезный проект не обходится. 🔍

Хотите уверенно применять корреляционный анализ и другие профессиональные инструменты работы с данными? Курс «Аналитик данных» с нуля от Skypro поможет освоить не только методы корреляции в Pandas, но и весь стек технологий современного аналитика. Наши студенты уже через 3 месяца начинают применять корреляционный анализ в реальных проектах, а через полгода уверенно решают сложные бизнес-задачи с помощью Python и SQL.

Корреляционный анализ и метод df.corr() в Pandas

Корреляционный анализ представляет собой статистический метод, позволяющий оценить силу и направление взаимосвязи между переменными. Коэффициент корреляции варьируется от -1 до 1, где:

  • 1 означает идеальную положительную корреляцию (при увеличении одной переменной другая также увеличивается)
  • 0 указывает на отсутствие линейной зависимости
  • -1 свидетельствует о полной отрицательной корреляции (при увеличении одной переменной другая уменьшается)

В библиотеке Pandas метод df.corr() предоставляет элегантный способ расчета попарной корреляции между всеми числовыми столбцами DataFrame. Этот метод встроен в объект DataFrame, что делает его исключительно удобным для быстрого анализа многомерных данных.

Основные преимущества использования df.corr() в Pandas:

  • Автоматический расчет корреляции между всеми числовыми столбцами
  • Поддержка различных методов вычисления корреляции (Пирсона, Спирмена, Кендалла)
  • Возможность обработки пропущенных значений
  • Высокая производительность даже на больших наборах данных
  • Интеграция с другими инструментами визуализации и анализа

Результатом работы метода df.corr() является симметричная матрица корреляции, где каждая ячейка представляет коэффициент корреляции между соответствующими столбцами. По диагонали матрицы всегда располагаются единицы, так как корреляция переменной с самой собой равна 1. 📊

Значение коэффициентаИнтерпретация силы связиРекомендуемое действие
0.0 – 0.1Ничтожная корреляцияИгнорировать
0.1 – 0.3Слабая корреляцияПринять к сведению
0.3 – 0.5Умеренная корреляцияИсследовать подробнее
0.5 – 0.7Заметная корреляцияВключить в анализ
0.7 – 0.9Высокая корреляцияИспользовать как основу
0.9 – 1.0Очень высокая корреляцияПроверить на мультиколлинеарность

Алексей Петров, Lead Data Scientist Недавно мы анализировали показатели электронной коммерции с более чем 30 переменными. Без применения корреляционного анализа мы бы потерялись в этом море данных. Используя df.corr(), мы выявили неожиданную зависимость между частотой акций и средним временем пребывания на сайте. Эта взаимосвязь дала ключевой инсайт — пользователи искали акционные товары, но испытывали трудности с навигацией. После оптимизации раздела акций время заказа снизилось на 17%, а конверсия выросла на 3.5%. Такое открытие было бы невозможно без быстрого корреляционного анализа через df.corr().

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

Синтаксис и параметры функции df.corr() в Pandas

Метод df.corr() имеет ряд параметров, позволяющих настроить процесс вычисления корреляции в соответствии с требованиями конкретного анализа. Базовый синтаксис выглядит следующим образом:

Python
Скопировать код
DataFrame.corr(method='pearson', min_periods=1, numeric_only=_NoDefault.no_default)

Разберем каждый параметр подробно:

  • method — метод вычисления корреляции. В Pandas доступны три основных метода:
  • 'pearson' (по умолчанию) — расчет коэффициента корреляции Пирсона, измеряющего линейную зависимость
  • 'spearman' — ранговый коэффициент корреляции Спирмена, оценивающий монотонную зависимость
  • 'kendall' — тау коэффициент корреляции Кендалла, анализирующий ранговую зависимость
  • min_periods — минимальное число наблюдений, необходимое для вычисления корреляции. По умолчанию равно 1, что позволяет рассчитывать корреляцию даже при минимальном пересечении данных между столбцами.
  • numeric_only — флаг, указывающий, следует ли включать только числовые столбцы. В последних версиях Pandas (≥ 2.0) значение по умолчанию — True.

Типичное применение метода df.corr() выглядит так:

Python
Скопировать код
import pandas as pd

# Создаем DataFrame с данными
data = {
'temp': [30, 32, 28, 24, 26],
'sales': [350, 370, 310, 280, 300],
'visitors': [120, 140, 100, 80, 95]
}
df = pd.DataFrame(data)

# Вычисляем корреляцию по методу Пирсона (по умолчанию)
correlation_matrix = df.corr()
print(correlation_matrix)

# Вычисляем ранговую корреляцию Спирмена
spearman_corr = df.corr(method='spearman')
print(spearman_corr)

При выборе метода корреляции важно учитывать характер данных и цели исследования. В таблице ниже приведено сравнение доступных методов: 🔄

МетодТип зависимостиУстойчивость к выбросамТребования к даннымВычислительная сложность
ПирсонаЛинейнаяНизкаяНормальное распределениеO(n)
СпирменаМонотоннаяВысокаяПорядковые данныеO(n log n)
КендаллаПорядковаяОчень высокаяПорядковые данныеO(n²)

Помимо основных параметров, стоит помнить о важных нюансах при использовании df.corr():

  • Метод автоматически исключает нечисловые столбцы из расчета
  • При наличии пропущенных значений (NaN) они будут исключены попарно
  • Для очень больших датасетов рекомендуется использовать метод Пирсона из-за его вычислительной эффективности
  • Для данных с выбросами или нелинейными зависимостями лучше выбрать методы Спирмена или Кендалла

Правильный выбор параметров df.corr() играет решающую роль в получении достоверных и интерпретируемых результатов корреляционного анализа.

Визуализация результатов корреляции с помощью heatmap

Матрица корреляции, полученная с помощью df.corr(), может содержать десятки или даже сотни значений, что затрудняет её интерпретацию в числовом формате. Визуализация этих результатов через тепловую карту (heatmap) превращает абстрактные цифры в наглядный визуальный паттерн, позволяя мгновенно выявлять ключевые взаимосвязи между переменными. 🎨

Библиотека seaborn предоставляет элегантный способ создания тепловых карт корреляции. Вот стандартный паттерн визуализации матрицы корреляции:

Python
Скопировать код
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# Вычисляем матрицу корреляции
correlation_matrix = df.corr()

# Создаем тепловую карту
plt.figure(figsize=(10, 8))
heatmap = sns.heatmap(correlation_matrix, 
annot=True, # Отображение значений корреляции
cmap='coolwarm', # Цветовая схема
vmin=-1, vmax=1, # Диапазон значений
linewidths=0.5, # Толщина разделительных линий
fmt='.2f') # Формат чисел (2 знака после запятой)

plt.title('Матрица корреляции признаков', fontsize=14)
plt.tight_layout()
plt.show()

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

  • Маскирование избыточной информации — с помощью библиотеки numpy можно создать маску для скрытия верхнего треугольника матрицы, поскольку корреляционная матрица симметрична:
Python
Скопировать код
import numpy as np
mask = np.triu(np.ones_like(correlation_matrix, dtype=bool))
sns.heatmap(correlation_matrix, mask=mask, ...)
  • Кластеризация переменных — переупорядочивание строк и столбцов для группировки связанных переменных:
Python
Скопировать код
from scipy.cluster import hierarchy
from scipy.spatial import distance

# Вычисление расстояний и кластеризация
corr_linkage = hierarchy.ward(distance.pdist(correlation_matrix))
dendro = hierarchy.dendrogram(corr_linkage, no_plot=True)
corr_clustered = correlation_matrix.iloc[dendro['leaves'], dendro['leaves']]

# Визуализация кластеризованной матрицы
sns.heatmap(corr_clustered, ...)
  • Выделение значимых корреляций — применение порогов для выделения только существенных взаимосвязей:
Python
Скопировать код
threshold = 0.5 # Порог значимости корреляции
correlation_highlighted = correlation_matrix.copy()
correlation_highlighted[abs(correlation_matrix) < threshold] = 0
sns.heatmap(correlation_highlighted, ...)

Эффективная визуализация корреляционной матрицы помогает:

  • Быстро идентифицировать наиболее сильно коррелирующие переменные
  • Выявлять кластеры взаимосвязанных признаков
  • Обнаруживать потенциальные проблемы мультиколлинеарности
  • Определять переменные-кандидаты для включения в модели машинного обучения
  • Наглядно представлять результаты анализа в отчетах и презентациях

Марина Соколова, руководитель аналитического отдела На проекте по оптимизации маркетинговых каналов мы столкнулись с настоящим информационным хаосом — 47 KPI по 12 каналам продвижения. Когда я впервые построила тепловую карту корреляций на основе данных df.corr(), в команде наступила тишина. Яркие красно-синие пятна на карте мгновенно показали, что наши "священные" метрики CPC и CTR имели минимальную корреляцию с конечными продажами, тогда как время на сайте и глубина просмотра страниц оказались сильнейшими предикторами конверсии. Вместо распыления бюджета на привлечение кликов мы переориентировались на вовлечение. Квартальная конверсия выросла на 23%, а CAC снизился на 17%. Один heatmap изменил всю стратегию маркетинга!

Практические кейсы применения df.corr() в анализе данных

Метод df.corr() в Pandas находит применение в различных сценариях анализа данных, от разведочного анализа до сложного моделирования. Рассмотрим несколько практических кейсов, демонстрирующих мощь и гибкость этого инструмента. 💼

Кейс 1: Отбор признаков для модели машинного обучения

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

Python
Скопировать код
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston

# Загружаем датасет Boston Housing
boston = load_boston()
df = pd.DataFrame(boston.data, columns=boston.feature_names)
df['PRICE'] = boston.target

# Расчет корреляций с целевой переменной
correlations = df.corr()['PRICE'].sort_values(ascending=False)
print("Корреляция признаков с целевой переменной:")
print(correlations)

# Отбор признаков с высокой корреляцией (по модулю > 0.5)
selected_features = correlations[abs(correlations) > 0.5].index.tolist()
selected_features.remove('PRICE') # Удаляем целевую переменную из списка
print("\nВыбранные признаки:")
print(selected_features)

# Создаем DataFrame с отобранными признаками
X_selected = df[selected_features]

Кейс 2: Выявление мультиколлинеарности

Метод df.corr() помогает обнаружить избыточность в данных и предотвратить проблемы со стабильностью статистических моделей:

Python
Скопировать код
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

# Предположим, df – это наш DataFrame с данными
correlation_matrix = df.corr()

# Находим пары признаков с высокой корреляцией (> 0.8)
high_corr_pairs = []
for i in range(len(correlation_matrix.columns)):
for j in range(i):
if abs(correlation_matrix.iloc[i, j]) > 0.8:
high_corr_pairs.append(
(correlation_matrix.columns[i], 
correlation_matrix.columns[j], 
correlation_matrix.iloc[i, j])
)

# Выведем пары с высокой корреляцией
print("Пары признаков с высокой корреляцией (> 0.8):")
for pair in high_corr_pairs:
print(f"{pair[0]} и {pair[1]}: {pair[2]:.2f}")

# Для каждой пары с высокой корреляцией можно выбрать один признак
# Например, выбираем признак с более высокой корреляцией с целевой переменной
target_variable = 'target_column'
features_to_keep = set()

for pair in high_corr_pairs:
feature1, feature2 = pair[0], pair[1]
corr1 = abs(correlation_matrix.loc[feature1, target_variable])
corr2 = abs(correlation_matrix.loc[feature2, target_variable])

if corr1 >= corr2:
features_to_keep.add(feature1)
else:
features_to_keep.add(feature2)

Кейс 3: Анализ финансовых инструментов

Корреляционный анализ часто используется для оценки взаимосвязей между различными финансовыми активами:

Python
Скопировать код
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
import seaborn as sns

# Загружаем данные о ценах акций
tickers = ['AAPL', 'MSFT', 'GOOG', 'AMZN', 'TSLA']
stock_data = yf.download(tickers, start='2020-01-01', end='2024-01-01')['Adj Close']

# Рассчитываем дневную доходность
returns = stock_data.pct_change().dropna()

# Вычисляем матрицу корреляции доходностей
correlation_matrix = returns.corr()

# Визуализация корреляций
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', vmin=-1, vmax=1, linewidths=0.5)
plt.title('Корреляция доходностей технологических акций')
plt.tight_layout()
plt.show()

# Идентификация активов для диверсификации (низкая корреляция)
low_correlation_pairs = []
for i in range(len(correlation_matrix.columns)):
for j in range(i):
if abs(correlation_matrix.iloc[i, j]) < 0.3:
low_correlation_pairs.append(
(correlation_matrix.columns[i], 
correlation_matrix.columns[j], 
correlation_matrix.iloc[i, j])
)

print("Пары активов с низкой корреляцией (< 0.3) – подходят для диверсификации:")
for pair in low_correlation_pairs:
print(f"{pair[0]} и {pair[1]}: {pair[2]:.2f}")

Кейс 4: Временной анализ корреляций

Для оценки изменения взаимосвязей во времени можно применять корреляционный анализ к скользящему окну данных:

Python
Скопировать код
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# Предположим, df содержит временной ряд с несколькими переменными
# и имеет индекс даты/времени

# Функция для расчета скользящей корреляции
def rolling_correlation(df, window_size, pair):
x, y = pair
return df[x].rolling(window=window_size).corr(df[y])

# Выбираем пару переменных для анализа
variable_pair = ('feature1', 'feature2')
window_size = 30 # Например, 30 дней

# Рассчитываем скользящую корреляцию
rolling_corr = rolling_correlation(df, window_size, variable_pair)

# Визуализируем изменение корреляции во времени
plt.figure(figsize=(12, 6))
plt.plot(rolling_corr.index, rolling_corr.values)
plt.axhline(y=0, color='r', linestyle='-', alpha=0.3)
plt.title(f'Скользящая {window_size}-дневная корреляция между {variable_pair[0]} и {variable_pair[1]}')
plt.ylabel('Коэффициент корреляции')
plt.xlabel('Дата')
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()

Определите свой путь в мире аналитики данных с Тестом на профориентацию от Skypro! Теперь вы знаете, как применять корреляционный анализ с Pandas, но это лишь верхушка айсберга в мире анализа данных. Пройдите бесплатный тест, который определит ваши сильные стороны и поможет выбрать оптимальное направление развития в IT — от Data Analyst до Machine Learning Engineer. Тест основан на реальных требованиях рынка 2025 года.

Ограничения и альтернативы методу df.corr() в Pandas

Несмотря на широкие возможности, метод df.corr() в Pandas имеет ряд ограничений, которые необходимо учитывать при проведении корреляционного анализа. Понимание этих ограничений и знание альтернативных подходов позволит выбрать оптимальный инструмент для конкретных задач. ⚠️

Ключевые ограничения метода df.corr():

  • Линейность взаимосвязей — метод Пирсона (используемый по умолчанию) способен выявлять только линейные взаимосвязи, игнорируя нелинейные зависимости, которые часто присутствуют в реальных данных
  • Чувствительность к выбросам — корреляция Пирсона крайне чувствительна к выбросам и экстремальным значениям, которые могут существенно искажать результаты
  • Отсутствие причинно-следственной связи — высокая корреляция не означает причинность (correlation does not imply causation)
  • Ограниченность бинарных и категориальных данных — метод не предназначен для непосредственного анализа нечисловых данных
  • Неэффективность для больших разреженных данных — на очень больших датасетах с множеством нулевых значений метод может работать неоптимально
  • Игнорирование временной структуры — при анализе временных рядов не учитывается автокорреляция и временная зависимость

Альтернативные методы и подходы к корреляционному анализу:

АльтернативаПрименениеПреимуществаРеализация в Python
Коэффициент детерминации (R²)Оценка доли дисперсии, объясняемой модельюБолее интерпретируемая метрика для моделированияsklearn.metrics.r2_score
Информационное отношение (MI)Выявление нелинейных зависимостейОбнаруживает любые типы зависимостей, не только линейныеsklearn.feature_selection.mutual_info_regression
Корреляция расстояний (Distance correlation)Измерение нелинейных зависимостейРавна нулю только при полной независимости переменныхdcor.distance_correlation (пакет dcor)
Коэффициент φ (фи)Анализ бинарных переменныхСпециально разработан для дихотомических данныхscipy.stats.contingency.association
Корреляционное отношение η (эта)Оценка связи номинальных и числовых переменныхУстойчивость к нелинейным зависимостямСобственная реализация

Для преодоления ограничений стандартного метода df.corr() можно применять различные техники:

  1. Предварительная трансформация данных — логарифмирование, нормализация или другие преобразования могут помочь линеаризовать взаимосвязи:
Python
Скопировать код
df_transformed = df.apply(np.log1p) # Log(1+x) трансформация
corr_transformed = df_transformed.corr()
  1. Робастные методы корреляции — использование методов, устойчивых к выбросам:
Python
Скопировать код
from scipy.stats import spearmanr, kendalltau

# Ранговая корреляция Спирмена
spearman_corr, _ = spearmanr(df['feature1'], df['feature2'])

# Тау-коэффициент Кендалла
kendall_corr, _ = kendalltau(df['feature1'], df['feature2'])
  1. Обработка категориальных данных — кодирование нечисловых признаков перед корреляционным анализом:
Python
Скопировать код
df_encoded = pd.get_dummies(df, columns=['categorical_feature'])
corr_encoded = df_encoded.corr()
  1. Вычисление взаимной информации — для обнаружения нелинейных зависимостей:
Python
Скопировать код
from sklearn.feature_selection import mutual_info_regression

# X – DataFrame с признаками, y – целевая переменная
mi_scores = mutual_info_regression(X, y)
mi_df = pd.DataFrame({'Feature': X.columns, 'MI Score': mi_scores})
mi_df = mi_df.sort_values('MI Score', ascending=False)
  1. Анализ частных корреляций — для выделения прямых взаимосвязей без опосредованного влияния:
Python
Скопировать код
import pingouin as pg

# Частная корреляция между x и y, контролируя влияние z
partial_corr = pg.partial_corr(data=df, x='feature1', y='feature2', covar='feature3')

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

Корреляционный анализ с использованием метода df.corr() в Pandas — это мощный инструмент для первичного исследования данных, выбора признаков и проверки гипотез о взаимосвязях переменных. Овладев техниками расчета, визуализации и интерпретации корреляций, вы получаете возможность эффективно исследовать многомерные наборы данных, избегать проблем мультиколлинеарности и строить более качественные предиктивные модели. Главное помнить — корреляция указывает лишь на статистическую взаимосвязь, но для понимания причинности требуются более глубокие методы анализа и экспериментальные подходы.