一、背景与挖掘目标
传统防窃漏电主要通过定期巡检、定期校验电表、用户举报等手段来发现窃电或者计量装置故障。但这种方法对人的依赖性太强,抓取查漏目标不明确。目前,很多供电局主要通过营销稽查人员、用电检查人员和计量工作人员利用计量异常报警功能和电能量数据查询功能开展用户用电情况的在线监控,通过采集电量异常、负荷异常、终端报警、主站报警、线损异常等信息,建立数据分析模型,来实时监测窃漏电情况和计量装置故障。根据报警事件发生前后客户计量点有关的电流、电压、负荷数据情况等,构建基于指标加权的用电异常分析模型,实现检查客户是否存在窃电、违章用电及计量装置故障等。
以上防漏诊断方法,虽然能获得用户异常的某些信息,但无法达到真正快速精准定位。现有电力计量自动化系统能采集到各相电流电压、功率因数等用电负荷数据以及用电异常等终端报警信息。若能通过这些数据信息提取出窃漏电用户的关键特征,构建识别模型,就能自动检测判断用户是否存在窃漏电行为。
本次建模目标:
1、归纳出窃漏电用户的特征,构建窃漏电用户的识别模型;
2、利用实时监测数据,调用窃漏电用户识别模型实现实时诊断。
二、分析方法与过程
数据抽取
数据分析
分布分析发现非居民类别不存在窃漏电情况,在分析中不考虑。
周期性分析,正常用户用电平稳,窃漏电用电量持续下降。
数据预处理
1、数据清洗
2、缺失值处理
3、数据变换
4、构建专家样本
5、构建模型
(1)数据划分
data1 <- read.csv("model.csv")colnames(data1) <- c("time","userid","ele_ind","loss_ind","alarm_ind","class")set.seed(1234)ind <- sample(2,nrow(data1),replace = TRUE,prob = c(0.8,0.2))traindata <- data1[ind==1,]testdata <- data1[ind==2,]write.csv(traindata,"traindata.csv",row.names = FALSE)write.csv(testdata,"testdata.csv",row.names = FALSE)
(2)神经网络
traindata = read.csv("traindata.csv")traindata <- transform(traindata,class=as.factor(class))library(nnet)nnet.model <- nnet(class ~ ele_ind+loss_ind+alarm_ind,traindata,size=10,decay=0.05)summary(nnet.model)confusion <- table(traindata$class,predict(nnet.model,traindata,type="class"))accuracy <- sum(diag(confusion))*100/sum(confusion)output_nnet.traindata = cbind(traindata,predict(nnet.model,traindata,type="class"))colnames(output_nnet.traindata) <- c(colnames(traindata),"output")write.csv(output_nnet.traindata,"output_nnet.traindata.csv",row.names = FALSE)save(nnet.model,file = "nnet.model.RData")
nnet(formula, data, …,,size,decay,maxit)
建立模型的公式,训练集,隐藏层中的节点个数,模型权重值的衰减程度,模型最大迭代次数。
(3)CART决策树
traindata = read.csv("traindata.csv")traindata <- transform(traindata,class=as.factor(class))library(tree)tree.model <- tree(class ~ ele_ind+loss_ind+alarm_ind,traindata)summary(tree.model)plot(tree.model)text(tree.model)confusion <- table(traindata$class,predict(tree.model,traindata,type="class"))accuracy <- sum(diag(confusion))*100/sum(confusion)output_tree.traindata = cbind(traindata,predict(tree.model,traindata,type="class"))colnames(output_tree.traindata) <- c(colnames(traindata),"output")write.csv(output_tree.traindata,"output_tree.traindata.csv",row.names = FALSE)save(tree.model,file = "tree.model.RData")
6、模型评价
testdata = read.csv("testdata.csv")load("tree.model.RData")load("nnet.model.RData")library(ROCR)nnet.pred <- prediction(predict(nnet.model,testdata),testdata$class)nnet.perf <- performance(nnet.pred,"tpr","fpr")plot(nnet.perf)tree.pred <- prediction(predict(tree.model,testdata)[,2],testdata$class)tree.perf <- performance(tree.pred,"tpr","fpr")plot(tree.perf)