数据分析这个职位有前途吗?--数据挖掘(三)

Python 177 2018-10-24 16:57

通过前面对数据对简单的分析,清洗,到目前为止我对数据分析这个职位有了一个大概的了解,但是对数据的认知还不足以回答题目的问题,接下来是对数据进行进一步的挖掘

1 我比较俗,有没有前途先看钱

1.1 工资分布按数量进行排序

数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

需要对薪资的数据进行处理,把字符串的类型转换为数字,并把薪资范围作一个比较乐观的处理,取最大范围的值,并把年薪值简单的按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 工资分布按工资排序

数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

只需要把前面的代码的第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万以下


数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

第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年的互联网,电子商务的工作经验,那么你去民营企业拿到这个薪资的概率很大。


数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

只需要第二行代码对薪资的范围过滤大于月薪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万的关键字,并且通过云词进行显示,这样比较直观


数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS
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 看看你有没有拖后腿

看看你的工资有没有被平均


数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

第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”获取项目代码

数据分析这个职位有前途吗?--数据挖掘(三)-JEESNS

文章评论