數(shù)據(jù)分析崗位近況分析

| 2022-09-16 admin

數(shù)據(jù)讀取
理解數(shù)據(jù)
數(shù)據(jù)清洗
數(shù)據(jù)分析

1、數(shù)據(jù)讀取

#導(dǎo)入相關(guān)模塊import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport re#正則解析from wordcloud import WordCloudimport warningswarnings.filterwarnings('ignore')#連接mysqlimport pymysqlpymysql.install_as_MySQLdb()from sqlalchemy import create_engineengine=create_engine('mysql://user:password@localhost:3306/frogdata?charset=gbk')#讀取數(shù)據(jù)df=pd.read_sql_query('select * from Boss_analyst',con=engine) 

2、理解數(shù)據(jù)

字段解釋

  • position - 職位

  • salary_range - 薪水區(qū)間

  • work_year - 工作經(jīng)驗(yàn)

  • city - 城市

  • tag1 - 技能標(biāo)簽1

  • tag2 - 技能標(biāo)簽2

  • tag3 - 技能標(biāo)簽3

  • tag4 - 技能標(biāo)簽4

  • tag5 - 技能標(biāo)簽5

  • company_name - 公司名稱

  • text - 未知

  • company_type - 公司類型

  • company_welfare -公司福利

3、數(shù)據(jù)清洗

對表中的position、salary_range、work_year、city、text、company_welfare字段數(shù)據(jù)進(jìn)行清洗

#觀察數(shù)據(jù)的整體情況df.info()

總共有4482條數(shù)據(jù)。tag4、tag5、company_walfare列的有存在空缺數(shù)據(jù),但空缺不多,而且這三個指標(biāo)不是關(guān)鍵性指標(biāo),所以暫不做處理

#考慮到爬取的數(shù)據(jù)可能存在重復(fù)數(shù)據(jù),此處做去重處理df.drop_duplicates(inplace=True)df.shape[0] 

4435 存在47條重復(fù)數(shù)據(jù)

position 字段清洗

#觀察position字段df.position.unique() 

發(fā)現(xiàn)存在異常數(shù)據(jù),這里需要對不相關(guān)的職位進(jìn)行去除

df=df.loc[df.position.str.contains('數(shù)據(jù)|分析|Data|算法|Bi|ETL')]df.shape[0]3423
考慮數(shù)據(jù)類的崗位有數(shù)據(jù)運(yùn)營、數(shù)據(jù)挖掘、商業(yè)分析師、算法工程師、ETL工程師等

salary_range字段清洗

#觀察salary_range字段df['salary_range'].unique()
數(shù)據(jù)很不規(guī)整,初步判斷存在以下三種格式:'15-25K·13薪'、'15-25K'、100-150元/天 ,打算把這一列的數(shù)據(jù)拆解分為兩列-最低薪水、最高薪水
def cut_word(word,types):        #把數(shù)據(jù)規(guī)整為'xx-xx'格式    position1=word.find('K')    position2=word.find('元')    #如果沒有找到該元素,find會返回值-1    if position1 != -1:          salary_range=word[:position1]    elif position2 != -1:          salary_range=word[:position2]        #拆分?jǐn)?shù)據(jù)-最低薪水、最高薪水    position3= salary_range.find('-')    bottom_salary= salary_range[:position3]    top_salary= salary_range[position3+1:]        #傳入types參數(shù),接收最低薪水、最高薪水的數(shù)據(jù)    if types == 'bottom':        return bottom_salary    else:        return top_salary#利用apply函數(shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)化df['bottom_salary']=df['salary_range'].apply(cut_word,types='bottom').astype('int')df['top_salary']=df['salary_range'].apply(cut_word,types='top').astype('int')
#新增平均薪水列,方面后面做統(tǒng)計分析df['avg_salary']=df.apply(lambda x : (x.bottom_salary+x.top_salary)/2,axis=1)
work_year字段清洗

work_year字段中學(xué)歷數(shù)據(jù)和工作年限數(shù)據(jù)混雜在了一起,需要將其分列

