Python 分析近2000条“数据分析”相关岗位招聘信息

准备阶段

前两天偶然看到 利用 Python 爬取了 13966 条运维招聘信息,我得出了哪些结论?这篇文章,觉得分析得很好,于是也想写一篇关于“数据分析”招聘信息的文章。

我照着作者的思路,开始了我的数据分析探索 biu~

数据获取

要获取数据的网站是前程无忧网

在网站中搜索关键词 “数据分析” ,即可看到所有与数据分析相关的招聘信息
在这里插入图片描述

这里显示有 2000 多页,实际上我期望的数据并没有这么多在这里插入图片描述
随机跳转到100页,看到招聘信息如下

在这里插入图片描述
所以本次只爬取前面几十页数据,以确保拿到的是我所需要的数据

接下来准备用以前的爬虫套路,用requests 、 Xpath 等工具开始提取数据,结果发现这个网页返回来的数据与以前的不一样,有点蒙逼了

仔细观察返回的数据(网页源代码),发现职位信息在‘window.__SEARCH_RESULT__ ’之后,‘’</scrip t>‘’之前,所以可以根据这个写出对应的正则表达式来提取数据

在这里插入图片描述

'window.__SEARCH_RESULT__ = (.*?)</script>'

用 Json 库进行解析

data = json.loads(
    re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', html)[0]
)
results = data['engine_search_result']

这里我将整个大字典提取出来
在这里插入图片描述
把它复制粘贴到 Json在线解析网站中,方便查看其结构

在这里插入图片描述
可以看到,每一页有50条招聘信息,每一条信息中包括了工作岗位、公司名称、工作地点等数据,接下来就可以逐一提取了
在这里插入图片描述
爬虫部分代码如下:

#接下来进行数据提取
def parse_one_page(results):
    for x in range(len(results)):
        try:
            # 公司名称
            company_name = results[x]['company_name']
            # 岗位名称
            job_name = results[x]['job_name']
            # 工作地点
            workarea = results[x]['workarea_text'][:2]
            # 工资
            providesalary = results[x]['providesalary_text']
            # 发布日期
            issuedate = results[x]['issuedate']
            # 经验、学历
            attribute = '/'.join(results[x]['attribute_text'])
            # 公司类型
            companytype = results[x]['companytype_text']
            # 公司规模
            companysize = results[x]['companysize_text']
            # 公司所属行业
            companyind = results[x]['companyind_text']
            # 公司待遇
            jobwelf = results[x]['jobwelf']
            # 工作详情
            job_href = results[x]['job_href']
            #解决乱码问题
            rr = requests.get(job_href,headers = headers)
            rr.encoding = 'gbk'
            con = rr.text
            con = etree.HTML(con)
            # 岗位详情
            aa  = con.xpath('//div[@class="bmsg job_msg inbox"]/p/text()')
            aa = ''.join([i.strip().replace('\xa0','') for i in aa])
            # 写入
            sheet.append([company_name, job_name, workarea,providesalary,issuedate,attribute,companytype,companysize,companyind,jobwelf,aa])
        except Exception:
            pass

def main(offset):
    # 构造主函数,初始化各个模块,传入入口URL
    url = base_url.format(offset)
    data = json.loads(
    re.findall('window.__SEARCH_RESULT__ = (.*?)</script>', get_one_page(url))[0])
    results = data['engine_search_result']
    # 为了反爬,设置睡眠时间
    time.sleep(1)
    parse_one_page(results)

需要完整代码的朋友请留言!

在这里插入图片描述
爬取结果如下

在这里插入图片描述

数据清洗

数据清洗部分是参考开头提到的文章中的代码

import pandas as pd
import numpy as np
import re
import jieba

df = pd.read_excel('info.xlsx')
df.head()

# 去重之前的记录数
print("去重之前的记录数",df.shape)
# 记录去重
df.drop_duplicates(subset=["公司名称","岗位名称","工作地点"],inplace=True)
# 去重之后的记录数
print("去重之后的记录数",df.shape)

去重之前的记录数 (2000, 10)
去重之后的记录数 (1988, 10)


对工资列进行处理

df["工资"].str[-1].value_counts()
df["工资"].str[-3].value_counts()

