本文目录导读:

我来详细介绍Python中实现数据相关性分析的几种常见方法。
基础准备:安装必要的库
pip install pandas numpy matplotlib seaborn scipy
基本相关性分析代码示例
1 导入数据和计算相关系数
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
# 创建示例数据
np.random.seed(42)
data = {
'年龄': np.random.randint(20, 60, 100),
'收入': np.random.randint(3000, 20000, 100),
'工作经验': np.random.randint(1, 30, 100),
'消费支出': np.random.randint(1000, 8000, 100)
}
df = pd.DataFrame(data)
# 显示数据前5行
print("数据前5行:")
print(df.head())
# 计算相关系数矩阵
correlation_matrix = df.corr()
print("\n相关系数矩阵:")
print(correlation_matrix)
2 完整的相关性分析流程
# 1. 数据探索
print("数据基本信息:")
print(df.describe())
print("\n缺失值检查:")
print(df.isnull().sum())
# 2. 计算多种相关系数
print("\n皮尔逊相关系数:")
pearson_corr = df.corr(method='pearson')
print(pearson_corr)
print("\n斯皮尔曼相关系数:")
spearman_corr = df.corr(method='spearman')
print(spearman_corr)
print("\n肯德尔相关系数:")
kendall_corr = df.corr(method='kendall')
print(kendall_corr)
可视化相关性分析
1 热力图
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 创建热力图
plt.figure(figsize=(10, 8))
sns.heatmap(correlation_matrix,
annot=True, # 显示数值
cmap='coolwarm', # 颜色映射
center=0, # 中心值
square=True, # 正方形
linewidths=1, # 网格线宽度
cbar_kws={"shrink": 0.8}) # 颜色条缩放
'变量相关性热力图', fontsize=16)
plt.tight_layout()
plt.show()
2 散点图矩阵
# 散点图矩阵
sns.pairplot(df, diag_kind='kde')
plt.suptitle('变量间关系散点图矩阵', y=1.02)
plt.show()
3 相关性散点图
# 选择两个变量绘制散点图
plt.figure(figsize=(8, 6))
sns.scatterplot(data=df, x='收入', y='消费支出')'收入与消费支出的关系')
plt.xlabel('收入')
plt.ylabel('消费支出')
plt.grid(True, alpha=0.3)
plt.show()
实际案例:股票数据相关性分析
# 模拟股票数据
import yfinance as yf # 需要安装:pip install yfinance
# 示例:使用随机数据模拟
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=100, freq='D')
stock_data = pd.DataFrame({
'日期': dates,
'股票A': np.random.randn(100).cumsum() + 100,
'股票B': np.random.randn(100).cumsum() + 100,
'股票C': np.random.randn(100).cumsum() + 100,
'股票D': np.random.randn(100).cumsum() + 100
})
stock_data.set_index('日期', inplace=True)
# 计算收益率
returns = stock_data.pct_change().dropna()
# 收益率相关性分析
print("收益率相关系数:")
return_corr = returns.corr()
print(return_corr)
# 可视化收益率相关性
plt.figure(figsize=(10, 8))
sns.heatmap(return_corr, annot=True, cmap='RdYlGn', center=0,
vmin=-1, vmax=1, square=True)'股票收益率相关性热力图')
plt.tight_layout()
plt.show()
高级相关性分析
1 偏相关性分析
from pingouin import partial_corr # 需要安装:pip install pingouin
# 计算偏相关(控制其他变量)
if 'pingouin' in dir():
# 示例:控制工作经验后,收入和消费支出的偏相关
partial_result = partial_corr(data=df, x='收入', y='消费支出',
covar=['工作经验', '年龄'])
print("偏相关分析结果:")
print(partial_result)
2 时间序列相关性分析
# 时间序列的滚动相关性
rolling_corr = stock_data['股票A'].rolling(window=20).corr(stock_data['股票B'])
plt.figure(figsize=(12, 6))
plt.plot(stock_data.index, stock_data['股票A'], label='股票A', alpha=0.7)
plt.plot(stock_data.index, stock_data['股票B'], label='股票B', alpha=0.7)
plt.plot(stock_data.index, rolling_corr, label='20日滚动相关系数', linewidth=2)'股票价格与滚动相关系数')
plt.xlabel('日期')
plt.ylabel('价格 / 相关系数')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
统计显著性检验
# 对相关系数进行显著性检验
def corr_significance(df):
"""计算相关系数的显著性水平"""
p_values = pd.DataFrame(np.zeros_like(df.corr()),
index=df.columns, columns=df.columns)
for i in df.columns:
for j in df.columns:
if i != j:
corr, p_value = stats.pearsonr(df[i], df[j])
p_values.loc[i, j] = p_value
return p_values
# 计算p值
p_values = corr_significance(df)
print("相关系数P值矩阵:")
print(p_values)
# 标记显著性
print("\n显著相关标记(p < 0.05):")
significant = p_values < 0.05
print(significant)
实用函数封装
def comprehensive_correlation_analysis(df, method='pearson',
threshold=0.5, figsize=(12, 10)):
"""
综合性相关性分析函数
参数:
- df: DataFrame
- method: 相关系数方法 ('pearson', 'spearman', 'kendall')
- threshold: 相关性阈值
- figsize: 图表大小
"""
# 1. 计算相关系数
corr_matrix = df.corr(method=method)
# 2. 找出强相关对
strong_corr = []
for i in range(len(corr_matrix.columns)):
for j in range(i+1, len(corr_matrix.columns)):
if abs(corr_matrix.iloc[i, j]) >= threshold:
strong_corr.append({
'变量1': corr_matrix.columns[i],
'变量2': corr_matrix.columns[j],
'相关系数': round(corr_matrix.iloc[i, j], 3)
})
# 3. 可视化
fig, axes = plt.subplots(1, 2, figsize=figsize)
# 热力图
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm',
center=0, square=True, ax=axes[0])
axes[0].set_title(f'{method.capitalize()}相关性热力图')
# 强相关散点图
if strong_corr:
pair = strong_corr[0]
sns.scatterplot(data=df, x=pair['变量1'], y=pair['变量2'], ax=axes[1])
axes[1].set_title(f"最强相关对: {pair['变量1']} vs {pair['变量2']}\n"
f"相关系数: {pair['相关系数']}")
plt.tight_layout()
plt.show()
# 4. 输出结果
print(f"{'='*50}")
print(f"相关性分析方法: {method}")
print(f"相关性阈值: {threshold}")
print(f"强相关对数量: {len(strong_corr)}")
if strong_corr:
print(f"\n强相关对详情:")
for pair in strong_corr:
print(f" {pair['变量1']} - {pair['变量2']}: {pair['相关系数']}")
return corr_matrix, strong_corr
# 使用示例
corr_matrix, strong_corr = comprehensive_correlation_analysis(df)
注意事项
- 数据前提:检查数据是否符合正态分布,选择合适的相关系数方法
- 异常值处理:异常值可能严重影响相关系数
- 多重共线性:高相关性可能表示多重共线性问题
- 因果关系:相关性不等同于因果关系
通过以上代码,你可以完成从基础到高级的数据相关性分析,包括计算、可视化和统计检验。