Python拉勾职位信息数据分析

本篇基于上一篇“python爬取拉勾职位信息”文章中爬取到的拉勾的职位信息进行数据清洗,最后进行数据可视化分析

Posted by Yewbs on October 20, 2018

Title: View of the wharf at Nyholm with the crane and some warships
Creator: Christoffer Wilhelm Eckersberg
Creator Lifespan: 1783 - 1853
Creator Nationality: Danish
Creator Gender: Male
Creator Death Place: Copenhagen
Creator Birth Place: Blåkrog, Åbenrå
Date Created: 1826
Physical Dimensions: w32.4 x h19.6 cm
Type: Painting

本篇基于上一篇python爬取拉勾职位信息文章中爬取到的拉勾的职位信息进行数据清洗,最后进行数据可视化分析

需求

爬取数据只是第一步,真正的需求是对数据进行分析,得到我们想要的信息。在本次任务中,我想获取到成都机器学习算法岗位的相关的分析:

  • 薪资的分布情况
  • 薪资与区域分布
  • 薪资与学历关系
  • 薪资与工作年限关系
  • 提供岗位的吸睛点
  • 岗位的共性要求

问题

从上篇的获取到的数据来看,数据中存在影响本次分析的成分:

  • 实习岗位,薪资明显和正式岗位差距很大,不符合我的需求
  • 岗位薪资为区间,不便于进行数据分析展示
  • 工作年限有数字区间、应届生、不限等不统一格式
  • 其他数字字符混合的数据
  • 岗位要求数据格式混乱,标号不统一

解决方案

针对以上问题,先进行数据清洗:

  • 删除实习岗位
  • 薪资取区间的前25%,比较符合实际,也便于进行数据分析
  • 工作年限取区间中值,应届生、不限和其他均取0值
  • 规模取区间中值
  • 数据分析的时候对岗位要求删除标号、空格等特殊字符

代码实现与结果

数据清洗部分解析

1
2
3
4
import pandas as pd

file_name = "机器学习算法_成都.csv"
data = pd.read_csv(file_name)
  • 删除实习岗位
1
data.drop(data[data["职位"].str.contains("实习")].index, inplace=True)  # 删除实习岗位
  • 工资数据清洗:先把string类型转为数字类型,再取区间的前25%为当前职位的薪资
1
2
3
4
5
6
7
8
9
reg_num = '\\d+'  # 匹配数字正则表达式(由于博客使用正则搜索,为避免冲突,这里多写了一个转义符号)

data['薪资'] = data['薪资'].str.findall(reg_num)  # 过滤只剩数字(str类型的数字)
average_salary = []
for i in data['薪资']:
    salary_list = [int(j) for j in i]  # 转为int类型,并存入list
    average = salary_list[0] + 0.24 * (salary_list[1] - salary_list[0])
    average_salary.append(average)
data['薪资'] = average_salary
  • 工作年限数据清洗:有数字的取中间值,应届或者不限以及其他的取0
1
2
3
4
5
6
7
8
9
10
11
data['工作年限'] = data['工作年限'].str.findall(reg_num)
average_exp = []
for i in data['工作年限']:
    if len(i) == 0:
        average_exp.append(0)
    elif len(i) == 1:
        average_exp.append(int("".join(i)))
    else:
        exp_list = [int(j) for j in i]
        average_exp.append((exp_list[0]+exp_list[1])/2)
data['工作年限'] = average_exp
  • 规模数据清洗:有数字的取中间值,没有数字的统一”50”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
data['规模'] = data['规模'].str.findall(reg_num)
average_scale = []
for i in data['规模']:
    if len(i) == 0:
        average_scale.append(50)
    elif len(i) == 1:
        average_scale.append(int("".join(i)))
    else:
        scale_list = [int(j) for j in i]
        average_scale.append((scale_list[0]+scale_list[1])/2)
data['规模'] = average_scale

file2_name = "机器学习算法_成都_清洗后.csv"
data.to_csv(file2_name)

  • 输出结果

数据分析部分解析

1
2
3
4
5
6
from wordcloud import WordCloud
import jieba
import jieba.analyse
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
  • 定义词云分析并展示,将结果保存至图片
1
2
3
4
5
6
7
8
9
def wordcloud_analyze_show(data, output_name):
    words = jieba.cut(data, cut_all=True)
    words = " ".join(words)
    wc = WordCloud(font_path="simhei.ttf", collocations=False, width=1024, height=768, max_words=100)
    result = wc.generate(words)
    plt.imshow(result)
    plt.axis("off")
    plt.show()
    wc.to_file(output_name+".png")
  • 读取数据
1
2
3
file_name = "机器学习算法_成都_清洗后"

data = pd.read_csv(file_name + ".csv")
  • 对“岗位要求”列的数据进行数据整合和清洗,再进行词云分析
1
2
3
4
5
6
7
8
9
10
11
# 设定输出图形的大小
plt.rcParams['figure.figsize'] = (15, 10)

position_detail = data['岗位职责和要求']
position_detail_text = "".join(position_detail)
position_detail_text = position_detail_text.replace("职位描述", "").replace("任职要求", "").replace(
    ":", "").replace("岗位职责", "").replace("", "").replace(" ", "").replace("", "").replace(".", "").replace("·", "")
