python典型相关分析,python多变量相关性分析
我有以下熊猫数据框Top15:
我创建了一个列来估计每个人的可引用文档的数量:
一个
2Top15[PopEst]=Top15[能源供应]/Top15[人均能源供应]
Top15[人均引用文件]=Top15[引用文件]/Top15[最受欢迎]
想知道人均能引用的文献数量和人均能量供给之间的关系。所以我用了。corr()方法(皮尔逊相关法):
一个
2data=Top15[[人均引用文件,人均能源供应]]
correlation=data . corr(method= Pearson )
我想返回一个数字,但结果是:
我认为你是对的。但是你能告诉我为什么‘data . corr(method= Pearson )’只返回能量供给和能量供给的关系吗?
并没有。它应该返回一个2x2矩阵;在左上角显示条目。如果。corr直接应用于数据帧,它将返回所有成对相关;这就是为什么你会在矩阵的对角线上观察到1(每一列都与其自身完全相关)。见下面我的编辑。
如果你认为答案已经回答了你的问题,请考虑接受。
我接受你的回答,谢谢。
我找不到你说的那个按钮。我只是按下你答案旁边的向上箭头。
这个问题直接来自《Python数据科学导论》这门课。具体来说,作业3,问题9。当十足的御姐fzdyet鼓励学生把问题堆起来的时候,我觉得他的意思并不是让他们把问题一字不差地贴在作业里。
没有实际数据很难回答这个问题,但我想你在寻找这样一个问题:
1Top15[人均可引用文档]。corr(前15名[人均能源供应])
它计算“人均引用文件”和“人均能源供应”两列之间的相关性。
例如:
一个
2
三
四
五
六
七
八
9进口熊猫作为pd
df=pd。DataFrame({A: range(4), B: [2*i for i in range(4)]))
有
0 0 0
1 1 2
2 2 4
3 3 6
然后
1df[A]。corr(df[B])
如预期给出1。
现在,如果你改变一个值,例如
一个
2
三
四
五
六
7df.loc[2, B]=4.5
有
0 0 0.0
1 1 2.0
2 2 4.5
3 3 6.0
命令
1df[A]。corr(df[B])
收益率
10.99586
和预期一样,还是接近1。
如果。corr直接应用于一个数据帧,它将返回列之间的所有成对关联;这就是为什么你会在矩阵的对角线上观察到1(每一列都完全与其自身相关联)。
1df.corr()
因此将返回。
一个
2
3A B
1.000000 0.995862
B 0.995862 1.000000
在您展示的图表中,只显示了相关矩阵的左上角(我假设)。
在某些情况下,您的解决方案中可能有nan,请查看本文中的示例。
如果您想要过滤高于/低于特定阈值的条目,您可以检查此问题。如果你想画一个相关系数的热图,可以查一下这个答案,然后如果你遇到轴标重叠的问题,可以查下面这篇文章。
这可以通过线来应用吗?
@末日博士:对,只需要一个系列。比如df.loc[1,]。corr(df.loc[2,]就可以了。对于整个数据帧,可以简单的转置:df。T.corr()。
但是,我尝试了你的建议,即使用df.loc[2, b]=4.5改变了B列中A的值,计算仍然返回1。可能我只是对计算有点困惑。
@末日博士:因为不知道你的密码所以很难帮忙。在你的例子中,我上面的例子返回1而不是0.99586,我理解对吗?
是的,我用了你的密码。它总是返回1。
尝试导入熊猫为pd导入numpy为np示例df=PD . data frame(NP . random . randn(5,5),np.orange (5))打印示例df.iloc[1,]打印示例df.iloc[2,]打印示例df.iloc[1,]corr(
@末日博士:无法繁殖。在np.random.seed(0)上,我得到了0.580 . 00000000005可以试试这个种子吗?
让我们在聊天中继续讨论。
因为数据集是维度500*10,dataset.corr()应该给出矩阵10*10的输出,但是它的输出矩阵是1*1…为什么?
@yqddp:不知道你的数据,不好说。也许你可以开一个新的问题,作为参考!确保包括一个可重复的例子。
我也有同样的问题。似乎每人可引用的文档是一个浮点数,python默认跳过它。我的数据框中的所有其他列都是numpy格式,因此我通过将column转换为np.float64解决了这个问题
1Top15[每人可引用的文档]=np.float64(Top15[每人可引用的文档])
记住,这正是你自己计算的列。
工作原理如下:
一个
2
三
四
5Top15[人均引用文档]=np.float64(Top15[人均引用文档])
Top15[人均能源供应]=np.float64(Top15[人均能源供应])
Top15[人均能源供应]。corr(前15名[人均引用文档])
我的解决方案是将数据转换成数字类型:
1Top15[[人均可引用文件,人均能源供应]]。更正()
Xqdxn称之为:
一个
2data=Top15[[人均引用文件,人均能源供应]]
correlation=data . corr(method= Pearson )
因为dataframe.corr()函数执行逐对关联,所以有四对两个变量。所以,基本上,你得到的是对角值作为自相关(与自身相关,因为你有两个变量,有两个值),另外两个值作为一个与另一个的互相关,反之亦然。
在两个序列之间执行相关以获得单个值:
一个
2
三
4从scipy.stats.stats导入pearsonr
docs_col=Top15[人均可引用文档]。价值观念
energy_col=Top15[人均能源供应]。价值观念
corr,_=pearsonr(文档列,能源列)
或者,如果您想从同一个函数(数据帧的corr)中获得单个值:
1single_value=相关性[0][1]
我希望这有所帮助。
如果需要所有列对之间的关联,可以这样做:
一个
2
三
四
五
六
七
八
九
10
11
12进口熊猫作为pd
将numpy作为np导入
def get_corrs(df):
col_correlations=df.corr()
col_correlations.loc[:]=np.tril(col_correlations,k=-1)
cor _ pairs=col _ correlations . stack()
返回cor_pairs.to_dict()
my_corrs=get_corrs(df)
#和下面一行来检索单个相关性
print(my_corrs[(人均引用文档,人均能源供应)])
我通过改变数据类型解决了这个问题。如果你看到“人均能源供应”是一个数字类型,“人均参考文件”是一个对象类型。我使用astype将列转换为float。我对一些np函数也有同样的问题:count _非零和sum起作用,而mean和std不起作用。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。