首页 > 其他分享 >【数据预处理&机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究

【数据预处理&机器学习】对于薪资数据的倾斜情况以及盒图离群点的探究

时间:2023-04-28 23:32:52浏览次数:37  
标签:plt java python 盒图 职位 离群 薪资 data

一.需求背景

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

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

具体需求:

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

本次任务的结构图:

image.png

技术要点: 爬虫库(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.输出效果如下:

image-20221215123325744

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.显示效果:

img

img

img

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.运行结果如下:

img

img

img

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

标签:plt,java,python,盒图,职位,离群,薪资,data
From: https://blog.51cto.com/u_15568258/6235814

相关文章