数据分析这个职位有前途吗?--数据挖掘(三)
2018-10-18 本文已影响24人
数据运营python
通过前面对数据对简单的分析,清洗,到目前为止我对数据分析这个职位有了一个大概的了解,但是对数据的认知还不足以回答题目的问题,接下来是对数据进行进一步的挖掘
1 我比较俗,有没有前途先看钱
1.1 工资分布按数量进行排序
图片.png需要对薪资的数据进行处理,把字符串的类型转换为数字,并把薪资范围作一个比较乐观的处理,取最大范围的值,并把年薪值简单的按12个月换算成月薪
1def tran_salary(value):
2 if str(value).find("千/月")!=-1:
3 value=int(float(str(value).replace("千/月", "").split("-")[1].strip()))
4 elif str(value).find("万/年")!=-1:
5 value=str(value).replace("万/年", "").split("-")[1].strip()
6 value=int(float(value)*10/12)
7 elif str(value).find("万/月")!=-1:
8 value=str(value).replace("万/月", "").split("-")[1].strip()
9 value=int(float(value)*10)
10 elif str(value).find("万以上/月")!=-1:
11 value=str(value).replace("万以上/月", "").strip()
12 value=int(float(value)*10)
13 elif str(value).find("万以上/年")!=-1:
14 value=str(value).replace("万以上/年", "").strip()
15 value=int(float(value)*10/12)
16 else:
17 value=0
18 return value
19def salary_desc(data):
20 data['salary']=data['salary'].apply(lambda x:tran_salary(x))
21 salaryGroup=data['salary'].groupby(data['salary'])
22 salaryCount=salaryGroup.count().sort_values(ascending=False)[0:40]
23 plt.figure(figsize=(22, 12))
24 rects =plt.bar(x = arange(len(salaryCount.index)),height = salaryCount.values)
25 plt.xticks(arange(len(salaryCount.index)),salaryCount.index,rotation=360)
26 autolabel(rects)
27 plt.title("工资分布")
28 plt.xlabel('工资(千/月)')
29 plt.ylabel('数量')
30 plt.savefig("data/工资分布--按数量排序.jpg")
1.2 工资分布按工资排序
图片.png只需要把前面的代码的第23行换成如下的代码,按薪资进行排序就可以
salaryCount=salaryGroup.count().sort_index(ascending=False)[0:40]
1.3 工资分组显示
通过柱状图没有给我们很直观的每个工资的占比,下面是通过饼图的展示方式,对薪资进行“1万以下, 1万到2万, 2万到3万, 3万到4万, 4万到5万, 5万到10万,10万以上”分层显示,可以看到90%的人薪资是在2万以下
图片.png
第3,4行代码是定义分层的范围,还有显示的文字,最关键的是第5行通过dataframe的cut的方法进行分层
1 def salary_desc_pie(data):
2 data['salary']=data['salary'].apply(lambda x:tran_salary(x))
3 bins = [ data['salary'].min(), 10, 20, 30, 40,50,100,data['salary'].max()]
4 labels = ['1万以下', '1万到2万', '2万到3万', '3万到4万', '4万到5万', '5万到10万','10万以上']
5 data['月薪分层'] = pd.cut(data['salary'], bins, labels=labels)
6 salaryGroup=data['salary'].groupby(data['月薪分层']).count()
7 labels=list(map(lambda x:"%s (%s,%s)"%(x,str(round(float(salaryGroup[x])/data['salary'].count()*100,2))+"%",str(salaryGroup[x])),labels))
8 plt.figure(figsize=(22, 12))
9 plt.pie(salaryGroup.values, labels=labels,
10 labeldistance=1.1, autopct='%2.0f%%', shadow=False,
11 startangle=90, pctdistance=0.6)
12 plt.axis('equal')
13 plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
14 plt.savefig("data/工资分布--饼图.jpg")
2 具备什么条件才能高薪
2.1 月薪2万以上的数据显示
通过下列的图可以得出结论:如果你是本科毕业并具备了3-4年的互联网,电子商务的工作经验,那么你去民营企业拿到这个薪资的概率很大。
图片.png
图片.png
图片.png
只需要第二行代码对薪资的范围过滤大于月薪20千的数据就可以
1 data['salary']=data['salary'].apply(lambda x:tran_salary(x))
2 data=data[data['salary'].apply(lambda x: float(x)>20)]
2.2 月薪2万需要具备的能力
具备的能力,是通过职位描述里面的要求进行分析,通过对职位描述的文字进行拆分,并且对停用词进行过滤,筛选出薪资要求2万的关键字,并且通过云词进行显示,这样比较直观
图片.png
1def gen_userdict(data_ser):
2 wfile = open('data/job_desc_dict.txt', 'w',encoding='utf-8')
3 wfile.truncate()
4 userdict = {}
5 for index in data_ser.index:
6 cutWord=jieba.cut(str(data_ser[index]),cut_all=False)
7 for j in cutWord:
8 j=j.replace(' ', '')
9 if j != "":
10 if (j in userdict):
11 userdict[j] += 1
12 else:
13 userdict[j] = 1
14 user_dict_pf=pd.DataFrame(list(userdict.items()), columns=['word', 'num'])
15 stopwords=pd.read_csv("data/stopwords.txt",index_col=False,quoting=3,sep=" ",names=['stopword'],encoding='utf-8')
16 user_dict_pf=user_dict_pf[~user_dict_pf['word'].isin(stopwords['stopword'])]
17 user_dict_pf=user_dict_pf.sort_values(by = 'num',ascending = False)[0:100]
18 cloud_text={}
19 for idx,item in user_dict_pf.iterrows():
20 cloud_text[item['word']]=item['num']
21 wfile.write(item['word'] + ' ' + str(item['num']) + '\n')
22 gen_word_cloud(cloud_text)
23
24def gen_word_cloud(cloud_text):
25 wc = WordCloud(
26 background_color="white", #背景颜色
27 max_words=500, #显示最大词数
28 font_path="simhei.ttf", #使用字体
29 min_font_size=15,
30 max_font_size=50,
31 width=800 #图幅宽度
32 )
33 wc.generate_from_frequencies(cloud_text)
34 wc.to_file("data/词云.png")
第6行通过结巴分词对职位的描述进行拆分。
第15,16行读取停用词,并对前面的结果过滤停用词
3 看看你有没有拖后腿
看看你的工资有没有被平均
图片.png
第13行对工作经验的数据进行处理
第14行对薪资进行过滤,对于超出月薪5万的数据进行过滤,防止被平均了
第15行对工作经验进行分组,并对分组的工资进行求平均值
1def tran_work_experience(value):
2 if str(value).find("年经验")!=-1:
3 if str(value).find("-")!=-1:
4 value=int(float(str(value).replace("年经验", "").split("-")[1].strip()))
5 pass
6 else:
7 value=int(float(str(value).replace("年经验", "").strip()))
8 else:
9 value=0
10 return value
11def salary_work_experience_rel(data):
12 data['salary']=data['salary'].apply(lambda x:tran_salary(x))
13 data['work_experience']=data['work_experience'].apply(lambda x:tran_work_experience(x))
14 data=data[data['salary']<50]
15 df_mean = data.groupby('work_experience')['salary'].mean()
16 plt.figure(figsize=(22, 12))
17 rects =plt.bar(x = arange(len(df_mean.index)),height = df_mean.values)
18 plt.xticks(arange(len(df_mean.index)),df_mean.index,rotation=360)
19 autolabel(rects)
20 plt.title("工作经验-工资关系")
21 plt.xlabel('工作经验(年)')
22 plt.ylabel('工资(千/月)')
23 plt.savefig("data/工作经验-工资关系.jpg")
关注公众号,回复“51job”获取项目代码