您的位置:首页 > 其它

数据分析岗位需求分析报告

2018-09-05 18:09 169 查看

1.前言

2.用到的工具

3.网页结构分析

4.数据预处理

5.数据分析岗位分布情况

5.1公司的城市分布

5.2公司的融资情况 

5.3岗位福利状况 

​ 6.数据分析岗位的发展状况

6.1各城市平均薪资待遇

6.2不同融资阶段平均工资待遇

7.数据分析师岗位招聘要求

7.1统计量描述 

7.2学历与职位需求

7.3学历水平与工资

7.4工作经验与职位需求

7.5工作经验与工资

8.附录(详细代码):

8.1数据特征部分代码

8.2数据预处理部分代码 

8.3绘制词云图

8.4数据分析岗位要求部分代码

8.5拉勾网数据爬取部分代码

1.前言

"大数据",这个字眼是近几年比较火的一个名词,数据的价值正在各行各业发挥着越来越大的价值,销售行业通过销售数据的分析,对客户行为的画像(给客户贴标签),指定相应的销售策略提高销售业绩;以淘宝、京东商城等为代表的电商平台通过客户的购买行为,自动推荐符合客户"需求"的产品;以信贷公司、银行业等为主的金融公司通过分析客户的信用评估,对客户进行分级"打分",优先放款给"优质客户",等等。似乎,正在以一种偶像般的存在,影响着每一个人、每一个行业,鼓动着每一个"蠢蠢欲动"的人。然而,大多数的时候这个名词都被人误解或者过分渲染了。"管它黑猫白猫,能抓住老鼠的都是好猫",换句话说:管它是大数据还是一般数据,能支持经营管理决策的都是好数据。所以,从企业自身而言,首要任务是充分利用自身数据,推动经营决策。而对于个人,应该充分结合实际情况,认真做好自己的职业规划,而不是盲目跟风。结合自身的优势,忠于企业和个人,尽最大限度的发挥自身价值为企业和社会贡献出自己的一份力量。

本文笔者以一名正在转行路上的身份,爬取了拉勾网数据分析职位的前100页,共计1500条的招聘信息,通过数据挖掘,统计建模等方法,对数据分析职位特点及现状做一个分析。

2.用到的工具

Spyder3.6

requests: 下载网页

pandas:数据分析库

numpy:数组操作

matplotlib:绘图

wordcloud、jieba:生成中文词云

rcParams:使绘图能显示中文字体

3.网页结构分析

打开搜狗高速浏览器,在拉勾网首页搜索的“数据分析”职位,鼠标右击查看网页源文件,通过搜索相关关键字可以发现, 职位信息并不在源代码里。进一步抓包分析,点击审查元素(快捷键F12),可以发现职位信息隐藏于JSON的文件里,结合数据格式,我们选择用字典方法直接读取数据。


运行程序得到如下数据:(代码见附录)
因为文件是csv格式文件,建议用notepad或者WPS打开(直接用office Excel不支持会出现乱码)

4.数据预处理

为了保证后续分析的正常进行,需要对数据进行预处理。观看数据可以得出如下操作步骤:
(1).数据分析职位中可能存在"实习生岗位",需要对其进行剔除。
(2).表中的"工作经验"属于范围值,在此对其进行平均化处理。
(3).表中的"工资"也属于范围,在此也对其进行平均化处理,取中间值。
(4).删除冗余列,保存到新的表格。
处理后得到如下数据表:(代码见附录)

5.数据分析岗位分布情况

5.1公司的城市分布

由下图可以看出:北京数据分析师岗位需求占据了47.2%,上海地区21.9%,杭州地区9.6%,深圳地区8.6%,广州地区,南京地区等地区的岗位需=需求量紧随其后,基本上主要集中在一线城市和强二线城市中。


5.2公司的融资情况 

下图中可以看出,在招聘公司中:不需要融资的公司、上市公司、C轮融资阶段的公司对数据分析师的岗位需求量最大,A轮、D轮、B轮、未融资等阶段的公司紧随其后。说明发展相对成熟,稳健的公司有更大可能性需要数据分析岗位的人才。

5.3岗位福利状况 

针对爬取的拉勾网数据的职位福利,,进行jieba分词,并制作词云。出现频率最高的依次是:弹性工作、发展空间、氛围、工资等,从图中词频的频率可以看出,招聘岗位更注重职位的发展与员工的体验,其次是工资水平与各类奖金。

 
6.数据分析岗位的发展状况

