python数据分析岗位_数据分析岗位招聘情况
本次主要围绕数据分析岗位的招聘情况, 进行一个简单的数据分析
环境
win8, python3.7, pycharm, jupyter notebook
正文
1. 明确分析目的
了解数据分析岗位的最新招聘情况, 包括地区分布, 学历要求, 经验要求, 薪资水平等.
2. 数据收集
这里借助爬虫, 爬取招聘网站的招聘信息, 进而分析出相关的薪资以及招聘要求.
2.1 目标站点分析
通过对目标站点的分析, 我们需要确定目标站点的请求方式, 以及网页结构.
2.2 新建scrapy项目
1. 在cmd命令行窗口中任意路径下执行以下代码, 比如在"D:\python\Tests"目录下新建zhaopin项目.
d:
cd D:\python\Tests
scrapy startproject zhaopin
2. 在完成了zhaopin项目创建之后, 接下来就是在zhaopin项目文件夹中新建spider爬虫主程序
cd zhaopin
scrapy genspider zhaopinSpider zhaopin.com
这样就完成项目zhaopin的创建, 开始编写我们的程序吧.
2.3 定义items
在items.py文件中定义需要爬取的招聘信息.
importscrapyfrom scrapy.item importItem, FieldclasszhaopinItem(Item):#define the fields for your item here like:
#name = scrapy.Field()
JobTitle = Field() #职位名称
CompanyName = Field() #公司名称
CompanyNature = Field() #公司性质
CompanySize = Field() #公司规模
IndustryField = Field() #所属行业
Salary = Field() #薪水
Workplace = Field() #工作地点
Workyear = Field() #要求工作经验
Education = Field() #要求学历
RecruitNumbers = Field() #招聘人数
ReleaseTime = Field() #发布时间
Language = Field() #要求语言
Specialty = Field() #要求专业
PositionAdvantage = Field() #职位福利
2.4 编写爬虫主程序
在zhaopinSpider.py文件中编写爬虫主程序
importscrapyfrom scrapy.selector importSelectorfrom scrapy.spiders importCrawlSpiderfrom scrapy.http importRequestfrom zhaopin.items importzhaopinItemclassZhaoPinSpider(scrapy.Spider):
name= "ZhaoPinSpider"allowed_domains= ['zhaopin.com']
start_urls= ['https://xxxx.com/list/2,{0}.html?'.format(str(page)) for page in range(1, 217)]defparse(self, response):'''开始第一页
:param response:
:return:'''
yieldRequest(
url=response.url,
callback=self.parse_job_url,
meta={},
dont_filter=True
)defparse_job_url(self, response):'''获取每页的职位详情页url
:param response:
:return:'''selector=Selector(response)
urls= selector.xpath('//div[@class="el"]/p/span')for url inurls:
url= url.xpath('a/@href').extract()[0]yieldRequest(
url=url,
callback=self.parse_job_info,
meta={},
dont_filter=True
)defparse_job_info(self, response):'''解析工作详情页
:param response:
:return:'''item=Job51Item()
selector=Selector(response)
JobTitle= selector.xpath('//div[@class="cn"]/h1/text()').extract()[0].strip().replace(' ','').replace(',',';')
CompanyName= selector.xpath('//div[@class="cn"]/p[1]/a[1]/text()').extract()[0].strip().replace(',',';')
CompanyNature= selector.xpath('//div[@class="tCompany_sidebar"]/div/div[2]/p[1]/text()').extract()[0].strip().replace(',',';')
CompanySize= selector.xpath('//div[@class="tCompany_sidebar"]/div/div[2]/p[2]/text()').extract()[0].strip().replace(',',';')
IndustryField= selector.xpath('//div[@class="tCompany_sidebar"]/div/div[2]/p[3]/text()').extract()[0].strip().replace(',',';')
Salary= selector.xpath('//div[@class="cn"]/strong/text()').extract()[0].strip().replace(',',';')
infos= selector.xpath('//div[@class="cn"]/p[2]/text()').extract()
Workplace= infos[0].strip().replace(' ','').replace(',',';')
Workyear= infos[1].strip().replace(' ','').replace(',',';')if len(infos) == 4:
Education= ''RecruitNumbers= infos[2].strip().replace(' ', '').replace(',',';')
ReleaseTime= infos[3].strip().replace(' ', '').replace(',',';')else:
Education= infos[2].strip().replace(' ', '').replace(',',';')
RecruitNumbers= infos[3].strip().replace(' ', '').replace(',',';')
ReleaseTime= infos[4].strip().replace(' ', '').replace(',',';')if len(infos) == 7:
Language, Specialty= infos[5].strip().replace(' ',''), infos[6].strip().replace(' ','').replace(',',';')elif len(infos) == 6:if (('英语' in infos[5]) or ('话' in infos[5])):
Language, Specialty= infos[5].strip().replace(' ','').replace(',',';'), ''
else:
Language, Specialty= '', infos[5].strip().replace(' ','').replace(',',';')else:
Language, Specialty= '', ''Welfare= selector.xpath('//div[@class="t1"]/span/text()').extract()
PositionAdvantage= ';'.join(Welfare).replace(',', ';')
item['JobTitle'] =JobTitle
item['CompanyName'] =CompanyName
item['CompanyNature'] =CompanyNature
item['CompanySize'] =CompanySize
item['IndustryField'] =IndustryField
item['Salary'] =Salary
item['Workplace'] =Workplace
item['Workyear'] =Workyear
item['Education'] =Education
item['RecruitNumbers'] =RecruitNumbers
item['ReleaseTime'] =ReleaseTime
item['Language'] =Language
item['Specialty'] =Specialty
item['PositionAdvantage'] =PositionAdvantageyield item
2.5 保存到csv文件
通过pipelines项目管道保存至csv文件
classJob51Pipeline(object):defprocess_item(self, item, spider):
with open(r'D:\Data\ZhaoPin.csv','a', encoding = 'gb18030') as f:
job_info= [item['JobTitle'], item['CompanyName'], item['CompanyNature'], item['CompanySize'], item['IndustryField'], item['Salary'], item['Workplace'], item['Workyear'], item['Education'], item['RecruitNumbers'], item['ReleaseTime'],item['Language'],item['Specialty'],item['PositionAdvantage'],'\n']
f.write(",".join(job_info))return item
2.6 配置setting
设置用户代理, 下载延迟0.5s, 关闭cookie追踪, 调用pipelines
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'DOWNLOAD_DELAY= 0.5COOKIES_ENABLED=False
ITEM_PIPELINES={'job51.pipelines.Job51Pipeline': 300,
}
2.7 运行程序
新建main.py文件, 并执行以下代码
from scrapy importcmdline
cmdline.execute('scrapy crawl zhaopin'.split())
这样开始了数据爬取, 最终爬取到9000多条数据, 在分析这些数据之前, 先看看数据都是什么样, 进入数据概览环节.
3. 数据概览
3.1 读取数据
importpandas as pd
df= pd.read_csv(r'D:\aPython\Data\DataVisualization\shujufenxishiJob51.csv')#由于原始数据中没有字段, 需要为其添加字段
df.columns = ['JobTitle','CompanyName','CompanyNature','CompanySize','IndustryField','Salary','Workplace','Workyear','Education','RecruitNumbers', 'ReleaseTime','Language','Specialty','PositionAdvantage']
df.info()
抛出异常: UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbd in position 0: invalid start byte
解决办法; 用Notepad++将编码转换为utf-8 bom格式
转换之后, 再次执行
抛出异常: ValueError: Length mismatch: Expected axis has 15 elements, new values have 14 elements
解决办法: 在列表['JobTitle.....PositionAdvantage']后面追加'NNN', 从而补齐15个元素.
追加之后, 再次执行, 执行结果为:
RangeIndex: 9948 entries, 0 to 9947
Data columns (total 15 columns):
JobTitle 9948 non-null object
CompanyName 9948 non-null object
CompanyNature 9948 non-null object
CompanySize 9948 non-null object
IndustryField 9948 non-null object
Salary 9948 non-null object
Workplace 9948 non-null object
Workyear 9948 non-null object
Education 7533 non-null object
RecruitNumbers 9948 non-null object
ReleaseTime 9948 non-null object
Language 901 non-null object
Specialty 814 non-null object
PositionAdvantage 8288 non-null object
NNN 0 non-null float64
dtypes: float64(1), object(14)
memory usage: 1.1+ MB
可以了解到的信息: 目前的数据维度9948行X15列, Education, Language, Specialty, PositionAdvantage有不同程度的缺失(NNN是最后添加, 仅仅是用来补齐15元素), 14个python对象(1个浮点型)
3.2 描述性统计
由于我们所需信息的数据类型都是python对象, 故使用以下代码
#注意是大写的字母o
df.describe(include=['O'])
从以下信息(公司名称部分我没有截图)中可以得到:
职位名称中'数据分析师'最多, 多为民营公司, 公司规模150-500人最多, 行业领域金融/投资/证券最多, 薪资中6-8千/月最多, 大多对工作经验没有要求, 学历要求多为本科, 多数均招1人等信息.
职位名称的种类就有4758种, 他们都是我们本次分析的数据分析师岗位吗, 先来确认下:
zhaopin.JobTitle.unique()
array(['零基础免费培训金融外汇数据分析师', '数据分析师(周末双休+上班舒适)', '数据分析师', ...,
'数据分析实习(J10635)', '数据分析实习(J10691)', '数据分析实习(J10713)'], dtype=object)
这仅仅显示了职位名称中的一部分,而且还都符合要求, 换种思路先看20个
JobTitle = zhaopin.groupby('JobTitle', as_index=False).count()
JobTitle.JobTitle.head(20)
0 (AI)机器学习开发工程师讲师
1 (ID67391)美资公司数据分析
2 (ID67465)美资公司数据分析
3 (ID67674)500强法资汽车制造商数据分析专员(6个月)
4 (ID67897)知名500强法资公司招聘数据分析专员
5 (Senior)DataAnalyst
6 (免费培训)数据分析师+双休+底薪
7 (实习职位)BusinessDataAnalyst/业务数据分析
8 (急)人力销售经理
9 (提供食宿)银行客服+双休
10 (日语)股票数据分析员/EquityDataAnalyst-Japanese/
11 (越南语)股票数据分析员/EquityDataAnalyst-Vietnam
12 (跨境电商)产品专员/数据分析师
13 (韩语)股票数据分析员/EquityDataAnalyst-Korean
14 ***数据分析
15 -数据分析师助理/实习生
16 -数据分析师助理/统计专员+双休五险+住宿
17 -无销售不加班金融数据分析师月入10k
18 -金融数据分析师助理6k-1.5w
19 -金融数据分析师双休岗位分红
Name: JobTitle, dtype: object
可以看到还有机器学习开发讲师, 人力销售经理, 银行客服等其他无效数据.
现在我们对数据有了大致的认识, 下来我们开始数据预处理.
4. 数据预处理
4.1 数据清洗
数据清洗的目的是不让有错误或有问题的数据进入加工过程, 其主要内容包括: 重复值, 缺失值以及空值的处理
4.1.1 删除重复值
如果数据中存在重复记录, 而且重复数量较多时, 势必会对结果造成影响, 因此我们应当首先处理重复值.
#删除数据表中的重复记录, 并将删除后的数据表赋值给zhaopin
zhaopin = df.drop_duplicates(inplace =False)
zhaopin.shape
(8927, 15)
对比之前的数据, 重复记录1021条.
4.1.2 过滤无效数据
我们了解到职位名称中存在无效数据, 我们对其的处理方式是过滤掉.
#筛选名称中包含'数据'或'分析'或'Data'的职位
zhaopin = zhaopin[zhaopin.JobTitle.str.contains('.*?数据.*?|.*?分析.*?|.*?Data.*?')]
zhaopin.shape
(7959, 15)
4.1.3 缺失值处理
在pandas中缺失值为NaN或者NaT, 其处理方式有多种:
1. 利用均值等集中趋势度量填充
2. 利用统计模型计算出的值填充
3. 保留缺失值
4. 删除缺失值
#计算每个特征中缺失值个数zhaopin.isnull().sum()
JobTitle 0
CompanyName 0
CompanyNature 0
CompanySize 0
IndustryField 0
Salary 0
Workplace 0
Workyear 0
Education 1740
RecruitNumbers 0
ReleaseTime 0
Language 7227
Specialty 7244
PositionAdvantage 1364
NNN 7959
dtype: int64
-- Education: 缺失值占比1740/7959 = 21.86%, 缺失很有可能是"不限学历", 我们就用"不限学历"填充
zhaopin.Education.fillna('不限学历', inplace=True)
-- Language: 缺失值占比7227/7959 = 90.80%, 缺失太多, 删除特征
-- Specialty: 缺失值占比7244/7959 = 91.02%, 同样缺失很多, 删除
zhaopin.drop(['Specialty','Language'], axis=1, inplace = True)
-- PositionAdvantage: 缺失占比1364/7959 = 17.14%, 选用众数中的第一个'五险一金'填充
zhaopin.PositionAdvantage.fillna(zhaopin.PositionAdvantage.mode()[0], inplace = True)
-- NNN: 没有任何意义, 直接删除
zhaopin.drop(["NNN"], axis=1, inplace = True)
最后, 检查缺失值是否处理完毕
zhaopin.isnull().sum()
JobTitle 0
CompanyName 0
CompanyNature 0
CompanySize 0
IndustryField 0
Salary 0
Workplace 0
Workyear 0
Education 0
RecruitNumbers 0
ReleaseTime 0
PositionAdvantage 0
dtype: int64
4.2 数据加工
由于现有的数据不能满足我们的分析需求, 因此需要对现有数据表进行分列, 计算等等操作.
需要处理的特征有: Salary, Workplace
1. Salary
将薪资分为最高薪资和最低薪资, 另外了解到薪资中单位有元/小时, 元/天, 万/月, 万/年, 千/月, 统一将其转化为千/月
importre#将5种单元进行编号
zhaopin['Standard'] = np.where(zhaopin.Salary.str.contains('元.*?小时'), 0,
np.where(zhaopin.Salary.str.contains('元.*?天'), 1,
np.where(zhaopin.Salary.str.contains('千.*?月'), 2,
np.where(zhaopin.Salary.str.contains('万.*?月'), 3,4))))#用'-'将Salary分割为LowSalary和HighSalary
SalarySplit = zhaopin.Salary.str.split('-', expand =True)
zhaopin['LowSalary'], zhaopin['HighSalary'] = SalarySplit[0], SalarySplit[1]#Salary中包含'以上', '以下'或者两者都不包含的进行编号
zhaopin['HighOrLow'] = np.where(zhaopin.LowSalary.str.contains('以.*?下'), 0,
np.where(zhaopin.LowSalary.str.contains('以.*?上'), 2,1))#匹配LowSalary中的数字, 并转为浮点型
Lower = zhaopin.LowSalary.apply(lambda x: re.search('(\d+\.?\d*)', x).group(1)).astype(float)#对LowSalary中HighOrLow为1的部分进行单位换算, 全部转为'千/月'
zhaopin.LowSalary = np.where(((zhaopin.Standard==0)&(zhaopin.HighOrLow==1)), Lower*8*21/1000,
np.where(((zhaopin.Standard==1)&(zhaopin.HighOrLow==1)), Lower*21/1000,
np.where(((zhaopin.Standard==2)&(zhaopin.HighOrLow==1)), Lower,
np.where(((zhaopin.Standard==3)&(zhaopin.HighOrLow==1)), Lower*10,
np.where(((zhaopin.Standard==4)&(zhaopin.HighOrLow==1)), Lower/12*10,
Lower)))))#对HighSalary中的缺失值进行填充, 可以有效避免匹配出错.
zhaopin.HighSalary.fillna('0千/月', inplace =True)#匹配HighSalary中的数字, 并转为浮点型
Higher = zhaopin.HighSalary.apply(lambda x: re.search('(\d+\.?\d*).*?', str(x)).group(1)).astype(float)#对HighSalary中HighOrLow为1的部分完成单位换算, 全部转为'千/月'
zhaopin.HighSalary = np.where(((zhaopin.Standard==0)&(zhaopin.HighOrLow==1)),zhaopin.LowSalary/21*26,
np.where(((zhaopin.Standard==1)&(zhaopin.HighOrLow==1)),zhaopin.LowSalary/21*26,
np.where(((zhaopin.Standard==2)&(zhaopin.HighOrLow==1)), Higher,
np.where(((zhaopin.Standard==3)&(zhaopin.HighOrLow==1)), Higher*10,
np.where(((zhaopin.Standard==4)&(zhaopin.HighOrLow==1)), Higher/12*10,
np.where(zhaopin.HighOrLow==0, zhaopin.LowSalary,
zhaopin.LowSalary))))))#查看当HighOrLow为0时, Standard都有哪些, 输出为2, 4
zhaopin[zhaopin.HighOrLow==0].Standard.unique()#完成HighOrLow为0时的单位换算
zhaopin.loc[(zhaopin.HighOrLow==0)&(zhaopin.Standard==2), 'LowSalary'] = zhaopin[(zhaopin.HighOrLow==0)&(zhaopin.Standard==2)].HighSalary.apply(lambda x: 0.8*x)
zhaopin.loc[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4), 'HighSalary'] = zhaopin[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4)].HighSalary.apply(lambda x: x/12*10)
zhaopin.loc[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4), 'LowSalary'] = zhaopin[(zhaopin.HighOrLow==0)&(zhaopin.Standard==4)].HighSalary.apply(lambda x: 0.8*x)#查看当HighOrLow为2时, Srandard有哪些, 输出为4
zhaopin[zhaopin.HighOrLow==2].Standard.unique()#完成HighOrLow为2时的单位换算
zhaopin.loc[zhaopin.HighOrLow==2, 'LowSalary'] = zhaopin[zhaopin.HighOrLow==2].HighSalary.apply(lambda x: x/12*10)
zhaopin.loc[zhaopin.HighOrLow==2, 'HighSalary'] = zhaopin[zhaopin.HighOrLow==2].LowSalary.apply(lambda x: 1.2*x)
zhaopin.LowSalary , zhaopin.HighSalary = zhaopin.LowSalary.apply(lambda x: '%.1f'%x), zhaopin.HighSalary.apply(lambda x: '%.1f'%x)
2. Workplace
对工作地区进行统一
#查看工作地有哪些
zhaopin.Workplace.unique()#查看工作地点名字中包括省的有哪些, 结果显示全部为xx省, 且其中不会出现市级地区名
zhaopin[zhaopin.Workplace.str.contains('省')].Workplace.unique()#将地区统一到市级
zhaopin['Workplace'] = zhaopin.Workplace.str.split('-', expand=True)[0]
3. 删除重复多余信息
zhaopin.drop(['Salary','Standard', 'HighOrLow'], axis = 1, inplace =True)
到目前为止, 我们对数据处理完成了, 接下来就是分析了.
5. 可视化分析
5.1 企业类型
importmatplotlibimportmatplotlib.pyplot as plt
CompanyNature_Count=zhaopin.CompanyNature.value_counts()#设置中文字体
font = {'family': 'SimHei'}
matplotlib.rc('font', **font)
fig= plt.figure(figsize = (8, 8))#绘制饼图, 参数pctdistance表示饼图内部字体离中心距离, labeldistance则是label的距离, radius指饼图的半径
patches, l_text, p_text = plt.pie(CompanyNature_Count, autopct = '%.2f%%', pctdistance = 0.6, labels = CompanyNature_Count.index, labeldistance=1.1, radius = 1)
m , n= 0.02, 0.028
for t in l_text[7: 11]:
t.set_y(m)
m+= 0.1
for p in p_text[7: 11]:
p.set_y(n)
n+= 0.1plt.title('数据分析岗位中各类型企业所占比例', fontsize=24)
可以看出招聘中主要以民营企业, 合资企业和上市公司为主.
5.2 企业规模
CompanySize_Count =zhaopin.CompanySize.value_counts()
index, bar_width= np.arange(len(CompanySize_Count)), 0.6fig= plt.figure(figsize = (8, 6))
plt.barh(index*(-1)+bar_width, CompanySize_Count, tick_label = CompanySize_Count.index, height =bar_width)#添加数据标签
for x,y inenumerate(CompanySize_Count):
plt.text(y+0.1, x*(-1)+bar_width, '%s'%y, va = 'center')
plt.title('数据分析岗位各公司规模总数分布条形图', fontsize = 24)
招聘数据分析岗位的公司规模主要以50-500人为主
5.3 地区
from pyecharts importGeofrom collections importCounter#统计各地区出现次数, 并转换为元组的形式
data =Counter(place).most_common()#生成地理坐标图
geo =Geo("数据分析岗位各地区需求量", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
attr, value=geo.cast(data)#添加数据点
geo.add('', attr, value, visual_range=[0, 100],visual_text_color='#fff', symbol_size=5, is_visualmap=True, is_piecewise=True)
geo.show_config()
geo.render()
可以看出北上广深等经济相对发达的地区, 对于数据分析岗位的需求量大.
参考自: https://blog.csdn.net/qq_41841569/article/details/82811153?utm_source=blogxgwz1
5.4 学历和工作经验
fig, ax = plt.subplots(1, 2, figsize = (18, 8))
Education_Count=zhaopin.Education.value_counts()
Workyear_Count=zhaopin.Workyear.value_counts()
patches, l_text, p_text= ax[0].pie(Education_Count, autopct = '%.2f%%', labels =Education_Count.index )
m= -0.01
for t in l_text[6:]:
t.set_y(m)
m+= 0.1
print(t)for p in p_text[6:]:
p.set_y(m)
m+= 0.1ax[0].set_title('数据分析岗位各学历要求所占比例', fontsize = 24)
index, bar_width= np.arange(len(Workyear_Count)), 0.6ax[1].barh(index*(-1) + bar_width, Workyear_Count, tick_label = Workyear_Count.index, height =bar_width)
ax[1].set_title('数据分析岗位工作经验要求', fontsize= 24)
学历要求多以本科,大专为主, 工作经验要求中无工作经验要求为主, 可见招聘主要面向的是应届毕业生.
5.4 薪资水平
1. 薪资与岗位需求关系
fig = plt.figure(figsize = (9,7))#转换类型为浮点型
zhaopin.LowSalary, zhaopin.HighSalary =zhaopin.LowSalary.astype(float), zhaopin.HighSalary.astype(float)#分别求各地区平均最高薪资, 平均最低薪资
Salary = zhaopin.groupby('Workplace', as_index = False)['LowSalary', 'HighSalary'].mean()#分别求各地区的数据分析岗位数量,并降序排列
Workplace = zhaopin.groupby('Workplace', as_index= False)['JobTitle'].count().sort_values('JobTitle', ascending =False)#合并数据表
Workplace = pd.merge(Workplace, Salary, how = 'left', on = 'Workplace')#用前20名进行绘图
Workplace = Workplace.head(20)
plt.bar(Workplace.Workplace, Workplace.JobTitle, width= 0.8, alpha = 0.8)
plt.plot(Workplace.Workplace, Workplace.HighSalary*1000, '--',color = 'g', alpha = 0.9, label='平均最高薪资')
plt.plot(Workplace.Workplace, Workplace.LowSalary*1000, '-.',color = 'r', alpha = 0.9, label='平均最低薪资')#添加数据标签
for x, y in enumerate(Workplace.HighSalary*1000):
plt.text(x, y,'%.0f'%y, ha = 'left', va='bottom')for x, y in enumerate(Workplace.LowSalary*1000):
plt.text(x, y,'%.0f'%y, ha = 'right', va='bottom')for x, y inenumerate(Workplace.JobTitle):
plt.text(x, y,'%s'%y, ha = 'center', va='bottom')
plt.legend()
plt.title('数据分析岗位需求量排名前20地区的薪资水平状况', fontsize = 20)
可以看出, 随着需求量的减少, 薪资水平也有所降低.
2. 薪资与经验关系
#求出各工作经验对应的平均最高与平均最低薪资
Salary_Year = zhaopin.groupby('Workyear', as_index = False)['LowSalary', 'HighSalary'].mean()#求平均薪资
Salary_Year['Salary'] = (Salary_Year.LowSalary.add(Salary_Year.HighSalary)).div(2)#转换列, 得到想要的顺序
Salary_Year.loc[0], Salary_Year.loc[6] = Salary_Year.loc[6], Salary_Year.loc[0]#绘制条形图
plt.barh(Salary_Year.Workyear, Salary_Year.Salary, height = 0.6)for x, y inenumerate(Salary_Year.Salary):
plt.text(y+0.1,x, '%.2f'%y, va = 'center')
plt.title('各工作经验对应的平均薪资水平(单位:千/月)', fontsize = 20)
工作经验越丰富, 薪资越高.
3. 薪资与学历关系
#计算平均薪资
Salary_Education = zhaopin.groupby('Education', as_index = False)['LowSalary', 'HighSalary'].mean()
Salary_Education['Salary'] = Salary_Education.LowSalary.add(Salary_Education.HighSalary).div(2)
Salary_Education= Salary_Education.sort_values('Salary', ascending =True)#绘制柱形图
plt.bar(Salary_Education.Education, Salary_Education.Salary, width = 0.6)for x,y inenumerate(Salary_Education.Salary):
plt.text(x, y,'%.2f'%y, ha = 'center', va='bottom')
plt.title('各学历对应的平均工资水平(单位:千/月)', fontsize = 20)
学历越高, 对应的薪资水平越高
总结
1. 数据分析岗位中企业类型以民营企业, 合资企业和上市公司为主, 企业规模多为50-500人.
2. 数据分析岗位的学历要求以本科,大专为主, 经验中无工作经验占多数, 可见主要面向的是应届毕业生.
3. 北上广深杭等经济相对发达的地区对数据分析岗位的需求量大, 且薪资水平较高于其他地区; 学历越高, 经验越丰富对应的薪资水平也会增高.
python数据分析岗位_数据分析岗位招聘情况相关推荐
- python数据分析岗位_数据分析类岗位目前的就业形势是怎样?
谢邀,题主的目标方向很明确,就是想要走业务数据分析方向的岗位.其实综合题主的信息来看,走业务数据分析举双手赞成.因为题主的专业是属于业务数据分析的贴边相关专业之一,现在应届毕业,只要面试中能证明自己的 ...
- python医学应用_数据分析工具鄙视链:Python、R语言是老大,Excel只能称小弟?
最新行业报告 2020数据分析.商业分析行业报告工作岗位与职能.薪资对比.热招公司等多方面详细解读帮助你一网打尽,斩获心仪Offer! 扫码回复[数据分析 0]立即领取 History语言发展史ABC ...
- python数据分析天气预报_数据分析----天气预报走向(pygal)
#!usr/bin/env python #-*- coding:utf-8 _*- """ @author:Administrator @file: 可视化天气预报.p ...
- 智联招聘python岗位_智联招聘的python岗位数据词云制作
# 根据传入的背景图片路径和词频字典.字体文件,生成指定名称的词云图片 def generate_word_cloud(img_bg_path, top_words_with_freq, font_p ...
- 智联招聘python岗位_智联招聘的python岗位数据结巴分词(一)
如何获取数据点击这里 下载之后的文件名为:all_results.csv 数据样式大概这样.然后下面我分析的是工作要求 也就是那边的绿框那一列. import csv import os impor ...
- python 文件格式转换_数据分析:基于Python的自定义文件格式转换系统
( 白宁超 2018年7月16日14:47:41 ) 导读:随着大数据的快速发展,自然语言处理.数据挖掘.机器学习技术应用愈加广泛.针对大数据的预处理工作是一项庞杂.棘手的工作.首先数据采集和存储,尤 ...
- python sklearn 归一化_数据分析|Python特征工程(5)
OX00 引言 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.由此可见,特征工程在机器学习中占有相当重要的地位.在实际应用当中,可以说特征工程是机器学习成功的关键. 特征做不好,调 ...
- python分类汇总_数据分析番外篇13_利用Python实现分类汇总
自己建立了一个数据分析兴趣小组群,在分享了一篇有关Python的介绍后,这两天大家的学习热情高涨,于是纷纷将自己的问题扔到群里诱使大家来解决,比如:如何代码实现去除文本里面的多余空格,如何将一个27万 ...
- python cox回归_数据分析|回归分析(RPython)
0X01 前言 变量之间关系可以分为两类: 函数关系:反映了事务之间某种确定性关系 相关关系:两个变量之间存在某种依存关系,但二者并不是一一对应的:反映了事务间不完全确定关系:相关系数(r)可以衡量这 ...
最新文章
- 手机端自适应字体大小和元素宽度自适应
- python Intel Realsense D435 图像自动采集程序 自动剔除模糊图像
- NOIP前夕:noi.openjudge,Maximum sum
- Java 时间处理 ZoneDateTime
- Pantera Capital合伙人:ETH已成为机构资产类别
- Qt中焦点策略FocusPolicy的使用
- Some personal records
- 数据库入门-pymysql模块的使用
- 杨辉三角python代码 不要括号_关于杨辉三角python代码的问题
- NYOJ456andNYOJ325
- 怎么仿站下载整站的文件
- android开机动画 制作工具,开机动画包制作(bootanimation)
- html css图标怎么跟文字并排,科技常识:css图标与文字对齐的两种实现方法
- 寒武纪加速平台(MLU200系列) 摸鱼指南(一)--- 基本概念及相关介绍
- Python爬虫数据存储不同格式在excel表中通用代码
- 【C#】改变图片大小
- CAS机制以及简单实现
- 大数据技术与原理 概述
- 实操-安装esxi6.0和配置
- 使用微信小程序获取附近人的位置遇到的坑
热门文章
- 从博客搭建和装修学到的东西
- Nginx1.6.2版本安装遇到的坑以及配置反向代理
- 1800勘误表_专业的ASP.NET 2.0勘误表
- 最小生成树之克鲁斯卡尔算法
- iphone通讯录 android,3个方法,教你如何快速而又有效的将联系人从iPhone转移到安卓...
- 用ASP.NET建立一个在线RSS新闻聚合器
- 美团“互联网下半场”的筹码:豪赌B端业务
- android 仿支付宝动画,自定义view之仿支付宝动画
- R语言中的多项式回归、局部回归、核平滑和平滑样条回归模型
- 选定进行压缩的卷可能已损坏,请使用Chkdsk修复