数据读取

In [114]:
import re
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#%atplotlib inline
import warnings
warnings.filterwarnings('ignore')

plt.rcParams['font.sans-serif'] = ['SimHei']  #用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  #用来正常显示负号
In [115]:
df = pd.read_csv('python_jobs_all_format.csv')
df.head()
Out[115]:
job_name job_stars job_category job_description company_name company_type company_size company_industry company_introduction min_salary max_salary mid_salary place exp_years education
0 (急聘) python爬虫开发工程师 五险一金,餐补补贴,住房补贴,专业培训,绩效奖金,年底双薪,弹性工作,员工旅游,定期体检,下午茶 Python开发工程师,软件工程师 NaN 成都指玩科技有限公司 民营公司 少于50人 文字媒体/出版机械/设备/重工 成都指玩科技有限公司 4000.0 8000.0 6000.0 深圳-南山区 无需经验 大专
1 急招软件测试(双休+会python) 五险一金,年终奖金,团建活动,员工旅游,专业培训,弹性工作 软件测试工程师 岗位职责:,1、根据用户需求规格说明书,确定测试目标,制定测试计划,并完成测试用例编写;,2... 深圳市德科信息技术有限公司 合资 1000-5000人 计算机软件计算机服务(系统、数据服务、维修) 【公司简介】德科信息的愿景:成为科技服务行业的领跑者。德科信息的使命:帮助客户成功、帮助员工... 10000.0 15000.0 12500.0 广州-天河区 2年经验 本科
2 Python开发工程师 周末双休,带薪年假,五险一金,绩效奖金,节日福利,餐饮补贴,补充医疗保险 Python开发工程师,技术支持/维护工程师 岗位职责:,1、了解数通网络设备,了解业界主流网络产品,熟悉网络管理工具;,2、了解路由器数... 赛尔网络有限公司 国企 500-1000人 互联网/电子商务通信/电信运营、增值服务 赛尔网络有限公司成立于2000年12月,经教育部批准,负责中国教育和科研计算机网CERNET... 8000.0 10000.0 9000.0 北京-海淀区 2年经验 本科
3 python开发 (职位编号:06) 五险一金,餐饮补贴,交通补贴 Python开发工程师 岗位职责:,负责数据库,数据处理和算法方面的工作,需求描述:,1.近3年从事python开发... 深圳市网新新思软件有限公司 民营公司 1000-5000人 计算机服务(系统、数据服务、维修) 浙大网新 www.insigma.com.cn (上证600797)创立于2001年9月,是... 15000.0 20000.0 17500.0 上海-徐汇区 8-9年经验 大专
4 Python实施工程师 绩效奖金 其他 CIM DATABASE是德国CONTACT 软件公司的大型数据管理及过程协同系统,是德国软... 上海熠格信息技术有限公司 民营公司 少于50人 计算机软件 上海熠格信息技术有限公司是德国CONTACT公司PDM/PLM产品在国内的官方合作伙伴,我们... 8000.0 10000.0 9000.0 上海-闵行区 2年经验 本科
In [19]:
df.shape
Out[19]:
(12210, 15)
In [20]:
df.isnull().sum()
Out[20]:
job_name                   0
job_stars               1892
job_category               1
job_description         1221
company_name               0
company_type               4
company_size              87
company_industry           0
company_introduction       0
min_salary                 7
max_salary                 7
mid_salary                 7
place                      0
exp_years                311
education                462
dtype: int64
In [21]:
df.isnull().sum()/df.count()
Out[21]:
job_name                0.000000
job_stars               0.183369
job_category            0.000082
job_description         0.111111
company_name            0.000000
company_type            0.000328
company_size            0.007176
company_industry        0.000000
company_introduction    0.000000
min_salary              0.000574
max_salary              0.000574
mid_salary              0.000574
place                   0.000000
exp_years               0.026137
education               0.039326
dtype: float64
In [29]:
# 检查其它数据
df['company_name'].unique().shape
Out[29]:
(9543,)
In [23]:
df['job_name'].unique().shape
Out[23]:
(6400,)
In [24]:
df['job_category'].unique().shape
Out[24]:
(1894,)
In [25]:
df['company_industry'].unique().shape
Out[25]:
(1005,)
In [31]:
df['place'].str.startswith('广州').sum()
Out[31]:
1374
  • 6400职位名,9543公司名,12210条数据

数据可视化

1.公司类型

In [34]:
type_sr = df['company_type'].value_counts()
In [36]:
type_sr.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("公司类型")
plt.ylabel('')
plt.savefig('python_all_company_type.png', dpi=300, bbox_inches='tight')
In [37]:
df[df['company_type'] == '上市公司']['company_type'].count()
Out[37]:
1103
  • 在全国两周的Python职位数据中,12210个职位有9%,1103家上市公司。

2.公司规模

In [38]:
size_sr = df['company_size'].value_counts()
In [39]:
size_sr.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("公司规模")
plt.ylabel('')
plt.savefig('python_all_company_size.png', dpi=300, bbox_inches='tight')
In [40]:
# 少于500人公司的比例
less_500 = df['company_size'].str.contains('少于50人|50-150人|150-500人').mean()
less_500
Out[40]:
0.7015590200445434
In [41]:
# 大于500人公司的比例
1 - less_500
Out[41]:
0.2984409799554566
  • 在全国两周的Pytho职位数据中,一半多的公司在50-150人和150-500人之间。

3.公司规模

