【数据挖掘】EDA——以2022雪浪算力开发者大赛数据为例

news2024/9/27 21:20:15

作者简介:重庆大学22级研一,研究方向:时空数据挖掘、图神经网络。目前正在学习大数据、数据挖掘等相关知识,希望毕业后能找到数据相关岗位。

前言

之前写了一个比赛复盘(【竞赛复盘】2022雪浪算力开发者大赛——阀体异常检测),发现自己存在的问题主要包括EDA做的不到位。这篇文章就以这个比赛的数据为例,简单的做一些EDA分析。没有系统学过EDA,本文内容是自己的一些拙见,还请大佬批评指正。

题目类型

首先说明一下题目类型:二分类、异常检测、时间序列。根据此,可以从以下几个方面做EDA:

  • 两类样本的原始序列、衍生特征
  • 能够凸显时间序列异常的特征

数据准备

(数据说明可以看复盘的文章)针对部分传感器,各取50个样本,正常样本与异常样本分开。

代码:

def get_files_list(path, station, sensor, file_num=50):
    """获取path路径下num个阀体的单个特征的list,返回一个dict""" 
    list_dict = {}

    for sample in os.listdir(os.path.join(path,station,sensor)): 
        list_dict['/'.join([station, sensor, sample])] = pd.read_csv(os.path.join(path, station, sensor, sample)).iloc[:, 0]
        if len(list_dict) == file_num:
            return list_dict
    return list_dict

# 部分传感器
sample_dict = {
    'P1010': [
        'MeasuredData_Pressure_Line_Input_Raw', 'MeasuredData_Temperature_Pipe_Raw',
        'Report_P1010_Pressure_Clamping', 'Report_P1010_Temperature_Pipe'
    ],
    'P1030': [
        'MeasuredData_Current_Reference_Raw', 'MeasuredData_Pressure_Clamping_Raw', 'MeasuredData_Pressure_Line_Input_Raw', 'MeasuredData_Temperature_Pipe_Raw',
        'Report_P1030_PI-Hysteresis-Limit_LCL_2nd_X', 'Report_P1030_Pressure-Amplitude_Rising_Y', 'Report_P1030_PI-Hysteresis-Limit_LCL_2nd_Y'
    ],
    'P1090': [
        'MeasuredData_Current_Reference_Filter', 'MeasuredData_I_Act_EVEN-PPV1_Filter', 'MeasuredData_Pressure_Line_Input_Filter',
        'Report_P1090_FI-Characteristic_Falling_Y', 'Report_P1090_FI-Characteristic-Limit_UCL_X', 'Report_P1090_Force-Amplitude_Rising_LCL_X'
    ],
    'P1130': [
        'MeasuredData_Flow_Axis_LUB_Raw', 'MeasuredData_Pressure_Line_Input_Raw', 'MeasuredData_Flow_Pump_Recycle_Raw',
        'Report_P1130_Flow_Clutch_LUB', 'Report_P1130_Flow_Pump_Recycle', 'Report_P1130_Flow_Axis_LUB'
    ]
}

# 获取异常样本
ng_valve_names = []
ng_datas = []
for station, sensors in sample_dict.items():
    for sensor in sensors:
        l = get_files_list(NG_PATH, station, sensor, file_num=50)
        ng_valve_names.extend(list(l.keys()))
        ng_datas.extend(l.values())  
    
# 获取异常样本
ok_valve_names = []
ok_datas = []
for station, sensors in sample_dict.items():
    for sensor in sensors:
        l = get_files_list(OK_PATH, station, sensor, file_num=50)
        ok_valve_names.extend(list(
            l.keys()))
        ok_datas.extend(l.values())  

数据分析

统计特征分析

对样本的均值方差标准差最小值最大值可视化。

代码:

import math

def show_diff_on_line(x, ys, labels, colors, title, figsize=(20, 3), dpi=100):    
    """用折线图显示不同样本的区别"""
    plt.figure(figsize=figsize,dpi=dpi)
    for i, y in enumerate(ys):
        color = colors[i]
        label = labels[i]
        plt.plot(x, y, color=color, label=label)
    
    plt.grid()
    plt.title(title)
    plt.legend(loc='upper right')
    plt.show()
x = range(len(ng_datas))

