美文网首页数据分析学习笔记
Python数据分析-Google Play Store App

Python数据分析-Google Play Store App

作者: 虎嗅蔷薇_c244 | 来源:发表于2020-03-12 00:42 被阅读0次

    简书展示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之间有较强的相关性
    

    相关文章

      网友评论

        本文标题:Python数据分析-Google Play Store App

        本文链接:https://www.haomeiwen.com/subject/rzjljhtx.html