Python实战:用NumPy和Pandas轻松搞定协方差矩阵与相关系数计算(附完整代码)

发布时间:2026/5/22 8:34:13

Python实战:用NumPy和Pandas轻松搞定协方差矩阵与相关系数计算(附完整代码) Python实战用NumPy和Pandas轻松搞定协方差矩阵与相关系数计算附完整代码在数据分析的世界里理解变量之间的关系往往比了解单个变量本身更为重要。想象一下你正在分析一家电商平台的销售数据想知道广告支出与销售额之间是否存在某种关联或者你是一位金融分析师需要评估不同股票价格波动的同步性。这些场景下协方差和相关系数就像数据分析师的关系探测器能够量化变量之间的联动程度。1. 协方差与相关系数的核心概念1.1 协方差变量关系的风向标协方差衡量的是两个随机变量变化的同步性。当两个变量倾向于同时高于或低于各自的平均值时我们称它们具有正协方差反之当一个变量高于平均值而另一个低于平均值时则表现为负协方差。计算样本协方差的公式如下S_XY Σ(X_i - X̄)(Y_i - Ȳ) / (n-1)其中X̄和Ȳ分别是X和Y的样本均值n是样本数量分母使用n-1而非n是为了得到无偏估计注意协方差的大小受变量单位影响因此不适合直接比较不同数据集中的关系强度。1.2 相关系数标准化的协方差皮尔逊相关系数解决了协方差受量纲影响的问题它将协方差标准化到[-1,1]区间内ρ_XY cov(X,Y) / (σ_X * σ_Y)相关系数的解读1表示完全正线性相关-1表示完全负线性相关0表示无线性相关# 相关系数计算示例 import numpy as np x [1, 2, 3, 4, 5] y [2, 4, 6, 8, 10] print(相关系数:, np.corrcoef(x, y)[0, 1]) # 输出: 1.02. NumPy实现高效矩阵计算2.1 协方差矩阵的计算协方差矩阵是多元统计分析中的基础工具其对角线元素是各变量的方差非对角线元素是变量间的协方差。import numpy as np # 创建示例数据 - 每行代表一个变量每列代表一个观测值 data np.array([ [1.2, 2.3, 3.1, 4.5], # 变量A [2.1, 3.2, 4.0, 5.1], # 变量B [0.9, 1.8, 2.9, 3.8] # 变量C ]) # 计算协方差矩阵 cov_matrix np.cov(data) print(协方差矩阵:\n, cov_matrix)输出示例协方差矩阵: [[ 2.12916667 1.72916667 1.39583333] [ 1.72916667 1.5625 1.22916667] [ 1.39583333 1.22916667 1.0625 ]]2.2 相关系数矩阵NumPy提供了corrcoef()函数直接计算相关系数矩阵corr_matrix np.corrcoef(data) print(相关系数矩阵:\n, corr_matrix)3. Pandas的高级数据分析能力3.1 处理真实世界数据Pandas的优势在于能够轻松处理现实中的不完整数据并提供了更丰富的数据操作接口。import pandas as pd import numpy as np # 创建包含缺失值的DataFrame df pd.DataFrame({ 广告支出: [2.1, 3.2, np.nan, 4.5, 5.1], 销售额: [12, 15, 14, np.nan, 20], 客流量: [120, 150, 140, 160, 180] }) # 计算协方差矩阵自动跳过缺失值 print(协方差矩阵:\n, df.cov()) # 计算相关系数矩阵 print(\n相关系数矩阵:\n, df.corr())3.2 不同计算方法的比较Pandas支持三种相关系数计算方法方法适用场景特点pearson线性关系最常用要求数据近似正态分布kendall单调关系对异常值鲁棒计算成本高spearman单调关系不要求线性适用序数数据# 计算不同方法的相关系数 print(Pearson相关系数:\n, df.corr(methodpearson)) print(\nSpearman相关系数:\n, df.corr(methodspearman))4. 实战案例金融数据分析4.1 股票收益率相关性分析让我们分析几只科技股的每日收益率相关性import yfinance as yf import pandas as pd # 获取股票数据 tickers [AAPL, MSFT, GOOG, AMZN] data yf.download(tickers, start2022-01-01, end2023-01-01)[Adj Close] # 计算每日收益率 returns data.pct_change().dropna() # 计算收益率的相关性矩阵 correlation_matrix returns.corr() print(股票收益率相关系数矩阵:\n, correlation_matrix)4.2 结果可视化虽然本文聚焦于计算但快速可视化能更直观理解关系import seaborn as sns import matplotlib.pyplot as plt plt.figure(figsize(10, 8)) sns.heatmap(correlation_matrix, annotTrue, cmapcoolwarm, center0) plt.title(科技股收益率相关性热图) plt.show()5. 常见问题与性能优化5.1 处理大数据集时的内存问题当处理超大型数据集时可以采取以下优化策略分块计算将数据分成若干块分别计算稀疏矩阵对于高维稀疏数据使用专用格式数据类型优化使用float32代替默认的float64# 内存优化示例 def chunked_covariance(df, chunk_size1000): n len(df.columns) cov np.zeros((n, n)) for i in range(0, len(df), chunk_size): chunk df.iloc[i:ichunk_size] cov np.cov(chunk.T, ddof0) * len(chunk) return cov / len(df) # 使用更节省内存的数据类型 df df.astype(float32)5.2 缺失值处理策略删除法df.dropna()填充法均值/中位数填充df.fillna(df.mean())插值法df.interpolate()提示不同缺失值处理方法可能显著影响协方差和相关系数的计算结果应根据数据特点谨慎选择。6. 高级应用时间序列相关性分析金融时间序列分析中滚动相关性是观察关系动态变化的有效工具# 计算滚动60天的相关系数 rolling_corr returns[AAPL].rolling(window60).corr(returns[MSFT]) # 绘制滚动相关性 plt.figure(figsize(12, 6)) rolling_corr.plot() plt.title(AAPL与MSFT 60日滚动相关系数) plt.xlabel(日期) plt.ylabel(相关系数) plt.grid(True) plt.show()对于更复杂的时间序列分析可以考虑滞后相关性研究变量间领先-滞后关系协整检验判断长期均衡关系格兰杰因果检验分析预测关系方向

相关新闻