#pandas #correlation
#pandas #корреляция
Вопрос:
Как я могу определить качество корреляции, полученной с помощью pd.corr()
?
И под качеством я подразумеваю, какая часть данных перекрывается и, таким образом, используется .corr()
. Давайте проиллюстрируем это коротким примером:
Давайте настроим образец фрейма данных:
time1 = pd.date_range(start='2020-01-01', end='2020-01-5', freq='D')
time2 = pd.date_range(start='2020-01-04', end='2020-01-8', freq='D')
time3 = pd.date_range(start='2020-01-01', end='2020-01-8', freq='D')
df1 = pd.DataFrame(np.random.randn(len(time1)), index=time1, columns=['first'])
df2 = pd.DataFrame(np.random.randn(len(time2)), index=time2, columns=['second'])
df3 = pd.DataFrame(np.random.randn(len(time3)), index=time3, columns=['third'])
df4 = pd.DataFrame(np.random.randn(len(time3)), index=time3, columns=['forth'])
df = pd.concat([df1,df2,df3,df4], axis=1)
КАК вы можете видеть, first
и second
совместно используют только две точки данных, тогда как third
и forth
имеют данные за весь период и, таким образом, разделяют все это между собой, и 5 точек данных с first
и second
соответственно.
Или в графическом:
Очевидно, что каждый раз это будет отличаться из-за np.random.randn
, но в этом особом случае это прекрасно иллюстрирует мою точку зрения. Если мы посмотрим на корреляционную матрицу, df.corr()
first second third forth
first 1.000000 1.000000 0.034076 -0.023059
second 1.000000 1.000000 -0.021810 0.928713
third 0.034076 -0.021810 1.000000 0.458744
forth -0.023059 0.928713 0.458744 1.000000
Мы не только видим ожидаемую идеальную корреляцию диагонали, но, по-видимому, first
и second
также имеем идеальную корреляцию (тот же градиент на графике). Теперь, математически, это, похоже, верно, однако, предполагая, что во всех трех столбцах наблюдаются одинаковые явления, я бы назвал корреляции для других, особенно third
и forth
лучше, поскольку у меня гораздо больше доступных данных.
Действительно ли у first
и second
корреляция лучше, чем у других, покажет, когда у меня будет такой же объем данных.
Теперь с таким простым фреймом данных получить эту информацию довольно тривиально, но давайте предположим, что фрейм данных содержит несколько сотен записей и раз, начиная с 1930-х годов, и эта простая визуальная идентификация становится утомительной, если не невозможной.
Как мне получить информацию о перекрытиях корреляционной матрицы простым и понятными способами?
pd.corr()
есть опция min_periods
, поэтому я мог бы установить это значение min_periods = 3
, чтобы отменить корреляцию с низким перекрытием в этом примере, но реальные данные, я бы предпочел ничего не исключать, а просто иметь информацию о количестве периодов, которые были использованы для получения корреляции.
Ответ №1:
Я еще не нашел быстрого и простого способа получить цифры, но для моего приложения также работает быстрый визуальный обзор.
С приведенными выше тестовыми данными это на самом деле не требуется, но давайте продолжим использовать их в иллюстративных целях.
Простой plt.imshow(df, aspect='auto')
работает довольно хорошо. Но поскольку меня интересуют только данные по сравнению нет данных (таким образом, любое число против NaN), умножение его на ноль работает лучше (NaN остается как есть и окрашивается в белый цвет imshow
, любое число становится равным нулю и, таким образом, приобретает цвет. Итак:
plt.imshow((df*0), aspect='auto')
Или с какими- то реальными данными:
Не идеально (поэтому я не собираюсь принимать этот ответ), но хороший первый шаг для определения, какие данные хороши, а какие нет.