数据分析项目-金融行业案例学习总结
使用工具:Anaconda-jupyter、mysql数据库
老师指路->https://www.jianshu.com/u/1f32f227da5f
本文涉及:
用户行为路径分析
单变量分析
群组分析
用户行为路径分析
它适用于对产品运营中的关键环节进行分析、监控,找到其中薄弱的环节,通过用户引导或者产品迭代来优化,提升转化效果。
案例分析:
1、读取数据
2、计算每日申请贷款人数、审批贷款人数、放贷率
#选取子集,将新用户和老用户分开统计每天申请贷款人数和审批放贷人数,
#然后计算新用户放贷率。
#最后使用merge函数将新用户结果表和老用户结果表拼接。
dt_check_1 = dt_check[dt_check["是否新用户(1为是,0为否)"] == 1]
dt_check_0 = dt_check[dt_check["是否新用户(1为是,0为否)"] == 0]
#对新用户数据透视计算放贷率
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 = ["新用户放贷数","新用户申请数"]
pt_1["新用户放贷率"] = pt_1["新用户放贷数"] / pt_1["新用户申请数"]
pt_1 = pt_1.reset_index()
pt_1.head()
同时对老用户计算放贷率得到:
这里需要计算老用户复借率,所以需要知道每天的老用户数目,这里做简单化处理
这里的老用户定义是:前一天的放款的新用户第二天继续借款
对存量老用户暂时不考虑,前一天贷款的人第二天是否还继续贷款,贷款的就认为是老用户复借
取新用户放贷透视表的前29天数据+4月30日的人(分析5月1日-5月30日的复借率)构成老客户数量,看这些客户是否还继续贷款
old = [pt_1["新用户放贷数"]]
old = list(pt_1["新用户放贷数"])[0:29]
# 假设4月30日有24个人
old.insert(0,24)
data={'申请日期':list(pt_1["申请日期"]),'老客户数':old}
dt_old = pd.DataFrame(data)
pt_0_m = pd.merge(pt_0, dt_old, how='left', on=["申请日期"])
pt_0_m["老客户复借率"] = pt_0_m["老用户申请数"] / pt_0_m["老客户数"]
pt_0_m.head()
3、计算各节点路径转化率并绘图
# pd.merge连接平台流量表,组成一张用户路径总表,计算各节点转化率。
dt = pd.merge(dt_flow, pt_1, how='left', on=None, left_on="日期", right_on="申请日期" )
dt_1 = pd.merge(dt, pt_0_m, how='left', on=None, left_on="日期", right_on="申请日期" )
dt_1 = dt_1.drop(['申请日期'], axis=1)
dt_2=dt_1.drop(['日期'],axis=1)
dt_2.head()
#汇总求和
dt_2.loc['Row_sum'] = dt_2.apply(lambda x: x.sum())
#各指标所有行值求和
dt_3=dt_2[dt_2.index=="Row_sum"][["PV","UV","注册数","激活数","新用户申请数","新用户放贷数"]]
#设置index,只取出需要的6列数据
dt_3_s=pd.DataFrame(dt_3.stack()).reset_index().iloc[:,[1,2]]
#行转列,重置索引,得到1、2列的数据
dt_3_s.columns = ["指标","汇总"]
#字段起名字
dt_3_s
绘图结果:
单变量分析
单变量分析的主要目的是筛选出好坏区分度较好的变量以便制定策略。在消金公司的日常工作中,会有专门负责爬取变量和计算加工变量数据的团队,他们在不断的去获取加工很多可能对风险控制有帮助的数据提供给风控团队,而风控人员就需要从这成千上万个变量中探查出能够控制逾期风险但同时又不会误拒很多好客户的变量。
针对每个变量单独分析,查看其对逾期的影响。
群组分析
什么是群组分析:
用户在产品使用中都有一个用户行为流程,不同时期的用户表现情况可能不一样,群组分析的主要目的是分析相似群体随时间的变化,核心就是对比、分析不同时间群组的用户,在相同周期下的行为差异, 所以也称同期群分析。
读取数据
# 生成一个新字段,用户订单月份
df["orderperiod"] = df.orderdate.apply(lambda x:x.strftime("%Y-%m"))
# 设置userid为索引
df.set_index("userid",inplace=True)
# 这里的level=0表示第一层索引即userid,并且每次分组之后都会形成很多个dataframe
# 按照每个用户的订单的最早时期,生成用户群组
df["cohortgroup"]=df.groupby(level=0)["orderdate"].min().apply(lambda x:x.strftime("%Y-%m"))
df.reset_index(inplace=True)
df.head()
#orderperiod 为orderdate 提出年月后的信息
#cohortgroup 为用户最早的消费年月
# 根据用户群组和月份字段进行分组
grouped = df.groupby(["cohortgroup","orderperiod"])
# 求每个用户群下每一个月份的用户数量、订单数量、购买金额
cohorts = grouped.agg({"userid":pd.Series.nunique,
"orderid":pd.Series.nunique,
"totalcharges":np.sum})
# 重命名
cohorts.rename(columns={"userid":"totalusers",
"orderid":"totalorders"},inplace=True)
cohorts.head()
#09年1月,它之后的几个月变化情况 01 02 03 04 05
#09年2月,他之后的几个月变化情况 02 03 04 05
把每个群组继续购买的日期字段进行改变
给首次购买日期进行编号,第二次购买为2,第三次购买为3
得到每个群组的用户量
重新设置索引
将每个月最早用户数提取出来,用作留存率分母:
计算每个群组的留存
只保留totalusers这一列,转为行
09-1 这一列 用户数为20 10 8 4
09-02 这一列用户数 为 28 5 4
然后计算留存率=各月用户留存数/初始月用户数