Короткий ответ
Нужно проверить устойчивость корреляции на разных срезах данных (времени, сегментах), поискать правдоподобный скрытый фактор, объясняющий связь, исключить влияние тренда/сезонности на временных рядах, и по возможности протестировать гипотезу экспериментально, а не полагаться только на один коэффициент корреляции.
Как это работает подробнее
при большом числе переменных или временных рядов с общим трендом высокая корреляция может возникать чисто случайно или из-за общей временной динамики (обе метрики растут со временем независимо друг от друга) — это называется ложной корреляцией.
Sanity check: резкое падение корреляции при переходе от уровней к разностям — явный признак того, что исходная связь объяснялась общим трендом, а не реальной зависимостью одной метрики от другой.
Пример кода
import numpy as np
import pandas as pd
np.random.seed(0)
t = np.arange(100)
metric_a = t + np.random.normal(0, 2, 100) # растёт со временем
metric_b = t*0.5 + np.random.normal(0, 2, 100) # тоже растёт со временем, не связана с A напрямую
print(pd.Series(metric_a).corr(pd.Series(metric_b))) # высокая корреляция уровней
print(pd.Series(metric_a).diff().corr(pd.Series(metric_b).diff())) # корреляция изменений намного нижеЧто использовать на практике
- Полезные проверки: разбить период на несколько частей и убедиться, что корреляция стабильна в каждой из них, а не вызвана одним периодом
- Для временных рядов — проверить корреляцию после удаления общего тренда (например, по разностям рядов, а не по уровням)
- Задать вопрос о механизме — есть ли правдоподобное объяснение, почему X должно влиять на Y, или связь выглядит случайной
- При большом числе протестированных пар метрик учитывать проблему множественных сравнений — чем больше пар проверено, тем выше шанс случайно найти "сильную" корреляцию. Также полезно при наличии нескольких временных рядов строить корреляционную матрицу с поправкой на множественные сравнения, если проверяется сразу много пар метрик, а не одна заранее определённая гипотеза.
Подводные камни
- Находить одну сильную корреляцию среди десятков протестированных пар метрик и сразу строить на ней бизнес-нарратив без поправки на множественные сравнения
- Сравнивать два временных ряда с выраженным общим трендом в уровнях, не проверив корреляцию на разностях/темпах роста
- Игнорировать отсутствие правдоподобного механизма связи, когда корреляция высока, но причинно необъяснима. Ещё одна ошибка — не учитывать автокорреляцию внутри каждого отдельного ряда (значение сегодня похоже на вчерашнее), которая сама по себе завышает кажущуюся силу связи между двумя трендовыми рядами.