6.1各城市平均薪资待遇

从图中可以看出各城市平均工资最高的是北京20.1469,其次上海、杭州、深圳、广州、南京、紧随其后,其中长春的平均工资值得商榷,因为从上数据分析师岗位需求上来看,长春的数据分析师需求量非常小。在此处作为异常值处理。

6.2不同融资阶段平均工资待遇

由下图可以看出,不同融资阶段公司对数据分析师给出的平均薪资略有不同,D轮、C轮、B轮、上市公司平均工资相对较大y一些。

7.数据分析师岗位招聘要求

7.1统计量描述 

count    1469.000000
mean        3.167461
std         1.909803
min         0.000000
25%         2.000000
50%         4.000000
75%         4.000000
max         7.500000
工作年限平均值为3.167年,中位数是4年,大致可以说明企业要求有一定工作经验的占据多数。
mean       17.497958
std         8.431887
min         1.500000
25%        11.500000
50%        15.000000
75%        22.500000
max        80.000000
平均工作为8.431k,中位数为15k,大致可以看出,地区间存在两级分化比较严重,岗位偏集中,工资偏两极。下面作进一步分析。

7.2学历与职位需求

由下图比例可以看出,招聘单位85.7%要求入门是本科学历,本科学历数据分析岗市场需求量第一,大专学历7.3%排名第二,相应的硕士学历反而要求不高。也从间接的方面看出,公司可能更看重数据分析的经验能力。

7.3学历水平与工资

可以看出,数据分析师岗位学历水平与平均薪资成正比关系,学历越高,工资越高,硕士工资20k左右,本科平均工资17.5k左右,相差不大,但是大专学历平均工资却只有10k左右。差距较为明显。平时好好学习还是有一定好处的(哈哈)。

7.4工作经验与职位需求

表中可以看出工作经验与职位需求成正比关系。3-5年和1-3年的数据分析师岗位需求量最大,前者占比43.6%,后者占比35.1%,说明数据分析岗位更看重数据分析经验。企业所需培养的成本相对较小,所以企业更愿意招揽此类人才。相对应的,经验过少和5-10年的工作者是两个极端,无工作经验或者1年以下的求职者培养起来需要更大的成本。后者则需要更大的招聘成本。

 

7.5工作经验与工资

由下图可看出:工作经验与平均工资水平成正比,相关工作年限越长,平均工资也越高。

 

8.附录(详细代码):

8.1数据特征部分代码

[code]import pandas as pd
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8')  #读取数据,编码处理
#1.统计量描述
fb=df['经验'].describe()
fb2=df['平均工资'].describe()
print(fb,fb2)  #输出统计量
plt.rcParams['font.sans-serif']=['SimHri']  #用来正常显示中文标签
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] ## 指定默认字体:解决plot不能显示中文问题
#2.绘制城市分布的饼图(取前10)
count = df['城市'].value_counts()
count=count[0:10]       #取序列前10的城市绘制饼图
plt.pie(count, labels = count.keys() ,labeldistance=1.4,autopct='%2.1f%%')
plt.axis('equal')  # 使饼图为正圆形
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))  #添加图例,并设置图例位置
plt.savefig('location.jpg')
plt.show()
#2.绘制城市分布的柱状图,柱状图绘制前15名
count1 = df['城市'].value_counts()
count1=count1[0:15]       #取序列前15的城市绘制柱状图
plt.bar(count1.keys(),count1)
plt.savefig('城市柱状图15名.jpg')
plt.show()
#3.绘制融资阶段柱状图
count2 = df['融资阶段'].value_counts()
plt.bar(count2.keys(),count2)
plt.savefig('融资阶段分布.jpg')
plt.show()
#4.绘制学历与职位需求的关系
count3 = df['学历要求'].value_counts()
plt.pie(count3, labels = count3.keys() ,labeldistance=1.4,autopct='%2.1f%%')
plt.axis('equal')  # 使饼图压缩为正圆形
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))  #添加图例,并设置图例位置
plt.savefig('学历与职位需求关系.jpg')
plt.show()
#5.绘制工作经验与职位需求的柱状图
count4 = df['工作经验'].value_counts()
plt.bar(count4.keys(),count4)
plt.savefig('工作经验与职位需求.jpg')
plt.show()

