这两者没有严格的先后顺序,经常在一个阶段进行。
数据清洗我们要达到的目的是修复数据到正常的数值。
简单讲一下数据探索的核心,其实包括两点:
1.数据质量分析(跟数据清洗密切联系)。这一点其实很重要,因为我们要处理异常数据和缺失数据,这就是俗称的脏数据。
2.数据特征分析。这就需要我们用到统计学上的知识对数据进行分析,我举一下常见的分析方法有:分布,对比,周期性,相关性, 常见统计量等。
讲到核心的第二点,我觉得有必要解释下几种常见的分析方法:
分布:我们通过发现数据的分布规律,明白数据大致的走势和分析。
对比:比较数据在同一个图中的情况。
相关性:两组或者多组数据在同一横轴和纵轴的关系。
常见的统计量:因为我们可以通过describe知道数据大致情况,比如中位数、平均数等。
通过以上几种常见的分析方法,当你拿到数据的时候,千万不要急,你可以套着以上几种分析方法,万变不离其宗,总有一个是适合的。
好啦,前面只是一个铺垫,真正的菜来啦!!!
重点还是数据清洗,数据清洗这里面还是有挺多技巧哒。一般数据清洗无非就是有两种情况:
1.缺失值得处理。我们可以通过describe与len直接发现,还有就是通过0数据发现。
2.异常值处理。通过散点图发现,如果那些数值偏离得太大,这个数据很大可能就是异常值,你要处理一下。
一般遇到缺失值得处理方式为:删除、插补、不处理。
我简单讲下插补的方式吧,这点很重要,不然你很难去处理数据。插补的方式主要有,均值插补,中位数插补,众数插补,固定值插补,最近数据插补,回归插补,拉格朗日插值,牛顿插值法,分段插值等等。
对,还有一种情况,遇到异常值,处理方式为视为缺失值,删除,修补(平均数 中位数等等) ,不处理。
一下子说了这么多太苦涩了,我通过爬取某电商商品价格和评论,具体讲解下操作。
import pymysql
import numpy as npy
import pandas as pda
import matplotlib.pylab as pyl
conn = pymysql.connect(host="127.0.0.1",user="root",passwd="root",db="shop",charset="utf8")
sql = "select * from product"
data =pda.read_sql(sql,conn)
print(data.describe()) #以通过describe与len直接发现
print(len(data)) #上下两个对比发现缺失数据 10200
通过打印出来,知道数据的情况,我分析一遍。
price comment
count 10200.00000 10200.000000
mean 64.49324 562.239601 平均数
std 176.10901 6078.909643 标准差
min 0.00000 0.000000 价格为0不可能,所以你要处理
25% 20.00000 16.000000
50% 36.00000 58.000000 中位数
75% 66.00000 205.000000
max 8910.00000 650210.000000 也要处理一下,评论数太大,就知道异常得太厉害
10200 #len(data)发现大小与describe中数据量大小一样,所以此时我们就不能通过describe和len来发现异常缺失值,现在能做的是通过0
所以采用的是用0来对比数据,因为价格不可能为0的,我可以通过这个入手。
#把价格为0的变为空值--->循环处理,发现空值就补充为中位数(异常值的影响小一点)或者平均数,拉格朗差值,牛顿
data["price"][(data["price"]==0)] = None #发现价格为空值的,你就进行处理
#将所有价格为0处理成空值
x=0
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:
data[i][j]="36" #这里直接给了中位数36,在describe中得到
x+=1 #处理一次加1
print(x)
以上这些就是处理缺失值,接下第二步,我们要处理异常值。我们可以通过散点图,最快发现异常的值,因为它肯定是偏离正常范围最厉害的。
#异常值处理
#画散点图 (横轴为价格,纵轴为评论数)
#首先先得到价格
data2 = data.T
price = data2.values[2]
#得到评论数据
comt = data2.values[3]
pyl.plot(price,comt,'o')
pyl.show()
#先看图确定异常点,然后用程序确定这个数,循环处理
#异常值处理
#评论数异常>200000,价格异常>2300
#首先得到所有行数和列数
line = len(data.values)
col = len(data.values[0])
print(line)
print(col)
da = data.values #所有信息的新数组
print(da)
for i in range(0,line):
for j in range(0,col):
if (da[i][2]>2300): #得到价格
print(da[i][j])
da[i][j] = 36
if (da[i][3]>200000):
print(da[i][j])
da[i][j] = 58 #58为中位数
通过以上的异常值处理后,我们可以再打印一下散点图,看看处理情况。
#异常处理后的图像
da2 = da.T
price = da2[2]
comt = da2[3]
pyl.plot(price,comt,'o')
pyl.show()
以上这些,就是大致的数据清理的做法以及实现方式。
不过,我还是要补充一点,这是我们要记住的,严重偏离的数据,我们一般会干掉,但是如果你获取的数据量很小,我就不建议你把它干掉,因为一旦干掉,你的样本数据将变少,不值得。切记,千万不要以牺牲数据量为代价来换取可靠数据,显然不可取,你要根据实际情况而定。