2 python大數據挖掘系列之淘寶商城數據預處理實戰

preface

在上一章節咱們聊了python大數據分析的基本模塊,下面就說說2個項目吧,第一個是進行淘寶商品數據的挖掘,第二個是進行文本類似度匹配。好了,廢話很少說,趕忙上車。html

淘寶商品數據挖掘

數據來源:

本身寫個爬蟲爬吧,爬到後入庫(mysql)。python

數據清洗:

所謂的數據清洗,就是把一些異常的、缺失的數據處理掉,處理掉不必定是說刪除,而是說經過某些方法將這個值補充上去,數據清洗目的在於爲了讓咱們數據的可靠,由於髒數據會對數據分析產生影響。
拿到數據後,咱們進行數據清洗分爲兩方面:mysql

  1. 缺失值發現:能夠查找
  2. 異常值發現:畫圖分析
  • 缺失值:在下載數據、蒐集數據的時候恰好就缺失。能夠經過查找的方法去發現。
  • 異常值:不必定就是異常,可能就是客觀存在,可是這個值對於總的數據來講是一個就比較特殊點。能夠經過畫散點圖發現。

這兩方面的處理方法以下:算法

  1. 缺失值處理:均值/中位數插補、固定值、臨近插補、迴歸分析、插值法(拉格朗日插值,牛頓插值)
  2. 異常值處理:視爲缺失,平均值修正,不處理。

方法解釋:sql

  • 均值/中位數插補:在缺失位置插入一個總數據的均值或者中位數。
  • 固定值::在缺失位置插入一個固定值
  • 臨近插補:看這個缺失位置附近的值是什麼,就把附近的某一個值插到缺失位置,這類應用場景應用於物以類聚的場景
  • 迴歸分析:等往後用上的時候在研究。
  • 插值法:此算法複雜,暫未研究,等往後用上的時候在研究。
  • 視爲缺失:能夠當作缺失值,而後經過缺失值來處理。
  • 平均值修正:經過平均值來替代這個值
  • 不處理:不處理這個值

開始分析:

表結構介紹:

淘寶商品表結構以下:大數據

  • title:商品名稱
  • link:商品URL
  • price:商品價錢
  • comment:商品評論數量
mysql> desc taob;
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| title   | varchar(50) | YES  |     | NULL    |       |
| link    | varchar(60) | NO   | PRI | NULL    |       |
| price   | int(30)     | YES  |     | NULL    |       |
| comment | int(30)     | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

對於上面四個字段,比較好處理的就是價錢和評論數,好比價錢是0(沒有采集到的數據),能夠經過剛纔平均值或者中位數來填充,對於異常值,好比某個評論10W+,那麼也能夠採用平均值修正。url

Python環境介紹:

依賴於pymysql,numpy,pandas,matplotlib,請本身先安裝。能夠參考我上篇博文:http://www.cnblogs.com/liaojiafa/p/6239262.htmlcode

拿代碼說話:
  1. 獲取數據
conn = pymysql.connect(host='192.168.56.4',user='root',passwd='123456',db='csdn',charset='utf8')
sql='select * from taob'
data = pandas.read_sql(sql,conn)
print(data.head(1))
#數據樣例以下,和mysql字段相匹配的:
0  買2袋減2元 印尼進口菲那菲娜蝦味木薯片油炸大龍蝦片零食品400g   

                                              link  price  comment  
0  https://item.taobao.com/item.htm?id=44350560220     50     2577

能夠看看數據的中位數和均值:htm

print(data.describe())
            price        comment
count  9616.00000    9616.000000
mean     64.49324     562.239601   # 均值
std     176.10901    6078.909643
min       0.00000       0.000000
25%      20.00000      16.000000
50%      36.00000      58.000000   # 中位數
75%      66.00000     205.000000
max    7940.00000  454037.000000
  1. 對price列的數據清洗
  • 缺失值的處理:

咱們先了解下這樣的判斷方法:blog

a={1:'a',2:'b'}
print([a[1]=='a'])

上述代碼打印結果必然是True,小括號([])至關於if判斷了,返回的值爲布爾值。

下面對price爲0的值(也就是缺失值)進行處理。

data['price'][(data['price']==0)]=None   # 對price的缺失值通通賦值爲None,方便下面處理
data['price'][(data['price']==0)]=64   # 也能夠這樣寫,直接把price的缺失值設置爲price的平均數64.那麼下面的for循環設置price的缺失值就不須要寫。

對上面這段代碼拆分來看:

  • (data['price']==0) 判斷data['price']列中哪行price的值等於0,等於的返回True,不等於返回False
  • data['price'][(data['price']==0)] 這語句就是一會兒把全部price=0的給取出來了 ,而後哪行的price等於0就 賦值爲None