8.2数据预处理部分代码 

[code]#数据预处理
import pandas as pd
# 读取数据
df = pd.read_csv('D:/baogao/lagou_data.csv', encoding = 'utf-8')
# 数据清洗,剔除实习岗位
df.drop(df[df['职位名称'].str.contains('实习')].index, inplace=True)
# 正则表达式将csv文件字符串转化为列表,再取区间的均值
pattern = '\d+'
df['工作年限'] = df['工作经验'].str.findall(pattern)
avg_work_year = []
for i in df['工作年限']:
# 如果工作经验为'不限'或'应届毕业生',那么匹配值为空,工作年限为0
if len(i) == 0:
avg_work_year.append(0)
# 如果匹配值为一个数值,那么返回该数值
elif len(i) == 1:
avg_work_year.append(int(''.join(i)))
# 如果匹配值为一个区间,那么取平均值
else:
num_list = [int(j) for j in i]
avg_year = sum(num_list)/2
avg_work_year.append(avg_year)
df['经验'] = avg_work_year
df=df.drop('工作年限',1)  #删除工作年限数据列(冗余数据)
df['salary'] = df['工资'].str.findall(pattern)  #字符串转化为列表,取区间平均值作为薪资
avg_salary = []
for k in df['salary']:
int_list = [int(n) for n in k]
avg_wage = (int_list[1]+int_list[0])/2
avg_salary.append(avg_wage)
df['平均工资']=avg_salary
df= df.drop('salary',1) #删除salary数据列(冗余数据)
df= df.drop('工资',1)  ##删除工资数据列(冗余数据)
# 将清洗后的数据保存,以便后续使用
df.to_csv('lagou_data2.csv', index = False)

8.3绘制词云图

[code]#绘制词云图
import  numpy as np
from  PIL import  Image
import  jieba
from wordcloud import  WordCloud,ImageColorGenerator,STOPWORDS
import  matplotlib.pyplot as plt
df = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8')  #读取数据并编码处理
text = ''
for line in df['职位福利']:
text += line  #使用jieba模块将字符串分割为单词列表
f=open("D:/baogao/职位福利.txt","a+")       #以追加的方式创建一个文本文件
f.write(text)    #写人职位福利文本内容
f.write("\n")   # 写完通过\n进行换行
f.close()     #关闭文档
from random import randint
#封装改变颜色函数
def random_color_func(word=None, font_size=None, position=None,  orientation=None, font_path=None, random_state=None):
h  = randint(120,250)
s = int(100.0 * 255.0 / 255.0)
l = int(100.0 * float(randint(60, 120)) / 255.0)
return "hsl({}, {}%, {}%)".format(h, s, l)
#用一张图片作为词云的模板
maskcolud=np.array(Image.open(r"D:/baogao/0.jpg"))
#打开要生成词云的文字文件的位置
nedcloudpath=open("D:/baogao/职位福利.txt","rb").read()
#打开之后用jieba切割
jiebapath=jieba.cut(nedcloudpath,cut_all=True)
#以空格为分割
jiebapathsplit=" ".join(jiebapath)
#设置词云对应属性
produCloud=WordCloud(
width=300,
height=300,
background_color="white",
mask=maskcolud,
font_path='C:\windows\Fonts\STZHONGS.TTF',
max_words=200,
stopwords=STOPWORDS,
max_font_size=60,
random_state=50,
scale=0.5,
color_func=random_color_func
).generate(jiebapathsplit)
ImageColorGenerator(maskcolud)
#对词云进行显示
produCloud.to_file('ciyu.jpg')
plt.imshow(produCloud)
plt.axis("off")
plt.show()

8.4数据分析岗位要求部分代码

