1. 程式人生 > 實用技巧 >電商資料分析

電商資料分析

天貓訂單分析
Logout 

Python 3  

可信的
File
Edit
View
Insert
Cell
Kernel
Widgets
Help







執行






In [44]:


​
'''
根據天貓定訂單資料集進行訂單的綜合分析
共有28010條資料
​
欄位的說明:
    訂單編號:訂單編號
    總金額:訂單總金額
    買家實際支付金額:總金額 - 退款金額(在已付款的情況下)
    收貨地址:各個省份
    訂單建立時間:下單時間
    訂單付款時間:付款時間
    退款金額:付款後申請退款的金額。
    
分析的目的:
    訂單每個環節的轉化轉化率
    訂單成交的時間(按天)趨勢(按實際成交)
    訂單數(各省)
 
''' Out[44]: '\n根據天貓定訂單資料集進行訂單的綜合分析\n共有28010條資料\n\n欄位的說明:\n 訂單編號:訂單編號\n 總金額:訂單總金額\n 買家實際支付金額:總金額 - 退款金額(在已付款的情況下)\n 收貨地址:各個省份\n 訂單建立時間:下單時間\n 訂單付款時間:付款時間\n 退款金額:付款後申請退款的金額。\n \n分析的目的:\n 訂單每個環節的轉化轉化率\n 訂單成交的時間(按天)趨勢(按實際成交)\n 訂單數在地圖上的分佈\n ' In [45]: ​ # 匯入相關的資料包 import
numpy as np import matplotlib.pyplot as plt import pandas as pd import os import warnings warnings.filterwarnings('ignore') In [46]: # 讀取資料 df = pd.read_csv('tmall_order_report.csv',engine='python',encoding='utf8') In [47]: df.head().append(df.tail()) #檢視資料的前5行及後5行。.head()預設前五行 Out[
47]: 訂單編號 總金額 買家實際支付金額 收貨地址 訂單建立時間 訂單付款時間 退款金額 0 1 178.8 0.0 上海 2020-02-21 00:00:00 NaN 0.0 1 2 21.0 21.0 內蒙古自治區 2020-02-20 23:59:54 2020-02-21 00:00:02 0.0 2 3 37.0 0.0 安徽省 2020-02-20 23:59:35 NaN 0.0 3 4 157.0 157.0 湖南省 2020-02-20 23:58:34 2020-02-20 23:58:44 0.0 4 5 64.8 0.0 江蘇省 2020-02-20 23:57:04 2020-02-20 23:57:11 64.8 28005 28006 37.0 37.0 四川省 2020-02-27 00:01:00 2020-02-27 00:01:10 0.0 28006 28007 69.0 0.0 上海 2020-02-27 00:00:18 NaN 0.0 28007 28008 69.0 0.0 上海 2020-02-27 00:00:17 NaN 0.0 28008 28009 37.0 37.0 遼寧省 2020-02-27 00:00:09 2020-02-27 00:00:17 0.0 28009 28010 37.0 37.0 廣東省 2020-02-27 00:00:06 2020-02-27 00:00:11 0.0 In [ ]: ​ In [48]: # 處理資料 df.columns #檢視資料欄位名 Out[48]: Index(['訂單編號', '總金額', '買家實際支付金額', '收貨地址 ', '訂單建立時間', '訂單付款時間 ', '退款金額'], dtype='object') In [49]: # 將欄位名中的空格去掉 df = df.rename (columns = {'收貨地址 ':'收貨地址','訂單付款時間 ':'訂單付款時間'}) # df = df.rename( columns = {'收貨地址 ':'收貨地址','訂單付款時間 ':'訂單付款時間'} ) In [50]: df.info() #檢視資料有多少行,是否有缺失值,以及每列的資料型別 <class 'pandas.core.frame.DataFrame'> RangeIndex: 28010 entries, 0 to 28009 Data columns (total 7 columns): 訂單編號 28010 non-null int64 總金額 28010 non-null float64 買家實際支付金額 28010 non-null float64 收貨地址 28010 non-null object 訂單建立時間 28010 non-null object 訂單付款時間 24087 non-null object 退款金額 28010 non-null float64 dtypes: float64(3), int64(1), object(3) memory usage: 1.5+ MB In [51]: df.duplicated().sum() #檢視是否有重複值 Out[51]: 0 In [52]: df.isnull().sum() #檢視是否有缺失值 Out[52]: 訂單編號 0 總金額 0 買家實際支付金額 0 收貨地址 0 訂單建立時間 0 訂單付款時間 3923 退款金額 0 dtype: int64 In [ ]: ​ In [53]: ''' 訂單轉化率: 總訂單數 付款訂單數 (訂單提交後並將錢付給第三方) 到款訂單數 (客戶成功收貨並沒有申請退換貨,完成交易) 全額到款訂單數 ''' Out[53]: '\n訂單轉化率:\n 總訂單數\n 付款訂單數 (訂單提交後並將錢付給第三方)\n 到款訂單數 (客戶成功收貨並沒有申請退換貨,完成交易)\n 全額到款訂單數\n' In [54]: # 訂單總數 buy_dict = dict() #建立一個交易資訊統計字典 key = '總訂單數' buy_dict[key] = len(df) buy_dict[key] Out[54]: 28010 In [56]: # 付過款的訂單數 key = '付款的訂單數' df_payed = df[df['訂單付款時間'].notnull()] buy_dict[key] = len(df_payed) buy_dict[key] # df[df['訂單付款時間'].notnull()] Out[56]: 24087 In [57]: # 到款訂單數(賣家實際支付的金額!=0,說明訂單商家收到過款) key = '到款訂單數' df_trans = df_payed[df_payed['買家實際支付金額'] !=0] buy_dict[key]=len(df_trans) buy_dict[key] Out[57]: 18955 In [59]: # 全額貸款訂單數 key = '全額貸款訂單數' df_trans_full = df_payed[df_payed['退款金額'] ==0] buy_dict[key]=len(df_trans_full) buy_dict[key] Out[59]: 18441 In [60]: # 檢視轉化資料 buy_dict Out[60]: {'總訂單數': 28010, '付款的訂單數': 24087, '到款訂單數': 18955, '全額貸款訂單數': 18441} In [61]: df_convs = pd.Series(buy_dict,name ='訂單數' ).to_frame() df_convs Out[61]: 訂單數 總訂單數 28010 付款的訂單數 24087 到款訂單數 18955 全額貸款訂單數 18441 In [62]: # 總體轉化率 # 新增總體轉化率,每個環節除以總訂單數 name = '總體轉化率' total_convs = df_convs['訂單數']/df_convs.loc['總訂單數','訂單數'] * 100 df_convs[name] = total_convs.apply(lambda x : round(x,0)) df_convs Out[62]: 訂單數 總體轉化率 總訂單數 28010 100.0 付款的訂單數 24087 86.0 到款訂單數 18955 68.0 全額貸款訂單數 18441 66.0 In [63]: # 單一轉化率 # 新增單一環節轉化率,每個環節除以上個環節 name = '單一環節轉化率' single_convs = df_convs['訂單數'].shift() df_convs[name] = single_convs.fillna(df_convs.loc['總訂單數','訂單數']) df_convs[name] = round((df_convs['訂單數']/df_convs[name] * 100),0) df_convs ​ ​ Out[63]: 訂單數 總體轉化率 單一環節轉化率 總訂單數 28010 100.0 100.0 付款的訂單數 24087 86.0 86.0 到款訂單數 18955 68.0 79.0 全額貸款訂單數 18441 66.0 97.0 In [ ]: ​ In [67]: # 整體訂單數趨勢 df_trans['訂單建立時間'] = df_trans['訂單建立時間'].astype('datetime64') df_trans = df_trans.set_index("訂單建立時間") df_trans.head() Out[67]: 訂單編號 總金額 買家實際支付金額 收貨地址 訂單付款時間 退款金額 訂單建立時間 2020-02-20 23:59:54 2 21.0 21.0 內蒙古自治區 2020-02-21 00:00:02 0.0 2020-02-20 23:58:34 4 157.0 157.0 湖南省 2020-02-20 23:58:44 0.0 2020-02-20 23:56:39 6 327.7 148.9 浙江省 2020-02-20 23:56:53 178.8 2020-02-20 23:56:36 7 357.0 357.0 天津 2020-02-20 23:56:40 0.0 2020-02-20 23:56:12 8 53.0 53.0 浙江省 2020-02-20 23:56:16 0.0 In [75]: import matplotlib matplotlib.rcParams['font.sans-serif'] = ['SimHei'] se_trans_month = df_trans.resample('D')['訂單編號'].count() se_trans_month.plot() se_trans_month.name Out[75]: '訂單編號' In [70]: # 可以看到在二月的上半月,企業很多由於新年而未復工,快遞大多停運,無法發貨 # 下半月企業復工,訂單逐漸上漲。 In [71]: df_trans['買家實際支付金額'].mean() Out[71]: 100.36861777895066 In [ ]: ​ ​ In [74]: # 銷量區域分佈 import matplotlib matplotlib.rcParams['font.sans-serif'] = ['SimHei'] se_trans_map = df_trans.groupby('收貨地址')['收貨地址'].count().sort_values(ascending=False) plt.figure(dpi=100) se_trans_map.plot(kind='bar') Out[74]: <matplotlib.axes._subplots.AxesSubplot at 0x2ed0d0ef668> In [ ]: ​

