项目:对招聘数据进行分析和可视化处理-工资数据

目标是在上节课爬虫基础上,利用爬取的csv格式文件中的数据进行工资数据分析。
效果图:
alt text
附加:饼图呈现“岗位所在行业(前10)”

image-20-wjyi.png

步骤一:导入必要的库

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

这些库用于数据处理和可视化:

  • pandas 用于数据读取和处理。
  • matplotlib 和 seaborn 用于绘制图表。
  • numpy 用于数值计算。

步骤二:读取CSV文件

文件名称根据实际情况进行修改

df = pd.read_csv('爬虫岗位招聘信息.csv')

读取包含爬虫岗位招聘信息的CSV文件,存储在DataFrame df 中。
csv数据内容如下:
alt text

步骤三:将薪资转换为数值型并计算月薪

原先数据为年薪数据,为能直观展现数据,需要将年薪转换为月薪

df['薪资'] = df['薪资'].astype(int)
df['月薪'] = df['薪资'] / 12

alt text

创建薪资区间并计算每个区间的频数

即使统计完月薪数据,但月薪仍旧处于“离散”状态。我们需要通过区间将离散的月薪进行归类。

bins = np.arange(3000, df['月薪'].max() , 1000)
df['薪资区间'] = pd.cut(df['月薪'], bins)
salary_counts = df['薪资区间'].value_counts().sort_index()

bins变量为薪资区间,使用np生成等差数列,最小为3000,每次增加1000,最大到工资最大值。
使用 pd.cut 将月薪数据分配到这些区间中。其中:

  • df['薪资区间']: 这是一个新的列名,我们将使用它来存储每个月薪所属的区间。
  • pd.cut(): 这是pandas的一个函数,用于将数据划分成离散的区间。
  • df['月薪']: 这是我们想要分割的数据列,即月薪数据。

salary_counts = df['薪资区间'].value_counts().sort_index()作用是计算每个区间的频数,并按区间排序。

  • df['薪资区间']: 这是之前通过pd.cut()函数创建的新列,其中存储了每个月薪所属的区间。
  • .value_counts(): 这是一个 pandas 函数,用于计算每个唯一值出现的频数。在这里,它会计算每个区间出现的次数,也就是每个区间内有多少个月薪数据点。
  • .sort_index(): 这个方法用于对结果进行排序,因为value_counts()默认是按照频数进行排序,但在这里我们想要按照区间的顺序进行排序,所以使用了sort_index()来实现这一点。

alt text

过滤频数较少的区间

如上图,会发现实际操作中会出现一些频数非常少的空间。
这些在统计中是没有意义的。需要进行过滤。

threshold = 3  # 设定阈值,去除频数小于3的区间
filtered_salary_counts = salary_counts[salary_counts > threshold]

绘制折线图

设置字体

plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

绘制图

plt.figure(figsize=(12, 8))
plt.plot(filtered_salary_counts.index.astype(str), filtered_salary_counts.values)
plt.title('月薪分布', fontsize=16)
plt.xlabel('月薪区间(元)', fontsize=14)
plt.ylabel('岗位数量', fontsize=14)
plt.xticks( fontsize=12)
plt.yticks(fontsize=12)
plt.grid(True)
plt.show()

其中关键语句为 plt.plot(filtered_salary_counts.index.astype(str), filtered_salary_counts.values)
filtered_salary_counts.index.astype(str)内容为filtered_salary_counts这个df的index也就是区间名称
filtered_salary_counts.values内容为filtered_salary_counts这个df的value也就是频数
图解如下:
alt text

完成效果如下:
alt text
问题主要在X轴标签内容,由于显示的是df的index,内容既不合适也太长。我们需要对其进行处理。

修改X轴标签

# 自定义设置X轴刻度
custom_xticks = []
for interval in filtered_salary_counts.index:
    left_value = int(interval.left) // 1000  # 左边界值(取整并转换为千)
    right_value = int(interval.right) // 1000  # 右边界值(取整并转换为千)
    label = '{}k-{}k'.format(left_value, right_value)  # 构建标签
    custom_xticks.append(label)

