如何七周成为数据分析师22:用pandas进行数据分析实战

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

本文是《 如何七周成为数据分析师 》的第二十二篇教程,如果想要了解写作初衷,可以先行阅读七周指南。温馨提示:如果您已经熟悉Python,大可不必再看这篇文章,或只挑选部分。

如何七周成为数据分析师22:用pandas进行数据分析实战

大家学习Python,不练习怎么行?

这次依旧使用网络抓取的数据分析师的招聘薪资作为练习数据。在早期我们已经用它进行了Excel、BI可视化、SQL三方面的实战训练,想必大家已经很熟悉了,我不再赘述。

主要内容是进行数据读取,数据概述,数据清洗和整理,分析和可视化。按照本教程,相信大家的Pandas会上到一个新台阶,遇到文中没有提及的错误,通过搜索引擎解决吧。

如何七周成为数据分析师22:用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中最好转换成英文。

上述是主要的参数,其他参数有兴趣可以学习。一般来说,csv的数据都是干净的,excel文件则有合并单元格这种恶心的玩意,尽量避免。

现在有了数据df,首先对数据进行快速的浏览。

如何七周成为数据分析师22:用pandas进行数据分析实战

这里列举出了数据集拥有的各类字段,一共有6876个,其中companyLabelList,businessZones,secondType,positionLables都存在为空的情况。公司id和职位id为数字,其他都是字符串。

如何七周成为数据分析师22:用pandas进行数据分析实战

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

如何七周成为数据分析师22:用pandas进行数据分析实战

数据集中,最主要的脏数据是薪资这块,后续我们要拆成单独的两列。

看一下是否有重复的数据。

如何七周成为数据分析师22:用pandas进行数据分析实战

unique函数可以返回唯一值,数据集中positionId是职位ID,值唯一。配合len函数计算出唯一值共有5031个,说明有多出来的重复值。

使用drop_duplicates清洗掉。

如何七周成为数据分析师22:用pandas进行数据分析实战

drop_duplicates函数通过subset参数选择以哪个列为去重基准。keep参数则是保留方式,first是保留第一个,删除后余重复值,last还是删除前面,保留最后一个。duplicated函数功能类似,但它返回的是布尔值。

接下来加工salary薪资字段。目的是计算出薪资下限以及薪资上限。

如何七周成为数据分析师22:用pandas进行数据分析实战

薪资内容没有特殊的规律,既有小写k,也有大小K,还有「k以上」这种蛋疼的用法,k以上只能上下限默认相同。

这里需要用到pandas中的apply。它可以针对DataFrame中的一行或者一行数据进行操作,允许使用自定义函数。

如何七周成为数据分析师22:用pandas进行数据分析实战

我们定义了个word_cut函数,它查找「-」符号所在的位置,并且截取薪资范围开头至K之间的数字,也就是我们想要的薪资上限。apply将word_cut函数应用在salary列的所有行。

「k以上」这类脏数据怎么办呢?find函数会返回-1,如果按照原来的方式截取,是word[:-2],不是我们想要的结果,所以需要加一个if判断。

如何七周成为数据分析师22:用pandas进行数据分析实战

因为python大小写敏感,我们用upper函数将k都转换为K,然后以K作为截取。这里不建议用「以上」,因为有部分脏数据不包含这两字。

如何七周成为数据分析师22:用pandas进行数据分析实战

将bottomSalary转换为数字,如果转换成功,说明所有的薪资数字都成功截取了。

薪资上限topSalary的思路也相近,只是变成截取后半部分。

如何七周成为数据分析师22:用pandas进行数据分析实战

在word_cout函数增加了新的参数用以判断返回bottom还是top。apply中,参数是添加在函数后面,而不是里面的。这点需要注意。

接下来求解平均薪资。

如何七周成为数据分析师22:用pandas进行数据分析实战

数据类型转换为数字,这里引入新的知识点,匿名函数lamba。很多时候我们并不需要复杂地使用def定义函数,而用lamdba作为一次性函数。

lambda x: ******* ,前面的lambda x:理解为输入,后面的星号区域则是针对输入的x进行运算。案例中,因为同时对top和bottom求平均值,所以需要加上x.bottomSalary和x.topSalary。word_cut的apply是针对Series,现在则是DataFrame。

axis是apply中的参数,axis=1表示将函数用在行,axis=1则是列。

这里的lambda可以用(df_duplicates.bottomSalary + df_duplicates.topSalary)/2替代。

到此,数据清洗的部分完成。切选出我们想要的内容进行后续分析(大家可以选择更多数据)。

如何七周成为数据分析师22:用pandas进行数据分析实战

先对数据进行几个描述统计。

如何七周成为数据分析师22:用pandas进行数据分析实战

value_counts是计数,统计所有非零元素的个数,以降序的方式输出Series。数据中可以看到北京招募的数据分析师一骑绝尘。

