получить меньше коррелированных имен переменных - PullRequest
0 голосов
/ 05 мая 2018

У меня есть набор данных (50 столбцов, 100 строк). Также есть 50 имен переменных, 0,1,2 ... 49 для 50 столбцов. Я должен найти менее коррелированные переменные, скажем, корреляция <0,7. Я попытался следующим образом: </p>

import os, glob, time, numpy as np, pandas as pd
data = np.random.randint(1,99,size=(100, 50))
dataframe = pd.DataFrame(data)
print (dataframe.shape)

codes = np.arange(50).astype(str)
dataframe.columns = codes

corr = dataframe.corr()
corr = corr.unstack().sort_values()
print (corr)
corr = corr.values
indices = np.where(corr < 0.7)
print (indices)
res = codes[indices[0]].tolist() + codes[indices[1]].tolist()
print (len(res))
res = list(set(res))
print (len(res))

Результат - 50 (все переменные!), Что является неожиданным. Как решить эту проблему, ребята?

1 Ответ

0 голосов
/ 05 мая 2018

Как уже упоминалось в комментариях, ваш вопрос несколько двусмысленный. Во-первых, существует вероятность того, что ни одна пара столбцов не будет коррелирована. Во-вторых, распаковка не имеет смысла, потому что вы создаете индексный массив, который вы не можете напрямую использовать в своем 2D-массиве. В-третьих, что должно быть первым, но я был слеп к этому - как упомянул @AmiTavory, нет смысла в «сопоставлении имен».

Корреляционная процедура сама по себе работает, как вы можете видеть в следующем примере:

import numpy as np
import pandas as pd

A = np.arange(100).reshape(25, 4)
#random order in column 2, i.e. a low correlation to the first columns
np.random.shuffle(A[:,2])
#flip column 3 to create a negative correlation with the first columns
A[:,3] = np.flipud(A[:,3])
#column 1 is unchanged, therefore positively correlated to column 0
df = pd.DataFrame(A)
print(df)
#establish a correlation matrix
corr = df.corr()
#retrieve index of pairs below a certain value
#use only the upper triangle with np.triu to filter for symmetric solutions
#use np.abs to take also negative correlation into account
res = np.argwhere(np.triu(np.abs(corr.values) <0.7))
print(res)

Выход:

[[0 2]
 [1 2]
 [2 3]]

Как и ожидалось, столбец 2 является единственным, который не связан ни с одним другим, что означает, что все остальные столбцы связаны друг с другом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...