電商數(shù)據(jù)分析項目總結!
訂單數(shù)據(jù)作為電商數(shù)據(jù)分析中的基礎分析項目,本項目就京東的訂單數(shù)據(jù)進行分析。通過數(shù)據(jù)分析和可視化深挖數(shù)據(jù)產生的原因,掌握基礎的數(shù)據(jù)分析能力。
1.關于本項目
1.1數(shù)據(jù)來源
本次數(shù)據(jù)來源于京東2020年5月25日 大家電-冰箱的訂單數(shù)據(jù) 按照10%的隨機抽樣后進行數(shù)據(jù)脫敏最后得到的訂單數(shù)據(jù),共有訂單數(shù)據(jù)大約70K,數(shù)據(jù)來源于公開網絡數(shù)據(jù)。
公眾號(Datawhale)后臺回復“202013”獲取打包的項目源碼和數(shù)據(jù)
1.2數(shù)據(jù)所包含信息
訂單中的屬性將其分成了3類,分別是用戶屬性、訂單屬性以及商品屬性

2.數(shù)據(jù)預處理
本項目使用python對數(shù)據(jù)進行處理 使用plotly進行數(shù)據(jù)可視化
import pandas as pd
import numpy as np
import plotly_express as px
import plotly.offline as of
import plotly as py
import plotly.graph_objs as go
讀取提供的數(shù)據(jù)
df=pd.read_csv('data.csv',sep='\t', encoding="utf-8", dtype=str)
查看數(shù)據(jù)的缺失值
df.isnull().sum().sort_values(ascending=False)
user_site_city_id 38190
user_site_province_id 38033
check_account_tm 23271
通過觀察發(fā)現(xiàn),這3個數(shù)據(jù)有部分缺失值,其中user_site_city_id 用戶所在城市編號,user_site_province_id 用戶所在省份的編號,check_account_tm支付時間
這部分數(shù)據(jù)的缺失是因為用戶填寫個人資料時跳過的部分,當然這不影響我們整個數(shù)據(jù)的分析
我們首先是將數(shù)據(jù)的類型進行轉換 同時處理缺失值和異常值
值得注意的是,通過觀察我們發(fā)現(xiàn)冰箱最低的價格是288元,但是數(shù)據(jù)中發(fā)現(xiàn)了很多低于288元的訂單數(shù)據(jù),我們認為這部分數(shù)據(jù)不能真實代表冰箱實際的訂單數(shù)據(jù),可能出現(xiàn)了補差價或者補運費的情況,因此這樣的數(shù)據(jù)我們都過濾掉。 因為訂單的編號具有唯一性,因此對于訂單編號的重復數(shù)據(jù),我們認為出現(xiàn)了重復訂單 對于缺失的省份值和缺失的數(shù)據(jù),我們將空白地方進行填充 通過觀察,我們發(fā)現(xiàn)數(shù)據(jù)的列有重復,對于刪除重復的列,這里提供一個比較有意思的做法,將數(shù)據(jù)反轉后,刪除重復的行再反轉回來。 實際支付的價格=商品數(shù)量*優(yōu)惠后的單價
#刪除優(yōu)惠前價格小于288元的
df = df[df['before_prefr_unit_price' ]>= 288]
#訂單編號具有唯一性,因此需要刪除重復的數(shù)據(jù)
df.drop_duplicates(subset=['sale_ord_id'],keep='first',inplace=True)
#填充城市和省份的缺失數(shù)據(jù)
df.user_site_city_id=df.user_site_city_id.fillna(-1)
df.user_site_province_id =df.user_site_province_id.fillna(-1)
#刪除重復的列check_account_tm 轉置列 刪除 再轉置
df=df.T.drop_duplicates().T
#實際支付的價格=商品數(shù)量*優(yōu)惠后單價
df['total_actual_pay'] = df['sale_qtty'] * df['after_prefr_unit_price']
到這里我們就完成了數(shù)據(jù)的預處理部分
3.訂單分析
3.1訂單取消比例分析
通過數(shù)據(jù)觀察,有的訂單出現(xiàn)了取消,因此我們通過餅圖查看取消和未取消的比例
order_cancel = df[df.cancel_flag==1]['sale_ord_id'].count()
order_success=df[df.cancel_flag==0]['sale_ord_id'].count()
labels = ['取消','未取消']
values = [order_cancel, order_success]
trace = [go.Pie(labels=labels, values=values)]
layout = go.Layout(
title = dict(text='訂單比例圖',x=0.5)
)
fig = go.Figure(data = trace, layout = layout)
fig

