文章結構

一、分析背景

二、數據來源及數據理解

三、分析框架

四、數據清洗

五、數據分析

六、結論與建議


一、分析背景

在美國,自1941年起,感恩節是在每年11月的第四個星期四,並從這一天起將休假兩天。像中國的春節一樣,在這一天,成千上萬的人們不管多忙,都要和自己的家人團聚,享受和家人共進晚餐的時光。

而享用完感恩大餐,人們最感興趣的事情就是去商店搶購特價商品。美國人將感恩節後面的星期五叫做Black Friday(黑色星期五)。

這一天是美國人購物最集中的一天。各大零售商都為了每年的打折季促銷準備了充足的「彈藥」,蠢蠢欲動等待著買手的圍攻,是全年折扣力度最大的時候。所以也可以把這一天稱為國外的「雙11」。

二、數據來源及數據理解

數據集來自於kaggle,共有537578行,12列。

每一列的欄位含義如下:

  • User_id:用戶的唯一標識符
  • Product_id:商品的唯一標識符
  • Gender:性別,F表示女性,M表示男性
  • Age:用戶所屬年齡段
  • Occupation:職業,共20類職業,用數字進行表示
  • City_Category:城市類別,共分為A、B、C三類
  • Stay_In_Current_City_Years:在該城市居住的年數
  • Marital_Status:婚姻狀況,0表示未婚,1表示已婚
  • Product_Category_1:商品類別,不能為空
  • Product_Category_2:商品類別,可以為空
  • Product_Category_3:商品類別,可以為空
  • Purchase:購買的總金額

三、分析框架

電商領域的數據分析採用基於人—貨—場的理解來進行,具體分析框架:

四、數據清洗

1.列名重命名

將列名變成中文,方便我們快速理解數據。

#列名重命名
colNameDict = {User_ID:客戶編號,Product_ID:產品編號,Gender:性別,Age:年齡,
Occupation:職業,City_Category:城市類別,Stay_In_Current_City_Years:居住時長,
Marital_Status:婚姻狀況,Product_Category_1:商品類別1,Product_Category_2:商品類別2,
Product_Category_3:商品類別3,Purchase:實付金額}
saleDf.rename(columns = colNameDict,inplace = True)

重命名結束後,檢查列名是否修改成功:

#檢查是否更改了列名
saleDf.head()

運行結果:

2.缺失值處理

缺失值會影響分析結果的準確性,所以我們有必要在分析前對缺失值進行恰當的處理。

基於要分析的業務問題,我們可以篩選出哪些列可以為空,哪些列不能為空,對不能為空的列,一旦存在缺失值,我們應該將這一記錄進行刪除或者填充。

#(3)缺失值處理
#基於對業務的分析,發現[職業,居住時長,婚姻狀況,商品類別2,商品類別3]可以為空值,其他不能為空,所以對其他列,如果存在空值就刪掉對應記錄
print(處理前的數據集大小為:,saleDf.shape)
saleDf.dropna(subset = [客戶編號,產品編號,性別,年齡,城市類別,商品類別1,實付金額],how = any)
print(處理後的數據集大小為:,saleDf.shape)

刪除後,我們需要比較刪除前和刪除後的記錄總數,來了解有多少不符合規定的數據。

運行結果如下:

3.數據類型轉換

導入數據時為了方便統一將數據類型設置成『object』,這一步需要將一些欄位的類型進行轉化。這裡我們將居住時長和實付金額分別轉化成int和float類型。

#數據類型轉換
saleDf[居住時長] = saleDf[居住時長].astype(int)
saleDf[實付金額] = saleDf[實付金額].astype(float)

此外將性別這一列中的F和M分別替換為女和男。更符合我們的思維邏輯。

saleDf[性別] = saleDf[性別].replace([M,F],[男,女])

轉換結果如下:

4.異常值處理

為了發現數據集出現異常值,通常使用describe方法來獲取該數據集的統計信息,統計信息中包含了該數據集數值欄位的均值、最大最小值、四分位數、標準差等統計信息。

saleDf.describe()

運行結果如下:

原則上這裡出現的統計數據是不能出現負值的,從結果上來看也不存在負值,且沒有明顯的異常值,所以認為該數據集不存在異常值。

