ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

数据科学入门课程第 4 课:用 Python 掌握概率、统计推断与假设检验基础

数据科学入门课程第 4 课:用 Python 掌握概率、统计推断与假设检验基础 数据科学入门课程第 4 课用 Python 掌握概率、统计推断与假设检验基础【免费下载链接】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 课《统计与概率入门》配套孟加拉语翻译位于 translations/bn/1-Introduction/04-stats-and-probability/README.md英文原版位于 1-Introduction/04-stats-and-probability/README.md以棒球运动员的真实数据为案例带你从随机变量出发一路走到用 SciPy 完成 t 检验与相关性分析最终有能力独立完成小型糖尿病研究实战作业。概率与随机变量一切推断的起点概率Probability是介于 0 到 1 之间的数字用来表示某个**事件event**发生的可能性大小。它的定义是导致该事件的有利结果数除以总结果数前提是所有结果等可能发生。例如掷一枚骰子得到偶数的概率是 3/6 0.5。讨论事件时我们会使用随机变量random variable。例如掷骰子得到的点数这个随机变量取值从 1 到 6这组取值构成的集合称为样本空间sample space。我们可以谈论随机变量取某个具体值的概率比如 P(X3)1/6。随机变量分为两类离散随机变量样本空间可数即存在可枚举的独立取值。掷骰子结果就是典型例子。连续随机变量样本空间是一段实数区间甚至整个实数集 ℝ。公交车到达时间就是很好的例子——对任何一个精确的时刻 t公交车恰好在该时刻到达的概率都是 0现在你知道了概率为 0 的事件不但存在而且经常发生——至少每次公交车到站时都发生了一次概率分布描述随机变量取值的规律对于离散随机变量可以用函数 P(X) 描述每个事件的概率对样本空间S中的每个值s它给出一个 0 到 1 之间的数且所有 P(Xs) 之和为 1。最著名的离散分布是均匀分布uniform distribution样本空间含 N 个元素每个元素概率相等均为 1/N。连续变量的概率分布更难描述。我们只能谈论变量落入某个取值区间的概率例如 P(t₁≤Xt₂)。此时概率分布由概率密度函数probability density functionp(x) 描述均匀分布的连续版本称为连续均匀分布定义在有限区间上X 落入长度为 l 的区间的概率与 l 成正比最高可达 1。另一个极为重要的分布是正态分布normal distribution下文将详细展开。均值、方差与标准差刻画数据中心与离散程度假设我们从随机变量 X 中抽取 n 个样本x₁, x₂, ..., xₙ。序列的均值mean又称算术平均传统上定义为 (x₁x₂...xₙ)/n。当样本量趋于无穷n→∞时我们得到分布的均值也称期望expectation记为E(x)。可以证明对于任意离散分布若取值为 {x₁, x₂, ..., xₙ}、对应概率为 p₁, p₂, ..., pₙ则期望 E(X) x₁p₁ x₂p₂ ... xₙpₙ。为刻画数值的离散程度可以计算方差varianceσ² ∑(xᵢ - μ)²/n其中 μ 是序列均值。σ 称为标准差standard deviationσ² 称为方差。在配套的 教学 Notebook 中这些概念被直接落地为代码先用random.randint生成 30 个均匀随机样本再用np.mean与np.var计算均值和方差随后加载真实棒球数据SOCR_MLB.tsv对身高列计算均值、方差与标准差import numpy as np import pandas as pd df pd.read_csv(data/SOCR_MLB.tsv, sep\t, headerNone, names[Name,Team,Role,Weight,Height,Age]) mean df[Height].mean() var df[Height].var() std df[Height].std() print(fMean {mean}\nVariance {var}\nStandard Deviation {std})注意这里的数据文件位于仓库根目录下的 data/SOCR_MLB.tsv字段依次为球员姓名、球队、场上角色、体重英寸、身高磅与年龄与names参数一一对应。众数、中位数与四分位数抗离群值的典型值有时均值并不能很好地代表数据的典型水平。比如存在少数完全超出范围的极端值时它们会拉偏均值。更好的指标是中位数median一半数据点低于它另一半高于它。为了理解数据分布引入四分位数quartile第一四分位数 Q125% 的数据低于它第三四分位数 Q375% 的数据低于它。中位数与四分位数之间的关系可以用**箱线图box plot**直观呈现箱线图还定义了两个衍生量四分位距inter-quartile rangeIQR Q3 - Q1以及所谓的离群值outliers——落在边界 [Q1-1.5×IQR, Q31.5×IQR] 之外的值。当有限分布的可能取值很少时出现频率最高的值称为众数mode常用于颜色等类别型数据。设想两组人——一组强烈偏爱红色另一组偏爱蓝色。若把颜色编码为数字偏好颜色的均值会落在橙绿光谱的某个中间位置完全无法反映任何一组的真实偏好而众数则要么是红色要么是蓝色——如果两方人数相同众数会同时是两个颜色此时称样本为多模态multimodal。Notebook 中同样给出了实操代码用plt.boxplot绘制身高的水平箱线图showmeansTrue会同时标出均值再用df.boxplot(columnHeight, byRole)按场上角色分组绘制直观对比不同位置球员的身高分布。真实世界数据把棒球运动员当作随机样本分析真实数据时它们严格来说并不是随机变量——我们并没有做结果未知的实验。以棒球队球员的身体数据身高、体重、年龄为例这些数字并非完全随机但我们仍可套用同样的数学工具把一组人的体重视为从某个随机变量中抽取的样本序列。下面这组数据来自美国职棒大联盟MLB取自 SOCR 的 MLB 身高体重数据集为方便展示仅列出前 20 个值[180.0, 215.0, 210.0, 210.0, 188.0, 176.0, 209.0, 200.0, 231.0, 180.0, 188.0, 180.0, 185.0, 160.0, 180.0, 185.0, 197.0, 189.0, 185.0, 219.0]注意处理该数据集的完整示例见 配套 Notebook课程中还有若干挑战你可以在其中补充代码完成。若还不熟悉在 Jupyter Notebook 中运行代码可以稍后随课程第 7 课07-python系统学习。这份数据的均值、中位数与四分位数可以用箱线图呈现由于数据包含不同球员**角色role**信息我们还可以按角色绘制箱线图——这能直观看出参数取值如何随角色变化。这次我们考察身高这幅图提示平均而言一垒手的身高高出二垒手。本课稍后我们将学习如何用更正式的方式检验这一假设并证明数据在统计上显著。处理真实数据时我们假定所有数据点都是从某个概率分布中抽取的样本。这一假设使我们能够应用机器学习技术、构建可用的预测模型。为观察数据分布可以绘制直方图histogramX 轴是若干体重区间称为箱/bins纵轴表示随机变量样本落入该区间的次数从直方图可以看出所有值都围绕某个平均体重居中分布离均值越远出现该体重的人越少。也就是说棒球球员的体重极不可能与平均体重相差悬殊方差的大小则表明体重偏离均值的可能程度。如果取棒球联盟之外人群的体重分布很可能不同——但形状保持不变只是均值和方差会改变。因此若用棒球球员训练模型再套用到大学生身上结果很可能是错的因为底层分布不同。正态分布用 NumPy 生成符合现实的样本上面体重数据的分布非常典型现实中大量测量值遵循同类型分布只是均值与方差不同这就是正态分布——统计学中举足轻重的角色。利用正态分布我们可以正确生成潜在棒球球员的随机体重只要知道平均体重mean和标准差std就能这样生成 1000 个体重样本samples np.random.normal(mean, std, 1000)绘制生成样本的直方图会得到与上图几乎相同的形态若继续增大样本数与箱数得到的直方图将越来越接近理想的正态分布钟形曲线均值为 0、标准差为 1 的正态分布Notebook 还演示了一个经典反例真实世界大部分数据服从正态分布因此不应使用均匀随机数生成器生成样本数据——np.random.rand生成的均匀分布样本如np.random.rand(1000)*2*stdmean-std画出的直方图形态与真实体重分布明显不符。置信区间用样本估计总体均值讨论棒球球员体重时我们假定存在某个随机变量 W对应全体棒球球员体重的理想概率分布即总体/population我们手上的体重序列是全体球员的一个子集称为样本sample。一个有意思的问题是能否知道 W 的分布参数——即总体的均值与方差最直接的回答是计算样本的均值和方差。但随机样本未必能准确代表完整总体因此引入**置信区间confidence interval**的概念。置信区间是依据样本对总体真实均值做出的估计它以某个概率即置信水平/level of confidence成立。假设从分布中抽取样本 X₁, ..., Xₙ。每次抽样得到的均值 μ 都不同因此 μ 本身可视为随机变量。置信水平为 p 的置信区间是一对值 (Lₚ, Rₚ)满足P(Lₚ ≤ μ ≤ Rₚ) p即测得的均值落入该区间的概率等于 p。置信区间如何计算超出了本入门课的范围简言之我们定义样本均值相对于总体真实均值的分布称为学生分布Student distribution。有趣的事实学生分布以数学家威廉·西利·戈塞特William Sealy Gosset命名他以笔名Student发表论文。他在吉尼斯啤酒厂工作据其中一种说法他的雇主不希望公众知道他们在用统计检验判断原材料质量。若要以置信度 p 估计总体均值 μ需要取学生分布的(1-p)/2 分位数A——可以从统计表中查或用统计软件Python、R 等内置函数计算。则 μ 的区间为 X ± A·D/√n其中 X 是样本均值D 是标准差。注这里略过了与**自由度degrees of freedom**相关的重要概念更深入的理解可参考完整统计学教材。配套 Notebook 中封装了一个计算均值置信区间的函数内部使用scipy.stats.sem计算标准误、用scipy.stats.t.ppf查学生分布分位数import scipy.stats def mean_confidence_interval(data, confidence0.95): a 1.0 * np.array(data) n len(a) m, se np.mean(a), scipy.stats.sem(a) h se * scipy.stats.t.ppf((1 confidence) / 2., n - 1) return m, h for p in [0.85, 0.9, 0.95]: m, h mean_confidence_interval(df[Weight].ffill(), p) print(fp{p:.2f}, mean {m:.2f} ± {h:.2f})对棒球球员体重计算置信区间的结果如下p体重均值0.85201.73±0.940.90201.73±1.080.95201.73±1.28注意到置信概率越高置信区间越宽。假设检验用 t 检验证明一垒手比二垒手高棒球球员数据集中包含不同场上角色汇总如下表如何计算这张表见 配套 Notebook角色身高体重人数Catcher72.723684204.32894776Designated_Hitter74.222222220.88888918First_Baseman74.000000213.10909155Outfielder73.010309199.113402194Relief_Pitcher74.374603203.517460315Second_Baseman71.362069184.34482858Shortstop71.903846182.92307752Starting_Pitcher74.719457205.163636221Third_Baseman73.044444200.95555645可以看到一垒手的平均身高高于二垒手于是我们可能忍不住得出结论一垒手比二垒手高。这句话之所以叫假设hypothesis是因为我们并不知道它是否真的成立。然而下这个结论并不总是显而易见的每个均值都关联一个置信区间二者差异可能只是统计误差因此需要更正式的方法来检验假设。先分别计算一垒手与二垒手身高的置信区间置信水平一垒手二垒手0.8573.62..74.3871.04..71.690.9073.56..74.4470.99..71.730.9573.47..74.5370.92..71.81可以看到任何置信水平下两个区间都不重叠这证明了一垒手高于二垒手的假设。更形式化地看我们实际要解决的是两个概率分布是否相同或至少参数相同的问题。分布不同需要选用不同检验若已知分布为正态可以应用学生 t 检验Student t-test。在学生 t 检验中我们计算所谓的t 值t-value它在考虑方差的前提下反映均值之间的差异。可以证明 t 值服从学生分布这使我们能为给定置信水平 p 获取阈值可计算或查数值表再比较 t 值与阈值来接受或拒绝假设。在 Python 中可以用SciPy包——它提供ttest_ind函数此外还有大量实用统计函数自动计算 t 值并反向查表得到置信度对应的 p 值直接看 p 值即可下结论。例如比较一垒手与指定打者的身高from scipy.stats import ttest_ind tval, pval ttest_ind(df.loc[df[Role]First_Baseman,[Height]], df.loc[df[Role]Designated_Hitter,[Height]], equal_varFalse) print(fT-value {tval[0]:.2f}\nP-value: {pval[0]})T-value 7.65 P-value: 9.137321189738925e-12在本例中 p 值极低意味着一垒手更高的证据非常强。ttest_ind返回的两个值中p 值可视为两个分布均值相同的概率t 值是归一化均值差的中间量需要与给定置信水平的阈值比较。除均值比较外假设检验还能回答更多问题例如证明某个样本服从某种分布本例中我们假设身高正态分布但这需要正式统计检验证明样本均值等于某个预设值比较多组样本的均值例如不同年龄段的幸福水平差异。大数定律与中心极限定理正态分布如此重要的原因之一是中心极限定理central limit theorem假设我们有 N 个独立值 X₁, ..., Xₙ 的大样本取自均值 μ、方差 σ² 的任意分布。那么当 N 足够大即 N→∞时ΣᵢXᵢ 的均值将服从正态分布均值 μ、方差 σ²/N。中心极限定理的另一种解读是无论分布如何当你计算任意随机变量值之和的均值时最终都会得到正态分布。由中心极限定理还可推出当 N→∞ 时样本均值等于 μ 的概率趋近于 1这就是大数定律law of large numbers。Notebook 用一段巧妙代码印证了这一定理Python 的伪随机生成器只给出均匀分布若想构造正态分布生成器可直接利用中心极限定理——对均匀样本取均值即可得到近似正态的随机值def normal_random(sample_size100): sample [random.uniform(0, 1) for _ in range(sample_size)] return sum(sample) / sample_size sample [normal_random() for _ in range(100)] plt.hist(sample) plt.show()协方差与相关性寻找变量间的关系数据科学的一项重要工作是在数据中寻找关系。当两个序列在相同时刻表现出相似行为——同时上升/下降或一个上升而另一个下降——我们就说它们相关correlate即两个序列之间似乎存在某种联系。相关性并不必然意味着两个序列之间存在因果关系有时两个变量都取决于某个外部原因有时两个序列相关纯属巧合。但强的数学相关性仍是两个变量存在某种关联的良好信号。从数学上看刻画两个随机变量关系的主要概念是协方差covarianceCov(X,Y) E[(X-E(X))(Y-E(Y))]。我们计算两个变量相对于各自均值的偏差再求这些偏差的乘积若两个变量同步偏离乘积恒为正累加得到正协方差若两者偏离不同步一个低于均值时另一个高于均值乘积恒为负累加得到负协方差若偏差相互独立则大致累加为零。协方差的绝对值并不能说明相关性强弱因为它取决于实际数值的量级。为将其归一化可以把协方差除以两个变量的标准差得到相关性correlation。它的优点是始终落在 [-1, 1]1 表示强正相关-1 表示强负相关0 表示完全无关变量独立。示例用上面的数据集计算棒球球员体重与身高之间的相关性print(np.corrcoef(weights, heights))结果得到一个相关矩阵correlation matrixarray([[1. , 0.52959196], [0.52959196, 1. ]])相关矩阵 C 可对任意数量的输入序列 S₁, ..., Sₙ 计算Cᵢⱼ 是 Sᵢ 与 Sⱼ 的相关性对角线元素恒为 1即 Sᵢ 的自相关。本例中 0.53 表明人的体重与身高之间存在一定相关性。还可以绘制散点图直观查看Notebook 还通过一个邪恶棒球公司的玩具示例深化理解该公司按身高发薪——底薪 1000 美元再按身高加 0~100 美元。线性公式下np.corrcoef接近 1把公式换成np.sin引入非线性后相关性略降但依然较高再叠加 ±10 的随机噪声后相关性进一步下降。最后演示了真实的体重-身高相关性由于序列中存在nan缺失值直接计算会得到nan必须先调用ffill()/fillna补齐数据——这直观说明了数据准备与清洗的重要性。关于数据清洗与准备的完整方法论可进一步学习课程第 8 课08-data-preparation。实战挑战验证更多假设利用 Notebook 中的示例代码尝试检验以下假设一垒手比二垒手年龄更大一垒手比三垒手更高游击手比二垒手更高。检验思路与课程完全一致先按角色分组查看各列的均值再分别计算两组的置信区间看是否重叠最后用scipy.stats.ttest_ind计算 t 值与 p 值作出统计推断。课程作业小型糖尿病研究本课作业assignment.md孟加拉语版见 translations/bn/1-Introduction/04-stats-and-probability/assignment.md要求你独立完成一次完整的数据统计实践使用 data/diabetes.tsv 中的糖尿病病人小数据集取自 NCSU 公开数据集并在 assignment.ipynb 中完成任务。数据列说明AGE年龄SEX性别BMI身体质量指数BP平均血压S1~S6六项血液生化指标Y一年内疾病进展的定量度量目标变量。具体任务清单计算所有变量的均值与方差按性别分组为 BMI、BP 和 Y 绘制箱线图分析 AGE、SEX、BMI 和 Y 的分布形态检验各变量与疾病进展 Y 之间的相关性提示相关矩阵能给出最有用的依赖关系信息检验糖尿病进展程度在男性和女性之间存在差异这一假设。Notebook 骨架已给出数据加载代码pd.read_csv(data/diabetes.tsv, sep\t)与各任务标题占位评分标准Rubric要求所有任务完成、绘图并给出结论性解释全部完成且图文并茂为优秀仅完成均值/方差与基础绘图而未得出结论则评为需改进。小结本课为你建立了统计与概率的完整入门框架内容包括数据的基本统计量均值、方差、众数与四分位数随机变量的各类分布尤其是正态分布如何发现不同属性之间的相关性如何用严谨的数学与统计工具证明假设如何基于数据样本计算随机变量的置信区间。虽然这远非概率与统计的全部主题但足以支撑你在这门课程后续数据可视化、数据生命周期、机器学习中顺利前行。若想深入理论可继续阅读 NYU Carlos Fernandez-Granda 的《Probability and Statistics for Data Science》讲义、Peter 与 Andrew Bruce 的《Practical Statistics for Data Scientists》、James D. Miller 的《Statistics for Data Science》等经典资料本课还提供了课前/课后测验与配套 Notebook 用于自测。【免费下载链接】Data-Science-For-Beginners10 Weeks, 20 Lessons, Data Science for All!项目地址: https://gitcode.com/GitHub_Trending/da/Data-Science-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表