index1 = df["工资"].str[-1].isin(["年","月"])
index2 = df["工资"].str[-3].isin(["万","千"])
df = df[index1 & index2]
df["工资"].str[-3:].value_counts()

def get_money_max_min(x):
    try:
        if x[-3] == "万":
            z = [float(i)*10000 for i in re.findall("[0-9]+\.?[0-9]*",x)]
        elif x[-3] == "千":
            z = [float(i) * 1000 for i in re.findall("[0-9]+\.?[0-9]*", x)]
        if x[-1] == "年":
            z = [i/12 for i in z]
        return z
    except:
        return x

salary = df["工资"].apply(get_money_max_min)

df["最低工资"] = salary.str[0]
df["最高工资"] = salary.str[1]
df["工资水平"] = df[["最低工资","最高工资"]].mean(axis=1)

这里用平均值作为工资水平
在这里插入图片描述

对经验与学历字段的处理

df["学历"] = df["经验、学历"].apply(lambda x:re.findall("本科|大专|应届生|在校生|硕士|博士",x))
df["经验"] = df["经验、学历"].apply(lambda x:re.findall("无需经验|1年经验|2年经验|3-4年经验|5-7年经验",x))
df["招人数"] = df["经验、学历"].apply(lambda x:x[x.rfind('/')+1:])

def func(x):
    if len(x) == 0:
        return np.nan
    elif len(x) == 1 or len(x) == 2:
        return x[0]
    else:
        return x[2]
    
    
df["学历"] = df["学历"].apply(func)
df["经验"] = df["经验"].apply(func)

在这里插入图片描述

对公司规模字段的处理

def func(x):
    if x == '少于50人':
        return "<50"
    elif x == '50-150人':
        return "50-150"
    elif x == '150-500人':
        return '150-500'
    elif x == '500-1000人':
        return '500-1000'
    elif x == '1000-5000人':
        return '1000-5000'
    elif x == '5000-10000人':
        return '5000-10000'
    elif x == '10000人以上':
        return ">10000"
    else:
        return np.nan
    
df["公司规模"] = df["公司规模"].apply(func)

行业字段的处理

df["公司所属行业"] = df["公司所属行业"].apply(lambda x:re.sub(",","/",x))# 将 , 替换为 / 
df["公司所属行业"] = df["公司所属行业"].apply(lambda x:x.split("/")[0])
df["公司所属行业"].value_counts()

筛选出需要作图的数据

feature = ["公司名称","岗位名称","工作地点","工资水平","发布日期","公司规模","公司类型","公司所属行业","招人数","学历",'经验']
final_df = df[feature]
final_df.to_excel(r"可视化数据.xlsx",encoding="gbk",index=None)

在这里插入图片描述

数据可视化

基本的数据处理完毕后,就可以开始制图啦

首先,我先用前两天编制的程序,统计数据集每一列中不同值出现的次数

import pandas as pd
import os 
os.chdir(r'C:\Users\Administrator\Desktop')
df = pd.read_excel('可视化数据.xlsx')
def fun(df):
    dic = {}
    for i in df.columns:
        dic[i] = df[i].value_counts()
    return dic
dd = fun(df)

# 写入excel
import xlwt
f = xlwt.Workbook() #创建工作薄
sheet1 = f.add_sheet(u'sheet1',cell_overwrite_ok=True) #创建sheet
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 5  
 
style = xlwt.XFStyle()
style.pattern = pattern

al = xlwt.Alignment()
al.horz = 0x02 # 设置水平居中
al.vert = 0x01 # 设置垂直居中
style.alignment = al
# 获取字典的键
list_ = [k  for  k in  dd]
k=0
l=0
for s in range(len(dd)):
    l=k+1
    # 写入第一行
    sheet1.write_merge(0, 1, k, l,list_[s] , style)
    # 写入内容
    j = 2
    for v,h  in zip(dd[list_[s]],dd[list_[s]].index):
        sheet1.write(j,k,h) #循环写入 竖着写 
        sheet1.write(j,l,v) #循环写入 竖着写 
        j=j+1
    k=k+3
f.save('统计数据.xls')#保存文件

这些数据可以方便我在不同的工具中进行制图
在这里插入图片描述
在这里插入图片描述

