【数据挖掘实战】——电力窃漏电用户自动识别

news2024/9/20 5:30:30

在这里插入图片描述

【数据挖掘实战】——电力窃漏电用户自动识别

  • 一、背景和挖掘目标
  • 二、分析方法与过程
    • 1、初步分析
    • 2、数据抽取
    • 3、探索分析
    • 4、数据预处理
    • 5、构建专家样本
  • 三、构建模型
    • 1、构建窃漏电用户识别模型
    • 2、模型评价
    • 3、进行窃漏电诊断
  • 拓展思考

项目代码地址:https://gitee.com/lingxw123/datamining_project.git
项目来源于《数据分析与挖掘实战》

一、背景和挖掘目标

传统的防窃漏电方法主要通过定期巡检、定期校验电表、用户举报窃电等方法来发现窃电或计量装置故障。但这种方法对人的依赖性太强,抓窃查漏的目标不明确。目前,很多供电局主要通过营销稽查人员、用电检查人员和计量工作人员利用计量异常报警功能和电能量数据查询功能开展用户用电情况的在线监控工作,通过采集电量异常、负荷异常、终端报警、主站报警、线损异常等信息,建立数据分析模型,来实时监测窃漏电情况和发现计量装置的故障。根据报警事件发生前后客户计量点有关的电流、电压、负荷数据情况等,构建基于指标加权的用电异常分析模型,实现检查客户是否存在窃电、违章用电及计量装置故障等。

以上防窃漏电的诊断方法,虽然能获得用电异常的某些信息,但由于终端误报或漏报过多,无法达到真正快速精确定位窃漏电嫌疑用户的目的,往往令稽查工作人员无所适从。而且在采用这种方法建模时,模型各输入指标权重的确定需要用专家的知识和经验来判断,具有很大的主观性,存在明显的缺陷,所以实施效果往往不尽如人意。

现有的电力计量自动化系统能够采集到各相电流、电压、功率因数等用电负荷数据以及用电异常等终端报警信息。异常告警信息和用电负荷数据能够反映用户的用电情况,同时稽查工作人员也会通过在线稽查系统和现场稽查来找出窃漏电用户,并录入系统。若能通过这些数据信息提取出窃漏电用户的关键特征,构建窃漏电用户的识别模型,就能自动检查、判断用户是否存在窃漏电行为。
在这里插入图片描述
表6-1给出了某企业大用户的用电负荷数据,采集时间间隔为15分钟,即0.25小时,可进一步计算该大用户的用电量。表6-2给出了该企业大用户的终端报警数据,其中与窃漏电相关的报警能较好的识别用户的窃漏电行为。表6-3给出了某企业大用户违约、窃电处理通知书,表中记录了用户的用电类别和窃电时间。
在这里插入图片描述

本次数据挖掘建模目标如下。
1)归纳出窃漏电用户的关键特征,构建窃漏电用户的识别模型。
2)利用实时监测数据,调用窃漏电用户识别模型实现实时诊断。
在这里插入图片描述

二、分析方法与过程

1、初步分析

  • 窃漏电用户在电力计量自动化系统的监控大用户中只占一小部分,同时某些大用户也不可能存在窃漏电行为,如银行、税务、学校和工商等非居民类别,故在数据预处理时有必要将这些类别用户剔除。
  • 系统中的用电负荷不能直接体现出用户的窃漏电行为,终端报警存在很多误报和漏报的情况,故需要进行数据探索和预处理,总结窃漏电用户的行为规律,再从数据中提炼出描述窃漏电用户的特征指标。
  • 最后结合历史窃漏电用户信息,整理出识别模型的专家样本数据集,再进一步构建分类模型,实现窃漏电用户的自动识别。
    总体流程
    1)从电力计量自动化系统、营销系统有选择性地抽取部分大用户用电负荷、终端报警及违约窃电处罚信息等原始数据。
    2)对样本数据探索分析,剔除不可能存在窃漏电行为行业的用户,即白名单用户,初步审视正常用户和窃漏电用户的用电特征。
    3)对样本数据进行预处理,包括数据清洗、缺失值处理和数据变换。
    4)构建专家样本集
    5)构建窃漏电用户识别模型
    6)在线监测用户用电负荷及终端报警,调用模型实现实时诊断。

