Data Science for Beginners 第 4 课实战:用均值、分布、相关性与假设检验分析糖尿病数据集
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
本文基于 Data-Science-For-Beginners 课程第 4 课「概率与统计」配套作业《Small Diabetes Study》,带领读者用 Pandas、Matplotlib 与 SciPy 对一个真实的糖尿病病人小样本数据集完成五项统计任务:计算均值与方差、按性别绘制箱线图、分析变量分布、检验各变量与疾病进展的相关性,并用 t 检验验证「糖尿病进展在男女性别间存在差异」这一假设。读完本文,你将掌握一套可复用的「描述统计 → 可视化 → 相关性 → 假设检验」数据分析流程,并能在 Jupyter Notebook 环境中完整复现该作业的参考答案。
数据集与任务概览
本作业使用一个小型糖尿病病人数据集,共 442 条记录,以制表符分隔存放在仓库的 data/diabetes.tsv 中。每个样本包含 11 个字段:
| 字段 | 含义 |
|---|---|
| AGE | 年龄 |
| SEX | 性别(1 与 2 两个取值) |
| BMI | 身体质量指数(body mass index) |
| BP | 平均血压(average blood pressure) |
| S1 ~ S6 | 六种不同的血液测量指标 |
| Y | 一年内疾病进展程度的定量度量(disease progression) |
数据前几行如下:
| AGE | SEX | BMI | BP | S1 | S2 | S3 | S4 | S5 | S6 | Y | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 59 | 2 | 32.1 | 101. | 157 | 93.2 | 38.0 | 4. | 4.8598 | 87 | 151 |
| 1 | 48 | 1 | 21.6 | 87.0 | 183 | 103.2 | 70. | 3. | 3.8918 | 69 | 75 |
| 2 | 72 | 2 | 30.5 | 93.0 | 156 | 93.6 | 41.0 | 4.0 | 4. | 85 | 141 |
作业要求在 1-Introduction/04-stats-and-probability/assignment.ipynb 中完成以下五项任务:
- 计算所有变量的均值与方差;
- 分别按性别绘制 BMI、BP、Y 的箱线图;
- 分析 AGE、SEX、BMI、Y 四个变量的分布形态;
- 检验不同变量与疾病进展(Y)之间的相关性;
- 检验「糖尿病进展在男性和女性之间存在差异」这一假设。
仓库同时提供了完整的参考答案笔记本,下文所有统计结果均来自该参考答案的真实输出。关于均值、方差、箱线图、正态分布、假设检验与相关性等概念的完整理论讲解,可参阅本课讲义 1-Introduction/04-stats-and-probability/README.md。
环境准备与数据加载
建议在 Jupyter Notebook 环境中运行(参考答案使用 Python 3.8 + conda 环境)。所需依赖为 Pandas、NumPy、Matplotlib 与 SciPy,前三者用于数据处理和可视化,scipy.stats.ttest_ind用于任务 5 的假设检验。
import pandas as pd import numpy as np import matplotlib.pyplot as plt from scipy.stats import ttest_ind df = pd.read_csv("data/diabetes.tsv", sep='\t') df.head()注意数据文件使用制表符\t作为分隔符,因此必须显式传入sep='\t',否则 Pandas 会将整行解析为单列。若从 1-Introduction/04-stats-and-probability/assignment.ipynb 目录运行,路径需相应调整为../../data/diabetes.tsv。
任务 1:计算所有变量的均值与方差
均值(mean)刻画变量的中心趋势,方差(variance)刻画数据相对均值的离散程度——两者是描述统计中最基础的指标。这里有两种等价做法。
方法一:一行命令获取完整统计摘要
df.describe()会一次性返回每个变量的计数、均值、标准差、最小值、四分位数(25%/50%/75%)与最大值:
df.describe()参考答案输出摘要(部分):
| 统计量 | AGE | SEX | BMI | BP | S1 | S2 | S3 | S4 | S5 | S6 | Y |
|---|---|---|---|---|---|---|---|---|---|---|---|
| count | 442 | 442 | 442 | 442 | 442 | 442 | 442 | 442 | 442 | 442 | 442 |
| mean | 48.52 | 1.47 | 26.38 | 94.65 | 189.14 | 115.44 | 49.79 | 4.07 | 4.64 | 91.26 | 152.13 |
| std | 13.11 | 0.50 | 4.42 | 13.83 | 34.61 | 30.41 | 12.93 | 1.29 | 0.52 | 11.50 | 77.09 |
| min | 19.00 | 1.00 | 18.00 | 62.00 | 97.00 | 41.60 | 22.00 | 2.00 | 3.26 | 58.00 | 25.00 |
| 25% | 38.25 | 1.00 | 23.20 | 84.00 | 164.25 | 96.05 | 40.25 | 3.00 | 4.28 | 83.25 | 87.00 |
| 50% | 50.00 | 1.00 | 25.70 | 93.00 | 186.00 | 113.00 | 48.00 | 4.00 | 4.62 | 91.00 | 140.50 |
| 75% | 59.00 | 2.00 | 29.28 | 105.00 | 209.75 | 134.50 | 57.75 | 5.00 | 5.00 | 98.00 | 211.50 |
| max | 79.00 | 2.00 | 42.20 | 133.00 | 301.00 | 242.40 | 99.00 | 9.09 | 6.11 | 124.00 | 346.00 |
方法二:显式计算均值与方差矩阵
若只想得到均值与方差两行,可直接调用df.mean()与df.var()并拼成一个 DataFrame:
pd.DataFrame([df.mean(), df.var()], index=['Mean','Variance'])参考答案输出:
| AGE | SEX | BMI | BP | S1 | S2 | S3 | S4 | S5 | S6 | Y | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| Mean | 48.52 | 1.47 | 26.38 | 94.65 | 189.14 | 115.44 | 49.79 | 4.07 | 4.64 | 91.26 | 152.13 |
| Variance | 171.85 | 0.25 | 19.52 | 191.30 | 1197.72 | 924.96 | 167.29 | 1.67 | 0.27 | 132.17 | 5943.33 |
观察可知:Y(疾病进展)的方差高达 5943.33,是离散程度最大的变量,说明病人之间一年内的疾病进展差异显著;而 SEX 为二值变量,方差仅 0.25。
任务 2:按性别绘制 BMI、BP、Y 的箱线图
箱线图(box plot)可以直观展示数据的中位数、四分位数以及离群值:箱体上下边缘分别对应第一四分位数 Q1 与第三四分位数 Q3,箱内横线为中位数,延伸出的须线覆盖非离群范围,而超出[Q1-1.5*IQR, Q3+1.5*IQR](IQR=Q3-Q1 为四分位距)的点被标记为离群值。
用 Pandas 内置的boxplot方法,即可按 SEX 分组绘制箱线图:
for col in ['BMI','BP','Y']: df.boxplot(column=col, by='SEX') plt.show()该代码依次生成三张以 SEX 为分组(横轴取值 1、2)的箱线图。参考答案的结论是:三张图均显示两组的中位数与四分位区间存在一定差异,但就图形本身而言,需要结合后续任务 4 的相关分析与任务 5 的假设检验,才能判断这些差异是否具有统计意义。
任务 3:分析 AGE、SEX、BMI、Y 的分布形态
直方图(histogram)按取值区间(bins)统计样本频数,是判断分布形态最直接的图形工具:
for col in ['AGE','SEX','BMI','Y']: df[col].hist() plt.show()对四个变量逐一绘制直方图后,参考答案给出的结论为:
- AGE(年龄):分布近似正态(normal)——大部分样本集中在均值附近,向两端逐渐递减;
- SEX(性别):呈现均匀(uniform)形态——两个取值对应的样本数大致相当;
- BMI 与 Y:形态介于两者之间,仅凭直方图难以断言其服从何种分布(hard to tell)。
这一步骤的训练价值在于:识别分布形态是后续选择统计检验方法的前提。例如任务 5 的 t 检验正是基于「两组数据近似服从正态分布」的假设,而 SEX 作为二值分类变量则天然无法用连续分布描述。
任务 4:检验各变量与疾病进展(Y)的相关性
相关性(correlation)取值范围为 [-1, 1]:1 表示强正相关,-1 表示强负相关,0 表示无关。作业提示指出,相关矩阵(correlation matrix)能最有效地揭示哪些变量相互依赖。Pandas 提供一行命令:
df.corr()参考答案输出中,与 Y 相关性最强的变量如下:
| 变量 | 与 Y 的相关系数 |
|---|---|
| BMI | 0.586 |
| S5 | 0.566 |
| BP | 0.441 |
| S4 | 0.430 |
| S3 | -0.395 |
| S6 | 0.382 |
此外,相关矩阵还显示 S1 与 S2 之间相关系数高达 0.897——这符合直觉:同为血液测量指标,两者高度共线。
参考答案的结论是:Y 与 BMI 及 S5(血糖相关血液指标)的相关性最强,这从医学角度看是合理的(肥胖与血糖水平是糖尿病进展的典型风险因素)。注意:强相关不等于因果关系,本数据集只能说明变量之间存在统计关联。
为进一步直观确认相关性,参考答案还对相关性最强的三个变量(BMI、S5、BP)与 Y 绘制了散点图:
fig, ax = plt.subplots(1,3,figsize=(10,5)) for i,n in enumerate(['BMI','S5','BP']): ax[i].scatter(df['Y'], df[n]) ax[i].set_title(n) plt.show()散点图中 BMI、S5 均随 Y 呈现明显上升趋势,与相关系数相互印证。
任务 5:假设检验——糖尿病进展在性别间是否存在差异
这是本作业的收尾任务,也是将前面所有统计工具串起来的核心:箱线图显示两性别的 Y 分布略有差异,但这种差异是否显著到足以拒绝原假设(两性别疾病进展无差异)?仅靠肉眼判断不够,需要借助统计检验。
作业采用Student t 检验(两独立样本、方差不齐假设),使用 SciPy 的ttest_ind:
from scipy.stats import ttest_ind tval, pval = ttest_ind(df.loc[df['SEX']==1,['Y']], df.loc[df['SEX']==2,['Y']], equal_var=False) print(f"T-value = {tval[0]:.2f}\nP-value: {pval[0]}")运行结果:
T-value = -0.90 P-value: 0.3674449793083975解读方法:p 值代表「在原假设成立的前提下,观察到当前或更极端结果的概率」。p 值越接近 0(通常以 0.05 为阈值),越有把握拒绝原假设、支持「两性别进展不同」的备择假设。
本例 p 值为 0.367,远大于 0.05,因此没有足够证据表明性别会影响糖尿病进展。参考答案的结论是:虽然任务 2 的箱线图与任务 3 的分布图显示了两组间的一定差异,但该差异很可能是抽样误差所致,尚不能构成统计显著证据。
评分标准(Rubric)
作业提供了明确的评分维度,可对照检查自己的完成度:
| 优秀(Exemplary) | 合格(Adequate) | 需改进(Needs Improvement) |
|---|---|---|
| 所有任务均完成,并配有图形化展示与解释 | 大部分任务完成,但缺少对图形和计算结果的解释或洞察 | 仅完成均值/方差计算与基础绘图等简单任务,未从数据中得出任何结论 |
由此可见,本作业的评分重点不只是「跑通代码」,而是对统计结果的解读能力——每张图、每个数值都要落到「这说明什么」的层面,这也是数据科学区别于单纯编程的核心所在。
延伸思考
掌握本作业的完整流程后,可以继续尝试以下方向的延伸练习(理论背景见第 4 课讲义):
- 为 Y 与其他变量分别计算置信区间,观察置信水平变化对区间宽度的影响;
- 对 AGE、BMI 等近似正态的变量做更细致的分布拟合,验证其是否符合正态假设;
- 参照讲义中棒球运动员数据的做法,将本数据集中的其他假设(如年龄与进展的关系)也用 t 检验验证一遍;
- 尝试将 S1~S6 六个血液指标与 Y 做多元相关分析,识别潜在的共线性问题,为后续回归建模做准备。
仓库中还提供了更多数据科学与可视化实战材料,例如 3-Data-Visualization 板块的相关系数可视化任务,可作为本作业的进阶延伸。
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考