Python——谷歌应用市场数据分析

一、数据介绍

字段 说明
App 应用名称
Category 种类
Rating 应用评分
Reviews 评价数量
Size 应用大小
Installs 安装量
Type 是否付费
Price 价格
Content Rating 内容分级
Genres 类型
Last Updated 最近更新日期
Current Ver 最新应用版本
Android Ver 最低要求安卓版本

本文想通过分析谷歌应用商店应用数据来研究影响应用评分的因素。

二、数据清理

1. 导入数据库

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
import seaborn as sns
import squarify
import warnings
warnings.filterwarnings('ignore')

2. 读取数据

此次分析不需要后3列数据,因此读取的时候不导入后3列。Category和Genres数据重复,此处只保留Category。

data=pd.read_csv("download/googleplaystore.csv",usecols=[0,1,2,3,4,5,6,7,8])
data.info()
data.head()

3. 去重

数据中存在多行App名称重复的数据,应将重复项删除,保证数据的唯一性。

# 经筛选可知有1181行App名称重复的数据
data["App"].duplicated().sum()
# 去掉App名称重复的数据
data.drop_duplicates(subset="App",keep="first",inplace=True)
data.info()

4. 转换数据类型

4.1. 首先查看各列情况

for i in ["Rating","Reviews","Size","Installs","Price"]:
    print(data[i].value_counts(dropna=False))
    print("-"*100)

4.2. Rating处理
Rating范围应在0-5之间,发现一个为19的异常值,进一步查看此行数据。

data[data["Rating"]==19]

发现此行数据属于填写错位,一条数据对整体影响不大,可以删去。Rating里有大量空值,考虑到空值的数量已超过总数据的 1/10,如果采用均值填充,均值就会失准从而使填补失效。此处保留空值,并在做Rating相关分析时排除空值所在的行。

data.drop(labels=10472,inplace=True)
data["Rating"]=data["Rating"].astype("float")
data["Reviews"]=data["Reviews"].astype("int")

4.3. Size处理
将App大小单位统一为M,并且将"Varies with device"替换为空值(如果用平均值替换会导致平均值处数值分布过多,影响对数值分布的观察)

data["Size"]=data["Size"].str.replace("Varies with device","nan")
data["Size"]=data["Size"].str.replace("M","")
data.loc[data["Size"].str.contains("k"),"Size"]=data.loc[data["Size"].str.contains("k"),"Size"].str.replace("k","").astype("float")/1024
data["Size"]=data["Size"].astype("float").round(2)

4.4. Installs处理

data["Installs"]=data["Installs"].str.replace("+","")
data["Installs"]=data["Installs"].str.replace(",","")
data["Installs"]=data["Installs"].astype("int")

4.5. Price处理

data["Price"]=data["Price"].str.replace("$","")
data["Price"]=data["Price"].astype("float")

4.6. Type处理:Type列有一个空值需要处理,经观察此行数据Price为0,因此Type应为Free

data[data["Type"].isnull()]
data.loc[data["Type"].isnull(),"Type"]="Free"

至此,所有数据处理完毕,让我们来看一下处理后的情况。

data.info()
data.head()

三、数据分析

1. 总览

1.1. 总览各类目App分布情况:
Family、Game,Tools这三类的app数量最多,远远超过其他类app。

data_treemap = data.groupby('Category').size().sort_values(ascending=False)
sizes=data_treemap.values
labels=data_treemap.index
colors = cm.rainbow(np.arange(len(sizes))/len(sizes))
plt.figure(figsize=(25,15))
squarify.plot(sizes=sizes,label=labels,color=colors,alpha=.7)
plt.axis('off')

1.2. 总览评分分布情况:
根据图形可以看出Rating呈左偏分布,App评分还是以高分为主。数据主要分布在4.1-4.6左右,都比较集中。

plt.figure(figsize=(10,8))
sns.distplot(data["Rating"], hist = True, kde = True, rug = True)

