Корреляция в Pandas

Корреляция измеряет силу линейной связи между двумя числовыми столбцами. Значение варьируется от -1 (обратная) до +1 (прямая), 0 — независимы. В Pandas есть два метода: Series.corr(other) для пары и DataFrame.corr() для всех пар сразу.

Когда использовать

  • Связаны ли температура и обороты двигателя.

  • Какие фичи в датасете «дублируют» друг друга.

  • Подбор признаков перед регрессией.

Пример 1. Корреляция двух Series

import pandas as pd

temp  = pd.Series([20, 22, 25, 28, 30])
speed = pd.Series([100, 110, 130, 150, 160])
print(round(temp.corr(speed), 3))

Output:

0.992

Сильная прямая связь.

Пример 2. Матрица корреляций

import pandas as pd

df = pd.DataFrame({
    "temp":  [20, 22, 25, 28, 30],
    "hum":   [60, 58, 55, 50, 48],
    "speed": [100, 110, 130, 150, 160],
})
print(df.corr().round(2))

Output:

       temp   hum  speed
temp   1.00 -0.99   0.99
hum   -0.99  1.00  -0.99
speed  0.99 -0.99   1.00

Пример 3. Метод Spearman

import pandas as pd

a = pd.Series([1, 2, 3, 4, 5])
b = pd.Series([1, 4, 9, 16, 25])
print("pearson:",  round(a.corr(b), 3))
print("spearman:", round(a.corr(b, method="spearman"), 3))

Output:

pearson: 0.987
spearman: 1.0

Спирман учитывает любую монотонную (не только линейную) связь.

Пример 4. Корреляция с одним столбцом

import pandas as pd

df = pd.DataFrame({
    "temp":  [20, 22, 25, 28, 30],
    "hum":   [60, 58, 55, 50, 48],
    "speed": [100, 110, 130, 150, 160],
})
print(df.corr()["speed"].round(2))

Output:

temp     0.99
hum     -0.99
speed    1.00
Name: speed, dtype: float64

Пример 5. Игнорирование пропусков

import pandas as pd
import numpy as np

a = pd.Series([1, 2, np.nan, 4, 5])
b = pd.Series([2, 4, 6, 8, 10])
print(round(a.corr(b), 3))

Output:

1.0

corr сама выкидывает пары с NaN.

Пример 6. Только сильные пары

import pandas as pd

df = pd.DataFrame({
    "a": [1, 2, 3, 4],
    "b": [4, 3, 2, 1],
    "c": [1, 4, 2, 3],
})
m = df.corr().abs()
print(m[(m > 0.7) & (m < 1.0)].stack())

Output:

a  b    1.0
b  a    1.0
dtype: float64

Пример 7. Корреляция с lag (сдвиг)

import pandas as pd

s = pd.Series([1, 2, 3, 4, 5, 6])
print(round(s.corr(s.shift(1)), 3))

Output:

1.0

Автокорреляция первого порядка — единица для линейного ряда.

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

  • Высокая корреляция ≠ причинно-следственная связь.

  • Pearson очень чувствителен к выбросам — один «дребезг» меняет коэффициент.

  • Для бинарных и категориальных данных используйте другие метрики (Cramér’s V, point-biserial).

См. также

Примечание

Лицензия и источники

Техническое описание адаптировано из официальной документации Pandas (https://pandas.pydata.org/docs/), BSD-3-Clause License. Перевод на русский, примеры и пояснения — © AlashEd Wiki.