我们可以依次分析数据分析师的学历要求,工作年限要求等。

针对数据分析师的薪资,我们用describe函数。

如何七周成为数据分析师22:用pandas进行数据分析实战

它能快速生成各类统计指标。数据分析师的薪资的平均数是17k,中位数是15k,两者相差不大,最大薪资在75k,应该是数据科学家或者数据分析总监档位的水平。标准差在8.99k,有一定的波动性,大部分分析师薪资在17+—9k之间。

一般分类数据用value_counts,数值数据用describe,这是最常用的两个统计函数。

说了这么多文字,还是不够直观,我们用图表说话。

pandas自带绘图函数,它是以matplotlib包为基础封装,所以两者能够结合使用。

如何七周成为数据分析师22:用pandas进行数据分析实战

%matplotlib inline是jupyter自带的方式,允许图表在cell中输出。plt.style.use(‘ggplot’)使用R语言中的ggplot2配色作为绘图风格,纯粹为了好看。

如何七周成为数据分析师22:用pandas进行数据分析实战

用hist函数很方便的就绘制除出直方图,比excel快多了。图表列出了数据分析师薪资的分布,因为大部分薪资集中20k以下,为了更细的粒度。将直方图的宽距继续缩小。

如何七周成为数据分析师22:用pandas进行数据分析实战

数据分布呈双峰状,因为原始数据来源于招聘网站的爬取,薪资很容易集中在某个区间,不是真实薪资的反应(10~20k的区间,以本文的计算公式,只会粗暴地落在15k,而非均匀分布)。

数据分析的一大思想是细分维度,现在观察不同城市、不同学历对薪资的影响。箱线图是最佳的观测方式。

如何七周成为数据分析师22:用pandas进行数据分析实战

图表的标签出了问题,出现了白框,主要是图表默认用英文字体,而这里的都是中文,导致了冲突。所以需要改用matplotlib。

如何七周成为数据分析师22:用pandas进行数据分析实战

首先加载字体管理包,设置一个载入中文字体的变量,不同系统的路径不一样。boxplot是我们调用的箱线图函数,column选择箱线图的数值,by是选择分类变量,figsize是尺寸。

ax.get_xticklabels获取坐标轴刻度,即无法正确显示城市名的白框,利用set_fontpeoperties更改字体。于是获得了我们想要的箱线图。改变字体还有其他方法,大家可以网上搜索关键字「matplotlib 中文字体」,都有相应教程。

从图上我们看到,北京的数据分析师薪资高于其他城市,尤其是中位数。上海和深圳稍次,广州甚至不如杭州。

如何七周成为数据分析师22:用pandas进行数据分析实战

从学历看,博士薪资遥遥领先,虽然在top区域不如本科和硕士,这点我们要后续分析。大专学历稍有弱势。

如何七周成为数据分析师22:用pandas进行数据分析实战

工作年限看,薪资的差距进一步拉大,毕业生和工作多年的不在一个梯度。虽然没有其他行业的数据对比,但是可以确定,数据分析师的职场上升路线还是挺光明的。

到目前为止,我们了解了城市、年限和学历对薪资的影响,但这些都是单一的变量,现在想知道北京和上海这两座城市,学历对薪资的影响。

如何七周成为数据分析师22:用pandas进行数据分析实战

在by传递多个值,箱线图的刻度自动变成元组,也就达到了横向对比的作用(这方法其实并不好,以后会讲解其他方式)。这种方法并不适宜元素过多的场景。从图上可以看到,不同学历背景下,北京都是稍优于上海的,北京愿意花费更多薪资吸引数据分析师,而在博士这个档次,也是一个大幅度的跨越。我们不妨寻找其中的原因。

在pandas中,需要同时用到多个维度分析时,可以用groupby函数。它和SQL中的group by差不多,能将不同变量分组。

如何七周成为数据分析师22:用pandas进行数据分析实战

上图是标准的用法,按city列,针对不同城市进行了分组。不过它并没有返回分组后的结果,只返回了内存地址。这时它只是一个对象,没有进行任何的计算,现在调用groupby的count方法。

如何七周成为数据分析师22:用pandas进行数据分析实战

它返回的是不同城市的各列计数结果,因为没有NaN,每列结果都是相等的。现在它和value_counts等价。

如何七周成为数据分析师22:用pandas进行数据分析实战

换成mean,计算出了不同城市的平均薪资。因为mean方法只针对数值,而各列中只有avgSalary是数值,于是返回了这个唯一结果。

如何七周成为数据分析师22:用pandas进行数据分析实战

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

如何七周成为数据分析师22:用pandas进行数据分析实战

