企业网站导航栏高度,网站建设公司有多少,网站 内部搜索引擎,网站建设要用H5的缺点由于有之前的项目#xff0c;所以今天我们直接开始#xff0c;不做需求分析#xff0c;还不会需求分析的可以看我之前的文章。Python实战项目——用户消费行为数据分析#xff08;三#xff09;
导入库
import numpy as np
import pandas as pd
import matplotlib.pyplo…由于有之前的项目所以今天我们直接开始不做需求分析还不会需求分析的可以看我之前的文章。Python实战项目——用户消费行为数据分析三
导入库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams[font.sans-serif][SimHei]# 用来正常显示中文标签
from datetime import datetime1.初识数据
df pd.read_csv(kelu.csv)
df.info()
df.head()基本信息门票价格101数据来自16年~19年8K多数据量
df.describe()根据平均分92和1/2分位得知大多数用户评分在100效果非常不错。16年~19年门票价格都是110
2.分析数据
a1.每天销量分析
df[time] pd.to_datetime(df[time],format%Y/%m/%d)
df.groupby(time)[rating].count().plot(figsize(12,4))整体来看每日销量呈现上升趋势但是在18年5月份前后234出现一次较大的波动销量急剧下滑猜测台风疫情运营推广不利16年9月~17年1月销量非常低每天平均2-3张门票猜测101观景台门票刚刚上线发售观景台刚刚对游客进行开放
a2.每月销量分析
df[month] df[time].values.astype(datetime64[M]) #保留月份精度的日期
df.head()
df.groupby(month)[rating].count().plot(figsize(12,4)) #按照月份进度进行计数
plt.xlabel(月份)
plt.ylabel(销售数量)
plt.title(16~19年每月销量分析)月份整体销量依然呈现上升趋势但是在18年234月份月销量下滑明显。跟每天销量下降有关。猜测台风疫情运营推广不利
a3.每个用户的购买量和消费金额分析
merge用法相当于sql当中join
df1 pd.DataFrame({name:[zhangsan,lisi],group:[A,B]
})
df2 pd.DataFrame({name:[wangwu,lisi],score:[88,90],group:[C,D]
})
pd.merge(leftdf1,rightdf2,onname,howinner,suffixes[_1,_2])
left左表 right:右表 on关联字段 howinner默认值交集|outer并集|left只保留左侧|right只保留右侧 #suffixes:如果两个表中有多个相同列用suffixes给的值进行区分(默认值xy)
#按照游客分组统计每个游客的购买次数
grouped_count_author df.groupby(author)[frequency].count().reset_index()
#按照游客分组统计每个游客的消费金额
grouped_sum_amount df.groupby(author)[amount].sum().reset_index()
user_purchase_retention pd.merge(leftgrouped_count_author,rightgrouped_sum_amount,onauthor,howinner)
user_purchase_retention.tail(60)
user_purchase_retention.plot.scatter(xfrequency,yamount,figsize(12,4))
plt.title(用户的购买次数和消费金额关系图)
plt.xlabel(购物次数)
plt.ylabel(消费金额)结论斜率就是门票价格110用户的消费金额和消费次数呈现线性关系
b1.用户购买门票数量分析
df.groupby(author)[frequency].count().plot.hist(bins50) #影响柱子的宽度宽度 最大值-最小值/bins
plt.xlim(1,17)
plt.xlabel(购买数量)
plt.ylabel(人数)
plt.title(用户购买门票数量直方图)绝大多数用户购买过1张门票用户在7000人次左右少数人购买过2~4张门票猜测可能是台北周边用户
b2.用户购买门票2次及以上情况分析
df_frequency_2 df.groupby(author).count().reset_index()
df_frequency_2.head()
df_frequency_2[df_frequency_2[frequency]2].groupby(author)[frequency].sum().plot.hist(bins50)
plt.xlabel(购买数量)
plt.ylabel(人数)
plt.title(购买门票在2次及以上的用户数量)消费两次的用户在整体上占比较大大于2次的用户占小部分用户购买次数最多为8次
b3.查看购买2次及以上的具体人数
df_frequency_2[df_frequency_2[frequency]2].groupby(frequency)[author].count()出去购买一次的顾客可以看出购买2次有402人购买3次的99人以此类推得知大多数据倾向于购买2~5
b4.购买次数在1~5次之间的用户占比分析
1.按照用户进行分组 2.取出购买次数 3.过滤出1~5次用户 4.绘制饼图 df_frequency_gte_1 df.groupby(author)[frequency].count().reset_index()
#过滤出5次的用户
values list(df_frequency_gte_1[df_frequency_gte_1[frequency]5].groupby(frequency)[frequency].count())
print(values)
plt.pie(values,labels[购买1次,购买2次,购买3次,购买4次,购买5次],autopct%1.1f%%)
plt.title(购买次数在1~5次之间的人数占比)
plt.legend()可以看出购买一次的占比83%其次逐渐递减。并且递减比较明显购买3.4.5的占比相近人数都很少。
b5.购买次数在2~5次之间的用户占比分析
#过滤出2次并且5次的用户
df_frequency_gte_2 df_frequency_2[df_frequency_2[frequency]2].reset_index()
values list(df_frequency_gte_2[df_frequency_gte_2[frequency]5].groupby(frequency)[frequency].count())
print(values)
plt.pie(values,labels[购买2次,购买3次,购买4次,购买5次],autopct%1.1f%%)
plt.title(购买次数在2~5次之间的人数占比)
plt.legend()在2~5次之间购买2.3次用户占比最大综合占据了80%
c1.复购率分析
复购率在某一时间窗口内(多指一个月)内消费次数在两次及以上的用户在总消费用户的占比 df.head()
pivot_count df.pivot_table(indexauthor,columnsmonth,valuesfrequency,aggfunccount).fillna(0)
pivot_count.head()
#三种情况
#消费次数1为复购用户用1表示
#消费次数1为非复购用户用0表示
#消费次数0, 未消费用户用na表示
#applymap:df处理每一个元素
#apply:df处理每一行或者每一列数据
#map:Serise处理每一个元素
pivot_count pivot_count.applymap(lambda x: 1 if x1 else np.NAN if x0 else 0)
# pivot_count[pivot_count[2016-09-01]1]
(pivot_count.sum()/pivot_count.count()).plot()
plt.xlabel(时间(月))
plt.ylabel(百分比(%))
plt.title(16~19年每月用户复购率) 16年9月份复购率最高达到了7.5%然后开始下降趋于平稳在1.2%
c2.复购用户人数
pivot_count.sum().plot()
plt.xlabel(时间/月)
plt.ylabel(复购人数)
plt.title(16~19年每月的复购人数折线图整体来看复购人数长线上升趋势但是在18年2.3.4.10和19年2月份复购人数下降较为明显出现异常信号需要和业务部门具体分析情况
c3.回购率分析
回购率在某一个时间窗口内消费过的用户在下一个时间窗口仍旧消费的占比。 举个例子当前月消费用户人数1000人其中200人在下一个月仍旧进行了消费回购率200/100020%
pivot_purchase df.pivot_table(indexauthor,columnsmonth,valuesfrequency,aggfunccount).fillna(0)
pivot_purchase.head()
len(pivot_purchase.columns)def purchase_return(data): #data:代表的是每一名游客的所有月份消费记录status [] #存储每一个月回购状态for i in range(30):#遍历每一个月最后一个月除外####本月消费if data[i] 1:if data[i1] 1:#下个月有消费是回购用户1status.append(1)else:#na|未消费status.append(0) #非回购用户0else: ####本月未消费status.append(np.NaN)status.append(np.NaN)return pd.Series(status,pivot_purchase.columns)
pivot_purchase_return pivot_purchase.apply(purchase_return,axis1) #用户回购状态
(pivot_purchase_return.sum()/pivot_purchase_return.count()).plot()
plt.title(16年~19年每月的回购率)
plt.xlabel(月份)
plt.ylabel(回购率%)回购率最高在18年6月份达到4%整体来看回购率呈现微弱上升趋势出现了几次较大下滑分别是17年6月份18年1月份18年8月份19年1月份
c4.回购人数分析
pivot_purchase_return.sum().plot()
plt.title(16年~19年每月的回购人数)
plt.xlabel(月份)
plt.ylabel(回购人数)
print(pivot_purchase_return.sum())整体呈现上升趋势回购人数最多时在18年11月份人数未17人其中有几次回购人数下降较为明显主要在分别是17年6月份18年1月份18年8月份19年1月份
c5.每个月分层用户占比情况
活跃用户|不活跃用户|回流用户|新用户 def active_status(data): #data每一行数据共31列status [] #存储用户31个月的状态new|active|unactive|return|unregfor i in range(31):#判断本月没有消费0if data[i] 0:if len(status)0: #前几个月没有任何记录也就是97年1月0status.append(unreg) else:#之前的月份有记录判断上一个月状态if status[i-1] unreg:#一直没有消费过status.append(unreg)else:#上个月的状态可能是new|active|unative|reuturnstatus.append(unactive)else:#本月有消费1if len(status)0:status.append(new) #第一次消费else:#之前的月份有记录判断上一个月状态if status[i-1]unactive:status.append(return) #前几个月不活跃现在又回来消费了回流用户elif status[i-1]unreg:status.append(new) #第一次消费else:#new|activestatus.append(active) #活跃用户return pd.Series(status,pivot_purchase.columns) #值status,列名18个月份
pivot_purchase_status pivot_purchase.apply(active_status,axis1)
pivot_status_count pivot_purchase_status.replace(unreg,np.NaN).apply(pd.value_counts)
pivot_status_count.T.plot.area()可以看出红色不活跃用户占据网站用户的主体橙色新用户从17年的1月~19年1月呈现上升趋势但是在18年4月份左右新用户的量突然急剧下降异常信号以后新用户又开始逐渐上涨回复稳定状态绿色回流用户一直维持稳定稳定状态但是在18年2~4月份,出现异常下降情况异常信号
c6.每月不同用户的占比
return_rate pivot_status_count.apply(lambda x:x/x.sum())
return_rate.T.plot()在17年1月份过后网站用户主体由不活跃用户组成新用户占比开始逐渐下降并且趋于稳定稳定在10%左右活跃用户和会用户一直很稳定并且占比较小16年9月前后新用户和不活跃用户发生较大的变化猜测活动或者节假日造成…
c7.每月活跃用户的占比
return_rate.T[active].plot(figsize(12,6))
plt.xlabel(时间(月))
plt.ylabel(百分比)
plt.title(每月活跃用户的占比分析)在17年1月份活跃用户占比较高在0.5%但是在1-2月份急剧下降猜测春节的影响或者温度结合历年1~2月份销量来看都会出现一定比例的下降再次验证我们的猜测春节的影响在18年2月和5月出现异常门票销量下降猜测雨水或者台风影响
c8.每月回流用户占比
return_rate.T[return].plot(figsize(12,6))
plt.xlabel(时间(月))
plt.ylabel(百分比)
plt.title(每月回流用户的占比分析)整体来看回流用户比例上升趋势但是波动较大在17年1月和6月18年4月19年2月回流用户比例都出现了较大幅度下降表现为异常信号不论是回流用户还是活跃用户在以上几个月份中都表现出下降趋势。
np.mean(return_rate.T[return]) #回流用户平均值在0.73%左右在17年9月份以后仅有两个异常点在平均值以下在17年9月份以前所有数据都显示出回流用户比例低于平均值猜测景点开放不久很多游客尚未发现本景点本景点在该平台上线不久
d1.用户的生命周期
#计算方式每一个用户最后一个购买商品的时间——用户第一次购买商品的时间转换成天数即为生命周期
time_min df.groupby(author)[time].min()
time_max df.groupby(author)[time].max()
life_time (time_max-time_min).reset_index()
life_time.describe()通过原样本8757条和count7722得知存在一个用户多次消费的情况平均生命周期天数23天通过25% 50% 75%分位数得知绝大多用户生命周期为0天最大生命周期为864天
d2.用户生命周期直方图
#讲日期类型转成数值类型
life_time[life_time] life_time[time]/np.timedelta64(1,D)
life_time[life_time].plot.hist(bins 100,figsize(12,6))
plt.xlabel(天数)
plt.ylabel(人数)
plt.title(所有用户的生命周期直方图)
print(life_time[life_time[life_time]0])生命周期为0的用户仅仅在一天内有过消费之后再没消费过存在7130个用户由于总用户数为7722其余592人属于优质的忠诚客户
d3.生命周期大于0天的用户直方图
life_time[life_time[life_time]0][life_time].plot.hist(bins 100,figsize(12,6))
plt.xlabel(天数)
plt.ylabel(人数)
plt.title(生命周期在0天以上的用户分布直方图)
life_time[life_time[life_time]0][life_time].mean()去掉生命周期为0的用户可知用户平均生命周期为300天,生命周期在100天的用户量达到了最大值17人生命周期在100~350天来看用户量呈现缓慢下降的趋势350~800天左右来看用户量下降速度明显存在一定用户流失而忠诚用户越来越少
d4.各时间段的用户留存率
#pd.cut()函数
np.random.seed(666) #保证每次运行程序产生的随机数都是相同的。
score_list np.random.randint(25,100,size3)
print(score_list)
bins [0,59,70,80,100] #指定多个区间
score_cut pd.cut(score_list,bins)
score_cut留存率1-90天有多少留存用户。求出用户的留存天数比如留存天数89属于190天内的留存用户留存天数计算方式用户每一次的消费时间分别减去用户第一次消费时间left:左表right右表how:连接方式on连接字段suffixes针对相同列名指定不同的后缀
user_purchase_retention pd.merge(leftdf,righttime_min.reset_index(),howinner,onauthor,suffixes(,_min))#计算留存天数
user_purchase_retention[time_diff] user_purchase_retention[time]-user_purchase_retention[time_min]
#将time_diff转成数值
user_purchase_retention[time_diff] user_purchase_retention[time_diff].apply(lambda x:x/np.timedelta64(1,D))#生成时间跨度(3个月即90天)判断属于哪个区间
bin [i*90 for i in range(11)]
user_purchase_retention[time_diff_bin] pd.cut(user_purchase_retention[time_diff],bin)#统计每个游客在不同的时间段内的消费频率和值便于稍后判断该用户在某个区间内是不是留存用户
pivot_retention user_purchase_retention.groupby([author,time_diff_bin])[frequency].sum().unstack()#判断是否是留存用户1留存0未留存
pivot_retention_trans pivot_retention.fillna(0).applymap(lambda x:1 if x0 else 0)
#留存率
print(pivot_retention_trans.sum()/pivot_retention_trans.count())
(pivot_retention_trans.sum()/pivot_retention_trans.count()).plot.bar()
plt.xlabel(时间跨度(天))
plt.ylabel(留存率)
plt.title(各时间段内的用户留存率)如图每个周期是3个月第一个周期的留存率在2.2%前三个周期的递减速度在0.3%左右。在第四五个周期的时候趋于平稳稳定在留存率1.5%左右从第五个周期开始留存率明显下降下降到几乎0%在第四五周期1年的时候需要采取方法将用户留住进行再次消费。如果在跨度为1年的时候不召回用户则就会面临大量用户流失的风险。