2、数据抽取

  • 与窃漏电相关的原始数据主要有用电负荷数据、终端报警数据、违约窃电处罚信息以及用户档案资料等。
  • 为了尽可能全面覆盖各种窃漏电方式,建模样本要包含不同用电类别的所有窃漏电用户及部分正常用户。窃漏电用户的窃漏电开始时间和结束时间是表征其窃漏电的关键时间节点,在这些时间节点上,用电负荷和终端报警等数据也会有一定的特征变化,故样本数据抽取时务必要包含关键时间节点前后一定范围的数据。
  • 抽取近5年来所有的窃漏电用户有关数据和部分不同用电类别正常用电用户的有关数据。

3、探索分析

  • 窃漏电用户分布分析
    在这里插入图片描述
  • 用电量周期性分析
    在这里插入图片描述
    在这里插入图片描述

4、数据预处理

数据清洗:从业务以及建模的相关需要方面考虑,筛选出需要的数据

  • 通过数据的探索分析,发现在用电类别中,非居民用电类别不可能存在漏电窃电的现象,需要将非居民用电类别的用电数据过滤掉。
  • 结合本案例的业务,节假日用电量与工作日相比,会明显偏低。为了尽可能达到较好数据效果,过滤节假日的用电数据。
    在这里插入图片描述缺失值处理:在原始计量数据,特别是用户电量抽取过程中,发现存在缺失的现象。若将这些值抛弃掉,会严重影响后续分析结果。
    在这里插入图片描述
    拉格朗日插值的代码:
# -*- coding: utf-8 -*-
# 拉格朗日插值代码
import pandas as pd  # 导入数据分析库Pandas
from scipy.interpolate import lagrange  # 导入拉格朗日插值函数

inputfile = '../data/missing_data.xls'  # 输入数据路径,需要使用Excel格式;
outputfile = '../tmp/missing_data_processed.xls'  # 输出数据路径,需要使用Excel格式

data = pd.read_excel(inputfile, header=None)  # 读入数据


# 自定义列向量插值函数
# s为列向量,n为被插值的位置,k为取前后的数据个数,默认为5
def ployinterp_column(s, n, k=5):
    y = s[list(range(n - k, n)) + list(range(n + 1, n + 1 + k))]  # 取数
    y = y[y.notnull()]  # 剔除空值
    return lagrange(y.index, list(y))(n)  # 插值并返回插值结果


# 逐个元素判断是否需要插值
for i in data.columns:
    for j in range(len(data)):
        if (data[i].isnull())[j]:  # 如果为空即插值。
            data[i][j] = ployinterp_column(data[i], j)

data.to_excel(outputfile, header=None, index=False)  # 输出结果

**数据变换:**电量趋势下降指标、线损指标、告警类指标。
在这里插入图片描述
从正常用电到窃漏电特征分析:
对统计当天设定前后5天为统计窗口期,计算这11天内的电量趋势下降情况,首先计算这11天的每天的电量趋势,计算第i天的用电量趋势是考虑前后5天期间的用电量斜率,即:
在这里插入图片描述
若电量趋势为不断下降的,则认为具有一定的窃电嫌疑,故计算这11天内,当天比前一天用电量趋势为递减的天数,即设有
在这里插入图片描述
线路的线损率可作为用户线损率的参考值,若用户发生窃漏电,则当天的线损率会下降,但由于用户每天的用电量存在波动,单纯以当天线损率下降了作为窃漏电特征则误差过大,所以考虑前后几天的线损率平均值,判断其增长率是否大于1%,若线损率的增长率大于1%则具有窃漏电的可能性。
对统计当天设定前后5天为统计窗口期,首先分别计算统计当天与前5天之间的线损率平均值 和统计当天与后5天之间的线损率平均值 ,若 比 的增长率大于1%,则认为具有一定的窃电嫌疑,故定义线损指标:
在这里插入图片描述
告警类指标:
与窃漏电相关的终端报警主要有电压缺相、电压断相、电流反极性等告警,计算发生与窃漏电相关的终端报警的次数总和,作为告警类指标。

5、构建专家样本

对2009年1月1日至2014年12月31日所有窃漏电用户及部分正常用户的电量、告警及线损数据和该用户在当天是否窃漏电的标识,按窃漏电评价指标进行处理,得到专家样本库。
在这里插入图片描述

三、构建模型

1、构建窃漏电用户识别模型

  对专家样本随机选取20%的作为测试样本,剩下80%的作为训练样本。
  • LM神经网络建模
    由混淆矩阵(训练样本),可以算得分类准确率为(161+58)/(161+58+6+7)=94.4%,正常用户被误判为窃漏电用户占正常用户的7/(161+7)=4.2%,窃漏电用户被误判为正常用户占正常窃漏电用户的6/(6+58)=9.4%。
