資料分析英國電商——資料分析視覺化
# 訂單維度 # 首先將mydata_finall按訂單號進行分組,對商品數量quantity和總價sumcost進行分組求和 invoiceno_grouped = mydata_finall.groupby('InvoiceNo')[['Quantity','SumCost']].sum() invoiceno_grouped.describe() # 根據得到的結果可以發現,均單有279件商品,說明訂單多以批發為主,訂單均值超過均值, # 說明訂單總體差異較大,存在購買力極強的使用者,這些使用者應該得到重點關注 Quantity SumCost count 19960.000000 19960.000000 mean279.179359 533.171884 std 955.011810 1780.412288 min 1.000000 0.380000 25% 69.000000 151.695000 50% 150.000000 303.300000 75% 296.000000 493.462500 max 80995.000000 168469.600000 y = invoiceno_grouped[invoiceno_grouped.Quantity <2000]['Quantity'] sns.distplot(y,bins = 50,color="b", kde = False) plt.title("Quantity Distribtion Of Orders (Below 2000)") plt.ylabel('Frequency') plt.xlabel("Quantity") plt.show()
#訂單內的商品數量呈現出很典型的長尾分佈,大部分訂單的商品數量在250件內,商品數量越多,訂單數相對越少
#繪製訂單金額的分佈
x = invoiceno_grouped[invoiceno_grouped.SumCost < 1000]['SumCost'] sns.distplot(x,bins=100,color='b',kde=False) plt.title('SumCost Distribution of Orders(Below 1000)') plt.ylabel('Frequency')#可以看到訂單額集中在500以內,而350有一個峰值。
#客戶維度
#由於之前在清洗資料的時候把很多nan替換成0,所以客戶id為零的實際不能分析出太多東西,所以僅針對customerid不為0的進行分析
sales_useful = sales_normal[sales_normal.CustomerID != 0].copy()
#對客戶id和訂單編號進行分組,索引會發生變化,所以重設索引,然後對同筆訂單的金額和數量進行求和,然後在按照customerid分組展示
customer_grouped = sales_useful.groupby(['CustomerID','InvoiceNo'])[['Quantity','SumCost']].sum().reset_index() #對於groupby的內容使用函式需要使用agg引數,,由於有多個引數,所以我採用了字典 customer_grouped = customer_grouped.groupby('CustomerID').agg({'InvoiceNo':np.size, 'Quantity':np.sum, 'SumCost':np.sum}) customer_grouped.describe()#通過這個描述性統計我們可以得到人均購買4筆同一種商品,25%的客戶買完意見商品以後就沒有留存下來,人均購買1187件商品,甚至超過了Q3的購買量,最多購買196915件商品,人均消費4338英鎊,也同樣超過了Q3,最多消費280206英鎊。
#消費金額分佈(分組以後的金額)
x = customer_grouped[customer_grouped['SumCost']<=5000]['SumCost'] sns.distplot(x,bins=50,color='b',kde=False) plt.title('SumCost Distribution of Customers (Below 5000)') plt.ylabel('Frequency') plt.xlabel('SumCost') plt.show()#通過這個影象我們可以發現的訂單金額相對集中,大多在1000以內。
#商品維度
#商品對應的是stackcode,發現不同客戶購買同一商品的價格不一致
#下邊就是要考慮商品的平均價格,商品的平均價格要按照商品來分組,然後求和Quantity和Sumcost,然後再用求和以後的SumCost 除以Quantity
product_grouped = sales_normal.groupby(['StockCode'])[['Quantity','SumCost']].sum() product_grouped['avg_price'] = stock_grouped['SumCost']/stock_grouped['Quantity'] product_grouped.head()#檢視價格分佈
x = product_grouped[product_grouped['avg_price']<=100]['avg_price'] sns.distplot(x,bins=100,kde=False) plt.title('avg_price Distribution(avg_price Below 100)') plt.ylabel('Frequency') plt.xlabel('avg_price') plt.show()# 能夠看到絕大多數的商品價格在20英鎊以內,可知該網站銷售的商品大多是價格比較低的
果然無論是哪個國家的人民都更偏向於低價商品,低價商品在成交量以及成交金額上面都是佔據了非常大的部分,而價格較高的商品的銷量遠低於低價商品,那麼可以進一步把平臺作為一個走量的平臺,就如唯品會。
#時間維度
#按照有效訂單分組
time_grouped = sales_useful.groupby('InvoiceNo').agg({'date':np.min, 'Month':np.min,'Quantity':np.sum,'SumCost':np.sum}).reset_index() sns.set_style('white') month = time_grouped.groupby('Month').agg({'Quantity': np.sum, 'SumCost': np.sum, 'InvoiceNo': np.size}).plot(secondary_y = 'InvoiceNo', x_compat=True, figsize = (12, 4)) month.set_ylabel('Quantity & SumCost') month.right_ax.set_ylabel('Order quantities') plt.show()#區域維度
#對於區域維度的處理主要是按照客戶id和國家分類,然後在把兩張表合併在一起
#提取客戶id和國家關係表 sales_country = sales_normal.drop_duplicates(subset=['CustomerID','Country'])
按客戶分組,然後計算總金額
country_grouped = sales_useful.groupby('CustomerID')[['SumCost']].sum()
兩張表合併
country_grouped = country_grouped.groupby('Country').agg({'SumCost':np.sum, 'CustomerID':np.size})country_grouped = country_grouped.merge(sales_country,on=['CustomerID'])
合併以後按照國家在分組,計算消費金額和客戶總數
country_grouped.head()
發現這裡的sumcost已經變成了sumcost_x,重新命名
為這個資料集新增一個新的欄位,即avgamount 即人均消費。avg_amount = sumcost/cutomeridcountry_grouped.rename(columns={'SumCost_x':'SumCost'},inplace=True) country_grouped.head()
country_grouped['avg_amount'] = country_grouped['SumCost']/country_grouped['CustomerID']
country_grouped.head(30)
這裡可以發現除了英國以外其他國家的購買人數都很少
我們來按照avg_amount從大到小排列一下
country_grouped.sort_values(by='avg_amount',ascending=False).head(20)
能夠看到雖然其他國家購買人數較少,但是人均購買量很可觀,可以考慮吧篩選出具體的客戶id然後取得聯習給予適當的優惠和配備專屬客服。
#生命週期
我們知道一個網站能夠長久的生存下去,那麼客戶的生命週期是一個很重要的因素。
由於該資料集的統計物件為2010年12月1日至2011年12月9日的全部訂單,所以我們就只能統計這一段時間內的消費情況
首先篩選出id為0的客戶
#客戶第一次購買的時間 min_date = sales_useful.groupby('CustomerID')[['date']].min() #客戶最後一次購買的時間 max_date = sales_useful.groupby('CustomerID')[['date']].max() (max_date - min_date).head(20)sales_useful = sales_normal[sales_normal.CustomerID != 0].copy()
按照客戶id分組,然後找到客戶第一次購買和最後一次購買的時間差
可以看到好多的留存天數很多還是天數是0天,0天代表的是沒有留存。
總共有4338個客戶,平均留存時間130days,最小值是0天就是沒有留存,前25%是0天說明有4分之一的使用者是直接流失掉的,50%是93天,說明平均流失時間為93天,可以考慮在90天左右給予優惠促使客戶完成購買然後留存下來,前75%是252天,最多的是留存373天。生命週期呈現兩極分化的狀態。lifetime = max_date - min_date lifetime.describe()
由於這個timedelta的型別不能繪製圖形,所以轉換成datetime的形式 life_time['life_time'] = life_time['date'].dt.days life_time['life_time'].hist(bins = 20, color = 'c') plt.title('Life Time Distribution') plt.ylabel('Customer number') plt.xlabel('Life time (days)') plt.show()
可以看到絕大多數都是沒有留存,可以考慮增加購買初體驗。而且發現在350天左右又有了一個新的高峰
# 將分組增多至100,並拉寬圖表的尺寸 life_time[life_time['life_time'] > 0].life_time.hist(bins = 100, figsize = (12, 6), color = 'c') plt.title('Life Time Distribution without One-time Deal Hunters') plt.ylabel('Customer number') plt.xlabel('Life time (days)') plt.show()這個圖有很多可以討論的東西,使用者會在75-150天左右有一個顯著的下滑,那麼我覺得可以考慮給這一部分即將流失的使用者發放優惠券等,因為可以看到在170天以後的使用者就很活躍了,使用者粘性也較高,而且在300天以後的客戶激增說明這一部分客戶是平臺的優質客戶,要及時和這些客戶溝通,詢問客戶的意見和建議。
作者:Roar
連結:https://zhuanlan.zhihu.com/p/73039757
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
結論:
- 訂單維度:該電商網站在2010年12月1日-2011年12月9日內共產生有效訂單19960筆,筆單價為533.17英鎊,人均購買約279件商品,說明使用者群體多以批發商為主,且訂單交易金額和訂單內商品件數,其均值都高於中位數;訂單交易金額的均值甚至高於Q3分位數。說明訂單總體差異大,存在部分購買力極強的客戶
- 客戶維度:通過這個描述性統計我們可以得到人均購買4筆同一種商品,25%的客戶買完意見商品以後就沒有留存下來,人均購買1187件商品,甚至超過了Q3的購買量,最多購買196915件商品,人均消費4338英鎊,也同樣超過了Q3,最多消費280206英鎊
- 商品維度:能夠看到絕大多數的商品價格在20英鎊以內,可知該網站銷售的商品大多是價格比較低的,且價格越低對應的購買量越高,商品整體是較低價的平民商品
- 時間維度:總共有4338個客戶,平均留存時間130days,最小值是0天就是沒有留存,前25%是0天說明有4分之一的使用者是直接流失掉的,50%是93天,說明平均流失時間為93天,可以考慮在90天左右給予優惠促使客戶完成購買然後留存下來,前75%是252天,最多的是留存373天。生命週期呈現兩極分化的狀態。
- 區域維度:絕大多數的客戶是來自英國本土,其他國家的客戶較少,但是卻多為優質客戶,可以對這些客戶進行深挖予以物流上面的支援