五、數據分析

1.人

(1)總購買人數男女比例

#男女比例
#為了統計出男女的人數情況,首先需要對User_ID進行去重處理。
nofs_Df = saleDf.drop_duplicates(subset = 客戶編號)
totleNum = nofs_Df.shape[0]
print(購買總人數為:,totleNum)

先計算出總購買人數,對客戶編號進行去重。

nofs_Df.groupby(性別).size()

對性別列進行分組並求出每組的大小。運行結果如下:

分別求出男女的人數,並求得男女人數佔總人數的百分比:

querySer = nofs_Df.loc[:,性別] == 男
print(男性所佔百分比為%.2f%% %(nofs_Df.loc[querySer,:].shape[0]/totleNum*100))
print(女性所佔百分比為%.2f%% %(((totleNum - nofs_Df.loc[querySer,:].shape[0])/totleNum)*100))

運行結果如下:

可視化:

label = [男性,女性]
values = [4225, 1666]
explode = [0.01,0.01]
plt.figure(figsize = (6,6))
plt.pie(values, explode = explode, labels = label, autopct = %.2f%%)
plt.title(男女比例)
plt.show()

結論:從性別上來看,男性在購買人數佔比中佔據了較高的比例,這與日常男性通常會承擔家庭中買單情況相一致,並不能證明男性消費者佔據絕大多數。

(2)各年齡段消費情況

此外可以統計各年齡段的購買人數情況:

#各年齡段的男女人數
nofs_Df.groupby([年齡,性別]).size()

運行結果如下:

可視化:

size = 7
a = [78,287,545,333,182,142,99]
b = [140,782,1508,834,349,339,273]
x = np.arange(size)

total_width, n = 0.8, 2 # 有多少個類型,只需更改n即可
width = total_width / n
x = x - (total_width - width) / 2

plt.bar(x, a, width_=width, label=女)
plt.bar(x + width, b, width_=width, label=男)
plt.legend()
plt.xticks([0,1,2,3,4,5,6], [0-17,18-25,26-35,36-45,46-50,51-55,55+])
plt.xlabel(年齡段)
plt.ylabel(人數)
plt.show()

結論:從總體上來看,26-35歲群體的購買人數最多。此外從各年齡段來看,男性的消費人數都遠超女性,依然可以解釋為男性主要會承擔購買行為。

(3)客單價

客單價作為電商領域中重要的指標之一,對於提升總營業額有很大的指導作用。

#客單價
totle_purchase = saleDf.loc[:,實付金額].sum()
print(客單價為:,totle_purchase / totleNum)

運行結果如下:

結論:客單價高達85w美刀,這在我眼裡是十分高的消費水平,也可能是被平均的結果,對於高價值用戶,就需要保持與他們的良好關係。

2.貨

(1)熱銷商品top10

#最熱銷的商品
#查看銷量排名前十名的商品
saleDf.loc[:,產品編號].value_counts().head(10)

運行結果如下:

可視化:

saleDf.loc[:,產品編號].value_counts().head(10).plot(x = 商品編號, y = 銷量, title = 最熱銷的十大商品, kind = bar)
plt.show()

結論:P00265242成為了這次黑五當之無愧的爆款商品。

(2)熱銷品類top10

#4.最熱銷的品類
#查看銷量排名前十名的商品品類
category1_Ser = saleDf.loc[:,商品類別1].value_counts()
category2_Ser = saleDf.loc[:,商品類別2].value_counts()
category3_Ser = saleDf.loc[:,商品類別3].value_counts()
sales_Ser = category1_Ser.add(category2_Ser,fill_value = 0).add(category3_Ser,fill_value = 0)
#對統計好的銷量進行排序
sale_Ser_sort = sales_Ser.sort_values(ascending = False)
#查看銷量前十的商品品類
sale_Ser_sort.head(10)

運行結果如下:

結果可視化:

dataDf = pd.DataFrame({category:[5, 8, 1, 16, 14, 2,15, 6, 11, 4],
values:[190845, 187574, 138353, 84447, 73779, 71980, 71131, 41233, 39678, 38632]})
x = dataDf[category]
y = dataDf[values]
fig, ax = plt.subplots(figsize = (8, 5), dpi = 80)
ax.bar(np.arange(len(x)),y, width = 0.5, tick_label = x)
plt.xlabel(類別)
plt.ylabel(銷量)
plt.title(最熱銷的十大品類)
plt.show()

