一、数据介绍
| 字段 | 说明 |
|---|---|
| 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))
