1、 机 器 学 习 小 组 作 业题目 机器学习作业之大用户用水量分析 作者姓名 作者学号 指导教师 学科专业 所在学院 提交日期 大用户表数据处理数据处理首先对大用户表进行合并排序,同时对每 1000 条数据(因为 kettle 是以1000 条数据导入一次)进行一次简单去重,减少之后去重数据量接着,我们对数据进行过滤,将 null 值去除后排序去除重复数据(本来是想优化的,也即是不去掉数据而是将数据修改成符合前后数据情况的,但是发现实现有点困难)。这时原来 1500 万条数据只剩下 816 万条数据了。接着是计算临近时间的用户的用水量这时对用水量再次进行一次过滤,将用水量为负和正累积流量为负
2、的值去掉然后除杂(这里使用的是增量和标准差以及单位时间内用水量来去杂)除杂主要是以网络上找到的资料进行的除杂,我用增长量、每天使用水量、按天算出的标准差等值来进行数据进一步过滤处理,从不同的维度来进行数据的清洗。综上所述,清洗数据主要是以 null、负值、异常数据(判断是以网络上提供的数据进行的。主要是用增长量、每天用水量、用户按天算出的用水标准差等)。在这里,由于用户的时间间隔不稳定,有的是 10 分钟,有的只有 1 秒,还有的是 4 个小时,这里统一了时间间隔是 1 天,也即是说我将 1 天作为统计量来统计用户的每日用水量和标准差(标准差是用来看此用户每日是否用水偏差很大,然后便于过滤数据
3、的),之后我再以星期几、月份、季度等划分用户用水情况,进一步寻找用户的用水规律,在总表中,我将用户的 id、用水总量、用水平均值、用水标准差、用水时间占有率、周几的用水平均量、月份的用水平均量、季度的用水平均量作为字段,这样方便我更好的了解用户的用水规律,以及划分用户情况,同时也可以通过用户总用水量的标准差来判断用户用水是否不规律或者用问题,从而进一步排除问题数据。这里我本来是想将数据时间清洗的更小,通过规律时间(比如都为 4 小时)来对每天的用水规律进行分析的,但是由于数据间隔问题太大,所以我用了天来进行用户数据分隔,下面是用户各个时期的用水统计表:按天来划分的用水数据按周一、周二来划分的用
4、水数据按月份来划分的用水数据按季度来划分的用水数据总表:通过用户 id 来划分的用水数据下面先进行用户分类下面先进行用户分类用户分类实际上用很多种方法,一种是按照每天用水量来分类,这样我们可以通过聚类分出四种用户:从上图 weka 分析可以看出,大用户的用水量上,小水量的用户占了 50%左右,这也就是说,绝大多数用户的用水还是有限制的,从平均值和标准差上看,大多数用户偏离程度不高,也就意味着他们用水按天来算的话是有规律的,比较稳定的。由于之前求得值中存在很多表头读数问题,所以在这里也许也会影响情况。下图是用 sum 去聚类的效果,从这里可以看出,以用水量来聚类会看出大用户之间也存在着很大的用水
5、量差异。下面的是用水量与偏差之间存在的聚类情况,从这里看出,大多数用水量大的用户,他的每日用水偏差也很大,这里存在着散点,这说明之前统计的数据过滤了,但是还有很多不好的数据,不然的话聚类会集中点,也不会有很大的偏差值,这是由于统计的不规律性决定的,首先,统计的时间间隔不是规律的,由于数据太大,之前的过滤主要是以删除为主,而不是使用的添加修改为主,不然的话数据处理完会很好,其次,用户的用水量统计问题很多,没有一个统一的标准去去除数据,导致一些之前就有问题的数据没有被过滤掉,从而保存在了数据中,还有就是用户用水的不规律性,这之后会通过按日统计的表进行说明。我在数据的统计时,还加入了用户用水时间百分
6、比(按天统计),下图就是按照用水百分比进行的聚类情况(纵轴是表示的用户不用水的日占总天数的比例),这在一定程度上将用户分为了经常用水、有时用水有时不用水、不经常用水,这里面我看了 171 条数据,发现最多的是经常用水的人,占了 65%以上,也即是有 112 个人是一直在用水的(当然,由于水头度数等外部情况引起的并没有什么能够确定是因为这些情况的数据都保留了,所以可能会有些不准),这与下图的第一个聚类情况接近,所以这个聚类情况基本符合事实,当然,最好是能够将完全不用水的给分出来,这样更好的去进行分类,准确度也会更高点。从下图我们可以看出,大用户在用水方面还是很频繁的,不会像小用户那样出现很多经常
7、不用水的情况,当然,这些不用水的用户我们还需要分析的,这需要在按天排序的表中进行,下面会给出详细说明的。用水规律分析用水规律分析由于时间间隔和表头以及时间段用水规律统计不合理,数据不能够进行更进一步的优化,所以我做了这几个用水规律统计,按天来进行用户规律分析、按星期进行用户用水规律统计、按月进行用户用水规律分析、按季度进行用户用水规律统计。下面从大到小一次来进行分析:首先来看看季度用水规律图:通过使用 excel 表来看 171 个用户季度用水量情况发现,第 2、3 季度用水量普遍高于别的季度情况,第二、三季度,几乎占据了所有的峰顶,这也就意味着大用户第二、三季度用水量要比别的季度用水量多很多
8、,从时间角度分析,这也是说得通的,毕竟这两个季度处在春夏之间,春天需要浇灌等,夏天天气热,经常需要洗澡等,这两个季度都是忙碌的季度,所以用水量比别的高也是很正常的,但是从季度用水量统计情况来看,有些大用户的季度用水量为 0,这也就意味着用户很可能已经搬走了或者表坏了,这会造成上面图不太准,所以不排除这些因素的影响情况,但是总体来看还是可靠地,毕竟数据前期已经过滤充足了。接着来看看月用水规律:这是选取了 18 个用户来进行绘图的,这里可以清楚看出来 2 月份是用水低谷,大用户在二月份的用水量明显下折,这说明用户在二月份很少用水,而在6-9 月份中,这几个月的用户用水量会有高峰,也即是说在这一部分
9、用户用水量达到顶峰,这也符合实际情况,用户在 2 月份的冷天,几乎不怎么太长用水,而在 6-9 月份的夏天经常洗澡、洗衣服等,这些会使得用水量猛增,达到峰值也是正常的。到这里大用户的分析结束了一半,下面是按照星期来分析的:在这里我们选取了 18 个用户来进行分析,其中大多数用户在星期 3、5 这两个地方会有一个比较大的用水量,而周四除了个别的用户,大多数都是一个下降点位,而周二、周六也是一个较低点位,这就说明了用户用水多的时候大多集中在周三、周五这两天,具体原因不明,但是有参考意义,可以针对这些来设计用水方法等,也可以设计节约水资源的方案。下面是对大用户进行按天分析,在这一部分,我们可以将通知
10、用户不规则用水进行提醒:从上面的图可以看出,此用户在一段时间后的某些天会有大量用水现象,这超出了正常用水波动情况,正常用水量/日不会超过 200,但是图中标注的几个点位都在 200 以上,所以我们可以通过这些情况来通知用户异常用水,给用户警示。这是第二个用户的日用水量情况,从图中可以看出,这个用户用水规律很杂乱,从总体上看,他的用水是基本在一条水平线上的,但是在某些时刻会出现用水急速上升和急速下降的情况,所以应该在图上画出圈的地方基于用户警示,告诉用户你在这些时候用水不规律了,是不是水龙头没关好或者水表坏了。这是第三个用户,这个用户一开始的用水量是 0,而中间也是陆陆续续的0,这也就意味着这个
11、用户几乎不怎么用水,而在图中的最高峰出出现了急剧增大,这就意味着用户的水表出现故障或者水龙头未关,这也是一个用户不经常用水的样例。上面举了三个用户的例子,我们发现,不经常用水的用户,每日用水量经常出现 0,而且用水量也是比较小的,而经常用水的用户,他们在一些时候会出现用水量急剧上升的趋势,而且大多数时候用水量会在一个小范围波动,一旦超出这个小范围,我们就应该给用户发警示,让用户注意自己的用水量和水表情况。大用户用水规律预测大用户用水规律预测从不同的 cluster 来选取用户,这样选取到的用户的用水量预测才具有代表性。首先选取一个按天进行统计的用户的用水量,将其放入 csv 的一个变量中。之后
12、将此变量利用 ts 函数转为时间序列对象,并画出时间序列对象。接着利用 auto.arima 将数据进行自动获得模型:得到模型 arima(1,1,1),此模型原型为 ARIMA(p,d,q)。因此,此处 p=1 表示了自相关性,d=1 表示数据进行了一次差分,q=1 表示偏相关性。再利用 Forecast 利用此模型对未来 14 天进行预测:之后会画出预测后的结果,如下图,蓝色线为未来 7 天的预测结果,灰色区间是置信区间,其中深色小范围是置信区间为 80%的区间,而浅灰色区间即更大的是置信区间为 95%的区间。基本从此图不能看出预测模型的好坏。因此,下面从理论还实际进行验证。理论验证:从
13、ARIMA 模型定义来看,当模型预测后的预测误差(也叫残差)是一个均值为 0,方差为常数的正态分布函数,且基本是不相关。就可表明此模型使一个合理的模型。利用 acf 函数对自相关进行检测得到检测结果图如下:从上可以看出,预测误差即残差基本是不自相关。因为上图中在滞后 1-20阶(lags 1-20)中样本自相关值都没有超出显著(置信)边界,在实施的时候使用的是 10 阶就够用的了。下面开始是用户用水量正式预测:下图是对用户 05793-20-00086663 进行的预测,后面的阴影部分是预测趋势(预测天数为 14 天)验证结果情况:下图是对用户 05793-20-00086669 进行的预测,
14、后面的阴影部分是预测趋势(预测天数为 14 天)验证结果情况:下图是对用户 05793-20-00094850 进行的预测,后面的阴影部分是预测趋势(预测天数为 14 天)验证结果情况:下图是对用户 05793-20-00094854 进行的预测,后面的阴影部分是预测趋势(预测天数为 14 天)验证结果情况:总结:总结:通过这次实验,知道了如何去处理数据,对数据过滤需要从不同的角度去进行清洗,如果数据量少,可以采用一个数据一个数据的清洗,如果数据量过大,那么查找资料来设定顾虑范围。同时,还要注意使用不同的方法进行判断值是否是误差,例如:方差、单位时间平均值等,这些方法可以使得数据更加精准,减少了之后处理数据的麻烦。后面的分析是通过 excel 作图来进行的,以后要能够使用数据进行直接分析,预测部分使用的是 R 语言来完成的,通过之前的聚类(使用的是 weka),然后选定不同聚类的一些值来进行预测,这里的预测只能对一个人进行,所以之后可以考虑同时对多个近似用户进行预测,当然,我这里一直想用线性回归和曲线拟合来做,或者用随机森林,但是对别的语言了解过少,时间有限,所以预测只是使用的简单的随机匹配函数来写的,这是一个不足点,希望以后能多多注意!
©2010-2024 宁波自信网络信息技术有限公司 版权所有
客服电话:4008-655-100 投诉/维权电话:4009-655-100