# -*- coding: utf-8 -*-
# 构建并测试CART决策树模型

import pandas as pd  # 导入数据分析库
from random import shuffle  # 导入随机函数shuffle,用来打算数据

from matplotlib import pyplot as plt

datafile = '../data/model.xls'  # 数据名
data = pd.read_excel(datafile)  # 读取数据,数据的前三列是特征,第四列是标签
data = data.as_matrix()  # 将表格转换为矩阵
shuffle(data)  # 随机打乱数据

p = 0.8  # 设置训练数据比例
train = data[:int(len(data) * p), :]  # 前80%为训练集
test = data[int(len(data) * p):, :]  # 后20%为测试集

# 构建CART决策树模型
from sklearn.tree import DecisionTreeClassifier  # 导入决策树模型

treefile = '../tmp/tree.pkl'  # 模型输出名字
tree = DecisionTreeClassifier()  # 建立决策树模型
tree.fit(train[:, :3], train[:, 3])  # 训练

# 保存模型
from sklearn.externals import joblib

joblib.dump(tree, treefile)

from cm_plot import *  # 导入自行编写的混淆矩阵可视化函数

cm_plot(train[:, 3], tree.predict(train[:, :3])).show()  # 显示混淆矩阵可视化结果
# 注意到Scikit-Learn使用predict方法直接给出预测结果。


from sklearn.metrics import roc_curve  # 导入ROC曲线函数

fpr, tpr, thresholds = roc_curve(test[:, 3], tree.predict_proba(test[:, :3])[:, 1], pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label='ROC of CART', color='green')  # 作出ROC曲线
plt.xlabel('False Positive Rate')  # 坐标轴标签
plt.ylabel('True Positive Rate')  # 坐标轴标签
plt.ylim(0, 1.05)  # 边界范围
plt.xlim(0, 1.05)  # 边界范围
plt.legend(loc=4)  # 图例
plt.show()  # 显示作图结果

在这里插入图片描述

  • CART决策树建模
    由混淆矩阵(训练样本),分类准确率为(160+56)/(160+56+3+13)=93.1%,正常用户被误判为窃漏电用户占正常用户的13/(13+160)=7.5%,窃漏电用户被误判为正常用户占正常窃漏电用户的3/(3+56)=5.1%。
# -*- coding: utf-8 -*-

import pandas as pd
from random import shuffle

datafile = '../data/model.xls'
data = pd.read_excel(datafile)
data = data.as_matrix()
shuffle(data)

p = 0.8  # 设置训练数据比例
train = data[:int(len(data) * p), :]
test = data[int(len(data) * p):, :]

# 构建LM神经网络模型
from keras.models import Sequential  # 导入神经网络初始化函数
from keras.layers.core import Dense, Activation  # 导入神经网络层函数、激活函数

netfile = '../tmp/net.model'  # 构建的神经网络模型存储路径

net = Sequential()  # 建立神经网络
net.add(Dense(input_dim=3, output_dim=10))  # 添加输入层(3节点)到隐藏层(10节点)的连接
net.add(Activation('relu'))  # 隐藏层使用relu激活函数
net.add(Dense(input_dim=10, output_dim=1))  # 添加隐藏层(10节点)到输出层(1节点)的连接
net.add(Activation('sigmoid'))  # 输出层使用sigmoid激活函数
net.compile(loss='binary_crossentropy', optimizer='adam', class_mode="binary")  # 编译模型,使用adam方法求解

net.fit(train[:, :3], train[:, 3], nb_epoch=1000, batch_size=1)  # 训练模型,循环1000次
net.save_weights(netfile)  # 保存模型

predict_result = net.predict_classes(train[:, :3]).reshape(len(train))  # 预测结果变形
'''这里要提醒的是,keras用predict给出预测概率,predict_classes才是给出预测类别,而且两者的预测结果都是n x 1维数组,而不是通常的 1 x n'''

from cm_plot import *  # 导入自行编写的混淆矩阵可视化函数

cm_plot(train[:, 3], predict_result).show()  # 显示混淆矩阵可视化结果

from sklearn.metrics import roc_curve  # 导入ROC曲线函数

