數據分析案例:51job網站職位信息探索

還有一年就畢業了,為了更好的了解求職時需要的技能,也為了熟悉一下Python matplotlib的操作,我花了幾天的時間製作了這個案例。

本文從如下方面展示此次數據分析:

  1. 數據獲取

  2. 數據清洗,特徵提取
  3. 數據分析與圖表展示

一、數據獲取

數據來源是前程無憂網站,使用selenium和phantomjs製作爬蟲搜集數據。

首先要打開登錄頁面,進行登錄操作,之後根據關鍵詞進行職位搜索。

這裡選擇的關鍵詞是:機器學習,自然語言,數據分析;城市限定在:北京、上海、廣州、深圳、杭州。

需要注意的是,機器學習和自然語言在51job中只有87和29頁的職位,而數據分析有超過2000頁的職位,為了避免數據分析類的職位爬取過多影響後面的分析,這裡只取了前100頁的職位信息。

獲得了職位對應的URL之後,使用爬蟲訪問URL,提取每個職位對應的:職位名、公司名、城市、薪資、職位描述和要求。

總共爬取了10802個職位信息,數據如下:

二、數據清洗和特徵提取

對城市信息,刪除具體區域,只保留城市名。

對薪資信息,取平均薪資,並按照年薪=月薪*12的規則將薪資統一轉化為年薪。

刪除年薪低於54000(月薪4500)的職位並將年薪歸入54000-108000,108000-216000,216000-432000,>432000四個區間,分別記為salary_level 1,2,3,4

def salary_wash(row,web): measure=1 salary=str(row) salary=re.sub(80元/小時,1.3-1.3萬/月,salary) salary=re.sub(2萬以下/年,2-2萬/年,salary) salary=re.sub(1千以下/月,1-1千/月,salary) if in salary[-7:] or k in salary[-7:] or K in salary[-7:]: measure=1000 if in salary[-7:]: measure=10000 if in salary[-7:]: measure=measure*12 try: low=float(salary[:-7][0:salary.find(-)]) high=float(salary[:-7][salary.find(-)+1:]) salary=(low+high)/2 salary=salary*measure except: salary=salary error return salary

對職位描述:我做了一個關鍵詞列表,把每個關鍵詞都當做一個啞變數,如果職位描述中出現了該詞,就記為1,否則為0。這個方法相對簡答可行,但是會有一些不準確,關鍵詞的選取也是基於經驗。

keywords=(機器學習,機器學習演算法,演算法,深度學習,深度學習演算法,自然語言,大數據,數據分析,爬蟲,人工智慧,數據挖掘,Python,Caffe,Tensorflow,雲,深度學習框架,Keras,Kaggle,scikit,C++,C語言,211,985,碩士,博士,機器學習框架,數據結構,分散式,Linux,Spark,Hadoop,Excel,MapReduce,英語,PPT,資料庫,項目經驗,計算機,數學,統計,論文,LSTM,神經網路,R,SQL,VBA) def description_wash(row): description=str(row) description=re.sub(NLP,自然語言處理,description) description=re.sub(nlp,自然語言處理,description) description=re.sub(ML,機器學習,description) description=re.sub(機器,機器學習,description) description=re.sub(NN,神經網路,description) description=re.sub(DL,深度學習,description) description=re.sub(深度,深度學習,description) description=re.sub(挖掘,數據挖掘,description) description=re.sub(AI,人工智慧,description) description=re.sub(python,Python,description) description=re.sub(caffe,Caffe,description) description=re.sub(tensorflow,Tensorflow,description) description=re.sub(keras,Keras,description) description=re.sub(kaggle,Kaggle,description) description=re.sub(excel,Excel,description) description=re.sub(hadoop,Hadoop,description) description=re.sub(mapreduce,MapReduce,description) description=re.sub(linux,Linux,description) description=re.sub(spark,Spark,description) description=re.sub(sql,SQL,description) description=re.sub(EXCEL,Excel,description) description=re.sub(PYTHON,Python,description) description=re.sub(vba,VBA,description) description=re.sub(ppt,PPT,description) return description

另外,對職位描述中的時間信息進行處理,刪除0x年,1x年,取剩下的年份信息作為工作經驗需求列(這裡的規則指定主要基於多次嘗試)

清洗之後的數據如下:

三、數據分析與圖表展示

使用條形圖分析工作數量分布:

def bar_count(col,filters,bar_width_=0.3,figsize=(10,6),data=data,xticks=None,keywords=(機器學習,NLP,數據分析)): plt.figure(figsize=figsize) if keywords == None: for i in range(0,len(filters)): height=len(data[data[col]==filters[i]]) plt.bar(i,height,width_=0.5,label=filters[i]) text=str(height)+,+str(round(float(height)/len(data),3)*100)+% plt.text(i-0.1,height+0.05,height) if xticks==None: plt.xticks(np.arange(0,len(filters)), filters) else: plt.xticks(np.arange(0,len(filters)), xticks) plt.title(col.upper(),fontproperties=myfont) plt.show() return None

