设备管理中数据聚类处理-预处理

举报
tsinghuazhuoqing 发表于 2022/08/12 23:19:26 2022/08/12
【摘要】 ...

数据预处理
目 录
Contents
背景介绍
数据分析
分词与聚类
总 结
基本数据

 

§01 据预处理


一、背景介绍

  在 统计数据背后的指数分布模型 对于设备利用时间进行了初步统计,可以看到数据本身具有指数分布的特性。 为了进一步将设备种类划分小类别,下面计划对于设备命名属性进行聚类。

二、数据分析

1、数据文件

  处理的数据仍然来自于最初的EXCEL表格文件。下面数据原始EXCEL表格文件:


  数据文件中包含有五个表单,分别是 2017 至 2021 年的记录信息。其中能够有效反应设备属性和 应用时间的属性字段包括有:

  • 仪器名称: 汉字字符串
  • 仪器编号: 八位长的字符串
  • 分类号: 八位 至 十位 长的字符串
  • 有效机时:数字
  • 使用方向:分为 教学,科研,公共服务等
  • 是否开放共享: 是,否,未定等;

  除了上面字段之外,还有其它一些字段。在这五个表格中,字段的种类和个数各不相同。在2017,2018年里,没有校外机时这一栏。

2、数据预处理

(1)表格结构

  首先将EXCEL表格中的所有数据分别存储在 TEXT 文件中。

▲ 图1.1.1 数据文件及其大小

▲ 图1.1.1 数据文件及其大小

  下面是出数据文件每一行的字段属性。对于2017,2018年没有校外机时这一属性。

['填报院系', '使用单位号', '使用单位', '仪器编号', '分类号', '仪器名称', '负责人', '有效机时', '备注(低于150机时情况说明)', '使用方向', '型号', '规格', '单价', '国别', '国别码', '厂家', '建帐日期', '领用人', '经费来源', '平台类型', '平台实验室号', '平台实验室名称', '是否开放共享', '校外机时']

  
 
  • 1

(2)提取所需表单属性

  从上面五个数据文件中,提取以下字段合并成统一后续处理的数据文件,并存储在 NPZ文件中。

  • 仪器编号;
  • 分类号
  • 仪器名称
  • 有效计时
  • 使用方向
  • 型号
  • 校外机时(2017,2018都设置为0)

  下面是处理后截取的部分数据:

['12026444', '04060300', '三室真空定向炉 ', 0.0, '科研', 'ZGD-10BYF', 0]
['12005527', '03040404', '光电发射光谱仪', 0.0, '科研', 'PDA-7000', 0]
['07001233', '03040100', '高分辨率磁力显微镜', 0.0, '教学', 'HR-MFM', 0]
['10016800', '03060301', '超高真空电子束镀膜机', 0.0, '科研', 'SCTES-15CUHV', 0]
['12013022', '03060302', '高真空共溅镀仪', 0.0, '科研', 'LJ-103', 0]
['09000108', '03260100', '自动大气汞监测系统', 8640.0, '科研', '2537/1130/1135', 0]
['09018343', '03260208', '痕量汞分析仪', 8640.0, '科研', 'TeRran 2537B', 0]
['16015174', '04060807', '高温压力烧结炉', 0, '科研', 'SIP150/200-2000-9', 0]
['16005806', '03060300', '聚焦离子束', 4045.0, '教学', 'Auriga', 810.0]
['16034354', '03040101', '激光共聚焦显微镜', 2600.0, '科研', 'OLS4100', 500.0]
['16042019', '03040702', '场发射透射电镜', 3800.0, '科研', 'Titan Clubed Themis', 400.0]
['11027718', '03040900', '皮秒激光器', 2000.0, '科研', 'PX100Ⅱ-A', 400.0]
['16016382', '03041142', '40W飞秒激光器', 1800.0, '科研', 'TruMicro5050', 300.0]
['02006744', '03031110', '多功能气体分析仪', 1025.0, '科研', '1312型', 700.0]
['06002158', '03040415', '三维激光扫描仪', 1800.0, '教学', '3Dguru-LR', 0.0]
['06005777', '03030220', '红外热成像仪', 500.0, '教学', 'Yario CAM 170I', 0.0]
['06012268', '03030714', '质子传递反应质谱仪', 200.0, '科研', '06-03(33)', 0.0]
['07021260', '03030706', '气相质谱热脱附联用仪', 5760.0, '科研', '6850/5975B', 0.0]
['07021261', '03141131', '三维粒子成像测速系统', 800.0, '科研', 'Model', 100.0]
['20027587', '03240109', 'Servotest结构加载试验控制系统', 0.0, '科研', 'Pulsar 非标', 0.0]
['11021410', '03011105', '光纤测温控制器', 0.0, '科研', 'OTS4OPFS4', 0.0]
['17033987', '03080404', '涡度自动监测系统', 0.0, '科研', 'AV-OPEC', 0.0]
['20036620', '0316060201', '高亮度激光投影机', 0.0, '公共服务', 'AL-TU26K', 0.0]
['08018395', '03030706', '液相色谱/串联质谱', 0.0, '公共服务', 'UPLC/Quattro Premier', 0.0]
['10000899', '03030706', '气相色谱质谱联用仪', 0.0, '科研', 'Agilent 7890A', 0.0]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

  合并之后,得到有效的记录为 11531。

