訂單數據做爲電商數據分析中的基礎分析項目,本項目就京東的訂單數據進行分析。經過數據分析和可視化深挖數據產生的緣由,掌握基礎的數據分析能力。python
本次數據來源於京東2020年5月25日 你們電-冰箱的訂單數據 按照10%的隨機抽樣後進行數據脫敏最後獲得的訂單數據,共有訂單數據大約70K,數據來源於公開網絡數據。express
訂單中的屬性將其分紅了3類,分別是用戶屬性、訂單屬性以及商品屬性網絡
本項目使用python對數據進行處理 使用plotly進行數據可視化app
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
讀取提供的數據ide
df=pd.read_csv('data.csv',sep='\t', encoding="utf-8", dtype=str)
查看數據的缺失值ui
df.isnull().sum().sort_values(ascending=False)
user_site_city_id 38190
user_site_province_id 38033
check_account_tm 23271編碼
經過觀察發現,這3個數據有部分缺失值,其中user_site_city_id 用戶所在城市編號,user_site_province_id 用戶所在省份的編號,check_account_tm支付時間spa
這部分數據的缺失是由於用戶填寫我的資料時跳過的部分,固然這不影響咱們整個數據的分析3d
咱們首先是將數據的類型進行轉換 同時處理缺失值和異常值code
#刪除優惠前價格小於288元的
df = df[df['before_prefr_unit_price' ]>= 288]
#訂單編號具備惟一性,所以須要刪除重複的數據
df.drop_duplicates(subset=['sale_ord_id'],keep='first',inplace=True)
#填充城市和省份的缺失數據
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
#實際支付的價格=商品數量*優惠後單價
df['total_actual_pay'] = df['sale_qtty'] * df['after_prefr_unit_price']
到這裏咱們就完成了數據的預處理部分
經過數據觀察,有的訂單出現了取消,所以咱們經過餅圖查看取消和未取消的比例
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%的訂單取消了,取消的比例多是地址填寫錯了、沒有領到優惠劵等狀況,使取消支付的比例佔有一部分的比例
經過觀察數據咱們發現了用戶有提交了訂單,可是沒有支付的狀況
#找到全部的有效訂單
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%的用戶取消了支付,取消支付的比例小於取消訂單的比例,所以對於有訂單信息的用戶可是未支付的,有比較強的購買目的,多是因爲優惠劵或者價格等因素使其取消支付,所以針對這部分用戶多是價格比較敏感的用戶,咱們能夠推送京東優惠卡。
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如下,所以在進行冰箱廣告推廣時,能夠優先考慮價格低於2K的冰箱,這類冰箱具備較大的市場。
同時經過觀察,冰箱價格在4K之內分佈較爲均勻,超過4K之後,冰箱累計上升區間緩慢,所以咱們能夠大體認爲,當冰箱的價格超過4K,這部分冰箱價格咱們能夠認爲是偏豪華型的冰箱,具備單個冰箱利潤高,可是銷售市場佔比少。
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='有效訂單數')
)
fig = go.Figure(data=trace,layout=layout)
fig
經過觀察,0點有效訂單數出現了激增的狀況,這一部分是出現了異常訂單仍是說過了0點之後經過搶購物券使這一部分訂單增長?
同時,除了0點外,十、20點有效訂單數具備一個較高的值,說明用戶比較偏向於早上10點和晚上20點付款。早上10點付款推測緣由多是剛到公司,先逛一下京東摸摸魚,晚上20點推測緣由是晚飯後,這個時間距離睡覺還比較早,用戶刷手機的頻率增長,所以增長有效訂單數。
針對0點有效訂單數偏高的問題,咱們進行進一的分析人均有效訂單的狀況。
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
經過觀察發現,0點時候的人均有效訂單率處於較爲正常的值,甚至比1點的有效訂單率低,所以有效訂單的激增,咱們認爲很大機率是經過搶優惠劵增長而不是出現了惡意刷單。
同時咱們看到20點的人均有效訂單率也是處於較爲正常的值
客單價=銷售額/顧客數
平均訂單價=銷售額/訂單數
0時客單價和平均訂單價在全天有個較高的值,會不會是小部分用戶的極端購物行爲產生這樣的數據呢?
所以咱們看一下0時和20時價格訂單的分佈圖
經過看0時和20時不一樣時間段訂單累計分佈圖咱們能夠看到
大約20%的0時用戶的訂單在2K如下,20時用戶在2K如下的訂單佔比爲75%
這說明0時的用戶並補只有一小部分的訂單價格很高,而是0時的用戶廣泛的購物具備較高的客單價。
所以咱們推測,0時用戶是否具備必定的衝動購物的狀況,而20時購物的用戶相對理智一些
也可能時用戶爲了使用優惠劵使高額的訂單大多集中在0時
對於冰箱市場而言,哪些省份是冰箱的頭部市場呢?
經過查看不一樣省份有效訂單分佈圖咱們能夠看到,訂單的市場大多集中在一線城市或者經濟較爲發達的省份,這部分城市經濟發達,對於年輕人有較強大的吸引力,所以購置冰箱的訂單數較高。
那麼這些不一樣省份客單價是否會不一樣?其中上海客單價最高,廣東的訂單數量最多,由於廣州在外貿上具備較大的優點,所以有具備較大的實體工廠,能吸納較多的低端人才,所以出現訂單數量多而客單價不高的狀況。
與之相反的是上海做爲國家的金融中心,匯聚了較多的金融方向的從業者,所以在消費品質上有一個較大的提高。
最後咱們來看看不一樣品牌的客單價
經過圖中咱們能夠看到,卡薩帝穩居客單價排行第一的品牌,妥妥的豪華冰箱品牌
價格的第一梯隊品牌有 博世、西門子、松下、三星 平均價格在4K以上
價格的第二梯隊品牌有 海爾、小米、伊萊克斯、格蘭仕、美的 平均價格在2K以上 其中有很多國產品牌的身影
剩下的品牌價格都在2K如下,這部分市場消費需求大,所以各大品牌在這一區間段價格競爭比較激烈。
本項目針對京東的冰箱訂單數據進行了分析,在分析過程當中沒用使用複雜的模型以及炫酷的圖表,而是經過普通的數據展現一步步深挖數據產生的緣由,並提出了一部分產生數據的緣由。所以在數據分析中,每每數據指標的創建對於數據的深挖具備較大的意義,同時針對異常數據提出必定的推測和假設,經過有效的數據分析進行當心求證。
數據採用utf-8編碼,直接打開可能會出現亂碼的狀況,所以在讀取數據時須要指定字符編碼集
公衆號(Datawhale)後臺回覆「202013」獲取打包的項目源碼和數據