简介
想要转行从事数据分析师的工作了,需要了解数据分析师岗位的现状,直接通过招聘信息来了解企业的用人要求是最直接的,也是最简单的途径,正好可以做一个广州、深圳和珠海招聘数据分析师的简单分析报告。
分析工具
使用Python的Scrapy框架写爬虫到招聘网站爬取数据,GitHub上有很多代码,所以偷了个懒。分析和可视化也是使用Python,主要用到了pandas、matplotlib、seaborn和pyecharts等包。
数据来源
数据来源于拉钩网,相对来说拉勾拉勾网的数据还是比较可靠的。数据主要有这些字段:
拉勾网的职位编号id(数据库主键),岗位名称title, 岗位网址url, 月薪salary, 城市job_city, 经验要求work_years,学历要求degree_need,全职/实习/兼职job_type, 发布时间publish_time,职位福利job_advantage,职位描述job_desc,工作地址job_addr,公司名称company_name,公司拉勾链接company_url,职位标签tags,爬取时间crawl_time
数据加载与清洗
db = sqla.create_engine('mysql+mysqlconnector://root:admin@localhost:3306/lagou')
jobs = pd.read_sql('select * from lagou_job', db)
在进行的分析之前,要进行数据清洗,很多时候数据是”不干净“的,需要进行清洗才能够拿来使用。
jobs.info()
可以看出,数据的完整度还是不错的,没有缺失值。这里先进行简单处理,一些具体的字段还是等到需要用到的时候再具体处理。
# 去除一些不要的特征
jobs.drop(['id', 'url','company_url', 'publish_time', 'crawl_time'], axis=1, inplace=True)
# 字符串,头尾去除空格
jobs = jobs.applymap(str.strip)
数据分析和可视化
地域分析
count_by_city = jobs.groupby(['job_city'])['job_city'].count()
ax = plt.figure(figsize=(10, 8)).add_subplot(111)
sns.barplot(count_by_city.index, count_by_city.values, alpha=0.8)
ax.set_ylim([0, 400])
ax.set_xlabel('城市', fontsize=20)
ax.set_ylabel('职位数量', fontsize=20)
ax.set_title('三个城市数据分析师的需求量', size=24)
for x, y in zip(range(3), count_by_city.values):
ax.text(x, y, '%d'%y, ha='center', va='bottom', fontsize=16, color='b')
save_fig('三个城市数据分析师的需求量')
plt.show()
深圳最多,其次是广州,作为一线城市,对数据分析师的需求还是挺大的,但是珠海就只有个位数了。所以说:对于想要从事数据分析师,一线城市才是好的选择,就业就会大,不过人才比较集中,也意味着竞争压力也比较大。
# 去空
jobs['job_city'] = jobs['job_city'].apply(str.strip)
# 分割出区域
def return_area(address):
address_list = address.split('-')
return address_list[1]
jobs['area'] = jobs['job_addr'].apply(return_area)
jobs['area'] = jobs['area'].apply(str.strip)
jobs_sz = jobs[jobs['job_city'] == '深圳']
jobs_gz = jobs[jobs['job_city'] == '广州']
area_sz = jobs_sz[~jobs_sz['area'].isin(['龙华新区'])]
count_by_area_sz_ = area_sz.groupby(['area'])['area'].count()
value = count_by_area_sz_.values
attr = count_by_area_sz_.index
map = Map("深圳各地区职位数量分布", title_pos="center", title_text_size=20, width=700, height=400, background_color='#EAEFF3')
map.add("", attr, value, maptype='深圳', is_visualmap=True,
visual_text_color='#000', is_roam=False, is_label_show=True, is_map_symbol_show=False,
visual_range=[0, 300], visual_range_color=['#DDFFFF', '#3366ff'], is_toolbox_show=False)
map
在深圳,数据分析师的需求主要集中在南山区和福田区,其他区都相对较少,甚至没有。
count_by_area_gz = jobs_gz.groupby(['area'])['area'].count()
value = count_by_area_gz.values
attr = count_by_area_gz.index
map = Map("广州各地区职位数量分布", title_pos="center", title_text_size=20, width=900, height=800, background_color='#EAEFF3')
map.add("", attr, value, maptype='广州', is_visualmap=True,
visual_text_color='#000', is_roam=False, is_label_show=True, is_map_symbol_show=False,
visual_range=[0, 300], visual_range_color=['#DDFFFF', '#3366ff'], is_toolbox_show=False)
map
在广州,数据分析师的需求主要集中在天河区,其他区也一样较少,甚至没有。
可以知道,即使是在一线城市,对数据分析师的需求也是很集中,分布在经济较为发达的区。
总体薪酬情况
# 取最小值为薪酬值
def avg_salary(salary):
salary_list = salary.split('-')
salary_min = salary_list[0][:-1]
return salary_min
jobs['salary_min'] = jobs['salary'].apply(avg_salary).astype(int)
ax4 = plt.figure(figsize=(10, 6)).add_subplot(111)
sns.distplot(jobs['salary_min'], kde=False, bins=30)
ax4.set_title('薪酬分布', fontsize=22)
ax4.set_xlabel('薪酬(K/月)', fontsize=18)
ax4.set_xticks(range(5, 60, 5))
save_fig('薪酬分布')
plt.show()
薪酬主要集中在5k-20k,但也明显的断层,主要集中在5k-10k,15K-20K,中间是个小分水岭,起薪还是挺高的,薪酬的提升幅度也是令人期待的。这里的薪酬取区间的最小值,实际上的薪酬可能还会偏高,这取决于拉勾的上给出的薪酬可不可靠。不过要是个人能力较强,实际薪酬还是会偏高的。
从总体薪酬可以看出,数据分析师的收入还是挺可观的。
三个城市的薪酬比较
group_by_city = jobs.groupby(['job_city'])['salary_min']
df_city = []
for group in count_by_city.index:
v = group_by_city.get_group(group).values
df_city.append(v)
ax5 = plt.figure(figsize=(10, 6)).add_subplot(111)
sns.boxplot(data=df_city)
ax5.set_xticklabels(count_by_city.index, fontsize=18)
ax5.set_title('广州、深圳和珠海的薪酬比较', fontsize=22)
ax5.set_ylabel('薪酬K/月', fontsize=20)
save_fig('广州、深圳和珠海的薪酬比较')
plt.show()
深圳的薪酬最高,其次是广州,珠海最低。单从薪酬来看,还是一线城市比较高,特别是深圳,即便消费水平相对较高,也很吸引人。
工作经验要求
# 去掉经验二字
def remove_word(word):
return word[2:]
jobs['experience'] = jobs['work_years'].apply(remove_word)
jobs['experience'] = jobs['experience'].apply(str.strip)
count_by_experience = jobs.groupby(['experience'])['experience'].count()
value_by_experience = pd.DataFrame([count_by_experience.index, count_by_experience.values], index = ['experience', 'counts']).T
sort_by_experience = value_by_experience.copy()
mappings = {'不限':1, '1年以下':2, '1-3年':3, '3-5年':4, '5-10年':5, '10年以上':6}
sort_by_experience['sortby'] = sort_by_experience['experience'].map(mappings)
sort_by_experience.sort_values(by='sortby', inplace=True)
ax6 = plt.figure(figsize=(10, 8)).add_subplot(111)
sns.barplot(np.arange(len(sort_by_experience)), sort_by_experience['counts'])
ax6.set_title('工作经验要求分布', fontsize=22)
ax6.set_xlabel('工作经验', fontsize=20)
ax6.set_ylabel('')
ax6.set_xticklabels(sort_by_experience['experience'], fontsize=18)
for x, y in zip(np.arange(len(sort_by_experience)), sort_by_experience['counts']):
ax6.text(x, y, '%d'%y, ha='center', va='bottom', fontsize=16, color='b')
save_fig('工作经验要求分布')
plt.show()
1-3年经验和3-5年经验的需求比较大,这要集中在这两个年限。经验不限按理说应该是分到1年以下,但是也有很多公司虽然经验要求写着不限,但是描述还是有要求的。
从这个情况看,虽然数据分析需求还是挺大的,但是也不能盲目转行。毕竟对经验要求比较大,可能会造成招不到人的火爆现象,实际对没有经验需求还是比较少的,转行就要被破冷水了。从长远看,5-10年经验的需求还是会比较少的,10年以上近乎无,可以看出5年是比较关键的,职业规划要在前几年做好,进一步提升自己,不要想着做一辈子,不然将来会面临失业的情况。
不同工作经验的薪酬情况
group_by_experience = jobs.groupby(['experience'])['salary_min']
df = []
for group in sort_by_experience['experience']:
v = group_by_experience.get_group(group).values
df.append(v)
ax7 = plt.figure(figsize=(10, 6)).add_subplot(111)
sns.boxplot(data=df)
ax7.set_xticklabels(sort_by_experience['experience'], fontsize=18)
ax7.set_title('不同工作经验的薪酬分布', fontsize=22)
ax7.set_ylabel('薪酬K/月', fontsize=20)
save_fig('不同工作经验的薪酬分布')
plt.show()
随着工作经验的增加,薪酬也会增加,这是意料之中的。同样工作经验的薪酬差距也随着年限的上升而增大,差距变大,逐渐出现分水岭。
5-10年的薪酬分布已经变得比较大,进一步说明5年是一个分水岭。另外,不限经验没有分到1年以下是有一定道理,在这里,不限经验明显会比1年以下的薪酬高,比较接近1-3年经验的薪酬。所以,不能太乐观认为不限工作经验的就是不需要经验的,依旧说明数据分析师对工作经验要求还是比较大的。
学历要求
# 去掉“及以上”
def do_with_degree(degree_need):
if '及以上' in degree_need:
degree_need = degree_need[:-3]
elif '不限' in degree_need:
degree_need = degree_need[2:]
else:
degree_need = degree_need
return degree_need
jobs['degree'] = jobs['degree_need'].apply(str.strip)
jobs['degree'] = jobs['degree'].apply(do_with_degree)
count_by_degree = jobs.groupby(['degree'])['degree'].count()
value_by_degree = pd.DataFrame([count_by_degree.index, count_by_degree.values], index = ['degree', 'counts']).T
sort_by_degree = value_by_degree.copy()
degree_mappings = {'不限':1, '大专':2, '本科':3, '硕士':4}
sort_by_degree['sortby'] = sort_by_degree['degree'].map(degree_mappings)
sort_by_degree.sort_values(by='sortby', inplace=True)
sort_by_degree
ax8 = plt.figure(figsize=(10, 8)).add_subplot(111)
sns.barplot(np.arange(len(sort_by_degree)), sort_by_degree['counts'])
ax8.set_title('学历要求分布', fontsize=22)
ax8.set_xlabel('学历', fontsize=20)
ax8.set_ylabel('')
ax8.set_xticklabels(sort_by_degree['degree'], fontsize=18)
for x, y in zip(np.arange(len(sort_by_degree)), sort_by_degree['counts']):
ax8.text(x, y, '%d'%y, ha='center', va='bottom', fontsize=16, color='b')
save_fig('学历要求分布')
plt.show()
对本科生的需求最大,其次大专,不限学历和硕士学历需求很少,对于博士需求基本没有。
数据分析需要一定的数学基础,但要求也没有那么高,本科生足以胜任。没有学历比较不适合做数据分析,但也不是绝对的,数据分析师对硕士需求还是比较少。在数据挖掘、机器学习这些对算法要求比较高的领域,硕士才会比较吃香。
不同学历的薪酬情况
group_by_degree = jobs.groupby(['degree'])['salary_min']
df_degree = []
for group in sort_by_degree['degree']:
v = group_by_degree.get_group(group).values
df_degree.append(v)
ax9 = plt.figure(figsize=(10, 8)).add_subplot(111)
sns.boxplot(data=df_degree)
ax9.set_xticklabels(sort_by_degree['degree'], fontsize=18)
ax9.set_title('不同学历的薪酬分布', fontsize=22)
ax9.set_ylabel('薪酬K/月', fontsize=20)
save_fig('不同学历的薪酬分布')
plt.show()
这个是意料之中的,学历高意味能力也会比较强,学历越高,薪酬也越高,这是很正常的。
技能关键词
# 技能关键词
def search_skill(text):
rule = re.compile(r'[a-zA-z]+')
skil_list = rule.findall(text)
return skil_list
# 去掉‘&’
def remove_amp(text):
return text.replace('&', '')
jobs['job_desc'] = jobs['job_desc'].apply(remove_amp)
jobs['key_words'] = jobs['job_desc'].apply(search_skill)
keys = []
def append_to_list(word_list):
for word in word_list:
keys.append(word)
jobs['key_words'].apply(append_to_list)
key_list = pd.DataFrame(keys, columns=['key_word'])
key_list['key_word'] = key_list['key_word'].apply(str.lower)
count_by_key = key_list.groupby(['key_word'])['key_word'].count()
sort_by_key = count_by_key.sort_values(ascending=False)
sort_by_key.drop(['kpi', 'd', 'and', 'to', 'gt', 'office', 'a'], inplace=True)
ax10 = plt.figure(figsize=(12, 8)).add_subplot(111)
sns.barplot(y=sort_by_key[:25].index, x=sort_by_key[:25])
ax10.set_title('技能关键词', fontsize=22)
ax10.set_ylabel('技能', fontsize=20)
ax10.set_xlabel('')
save_fig('技能关键词')
plt.show()
技能要求排名前五:SQL、Python、Excel、R、SAS、SPSS。可以说SQL是必备技能,根据不同公司需要使用R或Python或Excel或全部都要。所以对于想要从事数据分析的要注意:SQL是必须要学的,然后选择Python或R作为进阶,虽然Excel从数据看比Python略少,但是Excel依旧是表格神器,是不可以缺少的技能之一。
接下来是Hadoop、hive、ppt、mysql、spark。除了ppt跟mysql,其他三个都是跟大数据相关,偏向大数据的还要学习这些技能。
不同技能的薪酬水平和需求量
# list转为逗号分隔的string
def list_to_str(key_words):
return ','.join(key_words)
df_key = pd.DataFrame([sort_by_key[:20].index, sort_by_key[:20].values], index=['key_word', 'counts']).T
jobs['key_words_lower'] = jobs['key_words'].apply(list_to_str)
jobs['key_words_lower'] = jobs['key_words_lower'].apply(str.lower)
def get_salary(key_word):
total = 0
counts = 0
for i in jobs.index:
if key_word in jobs.iloc[i]['key_words_lower']:
total = total + jobs.iloc[i]['salary_min']
counts = counts + 1
return total/counts
df_key['avg_salary'] = df_key['key_word'].apply(get_salary)
ax11 = plt.figure(figsize=(16, 8)).add_subplot(111)
ax11.scatter(df_key['key_word'], df_key['avg_salary'], s=df_key['counts'].astype(float))
ax11.set_title('技能与薪酬、需求量的关系', fontsize=22)
ax11.set_xticklabels(df_key['key_word'].sort_values(), fontsize=18, rotation=30)
ax11.set_ylabel('薪酬K/月', fontsize=20)
save_fig('技能与薪酬、需求量的关系')
plt.show())
取了需求最高的20个技能进行统计薪酬,薪酬水平是计算平均值,在这个气泡图中,气泡大小表示需求量大小。
可以看出,跟大数据相关的spark,shell,hadoop,linux薪资是比较高的,想要高薪的小伙伴要偏向大数据,学习这些技能。python、sql、r,sas,spss需求比较大,能够满足企业的需求情况下获得中等水平的薪酬。
Excel对应的薪酬水平是最低,毕竟相对于其他Excel学习成本比其他低很多。即使如此,Excel还是需要学的,一是需求频率大,二是Excel作为神器还是很不错的。
待遇福利
advantage_text = ','.join([advantage for advantage in jobs['job_advantage']])
with open('advantage.txt','w',encoding='utf-8') as f:
f.write(advantage_text)
f.close()
text = open('advantage.txt', 'r',encoding='utf-8').read()
font = r'C:\Windows\Fonts\simli.ttf'
coloring = np.array(PIL.Image.open("E:/picture/wordcloud/cloud.png"))
wordcloud = WordCloud(background_color="white", mask=coloring, margin=4, max_words=30, font_path=font).generate(text)
ax12 = plt.figure(figsize=(10, 8)).add_subplot(111)
ax12.imshow(wordcloud)
ax12.axis("off")
save_fig('待遇福利')
plt.show()
薪酬是应聘者考虑的一个重要因素,但也不是唯一,除了薪酬,五险一金,双休,带薪年假,发展空间,每年公司组织旅游等等,这些也是要考虑的。
结论
通过分析,我们可以得出一些结论:
- 就业机会深圳相比广州多,珠海近乎无,数据分析师还是就业机会比较集中的,就算在广州深圳也是集中在一两个区。这里只分析几个城市,比较适合广东的参考,其他城市有待数据分析,但若是没有意外,一线城市都会比较多。
- 数据分析师的薪酬主要集中在5k-20k,存在高薪,有进一步的发展空间,前景还是令人期待的。
- 工作经验需求主要集中在1-3年,比较年轻化,但是1年经验以下需求少,转行的可能会被卡在经验要求,但也不是没有机会。
- 尽管企业对多年经验的数据分析师需求比较少,但是薪酬依旧随着经验的增加而上升。
- 数据分析师岗位对学历要求主要集中本科,对硕士的需求也不是很大,学历越高并不一定越吃香,但是还是有优势的,学历越高,薪酬也越高。
- SQL对于数据分析师是必备技能,虽然有更好的工具Python和R,但Excel依旧是必不可少的技能。对于会SQL、Python、Excel、R、SAS、SPSS、Hadoop肯定是很受欢迎的。
- 偏向大数据方向的会比较高薪,Hadoop,Spark,shell是能让你提高薪酬的技能。
总结
这个分析还是比较简单的,没有深入探究更多,数据分析师要求不仅是学历就可以的,岗位要求还有专业要求,扎实的数学和统计学基础等,这些都没有分析到。有待进一步分析。