一、相关理论:
数据探索的核心:
(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()