数据分析岗位需求分析报告
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()
阅读更多
- 生成分析报告,移除定时任务,删除历史数据
- 拉勾网大数据相关岗位数据爬虫分析
- 帆软出品: 7点搞定制药企业数据分析系统开发需求
- 机房收费系统 需求分析报告
- 【大数据干货】轻松处理每天2TB的日志数据,支撑运营团队进行大数据分析挖掘,随时洞察用户个性化需求。
- 2015年最热门编程语言岗位需求及薪资分析
- BDP个人版产品体验报告:在线数据分析使用心得
- 怎么做项目需求分析报告
- Python交互式数据分析报告框架:Dash
- Python爬虫——Python 岗位分析报告
- 淘宝数据分析之数据分析工具的三个需求层次
- 数据仓库项目需求分析
- 2015年8月数据安全漏洞分析报告
- 2015年最热门编程语言岗位需求及薪资分析
- 教学管理系统需求分析报告
- 数据分析系列剧第四集:行业研究报告与生产计划
- 游戏充值数据分析报告
- 需求分析报告
- 大数据发展及岗位分析
- (网站项目篇)网站整合需求分析报告