Коротко
df.corr()— матрица попарных корреляций числовых столбцов, от −1 до 1.s1.corr(s2)— корреляция двух Series (строки сопоставляются по индексу).method="pearson"(по умолчанию) — линейная связь;"spearman"и"kendall"— ранговые, ловят любую монотонную связь и устойчивы к выбросам.corrwith(s)— корреляция каждого столбца с одним Series.- Корреляция около нуля не значит «нет связи» — связь может быть нелинейной. И корреляция не доказывает причинность.
Синтаксис
df.corr(method="pearson", min_periods=1, numeric_only=False)
s1.corr(s2, method="pearson")
df.corrwith(other, method="pearson")
df.cov(ddof=1)Параметры
ПараметрЧто делаетПо умолчанию
method"pearson", "spearman", "kendall" или своя функция"pearson"min_periodsминимум пар без пропусков для расчёта1numeric_onlyтолько числовые столбцыFalseПримеры
cafe = pd.DataFrame({
"temp": [12, 15, 18, 22, 25, 28, 31], # температура
"iced": [20, 28, 35, 52, 60, 71, 80], # холодные напитки
"hot": [95, 90, 82, 70, 64, 55, 50], # горячие напитки
"promo": [0, 1, 0, 1, 0, 1, 0], # была ли акция
})cafe.corr().round(2)Вывод
temp iced hot promo temp 1.00 1.00 -1.00 0.01 iced 1.00 1.00 -1.00 0.04 hot -1.00 -1.00 1.00 -0.03 promo 0.01 0.04 -0.03 1.00
cafe["temp"].corr(cafe["iced"]).round(3)Вывод
np.float64(0.998)
rank_data = pd.DataFrame({"x": [1, 2, 3, 4, 5], "y": [1, 4, 9, 16, 100]})
print(rank_data.corr().loc["x", "y"].round(3)) # Пирсон: линейная связь
rank_data.corr(method="spearman").loc["x", "y"] # Спирмен: монотоннаяВывод
0.795 np.float64(1.0)
targets = cafe[["iced", "hot"]]
targets.corrwith(cafe["temp"]).round(2)Вывод
iced 1.0 hot -1.0 dtype: float64
cafe[["temp", "iced"]].cov()Вывод
temp iced temp 48.285714 156.380952 iced 156.380952 508.619048
Подводные камни
Нелинейная связь даёт корреляцию около нуля
x = pd.Series(range(-5, 6))
y = x ** 2 # сильная, но не линейная связь
x.corr(y)Вывод
np.float64(0.0)
Текстовые столбцы
Как и в других статистиках, текст в corr вызывает ошибку. Передайте numeric_only=True или выберите столбцы.
cafe.assign(day=list("пвсчпсв")).corr(numeric_only=True).shape # текст исключёнВывод
(4, 4)