Python資料分析案例 對京東商城口紅的分析與繪圖
接著上一篇文章,這裡對爬取到的資料進行簡單的資料分析
開發環境:jupyter
匯入依賴的包
%matplotlib inline
# 資料處理
import pandas as pd
import numpy as np
# 繪圖
import matplotlib.pyplot as plt
# 分詞
import jieba
# 雲圖
from wordcloud import WordCloud
from imageio import imread
資料處理
# 設定中文字型 plt.rcParams['font.family']=['sans-serif'] plt.rcParams['font.sans-serif']=['SimHei'] # 讀取檔案 df = pd.read_csv('口紅.csv',header=None,names=['Name','TradeName','Price','Comments']) # 去空值NaN (去重直接在Excel上解決的,去重用drop_duplicates方法) df.dropna(how='any',inplace=True) # 處理評論數 # 這裡遇到一個困難 資料中有NaN值導致無法使用函式處理字串 def deal_num(num): if '萬' in num: if '.' in num : num = num.replace('.','').replace('萬','000') else: num = num.replace('.','').replace('萬','0000') return num # 去除+ df['Comments'] = df['Comments'].str.strip('+') # 替換.和萬 df['Comments'] = df['Comments'].apply(deal_num) # 轉換資料型別 (這裡轉換資料型別是為了後續的排序) df.Comments = df.Comments.astype('int64') df.Price = df.Price.astype('int64')
處理完之後資料
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200430163254305.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTk4NzIy,size_16,color_FFFFFF,t_70)
散點圖
p = df.groupby('Price')['Name'].count() # 篩選出價格計數大於10個的Price y = p [p>10] # 價格分佈散點圖 x = p.index.tolist() plt.figure(dpi=200) plt.scatter(x,p,c='b') plt.xlabel('價格') plt.ylabel('數量') plt.title('京東口紅各價位數量統計分佈') plt.savefig('價格統計.jpg')
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200430163528992.jpg?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTk4NzIy,size_16,color_FFFFFF,t_70)
可以看出大部分口紅的價格趨近於500,這樣還不是很明顯,接下來用餅圖來顯示
餅圖
# 餅圖 百分比
sum = df.Price.count()
# 計算百分比
a = df.Price[df.Price<200].count()/sum
b = df.Price[(df.Price<400)&(df.Price>200)].count()/sum
c = df.Price[(df.Price>400)&(df.Price<1000)].count()/sum
d = df.Price[df.Price>1000].count()/sum
plt.figure(dpi=150)
sizes = (a,b,c,d)
labels = ['0-200','200-400','400-1000','>1000']
# 偏移出餅塊
explode= (0.05,0.1,0.3,0.4)
plt.pie(sizes,labels=labels,shadow=True,startangle=90,autopct='%1.1f%%',explode=explode)
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200430163917189.jpg?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTk4NzIy,size_16,color_FFFFFF,t_70)
價格0-200的分佈最多,其次是200-400 如果是你你會選擇什麼價位的口紅送人?
銷量top10
(因為這裡是用評論數代替的銷量,所以不夠準確)
# 銷量前十的口紅商品名
top = df.sort_values(by='Comments',ascending=False)
top10 = top[0:10]
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200430164322641.png?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTk4NzIy,size_16,color_FFFFFF,t_70)
ko no Dior da
雲圖
#將所有商品標題轉換為list
all_title = df.TradeName.values.tolist()
# 將所有商品名進行分詞得到分詞後的列表
title_list = []
for line in all_title:
title_cut = jieba.lcut(line)
title_list.append(title_cut)
# 呼叫停用詞(自己定製停用詞,即自己不想要的分詞結果)
stopwords = open('stop.txt', 'r', encoding='gbk').readlines()
# 得到停用詞列表
stop = []
for word in stopwords:
word = word.strip()
stop.append(word)
# 刪除商品名中不想要的詞或符號
new_title = []
# 把列表裡的每行提取出
for line in title_list:
# 把每行每個單詞提取出
new_line = []
for word in line:
if word not in stop:
new_line.append(word)
new_title.append(new_line)
# 把所有單詞加入Series中
word_list = []
for line in new_title:
for word in line:
word_list.append(word)
df_word = pd.Series(word_list)
# 統計詞出現的次數 (series型別)
new_df = df_word.value_counts()
# 轉變為字典型別 取前2~100(1是空白)
df_dict = dict(new_df[1:101])
# 設定生成雲圖大小
plt.figure(figsize=(10,8),dpi=500)
# 讀取背景圖片
pic = imread('girl.png')
# 設定
wc = WordCloud(
scale=4, # 比例尺 讓字型變清晰
background_color='white',# 設定背景顏色
mask = pic,# 設定背景圖片
font_path="simhei.ttf",# 字型
max_words=200, # 設定最大現實的字數
max_font_size=80,# 設定字型大小最大值
random_state=30# 設定有多少種隨機生成狀態,即有多少種配色方案
)
# 填詞
wc = wc.fit_words(df_dict)
# 顯示圖片
plt.imshow(wc, interpolation='bilinear')
plt.axis('off')
# 儲存圖片
plt.savefig('雲圖.jpg')
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200430164452877.jpg?x-oss-
process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTk4NzIy,size_16,color_FFFFFF,t_70)
以上就是對自己爬取到的資料進行的一些分析與繪圖,當然還有很多深層次的東西,不能光靠評論數和價格來表現出來
由於時間關係,也沒有對程式碼進行封裝,但是方法就是這樣,很多功能可以以此類推。歡迎大家提出意見和看法