結論:第五類、第八類和第一類商品銷售量最高。

(3)件單價

#件單價
totle_product = saleDf.loc[:,產品編號].count()
print(件單價為:,totle_purchase / totle_product)

運行結果如下:

結論:件單價依然是一個比較高的水平。

3.場

(1)各類城市交易額

首先可以統計出,各類城市的交易數量:

#各城市交易人數
nofs_Df.groupby(城市類別).size()

運行結果如下:

可視化:

nofs_Df.groupby(城市類別).size().plot(x = 城市類別, y = 人數, kind = bar)
plt.ylabel(交易量)
plt.show()

結論:C類城市的交易量最大,其次是B類城市和A類城市。

#各城市的消費金額
DF1 = saleDf.groupby(城市類別)[實付金額].sum().reset_index()
DF1.rename(columns = {實付金額:總金額},inplace = True)
DF1

運行結果如下:

可視化:

saleDf.groupby(城市類別)[實付金額].sum().reset_index().plot(x = 城市類別, y = 實付金額, kind = bar)
plt.show()

結論:B類城市的交易額最高,達到了將近21億的規模,其次是C類和A類城市。

(2)各類城市客單價

各類城市的購買人數:

#A類城市的購買人數
per_A_Ser = nofs_Df.loc[:,城市類別] == A
per_A = nofs_Df.loc[per_A_Ser,:].shape[0]
per_A
#B類城市的購買人數
per_B_Ser = nofs_Df.loc[:,城市類別] == B
per_B = nofs_Df.loc[per_B_Ser,:].shape[0]
per_B
#C類城市的購買人數
per_C_Ser = nofs_Df.loc[:,城市類別] == C
per_C = nofs_Df.loc[per_C_Ser,:].shape[0]
per_C

各類城市的交易額:

#A類城市的銷售額
#篩選出A類城市
per_A_Ser = saleDf.loc[:,城市類別] == A
#計算交易額
purchase_A = saleDf.loc[per_A_Ser,:][實付金額].sum()
#B類城市的銷售額
#篩選出B類城市
per_B_Ser = saleDf.loc[:,城市類別] == B
#計算交易額
purchase_B = saleDf.loc[per_B_Ser,:][實付金額].sum()
#C類城市的銷售額
#篩選出C類城市
per_C_Ser = saleDf.loc[:,城市類別] == C
#計算交易額
purchase_C = saleDf.loc[per_C_Ser,:][實付金額].sum()

各類城市的客單價:

print(A類城市的客單價為:,purchase_A / per_A)
print(B類城市的客單價為:,purchase_B / per_B)
print(C類城市的客單價為:,purchase_C / per_C)

運行結果如下:

結論:A類城市作為交易數量最少的城市,客單價卻排名第一,說明該類城市相較B類和C類來說具備更強的消費能力,也更熱衷於購買高品質和品牌的商品。相反,C類城市雖然擁有大量的購買群體,但普遍的客單價相對偏低,說明消費水平相對也偏低。

六、結論與建議

1.P00265242為銷量最好的產品,說明該商品的用戶需求量大,購買慾望強。可將其與其他產品進行捆綁銷售或將其陳列在銷量較差的商品附近來促進其他商品的銷量。

2.對於銷量高的幾類產品,要針對其具體的商品銷售情況進行提前備貨,做好貨源充足防止斷貨情況的出現。也可以根據歷年來的銷售情況對來年的「黑五」商品銷售量進行預測,提前做好調度,防止資源的浪費。

3.針對購買力最強的群體——26-35歲人群來說,可以在購買記錄分析其偏好和購買習慣,在以後的促銷活動和「黑五」活動中進行更精準的銷售。

4.可以在B、C類城市中進行更多的促銷活動,因為消費群體龐大,可以促銷量。對於A類城市來說,消費者消費能力強,可能更注重品牌形象和質量,可以將更多高端品牌引入A類城市。


推薦閱讀:
相关文章