淘寶數據:第一列標題,第二列鏈接,第三列價格,第四列評論
一、數據預處理
數據預處理指的是對數據進行初步處理,把髒數據處理掉,否則很容易影響最終結果。
常見的的預處理包括:
1、缺失值處理
2、異常值處理
3、數據集成
在數據量大的情況下采用刪除處理法,是比較優質的一種處理方法。
二、實戰分析
步驟:
1、爬取淘寶數據存入數據庫(再次不進行演示,後面會在爬蟲中更新淘寶商品的爬取)
2、讀取數據庫中的數據
3、補全缺失數據,例如NaN或者價格爲0的一些商品
4、對一些極大值進行異常處理
5、進行數據處理,直方圖進行展示
6、對直方圖進行分析,分析出較優的方案
下面爲源碼:
2、讀取數據庫中的數據
import pymysql
import numpy as npy
import matplotlib.pylab as pyl
import pandas as pda
pyl.rcParams['font.sans-serif'] = ['SimHei']
conn = pymysql.connect(host="localhost", user="root", passwd="123456", db="datatreat") #數據庫連接
sql = "select * from taob"
data = pda.read_sql(sql, conn) # 連接數據庫並獲取數據
print(data.describe())
# print(data.columns) # 所有標題 Index(['title', 'link', 'price', 'comment'], dtype='object')
# print(len(data)) # 數據總長度 2356
data.describe()獲得的結果可獲得中間值,以及判斷價格最小值是否含0
描述 | price | comment |
---|---|---|
count | 2356.000000 | 2356.000000 |
mean | 66.876061 | 1647.473684 |
std | 147.646617 | 12119.206828 |
min | 0.000000 | 0.000000 |
25% | 22.000000 | 23.000000 |
50% | 40.000000 | 162.000000 |
75% | 75.000000 | 757.500000 |
max | 5990.000000 | 454037.000000 |
3、補全缺失數據,例如NaN或者價格爲0的一些商品
x = 0
data["price"][(data["price"] == 0)] = None # 如果價格爲0,則設置價格爲None,後面可以更方便的對數據進行處理
for i in data.columns: # 數據每一列的標題
for j in range(len(data)): # 數據每一行
if data[i].isnull()[j]: # 如果價格爲None,那麼設置價格爲66
data[i][j] = 66
x += 1
# print(x) # 總共有多少個遺失的數據
這樣的警告無視即可
D:/PycharmProjects/datam/datatreating.py:17: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
data["price"][(data["price"] == 0)] = None
4、對一些極大值進行異常處理
首先需要找到異常值,那麼可以畫散點圖來尋找,然後再進行處理
data1 = data.T
price = data1.values[2]
comt = data1.values[3]
pyl.xlabel("價格")
pyl.ylabel("評論")
pyl.plot(price, comt, "o")
pyl.show()
可以很明顯的看出,評論大於100000,價格大於1000可以都處理了
(1)改值處理法 兩種方法二選一
da = data.values
line = len(data.values) # 行數
col = len(data.values[0]) # 列數
for i in range(0, line):
for j in range(0, col):
# 注意這裏是已經進行了第二次數據處理,所以得出對價格大於210,評論大於5338的數據進行處理
if(j == 2 and da[i][2]>210): # 修改價格
da[i][j] = 66
elif(j == 3 and da[i][3]>5338): # 修改評論
da[i][j] = 1647
data2 = da.T
price = data2[2]
comt = data2[3]
pyl.xlabel("價格")
pyl.ylabel("評論")
pyl.plot(price, comt, "o") # 繪製散點圖
pyl.show()
(2) 刪除處理法
x = 0
for i in range(0, line):
for j in range(0, col):
if (da[i][2] > 210): # 刪除價格
continue
elif (da[i][3] > 5338): # 刪除評論
continue
else:
if(x==0): # 第一個數直接賦值到newda中,後續的通過row_stack插入
newda = da[i]
else:
newda = npy.row_stack((newda, da[i])) # numpy.row_stack(mat, a) a是要加入mat中的序列
x += 1
data2 = newda.T
price = data2[2]
comt = data2[3]
pyl.xlabel("價格")
pyl.ylabel("評論")
pyl.plot(price, comt, "o") # 繪製散點圖
pyl.show()
處理後數據散點圖分佈,可以很明顯看出點分佈均勻很多
5、分佈分析
# 求最值
# 計算極差
# 組距:極差/組數
# 繪製直方圖
pricemax = data2[2].max()
pricemin = data2[2].min()
commentmax = data2[3].max()
commentmin = data2[3].min()
# 極差
pricerg = pricemax - pricemin
commentrg = commentmax - commentmin
# 組距
pricedst=pricerg/13
commentdst=commentrg/13
# 繪製價格直方圖
# npy.arange(最大,最小,組距)
# 價格直方圖
peicesty = npy.arange(pricemin, pricemax, pricedst)
pyl.hist(data2[2], peicesty)
pyl.show()
# 評論直方圖
commentsty = npy.arange(commentmin, commentmax, commentdst)
pyl.hist(data2[3], commentsty)
pyl.show()
價格直方圖:
評論直方圖:
6、分析與結論:
可以看出價格區間在18元到38元中零食定價最多
可以看出評論在0到400個評論的比較多
如有問題可以在下留言