1.3. 总览各因素间相关关系
由图可知,Reviews和Installs的相关系数为0.62,说明两者之间有比较强的正相关关系。

data_heat=data.loc[data["Rating"].notnull(),["Rating","Reviews","Installs","Price","Size"]]
corr = data_heat.corr()
plt.figure(figsize=(10, 10))
sns.heatmap(corr,square=True,annot=True,annot_kws={'size':15},cmap="Blues",vmin=-1,alpha=.8)
plt.xticks(fontsize=15)
plt.yticks(fontsize=15)

2. 类别和评分的关系

总体来看,各类App评分情况差距不大,中位数都在4分以上。

其中BOOKS_AND_REFERENCE、HEALTH_AND_FITNESS、EVENTS为评分中位数最高。

Dating类的App评分中位数为最低且其数据分布离散,说明评分波动较大,此类app运营人员应多加关注用户体验。

data.boxplot(by="Category", column=["Rating"],figsize=(30,20),grid=False, rot=90, fontsize=20,patch_artist=True,medianprops={'linewidth':3,'color':'k'})
plt.xlabel('Category', fontsize=25)
plt.ylabel('Rating', fontsize=25)
plt.suptitle('')
plt.title('')

3. 安装量和评分的关系

在小提琴图中,每个小提琴的面积与每个分类中的安装数量成比例(因为在参数设置中使得scale="count")。由此我们可以得知,安装量在1000-100000的App数量是最多的。

同时也可以看出,安装量越大,该组App的最高评分会越低,这应该是由于随着用户群体的增多,对App的不同评价也会增多,很难再出现用户数量少时清一色高分评价的情况了。所以在用户高速增长时期,App评分略微下降是正常现象。

此外,安装量越高的组,评分差异也越小。这也是理所当然的,依据我们的经验,高下载量的都是比较成熟的高分A跑偏了。

#按照四分位数对安装量进行分组
data["Installs"].describe()
data["Installs"]=pd.qcut(data["Installs"],4,labels=["0-1,000","1,000-100,000","100,000-1,000,000","1,000,000-1,000,000,000"])
plt.figure(figsize=(15,10))
sns.violinplot(x="Installs",y="Rating",data=data,scale="count",inner="box",color='white',linewidth=3)
plt.ylabel("Rating",fontsize=15)
plt.yticks(fontsize=15)
plt.xlabel("Installs",fontsize=15) 
plt.xticks(fontsize=15)

4. App大小和评分的关系

可以看出App大小主要集中在0-40M,App大小和评分没有明显的相关关系。

plt.figure(figsize=(15,10))
plt.scatter(data["Size"],data["Rating"])
plt.xlabel("Size",fontsize=15) 
plt.ylabel("Rating",fontsize=15) 

5. App价格和评分的关系

可以发现App价格主要集中在0-10美元之间,App价格和评分没有明显的相关关系。

plt.figure(figsize=(15,10))
plt.scatter(data["Price"],data["Rating"])
#筛选出价格在250以上的App信息,名字基本上都为“I am rich”,都是一些恶作剧App,可将其列为异常值忽略。
data[data["Price"]>250]
data_price=data[data["Price"]<250]
plt.figure(figsize=(15,10))
plt.scatter(data_price["Price"],data_price["Rating"])
plt.xlabel("Price",fontsize=15) 
plt.ylabel("Rating",fontsize=15) 

6. App使用群体和评分的关系

谷歌应用市场中中还是以面向所有用户的App为主,其次是面向青少年群体的App。可以看出评分和用户群体划分没有必要联系,因为面向不同用户群体的App都是集中在4.1-4.6分这个阶段。

data_content=data.groupby(["Rating","Content Rating"],as_index=False)["App"].count()
data_bar=pd.pivot(data_content, index='Rating', columns='Content Rating')
data_bar.plot.bar(stacked=True,figsize = (15, 10))
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容