案例2:Appstore数据分析

学习目标

  • 掌握描述性数据分析流程
  • 能够使用pandas、seaborn进行数据分析和可视化

1. 案例介绍

案例背景

  • 对 App 下载和评分数据分析,帮助 App 开发者获取和留存用户
  • 通过对应用商店的数据分析为开发人员提供可操作的意见

分析需求

  • 免费和收费的 App 都集中在哪些类别
  • 收费 App 的价格是如何分布的,不同类别的价格分布怎样
  • App文件的大小和价格以及用户评分之间是否有关

分析流程

1)数据概况分析

  • 数据行/列数量
  • 缺失值分布

2)单变量分析

  • 数字型变量的描述指标(平均值,最小值,最大值,标准差等)
  • 类别型变量(多少个分类,各自占比)

3)多变量分析

  • 按类别交叉对比
  • 变量之间的相关性分析

4)可视化分析

  • 分布趋势(直方图)
  • 不同组差异(柱状图)
  • 相关性(散点图/热力图)

数据集说明

本案例使用 applestore.csv 数据集,其数据字段如下:

字段

说明

id

App ID:每个 App 唯一标识

track_name

App 的名称

size_bytes

以 bytes 为单位的 App 大小

price

定价(美元)

rating_count_tot

App 所有版本的用户评分数量

prime_genre

App 的类别

user_rating

App 所有版本的用户评分

sup_devices

支持的 iOS 设备数量

ipadSc_urls

App 提供的截屏展示数量

lang

支持的语言数量

2. 数据清洗

1)加载 applestore.csv 数据,查看数据基本信息

app = pd.read_csv('./data/applestore.csv', index_col=0)
app

app大数据架构图_App

# 查看数据集的字段信息
app.info()

app大数据架构图_app大数据架构图_02

# 查看数据集的各字段统计值
app.describe()

app大数据架构图_数据分析_03

2)考虑将 sizebytes 变成 mb,新增数据 size_mb

app['size_mb'] = app['size_bytes']/(1024 * 1024)
app

app大数据架构图_App_04

# 查看 size_mb 列的统计值
app.size_mb.describe()

app大数据架构图_app大数据架构图_05

3)根据价格新增是否免费 paid 列

app['paid'] = app['price'].apply(lambda x: 1 if x > 0 else 0)
app

app大数据架构图_app大数据架构图_06

# 查看 paid 列的统计信息
app['paid'].value_counts()

app大数据架构图_数据分析_07

小结:

  • 处理了给分析造成难度的值(size-bytes)
  • 添加了方便分析的特征(免费/收费)

3. 单变量/多变量分析

1)查看 App 的结果是如何分布的

# 查看 App 的价格是如何分布的
app.price.value_counts()

app大数据架构图_App_08

从数据中可以看出,价格>50的比较少,可以按照价格将 App 数据进行分组

2)查看不同类别 App 价格是如何分布的

# 不同类别 App 价格是如何分布的
app.groupby('prime_genre')['price'].describe()

app大数据架构图_app大数据架构图_09

3)删除价格大于 49.99 的 App 数据

app = app[app['price'] <= 49.99]
app.head()

app大数据架构图_数据分析_10

4)按照价格将 App 数据进行分组

bins = [0, 2, 10, 30, 50]
labels = ['<2', '<10', '<30', '<50']
app['price_new'] = pd.cut(app.price, bins, right=False, labels=labels)
app.head()

app大数据架构图_App_11

# 分组后查看数据分布情况
app.groupby('price_new')['price'].describe()

app大数据架构图_app大数据架构图_12

5)利用 App 所有版本的评分数量对数据进行分组

# 查看 App 所有版本的评分数量的统计信息
app.rating_count_tot.describe()

app大数据架构图_数据分析_13

bins = [0, 1000, 5000, 100000, 5000000]
app['rating_new'] = pd.cut(app['rating_count_tot'], bins, right=False)
app.head()

app大数据架构图_app大数据架构图_14

# 分组后查看数据分布情况
app.groupby('rating_new')['price'].describe()

app大数据架构图_大数据_15

4. 业务数据可视化

