""" ====================================================== ===================案例:細分市場分析=================== ====================================================== """ # 檔路徑為python檔位置下的相對路徑 d1=pd.read_excel("電商案例資料及資料說明/滅鼠殺蟲劑細分市場/蟎.xlsx") d2=pd.read_excel("電商案例資料及資料說明/滅鼠殺蟲劑細分市場/滅鼠.xlsx") d3=pd.read_excel("電商案例資料及資料說明/滅鼠殺蟲劑細分市場/殺蟲.xlsx") d4=pd.read_excel("電商案例資料及資料說明/滅鼠殺蟲劑細分市場/蝨子.xlsx") d5=pd.read_excel("電商案例資料及資料說明/滅鼠殺蟲劑細分市場/蟑螂.xlsx") # 將各分類的類別屬性和銷售額索引出。 a1=d1.loc[:,['類別','預估銷售額']] a2=d2.loc[:,['類別','預估銷售額']] a3=d3.loc[:,['類別','預估銷售額']] a4=d4.loc[:,['類別','預估銷售額']] a5=d5.loc[:,['類別','預估銷售額']] # 合併資料集。 data=pd.concat([a1,a2,a3,a4,a5]) # 按照類別進行分組求和匯總。 data2=data.groupby('類別').sum() # 計算每一個類別占總體的份額比例,保留兩位小數。 data2['份額占比']=round(data2/data2.sum().values*100,2) # 繪製橫條圖 # 將產品分類設置為橫條圖的y坐標軸,銷售額設置為橫條圖的x坐標軸 cate=list(data2.index) value = data2.iloc[:,0] # 設置畫布大小寬10inch,高6inch pl=plt.figure(figsize=(10,6)) # 繪製橫條圖 plt.barh(cate, value) # 設置圖標題、x軸標題,y軸標題,並繪製圖形 plt.title('滅鼠殺蟲各類別銷售分佈') plt.xlabel('銷售額') plt.ylabel('類別') plt.show() # 繪製圓形圖 # 設置畫布 pl=plt.figure(figsize=(8,6)) # 將類別設置為標籤、將份額占比設置為大小 labels = list(data2.index) sizes = data2["份額占比"].values.tolist() # 繪製圓形圖 plt.pie(sizes,labels=labels,autopct='%.1f%%',shadow=False,startangle=180) # 設置圖標題,並繪製圖形 plt.title("類別的相對份額占比") plt.axis('equal') plt.show() # 準備數據 # 根據業務理解刪除無關欄位 d2.drop(['時間','頁碼','排名','連結','主圖連結','主圖視頻連結','寶貝標題','下架時間','旺旺'],axis=1,inplace=True) # 遍歷每一個欄位,刪除僅包含一種資訊的欄位 for i in d2.columns: if len(d2[i].value_counts())<=1: del d2[i] # 缺失值大於90%的欄位刪除 for i in d2.columns: if d2[i].isnull().sum()>d2.shape[0]*0.9: del d2[i] d2.head() # 價格區間是市場的基礎屬性,在切割價格區間時需要設定步長,步長的大小要看價格區間的範圍以及消費者對價格的敏感度。 # 觀察資料集售價欄位的範圍在0-498元。 d2.describe() # 定出7個價格區間,前6個價格區間為50元。 databins=[0,50,100,150,200,250,300,1000] datalebels=['0-50','51-100','101-150','151-200','201-250','251-300','300以上'] d2['價格區間']=pd.cut(d2['售價'],bins=databins,labels=datalebels,include_lowest=True) # 計算不同價格區間的銷售額、銷售額占比,銷量,銷量占比。 # 刪除重複的寶貝ID。 d3=d2.iloc[list(d2.寶貝ID.drop_duplicates().index),:] # 分組匯總 bins1=d3.groupby('價格區間').sum() bins1['銷售額占比']=round(bins1.預估銷售額/bins1.apply(lambda x:x.sum())[3]*100,2) print(bins1) # 計算銷量占比。 bins1['銷量占比']=round(bins1['銷量(人數)']/bins1.apply(lambda x:x.sum())[1]*100,2) # 提取bins1中的欄位。 bins2=bins1.loc[:,['預估銷售額','銷售額占比','銷量(人數)','銷量占比']] # 計算不同價格區間內的寶貝數,寶貝數即商品數量。 bins3=d3.groupby('價格區間').寶貝ID.nunique() bins2['寶貝數']=bins3 bins2['寶貝數占比']=round(bins2['寶貝數']/bins2.apply(lambda x:x.sum())[4]*100,2) # 計算一個寶貝分配到的平均銷售額。 bins2['一個寶貝分配的銷售額']=round(bins2.預估銷售額/bins2.寶貝數,2) bins2.sort_values(by='一個寶貝分配的銷售額',ascending=False) print(bins2) # 減少步長繼續細分價格區間 # 提取0-50區間的資料。 mark_50=d3[d3.售價<50] # 以10作為步長創建價格區間。 databins=[0,10,20,30,40,50] datalebels=['0-10','11-20','21-30','31-40','41-50'] mark_50['價格區間']=pd.cut(mark_50['售價'],bins=databins,labels=datalebels, include_lowest=True) # 由於每一個價格區間都需要剖析分析,此處將上述價格分析流程封裝成函數 def price_mark(data): # 計算得到價格區間的銷售額、銷售額占比、銷量、銷量占比。 bins1=data.groupby('價格區間').sum() bins1['銷售額占比']=round(bins1.預估銷售額/bins1.apply(lambda x:x.sum())[3]*100,2) bins1['銷量占比']=round(bins1['銷量(人數)']/bins1.apply(lambda x:x.sum())[1]*100,2) bins2=bins1.loc[:,['預估銷售額','銷售額占比','銷量(人數)','銷量占比']] # 計算得到寶貝數,寶貝數占比、寶貝分配 # 分組非重複計數(不同價格區間內的寶貝數) bins3=data.groupby('價格區間').寶貝ID.nunique() bins2['寶貝數']=bins3 bins2['寶貝數占比']=round(bins2['寶貝數']/bins2.apply(lambda x:x.sum())[4]*100,2) bins2['一個寶貝分配的銷售額']=round(bins2.預估銷售額/bins2.寶貝數,2) res=bins2.sort_values(by='一個寶貝分配的銷售額',ascending=False) return res price_mark(mark_50) # 同理可以深度剖析101-150價格段。 mark2=d3[(d3.售價>100)&(d3.售價<150)] databins=[100,110,120,130,140,150] datalebels=['100-110','111-120','121-130','131-140','141-150'] mark2['價格區間']=pd.cut(mark2['售價'],bins=databins,labels=datalebels, include_lowest=True) price_mark(mark2) # 通過4.5.2分析,不難發現對於101-150價格段中,131-140這個價格段競爭度低,是不錯的切入價格段。於是對該價格段的產品需求進一步分析挖掘。 # 準備數據。 mark_select=d2[(d2.售價>130)&(d2.售價<140)] # 根據店鋪類型分組匯總分數據。 print(mark_select.groupby('店鋪類型').sum()) print(mark_select.groupby('適用對象').sum()) print(mark_select.groupby('物理形態').sum()) print(mark_select.groupby('型號').sum()) # 準備數據。 goods=pd.read_excel("產品評論資料.xlsx") # 資料的探索。 # 先觀察資料。 print(goods.head()) print(goods.評論.value_counts()) # 使用者購買後未進行評論時,系統會預設生成“此用戶沒有填寫評論”,而這樣的資訊是無法表述出使用者的需求的,故予以刪除。 goods=goods[goods.評論!='此用戶沒有填寫評論!']#刪除不需要的=索引需要的 # 索引需要的資料後,索引並沒有發生改變,故重置下索引 goods.reset_index(inplace=True) # 重置索引後,原有的索引會作為新的列添加到dataframe中,故刪除該列。 del goods['index'] # 些用戶為了獲取積分或者獲取金錢獎勵,而採取的一種複製手段。處理這種文本資料通常我們使用機械詞壓縮的方式處理 # 機械詞去重函數 def qc_string(s): filelist = s filelist2 = [] for a_string in filelist: # 將文本翻轉 temp = a_string[::-1] char_list = list(temp) #把字串轉化清單自動按單個字元分詞了 list1 = []#原始文本 list1.append(char_list[0]) list2 = ['']#比較文本 del1 = []#記錄要刪除的索引 i = 0 while (i=2: m = len(list2) for x in range(i-m,i): del1.append(x) list1= [''] list1[0]=char_list[i] list2 = [''] #(2.2.2)如果list1不等於list2,將新的詞彙加入到list2中 else: list2.append(char_list[i]) #將位置索引進行排序 a = sorted(del1) t = len(a)-1 while(t>=0): del char_list[a[t]] t = t-1 str1 = ''.join(char_list) str2 = str1.strip() str2=str2[::-1] filelist2.append(str2) return filelist2 # 將DataFrame中的評論提取出來進行機械詞壓縮處理: list_goods=goods.評論.values.tolist() res=qc_string(list_goods) # 用戶為了方便,直接複製別人的評價,刪除一模一樣的評論。 res1=[] for i in res: if i not in res1: res1.append(i) # 在進行停留詞以及無意義詞彙處理時,需要先對使用者文本資料進行分詞才能處理。選用Python中的Jieba分詞來對文本進行分詞。 import jieba #導入停留詞,檔路徑為相對路徑 stopwords=pd.read_table("stopwords.txt",quoting=3,names=['stopword']) #將停留詞轉換成列表 stopwords_list=stopwords.values.tolist() #對評論文本進行分詞,遍歷每一個詞,如果該詞出現停留詞列表中就跳過。 text='' for i in res1: seg=jieba.lcut(i) for word in seg: if word in stopwords_list: continue else: text=text+' '+word # 詞頻分析 # 導入繪圖包pyplot和詞雲包WordCloud。 from wordcloud import WordCloud import matplotlib.pyplot as plt # 配置詞雲的基本參數。 my_cloud=WordCloud( background_color='white',#背景色為白色 font_path='C:/Windows/Fonts/simsun.ttc',#詞雲字體為宋體 width=1000, height=500) # 用分好的詞進行詞雲的生成。 my_cloud.generate(text) # 顯示詞雲 plt.rcParams['figure.figsize']=(10,6)#圖片寬10inch,高6inch plt.imshow(my_cloud,interpolation='bilinear')#為了提升圖片清晰度,此處設置雙線 # 性插值對圖像進行優化處理'bilinear' # 隱藏坐標軸 plt.axis('off') plt.show() # 檔路徑為相對路徑 jieba.load_userdict("mydict.txt") # 實現方法:jieba分詞包中含有analyse模組,在進行關鍵字提取時可以使用下列方法:jieba.analyse.extract_tags(sentence, topK,withWeight=True) 其中sentence為待提取的文本,topK為返回幾個TF/IDF權重最大的關鍵字,預設值為20。 import jieba.analyse jieba.analyse.extract_tags(text,topK=10,withWeight=True)