箱形图(Box Plot),又称盒须图,是一种强大的数据可视化工具,它能以简洁的形式展示数据的分布特征、中心趋势、离散程度以及异常值。在统计分析中,尤其是在探索性数据分析(EDA)阶段,箱形图是理解数据结构、发现潜在问题(如异常值)和比较不同组别差异的首选方法之一。Stata作为一款功能强大的统计软件,提供了便捷的命令来生成和解读箱形图。本指南将深入探讨如何在Stata中创建箱形图,并详细解读其各个组成部分,从而帮助您从数据分布中提取有价值的信息,并有效识别异常值。
1. 理解箱形图的基本构成
在深入Stata操作之前,我们首先需要理解箱形图的数学和视觉含义。一个标准的箱形图由以下几个关键部分组成:
- 箱体(Box):箱体的下边界是第一四分位数(Q1),上边界是第三四分位数(Q3)。箱体的中间有一条线,代表中位数(Q2或Median)。箱体的高度(Q3 - Q1)称为四分位距(IQR),它衡量了中间50%数据的离散程度。
- 须(Whiskers):从箱体延伸出的两条线。通常,须的末端被定义为:
- 下须:从Q1向下延伸,末端是下限,即
Q1 - 1.5 * IQR。 - 上须:从Q3向上延伸,末端是上限,即
Q3 + 1.5 * IQR。 - 须的末端代表了数据的正常范围。落在须之外的数据点通常被视为潜在的异常值。
- 下须:从Q1向下延伸,末端是下限,即
- 异常值(Outliers):任何落在须之外的数据点。在Stata的默认箱形图中,异常值通常用单独的点(如圆点或星号)表示。有时,异常值还会被进一步分类为温和异常值(在1.5倍IQR到3倍IQR之间)和极端异常值(超过3倍IQR),但Stata默认将所有须外的点都视为异常值。
重要提示:1.5倍IQR是一个经验法则,由统计学家John Tukey提出。它并非绝对标准,但在大多数情况下能有效识别出与数据主体分布显著不同的点。
2. 在Stata中创建箱形图
Stata提供了多种创建箱形图的命令,最常用的是 graph box 和 twoway box。我们将通过一个具体的例子来演示。
2.1 准备数据
我们使用Stata自带的 auto.dta 数据集,该数据集包含1978年74款汽车的详细信息。我们将分析汽车价格(price)的分布。
sysuse auto, clear
2.2 基本箱形图:graph box
graph box 是创建箱形图最直接的命令。
命令语法:
graph box varlist [if] [in] [weight] [, options]
示例:绘制汽车价格的箱形图。
graph box price
输出解读:
- 箱体:显示了价格的Q1、中位数和Q3。
- 须:从箱体延伸出的线,末端是
Q1 - 1.5*IQR和Q3 + 1.5*IQR。 - 异常值:在须之外的点。对于
price,你会看到几个点位于上须之上,这些就是价格较高的汽车,可能被视为异常值。
2.3 分组箱形图:graph box 与 over() 选项
箱形图的强大之处在于比较不同组别的分布。我们可以使用 over() 选项按类别变量(如 foreign,国产车 vs 进口车)分组绘制箱形图。
示例:比较国产车和进口车的价格分布。
graph box price, over(foreign, label(1 "国产车" 2 "进口车")) title("国产车与进口车价格分布比较")
输出解读:
- 你会得到两个并排的箱形图,分别代表国产车和进口车。
- 通过比较两个箱体的位置、高度(IQR)和须的长度,可以直观判断:
- 中心趋势:哪个组的中位数更高?(进口车中位数明显更高)
- 离散程度:哪个组的价格波动更大?(进口车的箱体更长,IQR更大)
- 异常值:哪个组有更多或更极端的异常值?(进口车可能有更多高价异常值)
2.4 使用 twoway box 创建更灵活的箱形图
twoway 是Stata的图形框架,允许叠加多种图形类型。twoway box 提供了更多自定义选项。
命令语法:
twoway (box varlist, options) [, global_options]
示例:创建一个更美观的分组箱形图,并添加标签。
twoway (box price if foreign==0, label(国产车)) (box price if foreign==1, label(进口车)), ///
title("汽车价格分布对比") ytitle("价格") legend(order(1 2))
输出解读:
- 与
graph box类似,但twoway语法更灵活,便于与其他图形(如散点图、线图)叠加。 label()选项可以为每个箱形图指定图例标签。
3. 深入解读箱形图:从分布到异常值
生成箱形图后,如何解读其传递的信息是关键。我们以 auto 数据集中的 price 变量为例,结合统计命令进行详细分析。
3.1 计算关键统计量
在查看图形之前,我们可以先用 summarize 命令获取数值摘要,以便与图形对应。
summarize price, detail
输出示例:
Price
Percentiles Smallest
1% 3291 3291
5% 3748 3291
10% 3995 3291 Obs 74
25% 4195 3291 Sum of Wgt. 74
50% 5000.5 Mean 6165.257
Largest Std. Dev. 2949.496
75% 6342 15906
90% 8359 13466 Variance 8699527
95% 10372 14500 Skewness 1.653434
99% 15906 15906 Kurtosis 4.819096
结合图形解读:
- 箱体位置:箱体的中间线(中位数)约在5000.5,与
summarize输出的50%分位数一致。箱体的下边界(Q1)约在4195,上边界(Q3)约在6342。 - 离散程度:箱体高度(IQR) = Q3 - Q1 = 6342 - 4195 = 2147。这表示中间50%的汽车价格分布在约2147美元的范围内。
- 数据偏态:如果中位数线在箱体中偏下,说明数据右偏(长尾在右侧);如果偏上,则左偏。对于
price,中位数(5000.5)略低于箱体中心((4195+6342)/2 ≈ 5268.5),表明价格分布略微右偏,这与summarize中的Skewness为正(1.65)一致。
3.2 识别与分析异常值
异常值是箱形图的核心价值之一。在 graph box price 的输出中,你会看到上须末端大约在 Q3 + 1.5*IQR = 6342 + 1.5*2147 ≈ 6342 + 3220.5 = 9562.5。因此,价格高于约9562.5的汽车被标记为异常值。
如何进一步分析这些异常值?
定位异常值:使用
list命令找出这些汽车。list make price if price > 9562.5输出示例: “`
make price- Buick Riviera 10372
- Cad. Eldorado 13466
- Cad. Seville 14500
- Chev. Corvette 15906
”` 这些都是豪华或高性能车型,价格远高于普通汽车,因此被视为异常值是合理的。
判断异常值的性质:
- 数据录入错误? 检查这些记录是否有误。例如,
15906是否应为1590.6?在auto数据集中,这些价格是真实的。 - 特殊群体? 这些异常值代表了一个不同的子群体(豪华车)。在分析整体汽车价格时,它们可能扭曲均值(
mean为6165,而中位数为5000,均值被拉高)。此时,中位数是比均值更稳健的中心趋势度量。 - 是否需要处理? 这取决于分析目标。如果目标是研究普通汽车市场,可能需要剔除这些异常值;如果目标是研究整个汽车市场(包括豪华车),则应保留并考虑其影响。
- 数据录入错误? 检查这些记录是否有误。例如,
3.3 比较不同组别的分布
通过分组箱形图,我们可以进行更深入的比较。以国产车(foreign==0)和进口车(foreign==1)为例。
计算分组统计量:
bysort foreign: summarize price, detail
结合分组箱形图解读:
- 国产车:中位数较低,箱体较短(IQR较小),说明价格相对集中且较低。异常值较少,且多为高价车。
- 进口车:中位数显著更高,箱体更长(IQR更大),说明价格分布更分散,波动更大。异常值更多,且价格更高。
- 结论:进口车不仅价格更高,而且价格差异也更大。这可能与品牌、车型多样性有关。
4. 高级技巧与自定义
Stata的图形系统非常强大,允许高度自定义箱形图以满足出版或报告需求。
4.1 自定义箱形图的外观
使用 graph box 或 twoway box 的选项可以改变颜色、标记、标签等。
示例:为国产车和进口车箱形图设置不同颜色,并添加均值标记。
graph box price, over(foreign) ///
box(1, color(blue)) box(2, color(red)) /// 为不同组设置颜色
marker(1, mlabel(make)) /// 为国产车添加标签(慎用,可能很乱)
title("汽车价格分布(按产地)") ///
ytitle("价格") ///
legend(order(1 "国产车" 2 "进口车"))
注意:marker() 选项会为每个数据点添加标签,在数据点多时会非常混乱,通常只用于演示或数据点很少的情况。
4.2 与其它图形叠加
使用 twoway 框架,可以将箱形图与散点图叠加,以显示原始数据点。
示例:在箱形图上叠加原始数据点(散点图)。
twoway (box price if foreign==0, label(国产车)) (box price if foreign==1, label(进口车)) ///
(scatter price foreign if foreign==0, jitter(2) mcolor(blue%50)) /// 添加抖动散点
(scatter price foreign if foreign==1, jitter(2) mcolor(red%50)), ///
title("汽车价格分布与原始数据点") ytitle("价格") xtitle("产地") ///
legend(order(1 2))
输出解读:
- 箱形图展示了分布的摘要。
- 散点图(带抖动
jitter)展示了原始数据点的密度和位置。 - 这种组合图形提供了更丰富的信息:既能看到整体分布,又能看到数据点的具体分布情况,有助于判断异常值是否合理。
4.3 处理非对称分布的数据
对于严重右偏的数据(如收入、房价),标准的箱形图可能无法充分展示尾部信息。Stata提供了 rbox 命令(需安装)来创建旋转箱形图,它能更好地展示偏态分布。
安装 rbox:
ssc install rbox
使用 rbox:
rbox price, over(foreign) title("旋转箱形图:汽车价格")
输出解读:
- 旋转箱形图将数据分布“旋转”了90度,使得长尾方向更明显。
- 对于
price这种右偏数据,旋转箱形图能更清晰地展示高价异常值的分布情况。
5. 实际应用案例:分析学生成绩
假设我们有一个学生成绩数据集 grades.dta,包含学生ID、性别(gender,1=男,2=女)和数学成绩(math_score)。
步骤1:创建基本箱形图
use grades.dta, clear
graph box math_score
解读:查看整体成绩分布,识别低分或高分异常值。
步骤2:按性别分组比较
graph box math_score, over(gender, label(1 "男生" 2 "女生")) title("男女生成绩分布")
解读:
- 比较中位数:哪个性别的平均成绩更高?
- 比较IQR:哪个性别的成绩波动更大?
- 检查异常值:哪个性别有更多低分或高分异常值?
步骤3:识别并分析异常值
假设我们发现一些低分异常值(成绩低于 Q1 - 1.5*IQR)。
summarize math_score, detail
local q1 = r(p25)
local q3 = r(p75)
local iqr = `q3' - `q1'
local lower_bound = `q1' - 1.5 * `iqr'
list student_id math_score if math_score < `lower_bound'
分析:这些学生是否需要额外辅导?他们的成绩是否与其他科目一致?是否需要进一步调查原因?
6. 注意事项与最佳实践
- 样本量:箱形图在样本量较大时效果最佳。对于极小样本(如n<10),箱形图可能无法准确反映分布,此时应结合原始数据点查看。
- 异常值的处理:异常值不一定是错误数据。在删除或修改异常值之前,必须理解其产生的原因。在报告中,应明确说明如何处理异常值。
- 图形美化:在正式报告中,应使用清晰的标题、轴标签和图例。避免使用过于花哨的颜色或标记,除非它们有明确的含义。
- 结合其他图形:箱形图是EDA的起点。对于复杂数据,应结合直方图、密度图、散点图等其他图形进行综合分析。
- 理解局限性:箱形图隐藏了数据的多峰分布。如果数据有多个峰值,箱形图可能无法揭示,此时应使用直方图或密度图。
7. 总结
Stata的箱形图功能强大且易于使用,是探索数据分布和识别异常值的利器。通过理解箱形图的构成(箱体、须、异常值),掌握 graph box 和 twoway box 的创建方法,并学会结合统计命令进行解读,您可以高效地从数据中提取关键信息。记住,箱形图不仅是图形,更是数据分析的起点。通过它发现的异常值和分布特征,应引导您进行更深入的统计检验和业务分析,从而做出更明智的决策。
无论是分析经济数据、社会调查还是实验结果,熟练运用Stata箱形图都将显著提升您的数据分析能力和洞察力。
