Python数据分析学习笔记(4)数据探索与清洗实战

一、相关理论:

数据探索的核心:

(1)数据质量分析(跟数据清洗密切联系)

(2)数据特征分析(分布、对比、周期性、相关性、常见统计量等)

数据清洗的步骤:

(1)缺失值处理(通过describe与len直接发现、通过0数据发现)

(2)异常值处理(通过散点图发现)

一般遇到缺失值,处理方式为:删除、插补、不处理

    插补的方式主要有:均值插补、中位数插补、众数插补、固定值插补、最近数据插补、回归插补、插值法等等。

一般遇到异常值,一般处理方式为:视为缺失值、删除、修补(平均数、中位数等等)

二、数据准备:        

        本例使用的是某时间的淘宝商品数据,存储在MySQL数据库中(数据分享:链接:https://pan.baidu.com/s/1SsSy-mxvCStxk4e2PYxB3A  提取码:tquy,将该文件从MySQL打开执行即可),数据库结构如下:

三、数据探索与清洗实战:

1、连接MySQL数据库并查看数据表基本情况:

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="******",db="sys")
sql="select * from taob"
data=pda.read_sql(sql,conn)
#查看数据的基本情况
print(data.describe())

结果:


可以大致了解数值字段的统计情况,如个数、平均值、标准差、分位数、最大最小值等等。

2、缺失或0数据处理:通过查看最小值,可发现有0数据,这可能是由于多种原因导致的,因此需要处理价格为0的数据,代码:

#将0数据处理为中位数
x=0
#需要注意下面这种特殊的代码结构,可以使代码更加简洁
data["price"][(data["price"]==0)]=None
for i in data.columns:
    for j in range(len(data)):
        if(data[i].isnull())[j]:
            data[i][j]="36"
            x+=1
print("共处理"+str(x)+"个数据")

       此处还可以将其处理为平均数,另外可以通过len(data)与data.describe中的count进行对比来发现缺失数据,本例没有因此不进行讲解。

3、异常值处理:主要通过画散点图(横轴为价格,纵轴为评论数)来进行实现,因为价格与评论是具有相关性的,可以直观的看出数据是否正常:(运行时出现warning可以忽略)

#得到价格
data2=data.T
price=data2.values[2]
#得到评论数据
comt=data2.values[3]
#做图找异常
pyl.plot(price,comt,'o')
pyl.show()

        可以看到,评论数异常>20000,价格异常>2300(这一判断受主观影响),因此需要进行数据清洗,将异常的数据进行插补处理:

#评论数异常>20000,价格异常>2300
#获取数据行数
line=len(data.values)
#获取数据列数
col=len(data.values[0])
#获取数据
da=data.values
#遍历行
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

#重新进行数据可视化
da2=da.T
price=da2[2]
comt=da2[3]
pyl.plot(price,comt,'o')
pyl.show()

注:赋值可能会导致数据直方图可视化结果不符合正态分布。

结果:

接下来可继续探索,修改异常数值:

line=len(data.values)
col=len(data.values[0])
da=data.values
for i in range(0,line):
    for j in range(0,col):
        if(da[i][2]>130):
            print(da[i][j])
            da[i][j]=36
        if(da[i][3]>300):
            print(da[i][j])
            da[i][j]=58
da2=da.T
price=da2[2]
comt=da2[3]
pyl.plot(price,comt,'o')
pyl.show()

结果:

4、数据分布分析(绘制直方图):

#价格最大最小值
pricemax=da2[2].max()
pricemin=da2[2].min()
#评论数最大最小值
commentmax=da2[3].max()
commentmin=da2[3].min()
#极差:最大值-最小值
pricerg=pricemax-pricemin
commentrg=commentmax-commentmin
#组距:极差/组数
pricedst=pricerg/12
commentdst=commentrg/12
#画价格的直方图
pricesty=npy.arange(pricemin,pricemax,pricedst)
pyl.hist(da2[2],pricesty)
pyl.show()
#画评论的直方图
commentsty=npy.arange(commentmin,commentmax,commentdst)
pyl.hist(da2[3],commentsty)
pyl.show()

感谢韦玮老师的指导

猜你喜欢

转载自blog.csdn.net/Smart3S/article/details/83411106