一、數據描述
1.1數據集描述
數據集為某電商平台2016年一整年的交易數據, 數據包含104557條數據,10個字段。
1.2數據展示

二、問題提出
1、各個月的訂單數是否均衡?
2、在不同價格段之間的商品銷售情況?
3、在不同時間段下單情況如何?
三、數據清洗和預處理
3.1缺失值處理
df.isnull().sum(axis=0) # 查看缺失值 ---------------------------------------- orderId 0 userId 0 productId 0 cityId 0 price 0 payMoney 0 channelId 8 deviceType 0 createTime 0 payTime 0 deviceName 87 dtype: int64
發現 deviceName 有87個缺失值,而 deviceType 沒有缺失值,看一下 deviceType 的取值分布:
df["deviceType"].value_counts() ---------------------------------- 2 52448 3 42948 1 7054 4 2017 6 87 5 3 Name: deviceType, dtype: int64
發現這一列有類別為6的值,數量剛好為87,而設備信息文件並沒有6這個類別,懷疑是信息填錯了,將其重新歸類為5,同時將 deviceName 的缺失值用"other"進行填充:
df['deviceType'].replace({6: 5}, inplace = True) df.fillna({"deviceName": "other"}, inplace=True)
還有一列有8個缺失值,數據占比較少,我們直接將其刪除:
df.dropna(inplace=True) df.isnull().sum(axis=0) ------------------------ orderId 0 userId 0 productId 0 cityId 0 price 0 payMoney 0 channelId 0 deviceType 0 createTime 0 payTime 0 deviceName 0 dtype: int64
刪除缺失值之后,再來看一下數據集的大小:
df.shape -------------------------- (104549, 11)
3.2異常值處理
可以通過數據概況初步探索異常值:
df.describe()

根據上面的結果可以看出 productId 最小值是0,payMoney 有負值,這明顯是不合理的,我們需要對其進行處理。
首先看看 productId 值為0的數量,數量較少的話直接刪除:
df.productId[(df.productId == 0)].size ------------------------------------------------- 177 # 177條記錄,數量不多,直接刪掉 df.drop(index=df[df.productId==0].index, inplace=True)
對於 payMoney 存在負值的記錄,直接將其刪除:
df.productId[(df.payMoney < 0)].size ---------------------------------------- 6 # 只有6條記錄,直接刪除 df.drop(index=df[df.payMoney < 0].index, inplace=True)
再看一下這兩列值的情況:
df[["productId", "payMoney"]].describe() ------------------------------------------ productId payMoney count 104366.000000 1.043660e+05 mean 505.417626 8.690449e+04 std 287.629531 9.075357e+04 min 1.000000 0.000000e+00 25% 255.000000 3.360000e+04 50% 508.000000 5.500000e+04 75% 759.000000 1.040000e+05 max 1000.000000 2.294200e+06
四、各變量相關性數據分析與可視化
4.1總體情況分析
先來看一下2016年一年的總體情況:
# 總訂單數,總下單用戶,總銷售額,有銷售的商品數 print(df.orderId.count()) print(df.userId.unique().size) print(df.payMoney.sum()/100) # 原單位是“分”,需要轉換成“元” print(df.productId.unique().size) -------------------------------------- 104356 102474 906931.2370000001 1000
再看看一下各個月的情況:
# 增加一個月份列,方便按照月份來進行統計 df['month'] = df["payTime"].dt.month month = df["month"].unique() order_count = df.groupby(by='month').count()["orderId"] plt.bar(month, order_count) plt.show()
4.1各維度分析
分析數據可以從兩方面開始考慮,一個是維度,一個是指標,維度可以看做x軸,指標可以看成是y軸,同一個維度可以分析多個指標,同一個維度也可以做降維升維。
價格分析
對於價格,可以看下所有商品價格的分布,這樣可以知道什么價格的商品賣的最好:
# 原單位是“分”,需要轉換成“元” df['price'] = df['price'] / 100 # 先按照100的區間取分桶 bins = np.arange(0, 7500, 100) print(pd.cut(df.price, bins).value_counts()) ----------------------------------------------- (400, 500] 14791 (300, 400] 10737 (200, 300] 9966 (500, 600] 9189 (600, 700] 8777 (100, 200] 7123 (700, 800] 7111 .... (6400, 6500] 2 (5500, 5600] 1 (7300, 7400] 0 Name: price, Length: 74, dtype: int64 plt.figure(figsize=(16, 16)) plt.hist(df['price'], bins)

下單時間分析
按小時分析:
# 按小時的下單量分布,可以按時間做推廣 df['orderHour'] = df.createTime.dt.hour df.groupby('orderHour').count()['orderId'].plot()

從上圖可以看出, 中午12-14點下單比較多,應該是午休的時候,然后是晚上20點左右,晚上20點左右幾乎是所有互聯網產品的一個高峰,下單高峰要注意網站的穩定性、可用性。下單高峰時間段也可以考慮進行推廣,效果會更佳。
按星期分析:
df['orderWeek'] = df.createTime.dt.dayofweek + 1 df.groupby('orderWeek').count()['orderId'].plot()

從上面可以看出,上班時間訂單量不斷上升,在周六達到頂峰,休息時間人們有更強的購買欲望,這也是比較符合現實的。
支付時間分析
可以看一下客戶在下單之后多久時間會進行支付:
def get_seconds(x): return x.total_seconds() df['payDelta'] = (df['payTime'] - df['createTime']).apply(get_seconds) bins = [0, 50, 100, 1000, 10000, 100000] pd.cut(df.payDelta, bins).value_counts() --------------------------------------- (0, 50] 79229 (100, 1000] 12899 (50, 100] 10674 (1000, 10000] 968 (10000, 100000] 231 Name: payDelta, dtype: int64
從上面可以看出,大部分人下單50秒以內就會進行支付,說明用戶基本很少猶豫,購買的目的性很強。
用餅圖看一下比例:
pd.cut(df.payDelta, bins).value_counts().plot(kind='pie', autopct='%d%%', shadow=True, figsize=(10, 4))

五、主要結論
通過對電商歷史交易數據的清洗和分析,給出一些可以提升銷量的建議,當然這只是簡單的分析,需要更好的提升銷量還需要更加深入和專業的分析才行。
