我有一个数据框
df
,看起来像:
0 1 2 3 4 5 6 7 8
0 2014-03-19T12:44:32.695Z 1395233072695 703425 0 2 1 13 5 21
1 2014-03-19T12:44:32.727Z 1395233072727 703425 0 2 1 13 5 21
这些列都是 int 类型(第一列除外):
0 object
1 int64
2 int64
3 int64
4 int64
5 int64
6 int64
7 int64
8 int64
但在我的相关性中,有些列似乎是 NaN。当我调用
df.corr()
时,我得到以下输出:
1 2 3 4 5 6 7 8
1 1.000000 NaN 0.018752 -0.550307 NaN NaN 0.075191 0.775725
2 NaN NaN NaN NaN NaN NaN NaN NaN
3 0.018752 NaN 1.000000 -0.067293 NaN NaN -0.579651 0.004593
...
这些列的值现在不会改变,是的
Joris 指出,如果这些值没有变化,您会期望
NaN
。要了解原因,请查看相关公式:
cor(i,j) = cov(i,j)/[stdev(i)*stdev(j)]
如果第 i 个或第 j 个变量的值不变,则各自的标准差将为零,分数的分母也将为零。因此,相关性将为
NaN
。
正如 @Karl D. 提到的,如果列中的值相同,则该列中没有方差,即值是恒定的,并且随机变量和常量之间的相关性是未定义的。另一种看待它的方法是,如果在图表中绘制方差为零的列,它将是一条水平线,这意味着它不会与同一图表上的任何其他图“一起移动”。
如果我们对相关矩阵感兴趣,那么一种方法是简单地删除未定义相关性的列:
corr = df.corr()
corr_notna = ~corr.isna().all()
corr = corr.loc[corr_notna, corr_notna]
# or as a one-liner
corr = df.corr().dropna(how='all', axis=1).dropna(how='all')
常数列和另一个随机变量之间的差异将具有相关性 = 1 或 -1。例如,
df = pd.DataFrame({'A': [1]*5, 'B': [*[1]*4, 0]})
df.corr()
df.corr()
A B
A NaN NaN
B NaN 1.0
df['B-A'] = df['B'] - df['A']
df[['B', 'B-A']].corr()
B B-A
B 1.0 1.0
B-A 1.0 1.0
获得 NaN 的另一种方法是如果没有足够的数据来计算相关性,特别是如果
min_periods=
设置为数字。一个例子:
df = pd.DataFrame({'A': [*range(9), float('nan')], 'B': range(10)})
df.corr(min_periods=10)
A B
A NaN NaN
B NaN 1.0
我有类似的问题,我检查了数据集的标准差,它们不为零。我检查了我的数据中是否有 NaN 值,但没有。但我得到的相关性为 NaN。除了没有相关性之外还有其他可能的原因吗?