for i in data.columns:   # 遍歷data的每列
    for j in range(len(data)):   # 遍歷data的每一行了。
        if data[i].isnull()[j]: # i在這是一維(列),data[i]等於把這一列的值取出來了,j在這裏是二維(行),i至關於XY軸的X軸,j至關於XY軸的Y軸,data[i].isnull是判斷整列的某一個值是nan那麼就返回True,data[i].isnull[j]是逐行逐行的判斷是否爲nan了,是的話返回True從而進行下面代碼塊的處理。
            data[i][j]=64   # 缺失值設置爲均值
  • 異常值處理:

1.找到異常值:經過畫散點圖(橫軸:價格,縱軸:評論數)
咱們這裏的話要選取評論數,價錢。一般的方法就是說經過遍歷每一行的數據,取每一行中的price值,可是呢這個方法效率低下。
對此咱們能夠採用轉置方法,把price列轉置爲一行,這樣就可以快速取到這價錢的數據,還有評論數。
下面請看代碼:

dataT=data.T # 轉置下數據
prices = dataT.values[2]     # 取第3行數據
comments = dataT.values[3]   # 取第4行數據
pylab.plot(prices,comments,'o')    # 畫散點圖
pylab.xlabel('prices')
pylab.ylabel('comments')
pylab.title(" The Good's price and comments")
pylab.show()

處理異常數據,我這裏定義的異常數據就是評論數超過20W,價格大於2000,請看代碼:

line = len(data.values)   # 取行數
col = len(data.values[0])   # 取列數
davalues = data.values    #取data的全部值
for i in range(0,line):    # 遍歷行數
    for j in range(0,col):   #遍歷列數
        if davalues[i][3]>200000:    #判斷評論數
            #print('comments==i,j',i,j,davalues[i][j])
            davalues[i][j] = 562   # 評論數取平均值
         
        if davalues[i][2]>2000:
            davalues[i][j] =  64   # 價錢取平均值


prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,'or')
pylab.xlabel('prices')
pylab.ylabel('comments')
pylab.title(" The Good's price and comments")
pylab.show()

此時,咱們看圖:

image

顯然咱們已經對評論數超過20W,價格大於2000的數據處理了,可是呢上圖顯示的仍是不夠漂亮,由於異常點與正常點的差距太大了,致使正常點與正常點之間的間隔很是小,小到黏在一塊了,因此咱們還須要在處理下,把評論數超過2000,價格大於300的處理掉,這樣的話,正常點就可以很好的展示在圖上,代碼以下:

line = len(data.values)   # 取行數
col = len(data.values[0])   # 取列數
davalues = data.values    #取data的全部值
for i in range(0,line):    # 遍歷行數
    for j in range(0,col):   #遍歷列數
        if davalues[i][3]>2000:    #判斷評論數,===主要修改這行
            #print('comments==i,j',i,j,davalues[i][j])
            davalues[i][j] = 562   # 評論數取平均值
         
        if davalues[i][2]>300:    # ====主要修改這行
            davalues[i][j] =  64   # 價錢取平均值
prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,'or')
pylab.xlabel('prices')
pylab.ylabel('comments')
pylab.title(" The Good's price and comments")
pylab.show()

full example:

import pymysql
import numpy
import pandas
from  matplotlib import  pylab

#缺失值處理
#======
data['price'][(data['price']==0)]=64  # 對price的缺失值通通賦值爲平均數

# 異常值處理:
# 1.找到異常值:經過畫散點圖(橫軸:價格,縱軸:評論數)
# 咱們這裏的話要選取評論數,價錢。一般的方法就是說經過遍歷每一行的數據,取每一行中的price值,可是呢這個方法效率低下,
# 對此咱們能夠採用轉置方法,把price列轉置爲一行,這樣就可以快速取到這價錢的數據,還有評論數
# 處理異常數據,我這裏定義的異常數據就是評論數超過20W,價格大於2000
conn = pymysql.connect(host='192.168.56.4',user='root',passwd='123456',db='csdn',charset='utf8')
sql='select * from taob'
data = pandas.read_sql(sql,conn)

line = len(data.values)   # 取行數
col = len(data.values[0])   # 取列數
davalues = data.values    #取data的全部值
for i in range(0,line):    # 遍歷行數
    for j in range(0,col):   #遍歷列數
        if davalues[i][3]>2000:    #判斷評論數
            #print('comments==i,j',i,j,davalues[i][j])
            davalues[i][j] = 562   # 評論數取平均值

        if davalues[i][2]>300:
            davalues[i][j] =  64   # 價錢取平均值


prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,'or')
pylab.xlabel('prices')
pylab.ylabel('comments')
pylab.title(" The Good's price and comments")
pylab.show()

生成的圖以下:
image
這張圖就很直觀的看出,價錢和評論數的關係了,價錢在100之內的,評論數也比較多,價錢越高,評論數相對來講越少。

