皮尔逊相关系数
一、统计学知识
期望值: E ( X ) E(X) E(X)表示随机变量 X \textit X X的期望值。
E ( X ) = X ‾ = 1 n ∑ i = 1 n X i \mathrm{E(X) =\overline{X} = \frac{1}{n} \sum_{i=1}^{n} X_i} E(X)=X=n1i=1∑nXi
方差:衡量一组数据的离散程度的统计量
σ X 2 = 1 n − 1 ∑ i = 1 n ( X i − X ‾ ) 2 \mathrm{\sigma_X^2 = \frac{1}{n-1} \sum_{i=1}^{n} \left(X_i - \overline{X}\right)^2} σX2=n−11i=1∑n(Xi−X)2
标准差:反映一个数据集的离散程度,是方差的算术平方根。
- 总体标准差:
σ = ∑ i = 1 n ( x − x ‾ ) 2 n \sigma=\sqrt{\frac{\sum_{i=1}^n(x-\overline{x})^2}n} σ=n∑i=1n(x−x)2
- 样本标准差:
S = ∑ i = 1 n ( x − x ‾ ) 2 n − 1 S=\sqrt{\frac{\sum_{i=1}^n(x-\overline{x})^2}{n-1}} S=n−1∑i=1n(x−x)2
协方差(Covariance)-:在概率论和统计学中用于衡量两个变量的总体误差。方差是协方差的一种特殊情况,即当两个变量是相同的情况。
C o v ( X , Y ) = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] = E ( X Y ) − 2 E ( X ) E ( Y ) + E ( X ) ( Y ) = E ( X Y ) − E ( X ) E ( Y ) \begin{aligned} Cov(X,Y)& =E[(X-E(X))(Y-E(Y))] \\ &=E(XY)-2E(X)E(Y)+E(X)(Y) \\ &=E(XY)-E(X)E(Y) \end{aligned} Cov(X,Y)=E[(X−E(X))(Y−E(Y))]=E(XY)−2E(X)E(Y)+E(X)(Y)=E(XY)−E(X)E(Y)
二、标准皮尔逊相关系数
2.1 定义
两个变量之间的皮尔逊 相关系数定义为两个变量之间的协方差和标准差的商:
ρ X , Y = c o v ( X , Y ) σ X σ Y = E [ ( X − E ( X ) ) ( Y − E ( Y ) ) ] σ X σ Y \begin{aligned}\rho_{X,Y}&=\frac{cov(X,Y)}{\sigma_X\sigma_Y}\\&=\frac{E[(X-E(X))(Y-E(Y))]}{\sigma_X\sigma_Y}\end{aligned} ρX,Y=σXσYcov(X,Y)=σXσYE[(X−E(X))(Y−E(Y))]
上式定义了总体相关系数,常用希腊小写字母$\rho 作为代表符号。估算样本的协方差和标准差,可得到样本相关系数 ( 样本皮尔逊系数 ) ,常用英文小写字母 作为代表符号。估算样本的协方差和标准差,可得到样本相关系数(样本皮尔逊系数),常用英文小写字母 作为代表符号。估算样本的协方差和标准差,可得到样本相关系数(样本皮尔逊系数),常用英文小写字母\text{r}$代表:
r = ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) ∑ i = 1 n ( X i − X ‾ ) 2 ∑ i = 1 n ( Y i − Y ‾ ) 2 r=\frac{\sum_{i=1}^n(X_i-\overline{X})(Y_i-\overline{Y})}{\sqrt{\sum_{i=1}^n(X_i-\overline{X})^2}\sqrt{\sum_{i=1}^n(Y_i-\overline{Y})^2}} r=∑i=1n(Xi−X)2∑i=1n(Yi−Y)2∑i=1n(Xi−X)(Yi−Y)
r \text{r} r亦可由 ( X i , Y i ) (X_i,Y_i) (Xi,Yi)标准化的样本点均值估计,得到与上式等价的表达式:
r = 1 n − 1 ∑ i = 1 n ( X i − X ‾ σ X ) ( Y i − Y ‾ σ Y ) r=\frac1{n-1}\sum_{i=1}^n(\frac{X_i-\overline{X}}{\sigma_X})(\frac{Y_i-\overline{Y}}{\sigma_Y}) r=n−11i=1∑n(σXXi−X)(σYYi−Y)
其中 X i − X ‾ σ X , X ‾ , σ X \frac{X_i-\overline{X}}{\sigma_X},\quad\overline{X},\quad\sigma_X σXXi−X,X,σX分别是 X i X_{i} Xi样本的标准化形式、样本平均值和样本标准差。
2.2 相关系数的性质
- 若 X X X 和 Y Y Y 相互独立,则 p X , Y = 0 p_{X,Y} = 0 pX,Y=0,但 p X , Y = 0 p_{X,Y} = 0 pX,Y=0 不能推出 X X X 和 Y Y Y 相互独立,等于0的情况称不相关,即独立则不相关,反过来不一定。
- 第一条的例外:当 ( X , Y ) (X, Y) (X,Y) 为二维正态时,由 p X , Y = 0 p_{X,Y} = 0 pX,Y=0 能推出 X X X 和 Y Y Y 独立。
- − 1 ≤ ρ X , Y ≤ 1 -1 \leq \rho_{X,Y} \leq 1 −1≤ρX,Y≤1,小于0时为负相关,大于0时为正相关,为当且仅当 X X X 和 Y Y Y 有严格线性关系时取等。
2.3 适用范围
当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:
(1)、两个变量之间是线性关系,都是连续数据。
(2)、两个变量的总体是正态分布,或接近正态的单峰分布。
(3)、两个变量的观测值是成对的,每对观测值之间相互独立。
2.4 物理意义
皮尔森相关系数反映了两个变量的线性相关性的强弱程度,r的绝对值越大说明相关性越强。
当r>0时,表明两个变量正相关,即一个变量值越大则另一个变量值也会越大;
当r<0时,表明两个变量负相关,即一个变量值越大则另一个变量值反而会越小;
当r=0时,表明两个变量不是线性相关的(注意只是非线性相关),但是可能存在其他方式的相关性(比如曲线方式);
当r=1和-1时,意味着两个变量X和Y可以很好的由直线方程来描述,所有样本点都很好的落在一条直线上。
2.5 判断变量的相关强度:
|r| | 相关强度 |
---|---|
0.8-1.0 | 极强相关 |
0.6-0.8 | 强相关 |
0.4-0.6 | 中等程度相关 |
0.2-0.4 | 弱相关 |
0.0-0.2 | 极弱相关或无相关 |
2.6 Python代码实现相关性计算
- 调库实现
# 导入必要的库
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns# 设置matplotlib的字体为SimHei,以正确显示中文
matplotlib.rcParams['font.family'] = 'SimHei'# 读取污染物数据Excel文件,选择特定列,并将特定的缺失值标记为NaN
pollutant_data = pd.read_excel('附件1.xlsx', usecols=["月", "日", "CO", "NO₂","O₃", "PM₁₀", "PM₂.₅","SO₂", "AQI"], na_values=['NA', 'NaN', '-'])# 读取气象数据Excel文件,选择特定列,并将特定的缺失值标记为NaN
weather_data = pd.read_excel('附件2.xlsx', na_values=['NA', 'NaN', '-'],usecols=["月", "日", "平均气温", "露点温度", "平均气压", "平均风速","降水量", "相对湿度"])# 合并污染物和气象数据集,基于"月"和"日"两列进行内连接
data = pd.merge(pollutant_data, weather_data, on=['月', '日'], how='inner')# 删除"月"和"日"两列,因为它们已用于合并数据集
data = data.drop(columns=['月', '日'])# 使用前向填充和后向填充方法处理数据集中的缺失值,确保数据的完整性
data.ffill(inplace=True)
data.bfill(inplace=True)# 计算所有列的相关性矩阵
corr_matrix = data.corr()# 创建一个12x8英寸大小的绘图窗口
plt.figure(figsize=(12, 8))# 使用seaborn库绘制相关性矩阵的热图,设置显示数值,以及颜色映射
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')# 设置图表标题
plt.title('Correlation Matrix')# 显示图表
plt.show()
- 手动实现:该部分代码可对上面代码打印的相关性矩阵进行验证,读者自行调整代码参数即可,主要调整参数要读取的文件,以及就是要计算的两个列名
import pandas as pd# 读取污染物数据Excel文件,选择特定列,并将特定的缺失值标记为NaN
pollutant_data = pd.read_excel('附件1.xlsx', usecols=["月", "日", "CO", "NO₂","O₃", "PM₁₀", "PM₂.₅","SO₂", "AQI"], na_values=['NA', 'NaN', '-'])# 读取气象数据Excel文件,选择特定列,并将特定的缺失值标记为NaN
weather_data = pd.read_excel('附件2.xlsx', na_values=['NA', 'NaN', '-'],usecols=["月", "日", "平均气温", "露点温度", "平均气压", "平均风速","降水量", "相对湿度"])# 合并污染物和气象数据集,基于"月"和"日"两列进行内连接
data = pd.merge(pollutant_data, weather_data, on=['月', '日'], how='inner')
# 删除"月"和"日"两列,因为它们已用于合并数据集
data = data.drop(columns=['月', '日'])# 使用前向填充和后向填充方法处理数据集中的缺失值
data.ffill(inplace=True)
data.bfill(inplace=True)# 初始化变量用于计算相关系数
sum_xy = 0
sum_x_squared = 0
sum_y_squared = 0
# 计算"PM₂.₅"列的样本平均值,将用于相关系数计算
avgx = data["PM₂.₅"].mean()
# 注意:avgy被赋值为与avgx相同的值,这意味着你实际上是在计算"PM₂.₅"列与自身的相关性
avgy = data["PM₂.₅"].mean()# 遍历数据集的每一行
for index, row in data.iterrows():# 计算协方差部分sum_xy += (row["PM₂.₅"] - avgx) * (row["PM₂.₅"] - avgy)# 计算X平方和sum_x_squared += (row["PM₂.₅"] - avgx) ** 2# 注意:这里应该是计算Y平方和,但由于avgy等于avgx,所以实际上也是X平方和sum_y_squared += (row["PM₂.₅"] - avgx) ** 2# 计算X标准差
std_x = (sum_x_squared ** 0.5)
# 注意:这里应该是计算Y标准差,但由于avgy等于avgx,所以实际上也是X标准差
std_y = (sum_y_squared ** 0.5)# 打印相关系数
print(sum_xy / (std_x * std_y))
三、参考文献
【1】相关系数——皮尔逊相关系数的公式及其理解_皮尔逊相关系数公式-CSDN博客
【2】皮尔森相关系数(Pearson correlation coefficient) - 南石 - 博客园 (cnblogs.com)