【数据预处理&机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究
982
【数据预处理&机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究 稗子酿的酒 2023-03-22 11:33:53

一.需求背景

课题中心:招聘网站的职位招聘数据预处理

之前的文章,我们已经对职位薪资数据进行了爬取(9000条)数据,然后进行了数据的清洗,最终得到了4000条有效数据。

具体需求:

  • 按不同的类别划分职位中的薪酬数据,画盒图/箱线图,检查孤立点/离群点;
  • 使用分位数图、分位数-分位数图方法处理数据;

本次任务的结构图:

技术要点:
爬虫库(Beautifulsoup、requests-html、Scrapy)、数据预处理(python、kettle)、数据可视化(matplotlib、pyecharts、tebleau)、python-web框架(Flask)

二. 任务开始

2.1 薪酬的中位数、均值和众数和数据倾斜模块详细设计

已Java为例,python和Go类似流程:

1.经过过去的爬虫和数据清理等步骤,我们得到了4000条左右的有效数据,我们先将其读取进来:

data = pd.read_csv("A-06-最终有效数据.csv",encoding="gbk")

2.以Java为例:我们使用关键词“java”对数据进行筛选,循环筛选过程中将职位名,薪资需要的关键字放到列表里面,然后存入字典里,经过pandas的处理:

xingzhi={}
zhiwei = []
xin1 = []
xin2 =[]
for i in range(len(data)):
    if "java" in data.iloc[i]['职位名']:
        a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
        # print(data.iloc[i]['职位名'])
        zhiwei.append(data.iloc[i]['职位名'])
        xin1.append(int(a[0]))
        xin2.append(int(a[1]))
xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
df = pd.DataFrame(xingzhi)

2.输出题目要求的均值,中位数和众数:

print("java职位最低薪资的均值为:",df['最低薪资'].mean())
print("java职位最高薪资的均值为:",df['最高薪资'].mean())
print("java职位最低薪资的中位数为:",df['最低薪资'].median())
print("java职位最高薪资的中位数为:",df['最高薪资'].median())
print('java职位最低薪资的众数:', df['最低薪资'].mode())
print('java职位最高薪资的众数:', df['最高薪资'].mode())

3.输出效果如下:

4.指定默认字体:解决plot不能显示中文问题,解决保存图像是负号'-'显示为方块的问题。

mpl.rcParams['font.sans-serif'] = ['STZhongsong']
mpl.rcParams['axes.unicode_minus'] = False

5.对x和y轴数据进行规范化,x轴使用数据的长度循环列表

import matplotlib.pyplot as plt
y1=xin1
x1=range(0,df['最低薪资'].count())
x2=range(0, df['最高薪资'].count())
y2=xin2
fig = plt.figure()
plt.subplot(2,1,1)
plt.bar(x1,y1, color="green")
plt.ylabel('薪资,单位K')
plt.title('java岗位的薪资情况(最低薪资-最高薪资)')
plt.subplot(2,1,2)
plt.bar(x2,y2, color="red")
plt.xlabel('公司个数')
plt.ylabel('薪资,单位K')
# plt.title('java岗位的薪资情况(最低薪资-最高薪资)')
plt.legend()
plt.show()

6.显示效果:

7.计算结果:

java职位:
java职位最低薪资的均值为: 15.938611789326822
java职位最高薪资的均值为: 26.44890129054761
java职位最低薪资的中位数为: 15.0
java职位最高薪资的中位数为: 25.0
java职位最低薪资的众数: 0 15
Name: 最低薪资, dtype: int64
java职位最高薪资的众数: 0 30
Name: 最高薪资, dtype: int64
python职位:
python职位最低薪资的均值为: 13.84330985915493
python职位最高薪资的均值为: 24.184859154929576
python职位最低薪资的中位数为: 15.0
python职位最高薪资的中位数为: 25.0
python职位最低薪资的众数: 0 15
Name: 最低薪资, dtype: int64
python职位最高薪资的众数: 0 30
Name: 最高薪资, dtype: int64
Go职位:
Go职位最低薪资的均值为: 19.64329268292683
Go职位最高薪资的均值为: 34.707317073170735
Go职位最低薪资的中位数为: 19.0
Go职位最高薪资的中位数为: 30.0
Go职位最低薪资的众数: 0 15
Name: 最低薪资, dtype: int64
Go职位最高薪资的众数: 0 30
Name: 最高薪资, dtype: int64

