1 案例介绍

  • 案例背景

    • 对APP下载和评分数据分析帮助App开发者获取和留存用户

    • 通过对应用商店的数据分析为开发人员提供可操作的意见

  • 通过数据分析要解决的问题

    • 免费和收费的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所有版本的用户评分

    • sup_devices.num: 支持的iOS设备数量

    • ipadSc_urls.num: app提供的截屏展示数量

    • lang.num 支持的语言数量

2 数据清洗

import pandas as pd
app=pd.read_csv("applestore.csv")
app.head()
  Unnamed: 0 id track_name size_bytes price rating_count_tot user_rating prime_genre sup_devices ipadSc_urls lang
0 0 281656475 PAC-MAN Premium 100788224 3.99 21292 4.0 Games 38 5 10
1 1 281796108 Evernote - stay organized 158578688 0.00 161065 4.0 Productivity 37 5 23
2 2 281940292 WeatherBug - Local Weather, Radar, Maps, Alerts 100524032 0.00 188583 3.5 Weather 37 5 3
3 3 282614216 eBay: Best App to Buy, Sell, Save! Online Shop... 128512000 0.00 262241 4.0 Shopping 37 5 9
4 4 282935706 Bible 92774400 0.00 985920 4.5 Reference 37 5 45
app.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7197 entries, 0 to 7196
Data columns (total 11 columns):#   Column            Non-Null Count  Dtype
---  ------            --------------  -----  0   Unnamed: 0        7197 non-null   int64  1   id                7197 non-null   int64  2   track_name        7197 non-null   object 3   size_bytes        7197 non-null   int64  4   price             7197 non-null   float645   rating_count_tot  7197 non-null   int64  6   user_rating       7197 non-null   float647   prime_genre       7197 non-null   object 8   sup_devices       7197 non-null   int64  9   ipadSc_urls       7197 non-null   int64  10  lang              7197 non-null   int64
dtypes: float64(2), int64(7), object(2)
memory usage: 618.6+ KB
'''
app.describe()
  Unnamed: 0 id size_bytes price rating_count_tot user_rating sup_devices ipadSc_urls lang
count 7197.000000 7.197000e+03 7.197000e+03 7197.000000 7.197000e+03 7197.000000 7197.000000 7197.000000 7197.000000
mean 3598.000000 8.631310e+08 1.991345e+08 1.726218 1.289291e+04 3.526956 37.361817 3.707100 5.434903
std 2077.739276 2.712368e+08 3.592069e+08 5.833006 7.573941e+04 1.517948 3.737715 1.986005 7.919593
min 0.000000 2.816565e+08 5.898240e+05 0.000000 0.000000e+00 0.000000 9.000000 0.000000 0.000000
25% 1799.000000 6.000937e+08 4.692275e+07 0.000000 2.800000e+01 3.500000 37.000000 3.000000 1.000000
50% 3598.000000 9.781482e+08 9.715302e+07 0.000000 3.000000e+02 4.000000 37.000000 5.000000 1.000000
75% 5397.000000 1.082310e+09 1.819249e+08 1.990000 2.793000e+03 4.500000 38.000000 5.000000 8.000000
max 7196.000000 1.188376e+09 4.025970e+09 299.990000 2.974676e+06 5.000000 47.000000 5.000000 75.000000
#发现了unname 0这个奇怪的变量,需要进行清理
app.drop('Unnamed: 0',axis=1, inplace=True) #inplace=True直接在原始数据中保存排序之后的结果
#drop默认是对行
#inplace表示直接替换掉原有数据
#同样可以用位置来举
#app.drop(app.columns[0],axis=1,inplace=True)
app
  id track_name size_bytes price rating_count_tot user_rating prime_genre sup_devices ipadSc_urls lang
0 281656475 PAC-MAN Premium 100788224 3.99 21292 4.0 Games 38 5 10
1 281796108 Evernote - stay organized 158578688 0.00 161065 4.0 Productivity 37 5 23
2 281940292 WeatherBug - Local Weather, Radar, Maps, Alerts 100524032 0.00 188583 3.5 Weather 37 5 3
3 282614216 eBay: Best App to Buy, Sell, Save! Online Shop... 128512000 0.00 262241 4.0 Shopping 37 5 9
4 282935706 Bible 92774400 0.00 985920 4.5 Reference 37 5 45

处理内存大小

app['size_mb'] =app["size_bytes"]/(1024*1024.0)
app['size_mb']
'''
0        96.119141
1       151.232422
2        95.867188
3       122.558594
4        88.476562...
7192    120.777344
7193    115.166016
7194    106.165039
7195     92.731445
7196     86.687500
Name: size_mb, Length: 7197, dtype: float64
'''
app.head()
  id track_name size_bytes price rating_count_tot user_rating prime_genre sup_devices ipadSc_urls lang size_mb
0 281656475 PAC-MAN Premium 100788224 3.99 21292 4.0 Games 38 5 10 96.119141
1 281796108 Evernote - stay organized 158578688 0.00 161065 4.0 Productivity 37 5 23 151.232422
2 281940292 WeatherBug - Local Weather, Radar, Maps, Alerts 100524032 0.00 188583 3.5 Weather 37 5 3 95.867188
3 282614216 eBay: Best App to Buy, Sell, Save! Online Shop... 128512000 0.00 262241 4.0 Shopping 37 5 9 122.558594
4 282935706 Bible 92774400 0.00 985920 4.5 Reference 37 5 45 88.476562
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
app['paid']=app["price"].apply(lambda x:1 if x>0 else 0)
app['paid']0       1
1       0
2       0
3       0
4       0..
7192    0
7193    0
7194    1
7195    0
7196    0
Name: paid, Length: 7197, dtype: int64

①清洗异常值(unamed)

②处理了给分析造成难度的值(size-bytes)

③添加了方便分析的特征(免费/收费)

3 单变量分析

#value_counts (price,prime_genre)
#value_Coutn只能对应series,不能对整个dataframe做操作
app.price.value_counts()
'''
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
'''
#value_counts (price,prime_genre)
#value_Coutn只能对应series,不能对整个dataframe做操作
app["price"].describe()
'''
count    7197.000000
mean        1.726218
std         5.833006
min         0.000000
25%         0.000000
50%         0.000000
75%         1.990000
max       299.990000
Name: price, dtype: float64
'''
bins = [0,2,10,300] #app.price.value_counts()从上面数据显示基本都是在10以内的
labels = [  '<2', '<10','<300']
app['price_new']=pd.cut(app.price, bins, right=False, labels=labels) #bin;right=False,默认是左开右闭,现在是坐闭右开
#分组后查看数据分布情况
app.groupby(['price_new'])['price'].describe()
  count mean std min 25% 50% 75% max
price_new                
<2 5405.0 0.361981 0.675318 0.00 0.00 0.00 0.00 1.99
<10 1695.0 4.565811 1.864034 2.99 2.99 3.99 4.99 9.99
<300 97.0 28.124021 38.886220 11.99 14.99 19.99 24.99 299.99
# groupby的操作,不同类别app的价格分布
app.groupby(['prime_genre'])['price'].describe()  #根据类别规划价格区间
  count mean std min 25% 50% 75% max
prime_genre                
Book 112.0 1.790536 3.342210 0.0 0.0 0.00 2.99 27.99
Business 57.0 5.116316 10.247031 0.0 0.0 2.99 4.99 59.99
Catalogs 10.0 0.799000 2.526660 0.0 0.0 0.00 0.00 7.99
Education 453.0 4.028234 18.725946 0.0 0.0 2.99 2.99 299.99
Entertainment 535.0 0.889701 1.454022 0.0 0.0 0.00 1.99 9.99
Finance 104.0 0.421154 1.108990 0.0 0.0 0.00 0.00 5.99
Food & Drink 63.0 1.552381 3.972119 0.0 0.0 0.00 1.49 27.99
Games 3862.0 1.432923 2.486609 0.0 0.0 0.00 1.99 29.99
Health & Fitness 180.0 1.916444 2.052378 0.0 0.0 1.99 2.99 9.99
Lifestyle 144.0 0.885417 1.478410 0.0 0.0 0.00 1.24 4.99
Medical 23.0 8.776087 10.788269 0.0 0.0 3.99 16.99 34.99
Music 138.0 4.835435 8.915667 0.0 0.0 0.99 4.99 49.99
Navigation 46.0 4.124783 11.565818 0.0 0.0 0.99 3.74 74.99
News 75.0 0.517733 1.127771 0.0 0.0 0.00 0.00 3.99
Photo & Video 349.0 1.473295 2.280703 0.0 0.0 0.99 1.99 22.99
Productivity 178.0 4.330562 8.747042 0.0 0.0 1.99 4.99 99.99
Reference 64.0 4.836875 8.285100 0.0 0.0 1.99 4.99 47.99
Shopping 122.0 0.016311 0.180166 0.0 0.0 0.00 0.00 1.99
Social Networking 167.0 0.339880 1.142210 0.0 0.0 0.00 0.00 9.99
Sports 114.0 0.953070 2.419084 0.0 0.0 0.00 0.99 19.99
Travel 81.0 1.120370 2.183772 0.0 0.0 0.00 0.99 9.99
Utilities 248.0 1.647621 2.628541 0.0 0.0 0.99 1.99 24.99
Weather 72.0 1.605417 1.831316 0.0 0.0 0.99 2.99 9.99
#删除价格大于等于49.99的app
app=app[app['price']<=49.99]
app.shape
#(7190, 15)

结论:经过对应用分类,对价格情况的分析得出,专业类的应用价格偏高,娱乐休闲类的应用价格普遍不高,大多数免费

#评论情况分析
app.rating_count_tot.describe()count    7.190000e+03
mean     1.290515e+04
std      7.577526e+04
min      0.000000e+00
25%      2.725000e+01
50%      3.005000e+02
75%      2.796750e+03
max      2.974676e+06
Name: rating_count_tot, dtype: float64
#对用户打分的分组
bins = [0,1000,5000,100000,5000000]
app['rating_new']=pd.cut(app.rating_count_tot, bins, right=False)app['rating_new']0          [5000, 100000)
1       [100000, 5000000)
2       [100000, 5000000)
3       [100000, 5000000)
4       [100000, 5000000)...
7192            [0, 1000)
7193            [0, 1000)
7194            [0, 1000)
7195            [0, 1000)
7196            [0, 1000)
Name: rating_new, Length: 7190, dtype: category
Categories (4, interval[int64]): [[0, 1000) < [1000, 5000) < [5000, 100000) < [100000, 5000000)]
#用户打分和价格的关系
app.groupby(['rating_new'])['price'].describe()
  count mean std min 25% 50% 75% max
rating_new                
[0, 1000) 4587.0 1.798696 3.324682 0.0 0.0 0.0 2.99 49.99
[1000, 5000) 1193.0 1.740721 3.203853 0.0 0.0 0.0 2.99 39.99
[5000, 100000) 1192.0 0.963549 1.984895 0.0 0.0 0.0 0.99 14.99
[100000, 5000000) 218.0 0.196376 0.925160 0.0 0.0 0.0 0.00 7.99

4 业务数据可视化

#可视化部分
import matplotlib.pyplot as plt
import seaborn as sns #seaborn是封装在matplotlib库之上的可视化库,这个库提供了丰富的可视化模板,使画图更加方便。简化封装,不能把matplotlib去掉。
%matplotlib inline
#app评分关系
plt.figure(figsize=(30,20))#调整大小
sns.relplot(x="prime_genre", y="user_rating",kind='line',  #line折线图的意思data=app) #折线图

app1=app[app['price']<=9.99]
#直方图,APP价格的分布
sns.distplot(app1['price'])

#业务问题2:收费app的价格分布是如何的?不同类别之间有关系吗?#箱线图,不同类别APP价格
plt.figure(figsize=(10,8))#调整大小
sns.boxplot(x='price',y='prime_genre',data=app[app['paid']==1])#业务解答:价格绝大部分都集中在9.99美元以内,个别类别(如医疗)等因专业性总体价格会高于其他类别

#箱线图,前五个类别的app价格
app5 = app[app["prime_genre"].isin(['Games','Entertainment','Education','Photo & Video','Utilities'])]
plt.figure(figsize=(10,8))#调整大小
sns.boxplot(x='price',y='prime_genre',data=app5[app['paid']==1])

关于箱线图

  • 箱子的中间有一条线,代表了数据的中位数

  • 箱子的上下底,分别是数据的上四分位数(Q3)和下四分位数(Q1)

  • 箱体包含了50%的数据。因此,箱子的高度在一定程度上反映了数据的波动程度

  • 上下边缘则代表了该组数据的最大值和最小值

  • 有时候箱子外部会有一些点,可以理解为数据中的“异常值

#散点图,价格和用户评分的分布
sns.scatterplot(x='price',y='user_rating',data=app)

#只保留五个类别数据
top5= ['Games','Entertainment', 'Education', 'Photo & Video','Utilities']
app5 = app[app.prime_genre.isin(top5)]
#柱状图,前5个类别app的用户评分均值
#同一类别,将免费和付费的评分进行对比
plt.figure(figsize=(10,8))
sns.barplot(x='prime_genre',y='user_rating',hue='paid',data=app5)

5 业务解读

问题一 免费或收费APP集中在哪些类别

  • 第一步,将数据加总成每个类别有多少个app

  • 第二步,从高到低进行排列

  • 第三步,将数据进行可视化

#使用countplot--count是对数据加总,plot将数据进行可视化
#使用order对数据进行排序
#countplot 排序画图一起搞 order代入y轴顺序
plt.figure(figsize=(20,10))
#hue 可以传入从0开始的分类字段,可以绘制出一个对比柱状图 这里对比的是付费免费数量
sns.countplot(y='prime_genre',hue='paid',data=app,order=app['prime_genre'].value_counts().index)
plt.tick_params(labelsize=20)#业务解答:都是高度集中在游戏类别

免费与收费的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()
  count mean std min 25% 50% 75% max
rating_level                
[0.0, 0.1) 929.0 0.000000 0.000000 0.0 0.0 0.0 0.0 0.0
[0.1, 2.5) 206.0 1.650485 0.400213 1.0 1.5 2.0 2.0 2.0
[2.5, 4.5) 2903.0 3.646056 0.467987 2.5 3.5 4.0 4.0 4.0
[4.5, 5.0) 2660.0 4.500000 0.000000 4.5 4.5 4.5 4.5 4.5
sns.countplot(x='paid',hue='rating_level',data=app)

不管是免费的还是收费的app  评分的分布主要分布在 2.5~5分之间  最多的是 2.5~4.5  其次是4.5~5.0

APP的大小和用户评分之间有关系吗

q4=['user_rating','price','size_mb']
app[q4].corr()
'''user_rating     price   size_mb
user_rating     1.000000  0.073237  0.066160
price           0.073237  1.000000  0.314386
size_mb         0.066160  0.314386  1.000000
'''
sns.heatmap(app[q4].corr())
#热力图,展现变量之间两两之间关系的强弱
#业务解答:大小价格都不和评分没有直接关系,但是价格和大小之间有正相关关系# 计算相关 使用的是皮尔逊相关系数  在pandas里 corr就是算皮尔逊api
# 皮尔逊相关系数 -1~1之间  >0 正相关 <0负相关 =0不相关
#>0.3 有相关性   #如果>0.5 显著相关  

app的大小和 价格 有一定关系 ,app的大小和评分是没有关系的

app store 探索分析

  • seaborn 画图

    • 实际上是对matplotlib的封装

    • 可以快速画图,api封装的比matplotlib要友好

    • sns.relplot(x="prime_genre", y="user_rating",kind='line', data=app) #折线图

    • sns.distplot(app2['price']) # sns.distplot 绘制直方图

    • sns.boxplot(x = 'price',y='prime_genre',data = app1[app1['paid']==1]) #箱线图

    • sns.scatterplot(x='price',y='user_rating',data=app1) 散点图

    • sns.barplot(x='prime_genre',y='user_rating',hue='paid',data=app5) 带对比的柱状图 对比字段通过hue传入

    • sns.countplot(y='prime_genre',hue='paid',data=app,order=app['prime_genre'].value_counts().index) 带计数对比功能的柱状图

    • sns.heatmap(app[q4].corr()) #热力图

    • 分析思路

      • 分析价格

      • 先desbribe()

      • 可以对价格分箱

      • 看价格和类别之间关系 对类别分组查看价格的分布

      • 评分和价格之间关系 对评价分组查看价格的分布

      • 计算不同特征之间的皮尔逊相关系数

案例 APP Store 数据分析相关推荐

  1. 重磅推出开发者计划、App Store,赛灵思普及自适应计算的一大步

    得开发者得天下.尤其随着AI技术落地趋势加剧,其中大部分创新来自软件应用,市场对软件开发者有着极大需求.因此,无论是互联网公司还是传统的IT厂商都在尝试将开发者沉淀到自己的平台. 作为FPGA的开创者 ...

  2. 盘它:上线 2 个月碾压微信、抖音,音遇登顶 App Store 榜幕后的数据真相

    在万物互联的大数据时代,伴随着科技变革和产业变革的浪潮,有寒冬凛冽的凋亡,也有光芒四射的新生. 音乐+社交+游戏的巧妙融合,诞生了一款爆款音乐社交产品--音遇,上线不久,就获得了傲人的数据反馈,一跃至 ...

  3. 出海买量难,游戏类产品如何利用App Store突围?

    近年来,在疫情的影响下,海外市场用户对游戏的需求呈上升趋势,游戏市场仍处于持续扩张态势,而广告主们买量渠道繁多,回报却差强人意,究其原因主要是买量渠道受隐私政策影响,导致获客成本上扬. 得益于 App ...

  4. 数据科学项目:适用于App Store和Google Play的有利可图的应用配置文件

    At Dataquest, we strongly advocate portfolio projects as a means of getting a first data science job ...

  5. Xcode11 上传苹果卡在Authenticating with the iTunes store 或者transpoter上传卡在正在验证 APP - 正在通过App Store进行认证

    目前2020年12月份再用的时候,更新了transpoter,已经完全可以了,以下方法已不管用 这里直接借鉴网上案例我自己试成功的方法, Xcode11后,会移除自带的transpoter,我们需要自 ...

  6. iphone电压测试软件,‎App Store 上的“ECG Test Pro”

    超过1000份真实患者的异常静态心电图案例,供医学院学生或老师作为心电学习的辅助数据. > 医学生或实习生,可通过这个应用学习各种各样的心电病例 > 医学院老师,可把这个应用作为教学素材, ...

  7. 钉钉在线求饶?五星分期付款?爬取钉钉App Store真实评价数据并分析

    一.前言 最近钉钉火了,因为疫情影响,钉钉被教育部选为给学生用来在线上网课的平台,本以为自己因为业务过硬得到官方的认可,是2020上天选中的宠鹅,万万没想到到由于小学生不爽被占用寒假时间上课,于是集体 ...

  8. 苹果涉嫌利用App Store打压屏幕时间应用竞争对手 已被投诉至欧盟

    [TechWeb]4月28日消息,据国外媒体报道,苹果在上周了结了与高通之间持续了两年的法律大战,但一山方过一山拦,在那之后其又陷入了多起诉讼之中,先是被纽约一名18岁的小伙告上法庭,指控苹果利用面部 ...

  9. 腾讯用微信、QQ 把微视送上了 App Store 第一 | 畅言

    最近几天,很多人在发朋友圈的时候,都能看到一个"用微视拍摄"的推广.与此同时,腾讯微视也开始大面积地,在腾讯视频独家播出的综艺节目中大量曝光. 如此大力度的推广,让微视飞快地冲上了 ...

最新文章

  1. python urllib.request 爬虫 数据处理-python爬虫 urllib模块url编码处理
  2. python第三方库文件传输助手_python实现文件助手中查看微信撤回消息
  3. Xcode自带工具symbolicatecrash解析Crash文件
  4. outlook搜索不到历史邮件内容
  5. 牛客挑战赛48E-速度即转发【带修莫队,分块】
  6. 剑指Offer - 面试题45. 把数组排成最小的数(字符串排序)
  7. 微信气泡主题设置_微信猫和老鼠主题怎么弄?猫和老鼠聊天气泡主题设置教程...
  8. 95-150-080-源码-Sink-StreamingFileSinkBucketingSink
  9. MyBatis集成SpringMVC
  10. mysql sid是什么_数据库名、数据库实例、全局数据库名、服务名、SID等的区别
  11. 蓝牙运动手环app开发方案
  12. uploadify java 下载_java uploadify 实现文件上传
  13. 信号(signal,kill,raise)
  14. 电脑接口自动测试软件,通过多种接口总线与计算机实现自动检定/校准测试系统的设计...
  15. Summit Wireless全新低成本空间音频模块现已震撼上市
  16. PCBA方案设计——医疗器械认证血氧仪方案
  17. 时间和日期函数 now 的作用
  18. audio 监听播放进度
  19. patch 命令用法详解
  20. 3年Java开发百度面试篇

热门文章

  1. 计量经济学计算机输出结果,(财务知识)计量经济学计算机作业(7页)-原创力文档...
  2. 负整数的整除与取余运算
  3. 在OpenCV里实现自适应阈值分割
  4. 介绍计算机硬件的英语作文带翻译,介绍光盘行动的英语作文带翻译
  5. 论韩剧如何影响一个人
  6. 高斯函数(Gaussian function)的详细分析
  7. Cadence/Allegro学习笔记
  8. mainui类JAVA什么意思_main ui是什么意思
  9. java 事务嵌套_嵌套事务回滚
  10. 回归预测 | MATLAB实现SVR(支持向量机回归)fitrsvm参数设定