Mobile APP Store数据集

项目介绍

  • 目前手机应用商店里App种类繁多,并且数量也一直在增加,想要成为一款受欢迎的应用越来越困难,因此对APP下载数据和评分数据进行分析成为帮助App开发者获取和留存用户的重要工具。
  • 现在我们要对具有代表性的苹果应用商城的App应用进行分析,根据每个app应用的属性进行相关性探索。

数据集介绍

AppleStore数据集包含两个csv文件。

  • AppleStore.csv文件中包含的是App的应用程序ID、名称、大小、价格、评分、内容评级、主要类型、支持设备类型数量等信息,共16个维度,7197行数据。
  • appStore_desception.csv文件是对16个字段的详细描述。

字段描述

  • id:app的编号,每个app只有一个编号
  • track_name:app的名称
  • size_bytes: 大小(以字节为单位)
  • currency:通用货币类型
  • price: 价格金额
  • rating_count_tot: 用户评分计数(适用于所有版本)
  • rating_count_ver:用户评分计数(当前版本)
  • user_rating:平均用户评分值(适用于所有版本),取值范围为(0,5],左开右闭区间
  • user_rating_ver:平均用户评分值(对于当前版本)取值范围(0,5],左开右闭区间
  • ver:当前的版本号
  • cont_rating:内容评级(游戏适龄4,9,12,17)
  • prime_genre:主要类型
  • sup_devices.num:支持设备的数量
  • ipadSc_urls.num:截屏展示数量(即在应用详情页的图片数量0-5张)
  • lang.num:支持的语言数量
  • vpp_lic:启用批量购买程序设备的许可

数据预处理

查看数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
filepath = './dataFile/AppleStore.csv'
df = pd.read_csv(filepath,index_col=0)
print("打印数据的前三行信息:")
df.head(3)
打印数据的前三行信息:
id track_name size_bytes currency price rating_count_tot rating_count_ver user_rating user_rating_ver ver cont_rating prime_genre sup_devices.num ipadSc_urls.num lang.num vpp_lic
1 281656475 PAC-MAN Premium 100788224 USD 3.99 21292 26 4.0 4.5 6.3.5 4+ Games 38 5 10 1
2 281796108 Evernote - stay organized 158578688 USD 0.00 161065 26 4.0 3.5 8.2.2 4+ Productivity 37 5 23 1
3 281940292 WeatherBug - Local Weather, Radar, Maps, Alerts 100524032 USD 0.00 188583 2822 3.5 4.5 5.0.0 4+ Weather 37 5 3 1
print("数据共有{}行,{}列".format(df.shape[0],df.shape[1]))
数据共有7197行,16列
print("数据集中每列的信息:")
df.info()
数据集中每列的信息:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 7197 entries, 1 to 11097
Data columns (total 16 columns):
id                  7197 non-null int64
track_name          7197 non-null object
size_bytes          7197 non-null int64
currency            7197 non-null object
price               7197 non-null float64
rating_count_tot    7197 non-null int64
rating_count_ver    7197 non-null int64
user_rating         7197 non-null float64
user_rating_ver     7197 non-null float64
ver                 7197 non-null object
cont_rating         7197 non-null object
prime_genre         7197 non-null object
sup_devices.num     7197 non-null int64
ipadSc_urls.num     7197 non-null int64
lang.num            7197 non-null int64
vpp_lic             7197 non-null int64
dtypes: float64(3), int64(8), object(5)
memory usage: 955.9+ KB
  • 数据没有缺失情况