plt.xticks(filtered_salary_counts.index.astype(str), custom_xticks, fontsize=12)

重点解释:
label = '{}k-{}k'.format(left_value, right_value)

  • {} 是一个占位符,用来表示后续 format() 方法中的变量会填充的位置。
  • format(left_value, right_value) 是 format() 方法的调用,它会将 left_value 和 right_value 的值填充到字符串中的相应位置。
  • left_value 和 right_value 分别代表区间的左边界值和右边界值。
  • '{}k-{}k' 是一个包含了两个占位符的字符串,其中 k 是表示千的单位。

假设 left_value 的值是 3,right_value 的值是 5,那么 format() 方法就会将这两个值填充到字符串中的占位符位置上,得到的 label 就是 '3k-5k'。

plt.xticks(filtered_salary_counts.index.astype(str), custom_xticks, fontsize=12)
这行代码是用来设置X轴的刻度标签的

  • filtered_salary_counts.index.astype(str): 这部分是指定X轴刻度的位置。
  • custom_xticks: 这是指定X轴刻度的标签文本。在这里,custom_xticks 是一个列表,包含了我们自定义生成的刻度标签文本。每个标签文本代表一个区间的范围。

结果

alt text

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 设置字体和负号显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体

# 读取CSV文件
df = pd.read_csv('爬虫岗位招聘信息.csv')

# 将薪资转换为数值型(假设薪资单位是元)
df['薪资'] = df['薪资'].astype(int)
df['月薪'] = df['薪资'] / 12
print(df['月薪'] )
# 创建薪资区间并计算每个区间的频数
bins = np.arange(3000, df['月薪'].max(), 1000)
df['薪资区间'] = pd.cut(df['月薪'], bins)
salary_counts = df['薪资区间'].value_counts().sort_index()

# 设置阈值,去除频数较少的区间
threshold = 3  # 例如,频数小于3的区间将被去除
filtered_salary_counts = salary_counts[salary_counts > threshold]
print(salary_counts)
# 绘制折线图
plt.figure(figsize=(12, 8))
plt.plot(filtered_salary_counts.index.astype(str), filtered_salary_counts.values)
plt.title('月薪分布', fontsize=16)
plt.xlabel('月薪区间(元)', fontsize=14)
plt.ylabel('岗位数量', fontsize=14)

# 自定义设置X轴刻度
custom_xticks = []
for interval in filtered_salary_counts.index:
    left_value = int(interval.left) // 1000  # 左边界值(取整并转换为千)
    right_value = int(interval.right) // 1000  # 右边界值(取整并转换为千)
    label = '{}k-{}k'.format(left_value, right_value)  # 构建标签
    custom_xticks.append(label)

plt.xticks(filtered_salary_counts.index.astype(str), custom_xticks, fontsize=12)

plt.yticks(fontsize=12)
plt.grid(True)
plt.show()

附加:饼图呈现“岗位所在行业(前10)”

image-20-wjyi.png

industry_demand = df['行业'].value_counts().head(10)

# 绘制饼图
plt.figure(figsize=(10, 6))
plt.pie(industry_demand.values, labels=industry_demand.index, autopct='%1.1f%%', )
plt.title('岗位所在行业(前10)', fontsize=16)

# 显示图形
plt.axis('equal')  # 使饼图比例相等,呈现圆形
plt.show()

plt.pie() 参数解释:

  • x:用于绘制饼图的数据,通常是一个数组或 Series。
  • labels:用于指定每个扇形部分的标签,通常是一个包含字符串的列表或数组,与数据 x 的长度相同。
  • autopct:可选参数,用于控制显示在每个扇形部分中的百分比格式。'%1.1f%%' 表示显示小数点后一位的百分比格式。
    在这个特定的 plt.pie() 调用中,industry_demand.values 是岗位数量数据,industry_demand.index 是行业标签,autopct='%1.1f%%' 用于显示百分比。