數據集成與數據離散化

  1. 數據集成:不一樣來源的數據集合在一塊兒,須要注意格式保持一致。
    for example:
    我這裏有2個表數據,淘寶與京東的,淘寶的表就如上面所述的同樣,標題,url,價錢,評論,那麼京東的下標爲2的列也必須是價錢,只有數據格式保持一致,才能分析。

  2. 數據離散化:處理連續數據較好的方法。離散化就是指數據不集中,分散了。
    for example:
    一個班的考試成績就是從0-100分之間,這個數據是在100之內連續的,那麼咱們對這個數據分析的時候就能夠這麼作,把連續的數據或者近似連續的數據整合在一個點附近,好比0-60分爲及格,60-80爲良好.....

商品數據分佈分析實戰

咱們在這裏要分析商品數據的分佈,看評論數與價錢的在哪一個數量段的分佈最多。
首先咱們須要計算出價錢和評論的最值,其次在計算最值之間的極差,最後計算組距(極差/組數,組數本身根據狀況定義)。下面請看代碼:

# 數據分佈:
# 1 求最值
# 2 計算極差
# 3 組距: 極差/組數
da2=davalues.T
# print('=======')
# print(data['price'])
pricemax = da2[2].max()
pricemin = da2[2].min()

commentmax = da2[3].max()
commentmin = da2[3].min()
# 極差
pricerg =  pricemax - pricemin
commentrg = commentmax -commentmin
# 組距
pricedst = pricerg/10
commentdst = pricerg/10

# 繪製直方圖
# numpy.arrange(最小值,最大值,組距)
# 價錢直方圖
pricesty = numpy.arange(pricemin,pricemax,pricedst)
pylab.hist(da2[2],pricesty)
pylab.show()

# 評論直方圖
commentty = numpy.arange(commentmin,commentmax,commentdst)
pylab.hist(da2[3],pricesty)
pylab.show()

評論直方圖以下:
image

結論:

從上圖中咱們能夠看出,評論數最多的集中在100元之內的商品,評論數也間接的說明了購買數,由於購買後纔可以評論。
因此能夠根據這個來直方圖來給商品訂價。
價錢直方圖以下:
image

結論:

從上圖中咱們能夠看出,商品價錢最多的集中在50元之內的商品

code full example:

#!/usr/bin/env python
# __author__:Leo
import pymysql
import numpy
import pandas
from  matplotlib import  pylab

conn = pymysql.connect(host='192.168.56.4',user='root',passwd='123456',db='csdn',charset='utf8')
sql='select * from taob'
data = pandas.read_sql(sql,conn)

# 缺失值處理
data['price'][(data['price']==0)]=64  # 對price的缺失值通通賦值爲price的平均數

# 異常值處理:
# 1.找到異常值:經過畫散點圖(橫軸:價格,縱軸:評論數)
# 咱們這裏的話要選取評論數,價錢。一般的方法就是說經過遍歷每一行的數據,取每一行中的price值,可是呢這個方法效率低下,
# 對此咱們能夠採用轉置方法,把price列轉置爲一行,這樣就可以快速取到這價錢的數據,還有評論數



line = len(data.values)   # 取行數
col = len(data.values[0])   # 取列數
davalues = data.values    #取data的全部值
for i in range(0,line):    # 遍歷行數
    for j in range(0,col):   #遍歷列數
        if davalues[i][3]>2000:    #判斷評論數
            #print('comments==i,j',i,j,davalues[i][j])
            davalues[i][j] = 562   # 評論數取平均值

        if davalues[i][2]>300:
            davalues[i][j] =  64   # 價錢取平均值


prices2=davalues.T[2]
comments2=davalues.T[3]
pylab.plot(prices2,comments2,'or')
pylab.xlabel('prices')
pylab.ylabel('comments')
pylab.title(" The Good's price and comments")
pylab.show()

# 數據分佈:
# 1 求最值
# 2 計算極差
# 3 組距: 極差/組數
da2=davalues.T
# print('=======')
# print(data['price'])
pricemax = da2[2].max()
pricemin = da2[2].min()

commentmax = da2[3].max()
commentmin = da2[3].min()
# 極差
pricerg =  pricemax - pricemin
commentrg = commentmax -commentmin
# 組距
pricedst = pricerg/10
commentdst = pricerg/10

# 繪製直方圖
# numpy.arrange(最小值,最大值,組距)
# 價錢直方圖
pricesty = numpy.arange(pricemin,pricemax,pricedst)
pylab.hist(da2[2],pricesty)
pylab.show()

# 評論直方圖
commentty = numpy.arange(commentmin,commentmax,commentdst)
pylab.hist(da2[3],pricesty)
pylab.show()

好了,淘寶商城數據預處理實戰到此告一段落,下面我將繼續搞文本類似度匹配。

相關文章
相關標籤/搜索