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

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

【软考】希尔排序算法分析

目录 1. c代码2. 运行截图3. 运行解析 1. c代码 #include <stdio.h>#include <stdlib.h> void shellSort(int data[], int n){// 划分的数组,例如8个数则为[4, 2, 1]int *delta;int k;// i控制delta的轮次int i;// 临时变量,换值int temp;in

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

PostgreSQL核心功能特性与使用领域及场景分析

PostgreSQL有什么优点? 开源和免费 PostgreSQL是一个开源的数据库管理系统,可以免费使用和修改。这降低了企业的成本,并为开发者提供了一个活跃的社区和丰富的资源。 高度兼容 PostgreSQL支持多种操作系统(如Linux、Windows、macOS等)和编程语言(如C、C++、Java、Python、Ruby等),并提供了多种接口(如JDBC、ODBC、ADO.NET等

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据