用pandas进行数据分析实战

数据湖开发者社区

开发者社区.png
    安装pandas模块包,载入练习数据。
    在pandas中,常用的载入函数是read_csv。除此之外还有read_excel和read_table,table可以读取txt。若是服务器相关的部署,则还会用到read_sql,直接访问数据库,但它必须配合mysql相关包。read_csv拥有诸多的参数,encoding是最常用的参数之一,它用来读取csv格式的编码。这里使用了gb2312,该编码常见于windows,如果报错,可以尝试utf-8。
    sep参数是分割符,有些csv文件用逗号分割列,有些是分号,有些是\t,这些都需要具体设置。header参数为是否使用表头作为列名。
    names参数可以为列设置额外的名字,比如csv中的表头是中文,但是在pandas中最好转换成英文。

image.png
image.png
    通过输出我们可以看到其表格的行与列数,但由于篇幅原因,显示中部分数据省略。我们可以通过调整展示的长度及宽度显示更多文件信息。

image.png
image.png

    因为数据集的数据比较多,如果我们只想浏览部分的话,可以使用head函数,显示头部的数据,默认5,也可以自由设置参数,如果是尾部数据则是tail。
    不设置head函数参数,输出结果如下:
image.png
image.png

    设置head函数参数值为7,结果输出如下:
image.png
image.png

    不设置tail函数参数,输出结果如下:
image.png
image.png

    设置tail函数参数为6,输出结果如下:

image.png
image.png

    检查是否有重复数据,其中positionId是职位ID,具备唯一性,我们通过此列进行重复数据检查。

image.png
image.png

    我们得到唯一值只有5031个,但根据表格共有6876个数据,我们需要将重复数据清除。
使用drop_duplicates清除重复数据。
image.png
image.png

    drop_duplicates函数通过subset参数选择以哪个列为去重基准。keep参数则是保留方式,first是保留第一个,删除后余重复值,last还是删除前面,保留最后一个。duplicated函数功能类似,但它返回的是布尔值。
    接下来处理salary薪资数据。计算出薪资下限以及薪资上限。薪资内容没有特殊的规律,既有小写k,也有大写K,还有k以上等用法,k以上只能上下限默认相同。
    这里需要用到pandas中的apply。它可以针对DataFrame中的一行或者一列数据进行操作,允许使用自定义函数。
image.png

    定义一个cut_word函数,它查找「-」符号所在的位置,并且截取薪资范围开头至K之间的数字,也就是我们想要的薪资上限。
    apply将cut_word函数应用在salary列的所有行。
    对于k以上写法的数据,find函数会返回-1,如果按照原来的方式截取,是word[:-2],不是我们想要的结果,所以需要加一个if判断。
    因为python大小写敏感,我们用upper函数将k都转换为K,然后以K作为截取。
输出bottomSalary及topSalary值。
image.png
image.png

    接下来进行平均薪资的求解,在求平均薪资前,我们需要将需要使用数据转换为int类型再进行运算。
image.png
    数据类型转换为数字,这里引入新的知识点,匿名函数lambda作为一次性函数。
lambda x: * ,前面的lambda x:理解为输入,后面的星号区域则是针对输入的x进行运算。案例中,因为同时对top和bottom求平均值,所以需要加上x.bottomSalary和x.topSalary。word_cut的apply是针对Series,现在则是DataFrame。
    axis是apply中的参数,axis=0表示将函数用在行,axis=1则是列。输出下图结果。
image.png
    数据清理完成后,我们将想要分析的数据切选出,为后续的分析。
image.png
image.png
    这里依旧可以使用head、tail函数等设置参数查看开始和结尾的部分数据。
    下面对几个数据进行描述统计。
    value_counts是计数,统计所有非零元素的个数,以降序的方式输出Series。对city一列进行统计:
  image.png
            image.png
    对education一列进行统计:
image.png
       image.png

    对于薪资的统计,我们使用describe函数
        image.png
             image.png
    Describe函数能快速生成各类统计指标。薪资的平均数是17k,中位数是15k,最大薪资在75k。
    标准差在8.99k,有一定的波动性,大部分薪资在17±9k之间。
一般分类数据用value_counts,数值数据用describe,这是最常用的两个统计函数。
    pandas自带绘图函数,它是以matplotlib包为基础封装,所以两者能够结合使用。
        image.png
    image.png
    用hist函数很方便的就绘制除出直方图。图表列出了薪资的分布,因为大部分薪资集中20k以下,为了更细的粒度。将直方图的宽距继续缩小。
image.png
image.png
    数据分析的一大思想是细分维度,现在观察不同城市、不同学历对薪资的影响。箱线图是最佳的观测方式。
image.png
image.png
    图表的标签出了问题,出现了白框,主要是图表默认用英文字体,而这里的都是中文,导致了冲突。所以需要改用matplotlib。
image.png
image.png
    boxplot是我们调用的箱线图函数,column选择箱线图的数值,by是选择分类变量,figsize是尺寸。从图上我们看到,北京的薪资高于其他城市,尤其是中位数。上海和深圳稍次,广州甚至不如杭州。
    修改分类变量为education,得到学历对薪资的影响箱线图。
image.png
        image.png

    上述两个研究均为单一的变量的分析,现在想知道北京和上海这两座城市,学历对薪资的影响。
image.png
image.png
    在by传递多个值,箱线图的刻度自动变成元组,也就达到了横向对比的作用。在pandas中,需要同时用到多个维度分析时,可以用groupby函数。它和SQL中的group by差不多,能将不同变量分组。
image.png
image.png

    上图是标准的用法,按city列,针对不同城市进行了分组。不过它并没有返回分组后的结果,只返回了内存地址。这时它只是一个对象,没有进行任何的计算,现在调用groupby的count方法。