后面再调用unstack方法,进行行列转置,这样看的就更清楚了。在不同城市中,博士学历最高的薪资在深圳,硕士学历最高的薪资在杭州。北京综合薪资最好。这个分析结论有没有问题呢?不妨先看招聘人数。

如何七周成为数据分析师22:用pandas进行数据分析实战

这次换成count,我们在groupby后面加一个avgSalary,说明只统计avgSalary的计数结果,不用混入相同数据。图上的结果很明确了,要求博士学历的岗位只有6个,所谓的平均薪资,也只取决于公司开出的价码,波动性很强,毕竟这只是招聘薪资,不代表真实的博士在职薪资。这也解释了上面几个图表的异常。

groupby是不是和数据透视表比较像?pandas其实有专门的数据透视函数,在另外一方面,groupby确实能完成不少透视工作。

接下来计算不同公司招聘的数据分析师数量,并且计算平均数。

如何七周成为数据分析师22:用pandas进行数据分析实战

这里使用了agg函数,同时传入count和mean方法,然后返回了不同公司的计数和平均值两个结果。所以前文的mean,count,其实都省略了agg。agg除了系统自带的几个函数,它也支持自定义函数。

如何七周成为数据分析师22:用pandas进行数据分析实战

 

上图用lamba函数,返回了不同公司中最高薪资和最低薪资的差值。agg是一个很方便的函数,它能针对分组后的列数据进行丰富多彩的计算。但是在pandas的分组计算中,它也不是最灵活的函数。

现在我们有一个新的问题,我想计算出不同城市,招聘数据分析师需求前5的公司,应该如何处理?agg虽然能返回计数也能排序,但它返回的是所有结果,前五还需要手工计算。能不能直接返回前五结果?当然可以,这里再次请出apply。

如何七周成为数据分析师22:用pandas进行数据分析实战

自定义了函数topN,将传入的数据计数,并且从大到小返回前五的数据。然后以city聚合分组,因为求的是前5的公司,所以对companyShortName调用topN函数。

同样的,如果我想知道不同城市,各职位招聘数前五,也能直接调用topN。

如何七周成为数据分析师22:用pandas进行数据分析实战

可以看到,虽说是数据分析师,其实有不少的开发工程师,数据产品经理等。这是抓取下来数据的缺点,它反应的是不止是数据分析师,而是数据领域。不同城市的需求不一样,北京的数据产品经理看上去要比上海高。

agg和apply是不同的,虽然某些方法相近,比如求sum,count等,但是apply支持更细的粒度,它能按组进行复杂运算,将数据拆分合并,而agg则必须固定为列。

运用group by,我们已经能随意组合不同维度。接下来配合group by作图。

如何七周成为数据分析师22:用pandas进行数据分析实战

多重聚合在作图上面没有太大差异,行列数据转置不要混淆即可。

如何七周成为数据分析师22:用pandas进行数据分析实战

上述的图例我们都是用pandas封装过的方法作图,如果要进行更自由的可视化,直接调用matplotlib的函数会比较好,它和pandas及numpy是兼容的。plt已经在上文中调用并且命名

如何七周成为数据分析师22:用pandas进行数据分析实战

上图将上海和北京的薪资数据以直方图的形式进行对比。因为北京和上海的分析师人数相差较远,所以无法直接对比,需要用normed参数转化为密度。设置alpha透明度,它比箱线图更直观。

另外一种分析思路是对数据进行深加工。我们将薪资设立出不同的level

如何七周成为数据分析师22:用pandas进行数据分析实战

cut的作用是分桶,它也是数据分析常用的一种方法,将不同数据划分出不同等级,也就是将数值型数据加工成分类数据,在机器学习的特征工程中应用比较多。cut可以等距划分,传入一个数字就好。这里为了更好的区分,我传入了一组列表进行人工划分,加工成相应的标签。

如何七周成为数据分析师22:用pandas进行数据分析实战

用lambda转换百分比,然后作堆积百分比柱形图(matplotlib好像没有直接调用的函数)。这里可以较为清晰的看到不同等级在不同地区的薪资占比。它比箱线图和直方图的好处在于,通过人工划分,具备业务含义。0~3是实习生的价位,3~6是刚毕业没有基础的新人,整理数据那种,6~10是有一定基础的,以此类推。

现在只剩下最后一列数据没有处理,标签数据。

如何七周成为数据分析师22:用pandas进行数据分析实战

现在的目的是统计数据分析师的标签。它只是看上去干净的数据,元素中的[]是无意义的,它是字符串的一部分,和数组没有关系。

你可能会想到用replace这类函数。但是它并不能直接使用。df_clean.positionLables.replace会报错,为什么呢?因为df_clean.positionLables是Series,并不能直接套用replace。apply是一个好方法,但是比较麻烦。

这里需要str方法。

如何七周成为数据分析师22:用pandas进行数据分析实战

