Нашли ошибку?
среднийpandas 3.0.6

Корреляция

Насколько согласованно меняются два столбца — матрица корреляций, пары столбцов, ранговая корреляция.

Нужно знать:Описательная статистика

Содержание статьи

Коротко

  • 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минимум пар без пропусков для расчёта1
numeric_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)
Каждый столбец с одним Series
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

Подводные камни

Нелинейная связь даёт корреляцию около нуля

y = x²
x = pd.Series(range(-5, 6))
y = x ** 2                                                          # сильная, но не линейная связь
x.corr(y)
Вывод
np.float64(0.0)

Текстовые столбцы

Как и в других статистиках, текст в corr вызывает ошибку. Передайте numeric_only=True или выберите столбцы.

numeric_only=True
cafe.assign(day=list("пвсчпсв")).corr(numeric_only=True).shape     # текст исключён
Вывод
(4, 4)