Python数据分析-Google Play商店应用数据分析
一、研究背景
随着移动互联网的普及,智能手机已成为人们生活中不可或缺的一部分。移动应用市场经历了快速发展,应用种类也从娱乐、社交扩展到教育、医疗等各个领域。Google Play商店作为全球最大的Android应用市场之一,为用户提供了多种多样的应用选择。因此,通过对Google Play商店数据的分析,可以深入了解用户偏好、不同类型应用的市场表现,以及各类应用在用户群体中的接受程度。
在应用市场的庞大数据中,影响用户下载和使用的因素可能包括应用类别、评分、评论数量、应用大小、价格以及内容评级等。这些因素不仅影响用户的选择,还对开发者制定营销和推广策略具有指导意义。此外,探究这些因素之间的关系有助于识别应用市场的趋势,从而为开发者、运营商、广告商提供数据支持。
二、研究意义
本研究利用Google Play商店的数据,探索和揭示应用的类型、用户评分、安装量、价格、内容评级等因素的分布和相互关系,旨在帮助开发者了解用户需求,优化产品策略。具体而言,本研究的意义体现在以下几个方面:
-
帮助开发者和市场人员决策:通过分析不同类别的应用受欢迎程度、评分分布和安装数量等数据,开发者和市场团队可以洞察哪些类型的应用更受用户欢迎,从而更精准地定位目标用户。
-
提升应用用户体验:应用的评分和评论数可以反映出用户的满意度和潜在问题,通过数据分析可以识别高评分应用的共性特征,从而优化其他应用的设计和功能。
-
支持广告投放和推广策略:广告商可以借助安装量、用户评分、内容分级等指标,更精准地识别目标用户,优化广告投放和推广策略。
-
洞察市场趋势:分析应用类别在用户中的偏好变化可以帮助预测市场趋势,进一步挖掘特定应用类型的潜在市场和增长机会。
三、实证分析
完整代码和数据集
该数据集包括 Google Play 商店中应用程序的各种属性。
数据集由 10,841 行组成,每行代表一个应用程序。总共有 13 个不同的列,包含 Google Play 商店中可用应用程序的匿名数据,捕获了评分、下载和分类等各个方面。
列名称描述
App:Google Play 商店中列出的应用程序名称。
Category:应用程序所属的类别(例如,ART_AND_DESIGN、GAME)。
Rating:额定值应用程序的用户评分,范围为 1 到 5。
Reviews:评论应用程序的用户评论数。
Size:应用程序的大小,以兆字节 (MB) 或千字节 (KB) 为单位。
Installs:应用的安装/下载次数(例如,10,000+)。
Type:指示应用程序是免费还是付费。
Price:应用的价格(以美元为单位)(如果是付费应用)。
Content Rating:应用的目标受众(例如,所有人、青少年、成熟 17+)。
Genres:流派与应用程序相关的类型(例如,艺术与设计,创意)。
Last Updated:上次更新应用程序的日期。
Current Ver:应用程序的当前版本。
Android Ver:运行应用程序所需的最低 Android 版本。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi'] #中文
plt.rcParams['axes.unicode_minus'] = False #负号
import seaborn as sns
import missingno as msno
from skimpy import skim
from wordcloud import WordCloud
pd.set_option('display.float_format', '{:.0f}'.format)
pd.set_option('display.max_columns', None)
import warnings
warnings.filterwarnings("ignore")
warnings.warn("this will not show")
导入数据集
df_original = pd.read_csv('google_play_store_dataset.csv')
df = df_original.copy()
查看数据集前五行
初始探索和分析值
Skimpy 库的数据集初步总结
skim(df)
info() 方法提供有关 DataFrame 的基本信息。此方法有助于快速了解 DataFrame 的结构。
RangeIndex:有关索引的信息,例如 start、end 和 step size。
数据列:所有列的名称、非 null 值的数量以及数据类型 (dtype)。
memory usage:DataFrame 在内存中占用的空间。
dtypes:有多少种不同的数据类型(例如整数、浮点数、对象等)。
df.shape
df.dtypes
df.describe(include= "object").T
缺失值查看
fig, ax = plt.subplots(figsize=(10, 8),dpi=180)
fig.patch.set_facecolor('lightgray')
ax.tick_params(axis='x', labelsize=8)
ax.tick_params(axis='y', labelsize=8)
sns.heatmap(df.isnull(), cbar=False, cmap='YlOrRd');
msno.matrix(df, color=(0, 0.5, 0), fontsize=18, sparkline=True)
msno.matrix(df);使用 MissingNo 库将数据集中的缺失值显示为矩阵图。
这种可视化对于了解数据集中缺失值的结构非常有用。
这种类型的可视化对于查看缺失值集中在哪些列和行中,以及缺失值在整个数据集中的分布情况非常有用。
df['Size'].nunique()
def convert_to_megabytes(size):
if isinstance(size, str):
if 'k' in size:
return round(float(size.replace('k', '')) / 1024, 2)
elif 'M' in size:
return float(size.replace('M', ''))
else:
return None
return None #
df["Installs"].unique()
df.Installs = df.Installs.apply(lambda x:x.replace("+",""))
df.Installs = df.Installs.apply(lambda x:x.replace(",",""))
df.Installs = df.Installs.apply(lambda x:int(x))
df.安装次数 = df。Installs.apply(lambda x:x.replace('+','')):此代码从“Installs”列中的每个值中删除“+”字符。例如,值 '10,000+' 更改为 '10,000'。
df.安装次数 = df。Installs.apply(lambda x:x.replace(',',','')):此代码从“Installs”列中的每个值中删除逗号 (',“) 字符。例如,值 '10,000' 更改为 '10000'。
df.安装次数 = df。Installs.apply(lambda x:int(x)):此代码将 'Installs' 列中的每个值转换为整数 (int)。例如,值 '10000' 更改为 10000(整数,而不是字符串)。
可视化
就应用程序数量而言,排名靠前的类别是什么?
import matplotlib.pyplot as plt
# 设置图形大小为宽度 10 单位,高度 6 单位,分辨率为 200dpi
plt.figure(figsize=(10, 6), dpi=200)
# 假设 type_counts 已经定义好
bars = plt.bar(type_counts.index, type_counts.values, color=['skyblue', 'seagreen']) # 分配给变量‘bars’
# 设置 x 轴标签为“申请类型”,字体大小为 14
plt.xlabel('申请类型', fontsize=14)
# 设置 y 轴标签为“申请数量”,字体大小为 14
plt.ylabel('申请数量', fontsize=14)
# 设置标题为“按申请类型统计的申请数量”,字体大小为 16
plt.title('按申请类型统计的申请数量', fontsize=16)
# 在柱状图上方添加数值标签
for bar in bars:
yval = bar.get_height()
plt.text(bar.get_x() + bar.get_width()/2, yval + 1, str(int(yval)), va='bottom', ha='center', fontsize=10)
# 显示图形
plt.show()
按应用程序类型划分的评级分布情况如何?
plt.figure(figsize=(10, 8), dpi=200)
# 绘制箱线图,设置 x 轴为'Type'(应用类型),y 轴为'Rating'(评分),数据来自 df,使用指定颜色,设置 whis 参数为 3
boxplot = sns.boxplot(x='Type', y='Rating', data=df, palette={"Free": "skyblue", "Paid": "limegreen"}, whis=3)
# 设置 x 轴标签为“应用类型”,字体大小为 14
plt.xlabel('应用类型', fontsize=14)
# 设置 y 轴标签为“评分”,字体大小为 14
plt.ylabel('评分', fontsize=14)
# 设置标题为“按应用类型的评分分布”,字体大小为 16
plt.title('按应用类型的评分分布', fontsize=16)
# 显示图形
plt.show()
类别的评级及其应用程序数量是多少?
plt.figure(figsize=(15, 10), dpi=200)
# 绘制垂直柱状图,x 轴为'Rating'(评分),数据来自 df,按照特定顺序排序
ax = sns.countplot(x="Rating", data=df, order=df['Rating'].value_counts().sort_index().index, palette='viridis')
# 在柱状图上添加标签
for container in ax.containers:
ax.bar_label(container, fontsize=10)
# 设置标题为“评分类别与数量”,字体大小为 18
plt.title("评分类别与数量", fontsize=18)
# 设置 x 轴标签为“评分类别”,字体大小为 14
plt.xlabel("评分类别", fontsize=14)
# 设置 y 轴标签为“应用数量”,字体大小为 14
plt.ylabel("应用数量", fontsize=14)
# 显示图形
plt.show()
内容分级及其应用程序数量是多少?
内容分级如何影响应用程序中的用户评分?
average_ratings_by_content = df.groupby('Content_Rating')['Rating'].mean()
average_ratings_by_content
plt.figure(figsize=(15, 10), dpi=200)
# 绘制箱线图,x 轴为'内容评级',y 轴为'评分',数据来自 df,为不同内容评级设置颜色
sns.boxplot(x="Content_Rating", y="Rating", data=df, palette={"Everyone": "blue",
"Teen": "yellow",
"Everyone 10+": "green",
"Mature 17+": "red",
"Adults only 18+": "orange",
"Unrated": "purple"})
# 设置图表标题及属性,标题为“内容评级与评分”,字体大小为 20,颜色为“暗红色”
plt.title("内容评级与评分", fontdict={'fontsize': 20, 'color': 'darkred'})
# 显示图形
plt.show()
可以发现,Everyone、Teen 和 Everyone 10+ 的评级几乎相同。
每个类别的异常值都比其他类别多。
成熟 17+ 的平均评分最低,而仅限成人 18+ 类别的平均评分高于其他类别。
每个类别中的应用程序数量是多少?
plt.figure(figsize=(15, 10),dpi=200)
# 绘制水平柱状图,y 轴为'类别',数据来自 df,按照特定顺序排序,使用'tab10'颜色方案
ax = sns.countplot(y="Category", data=df, order=df['Category'].value_counts().index, palette='tab10')
# 在柱状图上添加标签
for container in ax.containers:
ax.bar_label(container)
# 设置图表标题及属性,标题为“按类别统计的应用数量”,字体大小为 20,颜色为“暗红色”
plt.title("按类别统计的应用数量", fontdict={'fontsize': 20, 'color': 'darkred'})
# 设置 x 轴标签
plt.xlabel("应用数量")
# 设置 y 轴标签
plt.ylabel("类别")
# 显示图形
plt.show()
大多数应用程序位于 Family 类别中,其次是 Game,然后是 Tools。
哪些品类的应用总支出最高?
total_spending_by_category = df.groupby('Category')['Price'].sum().sort_values(ascending=False)
top5_categories = total_spending_by_category.nlargest(5)
top5_categories
plt.figure(figsize=(15, 10), dpi=200)
ax = sns.barplot(x=top5_categories.index, y=top5_categories.values, order=top5_categories.index)
# 设置 x 轴标签为“类别”,字体大小为 14
plt.xlabel('类别', fontsize=14)
# 设置 y 轴标签为“总支出”,字体大小为 14
plt.ylabel('总支出', fontsize=14)
# 设置标题为“支出前五的类别”,字体大小为 16
plt.title('支出前五的类别', fontsize=16)
for container in ax.containers:
ax.bar_label(container)
# 显示图形
plt.show()
# 聚合‘App’列中的所有应用名称
text = ' '.join(df['App'])
# 生成词云,设置宽度为 1200,高度为 600,背景颜色为白色,使用'plasma'颜色映射
wordcloud = WordCloud(width=1200, height=600, background_color='white', colormap='plasma').generate(text)
# 设置图形大小为宽度 15 单位,高度 8 单位,分辨率为 200dpi
plt.figure(figsize=(15, 8), dpi=200)
# 显示词云
plt.imshow(wordcloud, interpolation='bilinear')
# 关闭坐标轴
plt.axis('off')
# 显示图形
plt.show()
Google Play 商店应用程序名称中最常见的词是什么?
# 聚合‘App’列中的所有应用名称
text = ' '.join(df['App'])
# 生成词云,设置宽度为 1200,高度为 600,背景颜色为白色,使用'plasma'颜色映射
wordcloud = WordCloud(width=1200, height=600, background_color='white', colormap='plasma').generate(text)
# 设置图形大小为宽度 15 单位,高度 8 单位,分辨率为 200dpi
plt.figure(figsize=(15, 8), dpi=200)
# 显示词云
plt.imshow(wordcloud, interpolation='bilinear')
# 关闭坐标轴
plt.axis('off')
# 显示图形
plt.show()
四、研究结论
本研究通过Python对Google Play商店应用数据进行了详细的探索性分析,并得出以下主要结论:
-
应用类别与用户偏好:
- 在所有类别中,“Family”应用数量最多,占据了相当大的市场份额。其次是“Game”和“Tools”类应用,表明用户对家庭和娱乐工具的需求量较大。
- 尽管一些专业类应用如“Medical”和“Education”应用数量较少,但评分普遍较高,表明用户对其质量较为认可。
-
应用评分与应用类型的关系:
- 免费应用的评分分布较为分散,可能是因为免费应用数量庞大,质量差异较大。而付费应用的评分相对集中,评分整体偏高,表明付费应用在用户心中更具价值,用户的满意度普遍较高。
- 内容分级也对评分产生影响。Teen、Everyone和Everyone 10+的评分分布接近,Mature 17+的评分略低,这可能与用户期望和内容分级的匹配度有关。
-
安装量与价格的关系:
- 大多数高安装量的应用是免费应用,而价格较高的付费应用安装量普遍偏低,说明免费策略仍然是吸引大量用户的有效手段。
- 在支出方面,虽然“Family”类应用数量多,但安装量更集中的类别如“Game”和“Entertainment”应用贡献了较高的总收入。
-
内容评级的影响:
- 内容评级为Everyone的应用最多,符合普遍用户需求。而Adults Only和Mature 17+应用较少,这类应用的目标用户较为特定。
- 不同内容评级的评分也存在差异,“Everyone”和“Teen”级别的评分整体较高,表明面向更广泛用户群体的应用获得了更多积极反馈。
-
应用名称词云:
- 通过词云图分析发现,应用名称中出现频率较高的词汇多为与应用类别和功能相关的词汇,如“Game”、“Photo”等,这反映了当前市场中用户对娱乐和工具类应用的需求。
综上所述,通过对Google Play商店数据的深入分析,我们可以了解到移动应用市场的用户偏好和市场趋势。免费的娱乐和家庭类应用最受欢迎,同时付费应用在较高的评分和专门化类别中表现突出。未来,开发者可根据这些数据挖掘更多的市场需求,为用户提供更优质、更符合需求的应用。