【数据预处理&机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究
611 打赏
【数据预处理&机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究 上进小菜猪 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条左右的有效数据,我们先将其读取进来:

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

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

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

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

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

3.输出效果如下:

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

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

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

  1. import matplotlib.pyplot as plt
  2. y1=xin1
  3. x1=range(0,df['最低薪资'].count())
  4. x2=range(0, df['最高薪资'].count())
  5. y2=xin2
  6. fig = plt.figure()
  7. plt.subplot(2,1,1)
  8. plt.bar(x1,y1, color="green")
  9. plt.ylabel('薪资,单位K')
  10. plt.title('java岗位的薪资情况(最低薪资-最高薪资)')
  11. plt.subplot(2,1,2)
  12. plt.bar(x2,y2, color="red")
  13. plt.xlabel('公司个数')
  14. plt.ylabel('薪资,单位K')
  15. # plt.title('java岗位的薪资情况(最低薪资-最高薪资)')
  16. plt.legend()
  17. 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的处理:
将上限和下限分别处理:

  1. xingzhi={}
  2. zhiwei = []
  3. xin1 = []
  4. xin2 =[]
  5. for i in range(len(data)):
  6. if "java" in data.iloc[i]['职位名']:
  7. a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
  8. # print(data.iloc[i]['职位名'])
  9. zhiwei.append(data.iloc[i]['职位名'])
  10. xin1.append(int(a[0]))
  11. xin2.append(int(a[1]))
  12. xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
  13. df = pd.DataFrame(xingzhi)
  14. labels = 'Java职位工资下限', 'Java职位工资上限'
  15. A = xin1
  16. B = xin2

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

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

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

  1. xingzhi={}
  2. zhiwei = []
  3. xin1 = []
  4. xin2 =[]
  5. for i in range(len(data)):
  6. if "python" in data.iloc[i]['职位名']:
  7. a = re.findall("\d+\.?\d*", data.iloc[i]['薪资'])
  8. zhiwei.append(data.iloc[i]['职位名'])
  9. xin1.append(int(a[0]))
  10. xin2.append(int(a[1]))
  11. xingzhi={"职位名":zhiwei,'最低薪资':xin1,'最高薪资':xin2}
  12. df = pd.DataFrame(xingzhi)
  13. labels = 'python职位工资下限', 'python职位工资上限'
  14. A = xin1
  15. B = xin2
  16. plt.grid(True) # 显示网格
  17. plt.boxplot([A, B],
  18. medianprops={'color': 'red', 'linewidth': 1.5},
  19. meanline=True,showmeans=True,
  20. meanprops={'color': 'blue', 'ls': '--', 'linewidth': 1.5},
  21. flierprops={"marker": "o", "markerfacecolor": "red", "markersize": 10},
  22. labels=labels)
  23. plt.yticks()
  24. plt.show()

4.运行结果如下:

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

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
评论
0个
时间排序
内容存在敏感词
    0 条记录 第 0 /
    相关专栏
    打赏作者
    易百纳技术社区
    上进小菜猪
    您的支持将鼓励我继续创作!
    打赏金额:
    ¥1 易百纳技术社区
    ¥5 易百纳技术社区
    ¥10 易百纳技术社区
    ¥50 易百纳技术社区
    ¥100 易百纳技术社区
    支付方式:
    微信支付
    支付宝支付
    易百纳技术社区 微信支付
    易百纳技术社区
    打赏成功!

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

    举报反馈

    举报类型

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

    详细说明

    审核成功

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

    审核失败

    失败原因
    备注
    Loading...
    易百纳技术社区
    确定要删除此文章、专栏、评论吗?
    确定
    取消
    易百纳技术社区
    易百纳技术社区
    在专栏模块发布专栏,可获得其他E友的打赏
    易百纳技术社区
    回答悬赏问答,被题主采纳后即可获得悬赏金
    易百纳技术社区
    在上传资料时,有价值的资料可设置为付费资源
    易百纳技术社区
    达到一定金额,收益即可提现~
    收益也可用来充值ebc,下载资料、兑换礼品更容易
    易百纳技术社区
    活动规则
    • 1.周任务为周期性任务,每周周一00:00刷新,上周完成的任务不会累计到本周,本周需要从头开始任务,当前任务完成后才可以完成下一个任务
    • 2.发布的专栏与资料需要与平台的板块有相关性,禁止注水,专栏/资料任务以审核通过的篇数为准,专栏需为原创文章且首次在社区发布
    • 3.任务完成后,现金奖励直接打款到微信账户;EBC/收益将自动发放到个人账户,可前往“我的钱包”查看;其他奖励请联系客服兑换
    易百纳技术社区
    升级提醒
    升级

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

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

    升级提醒
    易百纳技术社区