您还没有绑定微信,更多功能请点击绑定

系列教程:用Excel作直方图的方法

Step 1:插入名称定义
选定要形成直方图数据的单元格,这里为“Histogram”工作表中的A3:C42单元格;
运行菜单:Insert->Name->Define,在Names in workbook输入框中输入名称,这里输入的名称是“Data”,然后按下“Add”按钮即可;
这样,以后要引用直方图数据源A3:C42,只要输入Data即可,也就是说我们为这个数据源取了个名字叫作“Data”!

Step 2:计算统计量
数据个数:公式为=Count(Data)
这里Count函数就是专门统计数据个数的,而且只统计数值的个数,文本单元格不会统计进来;
Data:这个参数就是已经取好名称为“Data”的直方图的数据源;

平均值:=IF(ISERROR(AVERAGE(Data)),"",AVERAGE(Data))
Average函数:用于计算数据的平均值,和Count函数类似,也是只统计数值单元格的平均值
当Data里面的数值单元格个数为0,Average函数会出现错误值(#Div/0!),为了避免出现难看的错误值,这里引入两个函数:IsError和If函数;
IsError函数用于计算单元格或者计算公式的结果是否为错误值,函数的返回结果是True或False这样的逻辑值;
If函数则是根据某个表达式返回两个不同的结果,它有3个参数,第1个参数是表达式,第2个参数是表达式为逻辑真(True)时返回的值,第3个参数是表达式为逻辑假(False)时返回的值
=IF(ISERROR(AVERAGE(Data)),"",AVERAGE(Data))的含意就是:如果IsError(Average(Data))为逻辑真,也就是平均值计算结果出错,则返回一个空字符串"",不出错则就返回Average(Data)

样本标准偏差:=IF(ISERROR(STDEV(Data)),"",STDEV(Data))
StDev函数用于计算样本标准偏差,公式用法和平均值计算函数Average完全类似,以下最小值函数Min和最大值函数Max也完全类似!

最小值:=IF(ISERROR(MIN(Data)),"",MIN(Data))
最大值:=IF(ISERROR(MAX(Data)),"",MAX(Data))

小数位数:数组公式=MAX(IF(ISERROR(FIND(".",Data)),0,LEN(Data)-FIND(".",Data)))
这个公式用于求出直方图数据源Data中最大的小数位数
Find函数用于查找子字符串表达式1在母字符串表达式2中的位置,如果表达式2里面不包含表达式1则返回错误值;例如Find(".",99.15)返回3;
Len函数用于返回单元格或表达式的长度,例如Len(99.12)返回数值99.12的长度5,用这个Len(99.12)减去Find(".",99.15)即可得到小数位数2;
这个公式的意思:如果数据源单元格没有出现小数点".",则返回0,否则的话返回LEN(Data)-FIND(".",Data),即小数位数;
由于是要得到所有单元格的小数位数的最大值,所以要用Max函数
这里Find和Len函数都是针对某个单元格或某个字符串的,而这里的参数却是一个区域(Data),所以要用数组公式得到正确的结果,否则公式的结果将是按照Data的第一个单元格进行计算
输入数组公式的方法:先输入公式=MAX(IF(ISERROR(FIND(".",Data)),0,LEN(Data)-FIND(".",Data))),光标停留在公示编辑栏,再按下组合键Ctrl+Shift+Enter即可

区间个数:这里取4~50个区间
直方图的区间取多少个,有各种说法,计算公式各不相同;
最好的方法莫过于图形直接观察,一般原则是,过多的分组会出现多峰,这时候就要适当减少分组;
我们这个范例中,图形是动态的,调整区间个数,会自动得到新的直方图

区间宽度:
(最大值-最小值)/区间个数,很好理解的。

Step 3:直方图计算表
组下限:H3单元格的公式=IF($F$8<ROW(1:1),"",IF(ROW(1:1)=1,$F$5,I2))
Row函数返回某行的行号,例如Row(1:1)的结果就是1,不用数字1而不厌其烦用这个函数,是为了公式可以往下拖拽来复制公式;
$F$8:区间个数
Round函数用于求某个数值四舍五入取某小数位数后的数值,例如Round(99.12,1)=99.1
公式含义:如果区间个数小于组的序号,就为空字符串;如果组序号为1,就为最小值$F$5;如果区间个数大于组序号,就为上一个组的组上限I2
根据相关书籍的直方图画法,数值取多1位小数位数,用四舍五入函数Round来处理

组上限:I3单元格的公式=IF($F$8<ROW(1:1),"",ROUND(IF($F$8=ROW(1:1),$F$6,H3+$F$9),$F$7+1))
公式含义:如果区间个数小于组的序号,就为空字符串;如果组序号等于组数(最后一个组),就为最大值$F$6;如果区间个数大于组序号,就为组下限H3+区间宽度$F$9

组中值:J3单元格的公式=IF(ROW(1:1)>$F$8,"",(H3+I3)/2)
组下限H3与组上限I3的中心值

频数:K3单元格的计算公式=IF(ROW(1:1)>$F$8,"",COUNTIF(Data,">="&H3)-COUNTIF(Data,">"&I3))
Countif函数:用于计算单元格范围内满足某个条件的单元格个数;
&:连接符号,例如H3=22.82,则">="&H3返回">=22.82"这个字符串,字符串与数值用&连接总是返回字符串的;
故COUNTIF(Data,">="&H3返回直方图源数据Data中大于或等于组下限H3的单元格个数;
COUNTIF(Data,">"&I3)则返回直方图数据源Data中大于组上限I3的单元格个数;
二者之差恰为位于区间内的数据个数,也就是频数;

频率(%):L3单元格的公式=IF(ROW(1:1)>$F$8,"",ROUND(K3/$F$2*100,2))
用频数除以数据个数即可得到频率,取两位小数

累积频率(%):M3单元格的公式=IF(ROW(1:1)>$F$8,"",SUM(L$3:L3))
Sum函数用于求和,这里L$3,表示的还是L3单元格,但要注意:这里的$符号表示行是绝对引用,往下拖动鼠标复制公式时,这个行号$3是不会改变的!!!
把第一个组的频率L$3到当前分组的频率相加进行累计即可

正态概率:N3单元格的公式=IF(ROW(1:1)>$F$8,"",NORMDIST(I3,$F$3,$F$4,TRUE)-NORMDIST(H3,$F$3,$F$4,TRUE))
NormDist函数用于求正态分布概率,第1个参数是数据点,第2个参数为平均值,第3个参数为样本标准偏差,第4个参数为是否求累计概率,True表示是求累计概率;
NORMDIST(H3,$F$3,$F$4,TRUE)则返回组下限H3在均值为$F$3,标准差为$F$4的正态分布下的累计概率,也就是数据分布在从无穷小到H3之间的累计概率之和;
NORMDIST(I3,$F$3,$F$4,TRUE)则返回组上限I3在均值为$F$3,标准差为$F$4的正态分布下的累计概率;
二者之差则为数据位于第1个分组的概率总和

正态累积概率:O3单元格的公式=IF(ROW(1:1)>$F$8,"",NORMDIST(I3,$F$3,$F$4,TRUE))
NORMDIST(I3,$F$3,$F$4,TRUE)则返回组上限I3在均值为$F$3,标准差为$F$4的正态分布下的累计概率;

以上公式都已经充分考虑拖动鼠标复制的因素,拖动鼠标复制50行,即可适应分50个分组的直方图,50个分组已经足够,再多的话没有必要,万一不够还可以往下拖动的!

Step 4:作图
准备工作:
为了建立一个动态的直方图,先介绍一个函数Offset,这个函数用于单元格区域的移位和改变;
Offset函数有5个参数,第1个参数是原始的单元格,第2个是往下移动多少行,第3个是往右移动多少列,第4个是修改为多少行,第5个是修改为多少列,只有第1个参数不能省略;
例如OFFSET($J$3,,,$F$8),就是从$J$3单元格开始,下移0行(没有指定为0),右移0列(也没有指定,为0),修改单元格行数为$F$8(区间分组个数)后得到的单元格区域;
当F8=17时,OFFSET($J$3,,,$F$8)返回的就是J3扩大为17行得到的单元格区域,即J3:J19这个区域;

插入名称定义GrpCenter
运行菜单:Insert->Name->Define,在Names in workbook输入框中输入名称“GrpCenter”,Refers to输入框中输入公式=OFFSET($J$3,,,$F$8),然后按下“Add”按钮即可;

同样进行以下插入名称定义操作:
名称Freq,公式=OFFSET($K$3,,,$F$8)
名称Freqc,公式=OFFSET($L$3,,,$F$8)
名称FreqcCum,公式=OFFSET($M$3,,,$F$8)
名称Norm,公式=OFFSET($N$3,,,$F$8)
名称NormCum,公式=OFFSET($O$3,,,$F$8)

作图:
制作“频数-正态概率”图
运行菜单Insert->Chart,打开Chart向导;选择Standard Types页框中的默认的Column这个类型即可;
单击Next,删除Data Range,再单击Finished按钮,得到一个空白的Chart;
鼠标右键单击Chart空白区域选择Source Data,选择Series页框,单击Add按钮添加第1个序列;
在Name输入框中输入“频数”两字,Values输入框中输入=Histogram!Freq,Category (x) axes labels输入框中输入=Histogram!GrpCenter;
再次按Add按钮添加第2个序列,Name:为“正态概率”四字,Values输入=Histogram!Norm;
Chart上鼠标右键选择Chart Type,选择“Custom Types”页框,从中选择图形类型为“Line - Column on 2 Axes”,单击OK按钮;

在第1个序列的矩形上双击鼠标,选择Options,把Gap Width修改为0;
在第2个序列的线条上双击鼠标,选择Format Data Series...,选定Smoothed line,Marker选择为None;
这样就基本大功告成了,剩下来的就是您自己发挥艺术想象力,美化一下图形。

同样的方法可以制作“频率-正态概率”图和“累计频率-正态累计概率”图。

这样得到的图形,在修改区间个数时,所得3个直方图都是自动更新的

总结:
这里,学习内容非常丰富,有很多个简单实用的函数,也有动态图的作法,如果学会了,Excel应用水平定会大幅度提高!
这个Histogram工作表可以直接作为直方图的模板,数据源改变时,只要重新定义一下Data这个名称定义所引用的单元格区域范围即可!



对“好”的回答一定要点个"赞",回答者需要你的鼓励!
已邀请:

luckyg (威望:0) (浙江 宁波) 汽车制造相关 工程师 - ...........

赞同来自:

:D 谢谢楼主分享!

9 个回复,游客无法查看回复,更多功能请登录注册

发起人

扫一扫微信订阅<6SQ每周精选>