当前位置:首页>python>【Python】第十五天:变量之间有没有关系?全场景相关性分析,一行代码搞定

【Python】第十五天:变量之间有没有关系?全场景相关性分析,一行代码搞定

  • 2026-09-04 03:14:59
【Python】第十五天:变量之间有没有关系?全场景相关性分析,一行代码搞定

哈喽各位小伙伴!我是你们的统计学+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.有任何不懂的地方,评论区留言,我一一解答!清华大学数学科学系-东门

最新文章

随机文章