一.数据清洗工作
数据清洗:如填充缺失数据、消除噪声数据等,主要是通过分析“脏数据”的产生原因和存在形式,利用现有的数据挖掘手段和方法去清洗“脏数据”,将“脏数据”转化为满足数据质量要求或应用要求的数据,从而提高数据集的质量,满足现阶段数据分析的需求。
DataEye数据清洗流程如下图:
DataEye数据清洗方案及实践案例
(一)噪声数据(异常值)清洗
1.利用数据分布特征及箱型图方法来识别单维数据集中噪声数据(异常值)
假设一组数据如下:
序号 1 2 3 4 … n
数据 E1E2E3E4…En
一般情况下,对于离散程度并非非常大的数据源来说,数据自身分布将会集中在某一区域之内,所以利用数据自身分布特征来识别噪声数据,再根据箱型图的方法在数据集中域中识别离群值及异常值。
首先,将数据集切等分成αn个区间(α可取1,10,100,1000),区间大小为
截取数据分布集中的区间作为数据集中域,找到数据集中域形成新数据组E ̅。
利用箱型图方法,对新数据组剔除离群值,得到非离群数据组[Q1−3IQR,Q3+3IQR],再取非异常数据组[Q1−1.5IQR,Q3+1.5IQR],得到目标数据。Q1:第一分位数,Q3:第三分位数,IQR四分位间距IQR=Q3−Q1。
案例一:DataEye平均下载时长计算
在实际情况下,现有的数据平台系统会遇到各种各样的关于指标均值计算的问题,遵循数理统计的规律,此时极大噪声数据对均值计算的负面影响是显著的。DataEye原始数据源存在一组游戏下载时长数据集如下图:
如果直接计算其游戏平均下载时长,得到的结果为23062.57秒,约6.4小时,与实际情况严重不符,说明这一数据集受到显著的噪声数据的影响。
对数据集做异常值识别及剔除,将数据集等分为240300个区间,找到数据集中域[0,3266.376]
对取值在[0,3266.376]之间的数据做箱型图分析,对新数据组剔除离群值,得到非离群数据组[ Q_1-3IQR, Q_3+3IQR],再取非异常数据组[Q_1-1.5IQR, Q_3+1.5IQR]。
最后计算目标数据源的平均下载时长为192.93秒,约3.22分,符合游戏运营实际情况。通过数据分布特征及箱型图的方法来识别剔除噪声数据的方式较为快捷且效果显著,可以作为数据清洗的预清洗步骤。
2.利用基于欧几里德距离的聚类方法来识别多维数据集中噪声数据(异常值)
一般情况下,利用数据分布特征或业务理解来识别单维数据集中噪声数据是快捷有效,但对于聚合程度高,彼此相关的多维数据而言,通过数据分布特征或业务理解来识别异常的方法便显得无能为力。面对这种窘迫的情况,聚类方法提供了识别多维数据集中噪声数据的方法。
在很多情况下,把整个记录空间聚类,能发现在字段级检查未被发现的孤立点。聚类就是将数据集分组为多个类或簇,在同一个簇中的数据对象(记录)之间具有较高的相似度,而不同簇中的对象的差别就比较大。散落在外,不能归并到任何一类中的数据称为“孤立点”或“奇异点”。对于孤立或是奇异的噪声数据(异常值)进行剔除处理。如下图:
(二)缺失值清洗
理想情况下,数据集中的每条记录都应该是完整的。然而,存在不完整的、含噪声的数据是现有数据集的共同特点。缺失数据的出现可能有多种原因,人工输入时认为不重要而漏掉,或者被调查人不愿公布等。在数据集中,若某记录的属性值被标记为空白或“-”等,则认为该记录存在缺失值,是不完整的数据。DataEye主要使用基于k-NN近邻填充技术的算法来处理缺失数据。
k-NN分类,训练样本用n维数值属性描述,每个样本代表n维空间的一个点,这样,所有的训练样本都存放在n维模式空间中。给定一个未知样本,k-NN分类法搜索模式空间,找出最接近未知样本的k个训练样本。这k个训练样本是未知样本的k个“近邻”。“临近性”用欧几里德距离定义,其中两个点X=(x_1,x_2,…,x_n)和Y=(y_1,y_2,…,y_n)的欧几里得距离是
d(X,Y)=(X−Y)2−−−−−−−√
设z是需要测试的未知样本,z=(x^’,y^’),所有的训练样本(x,y)∈D,未知样本的最临近样本集设为D_z,K-NN分类算法的描述如下:
k是最临近样本的个数,D是训练样本集。对数据做无量纲处理(标准化处理),消除单位对缺失值清洗的影响。
计算未知样本与每个训练样本(x,y)之间的距离d,得到离样本z最临近的k个训练样本集 DZ 。
当确定了测试样本的k个“近邻”后,就根据这k个近邻相应的字段值的均值来替换该测试样本的缺失值。
案例二:DataEye上报数据缺失值处理
在DataEye实际工作中,在数据采集上,主要采用SDK接入游戏,通过SDK上报数据的方式,在复杂的数据生产环境中,由于SDK接入或数据上报接口调用等原因,缺失值往往是存在的。
下面是一组DataEye接入游戏SDK上报的数据,很明显的可以发现,序号2及序号4在字段1上存在缺失值“-”,在数据集大的情况下,往往我们会对含缺失值的数据记录做丢弃处理,DataEye主要使用k-NN近邻算法来填充这一缺失值。
首先对这个数据集各个字段值做非量纲化,消除字段间单位不统一不一致的影响,得到标准化的数据矩阵。
对含缺失值“-”的序号2数据点做K近邻填充,取K值为5,计算序号2与其他不包含缺失值的数据点的距离矩阵,选出欧氏距离最近的5个数据点。
用这5个近邻的数据点对应的字段均值来填充序号2中的“-”值。得到完整序号2数据:
(三)重复值清洗
字段相似度定义:根据两个字段内容计算出的表示两者相似度的度量。范围在0-1,越靠近1,相似度越大。
布尔型字段相似度计算方法:对于布尔型字段,如果两字段相等,则相似度取0,如果不同,则相似度取1。
数值型字段相似度计算方法:对于数值型字段,可采用计算数字的相对差异。利用公式:
S(s_1,s_2 )=|s_1-s_2 |/(max(s_1,s_2))
字符型字段相似度计算方法:对于字符型字段,比较简单一种方法是,将进行匹配的两个字符串中可以互相匹配的字符个数除以两个字符串平均字符数。利用公式:
S(s_1,s_2 )=|k|/((|s_1 |+|s_2 |)/2)
其中k是匹配的字符数。例如字符串s1=“dataeye”,字符串s2=“dataeyegrg”利用字符型字段相似度计算公式得到其相似度
S(s_1,s_2 )=7/((|7|+|10|)/2)
设定阈值,当字段相似度大于阈值时,识别其为重复字段,并发出提醒,再根据实际业务理解,对重复数据做剔除或其他数据清洗操作。
案例三:DataEye游戏收入破解识别(重复值识别)
几乎所有单机游戏都面临着被破解的隐患,对于游戏厂商而言,对单机游戏是否被破解的监测能力是十分薄弱的,DataEye主要通过计算数据记录间的字段相似度,来识别重复值上报,进而根据业务理解判断单机游戏是否被破解,并进一步对重复值做清洗。
下面是一组DataEye接入游戏SDK上报的数据,仔细观察会发现,在2014/9/1 0:16:40至2014/9/1 0:16:42这段时间内发生了7笔100000付费金额。
计算这7条数据记录的彼此的相似度:
S(s_1,s_2 )=370/((|370|+|370|)/2)=1
S(s_1,s_3 )=369/((|370|+|370|)/2)=0.9973
S(s_1,s_4 )=369/((|370|+|370|)/2) 0.9973
S(s_1,s_5 )=369/((|370|+|370|)/2) 0.9973
S(s_1,s_6 )=369/((|370|+|370|)/2) 0.9973
…
S(s_6,s_7 )=370/((|370|+|370|)/2)=1
发现S(si,sj)很接近于1,即这7条记录相似度很大,识别出数据集中存在重复值,进一步根据业务理解判断游戏是否被破解并做重复值清洗工作。