'''
根據天貓定訂單資料集進行訂單的綜合分析
共有28010條資料

欄位的說明:
    訂單編號:訂單編號
    總金額:訂單總金額
    買家實際支付金額:總金額 - 退款金額(在已付款的情況下)
    收貨地址:各個省份
    訂單建立時間:下單時間
    訂單付款時間:付款時間
    退款金額:付款後申請退款的金額。
    
分析的目的:
    訂單每個環節的轉化轉化率
    訂單成交的時間(按天)趨勢(按實際成交)
    訂單數(各省)
 '''


# 匯入相關的資料包
import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 
import os 
import warnings
warnings.filterwarnings('ignore')

# 讀取資料
df = pd.read_csv('tmall_order_report.csv',engine='python',encoding='utf8')

df.head().append(df.tail()) #檢視資料的前5行及後5行。.head()預設前五行



# 處理資料
df.columns   #檢視資料欄位名

# 將欄位名中的空格去掉
df = df.rename (columns = {'收貨地址 ':'收貨地址','訂單付款時間 ':'訂單付款時間'})
# df = df.rename( columns = {'收貨地址 ':'收貨地址','訂單付款時間 ':'訂單付款時間'} )

df.info()   #檢視資料有多少行,是否有缺失值,以及每列的資料型別