from head import *

datadir = r'D:\Temp\exceltxt'

filedim = os.listdir(datadir)
attrstr = ['仪器编号', '分类号', '仪器名称','有效机时', '使用方向', '型号', '校外机时']

alldata = []

for f in filedim:
    fname = os.path.join(datadir, f)

    sectattr = []

    with open(fname, 'r', encoding='gbk') as f:
        for id,l in enumerate(f.readlines()):
            l = l.strip('\n').split('\t')

            if id == 0:
                sectattr = []

                for a in attrstr:
                    if a in l:
                        sectattr.append(l.index(a))
                    else: sectattr.append(0)

                printf(sectattr)
                continue

            if len(l[0]) == 0: continue

            alldata.append(list(array(l)[sectattr]))

for id, d in enumerate(alldata):
    uset = d[3]

    if uset.replace('.','').isdigit():
        d[3] = float(uset)
    else: d[3] = 0

    uset = d[-1]
    if uset.replace('.','').isdigit():
        d[-1] = float(uset)
    else: d[-1] = 0

printf(len(alldata))

tspsave('alldata', attrstr=attrstr, alldata=alldata)

printf('\a')

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

3、数据初步分析

  将合并的数据的有效机时绘制曲线,曲线如下。 奇怪的事情出现了。可以看到曲线中间部分(2019,2020年)使用机时呈现比较随机的分布,符合数据规律。但是 数据开始(2017,2018)和数据结束(2021年)曲线呈现规律的增加和减少的趋势。这不符合数据随机分布的特性。

▲ 使用机时分布

▲ 使用机时分布

  查看原始 EXCEL 数据表格,可以看到又是表格中的 有效机时就是这样分布的。所以确定也是数据中的 “有效机时” 数据可能存在问题。

  JYH 对于上述数据给出如下说明:

  • 2017, 2018,2021 的数据分布是排序后的分布,所以数据应该都是正确的;
  • 对于所有数值超过8760 (365×24=8760)都应该去掉,或者修正为8760。

三、分词与聚类

1、仪器名称分词

  所有 11531 条记录中,涉及到不同 仪器名称 的个数为 2438。 利用 快速检索并引用你在CSDN上所有的博文笔记 所使用的 JieBa 分词调用,对所有仪器的名称进行分词,然后存储在 namecut.npz 中。

from headm import *
import jieba

attrstr, alldata = tspload('alldata', 'attrstr', 'alldata')

allname = []
alltime = []
cutname = []

for id,a in enumerate(alldata):
    alltime.append(float(a[3]))
    allname.append(a[2])
    seg = '`'.join(jieba.cut(a[2]))
    cutname.append(seg)

    if id % 100 == 0: printf(id)

tspsave('namecut', cutname=cutname)

printf(cutname[:100])
printf('\a')

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

  下面是分词后的所有记录的示例,每个名字的分词都使用 ‘·’进行隔离。

'三室`真空`定向`炉` ', '光电`发射`光谱仪', '高分辨率`磁力`显微镜', '超高`真空`电子束`镀膜机', '高`真空`共溅`镀仪', '原子力`显微镜', '热`分析`系统', '高级`扩展`流变`仪', '粉末`烧结`快速`成形`机', '场`发射`扫描电镜', '电子显微镜`及`能谱仪', '核磁共振`波`谱仪', '直流电源`及其`控制系统', '无人驾驶`电动`飞艇', '摇摆`综合`模拟`台架`系统', '氦气`风机', '摇摆`实验`本体`装置', '自然`循环`大`模拟实验', '晶闸管`整流`装置', '氦`净化`工程`验证`回路', '气相色谱仪', '一体化`卸料`装置`台架', '进球`及`装料`缓冲`台架', '车载`测试仪', '气相色谱仪', 'X射线`检测仪', 'DR`-`CT`安全检查`系统', '转`筒式`固态`发酵罐`系统', '超声`多普勒`测速仪', '粒径`速度`测定仪', '单倾`冷冻`传输`杆`系统', '圆二色`光谱仪'

  
 
  • 1
  • Word:

2、分词后的统计

  对于 11531 个仪器名称进行分词后,获得分词总量为2308个。出现频次较高的前100个分词为:

'系统', 2347), ('仪', 989), ('分析仪', 900), ('显微镜', 744), ('激光', 619), ('激光器', 516), ('测试', 329), ('扫描', 319), ('质谱', 295), ('机', 255), ('光谱仪', 247), ('分析', 223), ('联用', 216), ('荧光', 212), ('探针', 188), ('平台', 186), ('装置', 185), ('聚焦', 177), ('真空', 173), ('谱仪', 173), ('色谱', 173), ('成像', 172), ('高速', 169), ('X射线', 168), ('信号', 167), ('共', 160), ('测量', 160), ('液相', 157), ('网络', 157), ('质谱仪', 155), ('电子显微镜', 152), ('高', 152), ('测试仪', 152), ('纯化', 151), ('飞秒', 146), ('设备', 146), ('沉积', 145), ('原子力', 145), ('矢量', 142), ('流式细胞', 138), ('台', 135), ('试验机', 135), ('采集', 132), ('低温', 131), ('热', 130), ('多功能', 127), ('发射', 126), ('显微', 125), ('离子', 124), ('刻蚀', 123), ('红外', 115), ('三维', 115), ('与', 114), ('半导体', 114), ('衍射', 113), ('探测器', 112), ('分辨', 110), ('相色谱', 110), ('蛋白', 110), ('场', 107), ('等离子体', 107), ('快速', 106), ('发生器', 106), ('光学', 106), ('检测', 105), ('气', 105), ('全自动', 99), ('光纤', 99), ('拉曼', 98), ('精密', 97), ('脉冲', 96), ('超', 95), ('数据', 95), ('热仪', 93), ('红外光谱仪', 92), ('-', 90), ('实验', 87), ('动态', 87), ('试验台', 87), ('示波器', 84), ('超高', 82), ('工作站', 81), ('扫描电镜', 81), ('气体', 80), ('多', 80), ('光谱', 79), ('处理', 79), ('纳米', 78), ('控制系统', 78), ('电子束', 76), ('微波', 75), ('高温', 75), ('倒置', 74), ('自动', 74), ('等离子', 73), ('频谱', 71), ('及', 70), ('摄像机', 70), ('分子', 70), ('炉', 69)

  
 
  • 1
from headm import *

cutname = tspload('namecut', 'cutname')

printf(len(cutname))
worddim = []

for c in cutname:
    cc = c.split('`')

    for ccc in cc:
        ccc = ccc.strip(' ')
        if len(ccc) > 0: worddim.append(ccc)

printf(len(worddim))
wordset = list(set(worddim))

wordnum = []

for w in wordset:
    wordnum.append(worddim.count(w))

wordall = zip(wordset, wordnum)
wordall = sorted(wordall, key=lambda x:x[1], reverse=True)
printf(wordall[:100])

tspsave('word', wordall = wordall)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • namecut:

  将所有分词前面若干个出现的频次累计起来,绘制出累计曲线如下:

▲ 分词出现频次累计曲线

▲ 分词出现频次累计曲线

from headm import *

cutname = tspload('namecut', 'cutname')
wordall = tspload('word', 'wordall')

numdim = []
num = 0

for w in wordall:
    num += float(w[1])

    numdim.append(num)

plt.plot(numdim)

plt.xlabel("n")
plt.ylabel("Sigma")
plt.grid(True)
plt.tight_layout()
plt.show()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

3、建立词典

  从 2308 个分词中选取部分分词作为词典,然后给所有的仪器名称建立 ONE-HOT 数据向量,用于后面的聚类分析。那么选择多少个分词作为词典呢?

  下面按照分词频率从高到低排序后,分别选择前面 若干个作为字典,统计在所有仪器名称中能够只要匹配上一个分词的个数,绘制如下曲线。可以看到选择前面300个分词作为字典,则可以匹配上98%以上的仪器名称。因此,词典的个数课程在 100 - 300 之间选择。

▲ 选择分词个数与匹配频次

▲ 选择分词个数与匹配频次

from headm import *

cutname = tspload('namecut', 'cutname')
wordall = tspload('word', 'wordall')

printf(len(cutname), len(list(wordall)))

printf(wordall[:100])

matchnum = []

for i in range(len(wordall)):
    num = 0
    for a in cutname:
        for w in wordall[:i+1]:
            if a.find(w[0]) >= 0:
                num += 1
                break

    matchnum.append(num)

    printf(i)

plt.plot(matchnum)

plt.xlabel("n")
plt.ylabel("Number")
plt.grid(True)
plt.tight_layout()
plt.show()

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

 

  结 ※


  文对于设备管理中的数据进行了预处理,主要的工作包括:

  • 将所有的EXCEL表格中的内容转移到 alldata.npz文件中;
  • 对设备仪器名称进行了分词,并进行了统计;

  下面可以基于此建立仪器名称分词字典,并建立起设备名称的向量,使用SOFM进行聚类。

一、基本数据

▲ 图1.3.3 处理程序界面

▲ 图1.3.3 处理程序界面


■ 相关文献链接:

● 相关图表链接:

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/126266783

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。