哈喽各位小伙伴!我是你们的统计学+Python零露老师~
上一期咱们补全了假设检验的核心技能,从今天开始,咱们进入统计学的另一个核心板块:相关性分析。
日常论文、工作里,我们经常会问这类问题:
(1)身高越高的人,体重是不是也越重?
(2)广告投入越多,产品销量是不是也越高?
(3)血糖越高的患者,血压是不是也越高?
这些问题的本质,都是在问「两个变量之间有没有关系」,今天咱们就一次性搞定全场景相关性分析,从原理到Python代码,小白看完就会用!
一、先搞懂核心:相关关系≠因果关系
这是相关性分析最重要的一条铁律,小白必须先记牢:两个变量有相关关系,不代表一个变量的变化是另一个变量导致的。
举个最经典的例子:夏天冰淇淋卖得越多,溺水死亡的人数也越多,两者是强正相关。但这绝对不是「吃冰淇淋导致溺水」,而是因为第三个因素——「天气热」:天气热了,吃冰淇淋的人多了,同时去游泳的人也多了,溺水人数自然就多了。
所以相关性分析,只能告诉你「两个变量会不会一起变化」,不能告诉你「谁导致了谁」,想要证明因果关系,需要后续的实验设计或回归分析。
二、小白必懂的2种相关系数
不用记复杂公式,记住这2种最常用的,日常99%的场景都够用:
1.皮尔逊(Pearson)相关系数r
这是最经典、最常用的相关系数,专门用来衡量两个连续变量的线性相关关系。
小白版核心规则:
(1)r的范围:永远在-1到1之间
① 绝对值越大,相关性越强:
② r=1:完美正相关(一个涨,另一个严格按比例涨)
③ r=0.7~0.99:强正相关
④ r=0.3~0.69:中等/弱正相关
⑤ r=0:无线性相关
⑥ r=-0.3~-0.69:中等/弱负相关
⑦ r=-0.7~-0.99:强负相关
⑧ r=-1:完美负相关(一个涨,另一个严格按比例跌)
(3)正负号代表方向:正号是正相关(你涨我也涨),负号是负相关(你涨我跌)
适用条件:
(1)两个变量都是连续型数据(比如身高、体重、收入、销量);
(2)两个变量基本符合正态分布;
(3)两个变量是线性关系(不是U型、S型这种非线性关系)。
2.斯皮尔曼(Spearman)秩相关系数
也叫等级相关系数,适用范围比皮尔逊广得多,是小白的「万能相关系数」。
核心特点:
(1)不要求数据符合正态分布,任何分布都能用;
(2)不仅能处理连续数据,还能处理有序分类数据(比如满意度:1-不满意、2-一般、3-满意);
(3)基于数据的「排名」计算,对异常值不敏感,更稳健。
适用场景:
(1)数据不符合正态分布;
(2)有异常值;
(3)变量是有序分类数据;
(4)不确定是不是线性关系,先拿它探路。
三、Python全流程实战!双场景手把手教学
代码超简单,一行就能算出相关系数,小白直接复制就能跑!
第一步:先导入工具库(必须先运行!)
pythonimportpandasaspdimportnumpyasnpfromscipyimportstatsimportseabornassnsimportmatplotlib.pyplotasplt#解决中文显示问题plt.rcParams["font.family"]=["SimHei","WenQuanYiMicroHei"]plt.rcParams["axes.unicode_minus"]=False |
场景1:医学实战-身高与体重的相关性(皮尔逊相关)
这是最经典的连续变量相关场景:我们测量了20名成年人的身高(cm)和体重(kg),检验身高和体重有没有线性相关关系。
python#1.准备数据:20人的身高和体重df=pd.DataFrame({"身高(cm)":[165,172,158,180,175,168,185,170,162,178,173,160,182,169,176,155,188,171,164,179],"体重(kg)":[58,68,52,78,72,62,85,65,54,75,70,55,80,64,73,50,90,67,57,76]})#2.计算皮尔逊相关系数r和p值#一行代码搞定:stats.pearsonr(变量1,变量2)r,p_value=stats.pearsonr(df["身高(cm)"],df["体重(kg)"])#3.画散点图,直观看到相关趋势plt.figure(figsize=(7,5))sns.scatterplot(x="身高(cm)",y="体重(kg)",data=df,s=80)sns.regplot(x="身高(cm)",y="体重(kg)",data=df,scatter=False,color="red")#加一条趋势线plt.title("身高与体重的散点图",fontsize=14)plt.xlabel("身高(cm)",fontsize=12)plt.ylabel("体重(kg)",fontsize=12)plt.show()#4.结果解读print(f"✅皮尔逊相关系数r:{r:.2f}")print(f"✅p值:{p_value:.6f}")ifp_value<0.05:ifr>0:print(f"��结论:p<0.05,身高和体重呈显著正相关(r={r:.2f}),身高越高,体重越重")else:print(f"��结论:p<0.05,身高和体重呈显著负相关(r={r:.2f})")else:print("��结论:p≥0.05,没有足够证据证明身高和体重有线性相关关系") |
场景2:业务实战-广告投入与销量的相关性(斯皮尔曼相关)
这是运营工作的高频场景,数据可能有异常值,用斯皮尔曼更稳健:我们统计了12个月的广告投入(万元)和产品销量(万件),检验广告投入和销量有没有相关关系。
python#1.准备数据:12个月的广告投入和销量df=pd.DataFrame({"广告投入(万元)":[10,15,8,20,12,25,9,18,11,22,14,30],"销量(万件)":[25,38,20,45,30,55,22,42,28,50,32,65]})#2.计算斯皮尔曼秩相关系数和p值#一行代码搞定:stats.spearmanr(变量1,变量2)rho,p_value=stats.spearmanr(df["广告投入(万元)"],df["销量(万件)"])#3.画散点图plt.figure(figsize=(7,5))sns.scatterplot(x="广告投入(万元)",y="销量(万件)",data=df,s=80,color="green")plt.title("广告投入与销量的散点图",fontsize=14)plt.xlabel("广告投入(万元)",fontsize=12)plt.ylabel("销量(万件)",fontsize=12)plt.show()#4.结果解读print(f"✅斯皮尔曼秩相关系数rho:{rho:.2f}")print(f"✅p值:{p_value:.6f}")ifp_value<0.05:ifrho>0:print(f"��结论:p<0.05,广告投入和销量呈显著正相关(rho={rho:.2f}),广告投入越多,销量越高")else:print(f"��结论:p<0.05,广告投入和销量呈显著负相关(rho={rho:.2f})")else:print("��结论:p≥0.05,没有足够证据证明广告投入和销量有相关关系") |
四、小白必记的3个注意事项
(1)永远记住:相关≠因果,两个变量相关,可能是第三个因素导致的,不要随便下因果结论;
(2)先看散点图,再算相关系数:散点图能一眼看出是不是线性关系、有没有异常值,比如U型关系的两个变量,皮尔逊r可能接近0,但其实有很强的非线性相关;
(3)样本量太小不可靠:比如只有5个数据,算出的相关系数没意义,建议样本量至少30以上。
一张表总结:2种相关系数怎么选?
小白直接收藏,用的时候看一眼就不会错!
相关系数 | 适用数据类型 | 分布要求 | 核心特点 | Python函数 |
皮尔逊相关系数r | 两个连续变量 | 要求正态分布 | 衡量线性相关,最经典 | stats.pearsonr |
斯皮尔曼秩相关系数rho | 连续变量/有序分类变量 | 无要求 | 基于排名,对异常值不稳健,万能通用 | stats.spearmanr |
第十五天学习总结
恭喜你!今天彻底搞定了相关性分析的核心技能,核心就3点:
(1)相关性分析只能告诉你「两个变量会不会一起变化」,相关≠因果;
(2)皮尔逊相关系数适合连续、正态、线性数据,斯皮尔曼是万能通用款,小白优先用斯皮尔曼探路;
(3)先看散点图,再算相关系数,一行代码就能出结果,直接套用就行。
下期预告
明天Day16,咱们从「相关」进阶到「预测」——简单线性回归!教你用一个变量预测另一个变量,比如用身高预测体重,用广告投入预测销量,依旧是大白话+Python保姆级代码,咱们不见不散!
✨粉丝福利
1.关注公众号,Day16更新第一时间推送!
2.评论区扣【15】,免费领取今天的全套可直接运行的代码文件!
3.有任何不懂的地方,评论区留言,我一一解答!清华大学数学科学系-东门