一、前言
上文,我們爬取了京東商城糖果的兩千多條商品信息。今天,我們就來對它進行分析吧!(●'◡'●)
要點:
工具:jupyter notebook
用到的庫:pandas、matplotlib、jieba
下面我們開始吧!
二、數據處理
1.數據清洗
1.首先從csv文件中導入數據
import pandas as pd
#讀取數據
dataframe = pd.read_csv('./JongDong.csv')
print(dataframe.shape)
查看下有多少條數據:
預覽下前幾行的數據:
dataframe.head()
2.處理缺失數據
data = dataframe.dropna(how='any')
data.head()
print(data.shape)
可以看到,沒有缺失的數據
3.保存數據
import pymysql
from sqlalchemy import create_engine
#與mysql服務器建立連接
engine = create_engine('mysql+pymysql://root:2324507@localhost:3306/JingDong?charset=utf8')
con = engine.connect()
data.to_sql(name='candy',con=con,if_exists='append',index=False)
打開數據庫看下:
2.預處理
根據上面獲取的信息,我們需要先對數據進行一些預處理,將評論數中的漢字''萬''轉換一下,代碼如下:
def dealComment_num(comm_colum):
num = comm_colum.split('+')[0]
if '萬' in num:
if '.' in num :
num = num.replace('.','').replace('萬','000')
else:
num = num.replace('.','').replace('萬','0000')
return num
datadf['comm_num'] = datadf['comment_num'].apply(lambda x: dealComment_num(x))
#轉換成int類型
datadf['comm_num'] = datadf.comm_num.astype('int')
#去除標題中的空格
# def clean_title(comm_colum):
# return comm_colum.replace(' ','')
# datadf['goods_title'] = datadf['title'].apply(lambda x: clean_title(x))
data = datadf.drop('comment_num',axis = 1)
data.head(10)
看下處理好的數據:
三、分析
由於京東上面沒有銷量這一信息,我們姑且將評論數當成是銷量。本次項目中取用了price、title、comment_num、shop這幾個字段的信息。分別是價格、標題、評論數、店鋪名
3.1商品標題詞雲可視化
使用jieba分詞器,將title列中的商品標題進行切割,而后,利用了百度的一個停用詞表剔除停用詞,然后統計每個詞的頻率,並繪制詞雲
預處理:
import jieba
#將所有商品標題轉換為list
title = data.title.values.tolist()
#對標題進行分詞
title_s = []
for line in title:
title_cut = jieba.lcut(line)
title_s.append(title_cut)
#print(title_s)
#調入停用詞表
stopword = [line.strip() for line in open('./baidu_stopwords.txt', 'r', encoding='utf-8').readlines()]
#刪除停用詞
title_clean = []
for line in title_s:
line_clean = []
for word in line:
if word not in stopword:
line_clean.append(word)
title_clean.append(line_clean)
#進行去重
title_clean_dist = []
for line in title_clean:
line_dist = []
for word in line:
if word not in line_dist:
line_dist.append(word)
title_clean_dist.append(line_dist)
#print(title_clean_dist)
#將title_clean_dist中元素轉換成一個list
allwords_clean_dist = []
for line in title_clean_dist:
for word in line:
#print(world)
allwords_clean_dist.append(word)
#將列表allwords_clean_dist 轉換為Dataframe對象
df_allwords_clean_dist = pd.DataFrame({'allwords':allwords_clean_dist})
# 對過濾_去重的詞語 進行分類匯總
word_count = df_allwords_clean_dist.allwords.value_counts().reset_index()
word_count.columns = ['word', 'count']
繪圖:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from imageio import imread
plt.figure(figsize=(20,8))
# 讀取圖片
pic = imread("./background.png")
w_c = WordCloud(font_path="simhei.ttf",
background_color="white",
mask=pic, max_font_size=100,
margin=1)
wc = w_c.fit_words({
x[0]:x[1] for x in word_count.head(100).values
})
#顯示圖像
plt.imshow(wc, interpolation='bilinear')
plt.axis("off")
#plt.show()
plt.savefig('./jingdong/雲圖.jpg')
結果如下:
從圖中可以得出的結論:
1.零食、休閑的詞的占比比較大
2.關於糖果的類型,可以清除的看到,巧克力類型的商品最多
3.禮物、喜糖、女友 的詞頻比較大,說明出售的用於送禮的糖果比較多
3.2價格分布區間
我們再來看下糖果的價格分布區間(說明:大致看了下糖果價格,發現基本屬於[0-200]區間內,所以,這里只取200以內的價格進行分析)
plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標簽
plt.figure(figsize=(10,8))
price = data[data['price'] < 200]
plt.hist(price['price'], bins=10, color='brown')
plt.xlabel('價格')
plt.ylabel('商品數量')
plt.title('價格商品分布')
#plt.show()
plt.savefig('./jingdong/價格分布.jpg')
結果如下:
可以看到:價格基本在0~40的區間之內,占了總采集數據的2/3左右
3.3銷量分布情況
如上說明,由於沒有爬取到銷量信息,所以將評論數當成銷量
sale_num = data[data['comm_num'] > 100]
plt.figure(figsize=(10,8))
#print(len(sale_num)/len(data)) #查看下大致的區間分布
plt.hist(sale_num['comm_num'], bins=20, color='brown')
plt.xlabel('銷量')
plt.ylabel('數量')
plt.title('銷量情況')
#plt.show()
plt.savefig('./jingdong/銷量情況.jpg')
結果如下:
可以看到,銷量基本是在10萬以上。
這讓我有點好奇,我們來看下銷量最高的糖果是哪些吧
3.4銷量前10的糖果
在分析過程中,我發現數據有些詭異,出現了下面的情況
於是,我去excel里瞅瞅了。
圖1:46.8元的巧克力
圖1:96元的巧克力
發現同一款商品的不同規格的銷售量是記在一起的。本來呢,這里應該對其處理一下,但圖已經畫好了,我就懶得改代碼了,偷個小懶。嘿嘿(●ˇ∀ˇ●)
為了圖更好看點,將標題進行了截取,只取前面那個小標題。代碼如下:
#取出每個商品標題的簡略信息
def get_title(item):
title = item.split(' ')[0]
return title
data['small_title'] = data['title'].apply(lambda x: get_title(x))
data1 = data.drop('title',axis = 1)
top10_candy = data1.sort_values('comm_num',ascending=False)
top10_candy.head(10)
title = top10_candy['small_title'][:10]
sale_num = top10_candy['comm_num'][:10]
plt.figure(figsize=(10,8),dpi = 80)
plt.bar(range(10),sale_num,width=0.6,color='red')
plt.xticks(range(10),title,rotation=45)
#plt.ylim((9,9.7)) #設置y軸坐標
plt.ylabel('數量')
plt.xlabel('標題')
plt.title('銷量前10的糖果')
for x,y in enumerate(list(sale_num)):
plt.text(x,float(y)+0.01,y,ha='center')
plt.savefig('./jingdong/銷量前10的糖果.jpg')
結果如下:
可以看到,費羅列 牌子的巧克力以165萬的銷量笑傲群雄。我最喜歡的大白兔竟然沒有上榜┭┮﹏┭┮
3.5銷量前10的店鋪
分析完銷量前10的商品后,我們再來看下銷量前10的店鋪:
代碼如下:
top_shop = data.groupby('shop')['comm_num'].sum().sort_values(ascending=False)[:10]
top_shop.head(10)
plt.figure(figsize=(10,8),dpi = 80)
top_shop.plot(kind = 'bar',color='brown',width= 0.6)
plt.ylabel('數量')
plt.xlabel('店鋪名')
plt.title('銷量前10的店鋪')
plt.xticks(rotation=45)
for x,y in enumerate(list(top_shop)):
plt.text(x,float(y)+0.1,y,ha='center')
#plt.show()
plt.savefig('./jingdong/銷量前10店鋪.jpg')
結果
可以看到:箭牌京東自營旗艦店占據第一名,達2000多萬。其他前10的店鋪中也基本是京東的自營店
3.6商品價格和銷量關系
這個,我們采用散點圖的方式,看看價格和銷量的分布關系
plt.figure(figsize=(10,8))
plt.scatter(data['price'],data['comm_num'], color='blue')
plt.xlabel('價格')
plt.ylabel('銷量')
plt.title('價格、銷量的散點分布')
#plt.show()
plt.savefig('./jingdong/價格、銷量的散點分布.jpg')
結果如下:
可以看到:價格在0-50之間的銷量是最高的,而隨着價格的增加,銷量越來越少。嗯?還有600多的糖果?
3.7價格和成交總額的關系
由上圖觀察,我們發現價格和銷量之間似乎有個負相關的關系,那么,我們就來建立個模型分析分析叭!
import seaborn as sns
data['sum_sale'] = data['price']*data['comm_num']
print(data['price'].corr(data['sum_sale'])) #查看相關系數
sns.regplot(x='price', y='sum_sale', data=data, color='red') #擬和程度不高,模型價值不大
plt.savefig('./jingdong/價格和成交總額的關系.jpg')
結果如下:
但實際上,這個圖的價值不大,我們看下兩者的相關系數
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-tbiOQ8EM-1584540171804)
說明我這個模型建的很失敗!嗚嗚,看來直覺都是騙人的。
這里就不對上面那張圖分析啦。
結語
磕磕拌拌,總算完成了這次分析。作為一枚數據分析小菜鳥,我的python之路,任重而道遠。