爬取实习僧网站所有数据分析实习相关的岗位信息,对其做数据分析
import pandas as pd
import matplotlib. pyplot as plt
import seaborn as sns
import re
import warnings
warnings. filterwarnings( 'ignore' )
% matplotlib inline
df = pd. read_csv( 'shixiseng.csv' )
df. head( 3 )
Unnamed: 0 com_name com_position com_size com_type job_academic job_detail job_good_list job_money job_month job_name job_position job_url job_week 0 0 药渡医药 北京市海淀区上地五街 50-150 医疗/健康/制药/生物 硕士 \n岗位描述:\n\n1.跟踪医药行业及上下游相关行业产业发展,剖析行业发展痛点、市场发展趋... 可转正实习,远程实习 200-400/天 实习3个月 医药数据分析师 北京 https://www.shixiseng.com/intern/inn_wjs7rljuz... 5天/周 1 1 星环科技 虹漕路88号H88越虹广场B座11楼 500-2000 互联网/游戏/软件 不限 \n岗位职责:\n\n1.参与数据分析项目,协助分析数据准备、分析建模等工作\n\n2.协助... 免费咖啡,地铁周边,平台 120-150/天 实习3个月 大数据分析实习生 (MJ000582) 上海 https://www.shixiseng.com/intern/inn_jxqzmo9ih... 4天/周 2 2 亲宝宝 杭州市西湖区联合大厦B座4楼 150-500 互联网/游戏/软件 本科 \n岗位职责:\n\n1、在主管的指导下,对用户使用行为数据的分析和挖掘;\n\n2、理解业... 下午零食,扁平管理,大牛聚集 150-250/天 实习3个月 数据分析实习生 杭州 https://www.shixiseng.com/intern/inn_lyq2mkoju... 3天/周
df. info( )
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 444 entries, 0 to 443
Data columns (total 14 columns):
Unnamed: 0 444 non-null int64
com_name 444 non-null object
com_position 444 non-null object
com_size 443 non-null object
com_type 444 non-null object
job_academic 444 non-null object
job_detail 444 non-null object
job_good_list 444 non-null object
job_money 444 non-null object
job_month 444 non-null object
job_name 444 non-null object
job_position 444 non-null object
job_url 444 non-null object
job_week 444 non-null object
dtypes: int64(1), object(13)
memory usage: 48.6+ KB
df0 = df. drop( 'Unnamed: 0' , axis= 1 ) . fillna( 'not_provided' )
df0. info( )
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 444 entries, 0 to 443
Data columns (total 13 columns):
com_name 444 non-null object
com_position 444 non-null object
com_size 444 non-null object
com_type 444 non-null object
job_academic 444 non-null object
job_detail 444 non-null object
job_good_list 444 non-null object
job_money 444 non-null object
job_month 444 non-null object
job_name 444 non-null object
job_position 444 non-null object
job_url 444 non-null object
job_week 444 non-null object
dtypes: object(13)
memory usage: 45.2+ KB
df0. head( 3 )
com_name com_position com_size com_type job_academic job_detail job_good_list job_money job_month job_name job_position job_url job_week 0 药渡医药 北京市海淀区上地五街 50-150 医疗/健康/制药/生物 硕士 \n岗位描述:\n\n1.跟踪医药行业及上下游相关行业产业发展,剖析行业发展痛点、市场发展趋... 可转正实习,远程实习 200-400/天 实习3个月 医药数据分析师 北京 https://www.shixiseng.com/intern/inn_wjs7rljuz... 5天/周 1 星环科技 虹漕路88号H88越虹广场B座11楼 500-2000 互联网/游戏/软件 不限 \n岗位职责:\n\n1.参与数据分析项目,协助分析数据准备、分析建模等工作\n\n2.协助... 免费咖啡,地铁周边,平台 120-150/天 实习3个月 大数据分析实习生 (MJ000582) 上海 https://www.shixiseng.com/intern/inn_jxqzmo9ih... 4天/周 2 亲宝宝 杭州市西湖区联合大厦B座4楼 150-500 互联网/游戏/软件 本科 \n岗位职责:\n\n1、在主管的指导下,对用户使用行为数据的分析和挖掘;\n\n2、理解业... 下午零食,扁平管理,大牛聚集 150-250/天 实习3个月 数据分析实习生 杭州 https://www.shixiseng.com/intern/inn_lyq2mkoju... 3天/周
数据清洗
df0. com_size. value_counts( )
2000以上 195
500-2000 67
150-500 61
15-50 52
50-150 51
少于15 16
not_provided 1
- 1
Name: com_size, dtype: int64
print ( repr ( df0. loc[ 0 , 'com_size' ] ) )
df0[ 'com_size' ] = df0[ 'com_size' ] . apply ( lambda x : str ( x) . replace( '\ue3c1' , '人' ) )
'50-150\ue3c1'
print ( df0[ [ 'com_name' , 'com_position' ] ] [ df0[ 'com_size' ] . isin( [ 'not_provided' , '-' ] ) ] )
df0[ 'com_size' ] [ df0[ 'com_name' ] == '博世' ] = '2000人以上'
df0[ 'com_size' ] [ df0[ 'com_name' ] == '哈啰出行' ] = '2000人以上'
com_name com_position
107 博世 苏州工业园区星龙街455号;上海市临空经济园区福泉北路333号
149 哈啰出行 上海市闵行区莘庄中心
df0. com_size. value_counts( )
2000人以上 197
500-2000人 67
150-500人 61
15-50人 52
50-150人 51
少于15人 16
Name: com_size, dtype: int64
df0[ 'com_type' ] . value_counts( )
互联网/游戏/软件 273
金融/经济/投资/财会 45
企业服务/咨询 24
汽车/机械/制造 14
广告/传媒/公关/展览 13
医疗/健康/制药/生物 13
教育/培训 12
快消/百货/批发/零售 11
农林牧渔/其他 10
房产/家居/物业/建筑 7
餐饮/酒店/旅游/娱乐 5
化工/能源/环保 5
电子/通信/硬件 5
计算机/互联网 3
公共事业/NGO/政府 2
机械制造 1
None 1
Name: com_type, dtype: int64
df0[ 'com_type' ] [ df0[ 'com_type' ] == '计算机/互联网' ] = '互联网/游戏/软件'
df0[ 'com_type' ] [ df0[ 'com_type' ] == '机械制造' ] = '汽车/机械/制造'
print ( df0[ [ 'com_name' , 'com_position' ] ] [ df0[ 'com_type' ] == 'None' ] )
df0[ 'com_type' ] [ df0[ 'com_type' ] == 'None' ] = '互联网/游戏/软件'
com_name com_position
149 哈啰出行 上海市闵行区莘庄中心
df0[ 'com_type' ] . value_counts( )
互联网/游戏/软件 277
金融/经济/投资/财会 45
企业服务/咨询 24
汽车/机械/制造 15
广告/传媒/公关/展览 13
医疗/健康/制药/生物 13
教育/培训 12
快消/百货/批发/零售 11
农林牧渔/其他 10
房产/家居/物业/建筑 7
餐饮/酒店/旅游/娱乐 5
化工/能源/环保 5
电子/通信/硬件 5
公共事业/NGO/政府 2
Name: com_type, dtype: int64
df0. job_academic. value_counts( )
本科 333
硕士 52
不限 43
大专 16
Name: job_academic, dtype: int64
def trans_money ( x) :
try :
x1 = re. split( '-|/' , x) [ 0 ]
x2 = re. split( '-|/' , x) [ 1 ]
x3 = ( int ( x1) + int ( x2) ) / 2
except :
x3 = x
return x3
df0[ 'day_salary' ] = df0[ 'job_money' ] . map ( trans_money)
print ( df0[ 'day_salary' ] . value_counts( ) )
money_avg = df0[ 'day_salary' ] [ df0[ 'day_salary' ] != '面议' ] . mean( ) . round ( 1 )
df0[ 'day_salary' ] [ df0[ 'day_salary' ] == '面议' ] = money_avg
125.0 78
175.0 74
135.0 45
150.0 40
225.0 37
200.0 26
110.0 25
100.0 12
160.0 9
250.0 9
300.0 8
75.0 7
275.0 6
90.0 6
450.0 6
165.0 6
140.0 5
50.0 4
115.0 4
120.0 4
65.0 4
215.0 3
375.0 3
350.0 3
70.0 3
325.0 2
190.0 2
400.0 2
面议 2
95.0 1
230.0 1
40.0 1
425.0 1
170.0 1
130.0 1
180.0 1
185.0 1
192.0 1
Name: day_salary, dtype: int64
print ( df0. job_month. value_counts( ) )
实习3个月 167
实习4个月 65
实习6个月 60
实习12个月 40
实习8个月 25
实习5个月 23
实习7个月 17
实习10个月 11
实习9个月 8
实习1个月 7
实习2个月 6
实习11个月 5
提供转正机会 4
实习16个月 2
实习13个月 2
实习19个月 1
实习0个月 1
Name: job_month, dtype: int64
def trans_month ( x) :
try :
month = int ( x[ 2 : - 2 ] )
except :
month = x
return month
df0[ 'job_month' ] = df0[ 'job_month' ] . apply ( trans_month)
month_avg = df0[ 'job_month' ] [ df0[ 'job_month' ] != '提供转正机会' ] . mean( ) . round ( 0 )
df0[ 'job_month' ] [ df0[ 'job_month' ] == '提供转正机会' ] = month_avg
print ( df0. job_month. value_counts( ) )
3 167
4 65
6 60
12 40
5 27
8 25
7 17
10 11
9 8
1 7
2 6
11 5
16 2
13 2
19 1
0 1
Name: job_month, dtype: int64
df0. job_position. value_counts( )
北京 165
上海 121
广州 38
杭州 27
深圳 23
成都 15
重庆 6
全国 5
合肥 5
苏州 5
长沙 4
南京 4
天津 3
杭州市 3
武汉 3
西安 3
珠海 2
福州 2
大连 2
西宁 1
昆明 1
常州 1
厦门 1
哈尔滨 1
济南 1
北京,西安,厦门,上海 1
兰州 1
Name: job_position, dtype: int64
df0. job_position[ df0. job_position== '杭州市' ] = '杭州'
temp = df0[ df0. job_position== '北京,西安,厦门,上海' ]
df0. drop( index= temp. index[ 0 ] , inplace= True )
for i in '北京,西安,厦门,上海' . split( ',' ) :
temp. job_position = i
df0 = pd. concat( [ df0, temp] , ignore_index = True )
df0. job_position. value_counts( )
北京 166
上海 122
广州 38
杭州 30
深圳 23
成都 15
重庆 6
全国 5
合肥 5
苏州 5
南京 4
长沙 4
西安 4
天津 3
武汉 3
福州 2
厦门 2
大连 2
珠海 2
济南 1
西宁 1
昆明 1
兰州 1
常州 1
哈尔滨 1
Name: job_position, dtype: int64
df0. job_week. value_counts( )
5天/周 254
4天/周 102
3天/周 82
2天/周 5
6天/周 2
1天/周 1
7天/周 1
Name: job_week, dtype: int64
df0. info( )
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 447 entries, 0 to 446
Data columns (total 14 columns):
com_name 447 non-null object
com_position 447 non-null object
com_size 447 non-null object
com_type 447 non-null object
job_academic 447 non-null object
job_detail 447 non-null object
job_good_list 447 non-null object
job_money 447 non-null object
job_month 447 non-null object
job_name 447 non-null object
job_position 447 non-null object
job_url 447 non-null object
job_week 447 non-null object
day_salary 447 non-null object
dtypes: object(14)
memory usage: 49.0+ KB
data = df0. drop( [ 'job_detail' , 'job_good_list' , 'job_url' ] , axis= 1 )
data. head( 5 )
com_name com_position com_size com_type job_academic job_money job_month job_name job_position job_week day_salary 0 药渡医药 北京市海淀区上地五街 50-150人 医疗/健康/制药/生物 硕士 200-400/天 3 医药数据分析师 北京 5天/周 300 1 星环科技 虹漕路88号H88越虹广场B座11楼 500-2000人 互联网/游戏/软件 不限 120-150/天 3 大数据分析实习生 (MJ000582) 上海 4天/周 135 2 亲宝宝 杭州市西湖区联合大厦B座4楼 150-500人 互联网/游戏/软件 本科 150-250/天 3 数据分析实习生 杭州 3天/周 200 3 星联互动 北京市朝阳区朝外大街甲6号万通中心C座2006 50-150人 互联网/游戏/软件 本科 100-150/天 12 数据分析实习生-北京 北京 5天/周 125 4 成都普众 成都市成华区二仙桥东三路1号成都理工大学致远楼7307 15-50人 互联网/游戏/软件 本科 100-150/天 3 经管类数据分析师 成都 5天/周 125
data. info( )
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 447 entries, 0 to 446
Data columns (total 11 columns):
com_name 447 non-null object
com_position 447 non-null object
com_size 447 non-null object
com_type 447 non-null object
job_academic 447 non-null object
job_money 447 non-null object
job_month 447 non-null object
job_name 447 non-null object
job_position 447 non-null object
job_week 447 non-null object
day_salary 447 non-null object
dtypes: object(11)
memory usage: 38.5+ KB
数据可视化
sns. set_style( 'darkgrid' )
plt. rcParams[ 'font.sans-serif' ] = [ 'SimHei' ]
fig = plt. figure( figsize= ( 8 , 6 ) )
data. groupby( 'com_size' ) [ 'com_size' ] . count( ) . reindex( [ '少于15人' , '15-50人' , '50-150人' , '150-500人' , '500-2000人' , '2000人以上' ] ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'com_size' , fontsize= 18 )
plt. tick_params( labelsize= 12 , rotation= 0 )
fig = plt. figure( figsize= ( 10 , 8 ) )
data. groupby( 'com_type' ) [ 'com_type' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'com_type' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
fig = plt. figure( figsize= ( 15 , 5 ) )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. subplot( 131 )
data. groupby( 'job_week' ) [ 'job_week' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'job_week' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. subplot( 132 )
data. groupby( 'job_month' ) [ 'job_month' ] . count( ) . plot. bar( )
plt. xlabel( 'job_month' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. subplot( 133 )
data. groupby( 'job_academic' ) [ 'job_academic' ] . count( ) . plot. bar( )
plt. xlabel( 'job_academic' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. tight_layout( )
fig = plt. figure( figsize= ( 15 , 5 ) )
data. groupby( 'job_position' ) [ 'job_position' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'job_position' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
data[ 'day_salary' ] = data[ 'day_salary' ] . apply ( int )
temp0 = data. groupby( [ 'job_position' ] ) [ 'job_position' ] . count( )
position = list ( temp0[ temp0> 10 ] . index)
temp = data[ data[ 'job_position' ] . isin( position) ] . groupby( [ 'job_position' ] ) [ 'day_salary' ] . mean( ) . apply ( int )
fig = plt. figure( figsize= ( 8 , 6 ) )
temp. plot. bar( )
for i in range ( len ( list ( temp) ) ) :
v = int ( list ( temp) [ i] )
plt. text( i, v+ 1 , v, ha= 'center' , fontsize= 15 )
plt. xlabel( 'job_postion' , fontsize= 18 )
plt. ylabel( 'day_salary' , fontsize= 18 )
plt. tick_params( labelsize= 12 , rotation= 0 )
avg = int ( data[ data[ 'job_position' ] . isin( position) ] . day_salary. mean( ) )
print ( avg)
plt. axhline( y= avg, ls= ":" , c= "k" )
avg_line = plt. text( 5.55 , avg- 1 , 'avg=169' , fontsize= 20 )
169
全国范围分析
数据分析实习生的招聘需求主要来源于一线、准一线城市北上广深杭州成都等地; 招聘公司多属于互联网、金融、咨询等行业; 招聘公司规模普遍较大; 众多岗位的基本要求是每周工作3-5天,至少实习3个月,拥有本科及以上学历; 北上广深杭州成都等地的岗位薪酬相差不大,在平均薪酬169元/天上下浮动。
启示
一线、准一线城市的互联网、金融、咨询行业的大公司是我们努力的方向。 有实习打算的小伙伴要做好时间规划,做到满足基本工作时间的要求。 平均薪酬是简单参考,让我们最后与HR谈薪酬时有一个心里预期。
gzdata = data[ data[ 'job_position' ] == '广州' ]
fig = plt. figure( figsize= ( 18 , 12 ) )
plt. subplot( 231 )
gzdata. groupby( 'com_size' ) [ 'com_size' ] . count( ) . reindex( [ '少于15人' , '15-50人' , '50-150人' , '150-500人' , '500-2000人' , '2000人以上' ] ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'com_size' , fontsize= 18 )
plt. tick_params( labelsize= 12 , rotation= 0 )
plt. subplot( 232 )
gzdata. groupby( 'com_type' ) [ 'com_type' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'com_type' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. subplot( 233 )
gzdata. groupby( 'job_week' ) [ 'job_week' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'job_week' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. subplot( 234 )
gzdata. groupby( 'job_month' ) [ 'job_month' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'job_month' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. subplot( 235 )
gzdata. groupby( 'job_academic' ) [ 'job_academic' ] . count( ) . plot. bar( )
plt. ylabel( 'jobs_count' , fontsize= 18 )
plt. xlabel( 'job_academic' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. subplot( 236 )
gzdata. groupby( 'job_academic' ) [ 'day_salary' ] . mean( ) . plot. bar( )
plt. ylabel( 'day_salary' , fontsize= 18 )
plt. xlabel( 'job_academic' , fontsize= 18 )
plt. tick_params( labelsize= 12 )
plt. tight_layout( )