2022.3.25-2022.3.27前程无忧—数据分析求职需求分析

2023-10-19 13:20

本文主要是介绍2022.3.25-2022.3.27前程无忧—数据分析求职需求分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
from scipy.stats import norm,mode
import re
plt.rcParams['font.sans-serif']=['SimHei'] # 用来设置字体样式以正常显示中文标签
plt.rcParams['axes.unicode_minus']=False # 默认是使用Unicode负号,设置正常显示字符,如正常显示负号
warnings.filterwarnings('ignore') #忽略警告

1.读取csv,并且添加header

df = pd.read_csv('data_analysis_job.csv',header=None,names=['city','position','salary','working_length','degrees','numbers','requirements','job_information','company_type','company_size','industry'],encoding='gb18030')
df.info 
df.shape  #数据大小 (12439, 11)

2.数据清洗

2.1对整体数据初步处理——去重

df.duplicated().sum() #重复值的个数 1801
df.drop_duplicates(keep='first',inplace=True)

2.2检查缺失值,并处理

df.isnull().any()
df.isnull().sum() #每一列缺失值个数

2.2.1 处理city

df['city'].unique()#查看字段是否需要清洗
#['广州' '深圳' '上海' '北京' '杭州' '重庆' '武汉' '天津' '南京' '苏州' '厦门' '长沙']

2.2.2 处理salary

实习工资与全职计算不一样,所以去掉含有‘实习’的行,以方便统计

df= df[df['salary'].str.contains('\*')==False]
x=df['salary'].str.contains('实习')
df=df[~x]
df.reset_index(drop=True,inplace=True) #设置指引

查看salary拆分成两列,为最低和最高工资;年薪/12,变为月薪;时薪按每周上班5天变为月薪,并将数据类型转为float.

df['salary'].unique()
df['bottom']=df['salary'].str.extract('^(\d+).*').astype(float)
df['top']=df['salary'].str.extract('^.*?-(\d+).*').astype(float)
df['top'].fillna(df['bottom'],inplace=True) #如果最高缺失,利用最低填充
df.loc[df.salary.str.contains('年'), 'top'] = df['top'].map(lambda x: x/12)
df.loc[df.salary.str.contains('年'), 'bottom'] = df['bottom'].map(lambda x: x/12)
df.loc[df.salary.str.contains('时'), 'top'] = df['top'].map(lambda x: x*8*20)
df.loc[df.salary.str.contains('时'), 'bottom'] = df['bottom'].map(lambda x: x*8*20)
df.loc[df.salary.str.contains('天'), 'bottom'] = df['bottom'].map(lambda x: x*30/1000)
df.loc[df.salary.str.contains('天'), 'top'] = df['top'].map(lambda x: x*30/1000)
df.loc[df.salary.str.contains('万'), 'top'] = df['top'].map(lambda x: x*10)
df.loc[df.salary.str.contains('万'), 'bottom'] = df['bottom'].map(lambda x: x*10)

 计算出每个岗位的平均月薪资 avg_salary

df['avg_salary'] = (df['bottom']+df['top'])/2
df['avg_salary'] = df['avg_salary'].astype('int64')
df['avg_salary'].unique()

插入表中

cols=list(df)
cols.insert(4,cols.pop(cols.index('bottom')))
cols.insert(5,cols.pop(cols.index('top')))
cols.insert(6,cols.pop(cols.index('avg_salary')))
df=df.loc[:,cols]
print(df['avg_salary'].unique())
print(df.describe())

去掉一些极端值,这里设置平均值为2.5k-100k

df=df[(df.avg_salary>2.5)&(df.avg_salary<100)]

查看数据的统计信息

df.describe()

2.2.3 处理working_length

df['working_length'].unique()
df['working_length'].replace(np.nan,'无需经验',inplace=True)

2.2.4 处理degrees

df['degrees'].unique()
df['degrees'].replace(np.nan,'大专',inplace=True)#替换null为'大专'

 2.2.5 处理industry