通過餅狀圖我們看到,大約有28.9%的訂單取消了,取消的比例可能是地址填寫錯了、沒有領到優(yōu)惠劵等情況,使取消支付的比例占有一部分的比例
3.2訂單支付比例分析
通過觀察數(shù)據(jù)我們發(fā)現(xiàn)了用戶有提交了訂單,但是沒有支付的情況
#找到所有的有效訂單
df2 = df[(df['sale_ord_valid_flag'] == 1)&(df['cancel_flag'] == 0)&('before_prefr_unit_price' != 0)]
order_payed = df2['sale_ord_id'][df2['user_actual_pay_amount'] != 0].count()
order_unpay = df2['sale_ord_id'][df2['user_actual_pay_amount'] == 0].count()
labels = ['支付','未支付']
values = [order_payed, order_unpay]
trace = [go.Pie(labels=labels, values=values)]
layout = go.Layout(
title = dict(text='支付比例圖',x=0.5)
)
fig = go.Figure(data = trace, layout = layout)
fig

通過餅狀圖我們可以看到,大約有15%的用戶取消了支付,取消支付的比例小于取消訂單的比例,因此對于有訂單信息的用戶但是未支付的,有比較強的購買目的,可能是由于優(yōu)惠劵或者價格等因素使其取消支付,因此針對這部分用戶可能是價格比較敏感的用戶,我們可以推送京東優(yōu)惠卡。
3.3訂單價格分布
price_series = df2['after_prefr_unit_price']
price_series_num = price_series.count()
hist, bin_edges = np.histogram(price_series, bins=80)
hist_sum = np.cumsum(hist)
hist_per = hist_sum / price_series_num
bin_edges_plot = np.delete(bin_edges, 0)
trace = go.Scatter(
x = bin_edges_plot,
y = hist_per*100,
mode = 'lines', # 折線圖
line = dict(
width = 2
) )
layout = go.Layout(
title = dict(text='訂單的價格分布',x=0.5),
xaxis=dict(title='訂單價格'),
yaxis=dict(title='百分比(%)',ticksuffix='%')
)
fig = go.Figure(data=trace,layout=layout)
fig

通過分布圖可以看到,超過80%冰箱的價格是低于4K的,查過70%的冰箱價格是低于2K的,因此冰箱用戶主力消費價格在2K以下,因此在進行冰箱廣告推廣時,可以優(yōu)先考慮價格低于2K的冰箱,這類冰箱具有較大的市場。
同時通過觀察,冰箱價格在4K以內分布較為均勻,超過4K以后,冰箱累計上升區(qū)間緩慢,因此我們可以大致認為,當冰箱的價格超過4K,這部分冰箱價格我們可以認為是偏豪華型的冰箱,具有單個冰箱利潤高,但是銷售市場占比少。
3.4有效訂單與時間的關系
df3 = df2.copy()
df3['order_time_hms'] = df3['sale_ord_tm'].apply(lambda x: x.strftime('%H'))
pay_time_df = df3.groupby('order_time_hms')['sale_ord_id'].count()
x = pay_time_df.index
y = pay_time_df.values
trace = go.Bar(
x = x,
y = y,
text=y,
textposition='outside')
layout = go.Layout(
title = dict(text='不同時間段有效訂單分布',x=0.5),
xaxis=dict(title='時間',tickmode='linear'),
yaxis=dict(title='有效訂單數(shù)')
)
fig = go.Figure(data=trace,layout=layout)
fig

通過觀察,0點有效訂單數(shù)出現(xiàn)了激增的情況,這一部分是出現(xiàn)了異常訂單還是說過了0點以后通過搶購物券使這一部分訂單增加?
同時,除了0點外,10、20點有效訂單數(shù)具有一個較高的值,說明用戶比較偏向于早上10點和晚上20點付款。早上10點付款推測原因可能是剛到公司,先逛一下京東摸摸魚,晚上20點推測原因是晚飯后,這個時間距離睡覺還比較早,用戶刷手機的頻率增加,因此增加有效訂單數(shù)。
針對0點有效訂單數(shù)偏高的問題,我們進行進一的分析人均有效訂單的情況。
3.5人均有效訂單與時間的關系
order_time_df=df3.groupby('order_time_hms')['sale_ord_id'].agg({('order_num','count')}).reset_index()
user_time_df = df3.groupby('order_time_hms')['user_log_acct'].agg({('user_num','nunique')}).reset_index()
order_num_per_user = order_time_df['order_num'] / user_time_df['user_num']
trace = go.Scatter(
x = order_num_per_user.index,
y = order_num_per_user.values,
mode = 'lines', # 折線圖
line = dict(
width = 2
) )
layout = go.Layout(
title = dict(text='不同時間段人均訂單量的分布',x=0.5),
xaxis=dict(title='時間',tickmode='linear'),
yaxis=dict(title='人均有效訂單量')
)
fig = go.Figure(data=trace,layout=layout)
fig