有了这些数据就可以开始制图了,当然要说明的是,这里的分析非常浅显,还有很多不足,毕竟我还没有真正的接触实际的数据分析工作 T-T

(1)岗位名称

在所有爬取的数据中,数据分析师岗位的招聘信息最多,超过其余15个岗位的总和,当然,我认为这里列出来的岗位不严格的来说都算是数据分析师岗位;其次是数据分析专员、高级数据分析师、数据分析工程师、数据分析助理等。

除此之外,还出现与行业联系的岗位,比如销售数据分析、电商数据分析、临床数据分析、财务数据分析等等。
在这里插入图片描述

(2)工作地点

在工作地点的分布中,在广东省工作的岗位最多,远远超过其他城市,这其中广州和深圳的招聘信息较多;其次是上海、江苏、浙江。

对于在重庆工作的岗位并不多,处于中下水平,看来我以后去 “打工” ,要想机会多多得跑远一点了

import pandas as pd
import os
os.chdir(r'C:\Users\Administrator\Desktop')
df = pd.read_excel("可视化数据.xlsx")
df.head()
df1 = df[df["工作地点"] != "异地"]
df1.head()
area_data = {
        '北京': ['北京市','朝阳区', '海淀区', '通州区', '房山区', '丰台区', '昌平区', '大兴区', '顺义区', '西城区', '延庆县', '石景山区', '宣武区', '怀柔区', '崇文区', '密云县',
               '东城区', '门头沟区', '平谷区'],
        '广东':['广东省', '东莞市', '广州市', '中山市', '深圳市', '惠州市', '江门市', '珠海市', '汕头市', '佛山市', '湛江市', '河源市', '肇庆市','潮州市', '清远市', '韶关市', '揭阳市', '阳江市', '云浮市', '茂名市', '梅州市', '汕尾市'],
        '山东':['山东省', '济南市', '青岛市', '临沂市', '济宁市', '菏泽市', '烟台市','泰安市', '淄博市', '潍坊市', '日照市', '威海市', '滨州市', '东营市', '聊城市', '德州市', '莱芜市', '枣庄市'],
        '江苏':['江苏省', '苏州市', '徐州市', '盐城市', '无锡市','南京市', '南通市', '连云港市', '常州市', '扬州市', '镇江市', '淮安市', '泰州市', '宿迁市', '昆山市', '常熟市'],
        '河南':['河南省', '郑州市', '南阳市', '新乡市', '安阳市', '洛阳市', '信阳市','平顶山市', '周口市', '商丘市', '开封市', '焦作市', '驻马店市', '濮阳市', '三门峡市', '漯河市', '许昌市', '鹤壁市', '济源市'],
        '上海':['上海市', '松江区', '宝山区', '金山区','嘉定区', '南汇区', '青浦区', '浦东新区', '奉贤区', '闵行区', '徐汇区', '静安区', '黄浦区', '普陀区', '杨浦区', '虹口区', '闸北区', '长宁区', '崇明县', '卢湾区'],
        '河北':[ '河北省', '石家庄市', '唐山市', '保定市', '邯郸市', '邢台市', '河北区', '沧州市', '秦皇岛市', '张家口市', '衡水市', '廊坊市', '承德市'],
        '浙江':['浙江省', '温州市', '宁波市','杭州市', '台州市', '嘉兴市', '金华市', '湖州市', '绍兴市', '舟山市', '丽水市', '衢州市', '义务市'],
        '陕西':['陕西省', '西安市', '咸阳市', '宝鸡市', '汉中市', '渭南市','安康市', '榆林市', '商洛市', '延安市', '铜川市'],
        '湖南':[ '湖南省', '长沙市', '邵阳市', '常德市', '衡阳市', '株洲市', '湘潭市', '永州市', '岳阳市', '怀化市', '郴州市','娄底市', '益阳市', '张家界市', '湘西州'],
        '重庆':[  '重庆市', '江北区', '渝北区', '沙坪坝区', '九龙坡区', '万州区', '永川市', '南岸区', '酉阳县', '北碚区', '涪陵区', '秀山县', '巴南区', '渝中区', '石柱县', '忠县', '合川市', '大渡口区', '开县', '长寿区', '荣昌县', '云阳县', '梁平县', '潼南县', '江津市', '彭水县', '璧山县', '綦江县',
     '大足县', '黔江区', '巫溪县', '巫山县', '垫江县', '丰都县', '武隆县', '万盛区', '铜梁县', '南川区', '奉节县', '双桥区', '城口县'],
        '福建':['福建省', '漳州市', '泉州市','厦门市', '福州市', '莆田市', '宁德市', '三明市', '南平市', '龙岩市'],
        '天津':['天津市', '和平区', '北辰区', '河北区', '河西区', '西青区', '津南区', '东丽区', '武清区','宝坻区', '红桥区', '大港区', '汉沽区', '静海县', '宁河县', '塘沽区', '蓟县', '南开区', '河东区'],
        '云南':[ '云南省', '昆明市', '红河州', '大理州', '文山州', '德宏州', '曲靖市', '昭通市', '楚雄州', '保山市', '玉溪市', '丽江地区', '临沧地区', '思茅地区', '西双版纳州', '怒江州', '迪庆州'],
        '四川':['四川省', '成都市', '绵阳市', '广元市','达州市', '南充市', '德阳市', '广安市', '阿坝州', '巴中市', '遂宁市', '内江市', '凉山州', '攀枝花市', '乐山市', '自贡市', '泸州市', '雅安市', '宜宾市', '资阳市','眉山市', '甘孜州'],
        '广西':['广西壮族自治区', '贵港市', '玉林市', '北海市', '南宁市', '柳州市', '桂林市', '梧州市', '钦州市', '来宾市', '河池市', '百色市', '贺州市', '崇左市',  '防城港市'],
        '安徽':['安徽省', '芜湖市', '合肥市', '六安市', '宿州市', '阜阳市','安庆市', '马鞍山市', '蚌埠市', '淮北市', '淮南市', '宣城市', '黄山市', '铜陵市', '亳州市','池州市', '巢湖市', '滁州市'],
        '海南':['海南省', '三亚市', '海口市', '琼海市', '文昌市', '东方市', '昌江县', '陵水县', '乐东县', '五指山市', '保亭县', '澄迈县', '万宁市','儋州市', '临高县', '白沙县', '定安县', '琼中县', '屯昌县'],
        '江西':['江西省', '南昌市', '赣州市', '上饶市', '吉安市', '九江市', '新余市', '抚州市', '宜春市', '景德镇市', '萍乡市', '鹰潭市'],
        '湖北':['湖北省', '武汉市', '宜昌市', '襄樊市', '荆州市', '恩施州', '孝感市', '黄冈市', '十堰市', '咸宁市', '黄石市', '仙桃市', '随州市', '天门市', '荆门市', '潜江市', '鄂州市', '神农架林区'],
        '山西':['山西省', '太原市', '大同市', '运城市', '长治市', '晋城市', '忻州市', '临汾市', '吕梁市', '晋中市', '阳泉市', '朔州市'],
        '辽宁':['辽宁省', '大连市', '沈阳市', '丹东市', '辽阳市', '葫芦岛市', '锦州市', '朝阳市', '营口市', '鞍山市', '抚顺市', '阜新市', '本溪市', '盘锦市', '铁岭市'],
        '台湾':['台湾省','台北市', '高雄市', '台中市', '新竹市', '基隆市', '台南市', '嘉义市'],
        '黑龙江':['黑龙江', '齐齐哈尔市', '哈尔滨市', '大庆市', '佳木斯市', '双鸭山市', '牡丹江市', '鸡西市','黑河市', '绥化市', '鹤岗市', '伊春市', '大兴安岭地区', '七台河市'],
        '内蒙古':['内蒙古自治区', '赤峰市', '包头市', '通辽市', '呼和浩特市', '乌海市', '鄂尔多斯市', '呼伦贝尔市','兴安盟', '巴彦淖尔盟', '乌兰察布盟', '锡林郭勒盟', '阿拉善盟'],
        '香港':["香港","香港特别行政区"],
        '澳门':['澳门','澳门特别行政区'],
        '贵州':['贵州省', '贵阳市', '黔东南州', '黔南州', '遵义市', '黔西南州', '毕节地区', '铜仁地区','安顺市', '六盘水市'],
        '甘肃':['甘肃省', '兰州市', '天水市', '庆阳市', '武威市', '酒泉市', '张掖市', '陇南地区', '白银市', '定西地区', '平凉市', '嘉峪关市', '临夏回族自治州','金昌市', '甘南州'],
        '青海':['青海省', '西宁市', '海西州', '海东地区', '海北州', '果洛州', '玉树州', '黄南藏族自治州'],
        '新疆':['新疆','新疆维吾尔自治区', '乌鲁木齐市', '伊犁州', '昌吉州','石河子市', '哈密地区', '阿克苏地区', '巴音郭楞州', '喀什地区', '塔城地区', '克拉玛依市', '和田地区', '阿勒泰州', '吐鲁番地区', '阿拉尔市', '博尔塔拉州', '五家渠市',
     '克孜勒苏州', '图木舒克市'],
        '西藏':['西藏区', '拉萨市', '山南地区', '林芝地区', '日喀则地区', '阿里地区', '昌都地区', '那曲地区'],
        '吉林':['吉林省', '吉林市', '长春市', '白山市', '白城市','延边州', '松原市', '辽源市', '通化市', '四平市'],
        '宁夏':['宁夏回族自治区', '银川市', '吴忠市', '中卫市', '石嘴山市', '固原市']
    }

