python数据分析与挖掘之数据清洗

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qwe0754444/article/details/79877739
        数据探索的目的是及早发现数据的一些简单规律或特征,数据清洗的目的是留下可靠的数据,避免脏数据的干扰。

这两者没有严格的先后顺序,经常在一个阶段进行。

        数据清洗我们要达到的目的是修复数据到正常的数值。

        简单讲一下数据探索的核心,其实包括两点:

        1.数据质量分析(跟数据清洗密切联系)。这一点其实很重要,因为我们要处理异常数据和缺失数据,这就是俗称的脏数据。

        2.数据特征分析。这就需要我们用到统计学上的知识对数据进行分析,我举一下常见的分析方法有:分布,对比,周期性,相关性, 常见统计量等。

        讲到核心的第二点,我觉得有必要解释下几种常见的分析方法:

        分布:我们通过发现数据的分布规律,明白数据大致的走势和分析。

        对比:比较数据在同一个图中的情况。

        相关性:两组或者多组数据在同一横轴和纵轴的关系。

        常见的统计量:因为我们可以通过describe知道数据大致情况,比如中位数、平均数等。

        通过以上几种常见的分析方法,当你拿到数据的时候,千万不要急,你可以套着以上几种分析方法,万变不离其宗,总有一个是适合的。

扫描二维码关注公众号,回复: 4281023 查看本文章

        好啦,前面只是一个铺垫,真正的菜来啦!!!

        重点还是数据清洗,数据清洗这里面还是有挺多技巧哒。一般数据清洗无非就是有两种情况:

        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()

        以上这些,就是大致的数据清理的做法以及实现方式。

        不过,我还是要补充一点,这是我们要记住的,严重偏离的数据,我们一般会干掉,但是如果你获取的数据量很小,我就不建议你把它干掉,因为一旦干掉,你的样本数据将变少,不值得。切记,千万不要以牺牲数据量为代价来换取可靠数据,显然不可取,你要根据实际情况而定。

猜你喜欢

转载自blog.csdn.net/qwe0754444/article/details/79877739