很多人学习python,都是从数据分析开始入门的,具体来说,就是使用pandas进行数据读取存储,数据概述,数据清洗和整理,分析和可视化。
今天我们通过一个经典的案例,从拉勾网上获取12840条招聘信息,分析互联网行业几个热门的招聘岗位的薪资水平。
新手入门可以通过下载样本数据,跟着本文教程一步一步练习,对学习pandas有非常大的帮助。样本下载请看文末。
1.载入样本数据
在pandas中,常用的函数是read_csv。样本也是以csv格式存储的。当然也有很多使用mongodb的。除此之外还有read_excel和read_table、read_sql,直接访问数据库,但它必须配合mysql相关包。甚至还可以直接当作爬虫工具的read_html
import pandas as pd
载入成功后,我们需要用info()函数对整个列表做整体的预览,包括行数,每个字段的类型。
image当然一开始也需要对每个字段显示的具体内容做一个了解,可以使用head()函数进行预览,默认显示前5行,也可以自定义显示多少行
df_new.head()
image
2.剔除重复项
通常爬虫获取到的数据,未清洗的情况下,有可能存在重复的情况,根据数据的不同情况及处理数据的不同需求,通常会分为两种情况,一种是去除完全重复的行数据,另一种是去除某几列重复的行数据,这里我们使用去除完全重复的即可。
df_new.drop_duplicates(inplace=True)
image
清洗之后得到12840条记录。
3.拆分薪资字段
先来处理最关心的工资部分,salary这个字段都是一个工资范围,比较好处理,把中间的‘-’ 号作为切割点,划分成两个字段,再剔除字母k,变成整数类型
这里使用pandas的apply函数,能够快速的将这一列的每一行都在函数中执行。
# 获取薪资下限
image
# 接下来是工资上限
这时候已经生成了新的两列出来,并且这两列的类型是整数的
image这里使用新的知识点,匿名函数lamba。不需要复杂地使用def定义函数,用lamdba即可一行代码作为一次性函数。
axis是apply中的参数,axis=1表示将函数用在行,axis=1则是列。
df_new['avg_salary'] = df_new.apply(lambda x:(x.low_salary + x.high_salary)/2, axis=1)
image
4.拆分公司详细信息、工作年限、教育背景信息
掌握了上面的方法,接下来的公司信息和工作年限教育背景的处理都是类似的。
df_new['com_type'] = df_new.apply(lambda x:x.com_info.split('/')[0].strip(), axis=1)
image
工作年限和教育背景的要求, 由于该字段存储到csv文件后,该字段从列表类型变成字符串,所以转化的时候比较特殊,函数内容比较复杂,新手建议使用apply函数。
df_new['year'] = df_new.apply(lambda x:x.year_edu.split(',')[2].split('/')[0].strip(), axis=1)
image
到这里基本数据处理完成,记得保存起来
df_new.to_csv('lagou_cleaned.csv',encoding='utf-8-sig')
5.数据分析
说明:样本数据由于受到拉钩的限制,部分职位即使数量超过450个,也只能获得450个,所以通过职位数量这个维度分析会有点问题,但影响不大,我们主要是分析不同维度对薪资水平的影响。
5.1 薪资概览
互联网行业的薪资水平比较高,我们先从整体上来看看这些职位的薪资分布:
import matplotlib.pyplot as plt
image
分布得不太均匀,不是标准的正态分布,由于这个平均薪资是通过区间计算过来的,所以会集中在某个数值,比如大部分薪资范围写着15-25k,那平均薪资就会集中在20k。
但从整体来看,薪资水平还是集中在10-20k这个区间,超过20k的也不少。也可以从整体的平均数来看:
df_new.describe()
image
它能快速生成各类统计指标。比如平均数是19.35k,中位数是185k,两者相差不大。标准差在8.84k,有一定的波动性,大部分薪资在19k上下8.8k之间。
在数据分析领域,观测数量分布还有一个常见的方法,就是分段法。我们使用cut将平均薪资划分几个区间,然后对比每个区间的数量,从另外一种图表,观测薪资水平。
bins = [0,5,10,15,20,25,30,40,100]
使用饼图:
import matplotlib.pyplot as plt
image
薪资区间都可以由我们自定义,这种方式是否更直观的查看薪资水平的分布呢?
5.2 岗位和城市概览
这里面主要的维度,岗位和城市有哪些,我们需要有个整体的认知,可以使用value_counts函数,把这两个字段的值的数量显示出来,方便观测:
部分岗位注解:qianduan:前端 changpinjingli1:产品经理
image image之前提到过收到限制,部分职位的数量获取有限,但也可以看出,Java在所有岗位中的数量处于领先,是互联网行业中岗位最多的。
5.3 不同岗位****的薪资水平
接下来是分析的重点,不同岗位的薪资水平差异,很明显C++处于最高水平,Java可能岗位太多,拉低了整体的水平。
df_new[df_new.avg_salary<70].boxplot(column='avg_salary', by='position',figsize=(9,9))
image
5.4 不同城市的薪资水平
箱线图在观察这类型的数据时,非常直观。在城市维度上,北京果然是独占鳌头,不出意外,最近几年来被人吐槽跌出一线城市的广州整体不如北上深杭了。
df_new[df_new.avg_salary<70].boxplot(column='avg_salary', by='city',figsize=(9,9))
image
经常做数据分析的同学,相信都离不开excel的透视表,pandas中同样有类似的功能,就是groupby函数,这里我们通过这个函数,来更直观地对比不同城市下不同岗位的平均薪资水平:
df_new.groupby(['city','position']).mean()['avg_salary'].unstack().plot.bar(figsize=(14,9))
image
5.5 不同学历的薪资水平
使用matplotlib 的时候,经常遇到图表中文显示的问题,这里时windows的处理方法,如果mac的可以上网搜索一下。
import matplotlib.pyplot as plt
image
互联网行业主要的招聘学历是本科,和硕士的薪资水平差异不大,甚至在高薪区域,本科甚至超过了硕士。但是专科的可能就有点吃亏了。
5.6 不同工作年限的薪资水平
df_new[df_new.avg_salary<70].boxplot(column='avg_salary', by='year',figsize=(9,9))
image
基本上随着工作年限的增长,薪资水平的增长还是稳步增长的,但是35岁危机确实存在。
今天就分享到这里,希望对想要做数据分析或者对互联网行业薪资水平感兴趣的朋友有所帮助。
如果需要样本数据,可以关注公众号:迷途小球迷 并在后台回复:招聘 即可获取。样本数据仅做学习用途,请勿做他用。
网友评论