哈喽各位小伙伴!我是你们的统计学+Python零露老师~
前三天咱们已经解锁了两大核心:
•Day2:集中趋势——知道数据“平均在哪”
•Day3:离散趋势——知道数据“散不散、稳不稳”
但光有这两个还不够!今天咱们要搞定最后一块拼图:数据的分布形状。
举个超直观的例子:两个班级的考试平均分都是70分,标准差也差不多,但:
•A班:大多数人考60-80分,中间多两头少,成绩很“正常”
•B班:一半人考90+,一半人考50以下,两极分化严重
•C班:大多数人考80-90分,只有少数人不及格,成绩整体偏“好”
你看!平均分和标准差都一样,但数据的“形状”完全不同!今天咱们就用偏度、峰度两个指标,加上直方图、密度图、箱线图可视化,一眼看穿数据的分布形状!
内容不长,全是干货,小白跟着复制代码就能学会~
一、偏度:看数据“歪不歪”
1. 大白话讲懂偏度
偏度(Skewness)就是看数据的分布对不对称,往哪边“歪”,主要分三种:
偏度类型 | 大白话定义 | 典型例子 |
对称分布(偏度≈0) | 数据左右对称,中间最多,往两头逐渐减少 | 正常人的身高、体温,大多数人的考试成绩 |
右偏分布(偏度>0) | 数据“尾巴”在右边,大多数数据集中在左边,少数极端大值把尾巴拉到右边 | 患者住院天数(大多数住几天,少数住很久)、用户消费金额(大多数花几十,少数花几千) |
左偏分布(偏度<0) | 数据“尾巴”在左边,大多数数据集中在右边,少数极端小值把尾巴拉到左边 | 很难的考试成绩(大多数人不及格,少数人考高分)、产品寿命(大多数用很久,少数很快坏) |
一句话记:偏度>0右偏,偏度<0左偏,偏度≈0对称。
二、峰度:看数据“尖不尖”
1. 大白话讲懂峰度
峰度(Kurtosis)就是看数据的分布是“尖顶”还是“平顶”,和标准正态分布比:
峰度类型 | 大白话定义 | 典型例子 |
正态峰(峰度≈0) | 和标准正态分布一样,不尖也不平 | 新生儿体重、测量误差 |
尖峰分布(峰度>0) | 比正态分布更“尖”、更“瘦”,数据特别集中在中间 | 大家分数都差不多的考试成绩、商品好评率(要么全好评要么全差评) |
平峰分布(峰度<0) | 比正态分布更“平”、更“胖”,数据比较分散 | 分数分布很均匀的考试成绩、不同地区的房价 |
一句话记:峰度>0尖峰,峰度<0平峰,峰度≈0正态峰。
三、Python 实战!双场景计算+可视化
咱们直接上代码,用两个最典型的场景:
1.医学场景:患者住院天数(右偏分布)
2.非医学场景:用户消费金额(右偏分布)+ 模拟对称分布数据对比
第一步:老规矩,先导入工具库
新建代码框,复制运行:
Pythonimport numpy as npimport pandas as pdfrom scipy import stats as stsimport seaborn as snsimport matplotlib.pyplot as plt# 解决中文乱码plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei"]plt.rcParams["axes.unicode_minus"] = False |
第二步:医学场景实战:患者住院天数
咱们模拟100位患者的住院天数,大多数住3-7天,少数住15天以上(右偏分布),新建代码框:
Python# 模拟100位患者住院天数:右偏分布np.random.seed(10) # 固定随机数,保证结果一致hospital_days = np.concatenate([np.random.normal(5, 2, 80), np.random.normal(15, 3, 20)])# 把小于1天的改成1天(住院至少1天)hospital_days = np.where(hospital_days < 1, 1, hospital_days)# 转成DataFrame方便看data_med = pd.DataFrame({"住院天数": hospital_days})print("患者住院天数前10条:")print(data_med.head(10)) |
然后算偏度和峰度,新建代码框:
Python# 计算偏度:bias=False代表计算总体偏度skewness_med = sts.skew(data_med["住院天数"], bias=False)# 计算峰度:bias=False代表计算总体峰度kurtosis_med = sts.kurtosis(data_med["住院天数"], bias=False)print(f"✅ 住院天数偏度:{skewness_med:.2f}")print(f"✅ 住院天数峰度:{kurtosis_med:.2f}")print("�� 解读:偏度>0,是右偏分布,符合预期(少数患者住院很久)") |
最后画直方图+密度图+箱线图,一眼看分布,新建代码框:
Python# 设置画布大小plt.figure(figsize=(15, 5))# 画直方图+密度图plt.subplot(1, 2, 1)sns.histplot(data_med["住院天数"], kde=True, bins=15)plt.title("患者住院天数分布(直方图+密度图)", fontsize=14)plt.xlabel("住院天数", fontsize=12)# 画箱线图plt.subplot(1, 2, 2)sns.boxplot(data=data_med["住院天数"], width=0.3)plt.title("患者住院天数分布(箱线图)", fontsize=14)plt.ylabel("住院天数", fontsize=12)plt.tight_layout()plt.show() |
运行后你会看到两张图:
•左边的图:数据明显集中在左边(3-7天),右边有个长尾巴,典型的右偏分布
•右边的箱线图:上面有很多圆点,就是住院很久的极端异常值,完美对应右偏
第三步:非医学场景实战:用户消费金额+对称数据对比
咱们模拟两组数据对比:
1.用户消费金额:右偏分布(大多数花几十,少数花几千)
2.模拟考试成绩:对称分布(大多数在中间)
新建代码框,生成数据:
Python# 1. 模拟100位用户消费金额:右偏分布np.random.seed(20)spend_money = np.concatenate([np.random.normal(100, 30, 85), np.random.normal(500, 100, 15)])spend_money = np.where(spend_money < 10, 10, spend_money) # 最低消费10元# 2. 模拟100位学生考试成绩:对称分布(正态分布)exam_score = np.random.normal(70, 10, 100)exam_score = np.clip(exam_score, 0, 100) # 分数0-100之间# 转成DataFramedata_biz = pd.DataFrame({"用户消费金额": spend_money,"考试成绩": exam_score}) |
算两组数据的偏度和峰度对比,新建代码框:
Python# 算消费金额skew_spend = sts.skew(data_biz["用户消费金额"], bias=False)kurt_spend = sts.kurtosis(data_biz["用户消费金额"], bias=False)# 算考试成绩skew_exam = sts.skew(data_biz["考试成绩"], bias=False)kurt_exam = sts.kurtosis(data_biz["考试成绩"], bias=False)print("===== 用户消费金额 =====")print(f"偏度:{skew_spend:.2f},峰度:{kurt_spend:.2f}")print("�� 右偏分布,符合预期")print("\n===== 考试成绩 =====")print(f"偏度:{skew_exam:.2f},峰度:{kurt_exam:.2f}")print("�� 接近对称分布,符合预期") |
最后画对比图,新建代码框:
Pythonplt.figure(figsize=(15, 5))# 画消费金额plt.subplot(1, 2, 1)sns.histplot(data_biz["用户消费金额"], kde=True, bins=15, color="orange")plt.title("用户消费金额分布(右偏)", fontsize=14)# 画考试成绩plt.subplot(1, 2, 2)sns.histplot(data_biz["考试成绩"], kde=True, bins=15, color="blue")plt.title("考试成绩分布(对称)", fontsize=14)plt.tight_layout()plt.show() |
对比图一目了然:左边消费金额右边有长尾巴,右边考试成绩左右对称~
第四天学习总结
恭喜你!描述统计学的核心内容咱们已经全部学完了!
1.集中趋势:均值、中位数、众数——看数据“在哪”
2.离散趋势:极差、方差、标准差、分位数、变异系数——看数据“散不散”
3.分布形状:偏度、峰度+可视化——看数据“长啥样”
现在你拿到一组数据,已经能从三个维度全面分析它了,是不是超有成就感!
下期预告
从明天Day5开始,咱们要进入推断统计学的世界了!先从统计学最基础、最常用的正态分布讲起,大白话讲原理,Python一键生成,还会教大家什么是“68-95-99.7法则”,咱们不见不散~