一、分析思路
通過對淘寶用戶行為數據進行分析,展現業務現狀和解決一些業務問題。分析思路如下:
二、數據背景
數據來源阿里天池:https://tianchi.aliyun.com/dataset/dataDetail?dataId=649
三、數據清洗
① 導入數據
此處僅用python導入2000000條數據進行分析,源數據沒有列名,加上列名。
import pandas as pd
import matplotlib.pyplot as plt
import datetime
data = pd.read_csv('project/UserBehavior.csv', header=None, nrows=2000000,
names=['user_id', 'item_id', 'category_id', 'behavior_type', 'time'])
print(data.head())
② 缺失數據處理
print(data.isnull().sum())
沒有缺失值,無須刪除空值數據。
③ 對time列時戳值轉換類型,並拆分time列成date和hour
data['time'] = pd.to_datetime(data['time'], unit='s') + datetime.timedelta(hours=8)
print(data.head())
data['date'] = data['time'].map(lambda x: x.strftime('%Y-%m-%d %H').split(' ')[0])
data['hour'] = data['time'].map(lambda x: x.strftime('%Y-%m-%d %H').split(' ')[1])
pd.set_option('display.max_columns', 10)
print(data.head())
④ 將數據按date、hour列排序,重置索引;刪除超出時間范圍的異常數據
data = data.sort_values(by=['date', 'hour'], ascending=True)
data = data.reset_index(drop=True)
print(data.head(10))
df_bool = (data.loc[:, 'date'] > '2017-11-24') & (data.loc[:, 'date'] < '2017-12-04')
data = data.loc[df_bool, :].reset_index(drop=True)
print(data.head(10))
四、數據分析
(1)流失和轉化分析
① pv點擊量到購買量的轉化
用戶行為統計數量:
pv_convert_data = data['behavior_type'].value_counts()
print(pv_convert_data)
pv的轉化率:
pv_convert_data = pv_convert_data.div(pv_convert_data['pv']).apply(lambda x: format(x, '.2%'))
print(pv_convert_data)
運用tableau展示pv到各環節的轉化:
分析:購買量的轉化率只有2.25%,很低。推測可能是用戶瀏覽到的商品大多不是用戶需要的,存在用戶反復瀏覽商品卻不購買的情況。
建議:電商平台可以根據用戶畫像適當推送用戶可能需要的商品,也可以優化篩選功能,方便用戶找到需要的產品,提高轉化率。
② uv訪客量到購買量的轉化
每種行為獨立用戶數量的統計:
uv = data['user_id'].unique().shape[0] # 獨立訪客數
pv = data[data['behavior_type'] == 'pv'].drop_duplicates(['user_id']).shape[0] # 有過點擊行為的用戶數量
cart = data[data['behavior_type'] == 'cart'].drop_duplicates(['user_id']).shape[0] # 有過添加購物車行為的用戶數量
fav = data[data['behavior_type'] == 'fav'].drop_duplicates(['user_id']).shape[0] # 有過收藏行為的用戶數量
buy = data[data['behavior_type'] == 'buy'].drop_duplicates(['user_id']).shape[0] # 有過購買行為的用戶數量
unique_user = pd.Series([uv, pv, cart, fav, buy], index=['uv', 'pv', 'cart', 'fav', 'buy'])
print(unique_user)
uv的轉化率:
uv_convert_data = unique_user.div(unique_user['uv']).apply(lambda x: format(x, '.2%'))
print(uv_convert_data)
運用tableau展示uv到各個環節的轉化:
分析:可以看到uv的轉化率為68.21%,用戶流失率為31.79%。需要根據電商平台以往數據並結合行業數據分析是否在正常范圍內。
建議:可以看出收藏率其實是高於購買率的,流失的部分用戶是有可能再次成為活躍用戶的。可以篩選出此類客戶,根據用戶畫像適當推送關注產品,或打折促銷刺激購買欲望。
(2)用戶行為的時間模式分析
① 數據集所選時期用戶每天活躍度
pv_daily = data[data['behavior_type'] == 'pv'].groupby('date')['user_id'].count()
pv_daily = pv_daily.reset_index().rename(columns={'user_id': 'pv'})
uv_daily = data.groupby('date')['user_id'].apply(lambda x: x.drop_duplicates().count())
uv_daily = uv_daily.reset_index().rename(columns={'user_id': 'uv'})
x = pv_daily['date']
y1 = pv_daily['pv']
y2 = uv_daily['uv']
fig = plt.figure(figsize=(10, 6))
plt.subplot(1, 1, 1)
plt.plot(x, y1, label='pv', linewidth=1.8, color='r', marker='o', markersize=4)
plt.plot(x, y2, label='uv', linewidth=1.8, linestyle='--', marker='^', markersize=4)
plt.legend(loc='best')
plt.title("User daily behavior data", fontsize=24)
plt.savefig('project/User daily behavior data.png')
分析:從每天的點擊量和訪客量,大致可以看出周末周末活躍度均高於工作日,周一周二相對更低。與人們平時作息模式相符合,周末可能擁有更多時間網購。12.2和12.3周末用戶活躍度高於上個周末,可以核實電商平台是否在該周末有活動。
② 用戶每天各時間段活躍度
pv_time = data[data['behavior_type'] == 'pv'].groupby('hour')['user_id'].count()
pv_time = pv_time.reset_index().rename(columns={'user_id': 'pv'})
uv_time = data.groupby('hour')['user_id'].apply(lambda x: x.drop_duplicates().count())
uv_time = uv_time.reset_index().rename(columns={'user_id': 'uv'})
x = pv_time['hour']
y1 = pv_time['pv']
y2 = uv_time['uv']
plt.figure(figsize=(10, 6))
plt.subplot(1, 1, 1)
plt.plot(x, y1, label='pv', color='r', linewidth=1.8, marker='o', markersize=4)
plt.bar(x, y2, label='uv')
plt.legend(loc='best')
plt.title("User time period behavior data", fontsize=24)
plt.savefig('project/User time period behavior data.png')
分析:可以看出白天工作時間內電商平台流量相對平穩,從晚上6點開始急劇攀升,在晚上9點10點達到峰值,於晚上11點過后開始下降。符合人們日常作息習慣。電商平台如果有運營活動可選擇在晚上9點到10點流量高峰期開展。
(3)商品和商品種類分析
① 商品種類點擊量和購買量之間的關系
pv_category = data[data['behavior_type'] == 'pv'].groupby('category_id')['user_id'].count().sort_values(ascending=False)
buy_category = data[data['behavior_type'] == 'buy'].groupby('category_id')['user_id'].count().sort_values(ascending=False)
merge1 = pd.merge(pv_category, buy_category, on='category_id', how='outer').fillna(0)
x = merge1['user_id_x']
y = merge1['user_id_y']
plt.figure(figsize=(8, 6))
plt.scatter(x, y, marker='o', color='g')
plt.xlabel("Commodity category clicks", fontsize=14)
plt.ylabel("Commodity category purchase", fontsize=14)
plt.title("Commodity category clicks and purchase relationship", fontsize=18)
plt.savefig('project/Commodity category clicks and purchase relationship.png')
分析:可以看出商品種類點擊量和購買量大抵是正相關的,也存在點擊量不高但購買量超高的情況,如圖中左上角的點。也有點擊量和購買量都高的部分商品種類,如圖中右上角的部分點。
② 前10點擊量或購買量的商品種類
merge1.rename(columns={'user_id_x': 'pv', 'user_id_y': 'buy'}, inplace=True)
merge1['convert_rate'] = merge1['buy'].div(merge1['pv']).apply(lambda x: format(x, '.2%'))
print(merge1.sort_values(by='pv', ascending=False)[:10])
print(merge1.sort_values(by='buy', ascending=False)[:10])
分析:可以看出最高點擊量的商品種類大多轉化率都很低,可以看出這些商品種類並非客戶很需要的。電商平台需要對這些種類商品本身進行分析了,是否是用戶真正需要的?還是價格太高?還是貨量太少?或者是其他原因。電商平台還可以根據購買量較高的商品種類去上架和推送商品。
③ 商品點擊量和購買量之間的關系
pv_item = data[data['behavior_type'] == 'pv'].groupby('item_id')['user_id'].count().sort_values(ascending=False)
buy_item = data[data['behavior_type'] == 'buy'].groupby('item_id')['user_id'].count().sort_values(ascending=False)
merge2 = pd.merge(pv_item, buy_item, on='item_id', how='outer').fillna(0)
print(merge2.head(10))
x = merge2['user_id_x']
y = merge2['user_id_y']
plt.figure(figsize=(8, 6))
plt.scatter(x, y, marker='o', color='g')
plt.xlabel("Commodity clicks", fontsize=14)
plt.ylabel("Commodity purchase", fontsize=14)
plt.title("Commodity clicks and purchase relationship", fontsize=18)
plt.savefig('project/Commodity clicks and purchase relationship.png')
分析:商品點擊量和購買量大抵成正相關關系,但與上面一樣,存在點擊量超高購買量卻很低的情況。對於這些商品需要着重進行具體的考量才能提高轉化率。
④ 前10點擊量或購買量的商品
merge2.rename(columns={'user_id_x': 'pv', 'user_id_y': 'buy'}, inplace=True)
merge2['convert_rate'] = merge2['buy'].div(merge2['pv']).apply(lambda x: format(x, '.2%'))
print(merge2.sort_values(by='pv', ascending=False)[:10])
print(merge2.sort_values(by='buy', ascending=False)[:10])
分析:根據結果可以看出,部分商品點擊量很低但購買量卻超高,電商平台需要對這些具體商品着重考量。分析為什么受歡迎,是不是可以考慮加大這些商品的推送力度?點擊量很高,購買量卻很少的商品是不是價格過高還是不太適應用戶需要,這些也需要具體根據商品本身進行分析。
(4)用戶價值分析
根據RFM模型對用戶進行分層,找出核心價值用戶。
① 統計每個用戶的購買次數:
data_buy = data[data['behavior_type'] == 'buy']
userbuynum = data_buy['user_id'].value_counts().sort_values(ascending=False)
print(userbuynum.head(10))
print(userbuynum.describe())
② 按購買次數設置F值:
def fz(x):
if 35 < x <= 72:
return 'a'
elif 4 < x <= 35:
return 'b'
elif 2 < x <= 4:
return 'c'
elif x == 2:
return 'd'
else:
return 'e'
Fscore = userbuynum.map(fz)
print(Fscore.head())
③ 根據每個用戶最近購買時間決定R值:
Rsco = []
for u in userbuynum.index:
day = data_buy[data_buy['user_id'] == u]['date'].iloc[-1]
if day == '2017-12-03':
r = 'A'
elif day in ('2017-12-02', '2017-12-01'):
r = 'B'
elif day in ('2017-11-30', '2017-11-29'):
r = 'C'
elif day in ('2017-11-28', '2017-11-27'):
r = 'D'
else:
r = 'E'
Rsco.append(r)
Rscore = pd.Series(Rsco, index=userbuynum.index)
print(Rscore.head())
④ RFM模型綜合評估值:
Rscore.name = 'Rscore'
Fscore.name = 'Fscore'
scoreDF = pd.concat([Rscore, Fscore], axis=1, sort=False)
scoreDF['RF'] = scoreDF['Rscore'] + scoreDF['Fscore']
print(scoreDF.head())
⑤ 按RF值統計客戶數量:
print(scoreDF['RF'].value_counts().sort_index())
⑥ 8個重要價值客戶的id(RF值為Aa):
print(scoreDF[scoreDF['RF'] == 'Aa'].index)
分析:這8個客戶最近消費時間近且次數多,是vip客戶,需要重視他們的商品需求。同理可找出Ca/Da客戶,他們是需要重點保持客戶,購買量高,但消費時間遠,是有段時間沒來的忠實用戶,需要主動保持聯系;Ac/Ad客戶是重要發展客戶,消費時間近,但頻次不高,忠誠度不夠,但有潛力,發展的好可以成為忠實用戶。
五、總結和建議
① 根據轉化和流失分析,可以看出用戶花大量時間在瀏覽不需要的商品,建議優化電商平台篩選功能,增加關鍵詞的准確率,分析用戶畫像,結合用戶行為向客戶推薦可能需要的商品。
② 根據用戶行為的時間模式,選擇用戶流量高峰期舉辦活動,比如網絡紅人直播,發放優惠券等促銷活動均可選擇此時間段進行。
③ 根據商品和商品種類分析結果,可以考慮優化商品推送功能,點擊量少購買量高的商品可以加大推送力度,點擊量高購買量少的商品可以適當打折進行促銷。
④ 對於不同分層的用戶可考慮積分制等策略吸引新用戶,讓客戶習慣使用電商平台。鼓勵老客戶向他人推薦,通過給推薦人和被推薦人發放較低門檻優惠券鼓勵用戶,擴大用戶傳播。