Python分析拉勾网数据分析岗位

简介

想要转行从事数据分析师的工作了,需要了解数据分析师岗位的现状,直接通过招聘信息来了解企业的用人要求是最直接的,也是最简单的途径,正好可以做一个广州、深圳和珠海招聘数据分析师的简单分析报告。

分析工具

使用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

# 去掉‘&amp’
def remove_amp(text):
    return text.replace('&amp', '')

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()

薪酬是应聘者考虑的一个重要因素,但也不是唯一,除了薪酬,五险一金,双休,带薪年假,发展空间,每年公司组织旅游等等,这些也是要考虑的。

结论

通过分析,我们可以得出一些结论:

  1. 就业机会深圳相比广州多,珠海近乎无,数据分析师还是就业机会比较集中的,就算在广州深圳也是集中在一两个区。这里只分析几个城市,比较适合广东的参考,其他城市有待数据分析,但若是没有意外,一线城市都会比较多。
  2. 数据分析师的薪酬主要集中在5k-20k,存在高薪,有进一步的发展空间,前景还是令人期待的。
  3. 工作经验需求主要集中在1-3年,比较年轻化,但是1年经验以下需求少,转行的可能会被卡在经验要求,但也不是没有机会。
  4. 尽管企业对多年经验的数据分析师需求比较少,但是薪酬依旧随着经验的增加而上升。
  5. 数据分析师岗位对学历要求主要集中本科,对硕士的需求也不是很大,学历越高并不一定越吃香,但是还是有优势的,学历越高,薪酬也越高。
  6. SQL对于数据分析师是必备技能,虽然有更好的工具Python和R,但Excel依旧是必不可少的技能。对于会SQL、Python、Excel、R、SAS、SPSS、Hadoop肯定是很受欢迎的。
  7. 偏向大数据方向的会比较高薪,Hadoop,Spark,shell是能让你提高薪酬的技能。

总结

这个分析还是比较简单的,没有深入探究更多,数据分析师要求不仅是学历就可以的,岗位要求还有专业要求,扎实的数学和统计学基础等,这些都没有分析到。有待进一步分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279

推荐阅读更多精彩内容