In [116]:
df['place']=df['place'].str[:2]
In [117]:
place_sr = df['place'].value_counts()
In [118]:
place_sr.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("工作所在地")
plt.ylabel('')
plt.savefig('python_all_job_place.png', dpi=300, bbox_inches='tight')
In [123]:
# 核心城市工作数量比例
core_7 = df['place'].str.contains('北京|上海|广州|深圳|成都|武汉|南京').mean()
core_7
Out[123]:
0.680999180999181
In [119]:
# 核心城市工作数量比例
core_9 = df['place'].str.contains('北京|上海|广州|深圳|杭州|成都|武汉|南京|苏州').mean()
core_9
Out[119]:
0.7671580671580671
In [120]:
place_sr_9 = df[df['place'].str.contains('北京|上海|广州|深圳|杭州|成都|武汉|南京|苏州')]
In [121]:
place_sr_9=place_sr_9['place'].value_counts()
In [122]:
place_sr_9.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("工作所在地")
plt.ylabel('')
plt.savefig('python_all9_job_place.png', dpi=300, bbox_inches='tight')
In [48]:
# 核心城市工作数量比例
core_4 = df['place'].str.contains('北京|上海|广州|深圳').mean()
core_4
Out[48]:
0.5422604422604422
In [75]:
place_sr_4 = df[df['place'].str.contains('北京|上海|广州|深圳')]
In [76]:
place_sr_4=place_sr_4['place'].value_counts()
In [77]:
place_sr_4.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("工作所在地")
plt.ylabel('')
plt.savefig('python_all4_job_place.png', dpi=300, bbox_inches='tight')
  • 在全国两周的Pytho职位数据中,广深地区的职位点两国34%。

4.工作经验要求

In [79]:
exp_sr = df['exp_years'].value_counts()
In [80]:
exp_sr.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("工作经验要求")
plt.ylabel('')
plt.savefig('python_all_exp_years.png', dpi=300, bbox_inches='tight')
In [81]:
# 写无需经验的,其实内含都有一个经验要求
# 1-2年的占比
year2 = df['exp_years'].str.contains('1年经验|2年经验').mean()
year2
Out[81]:
0.3763341457265316
In [82]:
# 1-4年的占比
year4 = df['exp_years'].str.contains('1年经验|2年经验|3-4年经验').mean()
year4
Out[82]:
0.7296411463148164
  • 在全国两周的Pytho职位数据中,如果工作经验有2年则达到了38%工作的要求,如果工作经验有3年则达到73%工作的要求
  • 所以通过学习两门微专业,在面试时声称自己的经验有3年是必要的

5.学历要求

In [83]:
edu_sr = df['education'].value_counts()
In [84]:
edu_sr.plot.pie(figsize=(12, 12), autopct='%.2f%%')
plt.title("工作学历要求")
plt.ylabel('')
plt.savefig('python_all_edu_require.png', dpi=300, bbox_inches='tight')
  • 在全国两天的Python职位数据中,如果有本科学历则达到91%的职位要求。

6.中位薪酬

In [85]:
# 中位薪酬的平均数
df['mid_salary'].mean()
Out[85]:
14425.186101778252
In [86]:
# 中位薪酬的最大值
df['mid_salary'].max()
Out[86]:
300000.0
In [87]:
# 中位薪酬的最小值
df['mid_salary'].min()
Out[87]:
1500.0
In [88]:
# 中位薪酬的中位数
df['mid_salary'].median()
Out[88]:
12500.0
In [89]:
# 中位薪酬的众数
df['mid_salary'].mode()[0]
Out[89]:
12500.0
In [90]:
df['mid_salary'].hist(bins=100)
Out[90]:
<AxesSubplot:>
In [91]:
# 离散数据处理
df[df['mid_salary'] > 40000] = 40000
In [92]:
#  matplotlib.axes.Axes.hist() 方法的接口
plt.figure(figsize=(12, 6))
n, bins, patches = plt.hist(x=df['mid_salary'],
                            bins=40,
                            color='#0504aa',
                            alpha=0.7,
                            rwidth=0.85)
plt.grid(axis='y', alpha=0.75)
plt.xlabel('薪酬')
plt.ylabel('频率')
plt.title('中位薪酬直方图')

# 设置y轴的上限
maxfreq = n.max()
plt.ylim(ymax=np.ceil(maxfreq / 10) * 10 if maxfreq % 10 else maxfreq + 10)
plt.savefig('python_all_salary_hist.png', dpi=300, bbox_inches='tight')
  • 薪酬在后台设置中有几个默认区间的,这导致通过区间最高薪酬最低薪酬计算出来的中位薪酬形成几个跳增点,分别是13000元、17000元、22000元。
  • 根据自己的能力和面试情况,谈薪酬可以这样跳动价格13000、15000、18000、20000、22000、25000元。
In [93]:
fig, ax = plt.subplots(figsize=(12, 6))
df['mid_salary'].plot.kde(ax=ax, legend=False, title='中位薪酬概率密度图与直方图')
df['mid_salary'].plot.hist(density=True, ax=ax, bins=40)
ax.set_ylabel('概率')
ax.set_xlabel('薪酬')
ax.set_xlim([0, 40000])
ax.grid(axis='y')
fig = plt.gcf()
fig.savefig('python_all_salary_kde.png', dpi=300, bbox_inches='tight')
In [94]:
import plotly.graph_objs as go
from plotly.offline import iplot
h = go.Histogram(
    x=df['mid_salary'],
    cumulative_enabled=True,
)
iplot([h])