数据框两列的协方差
Covariance of two columns of a dataframe
如果这个问题听起来太琐碎了,请原谅,但我想确定我是在正确的轨道上。
我有一个类似于下图的数据框,我想了解这两个变量 A 和 B 是一起变化还是其他变化。
A B
0 34.4534 35.444248
1 34.8915 24.693800
2 0.0000 21.586316
3 34.7767 23.783602
我被要求绘制两者之间的协方差。然而,根据我的研究,协方差似乎是一个单一的计算值,就像平均值和标准差一样,而不是像 pdf/cdf 这样可以绘制的分布。
我对协方差的看法正确吗?对于理解这些变量之间可变性的其他方法,您能给我什么建议?
你的看法对吗? - 是的
协方差是衡量两个随机变量的联合可变性的指标,用一个数字表示。这个数字是
- 正 如果它们“表现相似”(这大致意味着变量 1 中的正峰与变量 2 中的正峰重合)
- 零 如果它们不共变
- 负数 如果它们“表现相似”但具有相反的关系(即负峰与正峰对齐,反之亦然)
import pandas as pd
# create 3 random variables; var 3 is based on var 1, so they should covary
data = np.random.randint(-9,9,size=(20,3))
data[:,2] = data[:,0] + data[:,2]*0.5
df = pd.DataFrame(data,columns=['var1','var2','var3'])
df.plot(marker='.')
我们看到 var1
和 var3
似乎是共变的;所以为了计算所有变量之间的协方差,pandas
派上用场了:
>>> df.cov()
var1 var2 var3
var1 31.326316 -5.389474 30.684211
var2 -5.389474 21.502632 -10.907895
var3 30.684211 -10.907895 37.776316
由于协方差的实际值取决于输入变量的规模,因此您通常通过各自的标准差对协方差进行归一化,从而将相关性作为协方差的度量,范围从 -1(反相关)到 1 (相关)。对于 pandas,这显示为
>>> df.corr()
var1 var2 var3
var1 1.000000 -0.207657 0.891971
var2 -0.207657 1.000000 -0.382724
var3 0.891971 -0.382724 1.000000
从中可以清楚地看出,var1
和 var3
表现出很强的相关性,正如我们预期的那样。
对于了解这些变量之间可变性的其他方法,您能给我什么建议? - 取决于数据
由于我们对您的数据的性质一无所知,因此很难说。也许只是作为一个入门者(不打算详尽无遗),一些关于您可以查看的内容的提示:
- Spearman's rank correlation:比Pearson相关系数更稳健,我们上面用过的;如果您的数据表现出某种非线性,Pearson 基本上只查看线性相关性并且会产生不太正确的结果;如果您的数据中可能存在非线性关系,您应该选择 Spearman
- 自相关:考虑一个正弦信号触发另一个信号但有 90º 的时间滞后(表示余弦)。在那种情况下,典型的 covariance/correlation 会告诉你这种关系很弱,并且可能(错误地)让你得出两个信号之间没有因果关系的结论。自相关基本上是时间序列移位版本的相关性,因此可以检测滞后相关性。
- 可能更多,但也许这是一个好的开始
如果这个问题听起来太琐碎了,请原谅,但我想确定我是在正确的轨道上。 我有一个类似于下图的数据框,我想了解这两个变量 A 和 B 是一起变化还是其他变化。
A B
0 34.4534 35.444248
1 34.8915 24.693800
2 0.0000 21.586316
3 34.7767 23.783602
我被要求绘制两者之间的协方差。然而,根据我的研究,协方差似乎是一个单一的计算值,就像平均值和标准差一样,而不是像 pdf/cdf 这样可以绘制的分布。
我对协方差的看法正确吗?对于理解这些变量之间可变性的其他方法,您能给我什么建议?
你的看法对吗? - 是的
协方差是衡量两个随机变量的联合可变性的指标,用一个数字表示。这个数字是
- 正 如果它们“表现相似”(这大致意味着变量 1 中的正峰与变量 2 中的正峰重合)
- 零 如果它们不共变
- 负数 如果它们“表现相似”但具有相反的关系(即负峰与正峰对齐,反之亦然)
import pandas as pd
# create 3 random variables; var 3 is based on var 1, so they should covary
data = np.random.randint(-9,9,size=(20,3))
data[:,2] = data[:,0] + data[:,2]*0.5
df = pd.DataFrame(data,columns=['var1','var2','var3'])
df.plot(marker='.')
我们看到 var1
和 var3
似乎是共变的;所以为了计算所有变量之间的协方差,pandas
派上用场了:
>>> df.cov()
var1 var2 var3
var1 31.326316 -5.389474 30.684211
var2 -5.389474 21.502632 -10.907895
var3 30.684211 -10.907895 37.776316
由于协方差的实际值取决于输入变量的规模,因此您通常通过各自的标准差对协方差进行归一化,从而将相关性作为协方差的度量,范围从 -1(反相关)到 1 (相关)。对于 pandas,这显示为
>>> df.corr()
var1 var2 var3
var1 1.000000 -0.207657 0.891971
var2 -0.207657 1.000000 -0.382724
var3 0.891971 -0.382724 1.000000
从中可以清楚地看出,var1
和 var3
表现出很强的相关性,正如我们预期的那样。
对于了解这些变量之间可变性的其他方法,您能给我什么建议? - 取决于数据
由于我们对您的数据的性质一无所知,因此很难说。也许只是作为一个入门者(不打算详尽无遗),一些关于您可以查看的内容的提示:
- Spearman's rank correlation:比Pearson相关系数更稳健,我们上面用过的;如果您的数据表现出某种非线性,Pearson 基本上只查看线性相关性并且会产生不太正确的结果;如果您的数据中可能存在非线性关系,您应该选择 Spearman
- 自相关:考虑一个正弦信号触发另一个信号但有 90º 的时间滞后(表示余弦)。在那种情况下,典型的 covariance/correlation 会告诉你这种关系很弱,并且可能(错误地)让你得出两个信号之间没有因果关系的结论。自相关基本上是时间序列移位版本的相关性,因此可以检测滞后相关性。
- 可能更多,但也许这是一个好的开始