偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

數(shù)據(jù)分析行業(yè)薪資的秘密,你想知道的都在這里(2)

大數(shù)據(jù) 數(shù)據(jù)分析
數(shù)據(jù)分析師的收入怎么樣?哪些因素對于數(shù)據(jù)分析的薪資影響最大?哪些行業(yè)對數(shù)據(jù)分析人才的需求量最高?我想跳槽,應(yīng)該選擇大公司大平臺還是初創(chuàng)的小公司?按我目前的教育程度,工作經(jīng)驗,和掌握的工具和技能,能獲得什么樣水平的薪資呢?

[[200053]]

接上篇:數(shù)據(jù)分析行業(yè)薪資的秘密,你想知道的都在這里(1)

第二部分:職位信息清洗及數(shù)據(jù)提取

數(shù)據(jù)分析師的收入怎么樣?哪些因素對于數(shù)據(jù)分析的薪資影響***?哪些行業(yè)對數(shù)據(jù)分析人才的需求量***?我想跳槽,應(yīng)該選擇大公司大平臺還是初創(chuàng)的小公司?按我目前的教育程度,工作經(jīng)驗,和掌握的工具和技能,能獲得什么樣水平的薪資呢?

我們使用python抓取了2017年6月26日拉鉤網(wǎng)站內(nèi)搜索“數(shù)據(jù)分析”關(guān)鍵詞下的450條職位信息。通過對這些職位信息的分析和建模來給你答案。

本系列文章共分為五個部分,分別是數(shù)據(jù)分析職位信息抓取,數(shù)據(jù)清洗及預(yù)處理,數(shù)據(jù)分析職位分布分析,數(shù)據(jù)分析薪資影響因素分析,以及數(shù)據(jù)建模和薪資預(yù)測。這是第二篇:職位信息清洗及數(shù)據(jù)提取。

第二篇文章是對獲取的數(shù)據(jù)進(jìn)行清洗,預(yù)處理和特征提取。在***篇文章中我們抓取了拉勾網(wǎng)的450條職位信息及職位描述。但這些信息無法直接用于數(shù)據(jù)分析,我們需要對抓取到的信息進(jìn)行清洗,規(guī)范現(xiàn)有數(shù)據(jù)的格式,提取信息中的數(shù)據(jù)及特征,為后續(xù)的數(shù)據(jù)分析和建模做準(zhǔn)備。下面開始介紹苦逼的

數(shù)據(jù)清洗流程介紹。

數(shù)據(jù)清洗前的準(zhǔn)備工作

首先是開始前的準(zhǔn)備工作,導(dǎo)入所需要的庫文件,包括常用的numpy和pandas庫用于計算平均薪資以及對字符進(jìn)行分列等操作,正則表達(dá)式re庫用于字符的查找和替換操作,結(jié)巴分詞庫jieba用于對職位描述進(jìn)行分詞操作,自然語言處理nltk庫用于計算職位描述的文字豐富度指標(biāo),還有KMeans用于對平均

薪資進(jìn)行聚類操作。

  1. #導(dǎo)入所需庫文件 
  2. import re 
  3. import numpy as np 
  4. import pandas as pd 
  5. import jieba as jb 
  6. import jieba.analyse 
  7. import jieba.posseg as pseg 
  8. import nltk 
  9. from sklearn import preprocessing 
  10. from sklearn.cluster import KMeans  

導(dǎo)入我們之前抓取并保存的數(shù)據(jù)表,并查看數(shù)據(jù)表的維度以及各字段名稱。后面我們會經(jīng)常使用這些字段名稱。

  1. #導(dǎo)入之前抓取并保存的數(shù)據(jù)表 
  2. lagou=pd.DataFrame(pd.read_csv('lagou_data_analysis_2017-06-26.csv',header=0,encoding='GBK')) 
  3.   
  4. #查看數(shù)據(jù)表維度及字段名稱 
  5. lagou.columns,lagou.shape  

 

職位信息清洗及預(yù)處理

開始對職位信息的各個字段進(jìn)行清洗和預(yù)處理,主要清洗的內(nèi)容包括文本信息提取和處理,內(nèi)容搜索和替換,字段內(nèi)的空格處理,數(shù)值信息提取和計算,英文字母統(tǒng)一大小寫等等。我們將先展示清洗前的原始字段,然后在展示清洗后的新字段內(nèi)容。

