数据分析学习笔记

Python数据分析-Google Play Store App

2020-03-12  本文已影响0人  虎嗅蔷薇_c244

简书展示jupyter notebook的分布输出结果有问题,需要看分步结果的可以到我的CSND博客
https://blog.csdn.net/Itachi_dream

#!/usr/bin/env python
# coding: utf-8
# 明确分析目的:了解装机app中不同分类安装、评价等信息,为上线新app作指导
# 软件分类中APP数量最多的前10个分组;# 安装量最高的前五个分类
# 收费软件集中在哪些分类中,头部占比多少
# 免费和收费软件各自的评论安装比是多少
# 不同app分类下免费/收费软件的平均评分、装机数量级
# 哪些分类下软件评论较多,平均评分如何
# 参数相关性
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 本次分析涉及列有App、Category、Type、Size、Price、Reviews、Installs、Rating
# 经查看对应数据表列索引的0 1 2 3 4 5 6 7 12
df = pd.read_csv('./googleplaystore.csv', usecols=(0, 1, 2, 3, 4, 5, 6, 7))
df.head() # 查看前五行
# 查看数据信息
df.info()
# 查看⾏列数量
df.shape
# 查看各列非空数据量
df.count()
# -->可见Rating、Type、Android Ver列有缺失值
# 查看是否有完全重复的行数据
len(df[df.duplicated()])
# App处理 查看有没有重复值(App名称重名也正常)
pd.unique(df['App']).size #查看App名不重复的数据量
# 或使用
# df[df['App'].duplicated()] #可见重复App名很多
# df['App'].counts()
# Category 清洗
df['Category'].value_counts(dropna=False)  # 结果有一条名为1.9的异常值
df.drop(df[df['Category'] == '1.9'].index, inplace = True) # 删除
# Rating 清洗
df['Rating'].value_counts(dropna = False) # 结果显示有1474条NaN
# 在前述df.count()方法中可见Rating有缺失值
# 使用平均数填充
df['Rating'].fillna(df['Rating'].mean(), inplace = True)
# Reviews 清洗
# df['Reviews'].value_counts(dropna = False) #数据量过多,不适合使用这个方法
#判断字符串类型数据是否只由数字组成 isnumeric()
print(df['Reviews'].str.isnumeric().sum()) # 结果10840,和总数10841相差1
#转换数据类型 把Reviews数据从str变为整型
df['Reviews'] = df['Reviews'].astype('i8')
# Size 清洗
df['Size'].value_counts(dropna = False) # 查看Size数据的数据形式
df['Size'] = df['Size'].str.replace('M', 'e+6') # 单位转换
df['Size'] = df['Size'].str.replace('k', 'e+3') # 单位转换
# 转换数据格式 str -> float
# df['Size'] = df['Size'].astype('f8') 
# 显示ValueError: could not convert string to float: 'Varies with device'
# 由报错可知仍存在无法转换的字符串

# 定义⼀个字符串判断是否可以转换的函数
def is_convertable(v):
    try:
        float(v)
        return True
    except ValueError:
        return False
    
# 查看不能转换的字符串分布
temp = df['Size'].apply(is_convertable)
df['Size'][-temp].value_counts() # 无法转换的字符串数量
# 结果:Varies with device    1695  Name: Size, dtype: int64

# 替换这些字符串
df['Size'] = df['Size'].str.replace('Varies with device', '0') # 注意需要有接收值

#查看是否还有未转换的字符串
temp = df['Size'].apply(is_convertable)
df['Size'][-temp].value_counts() # 无法转换的字符串数量
# 结果:Series([], Name: Size, dtype: int64)
# Size 清洗-转换类型
# e+6这种格式使⽤astype直接转为int有问题,如果想转成int,可以先转成f8,再转i8
df['Size'] = df['Size'].astype('f8').astype('i8')

# 将Size为0的填充为平均数
df['Size'] = df['Size'].replace(0, df['Size'].mean())
# Installs 清洗
# 查看数据分布
df['Installs'].value_counts(dropna = False)
# 替换
df.Installs = df.Installs.str.replace('+', '')
df.Installs = df.Installs.str.replace(',', '')
# 格式转换
df.Installs = df.Installs.astype('i8')
df.describe()
# Type 清洗
# 在前述df.count()方法中可见Type有缺失值
df.Type.value_counts(dropna = False) # 显示有一条NaN值
df.drop(df[df.Type.isnull()].index, inplace = True)
# Price 清洗
df['Price'].value_counts()  # $394.99
df['Price'] = df['Price'].str.replace('$', '')
df['Price']
# 格式转换
df['Price'] = df['Price'].astype('f8')
# 开始分析
# 数值型数据整体情况
df.describe()
# 分类的个数
df.Category.unique().size
# 软件分类中涉及到的高频分类有哪些,按照APP数量取前10个分类 降序排列
df_Cate = df.groupby('Category').count().sort_values('App', ascending = False)
df_Cate = df_Cate.head(10)['App']
df_Cate
# 安装量最高的前五个分类是哪些
df_Ins = df.groupby('Category').mean()['Installs']
df_Ins.sort_values(ascending = False).head()
# 收费软件集中在哪些分类中,头部占比多少
df_Paid = df[df['Type'] == 'Paid']
df_Paid_Cate = df_Paid.groupby('Category', as_index = False).count()[['Category', 'App']]
df_Paid_Cate.rename(columns = {'App':'App_num'}, inplace = True)
df_Paid_Cate_head = df_Paid_Cate.sort_values('App_num', ascending = False).head()
print(df_Paid_Cate_head)
print('前五类收费软件数目占总收费软件数目的比例为' + str(len(df_Paid_Cate_head)/len(df_Paid_Cate)))
# 免费和收费软件各自的评论安装比是多少
df_Type = df.groupby('Type').mean()
df_Type['RIO'] = df_Type['Reviews']/df_Type['Installs']
df_Type
# -->收费软件的评论安装比更高
# 免费/收费软件在不同分类下的平均评分、装机数量级
# df.head()
df_Cate_Type = df.groupby(['Category', 'Type'], as_index = False).mean()
df_Cate_Type
# 哪些分类下软件评论较多,平均评分如何
df['Reviews'].astype('f8')
df_Cate_Rev_Rat = df.groupby('Category', as_index = False).mean()
df_Cate_Rev_Rat = df_Cate_Rev_Rat[['Category', 'Reviews', 'Rating']]
df_Cate_Rev_Rat.sort_values('Reviews', ascending = False, inplace = True)
df_Cate_Rev_Rat.head()
# 参数相关性 (0.5以上可以认为相关,0.3以上可以认为是弱相关)
df.corr()
# --> Reviews和Installs之间有较强的相关性
上一篇下一篇

猜你喜欢

热点阅读