2.2 按不同的类别划分职位中的薪酬数据,画盒图/箱线图,检查孤立点/离群点

1.与上文一样,我们使用关键词“java”对数据进行筛选,循环筛选过程中将职位名,薪资需要的关键字放到列表里面,然后存入字典里,经过pandas的处理:
将上限和下限分别处理:

xingzhi={}
zhiwei = []
xin1 = []
xin2 =[]
for i in range(len(data)):
    if "java" in data.iloc[i]['职位名']:
        a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
        # print(data.iloc[i]['职位名'])
        zhiwei.append(data.iloc[i]['职位名'])
        xin1.append(int(a[0]))
        xin2.append(int(a[1]))
xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
df = pd.DataFrame(xingzhi)

labels = 'Java职位工资下限', 'Java职位工资上限'
A = xin1
B = xin2

2.开始画图,将上面传入的进行处理

plt.grid(True)  # 显示网格
plt.boxplot([A, B],
            medianprops={'color': 'red', 'linewidth': 1.5},
            meanline=True,
            showmeans=True,
            meanprops={'color': 'blue', 'ls': '--', 'linewidth': 1.5},
            flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
            labels=labels)
plt.yticks()
plt.show()

3.Python和GO语言的类似,如下:(GO语言代码省略不写)与这几个大致相同。

xingzhi={}
zhiwei = []
xin1 = []
xin2 =[]
for i in range(len(data)):
    if "python" in data.iloc[i]['职位名']:
        a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
        zhiwei.append(data.iloc[i]['职位名'])
        xin1.append(int(a[0]))
        xin2.append(int(a[1]))
xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
df = pd.DataFrame(xingzhi)
labels = 'python职位工资下限', 'python职位工资上限'
A = xin1
B = xin2
plt.grid(True)  # 显示网格
plt.boxplot([A, B],
            medianprops={'color': 'red', 'linewidth': 1.5},
            meanline=True,showmeans=True,
            meanprops={'color': 'blue', 'ls': '--', 'linewidth': 1.5},
            flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
            labels=labels)
plt.yticks()
plt.show()

4.运行结果如下:

后面的任务会还会发布相关的文章。

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 点赞 收藏 评论 打赏
评论
0个
时间排序
内容存在敏感词
手气红包
    0 条记录 第 0 /
    相关专栏
    置顶时间设置
    结束时间
    删除原因
    • 广告/SPAM
    • 恶意灌水
    • 违规内容
    • 文不对题
    • 重复发帖
    打赏作者
    易百纳技术社区
    稗子酿的酒
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

    感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

    举报反馈

    举报类型

    • 内容涉黄/赌/毒
    • 内容侵权/抄袭
    • 政治相关
    • 涉嫌广告
    • 侮辱谩骂
    • 其他

    详细说明

    审核成功

    发布时间设置
    发布时间:
    是否关联周任务-专栏模块

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    每周任务
      去完成
      活动规则
      易百纳技术社区
      升级提醒
      升级

      恭喜您的社区称号由 升级为 “社区游民”

      同时为了感谢您对社区的支持,我们将送出xxx礼品一份, 记得领取哦~

      升级提醒
      易百纳技术社区

      惊喜礼包

      拼手气红包 红包规则
      祝福语
      恭喜发财,大吉大利!
      红包金额
      红包最小金额不能低于5元
      红包数量
      红包数量范围10~50个
      余额支付
      当前余额:
      可前往问答、专栏板块获取收益 去获取
      取 消 确 定

      小包子的红包

      恭喜发财,大吉大利

      已领取20/40,共1.6元 红包规则

        avatar