数据分析岗位需求分析报告
1.前言
2.用到的工具
3.網(wǎng)頁結(jié)構(gòu)分析
4.數(shù)據(jù)預處理
5.數(shù)據(jù)分析崗位分布情況
5.1公司的城市分布
5.2公司的融資情況?
5.3崗位福利狀況?
??6.數(shù)據(jù)分析崗位的發(fā)展狀況
6.1各城市平均薪資待遇
6.2不同融資階段平均工資待遇
7.數(shù)據(jù)分析師崗位招聘要求
7.1統(tǒng)計量描述?
7.2學歷與職位需求
7.3學歷水平與工資
7.4工作經(jīng)驗與職位需求
7.5工作經(jīng)驗與工資
8.附錄(詳細代碼):
8.1數(shù)據(jù)特征部分代碼
8.2數(shù)據(jù)預處理部分代碼?
8.3繪制詞云圖
8.4數(shù)據(jù)分析崗位要求部分代碼
8.5拉勾網(wǎng)數(shù)據(jù)爬取部分代碼
1.前言
"大數(shù)據(jù)",這個字眼是近幾年比較火的一個名詞,數(shù)據(jù)的價值正在各行各業(yè)發(fā)揮著越來越大的價值,銷售行業(yè)通過銷售數(shù)據(jù)的分析,對客戶行為的畫像(給客戶貼標簽),指定相應的銷售策略提高銷售業(yè)績;以淘寶、京東商城等為代表的電商平臺通過客戶的購買行為,自動推薦符合客戶"需求"的產(chǎn)品;以信貸公司、銀行業(yè)等為主的金融公司通過分析客戶的信用評估,對客戶進行分級"打分",優(yōu)先放款給"優(yōu)質(zhì)客戶",等等。似乎,正在以一種偶像般的存在,影響著每一個人、每一個行業(yè),鼓動著每一個"蠢蠢欲動"的人。然而,大多數(shù)的時候這個名詞都被人誤解或者過分渲染了。"管它黑貓白貓,能抓住老鼠的都是好貓",換句話說:管它是大數(shù)據(jù)還是一般數(shù)據(jù),能支持經(jīng)營管理決策的都是好數(shù)據(jù)。所以,從企業(yè)自身而言,首要任務是充分利用自身數(shù)據(jù),推動經(jīng)營決策。而對于個人,應該充分結(jié)合實際情況,認真做好自己的職業(yè)規(guī)劃,而不是盲目跟風。結(jié)合自身的優(yōu)勢,忠于企業(yè)和個人,盡最大限度的發(fā)揮自身價值為企業(yè)和社會貢獻出自己的一份力量。
本文筆者以一名正在轉(zhuǎn)行路上的身份,爬取了拉勾網(wǎng)數(shù)據(jù)分析職位的前100頁,共計1500條的招聘信息,通過數(shù)據(jù)挖掘,統(tǒng)計建模等方法,對數(shù)據(jù)分析職位特點及現(xiàn)狀做一個分析。
2.用到的工具
Spyder3.6
requests: 下載網(wǎng)頁
pandas:數(shù)據(jù)分析庫
numpy:數(shù)組操作
matplotlib:繪圖
wordcloud、jieba:生成中文詞云
rcParams:使繪圖能顯示中文字體
3.網(wǎng)頁結(jié)構(gòu)分析
打開搜狗高速瀏覽器,在拉勾網(wǎng)首頁搜索的“數(shù)據(jù)分析”職位,鼠標右擊查看網(wǎng)頁源文件,通過搜索相關關鍵字可以發(fā)現(xiàn), 職位信息并不在源代碼里。進一步抓包分析,點擊審查元素(快捷鍵F12),可以發(fā)現(xiàn)職位信息隱藏于JSON的文件里,結(jié)合數(shù)據(jù)格式,我們選擇用字典方法直接讀取數(shù)據(jù)。
運行程序得到如下數(shù)據(jù):(代碼見附錄)
因為文件是csv格式文件,建議用notepad或者WPS打開(直接用office Excel不支持會出現(xiàn)亂碼)
4.數(shù)據(jù)預處理
為了保證后續(xù)分析的正常進行,需要對數(shù)據(jù)進行預處理。觀看數(shù)據(jù)可以得出如下操作步驟:
(1).數(shù)據(jù)分析職位中可能存在"實習生崗位",需要對其進行剔除。
(2).表中的"工作經(jīng)驗"屬于范圍值,在此對其進行平均化處理。
(3).表中的"工資"也屬于范圍,在此也對其進行平均化處理,取中間值。
(4).刪除冗余列,保存到新的表格。
處理后得到如下數(shù)據(jù)表:(代碼見附錄)
5.數(shù)據(jù)分析崗位分布情況
5.1公司的城市分布
由下圖可以看出:北京數(shù)據(jù)分析師崗位需求占據(jù)了47.2%,上海地區(qū)21.9%,杭州地區(qū)9.6%,深圳地區(qū)8.6%,廣州地區(qū),南京地區(qū)等地區(qū)的崗位需=需求量緊隨其后,基本上主要集中在一線城市和強二線城市中。
5.2公司的融資情況?
下圖中可以看出,在招聘公司中:不需要融資的公司、上市公司、C輪融資階段的公司對數(shù)據(jù)分析師的崗位需求量最大,A輪、D輪、B輪、未融資等階段的公司緊隨其后。說明發(fā)展相對成熟,穩(wěn)健的公司有更大可能性需要數(shù)據(jù)分析崗位的人才。
5.3崗位福利狀況?
針對爬取的拉勾網(wǎng)數(shù)據(jù)的職位福利,,進行jieba分詞,并制作詞云。出現(xiàn)頻率最高的依次是:彈性工作、發(fā)展空間、氛圍、工資等,從圖中詞頻的頻率可以看出,招聘崗位更注重職位的發(fā)展與員工的體驗,其次是工資水平與各類獎金。
?
6.數(shù)據(jù)分析崗位的發(fā)展狀況
6.1各城市平均薪資待遇
從圖中可以看出各城市平均工資最高的是北京20.1469,其次上海、杭州、深圳、廣州、南京、緊隨其后,其中長春的平均工資值得商榷,因為從上數(shù)據(jù)分析師崗位需求上來看,長春的數(shù)據(jù)分析師需求量非常小。在此處作為異常值處理。
6.2不同融資階段平均工資待遇
由下圖可以看出,不同融資階段公司對數(shù)據(jù)分析師給出的平均薪資略有不同,D輪、C輪、B輪、上市公司平均工資相對較大y一些。
7.數(shù)據(jù)分析師崗位招聘要求
7.1統(tǒng)計量描述?
count ? ?1469.000000
mean ? ? ? ?3.167461
std ? ? ? ? 1.909803
min ? ? ? ? 0.000000
25% ? ? ? ? 2.000000
50% ? ? ? ? 4.000000
75% ? ? ? ? 4.000000
max ? ? ? ? 7.500000
工作年限平均值為3.167年,中位數(shù)是4年,大致可以說明企業(yè)要求有一定工作經(jīng)驗的占據(jù)多數(shù)。
mean ? ? ? 17.497958
std ? ? ? ? 8.431887
min ? ? ? ? 1.500000
25% ? ? ? ?11.500000
50% ? ? ? ?15.000000
75% ? ? ? ?22.500000
max ? ? ? ?80.000000
平均工作為8.431k,中位數(shù)為15k,大致可以看出,地區(qū)間存在兩級分化比較嚴重,崗位偏集中,工資偏兩極。下面作進一步分析。
7.2學歷與職位需求
由下圖比例可以看出,招聘單位85.7%要求入門是本科學歷,本科學歷數(shù)據(jù)分析崗市場需求量第一,大專學歷7.3%排名第二,相應的碩士學歷反而要求不高。也從間接的方面看出,公司可能更看重數(shù)據(jù)分析的經(jīng)驗能力。
7.3學歷水平與工資
可以看出,數(shù)據(jù)分析師崗位學歷水平與平均薪資成正比關系,學歷越高,工資越高,碩士工資20k左右,本科平均工資17.5k左右,相差不大,但是大專學歷平均工資卻只有10k左右。差距較為明顯。平時好好學習還是有一定好處的(哈哈)。
7.4工作經(jīng)驗與職位需求
表中可以看出工作經(jīng)驗與職位需求成正比關系。3-5年和1-3年的數(shù)據(jù)分析師崗位需求量最大,前者占比43.6%,后者占比35.1%,說明數(shù)據(jù)分析崗位更看重數(shù)據(jù)分析經(jīng)驗。企業(yè)所需培養(yǎng)的成本相對較小,所以企業(yè)更愿意招攬此類人才。相對應的,經(jīng)驗過少和5-10年的工作者是兩個極端,無工作經(jīng)驗或者1年以下的求職者培養(yǎng)起來需要更大的成本。后者則需要更大的招聘成本。
?
7.5工作經(jīng)驗與工資
由下圖可看出:工作經(jīng)驗與平均工資水平成正比,相關工作年限越長,平均工資也越高。
?
8.附錄(詳細代碼):
8.1數(shù)據(jù)特征部分代碼
import pandas as pd import matplotlib.pyplot as plt # 讀取數(shù)據(jù) df = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8') #讀取數(shù)據(jù),編碼處理 #1.統(tǒng)計量描述 fb=df['經(jīng)驗'].describe() fb2=df['平均工資'].describe() print(fb,fb2) #輸出統(tǒng)計量 plt.rcParams['font.sans-serif']=['SimHri'] #用來正常顯示中文標簽 plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] ## 指定默認字體:解決plot不能顯示中文問題 #2.繪制城市分布的餅圖(取前10) count = df['城市'].value_counts() count=count[0:10] #取序列前10的城市繪制餅圖 plt.pie(count, labels = count.keys() ,labeldistance=1.4,autopct='%2.1f%%') plt.axis('equal') # 使餅圖為正圓形 plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1)) #添加圖例,并設置圖例位置 plt.savefig('location.jpg') plt.show() #2.繪制城市分布的柱狀圖,柱狀圖繪制前15名 count1 = df['城市'].value_counts() count1=count1[0:15] #取序列前15的城市繪制柱狀圖 plt.bar(count1.keys(),count1) plt.savefig('城市柱狀圖15名.jpg') plt.show() #3.繪制融資階段柱狀圖 count2 = df['融資階段'].value_counts() plt.bar(count2.keys(),count2) plt.savefig('融資階段分布.jpg') plt.show() #4.繪制學歷與職位需求的關系 count3 = df['學歷要求'].value_counts() plt.pie(count3, labels = count3.keys() ,labeldistance=1.4,autopct='%2.1f%%') plt.axis('equal') # 使餅圖壓縮為正圓形 plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1)) #添加圖例,并設置圖例位置 plt.savefig('學歷與職位需求關系.jpg') plt.show() #5.繪制工作經(jīng)驗與職位需求的柱狀圖 count4 = df['工作經(jīng)驗'].value_counts() plt.bar(count4.keys(),count4) plt.savefig('工作經(jīng)驗與職位需求.jpg') plt.show()8.2數(shù)據(jù)預處理部分代碼?
#數(shù)據(jù)預處理 import pandas as pd # 讀取數(shù)據(jù) df = pd.read_csv('D:/baogao/lagou_data.csv', encoding = 'utf-8') # 數(shù)據(jù)清洗,剔除實習崗位 df.drop(df[df['職位名稱'].str.contains('實習')].index, inplace=True) # 正則表達式將csv文件字符串轉(zhuǎn)化為列表,再取區(qū)間的均值 pattern = '\d+' df['工作年限'] = df['工作經(jīng)驗'].str.findall(pattern) avg_work_year = [] for i in df['工作年限']: # 如果工作經(jīng)驗為'不限'或'應屆畢業(yè)生',那么匹配值為空,工作年限為0 if len(i) == 0: avg_work_year.append(0) # 如果匹配值為一個數(shù)值,那么返回該數(shù)值 elif len(i) == 1: avg_work_year.append(int(''.join(i))) # 如果匹配值為一個區(qū)間,那么取平均值 else: num_list = [int(j) for j in i] avg_year = sum(num_list)/2 avg_work_year.append(avg_year) df['經(jīng)驗'] = avg_work_year df=df.drop('工作年限',1) #刪除工作年限數(shù)據(jù)列(冗余數(shù)據(jù)) df['salary'] = df['工資'].str.findall(pattern) #字符串轉(zhuǎn)化為列表,取區(qū)間平均值作為薪資 avg_salary = [] for k in df['salary']: int_list = [int(n) for n in k] avg_wage = (int_list[1]+int_list[0])/2 avg_salary.append(avg_wage) df['平均工資']=avg_salary df= df.drop('salary',1) #刪除salary數(shù)據(jù)列(冗余數(shù)據(jù)) df= df.drop('工資',1) ##刪除工資數(shù)據(jù)列(冗余數(shù)據(jù)) # 將清洗后的數(shù)據(jù)保存,以便后續(xù)使用 df.to_csv('lagou_data2.csv', index = False)8.3繪制詞云圖
#繪制詞云圖 import numpy as np from PIL import Image import jieba from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS import matplotlib.pyplot as plt df = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8') #讀取數(shù)據(jù)并編碼處理 text = '' for line in df['職位福利']: text += line #使用jieba模塊將字符串分割為單詞列表 f=open("D:/baogao/職位福利.txt","a+") #以追加的方式創(chuàng)建一個文本文件 f.write(text) #寫人職位福利文本內(nèi)容 f.write("\n") # 寫完通過\n進行換行 f.close() #關閉文檔 from random import randint #封裝改變顏色函數(shù) def random_color_func(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None):h = randint(120,250)s = int(100.0 * 255.0 / 255.0)l = int(100.0 * float(randint(60, 120)) / 255.0)return "hsl({}, {}%, {}%)".format(h, s, l) #用一張圖片作為詞云的模板 maskcolud=np.array(Image.open(r"D:/baogao/0.jpg")) #打開要生成詞云的文字文件的位置 nedcloudpath=open("D:/baogao/職位福利.txt","rb").read() #打開之后用jieba切割 jiebapath=jieba.cut(nedcloudpath,cut_all=True) #以空格為分割 jiebapathsplit=" ".join(jiebapath) #設置詞云對應屬性 produCloud=WordCloud(width=300,height=300,background_color="white",mask=maskcolud,font_path='C:\windows\Fonts\STZHONGS.TTF',max_words=200,stopwords=STOPWORDS,max_font_size=60,random_state=50,scale=0.5,color_func=random_color_func ).generate(jiebapathsplit) ImageColorGenerator(maskcolud) #對詞云進行顯示 produCloud.to_file('ciyu.jpg') plt.imshow(produCloud) plt.axis("off") plt.show()8.4數(shù)據(jù)分析崗位要求部分代碼
#薪酬影響因素分析 import pandas as pd import numpy as np import matplotlib.pyplot as plt # 讀取數(shù)據(jù) df1 = pd.read_csv('D:/baogao/lagou_data2.csv', encoding = 'utf-8') #原來的gbk不能用!!! c1=df1['城市'].count() #1.計算學歷水平與工資關系,繪制柱狀圖 df2=df.groupby('學歷要求')['平均工資'].agg([np.mean]) #agg函數(shù)分組統(tǒng)計 count3=pd.Series(df2['mean'],df2.index) #將dataframe數(shù)據(jù)庫轉(zhuǎn)化為序列series count3=count3.sort_values(ascending=False) #降序排列 plt.title("學歷水平與平均薪資") plt.xlabel("學歷水平") plt.ylabel("平均工資") plt.bar(count3.keys(),count3) plt.savefig('學歷與工資關系.jpg') #保存為圖片 plt.show() #2.計算工作經(jīng)驗與平均工資關系 df3=df.groupby('工作經(jīng)驗')['平均工資'].agg([np.mean]) count5=pd.Series(df3['mean'],df3.index) #將dataframe數(shù)據(jù)框轉(zhuǎn)化為序列series count5=count5.sort_values(ascending=False) plt.title("工作經(jīng)驗與平均薪資") plt.xlabel("工作經(jīng)驗") plt.ylabel("平均工資") plt.bar(count5.keys(),count5) plt.savefig('工作經(jīng)驗與平均工資關系.jpg') plt.show() #3.計算不同融資階段的工資水平 df4=df.groupby('融資階段')['平均工資'].agg([np.mean]) count6=pd.Series(df4['mean'],df4.index) #將dataframe轉(zhuǎn)化為序列 count6=count6.sort_values(ascending=False) plt.title("融資階段與平均薪資") plt.xlabel("融資階段") plt.ylabel("平均工資") plt.bar(count6.keys(),count6) plt.savefig('融資階段與工資關系.jpg') plt.show() #4.計算不同城市平均工資分布狀況 df5=df.groupby('城市')['平均工資'].agg([np.mean]) count7=pd.Series(df5['mean'],df5.index) #將dataframe轉(zhuǎn)化為序列 count7=count7.sort_values(ascending=False) count7=count7[0:15] #取排名前15位 plt.title("不同城市薪資") plt.xlabel("城市") plt.ylabel("平均工資") plt.bar(count7.keys(),count7) plt.savefig('不同城市與工資關系.jpg') plt.show()8.5拉勾網(wǎng)數(shù)據(jù)爬取部分代碼
#拉勾網(wǎng)全國前100頁數(shù)據(jù)分析師招聘數(shù)據(jù)爬取 import requests import math import pandas as pd import time def get_json(url,num): my_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36','Host': 'www.lagou.com','Referer': 'https://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?px=default&city=%E5%85%A8%E5%9B%BD','X-Anit-Forge-Code': '0','X-Anit-Forge-Token': 'None','X-Requested-With': 'XMLHttpRequest'}my_data = { 'first': 'true', 'pn':num, 'kd':'數(shù)據(jù)分析'} res = requests.post(url, headers = my_headers, data = my_data) res.raise_for_status() res.encoding = 'utf-8' # 得到包含職位信息的字典 page = res.json() return page def get_page_num(count): #計算要抓取的頁數(shù) # 每頁15個職位,向上取整 res = math.ceil(count/15) #得到大于或等于該數(shù)值的最小整數(shù)# 拉勾網(wǎng)最多顯示30頁結(jié)果 if res > 100: return 100 else: return res def get_page_info(jobs_list): '''''對一個網(wǎng)頁的職位信息進行解析,返回列表''' page_info_list = [] for i in jobs_list: job_info = []job_info.append(i['city']) job_info.append(i['companyFullName']) job_info.append(i['companyShortName']) job_info.append(i['companySize']) job_info.append(i['financeStage']) job_info.append(i['district']) job_info.append(i['positionName']) job_info.append(i['workYear']) job_info.append(i['education']) job_info.append(i['salary']) job_info.append(i['positionAdvantage']) page_info_list.append(job_info) return page_info_list #返回特定信息構(gòu)建表格 def main(): url = 'https://www.lagou.com/jobs/positionAjax.json?px=default&needAddtionalResult=false' # 先設定頁數(shù)為1,獲取總的職位數(shù) page_1 = get_json(url,1) total_count = page_1['content']['positionResult']['totalCount'] num = get_page_num(total_count) total_info = [] time.sleep(40) #間隔40秒print('職位總數(shù):{},頁數(shù):{}'.format(total_count,num)) for n in range(1,num+1): # 對每個網(wǎng)頁讀取JSON, 獲取每頁數(shù)據(jù) page = get_json(url,n) jobs_list = page['content']['positionResult']['result'] page_info = get_page_info(jobs_list) total_info += page_info print('已經(jīng)抓取第{}頁, 職位總數(shù):{}'.format(n, len(total_info))) # 每次抓取完成后,暫停一會,防止被服務器拉黑 time.sleep(40) #將總數(shù)據(jù)轉(zhuǎn)化為data frame再輸出 df = pd.DataFrame(data = total_info,columns = ['城市','公司全名','公司簡稱','公司規(guī)模','融資階段','區(qū)域','職位名稱','工作經(jīng)驗','學歷要求','工資','職位福利']) df.to_csv('lagou_jobs.csv',index = False) print('已保存為csv文件.') if __name__== "__main__": main()?
?
?
總結(jié)
以上是生活随笔為你收集整理的数据分析岗位需求分析报告的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 用CSS绘制一个红色的爱心
- 下一篇: [css] 解释下 CSS sprit