1.2 数据预处理的软件实现
一、数据插值
数据插值是图像处理和信号处理等领域常用的方法,也是补齐数据缺失值、更改异常值的一种方法。在已知的数据之间寻找估计值的过程即为插值。此处借助Matlab软件实现数据常用的几种一维插值方法,一维插值就是对一维函数进行插值。
图中“∗”点表示已知数据,红色“°”点表示未知数据点,需要通过插值过程对横坐标x对应的y值进行估计。曲线是根据已知点拟合出来的曲线。
此处介绍Matlab软件提供的一维多项式插值。插值可以通过函数interp1( )来实现。
1. interp1( )的调用格式
(1)yi=interp1(x,y,xi)
图1-3 一维插值示意
其中x必须是矩阵,y既可以是向量也可以是矩阵。若y是向量,则必须与x长度相同,xi可以是标量、向量或矩阵,yi与xi大小相同;若y是矩阵,则大小必须是[n,d1,d2,...,dk],n是向量x的长度,函数对d1×d2×…×dk组y值都进行插值。
(2)yi=interp1(y,xi),默认x为1:n,其中n为向量y的长度。
(3)yi=interp1(x,y,xi,method),输入变量method用于指定插值的方法。
(4)yi=interp1(x,y,xi,method,‘extrap’),对超出数据范围的插值数据指定外推方法。
2. 一维插值常用的指定方法
(1)最邻近插值:Matlab取值为“nearset”,这种插值方法在已知数值的最邻近点设置插值点,对插值点的数进行四舍五入。对超出范围的点返回NAN。最邻近插值是最快的插值方法,但在数据平滑方面效果最差,得到的数据是不连续的。
(2)线性插值:Matlab取值为“linear”,这种插值方法是未指定插值方法时所采用的方法,该方法直接连接相邻的两点,对超出范围的点返回NAN。要比最邻近插值占用更多的内存,执行速度也稍慢,但在数据平滑方面优于最邻近插值,线性插值的数据变化是连续的。
(3)三次样条插值:Matlab取值为“spline”,这种插值方法采用三次样条函数来获得插值点。在已知点为端点的情况下,插值函数至少具有相同的一阶和二阶导数。处理速度最慢,可以产生最光滑的结果,但在输入数据分布不均匀或数据点间距过近时将产生错误。样条插值是非常有用的插值方法。
(4)分段三次厄米多项式插值:Matlab取值为“pchip”,用于对向量x与y执行分段三次内插值,该方法保留单调性与数据的外形,该方法处理的速度和内存消耗比线性插值差,但得到的数据和一阶导数是连续的。
(5)三次多项式拟合已知数据:Matlab取值为′v5pchip′,该方法使用三次多项式函数对已知数据进行拟合。
3. 一维插值常用指定方法的Matlab实现
例1.1 几种常用的一维插值方法示例。
Matlab源程序
执行语句后的结果如图1-4所示。
图1-4 几种常用的一维插值方法示例
由命令做出的图形1.4可以看出最邻近插值、分段线性插值与几种三次样条插值的明显区别。最邻近插值数据平滑方面效果非常差,连接已知数据的曲线是不连续的;线性插值用直线连接相邻节点,在节点比较稀疏的情况下,插值处的计算值与真实值有很大的差异,光滑性较差。而几种三次样条插值用三次多项式曲线连接相邻节点,光滑性较好,插值处的计算值更接近于真实值。
例1.2 在一天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为:
12,9,9,10,18,24,28,27,25,20,18,15,13
推测中午12点时的温度。
Matlab源程序
运行程序输出:
y1=
27.8725
y2=
27.6667
y3=
27.8750
由图1-5结果可以看出,三种不同的方法插值出来的结果略有差别。
图1-5 输出的拟合图像
例1.3 某居民区的自来水是由一个圆柱形的水塔提供。水塔由水泵根据塔中水位高低自动加水,一般每天水泵工作2次。现在需要了解该居民区用水规律,可以通过用水率(单位时间的用水量,也就是水塔中水的流速)来反映。表1-1是某一天的测量记录数据,测量了28个时刻(单位:小时)水的流速(单位:立方米/小时),但由于其中有3个时刻正遇到水泵在向水塔供水,而无流速记录在表中用符号//表示。请用插值法补充三个无记录的数据。并将这些散点通过三次样条插值拟合出用水率函数图。
表1-1 水塔中水的流速 单位:立方米/小时
解:先用Matlab画出水流速散点图,再使用Matlab软件中的三次样条插值命令得到用水率函数f(t)。
运行结果:
y1=
60.2484
y2=
73.4399
y3=
57.2514
图1-6 水流速散点图
图1-7 样条插值图
二、异常值检测及标注
例1.4 表1-2给出了2017年我国分地区人均消费情况数据,用箱线图显示“食品烟酒”和“其他用品及服务”两个指标的异常值,输出5个最大值和5个最小值作为异常的嫌疑值。并检测哪些指标可以通过3σ原则进行检测(数据来自《中国统计年鉴2018》)。
表1-2 我国分地区人均消费情况 单位:元
用SPSS软件完成操作。
菜单实现程序:主菜单→分析(Analyze)→描述性统计(Descriptive Statistics)→探索(Explore)选项→“Statistics”按钮→选中“Outliers”复选框。输出结果中将列出5个最大值和5个最小值作为异常的嫌疑值。
图1-8
1. 将“食品烟酒”和“教育文化娱乐”数组放入因变量列表中,如图1-9所示。
图1-9
2. 点击“探索”窗口中的“统计量”,点掉“描述性”,选择“界外值”和“百分位数”。
图1-10
3. 点击“探索”窗口中的“绘制”,选择“直方图”,去掉“茎叶图”,如图1-11所示。
图1-11
4. 选择结束后点击“探索”窗口“确定”结果如表1-3所示:
表1-3 百分位数
(1)百分位数表
(2)“极值”表格给出了5个最大值和5个最小值作为异常的嫌疑值。
从表1-4可以看出,对于“食品烟酒”最高的5个值从高到低对应的案例号为2、29、6、4、1,对应的城市分别为上海、天津、广东、浙江和北京;最低的5个城市从低到高对应的案例号为7、30、27、31、14分别为山西、河南、宁夏、云南及甘肃。
表1-4 食品烟酒的极值
从表1-5可以看出,对于“其他用品及服务”最高的5个值从高到低对应的城市分别为上海、北京、天津、广东和江苏。最低的5个城市从低到高分别为西藏、云南、广西、贵州和甘肃。
表1-5 其他用品及服务极值
(3)箱线图及异常可疑点
由图1-12显示的结果可知,食品烟酒的异常可疑值所对应的城市为上海。
图1-12 食品烟酒的箱线
由图1-13显示可知,其他用品及服务的异常可疑值所对应的城市为北京和天津,极端点为上海。
图1-13 其他用品及服务的箱线
4. 数据归一化的SPSS操作步骤
选择分析(analyze)菜单→描述统计(descriptive statistics)→描述(descriptives)→选择变量(衣着、医疗保健)到右边的框里→点选将标准化得分另存为”(save standardized values as variables)→选择确定。
在数据视图中增加两列数据,数据名为“Z衣着”和“Z医疗保健”,分别是衣着、医疗保健进行标准化以后的数据。
5. 数据的正态性检验
该种方式的标注需要数据服从正态分布或数据量较大,首先对数据进行正态性检验。
SPSS软件操作:选择分析菜单→描述统计→探索→选择所有的变量到右边的框里→点击“绘制”勾选“带检验的正态图”,确定返回。得到表1-6。
表1-6 正态性检验
续表
a.Lilliefors显著水平修正
∗.这是真实显著水平的下限。
由表1-6可以看出,“衣着”“医疗保健”的数据服从正态分布,可以通过3σ原则,标注异常值,其他数据不能用该原则进行标注。
6. 通过3σ原则,将异常值标注
SPSS操作:数据(data)菜单→选择个案(select cases)→选择“如果条件满足”选项,选择如果(if)点按钮设置,进入后选择Zscore(衣着),在右上的计算栏显示Z衣着,输入“Z衣着<=3&Z衣着>=-3”,点击“继续”,返回后点击“确定”。
图1-14 通过3σ原则筛选食品烟酒的命令
在数据视图中增加一列,列命名“filter_$”,取值为0和1,取值0代表没有选取(Not Selected),取值1代表选取(Selected),由报告结果可知,数据全部选取,没有超出3σ以外的数据。类似地,通过3σ原则筛选“医疗保健”的数据,也全部通过了检验。
由于分析的数据样本量为31,如果对数据处理的要求不是很严格,那么对不服从正态分布的数据也可运行使用3σ原则进行筛选。通过该原则筛选“教育文化娱乐”的数据发现,上海的数据没有被选取并在记录前进行了标识,表明该数据将不再参与接下来的分析。
图1-15 通过3σ原则筛选教育文化娱乐数据的标注结果
上述结果也可以通过运行界面的结果汇报得到:
USE ALL.
COMPUTE filter_$=(Z衣着=3& Z衣着>=-3).
VARIABLE LABELS filter_$′Z衣着=3& Z衣着>=-3(FILTER)′.
VALUE LABELS filter_$0′Not Selected′′1′Selected′.
FORMATS filter_$(f1.0).
FILTER BY filter_$.
EXECUTE.
USE ALL.
COMPUTE filter_$=(Z医疗保健<=3 & Z医疗保健>=-3).
VARIABLE LABELS filter_$′Z医疗保健<=3 & Z医疗保健>=-3(FILTER)′.
VALUE LABELS filter_$0′Not Selected′1′Selected′.
FORMATS filter_$(f1.0).
FILTERBY filter_$.
EXECUTE
USE ALL.
COMPUTE filter_$=(Z教育文化娱乐<=3&Z教育文化娱乐>=-3).
VARIABLE LABELS filter_$′Z教育文化娱乐<=3&Z教育文化娱乐>=-3(FILTER)′.
VALUE LABELS filter_$0′Not Selected′1′Selected′.
FORMATS filter_$(f1.0).
FILTER BY filter_$.
EXECUTE.
报告同样显示对“衣着”和“医疗保健”筛选后数据全部可用,通过“教育文化娱乐”筛选后处理的结果已经执行。
经过对实际问题的分析可知,全国重点城市的“衣着”和“医疗保健”类消费没有超出3σ范围的数据,消费没有异常数据,而“教育文化娱乐”数据中上海市的数据超出了3σ范围,明显高于全国其他城市,说明上海市在2017年此项消费支出非常高。如果希望通过分析平均数据得到一般性水平,为政策制定提供依据时,建议将该数据剔除,以免因为该异常数据的存在影响分析结果。