1. 程式人生 > 其它 >Python資料分析案例 對京東商城口紅的分析與繪圖

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)
以上就是對自己爬取到的資料進行的一些分析與繪圖,當然還有很多深層次的東西,不能光靠評論數和價格來表現出來
由於時間關係,也沒有對程式碼進行封裝,但是方法就是這樣,很多功能可以以此類推。歡迎大家提出意見和看法