數(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ù)分析
整體思路
-
數(shù)據(jù)類崗位整體需求
-
城市、學(xué)歷、工作經(jīng)驗(yàn)對薪水的影響
-
不同崗位對應(yīng)的學(xué)歷要求、薪水分布情況
-
公司一般會用什么福利待遇來吸引求職者
-
不同崗位要求的關(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)等