print("数值型列统计信息:")
df.describe()
数值型列统计信息:
id size_bytes price rating_count_tot rating_count_ver user_rating user_rating_ver sup_devices.num ipadSc_urls.num lang.num vpp_lic
count 7.197000e+03 7.197000e+03 7197.000000 7.197000e+03 7197.000000 7197.000000 7197.000000 7197.000000 7197.000000 7197.000000 7197.000000
mean 8.631310e+08 1.991345e+08 1.726218 1.289291e+04 460.373906 3.526956 3.253578 37.361817 3.707100 5.434903 0.993053
std 2.712368e+08 3.592069e+08 5.833006 7.573941e+04 3920.455183 1.517948 1.809363 3.737715 1.986005 7.919593 0.083066
min 2.816565e+08 5.898240e+05 0.000000 0.000000e+00 0.000000 0.000000 0.000000 9.000000 0.000000 0.000000 0.000000
25% 6.000937e+08 4.692275e+07 0.000000 2.800000e+01 1.000000 3.500000 2.500000 37.000000 3.000000 1.000000 1.000000
50% 9.781482e+08 9.715302e+07 0.000000 3.000000e+02 23.000000 4.000000 4.000000 37.000000 5.000000 1.000000 1.000000
75% 1.082310e+09 1.819249e+08 1.990000 2.793000e+03 140.000000 4.500000 4.500000 38.000000 5.000000 8.000000 1.000000
max 1.188376e+09 4.025970e+09 299.990000 2.974676e+06 177050.000000 5.000000 5.000000 47.000000 5.000000 75.000000 1.000000
  • 对数值列数据进行查看,price列没有负值,user_rating,user_rating_ver最大最小值均在[0,5],无异常数据
print("数据中重复数据个数:")
df.duplicated().sum()
数据中重复数据个数:
0

特征处理