行業(yè)字段清洗及處理

***個清洗的字段是行業(yè)字段,抓取到的行業(yè)字段比較混亂,有些只有一個行業(yè)名稱,有些則有兩級的行業(yè)名稱。我們保留行業(yè)字段***部分的信息,對有兩部分行業(yè)名稱的字段取前一個。

  1. #查看原始industryField字段信息 
  2.  
  3. lagou[['industryField']].head()  

 

由于行業(yè)名稱之間有的以頓號分割,有的以逗號分割,我們先將所有的分隔符統(tǒng)一為逗號,然后對這個字段進(jìn)行分列。并將分列后的字段重新拼接回原數(shù)據(jù)表中。

  1. #對industryField字段進(jìn)行清洗及分列 
  2. #創(chuàng)建list存儲清洗后的行業(yè)字段 
  3. industry=[] 
  4. #將頓號分隔符替換為逗號 
  5. for x in lagou['industryField']: 
  6.     c=x.replace("、"","
  7.     industry.append(c) 
  8. #替換后的行業(yè)數(shù)據(jù)改為Dataframe格式     
  9. industry=pd.DataFrame(industry,columns=["industry"]) 
  10. #對行業(yè)數(shù)據(jù)進(jìn)行分列 
  11. industry_s=pd.DataFrame((x.split(','for x in industry["industry"]),index=industry["industry"].index,columns=['industry_1','industry_2']) 
  12. #將分列后的行業(yè)信息匹配回原數(shù)據(jù)表 
  13. lagou=pd.merge(lagou,industry_s,right_index=True, left_index=True
  14. #清除字段兩側(cè)空格 
  15. lagou["industry_1"]=lagou["industry_1"].map(str.strip)  

以下是清洗后的行業(yè)字段。

  1. #查看清洗后的行業(yè)字段 
  2.  
  3. lagou[["industry_1","industry_2"]].head() 

 

 

融資階段字段清洗及處理

第二個清洗的字段是融資階段字段,抓取下來的原始信息中對融資階段進(jìn)行了雙重標(biāo)識,例如成長型(A輪)。由于***個標(biāo)識”成長型”定義比較寬泛,我們提取第二個括號中的標(biāo)識。

  1. #查看清洗前的financeStage字段 
  2.  
  3. lagou[['financeStage']].head()  

 

首先建立一個字典,將數(shù)據(jù)表中融資階段的每一條信息與字典中的Key進(jìn)行查找。如果融資階段信息中包含字典中的任何一個key,我們就把這個key對應(yīng)的value記錄下來。

  1. #提取并處理financeStage中的融資信息 
  2. #創(chuàng)建一個字典 
  3. f_dict = {'未融資':'未融資'
  4.           '天使輪':'天使輪'
  5.           'A輪':'A輪'
  6.           'B輪':'B輪'
  7.           'C輪':'C輪'
  8.           'D輪':'D輪'
  9.           '不需要':'不需要融資'
  10.           '上市公司':'上市公司' 
  11.           } 
  12. #創(chuàng)建list存儲清洗后的信息 
  13. financeStage2=[] 
  14. #逐一提取financeStage字段中的每一條信息 
  15. for i in range(len(lagou['financeStage'])): 
  16.     #逐一提取字典中的每一條信息 
  17.     for (key, value) in f_dict.items(): 
  18.         #判斷financeStage字段中是否包含字典中的任意一個key 
  19.         if key in lagou['financeStage'][i]: 
  20.             #如何包含某個key,則把對應(yīng)的value保存在list中 
  21.             financeStage2.append(value) 
  22. #把新保存的list添加到原數(shù)據(jù)表中             
  23. lagou["financeStage1"]=financeStage2  
  1. #查看清洗后的financeStage字段 
  2.  
  3. lagou[["financeStage1"]].head() 

 

職位名稱字段清洗及處理

第三個清洗的字段是職位名稱,這里我們要提取職位里的title信息。沒有title信息的都統(tǒng)一歸為其他。具體方法是將每個職位名稱與現(xiàn)有的title列表逐一判斷,如果職位名稱中含有title關(guān)鍵字就被劃分到這個類別下。否則被歸為其他類。

  1. #查看清洗前的positionName字段 
  2.  
  3. lagou[['positionName']].head()  

  

  1. #提取并處理positionName中的職位信息 
  2. #創(chuàng)建list存儲清洗后的信息 
  3. positionName3=[] 
  4. #對職位名稱進(jìn)行判斷歸類 
  5. for i in range(len(lagou['positionName'])): 
  6.     if '實習(xí)' in lagou['positionName'][i]: 
  7.         positionName3.append("實習(xí)"
  8.     elif '助理' in lagou['positionName'][i]: 
  9.         positionName3.append("助理"
  10.     elif '專員' in lagou['positionName'][i]: 
  11.         positionName3.append("專員"
  12.     elif '主管' in lagou['positionName'][i]: 
  13.         positionName3.append("主管"
  14.     elif '經(jīng)理' in lagou['positionName'][i]: 
  15.         positionName3.append("經(jīng)理"
  16.     elif '專家' in lagou['positionName'][i]: 
  17.         positionName3.append("專家"
  18.     elif '總監(jiān)' in lagou['positionName'][i]: 
  19.         positionName3.append("總監(jiān)"
  20.     elif '工程師' in lagou['positionName'][i]: 
  21.         positionName3.append("工程師"
  22.     else
  23.         #以上關(guān)鍵詞都不包含的職位歸為其他 
  24.         positionName3.append("其他"
  25. #把新保存的list添加到原數(shù)據(jù)表中         
  26. lagou["positionName1"]=positionName3  
  1. #查看清洗后的positionName字段 
  2.  
  3. lagou[["positionName1"]].head()  

 

薪資范圍字段清洗及處理

第四個清洗的字段是薪資范圍。抓取到的數(shù)據(jù)中薪資范圍是一個區(qū)間值,比較分散,無法直接使用。我們對薪資范圍進(jìn)行清洗,去掉無關(guān)的信息并只保留薪資上限和下限兩個數(shù)字,然后使用這兩個數(shù)字計算出平均薪資值。

  1. #查看清洗前的salary字段 
  2.  
  3. lagou[['salary']].head()  

 

  1. #提取并計算平均薪資 
  2. #創(chuàng)建list用于存儲信息 
  3. salary1=[] 
  4. #對salary字段進(jìn)行清洗 
  5. for i in lagou['salary']: 
  6.     #設(shè)置要替換的正則表達(dá)式k|K 
  7.     p = re.compile("k|K"
  8.     #按正則表達(dá)式對salary字段逐條進(jìn)行替換(替換為空) 
  9.     salary_date = p.sub("", i) 
  10.     #完成替換的信息添加到前面創(chuàng)建的新list中 
  11.     salary1.append(salary_date) 
  12. #將清洗后的字段合并到原數(shù)據(jù)表中 
  13. lagou['salary1']=salary1 
  14. #對薪資范圍字段進(jìn)行分列 
  15. salary_s=pd.DataFrame((x.split('-'for x in lagou['salary1']),index=lagou['salary1'].index,columns=['s_salary1','e_salary1']) 
  16. #更改字段格式 
  17. salary_s['s_salary1']=salary_s['s_salary1'].astype(int
  18. #更改字段格式 
  19. salary_s['e_salary1']=salary_s['e_salary1'].astype(int 
  1. #計算平均薪資 
  2.  
  3. #創(chuàng)建list用于存儲平均薪資 
  4.  
  5. salary_avg=[] 
  6.  
  7. #逐一提取薪資范圍字段 
  8.  
  9. for i in range(len(salary_s)): 
  10.  
  11. #對每一條信息字段計算平均薪資,并添加到平均薪資list中。 
  12.  
  13. salary_avg.append((salary_s['s_salary1'][i] + salary_s['e_salary1'][i])/2) 
  14.  
  15. #將平均薪資拼接到薪資表中 
  16.  
  17. salary_s['salary_avg']=salary_avg 
  18.  
  19. #將薪資表與原數(shù)據(jù)表進(jìn)行拼接 
  20.  
  21. lagou=pd.merge(lagou,salary_s,right_index=True, left_index=True 
  1. #查看清洗以后的salary_avg字段 
  2.  
  3. lagou[["salary_avg"]].head()  

 

職位信息中的數(shù)據(jù)提取

在職位描述字段中,包含了非常詳細(xì)和豐富的信息。比如數(shù)據(jù)分析人才的能力要求和對各種數(shù)據(jù)分析工具的掌握程度等。我們對這個字段的一些特征進(jìn)行指標(biāo)化,對有價值的信息進(jìn)行提取和統(tǒng)計。

職位描述字段中的數(shù)據(jù)提取

第五個清洗的字段是職位描述,準(zhǔn)確的說從職位描述字段中提取信息。職位描述中包含了大量關(guān)于職位信息,工作內(nèi)容,和個人能力方面的信息,非常有價值。但無法直接拿來使用。需要進(jìn)行信息提取。我們將對職位描述字段進(jìn)行三方面的信息提取。

***是提取職位描述中對于個人能力的要求,換句話說就是數(shù)據(jù)分析人員使用工具的能力。我們整理了10個最常見的數(shù)據(jù)分析工具。來看下每個職位描述中都出行了哪些工具名稱。由于一些工具間存在可替代性,所以每個職位描述中可能會出現(xiàn)多個工具的名稱。沒出現(xiàn)一個工具名稱,我們就會在相應(yīng)的工具下表示1,如果沒有出現(xiàn)則標(biāo)識為0。

  1. #查看清洗以前的job_detail字段 
  2.  
  3. lagou[['job_detail']].head()  

 

  1. #提取職位描述字段,并對英文統(tǒng)一轉(zhuǎn)化為小寫 
  2. lagou['job_detail']=lagou['job_detail'].map(str.lower
  3. #提取職位描述中的工具名稱 
  4. tools=['sql','python','excel','spss','matlab','sas','r','hadoop','spark','tableau'
  5. #創(chuàng)建list用于存儲數(shù)據(jù) 
  6. tool=np.array([[0 for i in range(len(tools))] for j in range(len((lagou['job_detail'])))]) 
  7. #逐一提取職位描述信息 
  8. for i in range(len(lagou['job_detail'])): 
  9.     #逐一提取工具名稱 
  10.     for t in tools: 
  11.         #獲得工具名稱的索引位置(第幾個工具) 
  12.         index=tools.index(t) 
  13.         #判斷工具名稱是否出現(xiàn)在職位描述中 
  14.         if t in lagou['job_detail'][i]: 
  15.             #如果出現(xiàn),在該工具索引位置(列)填1 
  16.             tool[i][index]=1 
  17.         else
  18.             #否則在該工具索引位置(列)填0 
  19.             tool[i][index]=0 
  20. #將獲得的數(shù)據(jù)轉(zhuǎn)換為Dataframe格式             
  21. analytics_tools=pd.DataFrame(tool,columns=tools) 
  22. #按行(axis=1)對每個職位描述中出現(xiàn)的工具數(shù)量進(jìn)行求和 
  23. tool_num=analytics_tools.sum(axis=1) 
  24. #將工具數(shù)量求和拼接到原數(shù)據(jù)表中 
  25. analytics_tools["tool_num"]=tool_num 
  26. #將表與原數(shù)據(jù)表進(jìn)行拼接 
  27. lagou=pd.merge(lagou,analytics_tools,right_index=True, left_index=True 
  1. #查看從job_detail中提取的分析工具信息 
  2.  
  3. lagou[['sql','python','excel','spss','matlab','sas','r','hadoop','spark','tableau','tool_num']].head()  

 

職位描述所使用的字?jǐn)?shù)統(tǒng)計

第二是計算職位描述所使用的字?jǐn)?shù),我們猜測初級簡單的工作描述會比較簡單,而高級復(fù)雜的工作描述則會更復(fù)雜一些。因此職位描述中不同的字?jǐn)?shù)里也可能隱藏著某種信息或關(guān)聯(lián)。 

  1. #計算職位描述的字?jǐn)?shù) 
  2. #創(chuàng)建list用于存儲新數(shù)據(jù) 
  3. jd_num=[] 
  4. #逐一提取職位描述信息 
  5. for i in range(len(lagou['job_detail'])): 
  6.     #轉(zhuǎn)換數(shù)據(jù)格式(list轉(zhuǎn)換為str) 
  7.     word_str = ''.join(lagou['job_detail'][i]) 
  8.     #對文本進(jìn)行分詞 
  9.     word_split = jb.cut(word_str) 
  10.     #使用|分割結(jié)果并轉(zhuǎn)換格式 
  11.     word_split1 = "| ".join(word_split) 
  12.     #設(shè)置字符匹配正則表達(dá)式 
  13.     pattern=re.compile('\w'
  14.     #查找分詞后文本中的所有字符并賦值給word_w 
  15.     word_w=pattern.findall(word_split1) 
  16.     #計算word_w中字符數(shù)量并添加到list中 
  17.     jd_num.append(len(word_w)) 
  18. #對字符數(shù)量進(jìn)行歸一化     
  19. min_max_scaler = preprocessing.MinMaxScaler() 
  20. min_max_jd_num = min_max_scaler.fit_transform(jd_num) 
  21. #將歸一化的數(shù)據(jù)添加到原數(shù)據(jù)表中 
  22. lagou['jd_num']=min_max_jd_num  
  1. #查看職位描述字?jǐn)?shù) 
  2.  
  3. jd_num[:10]  

 

  1. #查看歸一化的職位描述字段 
  2.  
  3. lagou[['jd_num']].head()  

 

職位描述的詞匯豐富度統(tǒng)計

第三是計算職位描述中的文字豐富度指標(biāo)。和前面的字?jǐn)?shù)統(tǒng)計一樣。初級職位所對應(yīng)的工作會相對簡單,在描述上也會比較簡單。高級職位則可能需要更詳細(xì)的和負(fù)責(zé)的描述。因此文字豐富度指標(biāo)上也會更高一些。

  1. #計算職位描述文字豐富度 
  2. #創(chuàng)建新list用于存儲數(shù)據(jù) 
  3. diversity=[] 
  4. #逐一提取職位描述信息 
  5. for i in range(len(lagou['job_detail'])): 
  6.     #轉(zhuǎn)換數(shù)據(jù)格式(list轉(zhuǎn)換為str) 
  7.     word_str = ''.join(lagou['job_detail'][i]) 
  8.     #將文本中的英文統(tǒng)一轉(zhuǎn)化為小寫 
  9.     word_str=word_str.lower() 
  10.     #查找職位描述中的所有中文字符 
  11.     word_list=re.findall(r'[\u4e00-\u9fa5]', word_str) 
  12.     #轉(zhuǎn)換數(shù)據(jù)格式(list轉(zhuǎn)換為str) 
  13.     word_str1=''.join(word_list) 
  14.     #對文本進(jìn)行分詞 
  15.     word_split = jb.cut(word_str1) 
  16.     #使用空格分割結(jié)果并轉(zhuǎn)換格式 
  17.     word_split1 = " ".join(word_split) 
  18.     #使用nltk對句子進(jìn)行分詞 
  19.     tokens = nltk.word_tokenize(word_split1) 
  20.     #轉(zhuǎn)化為text對象 
  21.     text = nltk.Text(tokens) 
  22.     #計算職位描述的文字豐富度(唯一詞/所有詞) 
  23.     word_diversity=len(set(text)) / len(text) 
  24.     #將文本詞匯豐富度數(shù)據(jù)添加到list中 
  25.     diversity.append(word_diversity) 
  26. #將文字豐富度匹配到原數(shù)據(jù)表中    
  27. lagou["diversity"]=diversity  
  1. #查看職位描述豐富度字段 
  2.  
  3. lagou[["diversity"]].head() 

 

對數(shù)據(jù)分析的薪資進(jìn)行聚類

完成清洗和數(shù)據(jù)提取后,平均薪資已經(jīng)比薪資范圍要具體的多了,但仍然比較離散。我們對這些平均薪資進(jìn)行聚類來支持后面的建模和預(yù)測工作。以下是具體的代碼和聚類結(jié)果。我們將類別標(biāo)簽添加到原始數(shù)據(jù)表中。

  1. #提取平均工作年限,平均薪資和平均公司規(guī)模字段 
  2. salary_type = np.array(lagou[['salary_avg']]) 
  3. #進(jìn)行聚類分析 
  4. clf=KMeans(n_clusters=3) 
  5. #訓(xùn)練模型 
  6. clf=clf.fit(salary_type) 
  7. #將距離結(jié)果標(biāo)簽合并到原數(shù)據(jù)表中 
  8. lagou['cluster_label']= clf.labels_ 
  9. #輸出聚類結(jié)果 
  10. clf.cluster_centers_  

 

聚類后平均薪資被分為三個類別,第1類是薪資均值為19.3K的區(qū)間,分類標(biāo)記為0。第二類是薪資均值為8.2K的區(qū)間,分類標(biāo)記為1,。第三類是薪資均值為32.1的區(qū)間,分類標(biāo)記為3。

  1. #對平均薪資進(jìn)行聚類預(yù)測 
  2. clf.predict(9),clf.predict(25),clf.predict(30)  

 

  1. #查看數(shù)據(jù)表中的類別標(biāo)識字段 
  2.  
  3. lagou[['salary_avg','cluster_label']].head()  

 

查看清洗及處理后的數(shù)據(jù)表

到這里我們完成了對450個職位信息的字段清洗和數(shù)據(jù)提取工作。下面我們再來查看下數(shù)據(jù)表的維度,名稱以及數(shù)據(jù)表中的數(shù)據(jù)。在下一篇文章中我們將使用這個數(shù)據(jù)表對數(shù)據(jù)分析職位的分布情況以及薪資的影響因素進(jìn)行分析,并通過建模對薪資收入進(jìn)行預(yù)測。

  1. #查看數(shù)據(jù)表維度及字段名稱 
  2.  
  3. lagou.columns,lagou.shape 

 

  1. #查看清洗完的數(shù)據(jù)表 
  2.  
  3. lagou.head() 

 

本篇文章我們對抓取到的職位信息進(jìn)行了清洗和數(shù)據(jù)提取。數(shù)據(jù)清洗是一個苦逼的工作,但卻是分析和建模過程中必不可少的一個步驟。經(jīng)過清洗后我們就可以對職位數(shù)據(jù)進(jìn)行分析和建模了,后面的文章中我們將從職位需求分布和薪資影響因素兩個方面進(jìn)行分析,并在***對數(shù)據(jù)分析行業(yè)的薪資進(jìn)行建模,對薪資分類和具體的薪資值進(jìn)行預(yù)測。請繼續(xù)關(guān)注。 

責(zé)任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2017-08-15 15:35:21

大數(shù)據(jù)數(shù)據(jù)分析薪資秘密

2023-09-11 08:51:23

LinkedList雙向鏈表線程

2021-06-17 13:40:47

區(qū)塊鏈比特幣公有鏈

2019-11-04 09:07:48

DevOps互聯(lián)網(wǎng)IT

2019-04-24 08:31:43

分布式限流kafka

2020-03-18 18:20:19

區(qū)塊鏈數(shù)字貨幣比特幣

2018-11-28 10:39:01

5G網(wǎng)絡(luò)運營商

2021-07-01 09:00:00

安全數(shù)字化轉(zhuǎn)型滲透

2019-04-26 09:38:36

中臺平臺化轉(zhuǎn)型

2018-03-31 08:45:52

iPhone交通卡iOS 11.3

2021-02-23 09:28:48

大數(shù)據(jù)數(shù)據(jù)分析

2022-11-08 15:55:34

鴻蒙開發(fā)套件

2017-01-11 08:37:07

Apache SparStreamingDataFrames

2021-07-02 14:09:36

開發(fā)技能代碼

2015-10-12 15:50:40

2017-12-13 14:24:08

Google 開發(fā)者瀏覽器

2018-05-10 08:50:31

AndroidGoogle 移動系統(tǒng)

2019-10-29 15:28:40

Refs組件前端

2018-08-23 11:58:53

區(qū)塊鏈數(shù)字貨幣比特幣

2022-09-15 14:22:19

協(xié)作規(guī)范前后端
點贊
收藏

51CTO技術(shù)棧公眾號