學(xué)歷有7種數(shù)據(jù)格式:學(xué)歷不限、中專/中技、高中、大專、本科、碩士、博士

工作經(jīng)驗(yàn)有三種數(shù)據(jù)格式:x-x年、x天/周x個月、經(jīng)驗(yàn)不限。

def cut_word1(word,types):    #找到學(xué)歷不限的學(xué)字,進(jìn)行切片處理    position1=word.find('學(xué)')    #找到學(xué)歷不限的大字,進(jìn)行切片處理    position2=word.find('大')    position3=word.find('本')    position4=word.find('碩')    position5=word.find('博')    position6=word.find('高')    position7=word.find('中')        #通過切片把數(shù)據(jù)規(guī)整為學(xué)歷和工作經(jīng)驗(yàn)兩列數(shù)據(jù)    if position1 != -1:          work_year=word[:position1]        educational_background=word[position1:]    elif position2 != -1:         work_year=word[:position2]        educational_background=word[position2:]    elif position3 != -1:        work_year=word[:position3]        educational_background=word[position3:]    elif position4 != -1:        work_year=word[:position4]        educational_background=word[position4:]    elif position5 != -1:        work_year=word[:position5]        educational_background=word[position5:]    elif position6 != -1:        work_year=word[:position6]        educational_background=word[position6:]    else:        work_year=word[:position5-4]        educational_background=word[position5-4:]          #傳入types參數(shù),接收學(xué)歷和工作年限的數(shù)據(jù)    if types == 'education_background':        return educational_background    else:        return work_year    #利用apply函數(shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)化,將學(xué)歷數(shù)據(jù)新添加到'education_background'列,工作經(jīng)驗(yàn)數(shù)據(jù)新添加到'work_year'列df['education_background']=df['work_year'].apply(cut_word1,types='education_background')df['work_year']=df['work_year'].apply(cut_word1,types='work_year')

work_year字段已清洗完畢,轉(zhuǎn)化為work_year和education_background兩列數(shù)據(jù)

#work_year中存在2天/周3個月之類的數(shù)據(jù),判斷是實(shí)習(xí)/兼職職位,這邊把全職和實(shí)習(xí)的崗位數(shù)據(jù)區(qū)分開來df_part_time=df.loc[df.work_year.str.contains('天|周|月')]#全職崗位df_full_time=df.loc[~df.work_year.str.contains('天|周|月')]
city字段清洗
#觀察city數(shù)據(jù)df_full_time['city'].unique() 
有些值只顯示城市名稱,有些細(xì)分到了區(qū),這邊把數(shù)據(jù)維度統(tǒng)一規(guī)整到城市名稱
#通過apply函數(shù)和if邏輯判斷,把帶有·點(diǎn)的數(shù)據(jù)的城市地區(qū)維度進(jìn)行切片截取df_full_time['city']=df_full_time['city'].apply(lambda x :x[:x.find('·')]  if x.find('·') != -1  else x) 

text字段清洗

#觀察text字段df_full_time.text.unique()

text字段包含了公司融資情況、公司類型、公司規(guī)模數(shù)據(jù),需將其轉(zhuǎn)化分列,其中公司類型已存在(company_type)
只需轉(zhuǎn)化為公司融資情況和公司規(guī)模兩列
清洗結(jié)果

4、數(shù)據(jù)分析

整體思路

  1. 數(shù)據(jù)類崗位整體需求

  2. 城市、學(xué)歷、工作經(jīng)驗(yàn)對薪水的影響

  3. 不同崗位對應(yīng)的學(xué)歷要求、薪水分布情況

  4. 公司一般會用什么福利待遇來吸引求職者

  5. 不同崗位要求的關(guān)鍵技能點(diǎn)是什么

1、數(shù)據(jù)類崗位整體需求