#app的size由bite变为兆
df['size_mb'] = df['size_bytes']/(1024*1024.0)
df['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
#根据price新增是否付费列
df['paid'] = df['price'].apply(lambda x:1 if x> 0 else 0)
df['paid'].head()
1    1
2    0
3    0
4    0
5    0
Name: paid, dtype: int64
#根据当前版本与历史版本评分新增波动列
df['curr_ver'] = df['user_rating_ver']-df['user_rating']
df['curr_ver'].head()
1    0.5
2   -0.5
3    1.0
4    0.5
5    0.5
Name: curr_ver, dtype: float64

探索性分析

#一些简单的单变量的数据分析
pd.DataFrame({"评分人数最多的10款app":df.sort_values(by='rating_count_tot',ascending=False).head(10)['track_name'].tolist(),"当前评分最高的10款app":df.sort_values(by='user_rating_ver',ascending=False).head(10)['track_name'].tolist(),"支持设备最多的10款app":df.sort_values(by='sup_devices.num',ascending=False).head(10)['track_name'].tolist(),"支持语言最多的10款app":df.sort_values(by='lang.num',ascending=False).head(10)['track_name'].tolist(),'价格最贵的10款app':df.sort_values(by='price',ascending=False).head(10)['track_name'].tolist(),'当前版本评分提高最多的10款app':df.sort_values(by='curr_ver',ascending=False).head(10)['track_name'].tolist()})
评分人数最多的10款app 当前评分最高的10款app 支持设备最多的10款app 支持语言最多的10款app 价格最贵的10款app 当前版本评分提高最多的10款app
0 Facebook Blitz Breaker Bloons TD 4 Google Photos - unlimited photo and video storage LAMP Words For Life VyStar Mobile Banking for iPad
1 Instagram Project Life Crash Bandicoot Nitro Kart 2 Google Duo - simple video calling Proloquo2Go - Symbol-based AAC Mannequin Challenge Maker
2 Clash of Clans マンガ図書館Z -人気漫画が読み放題! Crash Bandicoot Nitro Kart 3D Google Slides KNFB Reader 放置江湖: 大侠的成长之路(高自由度的武侠体验)
3 Temple Run Photomath - Camera Calculator Resident Evil 4: PLATINUM Google Docs NAVIGON Europe Unblue
4 Pandora - Music & Radio Money Pro - Personal Finance, Budget, Bills Moto X Mayhem Google Sheets FineScanner Pro - PDF Document Scanner App + OCR VR-Crazy Car Traffic Racing
5 Pinterest After School - Funny Anonymous School News Call of Duty: Zombies Google Allo — smart messaging Articulation Station Pro Peppa Pig: Theme Park
6 Bible The Room Three Jet Car Stunts Inbox by Gmail Articulation Test Center Pro NBC Sports Scores
7 Candy Crush Saga My Movies Pro - Movie & TV Collection Library Virtual Villagers 5: New Believers Google Translate VPN Pro | Lifetime Proxy & Best VPN by Betternet UNiDAYS: Student Discounts for Shopping Top Br...
8 Spotify Music Pennies – Budget and Expense Tracker Fish Tycoon Space by Tinybop Cubasis 2 - Mobile Music Creation System Disney Applause
9 Angry Birds Stormfall: Rise of Balur Virtual Families The Robot Factory by Tinybop プチ・ロワイヤル仏和辞典(第4版)・和仏辞典(第3版) Web Browser Recorder Pro

免费 vs 付费

import matplotlib
#中文显示
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#负号显示
matplotlib.rcParams['axes.unicode_minus'] = False
#付费app和免费app在不同评分区间的分布情况
plt.figure(figsize=(20,10))
sns.countplot(data=df,x='user_rating',hue='paid',palette=['#441791','#EB3144'])
plt.xlabel('Ratings',fontsize=14)
plt.ylabel('Counts',fontsize=14)
plt.title('免费app与付费app的评分对比图',fontsize=16)
plt.legend(labels=['Free apps','Charging apps'])
plt.show()

  • 从图中可以看出,免费和付费app的评分区间分布基本一致,并且集中在高分段
# 收费app的价格分布情况
df['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
#不同类型的收费app的价格分布情况
app_price = df[df['price']<=30]
plt.figure(figsize=(20,16))
sns.boxplot(x='price',y='prime_genre',data=app_price[app_price['paid']==1])
plt.xlabel('Price',fontsize=14)
plt.ylabel('Genre',fontsize=14)
plt.title('不同类型付费app的价格分布情况',fontsize=16)
plt.show()

  • 从图中可以看出,医疗类app的价格因其专业性价格总体偏高
#考虑付费app价格与用户评分之间的相关关系
app_price_rating = df[df['price']<=50]
plt.figure(figsize=(10,5))
sns.scatterplot(x='price',y='user_rating',data=app_price_rating)
plt.xlabel("Price",fontsize=14)
plt.ylabel("User_rating",fontsize=14)
plt.title("付费app价格与评分之间的对比图",fontsize=16)
plt.show()

  • 纵向来看,左边数据分布密集,说明价格低的app评分参差不齐,并没有出现价格低评分就低这样的情况
  • 横线来看,评分较高的app部分价格确实要高一些,同时也看到,也有一些app本身评分低,但是价格却高,这个只是个别情况
#不同类型app的数量分布,免费和付费比较
plt.figure(figsize=(25,15))
sns.countplot(data=df,y='prime_genre',hue='paid',palette=['#441791','#EB3144'],order=df['prime_genre'].value_counts().index)
plt.xlabel('Counts',fontsize=14)
plt.ylabel('Genre',fontsize=14)
plt.title('免费与收费App的数量对比图',fontsize=16)
plt.legend(labels=['Free apps','Charging apps'],loc='best')
plt.show()

  • 从图中可以看出,无论免费与否,游戏类的app都是数量最多的,从而看出用户的需求
  • 其中,购物类软件没有付费的,在教育、医疗、音乐、健康、视频等这类专业性app上付费的产品更多
#总体来看,各类型app的数量情况
app_type = df["prime_genre"].value_counts().reset_index(name='counts')
plt.figure(figsize=(25,10))
sns.barplot(data=app_type,y='index',x='counts')
plt.xlabel('Counts',fontsize=14)
plt.ylabel('Genre',fontsize=14)
plt.title('各个类型app的数量统计图',fontsize=16)
plt.show()

  • 总体来看,游戏、娱乐、教育这类app的需求量较大,其中游戏类app的数量在付费和免费里都是数量最多的
# 游戏类app的价格与评分之间的关系
fig = plt.figure(figsize=(10,8))
heat = df[df['prime_genre']=='Games'].loc[:,["price","user_rating"]]
sns.heatmap(heat.corr(method='kendall'),vmin=0, vmax=1, annot=True,linewidths=.5,cmap="YlGnBu")
plt.title("游戏类app的价格与评分相关性",fontsize=16)
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.show()

  • 对于想开发付费游戏类app的开发者来说,价格与评分之间没有显著的相关性。所以尽量选择开发免费
#免费与付费app在支持语言和设备的差异情况
fig = plt.figure(figsize=(20,10))
ax1=fig.add_subplot(121)
ax2=fig.add_subplot(122)
sns.violinplot(x="paid", y="sup_devices.num", data=df, width=.5, palette=['#441791','#EB3144'],ax=ax1)
sns.violinplot(x="paid", y="lang.num", data=df, width=.5, palette=['#441791','#EB3144'],ax=ax2)
ax1.set_title('免费与付费app在支持设备上的差异',fontsize=16)
ax1.set_xlabel('Paid',fontsize=14)
ax1.set_ylabel('Device',fontsize=14)
ax2.set_title('免费与付费app在支持语言上的差异',fontsize=16)
ax2.set_xlabel('Paid',fontsize=14)
ax2.set_ylabel('Lang',fontsize=14)
plt.show()

  • 付费app中支持的设备数量稍多于免费app,但都主要集中在37-38种设备之间。在支持的语言数量上,总体区别不大 ,少部分免费app要比付费app支持的语言更多。
#免费app与付费app内存大小分布情况
fig = plt.figure(figsize=(16,8))
data_free = df[df['paid']==0].loc[:,'size_mb']
data_paid = df[df['paid']==1].loc[:,'size_mb']
ax1=fig.add_subplot(121)
ax2=fig.add_subplot(122)
sns.distplot(data_free,hist=True,ax=ax1)
sns.distplot(data_paid,hist=True,ax=ax2)
ax1.set_title('免费app内存大小分布图',fontsize=16)
ax1.set_xlabel('Size',fontsize=14)
ax2.set_title('付费app内存大小分布图',fontsize=16)
ax2.set_xlabel('Size',fontsize=14)
plt.show()

  • 从图中可以看出,免费app与付费app内存占用大小没有特别明显的分布差别,有部分付费app占用的空间较大,可能原因是付费app提供的内容更加丰富,需要的空间也就更大
#付费类app的大小与价格之间的相关性分析
df_paid = df[df["paid"]==1]
heat = df_paid.loc[:,["size_mb","price"]]
plt.figure(figsize=(10,8))
sns.heatmap(heat.corr(method='kendall'),vmin=0, vmax=1, annot=True,linewidths=.5,cmap="YlGnBu")
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title('付费类app的大小与价格之间的相关性',fontsize=16)
plt.show()

  • 从热图中可以看出,付费app的大小和价值之间确实存在一定的正相关关系

所有版本 vs 当前版本

#当前版本平均评分与历史版本平均评分的变动情况
plt.figure(figsize=(20,10))
sns.boxplot(x='curr_ver',y='prime_genre',data=df,whis=[0,100],width=0.8,palette='Spectral')
sns.stripplot(x='curr_ver',y='prime_genre',data=df,size=5,color=".0",linewidth=1,palette='Spectral')
plt.xlabel('版本评分变动情况',fontsize=14)
plt.ylabel('游戏类型',fontsize=14)
plt.title('各类型app评分变动情况',fontsize=16)
plt.show()

  • 从图中可以看出,大部分类型的app当前版本相较于历史版本呈现持平或者评分下降趋势,部分类型的app评分提高
#将app划分为高评分与低评分
high_rate = df[df['user_rating']>=4.0]
low_rate = df[df['user_rating']<=3.0]
#查看高评分app的评分变动情况
plt.figure(figsize=(20,10))
sns.boxplot(x="curr_ver", y="prime_genre", data=high_rate,whis=[0, 100], width=.8, palette="Spectral")
sns.stripplot(x="curr_ver", y="prime_genre", data=high_rate,size=5, color=".0", linewidth=1,palette="Spectral")
plt.xticks(np.arange(-6,5,1))
plt.xlabel('当前版本评分变动值',fontsize=14)
plt.ylabel('游戏类型',fontsize=14)
plt.title('各类型高评分app评分变动情况',fontsize=16)
plt.show()

  • 将app在评分上进行细分后,变动情况更加明显。购物和金融类评分呈现大幅下降趋势,但总的来看大部分app的评分都是持平和略微提高的

app大小

#app大小与用户评分之间的关系
plt.figure(figsize=(10,10))
sns.scatterplot(data=df, x="user_rating_ver",y='size_mb')
plt.xlabel('评分',fontsize=14)
plt.ylabel('app大小',fontsize=14)
plt.title('app大小与用户评分关系图',fontsize=16)
plt.show()

  • 总的来看,app占用内存空间都是比较小的,相比较之下,高评分的app普遍比较小,其中评分在1-3分的这些中等评分的app内存大小几乎都很小

app详情信息

#app展示图片数据分布情况
plt.figure(figsize=(20,10))
sns.distplot(df['ipadSc_urls.num'],hist=True,kde=True,rug=False)
plt.xlabel('Picture Number',fontsize=14)
plt.ylabel('Counts',fontsize=14)
plt.title('展示界面的图片数分布情况',fontsize=16)
plt.show()

  • 从核密度分布直方图中可以清晰地看出,大部分app的详情展示界面选择放置4-5张图片
# 展示图片数量与评分人数和评分之间的相关性分析
heat = df.loc[:,["rating_count_tot","user_rating","ipadSc_urls.num"]]
plt.figure(figsize=(15,10))
sns.heatmap(heat.corr(method='kendall'),vmin=0, vmax=1, annot=True,linewidths=.5,cmap="YlGnBu")
plt.xticks(fontsize=14)
plt.yticks(fontsize=14)
plt.title('详情图片数、app评分与评分人数之间的相关性',fontsize=16)
plt.show()

  • 从图中可以看出,详情图片数、app评分与评分人数之间并没有显著的相关性

app适龄情况

#查看app的适龄情况
plt.figure(figsize=(15,10))
sns.countplot(data=df,y='prime_genre',hue='cont_rating')
plt.xlabel('Counts',fontsize=14)
plt.ylabel('App types',fontsize=14)
plt.title('各个类型APP的适龄情况',fontsize=16)
plt.legend(title='Adapt age',loc=4)
plt.show()

  • 大部分类型app的适龄范围都是4+,软件的适用年龄段都很广泛。由于游戏中存在色情、暴力、血腥等因素,因此适龄段中9+和12+的也比较多。同时,值得注意的一点是,在社交网络类型的app中,17+的软件数量是超过4+的,推测可能这类软件受到政策的相关影响,为了保护未成年群体,限制未成年使用某些特殊的社交app。

总结

  • app最好是免费下载的
  • app的功能可以做的更全面些,尽管随着功能模块的增加,app的安装包也会随之变大,但通过分析发现,安装包的大小并未呈现出与用户数量和评分的显著的相关性。
  • 对于想开发游戏类型app的公司来说,尽量选择开发免费版本。在开发前要定位目标用户群体,并且做好市场调研。同时游戏适龄最好“4+”,这样能覆盖的用户群体也更广。
  • 收费类app的价格集中在9.99美元以内
  • 在app的设备支持数量上最好不要低于37种设备型号,超过40种设备更佳;支持语言方面最好不要低于5种语言,当然适配的语言越多不同地区的用户体验也会得到改善,这个还是要看自身app的主要市场是在什么地区。
  • app展示页面的图片数尽量放满5张,虽然图片与评分之间的正相关性较低,但是统计信息显示大部分app图片数量在4-5张。
  • 部分类别的app在更新版本时要注意用户评分反馈,如购物和金融类app均呈现出评分下降趋势

Kaggle项目之Mobile App Store相关推荐

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

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

  2. App内购项目的App Store推广

    转载自:http://blog.hudongdong.com/ios/918.html 之前说了<iOS的应用内支付In-app purchase的开发>,说明了App内购项目的流程,今天 ...

  3. iOS 内购项目的App Store推广

    iOS 11以后的用户可以在App Store内的下载页面内直接购买应用的内购商品,这项功能苹果称作做Promoting In-App Purchases,如果你的App需要在App Store推广自 ...

  4. 关于 App Store 苹果商店价格的那些事(历上最全版)

    作者:iHTCboy 一.前言 苹果 2022 年 12 月 6 日宣布 App Store 定价机制最重大升级,新增 700 个价格点.小编当时的总结和分析: App Store 新价格: 最低可设 ...

  5. Mobile APP(Apple IOS app store)特性分析

    Mobile APP(Apple IOS app store)特性分析 一.数据来源.分析目的和思路 1. 数据来源 IOS占据将近一半的智能手机市场,其App Store中有大量App,为了分析Ap ...

  6. Unity项目添加广告,内购测试并上线APP Store

    Ⅰ.添加广告并真机测试 1.用示例广告ID演示Admob Unity 插件 参考(admob官方文字教程) 导入插件包 设置Admob应用ID 示例广告id(测试时务必用示例广告id) 注意导出的ap ...

  7. 项目总结1:微信扫码自动识别设备类型并跳转到相应的应用下载页面(apk或App Store)之解决方案

    问题分析:普通页面一般无法调用微信的扫一扫接口,从而否定通过微信扫一扫功能给我们判断当前扫码的设备类型. 解决方案:通过应用下载页面自身来获取当前访问的客户端设备类型(iPhone.Android.i ...

  8. App Store 内购项目配置

    本文会给大家详细介绍iOS内购,这是本人16年5月底的开发过程,希望对看完此篇文章的人有所帮助.  本文基于XcodeVersion 7.3 (7D175)版本,手机是iPhone 6,9.3系统.  ...

  9. SwiftUI iOS 完整项目之基于CoreData构建购物计划App(教程含源码App Store上线app)

    实战需求 SwiftUI iOS 完整项目之基于CoreData构建购物计划App(App Store上线app) 用我们从超市需要的东西来代替我们口袋里的废纸.只需输入您想要的项目.数量.任何额外备 ...

最新文章

  1. matlab在曲线给命名,matlab 利用xlsread画图,怎么将一组excel数据导入,通过matlab作图...
  2. oracle如何计算2个坐标的距离,百度地图两个坐标之间的距离计算
  3. pycharm 报黄(黄字、黄色)警告 Local variable 'xxx' might be referenced before assignment
  4. 微服务架构学习 之 什么是微服务
  5. HDU1016 Prime Ring Problem dfs+回溯
  6. 开源一些Delphi系统:mp3play
  7. CentOS 7.5 使用 yum 安装 Kubernetes 集群(二)
  8. 关于车机互联方式的一点想法
  9. POJ1015-Jury Compromise【01背包,dp】
  10. 浅入浅出 Android 安全:第五章 Android 应用层安全
  11. c语言设计底层,【学习小总结】C语言的底层开发
  12. Adobe Illustrator的教程:如何建立扁平化设计角色动画
  13. (转)SQLServer_十步优化SQL Server中的数据访问 三
  14. free git online
  15. 黑体std能商用_用产品诠释商用PC成功之道 惠普战66高性能商用一体机评测
  16. 大一计算机题库百度云,大一计算机考试题库.pdf
  17. 超女复活赛,明星大补考
  18. 数据应用系统的压力测试方案
  19. 【译】网页像素追踪原理
  20. sar adc的常用指标(一)

热门文章

  1. ug998逻辑思维导图
  2. Oracle的学习心得和知识总结(七)|Oracle数据库Literals技术详解
  3. 最近非常火的电子木鱼流量主小程序源码
  4. Python编写一个函数,计算一个整数各个数字之和
  5. Power BI中计算同比、环比
  6. 分段概率密度矩估计_2017年考研《数学一》大纲
  7. 计算机软硬件问题及解决方法(经验篇)
  8. MyBatis级联查询
  9. 超级节点MLN012-算法作曲
  10. 隔行插入行、隔行标示颜色,#E灵 #Excel插件