采集到原始数据后,常常用图表或统计量探查数据的特征,并对有问题或不满足统计要求的数据进行预处理。[大谦Excel,dqexcel点com]
描述性统计
在采集到大量的样本数据以后,常常需要用一些统计量来描述数据的集中程度和离散程度,并通过这些指标对数据的总体特征进行归纳。常见描述性统计量如表5-1所示,假设样本数据为。注意,”VBA函数”一列为计算对应统计量的工作表函数,表中只给出函数名称,完整的写法为:app.api.WorksheetFunction.FunctionName,其中FunctionName为函数名,如Min, Max, Average等。
表5-1 常见描述性统计量
| 分类 | 统计量 | 说 明 | 工作表函数 |
|---|---|---|---|
| 集中趋势 | 计算平均值 | Average | |
| 集中趋势 | 中值 | 50%分位数 | Median |
| 集中趋势 | 几何平均值 | GeoMean | |
| 集中趋势 | 调和平均值 | HarMean | |
| 集中趋势 | 截尾均值 | 对样本数据进行排序以后,去掉两端的部分极值,然后对剩下的数据求算术平均值 | TrimMean |
| 集中趋势 | 分位数 | 对于升序排列的数据,处于N%处的数 | Percentile |
| 离中趋势 | 极差 | 最大值减去最小值 | |
| 离中趋势 | 内四分极差 | 75%分位数减去25%分位数 | |
| 离中趋势 | 方差 | ,其中 | Var |
| 离中趋势 | 标准差 | StDev |
图5-1中用一组数据绘制散点图,并在图中标注各种统计量对应的位置。实际应用中,算术平均值容易受异常值的影响,中值和截尾均值则更加稳健。
图5-1 一元数据的描述性统计
频数分析和直方图
对一元数据进行频数分析时,首先将数据从小到大进行排列。根据最小值和最大值得到极差,然后将极差等间隔分割成指定个数的区间,比如10个区间。这样的区间常称为分箱。每个分箱数据的下边界和上边界是可以计算出来的。然后将各原始数据根据大小投放到对应的分箱中,并最终得到每个分箱中的数据。4.1节介绍了利用频数分析结果绘制直方图的方法。
绘制一元数据的直方图可以探查该数据的分布形状,根据直方图的形态可以将分布形状分为陡峭、矮胖、左偏、右偏以及正态等几种情况。
常用统计量峰度和偏度描述和判断数据的分布形状。当峰度>3时,称分布是高尖的,具有过度的峰度,如图5-2中右上角图所示;当峰度<3时,称分布是矮胖的,具有不足的峰度,如图5-2中左上角图所示;当偏度>0时,称分布右偏,或者正偏,如图5-2中左下角图所示;当偏度<0时,称分布左偏,或者负偏,如图5-2中右下角图所示。
图5-2 不同峰度和偏度的直方图
图5-3用下面的代码生成。完整代码见:Samples->ch08 统计图表->02 数据分布形状->py.py。
Sub Test()
Dim rng(1 To 4) As Range
Dim intI As Integer
Set rng(1) = Range("A2:A201")
Set rng(2) = Range("B2:B201")
Set rng(3) = Range("C2:C201")
Set rng(4) = Range("D2:D201")
For intI = 1 To 4
DrawHist rng(intI), 200
Next
End Sub
核密度估计
根据5.1.2小节的介绍,直方图是直接用紧密排列的柱形表现样本数据的分布特征。核密度估计则不同,它是使用非参数的方法,用有限的样本数据对总体进行估计,得到描述总体特征的概率密度函数。
下面的代码用5.1.3小节的数据绘制核密度估计曲线图。完整代码见:Samples->ch08 统计图表->03 核密度估计->py.py。
Sub CreateCharts()
Dim intI As Integer
Dim intJ As Integer
Dim rng(1 To 4) As Range
Set rng(1) = Range("A2:A201")
Set rng(2) = Range("B2:B201")
Set rng(3) = Range("C2:C201")
Set rng(4) = Range("D2:D201")
Dim shp As Shape
Dim cht As Chart
Dim dblMinX(1 To 4) As Double
Dim dblMaxX(1 To 4) As Double
Dim dblMaxY(1 To 4) As Double
dblMinX(1) = -30
dblMaxX(1) = 30
dblMinX(2) = 0
dblMaxX(2) = 1
dblMinX(3) = -3
dblMaxX(3) = 4
dblMinX(4) = -6
dblMaxX(4) = 4
dblMaxY(1) = 0.4
dblMaxY(2) = 1.1
dblMaxY(3) = 0.5
dblMaxY(4) = 0.5
For intI = 1 To 4
Set shp = ActiveSheet.Shapes.AddChart2()
Set cht = shp.Chart
cht.ChartType = xlXYScatter
Dim ax1 As Axis
Set ax1 = cht.Axes(1)
Dim ax2 As Axis
Set ax2 = cht.Axes(2)
ax1.MinimumScale = dblMinX(intI)
ax1.MaximumScale = dblMaxX(intI)
ax2.MinimumScale = 0
ax2.MaximumScale = dblMaxY(intI)
'cht.Legend.Delete
SetStyle cht
For intJ = cht.SeriesCollection.Count To 1 Step -1
cht.SeriesCollection(intJ).Delete
Next
cht.SeriesCollection.NewSeries
ax1.CrossesAt = ax1.MinimumScale
ax2.CrossesAt = ax2.MinimumScale
DrawKDE rng(intI), cht, 0, 0, 0, 255, dblMinX(intI), dblMaxX(intI)
Next
End Sub
运行代码生成图5-3。核密度估计图的更多绘制方法请参见4.2节。
图5-3 不同分布形状数据的核密度估计曲线图