def func(x):
    for k,v in area_data.items():
            for i in v:
                if x in i:
                    return k
df1["省份"] = df1["工作地点"].apply(func)
Province = df1["省份"].value_counts().index.tolist()
data = df1["省份"].value_counts().values.tolist()
city_num = pd.DataFrame({'Province':Province,'data':data})
# 导入所需的库
import pandas as pd
import numpy as np
from plotnine import *
from pylab import mpl
import matplotlib.pyplot as plt
import matplotlib.patches as mpathes
from matplotlib.collections import PatchCollection
from matplotlib import cm, colors

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
 
# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
# 从 Excel 文件中读取数据
df = pd.read_excel('中国省份坐标.xlsx')

# 计算每个省份的中心坐标
df_center = df.groupby('Province').mean()
# 合并省份坐标和数据
dfxy = pd.merge(df_center, city_num, on='Province', how ='left')
dfxy.fillna(0,inplace=True)
# 定义颜色数值
color_value = np.array(dfxy.data)
# 使用「面向对象」的方法画图,定义图片的大小
fig, ax = plt.subplots(figsize=(16, 9))

# 设置背景颜色
fig.set_facecolor('w')
ax.set_facecolor('w')

# 设置标题
ax.set_title('\n岗位招聘地点的区域分布', loc='center', fontsize=26)
# 循环设置每个省份
patches = []
for Province in np.unique(df['Province']):
    # 筛选每个省份的数据
    dfp = df[df['Province'] == Province]
    
    # 多边形的每个位置
    rect = mpathes.Polygon([(x, y) for x, y in zip(dfp['x'], dfp['y'])])
    patches.append(rect)
    
    # 多边形内部显示省份名称和数据
    ax.text(df_center.loc[Province].x, df_center.loc[Province].y, 
            '\n'+Province+'\n'+'%d' % dfxy[dfxy['Province'] == Province].data.values[0], 
            fontsize=15, va='center', ha='center', color=c['深灰色'])
    