# mean
ng_means = [data.mean() for data in ng_datas]
ok_means = [data.mean() for data in ok_datas]
show_diff_on_line(x, [ng_means, ok_means], ['ng', 'ok'], ['red', 'blue'], 'mean')

# var
ng_vars = [data.var() for data in ng_datas]
ok_vars = [data.var() for data in ok_datas]
show_diff_on_line(x, [ng_vars, ok_vars], ['ng', 'ok'], ['red', 'blue'], 'var')

# std
ng_stds = [data.std() for data in ng_datas]
ok_stds = [data.std() for data in ok_datas]
show_diff_on_line(x, [ng_stds, ok_stds], ['ng', 'ok'], ['red', 'blue'], 'std')

# min
ng_mins = [data.min() for data in ng_datas]
ok_mins = [data.min() for data in ok_datas]
show_diff_on_line(x, [ng_mins, ok_mins], ['ng', 'ok'], ['red', 'blue'], 'min')

# max
ng_mins = [data.max() for data in ng_datas]
ok_mins = [data.max() for data in ok_datas]
show_diff_on_line(x, [ng_mins, ok_mins], ['ng', 'ok'], ['red', 'blue'], 'var')

结果:
在这里插入图片描述

结论:

  • 索引在600之前的样本在这些特征上基本没有区别,无法区分两类样本
  • 索引在[700, 800]之间的样本在meanstdvar特征上有明显区别,可以作为分类的特征

分布特征分析

对数据的四分位点峰度偏度分析。
代码:

# 25%
ng_25s = [data.quantile(.25) for data in ng_datas]
ok_25s = [data.quantile(.25) for data in ok_datas]
show_diff_on_line(x, [ng_25s, ok_25s], ['ng', 'ok'], ['red', 'blue'], '25%')

# 50%
ng_50s = [data.quantile(.50) for data in ng_datas]
ok_50s = [data.quantile(.50) for data in ok_datas]
show_diff_on_line(x, [ng_50s, ok_50s], ['ng', 'ok'], ['red', 'blue'], '50%')

# 75%
ng_75s = [data.quantile(.75) for data in ng_datas]
ok_75s = [data.quantile(.75) for data in ok_datas]
show_diff_on_line(x, [ng_75s, ok_75s], ['ng', 'ok'], ['red', 'blue'], '75%')

# skew 
ng_skews = [data.skew() for data in ng_datas]
ok_skews = [data.skew() for data in ok_datas]
show_diff_on_line(x, [ng_skews, ok_skews], ['ng', 'ok'], ['red', 'blue'], 'skew')

# kurt
ng_kurts = [data.kurt() for data in ng_datas]
ok_kurts = [data.kurt() for data in ok_datas]
show_diff_on_line(x, [ng_kurts, ok_kurts], ['ng', 'ok'], ['red', 'blue'], 'kurt')

结果:
在这里插入图片描述
结论:

  • 峰度、偏度基本没有区别
  • 索引在[700, 750]的样本在四分位点上差异较大

分析到这里,可以观察到:索引在600之前的样本在这些衍生特征上都没有明显差异,所以可以假设这些传感器不利于分类。

但需要注意的是,这里分析的是单个传感器的特征。这种分析只能说明单个传感器的衍生特征不利于分类,而至于这些传感器和其他传感器是否相互影响,他们的组合衍生特征是否有利于分类,不得而知。由于组合特征比较麻烦,本文暂时就分析到这里。

异常特征差异

箱线图异常点占比正态分布异常点占比分析。

代码:

def get_box_outliers(s: pd.Series):
	"""返回箱线图异常点"""
    q1, q3 = s.quantile(.25), s.quantile(.75)
    iqr = q3 - q1
    low, up = q1 - 1.5*iqr, q3 + 1.5*iqr 
    outliers = s[(s > up) | (s < low)]
    return outliers

def get_normal_outliers(s: pd.Series):
	"""返回正态分布异常点"""
    low = s.mean() - 3 * s.std()
    up = s.mean() + 3 * s.std()
    outliers = s[(s > up) | (s < low)]
    return outliers

x = range(len(ng_datas))
ng_outliers = [len(get_box_outliers(data)) / len(data) if len(data) != 0 else 0 for data in ng_datas ]
ok_outliers = [len(get_box_outliers(data)) / len(data) if len(data) != 0 else 0 for data in ok_datas]
show_diff_on_line(x, [ng_outliers, ok_outliers], ['ng', 'ok'], ['red', 'blue'], 'box-line outliers')