plt.figure(figsize=(16,6))plt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽plt.rcParams['axes.unicode_minus']=False #用來正常顯示負(fù)號#學(xué)歷plt.subplot(2,3,1)df_full_time.education_background.value_counts().plot(kind='barh',alpha=0.7)#工作經(jīng)驗(yàn)plt.subplot(2,3,2)df_full_time.work_year.value_counts().plot(kind='barh',alpha=0.7)#崗位分布plt.subplot(2,3,3)df_full_time.city.value_counts().plot(kind='pie',autopct='%.1f%%')#公司融資情況plt.subplot(2,3,4)df_full_time.company_financing .value_counts().plot(kind='barh',alpha=0.7)#公司類別plt.subplot(2,3,5)df_full_time.company_type.value_counts().head(6).plot(kind='barh',alpha=0.7)#薪水plt.subplot(2,3,6)#對薪水劃分層次,如18K屬于15-10bins=[0,3,5,10,15,20,30,105]level=['0-3','3-5','5-10','10-15','15-20','20-30','30+']df_full_time['avg_salary_level']=pd.cut(df_full_time.avg_salary,bins=bins,labels=level)df_full_time.avg_salary_level.value_counts().head(6).plot(kind='pie',autopct='%.1f%%')#調(diào)整子圖的間距plt.tight_layout() 

要求

分析:
學(xué)歷要求:大專是最低要求,招高中或中專/中技的極少,最好是本科及以上
工作經(jīng)驗(yàn)需求:偏向招聘有一定經(jīng)驗(yàn)的求職者,尤其3-5年經(jīng)驗(yàn)的需求最旺盛。一般工作3年以上,對于整個職業(yè)的了解會比較深入,技術(shù)趨于成熟,能夠幫助做一些獨(dú)立的項目
崗位分布情況:北上廣深杭對其需求都差不多,相對來說北京機(jī)會最多,廣州偏少
公司融資情況:招聘數(shù)據(jù)類崗位的一般都是達(dá)到了一定規(guī)模的大型企業(yè)
行業(yè)分布情況:互聯(lián)網(wǎng)行業(yè)需求是最多的,包括電商、金融。還有一些乙方公司也有一定需求,比如數(shù)據(jù)服務(wù)類、咨詢類
薪資情況:受工作經(jīng)驗(yàn)影響較大,3年工作經(jīng)驗(yàn)薪資一般集中在20-30K,比較可觀

省略234

5、不同崗位要求的關(guān)鍵技能點(diǎn)是什么

#數(shù)據(jù)運(yùn)營職位相關(guān)技能list_tag1=df_full_time[df_full_time['position']=='數(shù)據(jù)運(yùn)營']['tag1'].tolist()list_tag2=df_full_time[df_full_time['position']=='數(shù)據(jù)運(yùn)營']['tag2'].tolist()list_tag3=df_full_time[df_full_time['position']=='數(shù)據(jù)運(yùn)營']['tag3'].tolist()list_tag4=df_full_time[df_full_time['position']=='數(shù)據(jù)運(yùn)營']['tag4'].tolist()list_tag5=df_full_time[df_full_time['position']=='數(shù)據(jù)運(yùn)營']['tag5'].tolist()?wordcloud_1=pd.Series(list_tag1+list_tag2+list_tag3+list_tag4+list_tag5).value_counts()
?#數(shù)據(jù)分析職位相關(guān)技能#數(shù)據(jù)挖掘職位相關(guān)技能

崗位要求

分析:
數(shù)據(jù)運(yùn)營類崗位要求:基本的數(shù)據(jù)分析工具要掌握,熟悉sql,理解業(yè)務(wù)和產(chǎn)品,會數(shù)據(jù)挖掘和建模更好

數(shù)據(jù)分析類崗位要求:熟悉SQL、 R/Python、hive,掌握基本的數(shù)據(jù)倉庫、數(shù)據(jù)挖掘、建模的知識,具備一定的業(yè)務(wù)經(jīng)驗(yàn)

數(shù)據(jù)挖掘類崗位要求:熟悉Python/R、Spark、Linux、Hadoop、SQL,掌握機(jī)器學(xué)習(xí)算法、數(shù)據(jù)結(jié)構(gòu)等