海归导师:怎么才能让我的学生明白相关性不等于因果性?然后再用Python画图呢?

文摘   2024-12-16 09:00   爱尔兰  

在数据分析中,相关性分析 是一种基础且常用的统计工具,但也是最容易被误解和滥用的工具之一。许多分析者习惯直接计算两个变量之间的相关性,得到一个数字(比如0.8或-0.6),然后下结论:“它们有很强的关系!” 但实际上,相关性不代表因果关系,也不能脱离实际逻辑随意计算。

举个例子:

  1. 冰淇淋销量与泳衣销量

  • 如果单纯看数据的话,冰淇淋销量与泳衣销量之间存在正相关。

  • 但这并不意味着吃冰淇淋就会去买泳衣!真正的原因是“夏季高温”,它同时导致了冰淇淋销量增加和游泳次数增加。

  • 电影票价与婚姻离婚率

    • 数据可能显示,某些年份电影票价上涨时,离婚率也上升。

    • 但这两者之间并没有直接关系,而是受到第三方因素(比如经济状况)的共同影响。

    这些例子告诉我们:计算相关性之前,一定要结合业务逻辑和实际背景,判断变量间是否有合理的联系。否则,相关性就只是一个数字,没有任何意义!

    今天我们的更新将侧重正确进行相关性分析,避免常见的误区。特别是如何使用Python代码计算相关性,并绘制高度美学优化的相关性热图。

    详细的Python代码举例如下:

    # 导入必要的库
    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np
    import pandas as pd
    from scipy.stats import pearsonr

    # 创建一个示例数据框
    np.random.seed(42)
    data = np.random.rand(10, 10) # 10x10的随机数据

    # 将数据转换为DataFrame并设置列名
    df = pd.DataFrame(data, columns=[f'Var{i}' for i in range(1, 11)])

    # 计算相关性矩阵
    corr_matrix = df.corr()

    # 计算显著性差异矩阵(例如,使用皮尔森相关系数的p值)
    p_values = np.zeros_like(corr_matrix)
    for i in range(len(df.columns)):
    for j in range(len(df.columns)):
    _, p_values[i, j] = pearsonr(df.iloc[:, i], df.iloc[:, j])


    # 创建一个画布
    plt.figure(figsize=(12, 8))
    # 绘制热图
    sns.heatmap(corr_matrix, annot=True, fmt=".2f", cmap='coolwarm', center=0,
    cbar_kws={'shrink': 0.75}, xticklabels=df.columns, yticklabels=df.columns)
    # 添加标题
    plt.title('Correlation Heatmap with Clustering and Significance', fontsize=16)
    # 显示显著性差异
    for i in range(len(df.columns)):
    for j in range(len(df.columns)):
    if p_values[i, j] < 0.05:
    plt.text(j + 0.5, i + 0.5, '*', color='red', ha='center', va='center', fontsize=18)
    ## Text(0.5, 0.5, '*')
    # 显示图形
    plt.show()

    五、总结

    今天的更新想要达到的效果是从计算代码到可视化,带你全面掌握了Python中的相关性分析,最主要的是明确一点:相关性不是因果性,计算前需要判断变量间的逻辑关系。最后强调:这些代码还比较简洁,一定要结合自己的数据以及绘图结果进行适当的调整,才能达到最佳的美学效果!

    感谢关注,你的支持是我不懈的动力!

    科研代码
    专注R和Python的数据分析。
     最新文章