Некорректный вывод в матрице корреляций
Подскажите, пожалуйста:
Я строю матрицу корреляций кодом
s = stats.spearmanr(df)
sx, sy = s.correlation.shape
m = []
for y in range(sy):
row = []
for x in range(sx):
z = f'{s.correlation[y,x]:.2f}'
if s.pvalue[y,x] < 0.01:
z += '**'
elif s.pvalue[y,x] < 0.05:
z += '*'
row.append(z)
m.append(row)
df_corr = pd.DataFrame(m)
df_corr.columns = df.columns
df_corr.index = df.columns
df_corr
data = pd.DataFrame(df_corr)
Но почему-то получаю кучу значений nan в матрице (
). При этом если по тем же самым данным отстроить тепловую матрицу, она получается нормальной (картинка 2).
Может быть, у меня что-то не так в коде, но понять что- пока не могу...
П.С. может кто-нибудь знает, как на тепловую матрицу корреляций добавить обозначения уровня значимости корреляций или хотя бы просто убрать значения незначимых корреляций?
Доступ к данным: https://docs.google.com/spreadsheets/d/1kCQQbvMVMEP8lkd2fO7QjKiuRfJzWpDTB6lOm0BvAwE/edit?usp=sharing
Ответы (1 шт):
У вас просто присутствуют NaN в исходных данных и по умолчанию эта функция выдаёт то поведение, которое вы наблюдаете. Если вы хотите игнорировать NaN и считать корреляцию только по имеющимся значениям, укажите это с помощью соответствующего параметра:
s = stats.spearmanr(df, nan_policy='omit')
Другие методы, считающие корреляцию, могут игнорировать NaN по умолчанию. Например, если взять df.corr(), то он посчитает корреляцию, проигнорировав значения NaN. Скорее всего тепловая карта рисуется с использованием именно этой функции.