# 填充形状和颜色
collection = PatchCollection(patches, alpha=0.5, cmap=plt.cm.Oranges, ec=c['浅灰色'], fc='w', lw=1)
collection.set_array(color_value)
ax.add_collection(collection)

# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)

# 隐藏 X、Y 轴
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)

# 避免变形
plt.axis('equal')
plt.show()

在这里插入图片描述

取其中前四个数据进行制图

在这里插入图片描述

补充:

import pandas as pd
import numpy as np
import seaborn as sns
from pyecharts.charts import Pie
from pyecharts import options as opts
import matplotlib.pyplot as plt
sns.set_style('white',{'font.sans-serif':['simhei','Arial']})
pd.set_option("display.max_column", None)
pd.set_option("display.max_row",None)
import os


os.chdir(r'C:\Users\Administrator\Desktop')
df = pd.read_excel('可视化数据.xlsx')

city_list = ["北京","上海","深圳","广州","杭州","成都","南京","武汉","西安","厦门","长沙","苏州","天津"]
df = df[df['工作地点'].isin(city_list)]

fig, ax = plt.subplots(figsize=(12,8))
sns.countplot(y="工作地点",order= df["工作地点"].value_counts().index,data=df,color='#3c7f99')
plt.box(False)
fig.text(x=0.04, y=0.90, s='           各城市数据分析岗位的需求量           ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
plt.tick_params(axis='both', which='major', labelsize=16)
ax.xaxis.grid(which='both', linewidth=0.5, color='#3c7f99')
plt.xlabel('')
plt.ylabel('')

在这里插入图片描述

(3)公司所属行业

在爬取的所有招聘信息中,公司所属行业最多的是互联网行业,其次是计算机软件、服装、快速消费品…

额 ,看来各行各业都需要 “数据分析岗位” 啊
在这里插入图片描述
使用R语言制图

在这里插入图片描述

(4)工作经验要求

应聘 “数据分析” 相关岗位,公司要求的工作经验最多的是 1年的经验,其次是 3-4 年的经验…

对于我这种无经验的,是不是该去找找 “无需经验” 岗位 T_T

在这里插入图片描述

(5)公司规模情况

公司的规模最多的是 150 - 500 人,其次是 50-150人。
在这里插入图片描述

(7)学历要求

对于学历,大多数公司的最低要求是本科,其次是大专 。这里收集到的数据只有极少部分公司要求学历是硕士或者博士。

# 导入所需的库
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.image as image

# 正常显示中文标签
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 自动适应布局
mpl.rcParams.update({'figure.autolayout': True})
# 正常显示负号
mpl.rcParams['axes.unicode_minus'] = False
# 定义颜色,主色:蓝色,辅助色:灰色,互补色:橙色
c = {'蓝色':'#00589F', '深蓝色':'#003867', '浅蓝色':'#5D9BCF',
     '灰色':'#999999', '深灰色':'#666666', '浅灰色':'#CCCCCC',
     '橙色':'#F68F00', '深橙色':'#A05D00', '浅橙色':'#FBC171'}
# 定义数据
df = pd.DataFrame({'学历要求':['本科', '大专', '硕士','在校生', '博士'], '数量':[1064, 630, 55, 4,1]})
'''
  美国确诊人数  所花的天数
0  第一个百万     98
1  第二个百万     42
2  第三个百万     30
3  第四个百万     16
'''
# 画图用的数据定义
x = df['学历要求']
y = df['数量']
# 使用「面向对象」的方法画图
fig, ax = plt.subplots(figsize=(8, 6))
# 设置标题
ax.set_title('\n 不同学历要求分布\n', fontsize=28, loc='center', color=c['深灰色'])
# 画柱形图
ax.bar(x, y, width=0.6, color=c['蓝色'])
# 用箭头强调对比的关系
ax.annotate('', xy=(4, 200), xytext=(0.5, 1064), arrowprops=dict(color=c['橙色'], connectionstyle="arc3,rad=0.25"))
# 设置数据标签
for a, b in zip(x, y):
    ax.text(a, b, '%.0f' % b, ha='center', va= 'bottom', fontsize=22, color=c['深灰色'])
# 隐藏边框
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_visible(False)
ax.spines['left'].set_visible(False)
# 隐藏 X 轴的刻度线
ax.tick_params(axis='x', which='major', length=0)
# 隐藏 Y 轴刻度
ax.set_yticks([])
# 设置坐标标签字体大小和颜色
ax.tick_params(labelsize=20, colors=c['深灰色'])
plt.show()

在这里插入图片描述

(8)公司类型

这里获得的数据显示大部分公司都是民营企业,数量远超其他公司类型。
在这里插入图片描述

(9)招收人数

在 “数据分析”岗位招聘信息中,大多数公司只招收1人,其次是招两人,看来竞争很激烈啊。
在这里插入图片描述

(10)岗位职责和任职要求数据词云分析

因每个招聘职位下的描述都不相同,网页结构也不同,所以我这里将岗位职责与任职要求这两个文本数据混合做词云图,但是最好是分开分析。

# 词云图
import jieba
import pandas as pd
import stylecloud
import matplotlib.pyplot as plt
import numpy as np

df = pd.read_excel('C:\\Users\\Administrator\\Desktop\\info.xlsx')


def get_cut_words(content_series):
    # 读入停用词表
    stop_words = [] 

    with open(r"C:\\Users\\Administrator\\Desktop\\chineseStopWords.txt", 'r') as f:
        lines = f.readlines()
        for line in lines:
            stop_words.append(line.strip())
    # 添加关键词
    my_words = ['5G', 'CPS', '高速公路', '人工智能', '数字孪生体','工业大数据','智能大数据']    
    for i in my_words:
        jieba.add_word(i) 
    # 自定义停用词
    my_stop_words = ['岗位职能', '任职要求', '岗位', '任职', '...','一个','集团'
                    '1', '签署', '相关', '数据分析', '岗位职责','协议', '首个',
                    '巴基斯坦', '印尼', '集团', '提供', '国家','市场','首次','改造'
                    ]   
    stop_words.extend(my_stop_words)               
    # 分词
    content=';'.join([ str(c) for c in content_series.tolist()])
    word_num = jieba.lcut(content)
    # 条件筛选
    word_num_selected = [i for i in word_num if i not in stop_words and len(i)>=2]
    return word_num_selected
text1 = get_cut_words(content_series=df['岗位详情'])

from stylecloud import gen_stylecloud
result = " ".join(text1)
gen_stylecloud(text=result,
               font_path='C:\\Windows\\Fonts\\STKAITI.TTF',
               # icon_name='fas fa-envira',
               icon_name='fas fa-cannabis',  
               max_words=150,
               max_font_size=70,
               output_name='C:\\Users\\Administrator\\Desktop\\t11.png',
               ) #必须加中文字体,否则格式错误

在这里插入图片描述

工资水平

fig,ax = plt.subplots(figsize=(12,8))
city_order = df.groupby("工作地点")["工资水平"].mean().sort_values().index.tolist()
sns.barplot(x="工作地点", y="工资水平", order=city_order, data=df, ci=95,palette="RdBu_r")
fig.text(x=0.04, y=0.90, s='              各城市的薪资水平对比              ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#3c7f99')
plt.tick_params(axis="both",labelsize=16,)
ax.yaxis.grid(which='both', linewidth=0.5, color='black')
# ax.set_yticklabels([" ","5k","10k","15k","20k"])
plt.box(False)
plt.xlabel('')
plt.ylabel('')

在这里插入图片描述

一线城市的薪资分布对比

fig,ax = plt.subplots(figsize=(12,8))
fig.text(x=0.04, y=0.90, s='           一线城市的薪资分布对比             ', 
         fontsize=32, weight='bold', color='white', backgroundcolor='#c5b783')
sns.kdeplot(df[df["工作地点"]=='北京']["工资水平"],shade=True,label="北京")
sns.kdeplot(df[df["工作地点"]=='上海']["工资水平"],shade=True,label="上海")
sns.kdeplot(df[df["工作地点"]=='广州']["工资水平"],shade=True,label="广州")
sns.kdeplot(df[df["工作地点"]=='深圳']["工资水平"],shade=True,label="深圳")
plt.tick_params(axis='both', which='major', labelsize=16)
plt.box(False)
# plt.xticks(np.arange(0,61,10), [str(i)+"k" for i in range(0,61,10)])
plt.yticks([])
plt.legend(fontsize = 'xx-large',fancybox=None)

在这里插入图片描述

Pyecharts绘图

利用Pyecharts也可以进行数据可视化,基本的需求都能满足,这里我主要是参考文章开头提及的博客代码进行制图。

(1)热门行业的用人需求Top10

在这里插入图片描述

(2)热门城市的岗位数量Top10

在这里插入图片描述

(3)岗位分布

在这里插入图片描述

(4)不同公司规模的用人情况

在这里插入图片描述

(5)排名前10的工作地点的平均薪资

在这里插入图片描述

(6)排名前20的岗位的平均薪资

在这里插入图片描述

(7)不同学历要求分布

在这里插入图片描述

(8)岗位职能与任职要求词云图

在这里插入图片描述

最后,做了一个非常简单的组合

在这里插入图片描述


针对所做的内容,进行简单的总结:

  1. 数据爬取得较少,可能不能反映真实情况;
  2. 数据处理较为粗糙,没有细致挖掘其中的信息;
  3. 可以像原博一样做一个可视化大屏,更好的呈现数据
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值