[code]#薪酬影响因素分析
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
df1 = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8')  #原来的gbk不能用!!!
c1=df1['城市'].count()
#1.计算学历水平与工资关系,绘制柱状图
df2=df.groupby('学历要求')['平均工资'].agg([np.mean])  #agg函数分组统计
count3=pd.Series(df2['mean'],df2.index) #将dataframe数据库转化为序列series
count3=count3.sort_values(ascending=False)  #降序排列
plt.title("学历水平与平均薪资")
plt.xlabel("学历水平")
plt.ylabel("平均工资")
plt.bar(count3.keys(),count3)
plt.savefig('学历与工资关系.jpg')  #保存为图片
plt.show()
#2.计算工作经验与平均工资关系
df3=df.groupby('工作经验')['平均工资'].agg([np.mean])
count5=pd.Series(df3['mean'],df3.index) #将dataframe数据框转化为序列series
count5=count5.sort_values(ascending=False)
plt.title("工作经验与平均薪资")
plt.xlabel("工作经验")
plt.ylabel("平均工资")
plt.bar(count5.keys(),count5)
plt.savefig('工作经验与平均工资关系.jpg')
plt.show()
#3.计算不同融资阶段的工资水平
df4=df.groupby('融资阶段')['平均工资'].agg([np.mean])
count6=pd.Series(df4['mean'],df4.index) #将dataframe转化为序列
count6=count6.sort_values(ascending=False)
plt.title("融资阶段与平均薪资")
plt.xlabel("融资阶段")
plt.ylabel("平均工资")
plt.bar(count6.keys(),count6)
plt.savefig('融资阶段与工资关系.jpg')
plt.show()
#4.计算不同城市平均工资分布状况
df5=df.groupby('城市')['平均工资'].agg([np.mean])
count7=pd.Series(df5['mean'],df5.index) #将dataframe转化为序列
count7=count7.sort_values(ascending=False)
count7=count7[0:15]  #取排名前15位
plt.title("不同城市薪资")
plt.xlabel("城市")
plt.ylabel("平均工资")
plt.bar(count7.keys(),count7)
plt.savefig('不同城市与工资关系.jpg')
plt.show()

8.5拉勾网数据爬取部分代码

[code]#拉勾网全国前100页数据分析师招聘数据爬取
import requests
import math
import pandas as pd
import time
def get_json(url,num):
my_headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36',
'Host': 'www.lagou.com',
'Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?px=default&city=%E5%85%A8%E5%9B%BD',
'X-Anit-Forge-Code': '0',
'X-Anit-Forge-Token': 'None',
'X-Requested-With': 'XMLHttpRequest'
}
my_data = {
'first': 'true',
'pn':num,
'kd':'数据分析'}
res = requests.post(url, headers = my_headers, data = my_data)
res.raise_for_status()
res.encoding = 'utf-8'
# 得到包含职位信息的字典
page = res.json()
return page
def get_page_num(count):
#计算要抓取的页数
# 每页15个职位,向上取整
res = math.ceil(count/15)  #得到大于或等于该数值的最小整数
# 拉勾网最多显示30页结果
if res > 100:
return 100
else:
return res
def get_page_info(jobs_list):
'''''对一个网页的职位信息进行解析,返回列表'''
page_info_list = []
for i in jobs_list:
job_info = []
job_info.append(i['city'])
job_info.append(i['companyFullName'])
job_info.append(i['companyShortName'])
job_info.append(i['companySize'])
job_info.append(i['financeStage'])
job_info.append(i['district'])
job_info.append(i['positionName'])
job_info.append(i['workYear'])
job_info.append(i['education'])
job_info.append(i['salary'])
job_info.append(i['positionAdvantage'])
page_info_list.append(job_info)
return page_info_list
#返回特定信息构建表格
def main():
url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false'
# 先设定页数为1,获取总的职位数
page_1 = get_json(url,1)
total_count = page_1['content']['positionResult']['totalCount']
num = get_page_num(total_count)
total_info = []
time.sleep(40)  #间隔40秒
print('职位总数:{},页数:{}'.format(total_count,num))
for n in range(1,num+1):
# 对每个网页读取JSON, 获取每页数据
page = get_json(url,n)
jobs_list = page['content']['positionResult']['result']
page_info = get_page_info(jobs_list)
total_info += page_info
print('已经抓取第{}页, 职位总数:{}'.format(n, len(total_info)))
# 每次抓取完成后,暂停一会,防止被服务器拉黑
time.sleep(40)
#将总数据转化为data frame再输出
df = pd.DataFrame(data = total_info,columns = ['城市','公司全名','公司简称','公司规模','融资阶段','区域','职位名称','工作经验','学历要求','工资','职位福利'])
df.to_csv('lagou_jobs.csv',index = False)
print('已保存为csv文件.')
if __name__== "__main__":
main()

 

 

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: