目录
业务问题1:收费App的价格分布是如何的?不同类别之间有关系吗?
案例导入
如今想在手机应用商店上成为成功的应用越来越难,对App下载和评分数据的分析成为帮助App开发者获取和留存用户的重要工具。Play商店应用数据具有巨大的潜力,可以推动应用制作业务取得成功。可以为开发人员提供可操作的见解,以便开发和捕获移动市场。
我们想分析3个问题
- 收费和免费的App都集中在哪些类别?
- 收费App的价格分布是如何的?不同类别的价格分布是怎样的?
- App文件的大小和价格以及用户评分之间有关系吗?
本课程分析流程
核心变量解释
- “id” : 苹果给提供的APP ID,每个app唯一
- “track_name”: APP的名称
- “size_bytes”: 以byte为单位的app大小
- “price”: 定价(单位为美元)
- “rating_count_tot”: 该app所有版本的用户评分数量
- “rating_count_ver”: 该app当前版本的用户评分数量
- “prime_genre”: app的类别
- “user_rating” 该app所有版本的用户评分
- “user_rating_ver”: 该app当前版本的用户评分
- “sup_devices.num”: 支持的ios设备数量
- “ipadSc_urls.num”: app提供的截屏展示数量
- “lang.num”: 支持的语言数量
1.数据导入清洗
#调用基本包
import pandas as pd
#读取数据
app=pd.read_csv('w1_applestore.csv',index_col=0)
#数据的基本信息
app.head()
app.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 7197 entries, 0 to 7196
Data columns (total 10 columns):
id 7197 non-null int64
track_name 7197 non-null object
size_bytes 7197 non-null int64
price 7197 non-null float64
rating_count_tot 7197 non-null int64
user_rating 7197 non-null float64
prime_genre 7197 non-null object
sup_devices 7197 non-null int64
ipadSc_urls 7197 non-null int64
lang 7197 non-null int64
dtypes: float64(2), int64(6), object(2)
memory usage: 618.5+ KB
没有缺失值
下面对数据进行整体描述,只对数值型有效
app.describe()
考虑将sizebytes变成mb,新增数据
app['size_mb']=app['size_bytes']/(1024*1024.0)
app.size_mb.describe()
count 7197.000000
mean 189.909414
std 342.566408
min 0.562500
25% 44.749023
50% 92.652344
75% 173.497070
max 3839.463867
Name: size_mb, dtype: float64
根据价格新增标签
app['paid'] = app['price'].apply(lambda x: 1 if x > 0 else 0)
app.paid.describe()
count 7197.000000
mean 0.436432
std 0.495977
min 0.000000
25% 0.000000
50% 0.000000
75% 1.000000
max 1.000000
Name: paid, dtype: float64
该部分小结,初步完成数据清洗
- 清洗异常值(unamed)
- 给分析造成难度的值(size_bytes)
- 核心变量的创建(免费/收费)
2.数据的分组分析及可视化
#value_counts (price,prime_genre)
#value_Coutn只能对应series,不能对整个dataframe做操作
app.price.value_counts() #每一种价格对应的app数量
输出结果
0.00 4056
0.99 728
2.99 683
1.99 621
4.99 394
3.99 277
6.99 166
9.99 81
5.99 52
7.99 33
14.99 21
19.99 13
8.99 9
24.99 8
13.99 6
11.99 6
29.99 6
12.99 5
15.99 4
59.99 3
17.99 3
22.99 2
23.99 2
20.99 2
27.99 2
16.99 2
49.99 2
39.99 2
74.99 1
18.99 1
34.99 1
99.99 1
299.99 1
47.99 1
21.99 1
249.99 1
Name: price, dtype: int64
删除价格大于等于49.99的app
app=app[app['price']<=49.99]
数据的快速分组
bins=[0,2,10,300]
labels=['<2','<10','<300']
app['price_new']=pd.cut(app.price,bins,right=False,labels=labels)
app.groupby(['price_new'])['price'].describe()
groupby的操作,不同类型app的价格分布
app.groupby(['prime_genre'])['price'].describe()
用户评价数据分布
#用户评价数据分布
app.rating_count_tot.describe()
对用户打分进行分组
bins=[0,1000,5000,100000,5000000]
app['rating_new']=pd.cut(app.rating_count_tot,bins,right=False)
#用户打分与价格之间的关系
app.groupby(['rating_new'])['price'].describe()
可视化部分
import matplotlib.pyplot as plt
import seaborn as sns #图形可视化工具包
%matplotlib inline
sns.relplot(x='prime_genre',y='user_rating',kind='line',data=app) #折线图
plt.xticks(rotation="90")
app1=app[app['price']<=9.99]
#直方图,APP价格方向
sns.distplot(app1['price'])
业务问题分析
业务问题1:收费App的价格分布是如何的?不同类别之间有关系吗?
箱线图,不同类别App的价格
业务解答:价格绝大部分都集中在9.99美元以内,个别类别(如医疗)等因专业性总体价格会高于其他类别
app2=app[app['price']<=30]
plt.figure(figsize=(20,16))
sns.boxplot(x='price',y='prime_genre',data=app2[app2['paid']==1])
plt.show()
(app.groupby(['prime_genre'])[['id']].count()).sort_values('id',ascending=False)
只保留5个类别数据
app2=app[app['price']<=30]
top5=['Games','Entertainment','Education','Photo & Video','Utilities']
app5=app2[app2.prime_genre.isin(top5)]
#箱线图,前5个类别的app价格
plt.figure(figsize=(10,8)) #调整大小
sns.boxplot(x='price',y='prime_genre',data=app5[app2['paid']==1])
plt.show()
散点图:价格和用户评价的分布
app3=app[app['price']<=50]
sns.scatterplot(x='price',y='user_rating',data=app3)
plt.show()
只保留5个类别数据
app2=app[app['price']<=30]
top5=['Games','Entertainment','Education','Photo & Video','Utilities']
app5=app2[app2.prime_genre.isin(top5)]
plt.figure(figsize=(10,8))
sns.barplot(x='prime_genre',y='user_rating',hue='paid',data=app5)
plt.show()
业务问题2:免费和收费的App集中在哪些
- 第一步:将数据加总成每个类别有多少个app
- 第二部:从高到底进行排列
- 第三部:将数据进行可视化
使用countplot--count是对数据加总,plot将数据进行可视化
hue=‘paid’对类别进行paid分组
使用order对数据进行排序(从大到小)
plt.figure(figsize=(20,10))
sns.countplot(y='prime_genre',hue='paid',data=app,order=app['prime_genre'].value_counts().index)
plt.tick_params(labelsize=20)
业务解答: 免费和收费的App都集中在Games
业务问题3:免费与收费的App在不同的评分区间的分布
bins=[0,0.1,2.5,4.5,5]
app['rating_level']=pd.cut(app.user_rating,bins,right=False)
app.groupby(['rating_level'])['user_rating'].describe()
plt.figure(figsize=(10,8))
sns.countplot(x='paid',hue='rating_level',data=app)
业务解答:主要集中在2.4-5之间
业务问题4:App的大小和用户评分之间有关系吗?
q4=['user_rating','price','size_mb']
app[q4].corr()
业务解答:大小价格都不和评分没有直接关系,但是价格和大小之间有正相关关系
热力图,展现变量之间两两关系的强弱
plt.figure(figsize=(5,4))
sns.heatmap(app[q4].corr())
总结:
1.免费和收费的App主要集中在游戏类别中
2.收费App的价格主要分布在9.99美元以内
3.个别类别(医疗)等因专业性总体价格会高于其他类别
4.App文件大小与价格之间有正相关关系
5.App文件大小、价格与评分没有直接关系