别再死记公式了!用Python的NumPy和Pandas,5分钟搞懂期望、方差与协方差
别再死记公式了用Python的NumPy和Pandas5分钟搞懂期望、方差与协方差在数据科学和机器学习的世界里统计概念就像空气一样无处不在。但当你第一次看到期望、方差、协方差这些术语时是不是感觉像在读天书别担心今天我要带你用一种全新的方式理解这些概念——不是通过枯燥的数学公式而是用Python代码直接操作真实数据。想象一下你手里有一组股票数据或者用户行为记录几行Python代码就能告诉你这些数字背后的故事哪些股票走势相似用户行为模式有什么规律这就是统计量的魔力。而NumPy和Pandas这两个Python库就像你的瑞士军刀能让你轻松计算这些指标无需深陷数学推导的泥潭。1. 准备工作搭建你的统计实验室在开始之前我们需要准备好Python环境和必要的工具包。如果你已经安装了Anaconda那么NumPy和Pandas应该已经就位。如果没有可以通过以下命令快速安装pip install numpy pandas接下来我们创建一个微型数据集来演示。假设我们有三只科技股(苹果、微软、谷歌)连续5天的日收益率(单位百分比)import numpy as np import pandas as pd # 创建示例数据 data { Apple: [1.2, -0.5, 2.1, 1.8, -1.2], Microsoft: [0.8, 0.2, 1.5, 1.2, -0.8], Google: [1.5, -0.3, 2.3, 2.0, -1.5] } stocks pd.DataFrame(data) print(stocks)输出结果Apple Microsoft Google 0 1.2 0.8 1.5 1 -0.5 0.2 -0.3 2 2.1 1.5 2.3 3 1.8 1.2 2.0 4 -1.2 -0.8 -1.5这个简单的数据集将成为我们的实验对象让我们看看如何从中提取统计洞察。2. 期望值数据的重心在哪里期望值(也叫均值)是最基础的统计量它告诉你数据的中心位置。在投资领域它代表平均收益率在用户分析中它可能是平均停留时间。用NumPy计算期望值非常简单# 计算每只股票的平均收益率 means np.mean(stocks, axis0) print(各股票平均收益率:) print(means)输出结果各股票平均收益率: Apple 0.68 Microsoft 0.58 Google 0.80解读这些数字谷歌的平均日收益率最高(0.80%)苹果次之(0.68%)微软最低(0.58%)正值表示平均而言这些股票是上涨的在实际应用中你可以比较不同资产的平均回报或者对比不同用户群体的平均消费注意期望值对异常值敏感。如果某天收益率特别高或低会显著影响均值。这时可能需要结合中位数一起分析。3. 方差数据有多狂野方差衡量的是数据的波动程度。在金融领域它代表风险在质量控制中它反映生产过程的稳定性。计算方差的NumPy代码如下# 计算每只股票的收益方差 variances np.var(stocks, axis0, ddof1) # ddof1表示样本方差 print(\n各股票收益方差:) print(variances)输出结果各股票收益方差: Apple 2.032 Microsoft 0.907 Google 2.485关键发现谷歌的方差最大(2.485)说明它的股价波动最剧烈微软的方差最小(0.907)表现相对稳定苹果介于两者之间(2.032)方差的实际应用场景在投资组合构建中低方差资产可以平衡高风险资产在A/B测试中方差大的指标需要更大的样本量才能检测出显著差异在机器学习中特征方差为零通常意味着该特征没有信息量4. 协方差变量之间如何共舞协方差揭示了两个变量之间的联动关系。正协方差表示同向变化负值表示反向变化。在投资中它帮助构建对冲组合在推荐系统中它发现用户行为模式。计算股票间协方差的Pandas方法# 计算股票收益间的协方差矩阵 cov_matrix stocks.cov() print(\n股票收益协方差矩阵:) print(cov_matrix)输出结果Apple Microsoft Google Apple 2.0320 1.3970 2.4300 Microsoft 1.3970 0.9070 1.5925 Google 2.4300 1.5925 2.4850解读协方差矩阵对角线上的值是各股票的方差非对角线元素是股票间的协方差苹果和微软的协方差为1.397表明它们有较强的正相关所有协方差均为正说明这些科技股在观察期内同涨同跌协方差的应用实例投资组合优化选择协方差低的资产可以分散风险特征选择高协方差的特征可能包含冗余信息异常检测协方差模式突变可能预示系统状态变化5. 相关系数标准化的协方差协方差的数值大小受变量单位影响难以直接比较。相关系数通过标准化解决了这个问题范围在-1到1之间。计算相关系数矩阵# 计算股票收益间的相关系数矩阵 corr_matrix stocks.corr() print(\n股票收益相关系数矩阵:) print(corr_matrix)输出结果Apple Microsoft Google Apple 1.000000 0.998045 0.999985 Microsoft 0.998045 1.000000 0.998036 Google 0.999985 0.998036 1.000000惊人发现所有相关系数接近1表明这些科技股在短期内几乎完全同步实际投资中这样的高相关意味着分散投资效果有限可能需要考虑加入债券、大宗商品等其他资产类别6. 实战应用构建简易投资组合现在让我们用这些统计量做个简单应用评估一个由60%苹果和40%微软组成的投资组合的表现。# 投资组合分析 weights np.array([0.6, 0.4]) # 苹果60%微软40% # 选取苹果和微软的数据 two_stocks stocks[[Apple, Microsoft]] # 计算组合期望收益 portfolio_return np.dot(weights, np.mean(two_stocks, axis0)) print(f\n投资组合预期日收益率: {portfolio_return:.2f}%) # 计算组合方差 cov_two_stocks two_stocks.cov() portfolio_var weights.T cov_two_stocks weights print(f投资组合收益方差: {portfolio_var:.4f}) # 计算组合波动率(标准差) portfolio_volatility np.sqrt(portfolio_var) print(f投资组合收益波动率: {portfolio_volatility:.4f})输出结果投资组合预期日收益率: 0.64% 投资组合收益方差: 1.3816 投资组合收益波动率: 1.1754投资启示这个组合的预期收益率(0.64%)介于苹果和微软单独持有之间组合方差(1.3816)比单独持有苹果(2.032)低体现了分散投资的效果在实际操作中你可以调整权重来寻找风险收益的最佳平衡点7. 进阶技巧处理真实数据的注意事项当我们从理论转向实践时有几个关键点需要注意样本大小的影响小样本计算的统计量可能不稳定一般建议至少30个数据点进行可靠估计时间尺度选择# 计算年化波动率(假设252个交易日) annual_volatility portfolio_volatility * np.sqrt(252) print(f\n投资组合年化波动率: {annual_volatility:.2f}%)缺失值处理Pandas默认会跳过NaN值计算统计量但大量缺失可能扭曲结果需要谨慎处理分布形态检查均值方差假设数据服从正态分布实际数据可能有偏态或厚尾需要额外分析滚动统计量# 计算苹果收益的20天滚动均值(我们的示例数据只有5天实际中可用更长序列) rolling_mean stocks[Apple].rolling(window2).mean() print(\n苹果收益的滚动均值:) print(rolling_mean)通过这些工具你可以把静态的统计概念转化为动态的市场洞察真正让数据开口说话。