图解APP Store上的高分应用特征(上)

我最近迷上了腾讯的手游魂斗罗,作为非人民币玩家以时间换等级的理念驱动下终于把人物练到了102级,再往上实在是太耗时间了,就有些索然无味了,想弄点新游戏玩玩,苹果手机是只能从APP Store下载的应用的,我一般的做法是按照系统的排序,看看前几名的APP,点入看看功能和截图,再决定下不下载,作为一个懒惰用户没给软件打过分。之前我从没想过到底是什么是驱使用户下载的主原因和动力,哪个方面是最吸引我的关注度,是软件描述还是用户打分,抑或是更多的软件截图,这里我们用数据分析的方法去分析,通过分析去了解APP Store的高下载率和高好评率软件的特征是什么?

        

         数据集来自自Apple Inc网站上的iTunes Search API,包含7000多个Apple iOS移动应用程序详细信息。

 

         通过图1可以看到这个数据集分为两个csv文件,一个是APP在APP Store.csv上是的软件的在store上的各种展现值,另一个appstore_descrption.csv则包含APP本身的属性如,名称,描述,Size,这个两个表的有重合的部分,故我们将其合成一个表来操作,合并后如图2。

 

图解APP Store上的高分应用特征(上)

图1 APP Store数据集

         图解APP Store上的高分应用特征(上)

图2 合并表

 

 

         我们的关注的字段有rating_count_tot:总打分的个数,这个变相反应了下载量,user_rating:用户评分。

 

         图三展示的APP分类与内容评分(4岁+~ 17岁+)的数据展示图,这里不出所料游戏在年龄适用范围内APP的数量遥远领先,而且基本大量都在4岁以上就可以玩,难道都是企鹅公司的产品,但其中有个门类下载数量一般,但也大量适用于4岁+,这个门类是Education,家长们都是渴望利用APP来实现教育,但估计孩子都是用手机来打游戏了。

 

         图解APP Store上的高分应用特征(上)

图三 APP分类与内容评价数量

 

         我的目标是游戏软件,所以我先将其它软件分类都去掉,那么什么是我值得下载的软件呢?根据之前用户的打分情况能提供什么真相给我们呢?参考图4,游戏分类里得4.5和0分的游戏最多,整体质量还算不错的。而图5解释了一个问题,一分钱一分货,价格超过15美金已经没有差评了,而免费的存到大量的各种评分,所以不花钱就能得到好软件的就得看运气了。保险起见可以选择15~20美金左右的游戏,没有差评。

                  图解APP Store上的高分应用特征(上)

图4 游戏评分分布图

图解APP Store上的高分应用特征(上)

图5价格与评分

 

 

         这样就区分出了两类人群,一个是付费的,一个是免费的,付费的也不见得花钱就能买到好产品,尤其是10美金以下时,那么我们怎么获得图5的中间高分交汇处的好APP呢?

我们将评分4.5以上的付费与免费软件的描述都拿出来,看看什么样的描述是好APP的特征。

 

         新不做过多处理用软件描述产出词汇的分布云图,这里明显看到付费的以puzzle解密类游戏为主,而免费的以battle对战模式游戏为主,这个很好理解了,多人对战游戏都是吸引你免费下载,所以friend这个单词也被用到了很多,毕竟大流量才是对战游戏的乐趣,而付费下载游戏则是各种密室逃脱类的单机版游戏,best才是付费软件最愿意用的关键字。

图解APP Store上的高分应用特征(上)

图6 APP描述关键字

 

         我进一步处理只保留评分4.5分以上的APP软件描述,再次抽取关键字,看到优秀软件的关键词发生了变化,免费的突出了friend和free,能和朋友一起玩的免费APP才是好APP,而收费的则是One Levels出现频率变得更多,也就是说解密软件要有更多关卡才是好APP

 

图解APP Store上的高分应用特征(上)图7 评分4.5以上 APP描述关键字

 

 

这里放出图7的Code:

 

def NicePriceOnCloud():

         priceclound = full_data[full_data.price !=0]

         nopriceclound = full_data[full_data.price ==0]

         priceclound = priceclound[priceclound.user_rating >= 4.5]

         nopriceclound = nopriceclound[nopriceclound.user_rating >= 4.5]

 

         priceclound_text = ','.join(str(i) for i in priceclound.values)

         stopwords = set(STOPWORDS)

         stopwords.add("game")

         stopwords.add("world")

         stopwords.add("will")

         stopwords.add("play")

         stopwords.add("player")

         stopwords.add("mode")

         stopwords.add("new")

         stopwords.add("level")

         stopwords.add("time")

         stopwords.add("fun")

         stopwords.add("the")

         stopwords.add("make")

 

         price_wordcloud = WordCloud(background_color='white',stopwords =stopwords , max_font_size=110,  min_font_size=10, mode='RGBA', font_path='source/simhei.ttf').generate(priceclound_text)

         fig = plt.figure()

         price_ax = fig.add_subplot(121)

         price_ax.imshow(price_wordcloud )

         price_ax.set_title('付费APP')

         price_ax.axis('off')

         # plt.show()

 

         nopriceclound_text = ','.join(str(i) for i in nopriceclound.values)

         noprice_wordcloud = WordCloud(background_color='white',stopwords =stopwords , max_font_size=110,  min_font_size=10, mode='RGBA', font_path='source/simhei.ttf').generate(nopriceclound_text)

         noprice_ax = fig.add_subplot(122)

         noprice_ax.imshow(noprice_wordcloud)

         noprice_ax.set_title('免费APP')

         plt.axis('off')

         plt.show()

 

 

         恩,我现在需要筛选出出17岁以上的,好评4.5以上,免费的APP列表,参考图8,

贡献一下Code

 

from pandas.tools.plotting import table

full_data["is_free"] = full_data.price.apply(lambda price: True if price == 0 else False)

def getGameTop10():

         #大于17

         new_data = full_data[full_data.cont_rating==17]

         #免费

         new_data = new_data[new_data.is_free == True]

         #好评大于4.5

         new_data = new_data[new_data.user_rating >= 4.5]

 

         selected_columns = ["track_name", "lang.num", "size_bytes", "is_free", "price", "user_rating", "rating_count_tot"]

         new_data = new_data.sort_values(by = ["rating_count_tot","user_rating"], ascending = False).head(10)[selected_columns]

         rowlabel = ['track_name']

         collabel = ["lang.num", "size_bytes", "is_free", "price", "user_rating", "rating_count_tot"]

         print (new_data.head(5))

 

图解APP Store上的高分应用特征(上)

图8 APP前5好游戏排名