接着上一篇的内容,接下來分析下公司行業背景的數量分布
3.2 公司行業分布情況
def sub(x):
return re.sub(r'、| ', ',', x)
df['公司行業'] = df['公司行業'].apply(sub)
原資料中行業分布,有些公司用、代替了,作為分隔符,是以需要用上面的自定義函數來做替換
由于每個公司可能會有不止一個行業背景,是以需要拆分并合并到原表中
def split_data(data, colname, sp=',', rename='行業'):
tmp = data[colname].str.split(sp, expand=True)
r = tmp.stack().reset_index(level=1, drop=True)
r = r.to_frame()
r.columns = [rename]
r.dropna()
result = data.join(r)
return result.dropna(subset=[rename])
r = split_data(df, '公司行業', sp=',')
這是拆分之後的表r

9.png
接下來對r表進行分組統計數量就可以
tmp5 = r.groupby('行業')
tmp5 = tmp5.size()
分組之後顯示如下圖

10.png
用上文中自定義的函數get_values()來擷取可視化所需的x,y軸資料
xindex, vals = get_values(tmp5)
pie = Pie('公司行業分布', height=700, width=1100)
pie.add('', xindex, vals, is_label_show=True, legend_pos='90%',
radius=[20,75], rosetype='area')
pie

公司行業分布.png
可以在圖中看到,移動網際網路行業占據了超過1/3的比例,是以選擇資料分析行業的話,朝移動網際網路行業進軍是個不錯的選擇,每天大量的app活躍,需要一定的資料支撐;而金融和資料服務行業緊随其後,不過這兩個的業務知識水準要求較高;電商的比例并不高,可能是因為需求資料分析的電商品牌本身不多,亦或是許多分析工作偏财務類,由其他崗位負責。
3.3:薪資和工作經驗的關系,箱狀圖
在源資料中篩選出薪資和工作經驗兩列,用seaborn箱狀圖繪圖即可
tmp = df.filter(items=['所需資曆','平均薪資 機關:k'])
plt.figure(figsize=(10,5))
sns.boxplot(x='所需資曆', y='平均薪資 機關:k', data=tmp)

薪資和工作經驗的關系-箱狀圖.png
上圖可發現,5-10年資曆所給出的薪資明顯高于其他;而1年以下的上下限都很低,甚至不如應屆畢業生;1年以上經驗的,大部分薪資都過1w了,算是過了及格線;整體分布符合以往經驗,資曆越高,期望薪資越高。
3.4:教育背景的分布情況以及與薪資之間的關系
薪資除了和工作經驗有關,當然也會和教育背景有所關聯,我們先通過餅圖來直覺看出,教育背景在資料分析崗位上的需求分布
tmp = df.filter(items=['教育程度','平均薪資 機關:k'])
result = tmp.groupby('教育程度')
r = result.size()
xindex, vals = get_values(r)
pie = Pie('教育程度分布情況', height=500, width=800)
pie.add('', xindex, vals, is_label_show=True, legend_pos='90%',
radius=[0,75])
pie

教育程度分布情況-pie.png
大學占據絕大部分的要求,即大多數求職者都能滿足,除去一個異常值,需要博士文憑,大學以上文憑占比隻有6%不到,是以可以說,資料分析崗位對教育背景的門檻并不高。
了解完教育背景分布情況後,我們可以來分析下不同教育背景下,薪資的趨勢是如何的:
result = tmp.groupby('教育程度')
result = result['平均薪資 機關:k'].agg([('平均薪資', 'mean'),('最高薪資',max),('最低薪資',min)])
def convert_f(x):
return '%.2f' % x
result['平均薪資'] = result['平均薪資'].apply(convert_f)
result
上面的代碼目的是根據教育背景來分組,計算拉勾網給出的最高、最低以及上一篇計算出的平均薪資。

11.png
将資料準備好後,就可以可視化了,這回我們用pyecharts中的折線圖Line進行繪制:
from pyecharts import Line
xindex = result.index.values
line = Line('薪資與教育背景')
lcolors = (x for x in ['yellow', 'green', 'red'])
for col in result.columns:
line.add(col, xindex, result[col].values, line_color=next(lcolors), yaxis_formatter='k')
line

薪資與教育背景-line.png
圖中我們可以看到除去異常值的博士文憑,代表“平均薪資”的黃色線,不限、大學和碩士幾乎沒有差距,而大專的平均薪資相對比較低;比較有意思的點是,最高薪資,大學可以達到60k,而碩士比不限還要低,結合上面的教育背景分布餅圖,有可能許多HR對教育背景沒有太多的限制,達到大學即可,是以即使是需要相當經驗和知識水準的崗位,HR所給的教育背景依舊是大學。
3.5:不同工作經驗下,教育背景和平均薪資的走勢
既然根據上面的圖中,我們可以看到工作經驗和教育背景這兩個因素,都對平均薪資有所影響,是以接下來我們來分析下不同工作經驗下,教育背景和平均薪資的走勢:
result = df[df['所需資曆'] != '不限']
tmp = result.filter(items=['所需資曆','教育程度','平均薪資 機關:k'])
# 将x軸資料進行排序,增加可讀性
x = ['應屆畢業生', '1年以下', '1-3年', '3-5年', '5-10年', '10年以上']
def sort_index2(data, x, colname='c'):
list_custom = x
data[colname] = data.所需資曆
data[colname] = data[colname].astype('category')
data[colname].cat.reorder_categories(list_custom, inplace=True)
data.sort_values(colname, inplace=True)
result = data.drop(colname, axis=1)
return result
data = sort_index2(tmp, x)
data

