1.数据获取
我是在招聘网站上爬取了我们需要的数据信息,部分数据截图如下:
不会爬虫的可以去我的python专栏里查看,那里有详细的过程。
2.分析内容
1).数据分析岗位在不同行业的需求情况
2).数据分析岗位在不同地区的需求情况
3).数据分析岗位对学历的要求
4).数据分析岗位对工作经验的要求
5).数据分析岗位薪资与学历的关系
6).数据分析岗位薪资与工作经验的关系
3.步骤
3.1数据预处理
1)去除不是数据分析的岗位
print('原数据行数:', len(df))
# 调用pandas的字符串方法只需先调用.str,后续具体的方法与普通字符串方法基本相同
df = df[df['jobName'].str.contains('数据分析')]
print('剔除后的数据行数:', len(df))
2)将details字段分为city、exp、edulevel三列
df['details'] = df['details'].str.strip("[")
df['details'] = df['details'].str.strip("]")
city = df['details'].str.split(',').str[0]
exp = df['details'].str.split(',').str[1]
edulevel = df['details'].str.split(',').str[2]
df['city'] = city.str.split("-").str[0] # ’广州-番禺区‘ 只要广州
df['city'] = df['city'].str.replace("\'", '') # 去除单引号
df['exp'] = exp
df['exp'] = df['exp'].str.replace("\'", '') # 去除单引号
df['edulevel'] = edulevel
df['edulevel'] = df['edulevel'].str.replace("\'", '') # 去除单引号
print(df)
3)薪资取平均值
本文爬取的薪资数据格式如下所示,它主要包括三种形式:x千-x万、x-x千、x-x万。
我统一将其改成 x,x万 的格式。
# 去除没有工资的行,否则后面会报错
df = df.dropna()
df['salary'] = df['salary'].str.split('-')
def modifysalary(x):
if(('千' in x[0]) & ('万' in x[1])): # 8k-1万
x[0] = float(x[0][0]) / 10
elif('千' in x[1]): # 5-6千
x[0] = float(x[0][0]) / 10
s = list(x[1]) # 在Python中,字符串是不可变类型,即无法直接修改字符串的某一位字符。将字符串转换成列表后修改值,然后用join组成新字符串
s[0] = str(float(s[0]) / 10)
s[1] = '万'
x[1] = ''.join(s)
else:
return x
return x
# 得到薪资区间
df['salary'] = df['salary'].map(modifysalary)
为了方便可视化,我们把平均工资算出来
def salary_avg(x):
result = (float(x[0]) + float(x[1][0])) / 2 * 10
return str(result) + 'k'
# 得到平均薪资
df['salary_avg'] = df['salary'].map(salary_avg)
# print(df[['salary', 'salary_avg']])
4)删除不需要的字段,并重命名字段
columns = ['jobName', 'company', 'city', 'company_type', 'edulevel', 'exp', 'salary_avg']
df = df[columns]
5)数据清洗后的数据
6)保存清洗后的数据以便以后使用
df.to_csv('./finaljobRequirement.csv', index=None)
3.2数据分析及可视化
1)数据分析岗位在不同行业的需求情况
可视化:我们选取了排名前30的行业进行可视化
代码:
all_type = {}
for i in df['job_type'].str.split('/'):
for j in i:
if not j in all_type.keys():
all_type[j] = 1
else:
all_type[j] += 1
df1 = pd.Series(all_type).sort_values(ascending=False).iloc[:30]
df1.plot(kind='barh')
# 显示标签数据
for a, b in enumerate(df1):
plt.text(b+1, a-0.5, b, ha='center', va='bottom')
plt.show()
2) 数据分析岗位在不同地区的需求情况
可视化:我们选取了排名前10的地区
代码:
df2 = ff.groupby('city')['jobName'].count().sort_values(ascending=False).iloc[:10]
# print(df2)
df2.plot(kind='bar')
plt.xticks(rotation=360)
plt.grid(alpha=0.7, axis='y', ls='-.')
plt.ylabel('count')
for a, b in enumerate(df2):
plt.text(a, b, b, ha='center', va='bottom')
plt.show()
3).数据分析岗位对学历的要求
可视化:
代码:
df3 = ff.groupby('edulevel')['jobName'].count().sort_values(ascending=False)
df3.plot(kind='bar')
for a, b in enumerate(df3):
plt.text(a, b, b, ha='center', va='bottom')
plt.xticks(rotation=360)
plt.show()
4).数据分析岗位对工作经验的要求
可视化:
代码:
df4 = ff.groupby('exp')['jobName'].count().reset_index()
plt.pie(df4['jobName'], labels=df4['exp'], autopct='%3.2f%%', startangle=90, pctdistance=0.6)
plt.axis('equal')
plt.show()
5).数据分析岗位薪资与学历的关系
可视化:
代码:
def salary_mean(arr):
return arr.sum() / arr.count()
ff['salary_avg'] = ff['salary_avg'].str[:-1].astype(float)
df5 = ff.groupby('edulevel')['salary_avg'].agg(salary_mean).sort_values(ascending=False)
df5.plot(kind='bar')
for a, b in enumerate(df5):
plt.text(a, b, b, ha='center', va='bottom')
plt.xticks(rotation=360)
plt.show()
6).数据分析岗位薪资与工作经验的关系
可视化:
代码:
df6 = ff.groupby('exp')['salary_avg'].agg(salary_mean).sort_values(ascending=False)
df6.plot(kind='bar')
for a, b in enumerate(df6):
plt.text(a, b, b, ha='center', va='bottom')
plt.xticks(rotation=360)
plt.show()
具体分析根据图可以得到。