print(df['industry'].head(10))
print('-'*50) #查看数据
df['industry']=df['industry'].str.extract('(\S*)') #删除空格之后的描述(不影响分类)
print(df['industry'].unique())
#将相似行业合并为同一大类
df.loc[df.industry.str.contains('互联网'), 'industry'] = '互联网'
df.loc[df.industry.str.contains('计算机'), 'industry'] = '互联网'
df.loc[df.industry.str.contains('游戏'), 'industry'] = '互联网'
df.loc[df.industry.str.contains('新能源'), 'industry'] = '新能源'
df.loc[df.industry.str.contains('通信'), 'industry'] = '通信'
df.loc[df.industry.str.contains('电信'), 'industry'] = '通信'
df.loc[df.industry.str.contains('金融'),'industry'] = '金融'
df.loc[df.industry.str.contains('银行'),'industry'] = '金融'
df.loc[df.industry.str.contains('保险'),'industry'] = '金融'
df.loc[df.industry.str.contains('投资'),'industry'] = '金融'
df.loc[df.industry.str.contains('咨询'),'industry'] = '金融'
df.loc[df.industry.str.contains('证券'),'industry'] = '金融'
df.loc[df.industry.str.contains('影视'),'industry'] = '媒体'
df.loc[df.industry.str.contains('广告'),'industry'] = '媒体'
print(df['industry'].head(10))
#观察industry列,对数量较少且为传统行业的数据归入其他行业
df.loc[~df['industry'].isin(['互联网','快速消费品(食品、饮料、化妆品)','电子技术/半导体/集成电路 ','制药/生物工程','服装/纺织/皮革 ','贸易/进出口','医疗设备/器械','批发/零售','汽车','金融','通信','机械/设备/重工 ','房地产','仪器仪表/工业自动化','交通/运输/物流','医疗/护理/卫生','建筑/建材/工程','媒体','多元化业务集团公司','教育/培训/院校 ','新能源']),'industry']='其他行业'
print(df['industry'].value_counts())

 

3.数据可视化和简单的分析

3.1 每个城市的平均薪资的中位数和平均数

df.avg_salary.groupby(df['city']).agg(['mean','median']).plot.bar(figsize=(16,8))
plt.show()

通过上图发现,北京、上海、杭州、深圳、南京工资较高于其他城市,武汉工资偏低。

3.2 薪资与岗位数之间的关系

fig=plt.figure(figsize=(12,6),dpi=80)
plt.hist(df['avg_salary'],bins=25,color='#f59311',alpha=0.3,edgecolor='k',log=True)
plt.ylabel('岗位数',fontsize=15)
plt.xlabel('薪资',fontsize=15)
plt.xticks(list(range(0,70,5)))
plt.show()

 

 少部分人会拿到高工资,月薪4-5k的的岗位最多。

3.3薪资大于10K和小于10K各城市占比

plt.figure(figsize=(16,16),dpi=80)
plt.subplot(121)
temp = df[df.avg_salary<10].groupby('city').avg_salary.count()
plt.pie(temp,labels=temp.index,autopct='% .2f%%')
plt.title('薪资小于10K各城市占比')
plt.subplot(122)
temp = df[df.avg_salary>10].groupby('city').avg_salary.count()
plt.pie(temp,labels=temp.index,autopct='% .2f%%')
plt.title('薪资大于10K各城市占比')
plt.show()

 

 各个城市间薪资差距较大,低岗位主要在武汉、广州等城市。

3.4主要城市薪资水平的箱线图

data1=df[df.city=='北京']['avg_salary']
data2=df[df.city=='上海']['avg_salary']
data3=df[df.city=='广州']['avg_salary']
data4=df[df.city=='深圳']['avg_salary']
data5=df[df.city=='杭州']['avg_salary']
plt.figure(figsize=(12,6),dpi=80)
plt.boxplot([data1,data2,data3,data4,data5],labels=['北京','上海','广州','深圳','杭州'],flierprops={'marker':'o','markerfacecolor':'r','color':'k'},patch_artist=True,boxprops={'color':'k','facecolor':'#FFFACD'})
ax=plt.gca()
ax.patch.set_facecolor('#FFFAFA')
ax.patch.set_alpha(0.8)
plt.title('主要城市薪资水平箱线图',fontsize=15)
plt.ylabel('薪资(单位:k)',fontsize=12)
plt.show()

我们可以发现北京和上海的平均薪资水平差不多,广州的平均薪资较低且两级分化较小。

3.5各学历薪资均值和中位数

d = df['avg_salary'].groupby(df['degrees'])
d_avg = d.mean()
c = list(d_avg.index)
v = list(range(1,len(c)+1))
w = d_avg.values.astype('int64')
x = d.median().values.astype('int64')
move = 0.4
plt.figure(figsize=(14,8),dpi=80)
plt.bar(v,w,width=move,color='#eed777')
plt.bar([i+move for i in v],x,width=move,color='#334f65')
a = np.arange(0,6)+1.2
plt.xticks(a,c)
plt.yticks(list(range(0,40,5)))
plt.legend(['均值','中位数'])
plt.title('各学历薪资均值及中位数比较图',fontsize=16)
plt.xlabel('学历',fontsize = 12)
plt.ylabel('薪资(单位K)',fontsize = 12)
for e,f in zip(v,w):plt.text(e,f,'{}k'.format(f),ha='center',fontsize=12)
for g,h in zip([i+move for i in v],x):plt.text(g,h,'{}k'.format(h),ha='center',fontsize=12)
plt.show()

 可以发现,本科以上学历的薪资明显升高,博士与硕士的薪资差距明显高于,硕士与本科的薪资差距。