image.png
image.png
    它返回的是不同城市的各列计数结果,因为没有NaN,每列结果都是相等的。现在它和value_counts等价。
      image.png
                image.png
    换成mean,计算出了不同城市的平均薪资。因为mean方法只针对数值,而各列中只有aveSalary是数值,于是返回了这个唯一结果。
image.png
     image.png

    groupby可以传递一组列表,这时得到一组层次化的Series。按城市和学历分组计算了平均薪资。
image.png
image.png

    后面再调用unstack方法,进行行列转置,这样看的就更清楚了。在不同城市中,博士学历最高的薪资在深圳,硕士学历最高的薪资在杭州。北京综合薪资最好。
image.png
  image.png)

    这次换成count,我们在groupby后面加一个avgSalary,说明只统计avgSalary的计数结果,不用混入相同数据。图上的结果很明确了,要求博士学历的岗位只有6个,所谓的平均薪资,也只取决于公司开出的价码,波动性很强,毕竟这只是招聘薪资,不代表真实的博士在职薪资。这也解释了上面几个图表的异常。
    接下来计算不同公司招聘的数据分析师数量,并且计算平均数。
image.png
image.png
    这里使用了agg函数,同时传入count和mean方法,然后返回了不同公司的计数和平均值两个结果。所以前文的mean,count,其实都省略了agg。agg除了系统自带的几个函数,它也支持自定义函数。
image.png
      image.png
    上图用lambda函数,返回了不同公司中最高薪资和最低薪资的差值。agg是一个很方便的函数,它能针对分组后的列数据进行丰富多彩的计算。但是在pandas的分组计算中,它也不是最灵活的函数。
    下面想计算出不同城市,招聘数据分析师需求前5的公司,agg虽然能返回计数也能排序,但它返回的是所有结果,前五还需要手工计算。所以我们使用apply进行操作。
image.png
         image.png

    自定义了函数topN,将传入的数据计数,并且从大到小返回前五的数据。然后以city聚合分组,因为求的是前5的公司,所以对companyShortName调用topN函数。
    同样的,想知道不同城市,各职位招聘数前五,也能直接调用topN。
image.png
     image.png
    agg和apply是不同的,虽然某些方法相近,比如求sum,count等,但是apply支持更细的粒度,它能按组进行复杂运算,将数据拆分合并,而agg则必须固定为列。
    运用group by,我们已经能随意组合不同维度。接下来配合group by作图。
image.png
image.png

    多重聚合在作图上面没有太大差异,行列数据转置不要混淆即可。
image.png
image.png
    上述的图例我们都是用pandas封装过的方法作图,如果要进行更自由的可视化,直接调用matplotlib的函数会比较好,它和pandas及numpy是兼容的。plt已经在上文中调用并且命名。
image.png
image.png

    上图将上海和北京的薪资数据以直方图的形式进行对比。因为北京和上海的分析师人数相差较远,所以无法直接对比,需要用destiny参数转化为密度。设置alpha透明度,它比箱线图更直观。
    另外一种分析思路是对数据进行深加工。我们将薪资设立出不同的level。
image.png
           image.png

    cut的作用是分桶,它也是数据分析常用的一种方法,将不同数据划分出不同等级,也就是将数值型数据加工成分类数据,在机器学习的特征工程中应用比较多。
image.png
image.png
    用lambda转换百分比,然后作堆积百分比柱形图(matplotlib好像没有直接调用的函数)。这里可以较为清晰的看到不同等级在不同地区的薪资占比。它比箱线图和直方图的好处在于,通过人工划分,具备业务含义。0~3是实习生的价位,3~6是刚毕业没有基础的新人,整理数据那种,6~10是有一定基础的,以此类推。
    下面统计组标签一列的数据。
   image.png
image.png
    str方法允许我们针对列中的元素,进行字符串相关的处理,这里的[1:-1]不再是DataFrame和Series的切片,而是对字符串截取,这里把[]都截取掉了。如果漏了str,就变成选取Series第二行至最后一行的数据。
image.png
image.png
    使用完str后,它返回的仍旧是Series,当我们想要再次用replace去除空格。还是需要添加str的。
    positionLables本身有空值,所以要删除,不然容易报错。再次用str.split方法,把元素中的标签按「,」拆分成列表。
image.png
image.png
    通过apply和value_counts函数统计标签数。因为各行元素已经转换成了列表,所以value_counts会逐行计算列表中的标签,apply函数将value_counts应用在行上,最后将结果组成一张新表。
image.png
           image.png

    用unstack完成行列转换,看上去有点怪,因为它是统计所有标签在各个职位的出现次数,绝大多数肯定是NaN。
image.png         image.png

    将空值删除,并且重置为DataFrame,此时level_0为标签名,level_1为df_index的索引,也可以认为它对应着一个职位,0是该标签在职位中出现的次数。部分职位的标签可能出现多次,这里忽略它。reset_index可以还原索引,重新变为默认的整型索引。
    最后用groupby计算出标签出现的次数。
image.png
          image.png

    清洗掉引号,设置词云相关的参数。因为在jupyter中显示图片,所以需要额外的配置figsize,不然wide和height的配置无效。wordcloud也兼容pandas,所以直接将结果传入,然后显示图片,去除坐标。
image.png
image.png

阅读 184

旨在汇集大数据、人工智能行业领域精英,开放数据资源,营造数据创新环境,孵化数字产业创业团队,激活...

1 声望
0 粉丝
0 条评论
你知道吗?

旨在汇集大数据、人工智能行业领域精英,开放数据资源,营造数据创新环境,孵化数字产业创业团队,激活...

1 声望
0 粉丝
宣传栏