1 APP Store 数据分析案例
1 案例介绍
- 案例背景
- 对APP下载和评分数据分析帮助App开发者获取和留存用户
- 通过对应用商店的数据分析为开发人员提供可操作的意见
- 通过数据分析要解决的问题
- 免费和收费的App都集中在哪些类别
- 收费app的价格是如何分布的,不同类别的价格分布怎样
- App文件的大小和价格以及用户评分之间是否有关
- 分析流程
2 数据清洗
app.drop(‘Unnamed: 0’,axis=1,inplace=True)
app[‘size_mb’] = app[‘size_bytes’] / (1024 * 1024.0)
app[‘paid’] = app[‘price’].apply(lambda x: 1 if x > 0 else 0)
app.describe()查看数据分布
app.info()查看字段类型 数量
3 单变量分析
app.price.value_counts()
bins = [0,2,10,300]
labels = ['<2', '<10','<300']
app['price_new']=pd.cut(app.price, bins, right=False, labels=labels)
app.groupby([‘prime_genre’])[‘price’].describe()
删除价格大于等于49.99的app
app.rating_count_tot.describe()
4 业务数据可视化
sns.relplot(x="prime_genre", y="user_rating",kind='line',
data=app) #折线图
sns.relplot(x="prime_genre", y="user_rating",kind='line',data=app,height=5,aspect=3) \
#讲x轴文字旋转45度
plt.xticks(
rotation=45,
horizontalalignment='right',
fontweight='light',
fontsize='x-large'
)
sns.distplot(app1['price'])
大部分应用都是免费的,极少数APP的收费>5元
收费app的价格分布
plt.figure(figsize=(15,8))#调整大小
sns.boxplot(x='price',y='prime_genre',data=app[app['paid']==1])
plt.yticks(fontweight='light',fontsize='x-large')
#只保留应用数量最多的前5个类别
top5 = app.groupby(['prime_genre'])['price'].count().sort_values(ascending = False).head().index.tolist()
app5 = app[app.prime_genre.isin(top5)]
plt.figure(figsize=(10,8))#调整大小
sns.boxplot(x='price',y='prime_genre',data=app5[app['paid']==1])
散点图,价格和用户评分的分布
plt.figure(figsize=(10,8))
sns.scatterplot(x='price',y='user_rating',data=app)
柱状图,前5个类别app的用户评分均值
#同一类别,将免费和付费的评分进行对比
plt.figure(figsize=(10,8))
sns.barplot(x='prime_genre',y='user_rating',hue='paid',data=app5)
###5 业务解读
问题一 免费或收费APP集中在哪些类别
sns.countplot(y=‘prime_genre’,hue=‘paid’,data=app,order=app[‘prime_genre’].value_counts().index)
免费与收费的APP在不同评分区间的分布
app.groupby([‘rating_level’])[‘user_rating’].describe()
sns.countplot(x=‘paid’,hue=‘rating_level’,data=app)
业务问题3:APP的大小和用户评分之间有关系吗?
app[q4].corr()
sns.heatmap(app[q4].corr())
2 Uniqlo销售数据分析案例
1 案例介绍
- 案例背景
- 数据集中包含了不同城市优衣库门店的销售记录
- 通过对销售数据的分析,为运营提供一些有益信息
2 加载数据
uniqlo.info()
uniqlo.describe()
从结果中看出,revenue 销售金额,有异常值,-0.66 / 12538,可以进一步查看
uniqlo[uniqlo.revenue<1] 找到销售金额为负值的
uniqlo[uniqlo.revenue>5000] 查看金额大的订单,查看后发现均为消费多件导致金额较高,数据没有问题
3 不同产品的销售情况
uniqlo.pivot_table(index = 'product',values = 'quant',aggfunc = 'sum').sort_values(by=['quant'],ascending = False)
进一步拆解,按城市拆解销量
uniqlo.pivot_table(index = 'product',columns='city',values = 'quant',aggfunc='sum').sort_values(by=['上海'],ascending = False)
对城市拆解后,再进一步按线上线下拆解
uniqlo.pivot_table(index = 'product',columns=['city','channel'],values = 'quant',aggfunc='sum')
4 用户习惯使用哪种方式进行消费
不同城市消费习惯不同
plt.figure(figsize=(15,8))
sns.countplot(y='city',hue='channel',data=uniqlo)
uniqlo.pivot_table(index = 'city',columns='channel',values='quant',aggfunc='sum')
5 用户消费习惯(周间还是周末)
uniqlo.wkd_ind.value_counts() 查看整体情况
计算每个城市工作日和周末销售情况
wkd_sales = uniqlo.pivot_table(index = 'wkd_ind',columns=['city'],values = 'quant',aggfunc='sum')
wkd_sales
添加行数据,每个城市的平均销售情况
wkd_sales.loc['weekday_avg',:] = wkd_sales.loc['Weekday',:]/5
wkd_sales.loc['weekend_avg',:] = wkd_sales.loc['Weekend',:]/2
wkd_sales
###6 销售额和成本之间的关系
销售额 revenue 和 unit_cost 成本之间的关系 计算相关系数后,发现没相关性
查看发现unit_cost为单位商品的成本,但是revenue不一定是一件物品的收入,需要处理数据
#添加单件收入列,使用单件收入和单位成本计算相似度
uniqlo2.loc[:,'rev_per_goods'] = uniqlo2['revenue']/uniqlo2['quant']
uniqlo2[['rev_per_goods','unit_cost']].corr()
3 RFM会员价值度模型案例
1 会员价值度模型介绍
RFM模型是根据会员
- 最近一次购买时间R(Recency)
- 购买频率F(Frequency)
- 购买金额M(Monetary)计算得出RFM得分
RFM模型的基本实现过程
2 Excel实现RFM划分案例
常见的确定RFM划分区间的套路
- 业务实际判断
- 平均值或中位数
- 二八法则
提取用户最近一次的交易时间,算出距离计算时间的差值
根据天数长短赋予对应的R值
从历史数据中取出所有用户的购买次数,根据次数多少赋予对应的F分值
从历史数据中汇总,求得该用户的交易总额,根据金额大小赋予对应的M值
在得到不同会员的RFM之后,根据步骤⑤产生的两种结果有两种应用思路
思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析
思路2:基于RFM的汇总得分评估所有会员的价值度价值
3 RFM计算案例
1 案例背景
案例数据是某企业从2015年到2018年共4年的用户订单抽样数据,数据来源于销售系统
2 代码
读取数据,查看数据基本情况
数据预处理 去除异常值,缺失值
汇总所有数据 拼接数据,
按会员ID做汇总,分别计算rfm原始值
确定RFM划分区间,根据统计指标和业务方确定
计算rfm值
使用Series.str.cat拼接每个用户生成对应的rfm类别编码
保存结果 excel/数据库
3 RFM图形展示
- 为了更好地了解不同周期下RFM分组人数的变化,通过3D柱形图展示结果
- 展示结果时只有3个维度,分别是年份、rfm分组和用户数量。
4 案例结论