str方法允许我们针对列中的元素,进行字符串相关的处理,这里的[1:-1]不再是DataFrame和Series的切片,而是对字符串截取,这里把[]都截取掉了。如果漏了str,就变成选取Series第二行至最后一行的数据,切记。

如何七周成为数据分析师22:用pandas进行数据分析实战

使用完str后,它返回的仍旧是Series,当我们想要再次用replace去除空格。还是需要添加str的。现在的数据已经干净不少。

positionLables本身有空值,所以要删除,不然容易报错。再次用str.split方法,把元素中的标签按「,」拆分成列表。

如何七周成为数据分析师22:用pandas进行数据分析实战

这里是重点,通过apply和value_counts函数统计标签数。因为各行元素已经转换成了列表,所以value_counts会逐行计算列表中的标签,apply的灵活性就在于此,它将value_counts应用在行上,最后将结果组成一张新表。

这里的运算速度会有点慢,别担心

如何七周成为数据分析师22:用pandas进行数据分析实战

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

如何七周成为数据分析师22:用pandas进行数据分析实战

将空值删除,并且重置为DataFrame,此时level_0为标签名,level_1为df_index的索引,也可以认为它对应着一个职位,0是该标签在职位中出现的次数,之前我没有命名,所以才会显示0。部分职位的标签可能出现多次,这里忽略它。

如何七周成为数据分析师22:用pandas进行数据分析实战

最后用groupby计算出标签出现的次数。到这里,已经计算出我们想要的结果。除了这种方法,也可以使用for循环,大家可以试着练习一下,效率会慢不少。这种写法的缺点是占用内存较大,拿空间换时间,具体取舍看大家了。

如何七周成为数据分析师22:用pandas进行数据分析实战

加载wordcloud,anaconda没有,自行下载吧。清洗掉引号,设置词云相关的参数。因为我是在jupyter中显示图片,所以需要额外的配置figsize,不然wide和height的配置无效。wordcloud也兼容pandas,所以直接将结果传入,然后显示图片,去除坐标。大功告成。

把最后结果的图片右键另存为,发到朋友圈纪念一下吧,哈哈哈哈。

如果大家不妨花些时间做下面的练习:

  • 不同职位的词云图有没有差异?
  • 不同薪资不同年限,他们岗位的标签词云会不会有差异?
  • 不同薪资等级,和工作年限、职位的关系是怎么样的?
  • 以上的代码,有没有更优化的实现方式?
  • 薪资的上下限拆分,能不能用lambda方法?

到目前为止,我们进行的分析均是利用多维和可视化,多练习也就掌握了。其实它和excel没有多大区别,只是python能够更快地应付更多更复杂的数据,当然新人在开始的效率不会高。

因为时间关系,更多的函数留到下次课程,下次课程也是最后一次了。

相关阅读

互联网数据分析能力的养成,需一份七周的提纲

如何七周成为数据分析师01:常见的Excel函数全部涵盖在这里了

如何七周成为数据分析师02:Excel技巧大揭秘

如何七周成为数据分析师03:手把手教你Excel实战

如何七周成为数据分析师:Excel技巧之甘特图绘制(项目管理)

如何七周成为数据分析师:Excel技巧之打造多级菜单

如何七周成为数据分析师04:数据可视化之经典图表合集

如何七周成为数据分析师05:数据可视化之打造升职加薪的报表

如何七周成为数据分析师06:数据可视化之手把手打造BI

如何七周成为数据分析师07:快速掌握麦肯锡的分析思维

如何七周成为数据分析师08:如何建立数据分析的思维框架?

如何七周成为数据分析师09:写给新人的数据库指南

如何七周成为数据分析师10:SQL,从入门到熟练

如何七周成为数据分析师11:SQL,从熟练到掌握

如何七周成为数据分析师12:解锁数据分析的正确姿势(上)

如何七周成为数据分析师13:解锁数据分析的正确姿势(下)

如何七周成为数据分析师14:概率论的入门指南

如何七周成为数据分析师15:读了本文,你就懂了概率分布

如何七周成为数据分析师16:数据分析必须懂的假设检验

如何七周成为数据分析师17:最全的运营数据指标解读

如何七周成为数据分析师18:Python的新手教程

如何七周成为数据分析师19:Python的数据结构

如何七周成为数据分析师20:了解和掌握Python的函数

如何七周成为数据分析师21:Python分析之numpy和pandas入门

#专栏作家#

秦路,微信公众号ID:tracykanc,人人都是产品经理专栏作家。

本文由 @秦路 原创发布于人人都是产品经理。未经许可,禁止转载。

随意打赏

快速成为数据分析师如何成为数据分析师七周成为数据分析师什么是数据分析数据分析师招聘如何成为分析师数据分析软件大数据分析师数据分析师
提交建议
微信扫一扫,分享给好友吧。