数据预处理?不仅只是说说

 

数据预处理才是数据分析最让人难受的部分,你同意吗?...



当你满怀憧憬的打开花费了无数精力、时间甚至金钱换来的数据的时候,你看到的数据或许并不如你想的那般美好。导致你数据分析工作无法顺利进行的噩梦都有哪些呢?我们又是如何解决的呢?

非结构化

数据模型通常要求输入的数据是结构化的,也就是一张或者几张Data Table中,每一行Case中所有Indicator都有数值,只有一些考虑到模型鲁棒性,或者被非结构数据恶心过的数据分析师才会认真考虑这个问题。非结构化的数据表现在三个方面:一、空值。也就是table形成的矩阵中的某个位置为空,像R语言中的很多机器学习模型就怕遇到这种问题。空值数据的补充方法有两种,一是重采样,根据周围的数据做平滑或者推演,二是取近邻值,查找与它维度空间内最接近的一个点进行替代;二、指标列表不完整。Table中的某些数据缺失对应的指标,因此并不能够被解释,用于模型中也就毫无意义。最省心的解决方法是把一切不清楚的值删掉,但如果这类值占的比重很大,那么就要去数据源确定不完整的原因并重新进行采集;三、类型。如果你的数值型指标数据中混入了文本……哼哼,你说你的模型还能不能好好工作了?值得注意的是数值型的数据需要确定是整形还是浮点型,也许会对分析的精度产生影响,而字符型数据要统一编码。

异常值

异常是所有人都讨厌的,异常值也不例外,但总有粗心的数据录入者会犯一些错误,比如说小数点点错位置,单位写错,OCR后校对出错……那么数据分析师的问题来了,什么是异常值?怎么定义一个异常值?不,这个问题我也在头疼呢!在统计意义上说,如果在所有相同类型的数据中,某些数据偏离均值三个标准差以上,即可认为它是统计意义上的异常值。OK,这个筛选的方法我刚试过,只是想吐槽的一点是,如果你的数据质量足够好,异常值控制在一个很小的比例内,这种筛选方法是有效的,但是如果比例过大(20%以上),可能连正确的值都会受到异常值的影响。

数值型的异常值就已经很让人头疼了,字符型的异常值会更令人无语。全角半角的符号在平常都需要被注意,如果被写进数据中,还是很难被发现的。另外中文的编码问题始终是缠绕在分析师头上的梦魇,不同的软件对中文的编码支持不同,比如Python最喜欢UTF-8,但Web数据可能会通过Unicode传送过来,Notepad++默认打开是UTF-8无BOM,而Excel是要有BOM的,否则就是一堆乱码,而且也不仅仅只是编码转换的问题,可能有一些软件生成的奇葩字符就不能被UTF-8编码读取,这个时候也需要事先把这些字符替换掉。另外,网络爬虫中涉及到的中文编码问题我会另外找时间写一篇,因为坑的确很大。

重复项

Case完全相同就构成了重复项,但是重复项如何影响分析模型呢?影响最小的是将此类型的数据权值提升,导致结果与真实结果不符;而较为严重的影响是,你的data table可能要进行矩阵运算,那么含有一定比例的重复项的矩阵有可能无法求逆,导致模型无法正常工作。当然去除重复项有很多办法,包括使用程序判断,使用数据库的DISTINCT命令等等。

数据工作的每一个项目都是从采集数据开始,而每一个项目花的时间最长的部分就是数据预处理。奇葩的数据年年有,预处理的方法根据项目的需要,数据的特征,时时需要变通。如果你看到数据傻了眼,说明你接触的数据还不够多!


    关注 墨眉的城市数据分析日记


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册