3.6 市场对学历的需求

data = df['degrees'].value_counts()
y=data.values
plt.figure(figsize=(10,10),dpi=80)
plt.pie(y,labels=data.index,autopct='%.1f %%')
plt.show()

 本科和大专占绝大多数,硕士较少,博士占极少数。

3.7工作年限薪资均值及中位数

d = df['avg_salary'].groupby(df['working_length'])
d_avg = d.mean()
c = list(d_avg.index)
v = list(range(1,len(c)+1))
w = d_avg.values.astype('int64')
x = d.median().values.astype('int64')
move = 0.4
plt.figure(figsize=(14,8),dpi=80)
plt.bar(v,w,width=move,color='#002c53')
plt.bar([i+move for i in v],x,width=move,color='#0c84c6')
a = np.arange(0,7)+1.2
plt.xticks(a,c)
plt.yticks(list(range(0,40,5)))
plt.legend(['均值','中位数'])
plt.title('各工作年限薪资均值及中位数比较图',fontsize=16)
plt.xlabel('工作经验',fontsize = 12)
plt.ylabel('薪资(单位K)',fontsize = 12)
for e,f in zip(v,w):plt.text(e,f,'{}k'.format(f),ha='center',fontsize=12)
for g,h in zip([i+move for i in v],x):plt.text(g,h,'{}k'.format(h),ha='center',fontsize=12)
plt.show()

 应届生工资较低,有5年以上的工作经验,工资明显增加。

3.8 市场对工作经验的需求

data = df['working_length'].value_counts()
y=data.values
plt.figure(figsize=(10,10),dpi=80)
plt.pie(y,labels=data.index,autopct='%.1f %%')
plt.show()

  市场上对于工作经验的要求还是很强烈,1-4年的经验要求占绝大多数,工作经验是入职成功与否的关键因素。

3.9各个行业薪资均值及中位数

d = df['avg_salary'].groupby(df['industry'])
d_avg = d.mean()
c = list(d_avg.index)
v = list(range(1,len(c)+1))
w = d_avg.values.astype('int64')
x = d.median().values.astype('int64')
move = 0.4
plt.figure(figsize=(20,8),dpi=80)
plt.bar(v,w,width=move,color='#9de0ff')
plt.bar([i+move for i in v],x,width=move,color='#ffa897')
a = np.arange(0,18)+1.3
plt.xticks(a,c)
plt.yticks(list(range(0,40,5)))
plt.legend(['均值','中位数'])
plt.title('各行业薪资均值及中位数比较图',fontsize=16)
plt.xlabel('行业',fontsize = 12)
plt.ylabel('薪资(单位K)',fontsize = 12)
for e,f in zip(v,w):plt.text(e,f,'{}k'.format(f),ha='center',fontsize=12)
for g,h in zip([i+move for i in v],x):plt.text(g,h,'{}k'.format(h),ha='center',fontsize=12)
plt.show()

互联网、金融和生物制药行业相较于其他行业薪资较高。 

 3.10市场中各个行业的需求

data = df['industry'].value_counts()
y=data.values
plt.figure(figsize=(10,10),dpi=80)
plt.pie(y,labels=data.index,autopct='%.1f %%')
plt.show()

 互联网、生物制药、快速消费品、金融等行业对该岗位需求较大。

4.总结

通过以上简要分析,如果想成功找到满意工作,应该往北京、上海、深圳、杭州、南京这几个城市考虑;而行业方面,互联网、生物制药、金融对该岗位需求较大,薪资普遍较高;工作经验对于该岗位而言比较重要,与薪资成正相关,在工作4-5年后,薪资会有较大的提升;对于学历,如果想进入这个行业,本科即可,但是博士会拿到更高的薪资,学历也与薪资水平呈正相关。

这篇关于2022.3.25-2022.3.27前程无忧—数据分析求职需求分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/240040

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

五大特性引领创新! 深度操作系统 deepin 25 Preview预览版发布

《五大特性引领创新!深度操作系统deepin25Preview预览版发布》今日,深度操作系统正式推出deepin25Preview版本,该版本集成了五大核心特性:磐石系统、全新DDE、Tr... 深度操作系统今日发布了 deepin 25 Preview,新版本囊括五大特性:磐石系统、全新 DDE、Tree

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S