12.png
将x軸坐标排序搞定後,可以進行可視化操作了,使用seaborn的pointplot來顯示趨勢:
hue_order = ['不限','大專','大學','碩士']
plt.figure(figsize=(10,5))
plt.title('不同工作經驗下,教育背景和平均薪資的走勢', pad=20, fontsize=20, color=sns.xkcd_rgb['reddish'])
plt.ylabel('平均薪資 機關:k',labelpad=10, fontsize=12, color=sns.xkcd_rgb['reddish'])
plt.xlabel('所需資曆', labelpad=10, fontsize=12, color=sns.xkcd_rgb['reddish'])
sns.pointplot(x='所需資曆', y='平均薪資 機關:k', hue='教育程度', data=data, ci=0, palette='tab20b_r', hue_order= hue_order)

不同工作經驗下,教育背景和平均薪資的走勢-pointplot.png
可以看到,基本不管是何教育程度,薪資水準都是随着工作經驗的上升而上升;而在相同工作經驗下,也是教育程度越高,薪資越高,符合我們的常識。
3.6:資料分析師技能标簽
最後,我們來看下,作為資料分析師,到底哪些技能标簽,是最為公司所看重和需要的?
tmp = df.filter(items=['技能标簽'])
# 和公司行業背景一樣,技能标簽較多,是以需要拆分
def split_data(data, colname, sp=',', rename='技能'):
tmp = data[colname].str.split(sp, expand=True)
r = tmp.stack().reset_index(level=1, drop=True)
r = r.to_frame()
r.columns = [rename]
r.dropna()
result = data.join(r)
return result.dropna(subset=[rename])
# 看資料可以發現,拉勾網爬取下來的技能标簽是帶有單引号的,是以需要去除
def find_str(x):
return re.search(r"'([\S\s]+?)'", x).group(1)
tmp2 = split_data(tmp, '技能标簽')
tmp2 = tmp2.filter(items=['技能'])
tmp2 = tmp2[tmp2['技能'] != '[]']
tmp2 = tmp2.applymap(find_str)
tmp2

13.png
資料處理好後,可以利用pyecharts中的WordCloud來進行詞雲繪圖:
from pyecharts import WordCloud
result = tmp2.groupby('技能')
result = result.size()
xindex, vals = get_values(result)
word = WordCloud('資料分析技能标簽詞雲', height=500, width=900)
word.add('', xindex, vals, shape='star', word_gap=35, word_size_range=[20,80])
word

資料分析技能标簽詞雲-wordcloud.png
從圖中我們可以看到,基本的資料分析的能力是最為重要的,其次SQL文法也相當關鍵,因為資料分析的自主取數工作也是尤為重要的;BI作為商業智能可視化,也是順應市場潮流;資料挖掘作為資料分析的更深層次技術,各種模型的建立對資料的分類、聚類、預測等有很重要的作用。
3.7:回歸圖分析
最後的最後,既然上圖看出了所需資曆和平均薪資,是呈現一個正相關的,那麼到底是否相關,相關程度如何,還是需要用簡單的一進制線性回歸圖來看一下:
# 将每個所需資曆轉換成間距相同的可計算的離散數值
dic = {'應屆畢業生':1, '1年以下':2, '1-3年':3, '3-5年':4, '5-10年':5, '10年以上':6}
def resample_to_numeric(x):
for y in dic.keys():
if x == y:
return dic[y]
data['所需資曆'] = data.所需資曆.apply(resample_to_numeric)
data

14.png
資料分整理完後用seaborn.lmplot進行作圖:
from scipy import stats
g = sns.jointplot(x='所需資曆', y='平均薪資 機關:k', data=data, kind='reg', color=sns.xkcd_rgb['cool blue'])
g.annotate(stats.pearsonr)
g.savefig('所需資曆和平均薪資關系-lmplot.png')

所需資曆和平均薪資關系-lmplot.png
可以看到皮爾遜相關系數是0.66,p值<.05,是以可信度較高,的确薪資和資曆是呈現一種正相關的。而通過x軸和y軸邊的密度函數圖也能發現,所需資曆集中在3和4,也就是我們自己定義的1-3和3-5年這兩個區間;而平均薪資集中于15k上下。
結語:
至此,從爬取資料,到基本内容的資料分析,本項目告一段落,由于最後的最後通過回歸圖發現了相關性,是以後續可以用機器學習中的線性回歸模型來更深入研究下平均薪資這個因變量與教育背景和工作經驗這兩個自變量之間,到底有多強的相關性。