实战分析:使用Python计算协方差与相关系数的完整指南

113 阅读4分钟

前面介绍了:方差、标准差、协方差以及相关系数,让我们来看看如何运用吧。 内容有一点多,大家慢慢看!

在数据分析和统计学中,协方差和相关系数是衡量变量之间关系的重要指标。本文将通过一个实际案例,展示如何使用Python计算这些统计量,并进行可视化分析。

项目背景

本项目分析某商场不同品类商品的销售数据,包括水果、化妆品、蔬菜和海鲜的销售额。通过计算这些商品销售额变化率之间的协方差和相关系数,来探索它们之间的关联关系。

完整代码实现

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 读取水果和化妆品、蔬菜、海鲜
(fruitSales, vegetableSales, seafoodSales, makeupSales) = np.loadtxt("mall_sales.csv",
                                      delimiter=",",
                                      skiprows=1,
                                      usecols=(1,2,3,4),
                                      encoding="gbk",
                                      unpack=True)
# 计算协方差
# 归一化
fruit_sales_r = np.diff(fruitSales)/fruitSales[:-1]
makeup_sales_r = np.diff(makeupSales)/makeupSales[:-1]
vegetable_sales_r = np.diff(vegetableSales)/vegetableSales[:-1]
seafood_sales_r = np.diff(seafoodSales)/seafoodSales[:-1]
covm = np.cov(fruit_sales_r, makeup_sales_r)
print("协方差矩阵是:\n", covm)
covmDiag = covm.diagonal()
print("\n协方差矩阵的对角线元素是:\n", covmDiag)
convTrc = covm.trace()
print("\n协方差矩阵的迹是:\n", convTrc)
# r = covm / (fruit_sales_r.std() * makeup_sales_r.std())   # 第一种方式
r1 = np.corrcoef(fruit_sales_r, makeup_sales_r)   # 第二种方式
print("\n相关系数矩阵是:\n", r1)
# 可视化
t = np.arange(len(fruit_sales_r))
plt.plot(t, fruit_sales_r, 'r-', label='fruit')
plt.plot(t, makeup_sales_r, 'g--', label='makeup')
plt.plot(t, vegetable_sales_r, 'b*', label='vegetable')
plt.plot(t, seafood_sales_r, 'r-*', label='seafood')
plt.legend()
plt.show()
# 相关系数矩阵
# 水果、蔬菜
r2 = np.corrcoef(fruit_sales_r, makeup_sales_r)
print("\n水果、蔬菜相关系数矩阵是:\n", r2)
# 水果、海鲜
r3 = np.corrcoef(fruit_sales_r, makeup_sales_r)
print("\n水果、海鲜相关系数矩阵是:\n", r3)
# 化妆品、蔬菜
r4 = np.corrcoef(fruit_sales_r, makeup_sales_r)
print("\n化妆品、蔬菜相关系数矩阵是:\n", r4)
# 化妆品、海鲜
r5 = np.corrcoef(fruit_sales_r, makeup_sales_r)
print("\n化妆品、海鲜相关系数矩阵是:\n", r5)
# 蔬菜、海鲜
r6 = np.corrcoef(fruit_sales_r, makeup_sales_r)
print("\n蔬菜、海鲜相关系数矩阵是:\n", r6)

代码解析与统计概念

1. 数据预处理:计算变化率

fruit_sales_r = np.diff(fruitSales)/fruitSales[:-1]

这里使用np.diff()计算相邻数据的差值,然后除以前一期数据,得到销售额的变化率。这种归一化处理消除了数据的量纲影响。

2. 协方差计算

covm = np.cov(fruit_sales_r, makeup_sales_r)

协方差衡量两个变量的总体误差,公式为:

cov(X,Y) = E[(X - E[X])(Y - E[Y])]
  • 正值表示正相关
  • 负值表示负相关
  • 零表示无线性关系

3. 相关系数计算

r1 = np.corrcoef(fruit_sales_r, makeup_sales_r)

相关系数是标准化后的协方差,取值范围为[-1, 1],公式为:

r(X,Y) = cov(X,Y) / (σ_X × σ_Y)

其中σ_X和σ_Y分别是X和Y的标准差。

4. 矩阵操作

covmDiag = covm.diagonal()  # 对角线元素
convTrc = covm.trace()      # 矩阵的迹

这些操作帮助我们提取协方差矩阵的关键信息。

运行结果分析

从输出结果可以看到:

协方差矩阵是:
 [[1.3417822  1.16277927]
 [1.16277927 11.53402476]]

相关系数矩阵是:
 [[1.         0.29557373]
 [0.29557373 1.        ]]

关键发现:

  • 水果和化妆品销售额变化率的相关系数为0.296
  • 这表明两者存在弱正相关关系
  • 协方差矩阵的对角线元素分别是两个变量的方差

可视化分析

代码中还包含了数据可视化部分,通过折线图展示四个品类销售额变化率的趋势,便于直观观察它们之间的关联模式。

21.png

统计概念总结

在这个项目中,我们确实使用了以下统计概念:

✅ 使用的统计量:

  • 协方差np.cov() - 衡量两个变量的协同变化程度
  • 相关系数np.corrcoef() - 标准化后的协方差,衡量线性关系强度
  • 方差:协方差矩阵的对角线元素就是各个变量的方差
  • 标准差:在注释的备选方法中提及,用于计算相关系数

📊 实际应用:

通过计算这些统计量,我们可以:

  1. 量化不同商品销售额之间的关联程度
  2. 识别哪些商品销售趋势相似
  3. 为商品组合和促销策略提供数据支持