Data Science for Beginners 实战:糖尿病数据小研究——均值、分布、相关性与假设检验全流程解析
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
这篇技术指南围绕 1-Introduction/04-stats-and-probability 课程配套作业「Small Diabetes Study(糖尿病数据小研究)」展开,完整讲解如何用 Python(pandas、matplotlib、SciPy)对一组真实的糖尿病患者数据进行描述性统计、可视化与推断统计:从计算均值/方差、绘制箱线图与直方图,到构建相关矩阵、执行双样本 t 检验。读完本文,你将掌握一套可直接复用的「数据→描述→可视化→相关性→假设检验」五步分析范式,并能在本仓库的 Jupyter Notebook 中逐任务复现全部结果。
任务背景:我们要研究什么
「Small Diabetes Study」是 Data Science for Beginners 项目第 04 课《统计与概率导论》的课后作业,目标是使用概率与统计的方法研究一组小规模的糖尿病患者数据集。该数据集由仓库本地文件 data/diabetes.tsv 提供,共 442 条患者记录、11 个字段,字段含义如下(依据 1-Introduction/04-stats-and-probability/solution/assignment.ipynb 中的说明):
| 字段 | 含义 |
|---|---|
| AGE | 年龄 |
| SEX | 性别编码(取值为 1 与 2 两类) |
| BMI | 身体质量指数(Body Mass Index) |
| BP | 平均血压 |
| S1 ~ S6 | 六项不同的血液检测指标 |
| Y | 一年内疾病进展的定量度量(目标变量) |
数据文件为制表符(\t)分隔的文本文件,前几行示例(对应作业文档给出的样例):
| AGE | SEX | BMI | BP | S1 | S2 | S3 | S4 | S5 | S6 | Y | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 59 | 2 | 32.1 | 101.0 | 157 | 93.2 | 38.0 | 4.0 | 4.8598 | 87 | 151 |
| 1 | 48 | 1 | 21.6 | 87.0 | 183 | 103.2 | 70.0 | 3.0 | 3.8918 | 69 | 75 |
| 2 | 72 | 2 | 30.5 | 93.0 | 156 | 93.6 | 41.0 | 4.0 | 4.6728 | 85 | 141 |
作业要求完成五个具体任务(详见 1-Introduction/04-stats-and-probability/assignment.md):
- 计算所有变量的均值与方差;
- 按性别(SEX)绘制 BMI、BP、Y 的箱线图;
- 分析 Age、Sex、BMI、Y 变量的分布形态;
- 检验各变量与疾病进展(Y)之间的相关性;
- 检验「男性与女性的糖尿病进展程度不同」这一假设。
下文将逐一拆解这五项任务,给出可运行的代码与可验证的结果解读。
环境准备与数据加载
作业要求在本仓库的 1-Introduction/04-stats-and-probability/assignment.ipynb 中完成(该 Notebook 已内置任务骨架与数据加载代码,各任务留有待填充的代码单元)。运行环境为 Python 3.8 + conda(Notebook 元数据中声明的 kernel 为 Python 3.8.8),需要 pandas、numpy、matplotlib 与 scipy.stats 等常用科学计算库。
第一步是读取数据。作业 Notebook 中给出的加载方式为:
import pandas as pd import numpy as np df = pd.read_csv("../../data/diabetes.tsv", sep='\t') df.head()其中../../data/diabetes.tsv是相对于 Notebook 所在目录(1-Introduction/04-stats-and-probability/)的路径,从仓库根目录看即 data/diabetes.tsv。sep='\t'指明文件使用制表符分隔;df.head()用于快速预览前 5 行,验证各列类型与数值是否正常。
提示:本作业中的
SEX列存储为数值型(1 与 2),进行分组、绘图、t 检验时可直接以该数值作为分组键,无需额外做标签映射。
任务一:计算所有变量的均值与方差
均值(mean)反映数据的集中趋势,方差(variance)反映数据的离散程度——这是第 04 课「Mean, Variance and Standard Deviation」一节的核心概念。作业要求对全部 11 个变量逐一计算。
最快捷的方式是直接调用 DataFrame 的聚合方法(参考 solution/assignment.ipynb):
df.mean() # 各列均值 df.var() # 各列方差更专业的做法是合并展示,便于一次性对照:
pd.DataFrame([df.mean(), df.var()], index=['Mean', 'Variance'])此外,df.describe()能一次性输出 count、mean、std、最小值、四分位数与最大值,相当于对「均值+离散程度+分布区间」做了全景速览:
df.describe()基于解决方案 Notebook 中的真实输出,关键变量的描述性统计如下(样本量均为 442):
| 变量 | 均值 | 标准差 | 最小值 | 25% 分位 | 中位数 | 75% 分位 | 最大值 |
|---|---|---|---|---|---|---|---|
| AGE | 48.52 | 13.11 | 19 | 38.25 | 50 | 59 | 79 |
| BMI | 26.38 | 4.42 | 18.0 | 23.20 | 25.70 | 29.28 | 42.2 |
| BP | 94.65 | 13.83 | 62 | 84 | 93 | 105 | 133 |
| Y | 152.13 | 77.09 | 25 | 87 | 140.5 | 211.5 | 346 |
各变量的方差(与上述df.var()对应,注意 pandas 默认采用样本方差、即分母为 n-1):
| 变量 | 方差 |
|---|---|
| AGE | 171.85 |
| SEX | 0.25 |
| BMI | 19.52 |
| BP | 191.30 |
| S1 | 1197.72 |
| S2 | 924.96 |
| S3 | 167.29 |
| S4 | 1.67 |
| S5 | 0.27 |
| S6 | 132.17 |
| Y | 5943.33 |
从数值可以直观读出两个信息:Y 的方差(5943)远大于其他变量,说明患者间疾病进展程度的个体差异非常大;而 S5、S4 这类量纲较小的血液指标方差很低,其波动尺度与其他指标不在一个量级——这提醒我们在做后续相关性分析时,不要直接比较协方差,而要使用归一化后的相关系数(见任务四)。
任务二:按性别绘制 BMI、BP、Y 的箱线图
箱线图(box plot)用中位数、上下四分位数与须线直观呈现数据分布,还能标出离群点(outlier)。本任务要求按性别分组,观察三个关键变量在两组间是否存在肉眼可见的差异。
pandas 的DataFrame.boxplot支持按分组列拆分绘制,代码非常简洁(参考解决方案):
for col in ['BMI', 'BP', 'Y']: df.boxplot(column=col, by='SEX') plt.show()对BMI、BP、Y三个列分别循环调用,by='SEX'会把每个变量按性别 1 / 性别 2 各画一个箱体,便于横向对比两组的中位数、四分位区间与离群点。
读图要点(结合第 04 课 README 中关于箱线图与四分位距的讲解):
- 箱体上下边界对应 Q1 与 Q3,箱体中的横线是中位数;
- 箱体上下的须线延伸到 1.5×IQR(IQR = Q3 − Q1)范围内的最远数据点,超出范围的点即为离群点;
- 比较两组箱体的位置与重叠程度,可以初步判断该变量是否与性别相关。
在实际观察中,BMI 与 BP 两组箱体大致重叠,而 Y 的箱体位置、形状存在一定差异——这为任务五的正式假设检验提供了可视化直觉:「看起来有差异」并不等于「统计上显著」,还需要用假设检验给出定量结论。
任务三:分析 Age、Sex、BMI、Y 的分布
本任务关注四个变量的分布形态,最直观的工具是直方图(histogram)。直方图把取值区间(bins)作为横轴、区间内的样本计数作为纵轴,用于判断分布是正态、均匀、偏态还是多峰(对应第 04 课「Probability Distribution」与「Normal Distribution」两节的内容)。
解决方案中通过循环对每个变量绘制直方图:
for col in ['AGE', 'SEX', 'BMI', 'Y']: df[col].hist() plt.show()结合直方图形状,解决方案给出的结论如下:
- AGE(年龄):呈近似正态分布,中间高、两端低,峰值集中在 40~60 岁区间,与
df.describe()中「均值 48.5 ≈ 中位数 50」的特征一致; - SEX(性别):只取 1 和 2 两个值,是典型的均匀/离散分布(两类的计数大致相当);
- BMI、Y:直方图形态介于两者之间,仅凭直方图较难断言其服从何种分布,需要更严格的正态性检验才能下结论。
这一步的训练价值在于:观察分布形态是后续所有统计推断的前提。比如任务五的 t 检验对分布形态有一定假设要求,先通过直方图建立对数据的感性认识,能帮助分析者判断统计方法是否适用。
任务四:检验各变量与疾病进展(Y)的相关性
相关性分析用于回答「哪些指标与疾病进展 Y 关系更紧密」。任务提示给出了关键建议:相关矩阵(correlation matrix)能提供关于变量依赖关系最有用的信息。
pandas 一行即可输出全部变量两两之间的 Pearson 相关系数矩阵:
df.corr()矩阵是对称的,对角线恒为 1(变量与自身的相关性),第 i 行第 j 列的值表示第 i 个变量与第 j 个变量的相关系数,取值范围在 [−1, 1]:1 为强正相关,−1 为强负相关,0 为无线性相关。
关键结论:各变量与 Y 的相关系数(取自解决方案输出):
| 变量 | 与 Y 的相关系数 |
|---|---|
| AGE | 0.188 |
| SEX | 0.043 |
| BMI | 0.586 |
| BP | 0.441 |
| S1 | 0.212 |
| S2 | 0.174 |
| S3 | −0.395 |
| S4 | 0.430 |
| S5 | 0.566 |
| S6 | 0.382 |
解决方案给出的解读是:与疾病进展 Y 相关性最强的是 BMI(0.586)和 S5(0.566,代表血糖相关的血液指标),这在医学意义上相当合理。此外 BP(0.441)、S4(0.430)也表现出中等强度的正相关,而 S3 与 Y 呈中等负相关(−0.395)。
相关矩阵还能揭示自变量之间的共线性:例如 S1 与 S2 的相关系数高达 0.897,S3 与 S4 为 −0.738——血液指标之间高度相关。这在后续构建预测模型时是需要警惕的多重共线性信号(本课程后续「真实世界数据」等章节会进一步探讨这类问题)。
为了让相关性更直观,解决方案还绘制了 Y 与 BMI、S5、BP 的散点图:
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()散点图中 Y 与 BMI、S5 呈现明显的正向带状趋势,与相关矩阵的数值相互印证。
需要强调的是(对应第 04 课「Covariance and Correlation」一节的提醒):相关不等于因果。两个变量强相关可能源于共同的外部因素,也可能纯属偶然;数学上的强相关只是「两者存在某种联系」的良好信号,不能据此断言 Y 由某变量引起。
任务五:假设检验——男女的糖尿病进展是否存在差异
最后一个任务是正式的推断统计:检验「糖尿病进展程度(Y)在男性和女性之间存在差异」这一假设。这与第 04 课 README 中「第一垒手比第二垒手更高」的例子是同一套路——先提出假设,再用统计检验给出量化证据。
当两组数据近似服从正态分布时,可以使用Student t 检验(两独立样本 t 检验)比较两组的均值。Python 中通过 SciPy 的ttest_ind实现,它同时返回 t 值和 p 值(p 值用于判断结果是否具有统计显著性):
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 # 使用 Welch t 检验,不假设两组方差相等 ) print(f"T-value = {tval[0]:.2f}\nP-value: {pval[0]}")该代码把数据按SEX拆成两组,比较两组的 Y 均值是否显著不同。参数equal_var=False表示采用 Welch 修正版 t 检验,对两组方差不等的情况更稳健。
解决方案的实际输出为:
T-value = -0.90 P-value: 0.3674449793083975结论解读:p 值为 0.367,远高于常用的显著性阈值 0.05。p 值接近 0(通常低于 0.05)才意味着对假设有较高置信度;当前结果说明没有强有力的证据表明性别会影响糖尿病的进展程度——尽管任务二的箱线图里两组 Y 似乎有些差异,但统计检验告诉我们,这个差异很可能只是抽样波动。
这与 README 中棒球运动员身高的例子形成鲜明对比:那里 t 检验的 p 值小到9.14e-12,从而有力支持「第一垒手更高」的假设。对比两个案例,正是理解 p 值含义的最佳练习。
评分标准与完成度自检
作业文档提供了三级评分量表(Rubric),是判断完成质量的标准:
| 优秀(Exemplary) | 合格(Adequate) | 需改进(Needs Improvement) |
|---|---|---|
| 所有要求任务均已完成,结果有图形化展示并配有解释 | 大部分任务完成,但缺少对图形或计算结果的解释与结论 | 仅完成均值/方差计算和简单绘图等基础任务,未从数据中得出任何结论 |
对照该量表自查三个要点:
- 完整性:五个任务是否全部完成(尤其是任务四的相关矩阵与任务五的 t 检验);
- 可视化:箱线图、直方图、散点图是否齐备;
- 解释力:是否对每个图形和数值结果写出了结论——这正是从「合格」跨入「优秀」的关键。
总结与进一步探索
通过这五项任务,我们完整走了一遍数据分析的经典流程:
- 描述:用
mean()/var()/describe()掌握每个变量的集中趋势与离散程度; - 可视化:用箱线图对比分组差异,用直方图观察分布形态;
- 相关分析:用
df.corr()建立相关矩阵,锁定与目标变量 Y 关系最强的 BMI 与 S5; - 假设检验:用
scipy.stats.ttest_ind完成两样本 t 检验,并依据 p 值给出「无显著证据表明性别影响进展」的结论。
想要动手实践,可以:
- 打开带任务骨架的 1-Introduction/04-stats-and-probability/assignment.ipynb 自行完成五个任务;
- 参考带完整输出与结论的 1-Introduction/04-stats-and-probability/solution/assignment.ipynb 对照检查;
- 系统学习本课全部统计概念(概率分布、均值/方差、四分位与箱线图、正态分布、置信区间、假设检验、协方差与相关),可阅读课程主文档 1-Introduction/04-stats-and-probability/README.md。
进阶挑战:把任务四中发现的强相关变量(BMI、S5、BP)作为候选特征,尝试建立简单的线性回归模型预测 Y,并观察删除共线变量(如 S1/S2)后模型稳定性的变化——这将为后续「真实世界数据」与机器学习章节打下基础。
【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考