通過觀察發(fā)現(xiàn),0點時候的人均有效訂單率處于較為正常的值,甚至比1點的有效訂單率低,因此有效訂單的激增,我們認為很大概率是通過搶優(yōu)惠劵增加而不是出現(xiàn)了惡意刷單。
同時我們看到20點的人均有效訂單率也是處于較為正常的值
3.6人均客單價和平均價在不同時間段的分布
客單價=銷售額/顧客數(shù)
平均訂單價=銷售額/訂單數(shù)

0時客單價和平均訂單價在全天有個較高的值,會不會是小部分用戶的極端購物行為產生這樣的數(shù)據(jù)呢?
因此我們看一下0時和20時價格訂單的分布圖
3.7 0時和20時訂單價格分布


通過看0時和20時不同時間段訂單累計分布圖我們可以看到
大約20%的0時用戶的訂單在2K以下,20時用戶在2K以下的訂單占比為75%
這說明0時的用戶并補只有一小部分的訂單價格很高,而是0時的用戶普遍的購物具有較高的客單價。
因此我們推測,0時用戶是否具有一定的沖動購物的情況,而20時購物的用戶相對理智一些
也可能時用戶為了使用優(yōu)惠劵使高額的訂單大多集中在0時
3.8訂單與地區(qū)的關系
對于冰箱市場而言,哪些省份是冰箱的頭部市場呢?

通過查看不同省份有效訂單分布圖我們可以看到,訂單的市場大多集中在一線城市或者經濟較為發(fā)達的省份,這部分城市經濟發(fā)達,對于年輕人有較強大的吸引力,因此購置冰箱的訂單數(shù)較高。
那么這些不同省份客單價是否會不同?

其中上??蛦蝺r最高,廣東的訂單數(shù)量最多,因為廣州在外貿上具有較大的優(yōu)勢,因此有具有較大的實體工廠,能吸納較多的低端人才,因此出現(xiàn)訂單數(shù)量多而客單價不高的情況。
與之相反的是上海作為國家的金融中心,匯聚了較多的金融方向的從業(yè)者,因此在消費品質上有一個較大的提升。
最后我們來看看不同品牌的客單價
3.9不同品牌客單價

通過圖中我們可以看到,卡薩帝穩(wěn)居客單價排行第一的品牌,妥妥的豪華冰箱品牌
價格的第一梯隊品牌有 博世、西門子、松下、三星 平均價格在4K以上
價格的第二梯隊品牌有 海爾、小米、伊萊克斯、格蘭仕、美的 平均價格在2K以上 其中有不少國產品牌的身影
剩下的品牌價格都在2K以下,這部分市場消費需求大,因此各大品牌在這一區(qū)間段價格競爭比較激烈。
4.小結
本項目針對京東的冰箱訂單數(shù)據(jù)進行了分析,在分析過程中沒用使用復雜的模型以及炫酷的圖表,而是通過普通的數(shù)據(jù)展示一步步深挖數(shù)據(jù)產生的原因,并提出了一部分產生數(shù)據(jù)的原因。因此在數(shù)據(jù)分析中,往往數(shù)據(jù)指標的建立對于數(shù)據(jù)的深挖具有較大的意義,同時針對異常數(shù)據(jù)提出一定的推測和假設,通過有效的數(shù)據(jù)分析進行小心求證。
5.項目源碼和數(shù)據(jù)
數(shù)據(jù)采用utf-8編碼,直接打開可能會出現(xiàn)亂碼的情況,因此在讀取數(shù)據(jù)時需要指定字符編碼集
公眾號(Datawhale)后臺回復“202013”獲取打包的項目源碼和數(shù)據(jù)
