通过前面对数据对简单的分析,清洗,到目前为止我对数据分析这个职位有了一个大概的了解,但是对数据的认知还不足以回答题目的问题,接下来是对数据进行进一步的挖掘
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=018 return value19def 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] = 114 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)2324def 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=010 return value11def 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")
作者:数据运营python
链接:https://www.jianshu.com/p/71d72608105f