predict_result = net.predict(test[:, :3]).reshape(len(test))
fpr, tpr, thresholds = roc_curve(test[:, 3], predict_result, pos_label=1)
plt.plot(fpr, tpr, linewidth=2, label='ROC of LM')  # 作出ROC曲线
plt.xlabel('False Positive Rate')  # 坐标轴标签
plt.ylabel('True Positive Rate')  # 坐标轴标签
plt.ylim(0, 1.05)  # 边界范围
plt.xlim(0, 1.05)  # 边界范围
plt.legend(loc=4)  # 图例
plt.show()  # 显示作图结果

在这里插入图片描述
混淆矩阵的函数代码:

def cm_plot(y, yp):
  
  from sklearn.metrics import confusion_matrix #导入混淆矩阵函数

  cm = confusion_matrix(y, yp) #混淆矩阵
  
  import matplotlib.pyplot as plt #导入作图库
  plt.matshow(cm, cmap=plt.cm.Greens) #画混淆矩阵图,配色风格使用cm.Greens,更多风格请参考官网。
  plt.colorbar() #颜色标签
  
  for x in range(len(cm)): #数据标签
    for y in range(len(cm)):
      plt.annotate(cm[x,y], xy=(x, y), horizontalalignment='center', verticalalignment='center')
  
  plt.ylabel('True label') #坐标轴标签
  plt.xlabel('Predicted label') #坐标轴标签
  return plt

2、模型评价

用测试样本对两个模型进行评价,评价方法采用ROC曲线进行评估。
经过对比发现LM神经网络的ROC曲线比CART决策树的ROC曲线更加靠近单位方形的左上角,LM神经网络ROC曲线下的面积更大,说明LM神经网络模型的分类性能较好,能应用于窃漏电用户识别。

  • LM神经网络在测试样本下的ROC曲线
    在这里插入图片描述
  • CART决策树在测试样本下的ROC曲线
    在这里插入图片描述

3、进行窃漏电诊断

在这里插入图片描述

拓展思考

  • 目前企业偷漏税现象泛滥,应该加大对企业偷漏税行为的防范工作。如何用数据挖掘的思想,智能的识别企业偷漏税行为,有力的打击企业偷漏税的违法行为。
  • 汽车销售行业,通常是指销售汽车整车的行业。汽车销售行业在税收上存在少开发票金额、少计收入,上牌、按揭 、保险等一条龙服务未入帐反映,不及时确认保修索赔款等多种情况,导致政府损失大量税收。汽车销售企业的部分经营指标能一定程度上评估企业的偷漏税倾向。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LaoCat带你认识容器与镜像(实践篇二下)

实践篇主要以各容器的挂载和附加命令为主。 本章内容 本文实操全部基于Ubuntu 20.04 宿主机 > linux服务器本身 Docker > 20.10.22 接上章内容,接下来该章围绕Docker安装并运行之RabbitMQ、ElasticSearch,大部分命令来源于DockerHub官网&#xf…

Apache日志分析器

您的Apache HTTP服务器生成的日志数据是信息的宝库。使用这些信息,您可以判断您服务器的使用情况、找出漏洞所在,并设法改进服务器结构和整体性能。审核您的Apache日志可在以下情况派上用场,其中包括:识别和纠正频繁出现的错误以增…

github相关

1.本地项目上传到远程github 1.1github上创建项目 1)github上创建项目 2)复制地址 1.2上传自己的项目 1)本地项目目录下执行 git init “git init”命令用于创建git仓库,其可以在一个已有的非git项目的根目录下执行,把已有项目初始化成为git仓库&…

微服务实战--高级篇:多级缓存:Nginx本地缓存、Redis、Tomcat、JVM缓存、数据库

多级缓存 1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 Redis缓存失效时…

模型部署综述

https://github.com/leeguandong/KuaiZaihttps://github.com/leeguandong/KuaiZaiAI 框架部署方案之模型部署概述 - 知乎文小P 家的 1011010 概述模型训练重点关注的是如何通过训练策略来得到一个性能更好的模型,其过程似乎包含着各种“玄学”,被戏称为“…

全局异常处理--Java实战项目篇

系列文章目录 Java后端开发功能模块思路 Spring Boot自动配置–如何切换内置Web服务器 Spring Boot读取配置文件内容的三种方式 该系列文章持续更新,更多的文章请点击我的主页查看哦! 文章目录系列文章目录前言一、出现的问题二、解决问题的方法1. 添加…

iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?