for i in range(10):
    position_detail_text = position_detail_text.replace(str(i), "")
    
wordcloud_analyze_show(position_detail_text, "岗位职责和要求")

岗位职责和要求

  • 对“职位诱惑”列的数据进行词云分析
1
2
advantages = " ".join(data["职位诱惑"])
wordcloud_analyze_show(advantages, "职位诱惑")

职位诱惑

  • 对薪资进行统计分析
1
2
3
4
5
6
# 设定输出图形的大小
plt.rcParams['figure.figsize'] = (15, 8)

sns.set(font='SimHei', style="white", palette="pastel", color_codes=True)
sns.distplot(data["薪资"])
sns.despine(left=True)

薪资

  • 将“学历”和薪资联合进行关联分析
1
2
sns.stripplot(x="学历", y="薪资", data=data)
sns.despine(left=True)

学历与薪资

  • 将“区域”和薪资联合进行关联分析
1
2
sns.stripplot(x="区域", y="薪资", data=data)
sns.despine(left=True)

区域与薪资

  • 将“工作年限”和薪资联合进行关联分析
1
2
sns.stripplot(x="工作年限", y="薪资", data=data)
sns.despine(left=True)

工作年限与薪资

完整代码

数据清洗

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import pandas as pd

def main():
    file_name = "机器学习算法_成都.csv"
    data = pd.read_csv(file_name)
    data.drop(data[data["职位"].str.contains("实习")].index, inplace=True)  # 删除实习岗位

    # 工资数据清洗
    reg_num = '\\d+'  # 匹配数字正则表达式(由于博客使用正则搜索,为避免冲突,这里多写了一个转义符号)
    data['薪资'] = data['薪资'].str.findall(reg_num)  # 过滤只剩数字(str类型的数字)
    average_salary = []
    for i in data['薪资']:
        salary_list = [int(j) for j in i]  # 转为int类型,并存入list
        average = salary_list[0] + 0.24 * (salary_list[1] - salary_list[0])
        average_salary.append(average)
    data['薪资'] = average_salary

    # 工作年限数据清洗
    data['工作年限'] = data['工作年限'].str.findall(reg_num)
    average_exp = []
    for i in data['工作年限']:
        if len(i) == 0:
            average_exp.append(0)
        elif len(i) == 1:
            average_exp.append(int("".join(i)))
        else:
            exp_list = [int(j) for j in i]
            average_exp.append((exp_list[0]+exp_list[1])/2)
    data['工作年限'] = average_exp

    # 规模数据清洗
    data['规模'] = data['规模'].str.findall(reg_num)
    average_scale = []
    for i in data['规模']:
        if len(i) == 0:
            average_scale.append(200)
        elif len(i) == 1:
            average_scale.append(int("".join(i)))
        else:
            scale_list = [int(j) for j in i]
            average_scale.append((scale_list[0]+scale_list[1])/2)
    data['规模'] = average_scale

    file2_name = "机器学习算法_成都_清洗后.csv"
    data.to_csv(file2_name)

main()

数据分析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
from wordcloud import WordCloud
import jieba
import jieba.analyse
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

def wordcloud_analyze_show(data, output_name):
    words = jieba.cut(data, cut_all=True)
    words = " ".join(words)
    wc = WordCloud(font_path="simhei.ttf", collocations=False, width=1024, height=768, max_words=100)
    result = wc.generate(words)
    plt.imshow(result)
    plt.axis("off")
    plt.show()
    wc.to_file(output_name+".png")

def main():
    file_name = "机器学习算法_成都_清洗后"
    data = pd.read_csv(file_name + ".csv")
    # 设定输出图形的大小
    plt.rcParams['figure.figsize'] = (15, 10)

    position_detail = data['岗位职责和要求']
    position_detail_text = "".join(position_detail)
    position_detail_text = position_detail_text.replace("职位描述", "").replace("任职要求", "")     .replace(":", "").replace("岗位职责", "").replace("", "").replace(" ", "").replace("",    "").replace(".", "").replace("·", "")
    for i in range(10):
        position_detail_text = position_detail_text.replace(str(i), "")

    # 输出岗位职责和要求的词云图
    wordcloud_analyze_show(position_detail_text, "岗位职责和要求")
    # 输出岗位职责和要求的词云图
    advantages = " ".join(data["职位诱惑"])
    wordcloud_analyze_show(advantages, "职位诱惑")
    # 设定输出图形的大小
    plt.rcParams['figure.figsize'] = (15, 8)
    # 对薪资进行统计分析
    sns.set(font='SimHei', style="white", palette="pastel", color_codes=True)
    sns.distplot(data["薪资"])
    sns.despine(left=True)
    # 将“学历”和薪资联合进行关联分析
    sns.stripplot(x="学历", y="薪资", data=data)
    sns.despine(left=True)
    # 将“区域”和薪资联合进行关联分析
    sns.stripplot(x="区域", y="薪资", data=data)
    sns.despine(left=True)
    # 将“工作年限”和薪资联合进行关联分析
    sns.stripplot(x="工作年限", y="薪资", data=data)
    sns.despine(left=True)

main()