df.duplicated().sum()   #檢視是否有重複值

df.isnull().sum()   #檢視是否有缺失值



'''
訂單轉化率:
    總訂單數
    付款訂單數  (訂單提交後並將錢付給第三方)
    到款訂單數   (客戶成功收貨並沒有申請退換貨,完成交易)
    全額到款訂單數
'''

# 訂單總數
buy_dict = dict()  #建立一個交易資訊統計字典
key = '總訂單數'
buy_dict[key] = len(df)
buy_dict[key]

# 付過款的訂單數
key = '付款的訂單數'
df_payed = df[df['訂單付款時間'].notnull()]
buy_dict[key] = len(df_payed)
buy_dict[key]
# df[df['訂單付款時間'].notnull()]

# 到款訂單數(賣家實際支付的金額!=0,說明訂單商家收到過款)
key = '到款訂單數'
df_trans = df_payed[df_payed['買家實際支付金額'] !=0]
buy_dict[key]=len(df_trans)
buy_dict[key]

# 全額貸款訂單數
key = '全額貸款訂單數'
df_trans_full = df_payed[df_payed['退款金額'] ==0]
buy_dict[key]=len(df_trans_full)
buy_dict[key]

# 檢視轉化資料
buy_dict

df_convs = pd.Series(buy_dict,name ='訂單數' ).to_frame()
df_convs

# 總體轉化率
# 新增總體轉化率,每個環節除以總訂單數
name = '總體轉化率'
total_convs = df_convs['訂單數']/df_convs.loc['總訂單數','訂單數'] * 100
df_convs[name] = total_convs.apply(lambda x : round(x,0))
df_convs

# 單一轉化率
# 新增單一環節轉化率,每個環節除以上個環節
name = '單一環節轉化率'
single_convs = df_convs['訂單數'].shift()
df_convs[name] = single_convs.fillna(df_convs.loc['總訂單數','訂單數'])
df_convs[name] = round((df_convs['訂單數']/df_convs[name] * 100),0)
df_convs





# 整體訂單數趨勢
df_trans['訂單建立時間'] = df_trans['訂單建立時間'].astype('datetime64')
df_trans = df_trans.set_index("訂單建立時間")
df_trans.head()

import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
se_trans_month = df_trans.resample('D')['訂單編號'].count()
se_trans_month.plot()
se_trans_month.name

# 可以看到在二月的上半月,企業很多由於新年而未復工,快遞大多停運,無法發貨
# 下半月企業復工,訂單逐漸上漲。

df_trans['買家實際支付金額'].mean()




# 銷量區域分佈
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
se_trans_map = df_trans.groupby('收貨地址')['收貨地址'].count().sort_values(ascending=False)
plt.figure(dpi=100)   
se_trans_map.plot(kind='bar')