在升级最新的 iOS 16.3 系统后,有些用户可能遇到了个别应用无法正常打开,卡死的异常情况。大家可以尝试通过如下方式解决问题。 1.重新启动应用: 如果应用出现卡死或闪退,可从 iPhone 屏幕由底往上滑(或连续按两次 H…

Java变量和数据类型,超详细整理,适合新手入门

目录 一、什么是变量? 二、变量 变量值互换 三、基本数据类型 1、八种基本数据类型 2、布尔值 3、字符串 四、从控制台输入 一、什么是变量? 变量是一种存储值的容器,它可以在程序的不同部分之间共享;变量可以存储数字、字…

C语言进阶——通讯录模拟实现

🌇个人主页:_麦麦_ 📚今日名言:只有走在路上,才能摆脱局限,摆脱执着,让所有的选择,探寻,猜测,想象都生机勃勃。——余秋雨《文化苦旅》 目录 一、前言 二、正…

让我百思不得其解的infer究竟是怎么推导类型的?

情景再现 有这么一个条件类型的基本语法: T extends U ? X : Y; 如果占位符类型U是一个可以被分解成几个部分的类型,譬如数组类型,元组类型,函数类型,字符串字面量类型等。这时候就可以通过infer来获取U类型中某个部分的类型。 …

95后外贸SOHO,年入7位数,他究竟是怎么做的?

外贸SOHO,一年到底能挣多少钱?有人说:“勤勤恳恳,年薪也就十来万吧”;也有人说:“100万而已我早就已经挣到了”;还有人说:“谁说新手难出头?我做跨境半年赚200万&#xf…

Linux设备驱动移植

目录 一、设备树 1.1设备树 1.2设备树文件 1.3设备树语法 1.4Linux内核驱动移植 二、网卡驱动 2.1在make menuconfig界面中选中要安装的驱动 2.2在设备树中添加/修改相应的设备信息 2.3修改时钟 2.4修改eMMc 2.5编译测试 一、设备树 1.1设备树 设备树是一种描述硬…

MATLAB 粒子群算法

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。 🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心&…

Cy5 Alkyne,1223357-57-0,花青素Cyanine5炔基,氰基5炔烃

CAS号:1223357-57-0 | 英文名: Cyanine5 alkyne,Cy5 Alkyne | 中文名:花青素CY5炔基CASNumber:1223357-57-0Molecular formula:C35H42ClN3OMolecular weight:556.19Purity:95%Appear…

全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法

文章目录1. 文章引言2. 分析问题3. 解决问题3.1 方法1:全局配置方式3.2 方法2:非null字段验证策略3.3 方法3:通过注解的方式4. 总结1. 文章引言 在开发的过程中,我们经常使用MyBatis-Plus的updateById方法更新数据表,…

ChatGPT学习心得一(使用node+react做了一个案例)

项目地址 http://chat.xutongbao.top 项目截图 使用技术栈 nodeSQLiteredisnginxlog4jsexpressjenkinscdnreactantdreact-scrollbars-customiconfontwebpackpostmanaxiosreduximmutablenpmyarnopenai等等 官网 https://openai.com/blog/chatgpt/ 官方聊天应用 https://ch…

【Linux】多线程编程 - 同步/条件变量/信号量

目录 一.线程同步 1.什么是线程同步 2.为什么需要线程同步 3.如何实现线程同步 二.条件变量 1.常见接口以及使用 2.wiat/signal中的第二个参数mutex的意义 3.代码验证 三.POSIX信号量 1.概念 2.常见接口以及使用 四.条件变量vsPOSIX信号量 一.线程同步 1.什么是线…

公链“私”用

发表时间:2022年3月17日 信息来源:bsvblockchain.org 虽然区块链行业已经诞生了十多年,但直到最近几年这个行业才开始走向专业化并日趋成熟,现在它已成为了一种可为企业实用范例提供合法解决方案的技术。 早年间,与这…

基于ubuntu20.4的wine的MDK5软件的安装

本文基于ubuntu20.4安装MDK5的keil软件,由于MDK不提供linux版本的安装软件,因此需要利用wine软件来安装MDK5软件,具体流程包括wine软件安装、MDK5安装及MDK5的lic添加等3部分内容。具体流程如下所示: (一)…

typescript 路径别名问题(别名设置 开发与打包时路径问题)

在使用TS开发时,一般我们会在tsconfig 中设置别名来让代码变得优雅一点。 将 import xx from …/…/…/service/改为import xx form ‘service/’ tsconfig 别名设置 此时项目结构如下 一般我们可以通过baseUrl 和path两个字段来设置对应的别名 {"include…