bar_count(col=keyword,filters=(機器學習,NLP,數據分析),keywords=None)

從職位數量上看,自然語言關鍵詞下的職位數量大概只有機器學習的40%,而數據分析在求職網站中有2000+的頁數,這裡只取了前100頁,所以實際中數據分析的職位數量要遠高於機器學習和自然語言。

bar_count(col=city,filters=(北京,上海,廣州,深圳,杭州))

在城市分布上,北京、上海有最多的機器學習和自然語言方面的工作,而數據分析崗則較多的分布在上海、廣州、深圳

三個類別中有(40%-50%)的職位對工作經驗沒有要求

在工資分布上可以清楚的發現超過半數的數據分析崗年薪低於10w,超過90%的數據分析崗的年薪位於5-20w的區間。而機器學習和自然語言方面年薪分布較為接近,集中在10-40w的區間內。

對低於50w年薪的工作,使用箱線圖分析年薪分布:(刪除50w以上的職位信息是因為過多的outlier會使圖表不易觀察)

考察不同關鍵詞下的職位數量:

box(col=keyword)

機器學習和自然語言的崗位薪資分布幾乎一致,且遠好於數據分析

考察不同城市的職位數量:

box(col=city,order=(北京,上海,廣州,深圳,杭州),hue=keyword)

北京和深圳有最好的薪資水平,廣州最差

考察職位對工作經驗的要求:

box(col=years,order=(0,1,2,3,> 3 years),hue=keyword)

數據分析崗薪資水平隨工作經驗的增長趨勢較為明顯,而機器學習和自然語言方面的工作似乎只有3年及以上的工作經驗才能獲得較大優勢

print 分析關鍵詞出現率

def data_bulid(rawdata=data,keyword=,k_list=jds): d=rawdata if keyword <> : d=d[d[keyword]==keyword] df=pd.DataFrame({salary_level:[1,2,3,4]}) for k in k_list: df[k]=list(d[k].groupby(d[salary_level]).sum()) df=df.fillna(0).T df[keyword]=df.index index=range(len(df)) df.index=index df=df.drop(0) df.columns=[sl_1_count,sl_2_count,sl_3_count,sl_4_count,] df=df[[,sl_1_count,sl_2_count,sl_3_count,sl_4_count]] df[sl_1_ratio]=df[sl_1_count]/float(len(d[d[salary_level]==1])) df[sl_2_ratio]=df[sl_2_count]/float(len(d[d[salary_level]==2])) df[sl_3_ratio]=df[sl_3_count]/float(len(d[d[salary_level]==3])) df[sl_4_ratio]=df[sl_4_count]/float(len(d[d[salary_level]==4])) df=df[[,sl_1_ratio,sl_2_ratio,sl_3_ratio,sl_4_ratio]] df.columns=[keyword,sl_1_ratio,sl_2_ratio,sl_3_ratio,sl_4_ratio] df=df.sort(sl_1_ratio,ascending=0) return df

機器學習職位中出現率前20的關鍵詞為:

x=data_bulid(機器學習)

NLP職位中出現率前20的關鍵詞為:

x=data_bulid(NLP)

數據分析職位中出現率前20的關鍵詞為:

x=data_bulid(數據分析)

最後,針對不同關鍵詞下的職位,我對每個關鍵詞在1-4個薪資等級中出現的頻率進行了統計,並製作了條形圖。大家可以從下圖中看出,在某類職業中,想要獲得更高的薪水,需要向哪個方向努力。

def bar_salaryLevel(dataframe,start,end): y=dataframe.sort(sl_1_ratio,ascending=0)[start:end] plt.figure(figsize=(23, 6)) bar_width_=0.2 index=np.arange(1,end-start+1) plt.bar(index,y[sl_1_ratio],width_=bar_width,label=年薪:54000-108000) plt.bar(index+bar_width,y[sl_2_ratio],width_=bar_width,label=年薪:108000-216000) plt.bar(index+2*bar_width,y[sl_3_ratio],width_=bar_width,label=年薪:216000-432000) plt.bar(index+3*bar_width,y[sl_4_ratio],width_=bar_width,label=年薪:>432000) plt.xticks(index+1.5*(bar_width), y[keyword], fontproperties=myfont) plt.legend(loc="upper right") plt.show() return None

機器學習:

NLP:

數據分析:

這裡還嘗試過使用啞變數作為特徵,用xgboost模型做一個多分類任務然後得到每個特徵的importance,但是效果並不好,就沒有放上來。

未來如果有時間可能回使用主題模型對工作描述進行相關的分析。

最後放上我的個人郵箱:machenfeng@msn.cn ,歡迎大家來交流 :)


推薦閱讀:

使用python爬豆瓣書單
新浪微博採集-大神教你5分鐘配置一個微博爬蟲
拉勾網職位信息爬蟲練習
python 爬取煎蛋網妹子圖

TAG:Python | 爬蟲 | 數據分析 |