统计推断基础
本课程将介绍统计推断和点估计,以及中心极限定理。
在上一章中,我们学习了如何使用不同的图表探索数据,并从数据中提取信息。我们发现了数据集中不同变量之间的关系,但如何判断这些关系是真实存在的,还是仅仅巧合?我们又该如何判断是否可以对整个数据集进行推广?这正是推断统计学发挥作用的地方。
推断统计学
在了解推断统计学之前,我们需要先理解“总体”和“样本”的概念。
一个总体是指我们正在研究的数据集中包含的所有元素。例如,如果我们想研究学校中学生成绩受饮酒影响的情况,那么该校所有学生就构成了一个总体。总体的一个可测量特征(如均值或标准差)被称为参数。
一个样本是总体的一个子集。
在我们的学校例子中,如果随机选取一个年级并对该年级的学生进行分析,那么被选中的学生就构成一个样本。样本的一个可测量特征被称为统计量。
推断统计学是统计学的一个分支,它帮助我们从样本推断出关于整体总体的结论。其目标是基于所收集的样本数据,对数据来源的总体获得深入的理解。推断统计学主要包括两个方面:
- 估计:通过样本的统计量来推断总体的参数。
- 假设检验:利用样本数据回答关于总体的研究问题。
点估计
点估计是基于样本数据对总体参数的估计。假设我们想测量美国所有数据科学家的平均薪资,但收集所有数据科学家的数据会非常繁琐。因此,我们可以随机选取100名数据科学家的薪资数据,计算这个样本的平均值。这个样本的平均值被称为样本均值。
样本均值通常不等于总体均值。两者之间的差异可能源于抽样过程中的随机性,或抽样偏差。让我们使用信用卡客户违约数据集进一步探究这一点。我们将重点关注数据集中的 AGE 列。
1import pandas as pd 2df = pd.read_csv('credit_card_cleaned.csv') 3 4# 总体均值 5pop_mean = df['AGE'].mean() 6 7# 抽取样本并计算均值 8sample = df['AGE'].sample(n = 200, random_state = 7) 9sample_mean = sample.mean() 10 11diff = pop_mean - sample_mean 12 13print('总体均值 : ', pop_mean) 14print('样本均值 : ', sample_mean) 15print('差异 : ', diff)
在这个例子中,我们将整个数据集视为总体,因为我们只关注信用卡客户。第5行使用 mean 函数计算总体均值,并存储在 pop_mean 中。第8行从 AGE 列中抽取样本,使用 sample 函数并指定 n=200 表示抽取200个样本,同时设置 random_state=7 以确保每次运行代码时得到相同的随机样本。第9行使用 mean 函数计算样本均值。第11行通过相减计算两个均值之间的差异。最后在第13至15行打印三个数值。
结果显示差异约为0.59年。这意味着我们对总体参数的估计相当准确。
抽样分布
你可能听说过正态分布。在正态分布中,数据呈对称分布,集中在均值附近几个标准差范围内。然而,我们实际收集的真实世界数据通常并不服从正态分布。因此,当我们从这类数据中抽取样本时,样本的分布往往与总体分布相似。
让我们用前面从 AGE 列中抽取的样本验证这一点。我们将绘制两张密度图,一张是总体,一张是样本,放在同一张图中进行比较。
1import pandas as pd 2import matplotlib.pyplot as plt 3df = pd.read_csv('credit_card_cleaned.csv') 4 5fig, subplots = plt.subplots(2, 1, figsize=(12, 12)) 6 7# 绘制总体密度图 8df['AGE'].plot(kind='density', ax=subplots[0], title='总体') 9pop_skew = df['AGE'].skew() 10 11# 抽取样本并绘制 12sample = df['AGE'].sample(n=200, random_state=7) 13sample.plot(kind='density', ax=subplots[1], title='样本') 14sample_skew = sample.skew() 15 16plt.show() 17print('总体偏度 : ', pop_skew) 18print('样本偏度 : ', sample_skew)
由于要在同一张图中绘制两个密度图,我们在第5行使用 plt.subplots 初始化子图,指定布局为 2,1,即两行一列。我们获取子图的轴对象并保存在 subplots 中。第8行绘制 AGE 的密度图,并通过 ax=subplots[0] 指定将其显示在上方子图中。接下来计算 AGE 列的偏度。
第12行从 AGE 列中抽取样本,第13行绘制该样本的密度图,并通过 ax=subplots[1] 指定显示在下方子图中。第14行计算样本的偏度。最后在第17至18行打印总体和样本的偏度值。
从图中可以看出,样本分布与总体分布几乎完全一致,两者均向右偏斜。我们也可以通过对比两者的偏度系数来验证这一点。
中心极限定理
上述结果表明,我们不能直接将适用于正态分布的技术应用于从非正态总体中抽取的样本。这时,中心极限定理便发挥了作用。中心极限定理是概率论和统计学中极为重要的定理。它指出:样本均值的分布(即抽样分布)将趋于正态分布。这意味着我们可以像对待正态分布一样,使用相关统计方法处理抽样分布。我们可以将样本均值视为来自正态分布的数据。下面我们通过一个例子来说明该定理。
1import pandas as pd 2import matplotlib.pyplot as plt 3df = pd.read_csv('credit_card_cleaned.csv') 4 5# 重复抽样500次并记录每次的均值 6sample_means = [] 7for i in range(500): 8 sample = df['AGE'].sample(n=200) 9 s_mean = sample.mean() 10 sample_means.append(s_mean) 11 12# 绘制样本均值的分布 13sample_means_series = pd.Series(sample_means) 14sample_means_series.plot(kind='density') 15 16# 比较总体均值与样本均值的均值 17mean_of_sample_means = sample_means_series.mean() 18pop_mean = df['AGE'].mean() 19diff = pop_mean - mean_of_sample_means 20print('样本均值的均值 :', mean_of_sample_means) 21print('总体均值 :', pop_mean) 22print('差异 : ', diff) 23print('样本均值的偏度 : ', sample_means_series.skew())
第6至10行的目标是重复从 AGE 列中抽取样本500次,并将每次的均值存储在一个列表中。首先在第6行初始化一个空列表 sample_means。然后在第7行使用 for 循环,循环500次。在循环内部:
- 第8行从
AGE列中抽取200个样本。 - 第9行使用
mean函数计算该样本的均值,记为s_mean。 - 第10行使用列表的
append方法将s_mean添加到sample_means列表中。
由于循环执行500次,最终我们将在 sample_means 列表中得到500个样本均值。
接下来,我们希望绘制这些样本均值的分布。为此,第13行使用 pd.Series 将列表转换为Pandas的Series对象,命名为 sample_means_series。然后在下一行绘制其密度图。从图中可以看出,该分布大致符合正态分布,这与中心极限定理的预测一致。
另一个由中心极限定理带来的关键发现是:样本均值的均值非常接近真实的总体均值。为了验证这一点,我们在第17至19行分别计算总体均值和样本均值的均值,并求其差异。从第22行的输出可见,差异非常小;如果增加抽样次数(如从500次增加),这一差异还会进一步缩小。此外,第23行的输出显示,样本均值的偏度几乎为0。
这就是我们如何利用样本数据来估计总体参数的方法。在下一课中,我们将继续讨论,重点介绍置信区间。