G3. 直方图
整理人: 郭楚玉 (武汉大学)
邮箱: julieguo@whu.edu.cn
1. 直方图简介
首先,让我们用一个简单的例子来演示直方图背后的含义。我们调入美国 1988 年妇女工资数据 (nlsw88),查看年龄的分布情况有多种方式: * sum
命令,可以展示变量的简单统计信息:比如样本个数、最小年龄、最大年龄、平均值和标准差。
sysuse nlsw88, clear
(NLSW, 1988 extract)
sum age
Variable | Obs Mean Std. Dev. Min Max
----------+--------------------------------------- age | 2,246 39.15316 3.060002 34 46
tab
命令可以列示不同年龄段的妇女分布的频数、比例和累计占比。
tab age
in |
age
current |year | Freq. Percent Cum.
---------+--------------------------------
34 | 53 2.36 2.36
35 | 260 11.58 13.94
36 | 257 11.44 25.38
37 | 225 10.02 35.40
38 | 219 9.75 45.15
39 | 234 10.42 55.57
40 | 208 9.26 64.83
41 | 222 9.88 74.71
42 | 160 7.12 81.83
43 | 165 7.35 89.18
44 | 163 7.26 96.44
45 | 78 3.47 99.91
46 | 2 0.09 100.00
---------+-------------------------------- Total | 2,246 100.00
这两种呈现方式虽然非常准确,但是不够直观。 histogram
这个命令可以帮助我们更加直观的观察数据分布。
histogram age, frequency xlabel(34(1)46)
此时可以看到该样本中,年龄为 35 和 36 岁的人数最多。
histogram age, fraction xlabel(34(1)46)
此时每个纵轴代表频率,所以纵轴之和等于1。
histogram age, percent xlabel(34(1)46)
此时纵轴之后加总等于 100 %。
2. 直方图详解
刚展示的 age 是一个离散变量,下面我们用 wage 这个连续变量来进一步介绍。总样本量是2246个妇女,直方图的实现在于将这2246个妇女划分为若干组,统计每一组里出现的观察值的个数。再基于总样本数算出每组的频率或 累计占比等。
histogram wage
bin=33, start=1.0049518, width=1.2042921) (
如上所示, Stata 给出了 wage 变量的带宽数量、初始值和宽度这三个信息。
下面我们具体来看一下这三个参数是如何确定的:
- 最优的组数
由一系列统计学家研究过,Stata 中采用的是下面这个公式:
\[ \mathrm{k}=\min \{\operatorname{sqrt}(\mathrm{N}) ; \quad 10 \ln (\mathrm{N}) / \ln (10)\} \]
两者比较取最小值。 我们可以分别计算出这两个数,最后选取的33为组数。
sqrt(_N)
dis
47.391982
ln(_N)/ln(10)
dis 10* 33.514098
- 组宽
组宽是用极差除以组数得出的。极差就是一个变量的最大值减去最小值。
sum wage
Variable | Obs Mean Std. Dev. Min Max
----------+--------------------------------------------------
wage | 2,246 7.766949 5.755523 1.004952 40.74659
"Max = " r(max) //see P1_scalar.do
dis
Max = 40.74659
"Min = " r(min)
dis
Min = 1.0049518
"Range = " r(max)-r(min) //极差
dis
Range = 39.741638
"width = " (r(max)-r(min))/33 //组宽=极差/组数(bins)
dis width = 1.2042921
有了前面对细节的理解,下面我们画出 工资 这个变量的直方图。
histogram wage, frequency
histogram wage, fraction
histogram wage, percent
histogram wage
3. 直方图的美化
得到直方图后,我们可以通过一系列的选项更改直方图的外观。 * 附加正态分布密度曲线
histogram wage, normal
其中正态分布曲线是由 工资 变量的均值和标准差决定的。
- 附加核密度函数曲线
histogram wage, kdensity
- 长条的显示
此外,我们还可以对小柱状体的宽度和颜色,图片的颜色进行设置。
histogram wage, gap(50) // 小柱状体间距缩小为默认值的 50%
histogram wage, gap(90) scheme(s1mono) //黑白图形
histogram wage, gap(60) scheme(s1mono) fcolor(white) lcolor(black) lwidth(*0.8)
Notes:
fcolor
代表图七中第三个图里,小柱状体里填充的是白色。
lcolor
代表柱体的边框为黑色。
- 附加标签
histogram age, freq addlabels
可以在直方图中标示出每组数据的频次。
4. 分组绘制直方图
如果我们想看大学毕业与否会怎样影响妇女的工资,可以使用以下命令:
histogram wage, by(collgrad) gap(80) scheme(s1mono) percent
可以看到,大学毕业的妇女平均工资 (10) 比没有大学毕业的妇女平均工资 (5) 高。但是观察两端的数据, 比如收入等于40,两组之间并没有很大差别。看起来,大学毕业只是有助于一个人平均工资的增加。对于能力特别强的人 是否上大学对他的工资水平没有太大影响。
外部命令 byhist
可以使图十中两个直方图交错的展现在一张图里。
sysuse nlsw88,clear
by(collgrad) frac tw(legend(row(2) ring(0) position(1)))
byhist wage,
by(collgrad) density ///
byhist wage, color(black)) ///
tw1(color(blue)) ///
tw2(tw(legend(label(1 "Otherwise") ///
label(2 "College Graduate") ///
ring(0) pos(1))) col(1)
比直方图更精简的展示,可以使用核密度函数图:
twoway (kdensity wage if collgrad==0) ///
kdensity wage if collgrad==1), ///
(xtitle("Hourly wage") ///
legend(label(1 "Otherwise") ///
label(2 "College Graduate") ///
ring(0) pos(3)) col(1)
此时得到的结果,与直方图展示的信息完全一样。但是它更加突出两个组之间平均工资的差别。
bihist
命令可以展示对称直方图。
sysuse nlsw88, clear
by(collgrad) frac
bihist wage,
by(collgrad) frac tw(legend(col(1)) scheme(s1mono)) bihist wage,
右边设成黑白色的图片更适合投稿。