项目背景:
在互联网技术不断升级的今天,数据获取变的越来越容易,大数据行业越来越火,基于海量数据进行分析的数据分析人才逐渐成为各大企业追逐的宠儿。大数据推动起数据的深度分析与挖掘,使得研究结果更加客观,并且多维。
本文将以数据分析的方式对这个行业展开研究,尽可能让正在从事或有兴趣想加入这个行业的小伙伴们对于当前大数据行业的就业环境有更深入的了解和认识。
项目流程:
1.数据获取:访问前程无忧官网,找出需用作数据分析的数据并进行获取;
2.数据预处理:对获取数据进行去重、缺失值处理等一系列数据清洗操作;
3.数据可视化:文文字不如数据,数据不如图片,可视化是对于数据最好的展现方式,让人一目了然;
4.深入分析:对于数据深入分析,寻找不同因素与薪资之间的关系。
项目实施:
Part one:数据获取
在搜索数据的时候,岗位关键词我选择的是数据分析师(图1-1),这是因为其他的岗位关键词匹配度过低,搜索结果包含大量无效数据,而数据分析师匹配度高。地点选择了全国,是因为我想分析全国不同城市对于数据分析师岗位的需求量以及薪资水平。
在爬取的时候,我选择从二级页面爬取,目的是为了获得更多的信息(图1-2),以便后续能从更多的维度进行分析。抓取维度为:公司名字、类型、规模、行业、地点、福利;职位信息(职责、学历、技能、经验、薪资)。
最后一共获取8076条数据(图1-3)。
爬取数据源代码如下:
#获取165页网页链接,并将网页地址保存至data文件
import requests
from lxml import etree
get_dict = {
"lang": "c",
"stype": "1",
"postchannel": "0000",
"workyear": "99",
"cotype": "99",
"degreefrom": "99",
"jobterm": "99",
"companysize": "99",
"lonlat": "0,0",
"radius": "-1",
"ord_field": "0",
"confirmdate": "9",
"fromType": "",
"dibiaoid": "0",
"address": "",
"line": "",
"specialarea": "00",
"from": "",
"welfare": ""
}
header_dict = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"
}
url = "https://search.51job.com/list/000000,000000,0000,00,9,99,%25E6%2595%25B0%25E6%258D%25AE%25E5%2588%2586%25E6%259E%2590%25E5%25B8%2588,2,{}.html"
f = open("data.text","w",encoding="utf-8")
for current_page in range(1,165):
new_url = url.format(current_page)
# print(new_url)
r1 = requests.get(url=new_url, params=get_dict, headers=header_dict)
r1.encoding = r1.apparent_encoding
html = etree.HTML(r1.text)
a_tag_list = html.xpath("//div[@class='el']/p/span/a/@href")
for a_tag in a_tag_list:
f.write(a_tag+"\n")
f.flush()
f.close()
#获取各维度数据,并写入Excel文件
import requests
from lxml import etree
import openpyxl
row_count = 1
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.title = "sheet1"
book_name_xlsx = '数据.xlsx'
header_dict = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"}
def format_data(new_url):
r1 = requests.get(url=new_url, headers=header_dict)
r1.encoding = r1.apparent_encoding
html = etree.HTML(r1.text)
# print(r1.text)
# print(new_url)
# 标题
title = html.xpath("//div[@class='cn']/h1/text()")[0]
# print(title)
# 岗位信息inbox
job_msg = html.xpath("//div[contains(@class,'bmsg') and contains(@class,'job_msg')]//text()")
job_msg = "\n".join(job_msg)
# print(job_msg)
# 上班地址
workplace = html.xpath("//div[contains(@class,'bmsg') and contains(@class,'inbox')]/p[@class='fp']//text()")
workplace = "".join(workplace)
# 地址,经验要求,学历要求,发布日期
ltype = html.xpath("//p[contains(@class,'msg') and contains(@class,'ltype')]//text()")
ltype = "".join(ltype)
# print("".join(ltype))
# 福利
jtag = html.xpath("//div[@class='t1']//text()")
jtag = "|".join(jtag)
# print("|".join(jtag))
# 公司名称
com_name = html.xpath("//a[contains(@class,'com_name') and contains(@class,'himg')]/p//text()")
if not com_name:
com_name = html.xpath("//a[@class='com_name ']/p//text()")
com_name = com_name[0]
# print(com_name)
# 公司类型
com_tag = html.xpath("//div[@class='com_tag']//text()")
i_flag, i_people, *i_trade = [com for com in com_tag if com.strip() != '']
i_trades = " ".join(i_trade) if isinstance(i_trade, list) else i_trade
# print(i_flag)
# print(i_people)
# print(i_trades)
# 工资
salary = html.xpath("//div[@class='cn']/strong//text()")
if not salary:
salary = ["",]
salary = salary[0]
# print(salary)
res = [new_url, title, job_msg, workplace, ltype, jtag, com_name, i_flag, i_people, i_trades, salary]
return [val.strip() for val in res]
# return res
def write_excel_xlsx(value):
global row_count
for col in range(len(value)):
sheet.cell(row=row_count, column=col + 1, value=str(value[col]))
workbook.save(book_name_xlsx)
row_count += 1
if __name__ == '__main__':
f_error = open("error.txt","w",encoding="utf-8")
f_info = open("data.txt", "r", encoding="utf-8")
for row in f_info:
try:
url = row.strip()
res = format_data(url)
write_excel_xlsx(res)
print(f"{row}插入excle成功")
except Exception as e:
f_error.write(row)
f_info.close()
f_error.close()
Part Two:数据预处理
1.因部分数据内容与数据分析岗位无任何关系,故将不匹配数据剔除。我的判定方式是将工作名称中包含"数据"、"分析"、"Data"、"Analyst"中任何一个关键词的保留,四个关键词一次都没有出现的则剔除。共剔除1261条与数据分析无关的数据(图2-1、2-2)。
2.由于有部分的数据内容存在重复(图2-3),故选出其中岗位描述相似度较高的数据,将这些数据直接剔除。共剔除567条重复数据。
3.爬取的时候要求字段里包含工作地点、工作经验、学历、招聘人数以及招聘日期等数据,将数据分列,并保留工作地点、工作经验、经历三个字段,删除招聘人数以及招聘日期字段。
分列完成后有1000余条数据并未明确学历要求,但在岗位描述中有提及相应学历要求,我找出了这些数据,并完善了约600条余条数据。另外有2000余条数据对于工作经验无要求,但部分数据在岗位描述中对于经验要求有所提及,操作方法与前者类似,完善了500余条数据。
处理前数据(图2-4):
处理后数据(图2-5):
4.由于福利字段内包含较多数据,故将数据进行分列,并用数据透视表的方式将相关福利字段内相应福利出现的频数进行统计,方便后期可视化的时候绘制词云。
处理前数据(图2-6):
处理后数据(图2-7):
5.行业类型的字段内包含多个行业,不利于后期对于行业的分析,故我只选择选取每条数据的第一级的行业类型,并将多余数据进行剔除。
处理前数据(图2-8):
处理后数据(图2-9):
6.工资字段内的数据是一个收入的区间值,时间单位有小时、天、月、年,计价单位有千和万,我选择把收入下区间与收入上区间进行拆分,并将不同的时间单位与计价单位进行单位统一,数据统一为"XXXX"元/月的格式。另外,我把收入按照从高到低的方式进行划分、归类并增加平均工资的字段,方便后期可视化操作。
处理前数据(图2-10):
处理后数据(图2-11):
7.对要求中需要用到的相关数据分析的技能进行统计,以方便后期观察各岗位对于技能树的要求。处理结果如下图所示(图2-12,其中1代表需要,0代表不需要)。
至此,数据预处理工作基本完成,清洗后数据共计6060条。
Part Three:数据可视化
1.薪资分布情况
从分布情况(图3-1)可以看出,数据分析师岗位的月薪集中在5000-8000元/月以及8000-12000元/月这两个区间段,从12000元/月-25000元/月中间的这三个区间段也是数据比较集中的区域,说明这个行业具有一定的发展空间和潜力。
2.各城市岗位数量分布情况
从如下两图(图3-2、图3-3)可以看出,数据分析师的工作机会最多的城市是上海、广州、北京、深圳这四个超一线城市,杭州、成都、武汉、南京等一线城市紧随其后。
3.学历要求情况
从下图(图3-4)看出,数据分析师岗位对于学历要求最多的是本科和大专,这两个学历的比重占到了全部数据的85.39%,可以看出数据分析师对于学历的要求比较宽松,当然如果是硕士甚至是博士学历会意味着你会有更多的选择,更好的机会和更高的收入。
4.工作经验要求情况
从下图(图3-5)看出,数据分析师岗位对于工作经验要求最多的是1年经验、2年经验以及3-4年经验,1-4年的工作经验要求占到了所有数据的91.11%。近些年科学技术的突飞猛进,得益于互联网和智能手机的发展,数据分析、大数据和人工智能行业逐渐兴起,因兴起时间较短,所以数据分析师岗位对于工作经验的要求比较友好。
5.技能要求情况
从下图(图3-6)看出,数据分析师对于从业者有一定的技能的要求,除去大家比较熟悉的excel之外,掌握数据库语言(sql)也是必备的技能。编程语言也是数据分析师需要点亮的技能树之一,其中以Python、R和Sas最为常见。当然如果你会挖掘、算法或者模型,无疑则是锦上添花。
6.行业分布情况
从下图(图3-7)看出,对于数据分析师需求量最多的三个行业分别是互联网、计算机以及金融,而服装、通信以及快消等传统行业紧随其后。
7.行业分布情况
从下图(图3-8)中看出,对于数据分析师需求最多是民营企业,占比到达了63.66%。另外国企、上市公司、合资公司以及外资企业对于数据分析师的需求度平分秋色,各占10%左右。
8.公司规模分布情况
从下图(图3-9)可以看出,需求数据分析师的公司规模集中在50人-500人左右,这些公司大多以民营公司或者创业公司为主。
9.企业福利情况
企业福利情况也是各位求职的小伙伴非常关心的要素之一,这么多福利中有没有哪些是让你非常心动的呢?
Part Four:深入分析
数据说明
我所关心的因变量Y是数据分析师收入水平(元/月)。数据分析师的收入水平是多种因素综合作用的结果,我共收集了前程无忧网站的6060条与数据分析相关的数据,想对于数据分析师收入水平的相关影响因素进行更加深入的研究。
数据包括工作地点、学历、工作经验等5个变量,数据说明如下图(图4-1)所示。
工资收入
从如下直方图可以看出,工资收入呈现右偏态分布,工资收入的均值为12008元/月,中位数为10000元/月。这一现象符合我们对于工资的基本认知,即存在少数高收入工作,从而拉高了工资的平均水平。
在本案例中,工资收入的最小值为1300元/月,所对应的工作是南京数据分析实习员;最大值为85000元/月,所对应的工作是杭州的高级数据分析师。
描述性分析
首先看学历因素以及工作经验因素,从分组箱线图(图4-4)中可以看出,学历以及工作经验对于工资收入的影响明显,存在一定的正相关。
再看公司类型因素,从分组箱线图(图4-5)可以看出,除去事业单位的工资收入水平明显偏高之外,其他公司类型的工资收入都比较接近。
接着来看行业类型以及工作地点因素,从分组箱线图(图4-6、4-7)可以看出,不同行业类型之间的工资收入水平比较接近,而在工作地点方面,上海、北京以及深圳的工资收入水平偏高。
综上所述,通过对数据的描述性分析,可以得出结论:对工资收入产生影响较大的因素包括学历、工作经验和工作地点。
项目总结:
通过这次对于“数据分析师”岗位的分析,相信各位小伙伴对于这个行业有了一些不同的了解和认识。虽然数据分析岗位的门槛比较友好,但是想要在这个行业有一个长远的发展,想要成为一名合格乃至优秀的数据分析师,除了需要不断积累、学习各种技能和知识以外,还要多思考,多总结,不断培养自己的数据思维以及分析能力,只有这样才能让自己在众人之中能够脱颖而出。漫漫长路,砥砺前行!