ng_outliers = [len(get_normal_outliers(data)) / len(data) if len(data) != 0 else 0 for data in ng_datas ]
ok_outliers = [len(get_normal_outliers(data)) / len(data) if len(data) != 0 else 0 for data in ok_datas]
show_diff_on_line(x, [ng_outliers, ok_outliers], ['ng', 'ok'], ['red', 'blue'], '3σ outliers')

结果:
在这里插入图片描述
结论:

  • 索引在800之后的样本的这两个特征差异较大,有利于分类
  • 箱线图异常点比例 比 正态分布异常点比例 更容易区分两类样本

总结

  • 由于通常数据量较大,不可能对所有样本的所有特征进行EDA。本文中采取的是抽样的方式进行分析,分析结论有一定的局限性,但结论也对于建模有一定的帮助,可以通过建模的结果来对EDA进行改进、完善
  • 本文采用的都是折线图,所得结论有限。后续进一步学习数据分析,了解有哪些常用于时间序列分析的特征以及图表

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

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

相关文章

Python脚本之准备测试环境的用户数据

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/127645678 这期是讲述下 我准备测试环境用户数据的经历。 【实际这篇博客推迟发布N个月】 个人博客&#xff1a;https://blog.csdn.…

【读书笔记】《深入浅出数据分析》第三章 寻找最大值

目录 一&#xff0c;Excel却是最基础、最高频、最有机会展示的一款数据分析工具二&#xff0c;作为数据工作者&#xff0c;实际工作中&#xff0c;不管用不用的上&#xff0c;至少到达会的水准1&#xff0c;常用函数2&#xff0c;透视表3&#xff0c;可视化4&#xff0c;数据分…

【RabbitMQ笔记04】消息队列RabbitMQ七种模式之发布订阅模式(Publish/Subscribe)

这篇文章&#xff0c;主要介绍消息队列RabbitMQ七种模式之发布订阅模式&#xff08;Publish/Subscribe&#xff09;。 目录 一、发布订阅模式 1.1、Exchange交换机 &#xff08;1&#xff09;什么是Exchange交换机呢&#xff1f;&#xff1f;&#xff1f; &#xff08;2&am…

数据结构与算法----问答2023

1、什么是哈希表&#xff1f;如何解决碰撞&#xff1f; 哈希表&#xff08;Hash Table&#xff09;&#xff0c;也称为散列表&#xff0c;是一种用于实现字典&#xff08;键值对&#xff09;数据结构的数据结构。它将键映射到哈希表中的一个索引&#xff08;桶&#xff09;来保…

从零开始学习iftop流量监控(找出服务器耗费流量最多的ip和端口)

一、iftop是什么iftop是类似于top的实时流量监控工具。作用&#xff1a;监控网卡的实时流量&#xff08;可以指定网段&#xff09;、反向解析IP、显示端口信息等官网&#xff1a;http://www.ex-parrot.com/~pdw/iftop/二、界面说明>代表发送数据&#xff0c;< 代表接收数…

DHCP服务器的使用以及可能出现的问题(图文详细版)

DHCP服务的使用 开始&#xff0d;管理工具&#xff0d;DHCP,打开DHCP服务器选项窗口 新建作用域 在此处输入名称和描述,单击下一步 随机确定一组IP地址的范围,并指定其子网掩码 , 单击下一步 若想要排除某一个/组特定的IP地址,我们可以在此界面输入该IP地址,若没有,则可…

CTFHub | 前端验证

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

django项目部署(腾讯云服务器centos)

基本步骤&#xff1a; 购买腾讯云服务器并配配置好 >> 本地项目依赖收集准备 >> 上传项目等文件到服务器 >> 服务器安装部署软件和python环境 >> 开始部署&#xff08;全局来看就这5个步骤&#xff09; 目录 目录 1. 购买腾讯云服务器并配配置好 …

【算法设计技巧】分治算法

分治算法 用于设计算法的另一种常用技巧为分治算法(divide and conquer)。分治算法由两部分组成&#xff1a; 分(divide)&#xff1a;递归解决较小的问题(当然&#xff0c;基准情况除外)治(conquer)&#xff1a;然后&#xff0c;从子问题的解构建原问题的解。 传统上&#x…

升级日记本-课后程序(JAVA基础案例教程-黑马程序员编著-第七章-课后作业)

【实验7-4】 升级版日记本 【任务介绍】 1.任务描述 本案例要求编写一个模拟日记本的程序&#xff0c;通过在控制台输入指令&#xff0c;实现在本地新建日记本、打开日记本和修改日记本等功能。 用户输入指令1代表“新建日记本”&#xff0c;可以从控制台获取用户输入的日记…

物联网MQTT协议简单介绍

物联网曾被认为是继计算机、互联网之后&#xff0c;信息技术行业的第三次浪潮。随着基础通讯设施的不断完善&#xff0c;尤其是 5G 的出现&#xff0c;进一步降低了万物互联的门槛和成本。物联网本身也是 AI 和区块链应用很好的落地场景之一&#xff0c;各大云服务商也在纷纷上…

mysql8.0-日志

目录 错误日志 错误日志主要记录如下几种日志&#xff1a; 查询日志 测试 慢查询日志 二进制日志 日志格式 日志查看 修改日志格式 二进制日志的删除 二进制日志的还原 错误日志 错误日志是MySQL中最重要的日志之一&#xff0c;它记录了当mysql启动和停止时&#xff0c;…

【Python基础】类

面向对象编程 面向对象编程是最有效的软件编写方法之一。面向对象是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 面向对象和面向过程的区别 比如我想吃西红柿炒蛋&#xff0c;怎么运用面向过程的方法来解决这个问题呢&#xff1f;…

怕上当?来看这份网络钓鱼和诈骗技术趋势

网络钓鱼和诈骗&#xff1a;当前的欺诈类型 网络钓鱼 钓鱼者可以攻击任何在线服务——银行、社交网络、政府门户网站、在线商店、邮件服务、快递公司等——中的证书。但是&#xff0c;顶级品牌的客户往往面临更大风险&#xff0c;因为相比小品牌&#xff0c;人们更喜欢使用和…

12 个适合做外包项目的开源后台管理系统

1.D2admin 开源地址&#xff1a;https://github.com/d2-projects/d2-admin 文档地址&#xff1a;https://d2.pub/zh/doc/d2-admin/ 效果预览&#xff1a;https://d2.pub/d2-admin/preview/#/index 开源协议&#xff1a;MIT 2.vue-element-admin 开源地址&#xff1a;https…

BACnet协议详解————MS/TP物理层,数据链路层和网络层

文章目录写在前面1 物理层2 数据链路层MSTP的流程如下noteMS/TP帧格式3 网络层写在前面 这周加更一篇&#xff0c;来弥补一下之前落下的进度。简单的说两句&#xff0c;之前讲应用层的时候&#xff0c;只是跟官方的手册来同步一下&#xff0c;但是从个人理解来说&#xff0c;自…

Spring拦截器

SpringMVC提供了拦截器机制&#xff0c;允许运行目标方法之前进行一些拦截工作或者目标方法运行之后进行一下其他相关的处理。自定义的拦截器必须实现HandlerInterceptor接口。preHandle()&#xff1a;这个方法在业务处理器处理请求之前被调用&#xff0c;在该方法中对用户请求…

(周末公众号解读系列)2000字-视觉SLAM综述

参考链接&#xff1a;https://mp.weixin.qq.com/s?__bizMzg2NzUxNTU1OA&mid2247528395&idx1&sn6c9290dd7fd926f11cbaca312fbe99a2&chksmceb84202f9cfcb1410353c805b122e8df2e2b79bd4031ddc5d8678f8b11c356a25f55f488907&scene126&sessionid1677323905…

10 分钟把你的 Web 应用转为桌面端应用

在桌面端应用上&#xff0c;Electron 也早已做大做强&#xff0c;GitHub桌面端、VSCode、Figma、Notion、飞书、剪映、得物都基于此。但最近后起之秀的 Tauri 也引人注目&#xff0c;它解决了 Electron 一个大的痛点——打包产物特别大。 我们知道 Electron 基于谷歌内核 Chro…

C++回顾(二)——const和引用

2.1 C中的const 2.1.1 C与C中const的比较 &#xff08;1&#xff09;C语言中的const C语言中 const修饰的变量是一个 常变量&#xff0c;本质还是变量&#xff0c;有自己的地址空间。 &#xff08;2&#xff09;C中的const 1、C中 const 变量声明的是一个真正的常量&#xff…