手把手用Python教你分析運籌學薪資狀況

運籌OR帷幄發表於2018-10-31

由於近些年網際網路和計算機的發展,資料對於各個行業來說是一塊新的“金礦”,再加上近兩年人工智慧的興起,資料的重要性更是越加的凸顯,因此一些新的職業比如資料探勘工程師,演算法工程師等成為一個新興的行業。那麼經過了這幾年的發展,這個行業在前景是怎樣的呢?既然是資料行業,我們就用資料來說話吧。

首先我們來找一些資料的來源,對於我們普通人來說,最好的資料來源自然是資料開源網站kaggle (https://www.kaggle.com/),那麼我們就找了一個比較符合我們目標的資料集(https://www.kaggle.com/kaggle/kaggle-survey-2017)。這個資料集包含了很多資訊,這裡僅對其中的薪資分佈做重點分析,其他更有趣的資訊,各位同學可以自行參考本文進一步挖掘。

一、使用的工具及資料的處理

資料可以從上述提供的連結下載,本文主要通過python來進行資料的處理,主要的工具使用了jupyter,資料包包含python中的科學計算工具:numpy, pandas, matplotlib, seaborn, plotly等。

首先我們來分析一下資料,由於資料不是很大,所以可以用最基本的Excel開啟,其中最主要的檔案是‘multipleChoiceResponses.csv’和‘conversionRates.csv’兩個檔案,前者是主要的資料檔案,後者是當時的一個貨幣匯率表,由於我們需要進行薪資對比,所以需要將各個國家的貨幣統一轉換為美元(USD)。

那麼接下來首先將資料解壓後上傳到jupyter中,然後引入必要的包並匯入資料:

由於資料中有一些資訊我們暫時用不到,同時還有匯率資料需要整合,所以先做一下資料的篩選和拼接:

這其中需要性別,國籍,年齡,全職/兼職,職業,學位,年薪等。然後我們主要對全職的年薪感興趣,那麼我們篩選這一部分資料出來,同時去掉一些資訊空值的資料。

下一步我們觀察到資料中記錄的薪資是以字串形式記錄的,那麼我接下來將字串轉換為數字並按照匯率資料統一轉換為美元。

這裡主要的資料前期處理工作已經可以結束了,但是在畫圖的時候發現中國有很多個名稱,我們需要將相關的資料合併,尤其需要注意的是,臺灣也應該算在中國範圍內(特殊強調)。

接下來我們來看一下處理好的資料:

  1. import numpy as np # linear algebra

  2. import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

  3. # Input data files are available in the "../input/" directory.

  4. # For example, running this (by clicking run or pressing Shift+Enter) will list the files in the input directory

  5. import os

  6. # print(os.listdir("../input"))

  7. # Any results you write to the current directory are saved as output.

  8. data = pd.read_csv("../input/multipleChoiceResponses.csv", encoding = "ISO-8859-1")

  9. chang_rate = pd.read_csv("../input/conversionRates.csv", encoding = "ISO-8859-1")

由於資料中有一些資訊我們暫時用不到,同時還有匯率資料需要整合,所以先做一下資料的篩選和拼接:

  1. data_merged = pd.merge(data,chang_rate, how = 'left',left_on='CompensationCurrency', right_on='originCountry' )

  2. data_usefull = data_merged[['GenderSelect','Country', 'Age','EmploymentStatus','CodeWriter',

  3.             'CurrentJobTitleSelect', 'CurrentEmployerType', 'LanguageRecommendationSelect',

  4.             'FormalEducation', 'CompensationAmount', 'CompensationCurrency', 'exchangeRate']]

這其中需要性別,國籍,年齡,全職/兼職,職業,學位,年薪等。然後我們主要對全職的年薪感興趣,那麼我們篩選這一部分資料出來,同時去掉一些資訊空值的資料。

  1. data_selected = data_usefull[data_usefull['EmploymentStatus']=='Employed full-time']

  2. data_selected = data_selected.dropna(axis=0, how = 'any', subset=['Country', 'CompensationAmount','exchangeRate'])

下一步我們觀察到資料中記錄的薪資是以字串形式記錄的,那麼我接下來將字串轉換為數字並按照匯率資料統一轉換為美元。

  1. data_selected['CompensationAmount'] = data_selected['CompensationAmount'].apply(lambda x: x.replace(',',''))

  2. data_selected.drop(data_selected[data_selected['CompensationAmount']=='-'].index,inplace=True)

  3. data_selected['CompensationAmountExanged'] = data_selected.apply(lambda x : float(x['CompensationAmount'])*float(x['exchangeRate']),  axis=1)

這裡主要的資料前期處理工作已經可以結束了,但是在畫圖的時候發現中國有很多個名稱,我們需要將相關的資料合併,尤其需要注意的是,臺灣也應該算在中國範圍內(特殊強調)。

  1. data_selected.replace({"People 's Republic of China":'China' , "Republic of China":'China', "Taiwan":'China'}, inplace = True)

接下來我們來看一下處理好的資料:

data_selected.head()

手把手用Python教你分析運籌學薪資狀況

可以看到資料已經規整的處理好了,那麼資料的整體資訊是什麼樣的呢?

  1. print('The total number of respondents:',data_selected.shape[0])

  2. print('Total number of Countries withrespondents:',data_selected['Country'].nunique())

  3. print('Country with highestrespondents:',data_selected['Country'].value_counts().index[0],'with',data_selected['Country'].value_counts().values[0],'respondents')

  4. print('Youngest respondent:',data_selected['Age'].min(),' and Oldestrespondent:',data_selected['Age'].max())

  1. The total number of respondents: 3774

  2. Total number of Countries with respondents: 50

  3. Country with highest respondents: United States with 1098 respondents

  4. Youngest respondent: 0.0  and Oldest respondent: 100.0

資料一共篩選出了3774條,一共有50個國家,其中人數最多的國家仍然是美國,年齡分佈從0-100(這個年齡沒有做嚴格的篩選,肯定是有問題的)。

二、畫圖與資料分析

首先匯入一些需要要用的包:

程式碼示例

  1. import matplotlib.pyplot as plt

  2. import seaborn as sns

  3. #Import Plotly and use it in the Offline Mode

  4. import plotly

  5. import plotly.offline as py

  6. py.init_notebook_mode(connected=True)

  7. import plotly.tools as tls

  8. import plotly.graph_objs as go

  9. import plotly.tools as tls

  10. import plotly.figure_factory as fig_fact

  11. plotly.tools.set_config_file(world_readable=True, sharing='public')

A . 女效能佔半邊天?

先對性別的分佈做一個統計:

  1. sns.countplot(y='GenderSelect', data=data_selected)

  2. plt.show()

手把手用Python教你分析運籌學薪資狀況

可以明顯的看到對於資料行列來說,男性仍然佔據著一個比較主導的地位,當然還有一些其他的性別,除了人為的填寫錯誤因素,那麼我們真的需要承認現在的世界真是一個多元化的世界。

B . 一騎絕塵的美利堅

接下來統計一下各個國家的人員數量,由於數量過多,僅對前15名進行畫圖:

  1. data_country = data_selected.drop(data_selected[data_selected['Country']=='Other'].index)['Country'].value_counts().to_frame()

  2. sns.barplot(data_country['Country'][:15],data_country.index[:15],palette='inferno')

  3. plt.title('Top 15 Countries by number of respondents')

  4. plt.xlabel('')

  5. fig=plt.gcf()

  6. fig.set_size_inches(10,10)

  7. plt.show()

  8. data_country[:15]

手把手用Python教你分析運籌學薪資狀況

經過這次統計,我們發現人數最多的的國家是美國,其次是印度和英國。不過這個結論還是比較符合我們認知的,不過奇怪的是英國和法國竟然人數在中國之上,但是也從另一個角度反映出,我們國家的資料行業的發展還處於未成熟的階段,國內的人才缺口應該還是很大的。

為了更加直觀一些,我們用地圖來呈現一下:

手把手用Python教你分析運籌學薪資狀況

C . 中堅力量還是年輕人

那麼各個年齡段是如何分佈的呢:

  1. #Plot the Age distribution

  2. fig = fig_fact.create_distplot([data_selected[data_selected['Age'] > 0]['Age']], ['age'], colors=['#BA68C8'])

  3. py.iplot(fig, filename='Basic Distplot')

手把手用Python教你分析運籌學薪資狀況

可以發現這個行業仍然是年輕人的主戰場,主要分佈在30-40歲的範圍,不過這也不奇怪,因為資料分析的行業是一個新興行業,年輕人更容易進入行業中,相信隨著行業的發展,年齡分佈的中心有可能會向著40歲左右偏移,那時應該是更加穩定的行業年齡結構。

D . 薪資起點高,差異化明顯

接下來我們來分析我們這次重頭戲,首先來對所有人員的薪資做一個整體的分佈圖:

  1. plt.subplots(figsize=(15,8))

  2. data_salary=data_selected[data_selected['CompensationAmountExanged']<1000000]

  3. sns.distplot(data_salary['CompensationAmountExanged'])

  4. plt.title('Salary Distribution',size=15)

  5. plt.show()

手把手用Python教你分析運籌學薪資狀況

可以看到總體的薪資還是十分可觀,最高可以到$30000,不過大部分仍然是分佈在低位的,這個差距從圖上看還是很大的,這不排除和不同國家的基本情況有關。一般來說已開發國家的薪資水平要高於發展中國家,那麼是那些國家的水平高,那些國家的水平低呢?

  1. ax[0].axvline(data_salary['CompensationAmountExanged'].median(),linestyle='dashed')

  2. ax[0].set_title('Highest Salary Paying Countries')

  3. ax[0].set_xlabel('')

  4. resp_coun=data_country[:15]

  5. max_coun=data_salary.groupby('Country')['CompensationAmountExanged'].median().to_frame()

  6. max_coun=max_coun[max_coun.index.isin(resp_coun.index)]

  7. max_coun.sort_values(by='CompensationAmountExanged',ascending=True).plot.barh(width=0.8,ax=ax[1],color=sns.color_palette('RdYlGn'))

  8. ax[1].axvline(data_salary['CompensationAmountExanged'].median(),linestyle='dashed')

  9. ax[1].set_title('Compensation of Top 15 Respondent Countries')

  10. ax[1].set_xlabel('')

  11. ax[1].set_ylabel('')

  12. plt.subplots_adjust(wspace=0.8)

  13. plt.show()

手把手用Python教你分析運籌學薪資狀況

從圖中可以用看到美國是人數最多也是薪資最高的國家,說明美國在資料科學領域仍然是當之無愧的老大。可以看到相比之下,中國和印度這些國家雖然人數上很多,但是整體的薪資卻十分不盡如人意。而一些歐洲的已開發國家雖然人數不多但是薪資確實很讓人欣慰的。

那麼結合性別我們再來看看分佈情況:

  1. plt.subplots(figsize=(10,8))

  2. sns.boxplot(y='GenderSelect',x='CompensationAmountExanged',data=data_salary)

  3. plt.ylabel('')

  4. plt.show()

手把手用Python教你分析運籌學薪資狀況

可以看從薪資水平上,性別差別並不大,但是一些高工資部分還是男性主導,這有可能有一些主要管理崗位上還是男性居多,當然這只是一個猜測。

E . 最吃香的還是運籌學

接下來,資料科學領域有很多職業,從這些職業上來看薪資是怎樣的呢:

  1. sal_job=data_salary.groupby('CurrentJobTitleSelect')['CompensationAmountExanged'].median().to_frame().sort_values(by='CompensationAmountExanged',ascending=False)

  2. ax=sns.barplot(sal_job.CompensationAmountExanged,sal_job.index,palette=sns.color_palette('inferno',20))

  3. plt.title('Compensation By Job Title',size=15)

  4. for i, v in enumerate(sal_job.CompensationAmountExanged):

  5.    ax.text(.5, i, v,fontsize=10,color='white',weight='bold')

  6. fig=plt.gcf()

  7. fig.set_size_inches(8,8)

  8. plt.show()

手把手用Python教你分析運籌學薪資狀況

可以看到運籌學從業者佔據了最高的位置,資料科學家僅位居第二,建模工程師第三,軟體開發第四。總體上看還是演算法要比工程賺錢多。

最後我們結合各個國家,不同職位的人數是怎麼樣的呢:

手把手用Python教你分析運籌學薪資狀況

可以看到各個國家的分佈結構還是差別很大的,美國是資料科學家最多,而中國則是機器學習工程師最多,其他國家的分佈大致與美國相似,看來中國對人工智慧的重視還是要遠高於其他國家的。

進一步用每個職位的人數的比例來更直觀的觀察一下各個國家的產業結構:

手把手用Python教你分析運籌學薪資狀況

那麼通過這個圖可以更加明顯的展示每個職位的比重,以每個國家排名前3的職位來看,雖然Data scientist作為大部分國家的主要職位,但是法國和西班牙是佔比最多的國家,分別為43.7%和43%;而排名第二的多數是Data Analysis、Scientist Researcher,但是俄羅斯為Machine Learning engineer;排名第三的還出現了以印度為代表的Softwareengineer。從初步的分析結果上看基本符合各個國家的特點,比如在印度和巴西這樣的國家裡,軟體工程一直佔有比較大的比重。有一個值得注意的是,印度的機器學習排在第四位,那麼可見亞洲國家對於機器學習比較重視,而歐美國家機器學習普遍偏低。

  • 參考文獻

  • 1. https://www.kaggle.com/rounakbanik/data-science-faq

  • 2. https://www.kaggle.com/ash316/novice-to-grandmaster

  • 3. https://www.kaggle.com/hakkisimsek/plotly-tutorial-1

相關文章