1)查看 App 的类别和用户评分之间的关系,绘制折线图

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

# 创建画布(图)
plt.figure(figsize=(15, 5))

# appl类别评分关系
sns.lineplot(x='prime_genre', y='user_rating', data=app)

# 将 x 轴文字旋转45度
plt.xticks(
    rotation=45,
    horizontalalignment='right',
    fontweight='light',
    fontsize='x-large'  
)

app大数据架构图_App_16

结果说明:从上图中可以看出,大部分评分集中在 2 分和 4 分之间

2)查看价格小于等于 9.99 元的 App 价格分布

plt.figure(figsize=(20, 8))
# 筛选出 price<=9.99 的 App 数据
app_result = app[app['price']<=9.99]
sns.histplot(app_result, x='price', bins=10, kde=True)

app大数据架构图_big data_17

结果说明:从上面的结果中看出,大部分应用都是免费的,极少数APP的收费>5元

3)查看不同类别的收费 App 的价格分布

plt.figure(figsize=(20, 8))
sns.boxplot(x='price', y='prime_genre', data=app[app['paid']==1])
plt.yticks(fontweight='light', fontsize='x-large')

app大数据架构图_数据分析_18

结果说明:价格绝大部分都集中在 9.99 美元以内,个别类别(如医疗)等因专业性总体价格会高于其他类别

4)查看数量最多的前 5 个类别收费 App 的价格分布

# 筛选出数量最多的前 5 类 App 的数据
top5 = app.groupby('prime_genre')['price'].count().sort_values(ascending=False).head()
app5 = app[app.prime_genre.isin(top5.index)]
# 绘制箱线图
plt.figure(figsize=(20, 8))
sns.boxplot(x='price', y='prime_genre', data=app5[app5['paid']==1])

app大数据架构图_App_19

结果说明:从上图可以看出,Games的价格分布更广,最大值也较高,异常值也较多

5)数据最多的 5 个类别中,每个类别免费和付费的评分进行对比

# 同一类别,将免费和付费的评分进行对比
plt.figure(figsize=(20, 8))
sns.barplot(x='prime_genre', y='user_rating', data=app5, hue='paid')

app大数据架构图_big data_20

6)查看 App 数据中价格和用户评分的关系,绘制散点图

plt.figure(figsize=(20, 8))
sns.scatterplot(x='price', y='user_rating', data=app)

app大数据架构图_app大数据架构图_21

结果说明:从散点图可以看出,价格和评价关联不强,高价的应用评价两级分化,但数据相对较少

5. 业务解读

5.1 业务问题1:免费或收费 App 集中在哪些类别?

分析思路

  • 第一步:将数据统计出每个类别有多少个app
  • 第二步:从高到低进行排列
  • 第三步:将数据进行可视化
plt.figure(figsize=(20, 8))
# 参数 order 指定数据显示的顺序
sns.countplot(y='prime_genre', data=app,
              order=app['prime_genre'].value_counts().index, hue='paid')

app大数据架构图_数据分析_22

业务解答:免费或收费都是高度集中在游戏类别

5.2 业务问题2:免费与收费的 App 在不同评分区间的分布?

1)将评分进行分箱,查看落入不同箱中应用的数量

bins=[0,0.5,2.5,4.5,5.1]
app['rating_level'] = pd.cut(app.user_rating, bins, right=False)
app.groupby('rating_level')['user_rating'].describe()

app大数据架构图_数据分析_23

2)数据可视化

plt.figure(figsize=(20, 8))
sns.countplot(x='paid', data=app, hue='rating_level')

app大数据架构图_App_24

5.3 业务问题3:APP的价格、大小和用户评分之间有关系吗?

1)通过 corr 计算 App 的价格、大小和用户评分之间的关系

app[['user_rating', 'price', 'size_mb']].corr()

app大数据架构图_大数据_25

2)通过热力图来查看变量之间两两相关系数

plt.figure(figsize=(20, 8))
sns.heatmap(app[['user_rating', 'price', 'size_mb']].corr())

app大数据架构图_big data_26

 业务解答:应用的大小、价格与评分没有很明显的关联,但是价格和大小之间有正相关关系