Python案例如何实现数据相关性分析?

wen python案例 4

本文目录导读:

Python案例如何实现数据相关性分析?

  1. 基础准备:安装必要的库
  2. 基本相关性分析代码示例
  3. 可视化相关性分析
  4. 实际案例:股票数据相关性分析
  5. 高级相关性分析
  6. 统计显著性检验
  7. 实用函数封装
  8. 注意事项

我来详细介绍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)

注意事项

  1. 数据前提:检查数据是否符合正态分布,选择合适的相关系数方法
  2. 异常值处理:异常值可能严重影响相关系数
  3. 多重共线性:高相关性可能表示多重共线性问题
  4. 因果关系:相关性不等同于因果关系

通过以上代码,你可以完成从基础到高级的数据相关性分析,包括计算、可视化和统计检验。

抱歉,评论功能暂时关闭!