一照宝、分析目的:
結(jié)合數(shù)據(jù)集,根據(jù)用戶行為路徑句葵,制作漏斗轉(zhuǎn)化圖厕鹃,分析用戶消費行為各結(jié)點轉(zhuǎn)化情況,了解業(yè)務(wù)和用戶現(xiàn)狀乍丈。
二剂碴、分析過程:
導(dǎo)入包
import pandas as pd
import numpy as np
import sqlalchemy
import warnings
warnings.filterwarnings('ignore')
1、讀取數(shù)據(jù)
# 讀取數(shù)據(jù)诗赌。plat_flow:平臺流量表汗茄;plat_check:貸款審核表
engine=sqlalchemy.create_engine('mysql+pymysql://frogdata05:Frogdata!1321@localhost:3306/froghd')
sql_flow='select * from plat_flow'
dt_flow=pd.read_sql(sql=sql_flow,con=engine)
sql_check = 'select * from loans_check'
dt_check = pd.read_sql(sql=sql_check, con=engine)
dt_flow.rename(columns={
"date":"日期",
"PV":"PV",
"UV":"UV",
"regist_cnt":"注冊數(shù)",
"regist_rate":"訪客注冊率",
"active_cnt":"激活數(shù)",
"active_rate":"激活訪問率"
},inplace=True)
dt_check.rename(columns={
"ID":"用戶ID",
"date":"申請日期",
"new_cus":"是否新用戶(1為是,0為否)",
"lending": "是否放貸"
},inplace=True)
dt_flow.head()
dt_check.head()
dt_check.to_csv("check_info.csv")
2、計算每日申請貸款人數(shù)铭若、審批貸款人數(shù)洪碳、放貸率
- 選取子集,將新用戶和老用戶分開統(tǒng)計每天申請貸款人數(shù)和審批放貸人數(shù)叼屠,然后計算新用戶放貸率瞳腌。
#最后使用merge函數(shù)將新用戶結(jié)果表和老用戶結(jié)果表拼接。
dt_check_1 = dt_check[dt_check["是否新用戶(1為是,0為否)"] == 1]
dt_check_0 = dt_check[dt_check["是否新用戶(1為是,0為否)"] == 0]
- 用grouby 和 agg計算放貸率
pt_1 = dt_check_1.groupby('申請日期')['是否放貸'].agg(['sum','count']).reset_index()
pt_1.rename(columns={'count':'新用戶申請數(shù)','sum':'新用戶放貸數(shù)'},inplace=True)
pt_1['新用戶放貸率']=pt_1["新用戶放貸數(shù)"] / pt_1["新用戶申請數(shù)"]
pt_1.head()
思考方法二: 也可以用數(shù)據(jù)透視計算放貸率
# pt_1 = pd.pivot_table(data=dt_check_1, index=["申請日期"], values=["是否放貸"], aggfunc=[np.sum,'count'])
# pt_1.columns = pt_1.columns.droplevel(0)
# pt_1.columns = ["新用戶放貸數(shù)","新用戶申請數(shù)"]
# pt_1["新用戶放貸率"] = pt_1["新用戶放貸數(shù)"] / pt_1["新用戶申請數(shù)"]
# pt_1 = pt_1.reset_index()
# pt_1.head()
- 對老用戶數(shù)據(jù)透視計算放貸率
pt_0 = dt_check_0.groupby('申請日期')['是否放貸'].agg(['sum','count']).reset_index()
pt_0.rename(columns={'count':'老用戶申請數(shù)','sum':'老用戶放貸數(shù)'},inplace=True)
pt_0["老用戶放貸率"] = pt_0["老用戶放貸數(shù)"] / pt_0["老用戶申請數(shù)"]
pt_0.head()
- 計算復(fù)借率
這里需要計算老用戶復(fù)借率镜雨,所以需要知道每天的老用戶數(shù)目嫂侍,這里做簡單化處理,
這里的老用戶定義是:前一天的放款的新用戶第二天繼續(xù)借款就是老用戶
對存量老用戶我們暫時不考慮荚坞,就看前一天貸款的人第二天是否還繼續(xù)貸款挑宠,貸款的就認為是老用戶復(fù)借
取新用戶放貸透視表的前29天數(shù)據(jù)+4月30日的人(分析5月1日-5月30日的復(fù)借率)構(gòu)成老客戶數(shù)量,我們看這些客戶是否還繼續(xù)貸款
old=list(pt_1.iloc[0:-1,1])
# # 假設(shè)4月30日有24個人
old.insert(0,24)
dt_old=pd.DataFrame({'申請日期':list(pt_1["申請日期"]),'老客戶數(shù)':old})
pt_0_m=pd.merge(pt_0, dt_old, how='left', on=["申請日期"])
pt_0_m["老客戶復(fù)借率"] = pt_0_m["老用戶申請數(shù)"] / pt_0_m["老客戶數(shù)"]
pt_0_m.head()
3颓影、計算各節(jié)點路徑轉(zhuǎn)化率并繪圖
- pd.merge連接平臺流量表各淀,組成一張用戶路徑總表,計算各節(jié)點轉(zhuǎn)化率诡挂。
dt = pd.merge(dt_flow,pt_1,how='left',left_on='日期',right_on='申請日期')
dt_1 = pd.merge(dt, pt_0_m, how='left',left_on="日期", right_on="申請日期" )
dt_1.drop(['申請日期_x', '申請日期_y'],axis=1)
dt_1.head()
#計算轉(zhuǎn)化漏斗碎浇。 計算匯總數(shù)據(jù)
# dt_2 = dt_1.drop(['日期'], axis=1)
# #匯總求和
# dt_2.loc['Row_sum'] = dt_2.apply(lambda x: x.sum())
# dt_3 = dt_2[dt_2.index == "Row_sum"][["PV","UV","注冊數(shù)","激活數(shù)","新用戶申請數(shù)","新用戶放貸數(shù)"]]
# dt_3_s = pd.DataFrame(dt_3.stack()).reset_index().iloc[:,[1,2]]
# dt_3_s.columns = ["指標","匯總"]
# dt_3_s
from plotly import graph_objects as go
trace = go.Funnel(
y = dt_3_s["指標"],
x = dt_3_s["匯總"],
textinfo = "value+percent initial",
marker=dict(color=["deepskyblue", "lightsalmon", "tan", "teal", "silver", "yellow"]),
connector = {"line": {"color": "royalblue", "dash": "solid", "width": 3}})
data =[trace]
fig = go.Figure(data)
fig.show()