import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import warnings
from scipy.stats import norm,mode
import re
from wordcloud import WordCloud
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
warnings.filterwarnings('ignore')
讀取csv包警,并且添加header
df=pd.read_csv(r'F:\data\boss.csv',header=None,names=['company','position','address','salary','requires','lables','tags'])
df.head(10)
image.png
df.shape
image.png
去重
df.duplicated().sum()
image.png
df.drop_duplicates(keep='first',inplace=True)
df.duplicated().sum()
image.png
df.shape
image.png
因?yàn)閷?shí)習(xí)的薪資和全職計(jì)算不一樣,所以去掉含有‘實(shí)習(xí)’的行勘畔,以方便統(tǒng)計(jì)
x=df['position'].str.contains('實(shí)習(xí)')
df=df[~x]
df.reset_index(drop=True,inplace=True)
df.shape
image.png
查看address字段是否需要清洗
df['address'].unique()
image.png
address可以使用拴孤,查看salary字段
df['salary'].unique()
image.png
將薪資列的值進(jìn)行拆分坷澡,新增bottom豆挽,top兩列育谬,作為一個(gè)崗位薪資的最低值和最高值,單值的帮哈,用button填充top
df['bottom']=df['salary'].str.extract('^(\d+).*')
df['top']=df['salary'].str.extract('^.*?-(\d+).*')
df['top'].fillna(df['bottom'],inplace=True)
df.head(5)
image.png
有些公司標(biāo)注1X薪等膛檀,故新增一列commission_pct計(jì)算每個(gè)崗位的獎(jiǎng)金率
df['commision_pct']=df['salary'].str.extract('^.*?·(\d{2})薪')
df['commision_pct'].fillna(12,inplace=True)
df['commision_pct']=df['commision_pct'].astype('float64')
df['commision_pct']=df['commision_pct']/12
把bottom,top娘侍,commission__pct列轉(zhuǎn)換為數(shù)值咖刃,計(jì)算出每個(gè)崗位的平均薪資avg_salary
df['bottom'] = df['bottom'].astype('int64')
df['top'] = df['top'].astype('int64')
df['avg_salary'] = (df['bottom']+df['top'])/2*df['commision_pct']
df['avg_salary'] = df['avg_salary'].astype('int64')
cols=list(df)
cols.insert(4,cols.pop(cols.index('bottom')))
cols.insert(5,cols.pop(cols.index('top')))
cols.insert(6,cols.pop(cols.index('commision_pct')))
cols.insert(7,cols.pop(cols.index('avg_salary')))
df=df.loc[:,cols]
df.head(10)
image.png
df.describe()
image.png
去掉一些極端值,這里設(shè)置平均值為3k-70k
df=df[(df.avg_salary>3)&(df.avg_salary<70)]
df.describe()
image.png
觀察requests
df.requires.unique()
image.png
將經(jīng)驗(yàn)需求拆分出來放入experience字段憾筏,學(xué)歷要求放入diploma字段
df['experience']=df['requires'].str.extract('^(\d+/?-\d+)')
df['diploma']=df['requires'].str[-2:]
df.head(10)
image.png
查看experience和diploma字段嚎杨,替換null為'經(jīng)驗(yàn)不限'
df['experience'].unique()
image.png
df['experience'].replace('1-3','1-3年',inplace=True)
df['experience'].replace('3-5','3-5年',inplace=True)
df['experience'].replace('5-10','5-10年',inplace=True)
df['experience'].replace(np.nan,'經(jīng)驗(yàn)不限',inplace=True)
df['experience'].unique()
image.png
df['diploma'].unique()
image.png
觀察lables列,對數(shù)量較少且為傳統(tǒng)行業(yè)的數(shù)據(jù)歸入其他行業(yè)
pd.set_option('max_row',100)
df['lables'].value_counts()
image.png
df.loc[~df['lables'].isin(['互聯(lián)網(wǎng)','計(jì)算機(jī)軟件','移動互聯(lián)網(wǎng)','電子商務(wù)','數(shù)據(jù)服務(wù)','信息安全','計(jì)算機(jī)服務(wù)','咨詢','智能硬件','社交網(wǎng)絡(luò)',
'互聯(lián)網(wǎng)金融','游戲','在線教育','生活服務(wù)','O2O','醫(yī)療健康','貿(mào)易/進(jìn)出口','物流/倉儲 ','企業(yè)服務(wù)','銀行','新零售']),'lables']='其他行業(yè)'
df['lables'].value_counts()
image.png
數(shù)據(jù)可視化和簡單的分析
df.avg_salary.groupby(df['address']).agg(['mean','median']).plot.bar(figsize=(16,8))
image.png
fig=plt.figure(figsize=(12,6),dpi=80)
plt.hist(df['avg_salary'],bins=30,color='#f59311',alpha=0.3,edgecolor='k')
plt.ylabel('崗位數(shù)',fontsize=15)
plt.xlabel('薪資',fontsize=15)
plt.xticks(list(range(0,70,5)))
plt.show()
image.png
少部分人高工資氧腰,月薪一萬至兩萬的崗位不在少數(shù)枫浙。然而四千至五千的崗位居然是最多的翠胰。
plt.figure(figsize=(16,16),dpi=80)
plt.subplot(121)
temp = df[df.avg_salary<10].groupby('address').avg_salary.count()
plt.pie(temp,labels=temp.index,autopct='% .2f%%')
plt.title('薪資小于10K各城市占比')
plt.subplot(122)
temp = df[df.avg_salary>10].groupby('address').avg_salary.count()
plt.pie(temp,labels=temp.index,autopct='% .2f%%')
plt.title('薪資大于10K各城市占比')
image.png
從以上餅圖可以看到,各城市間薪資水平差異非常大自脯,低薪崗位主要分布于江蘇及中西部城市,北上杭深相對工資就高一些斤富。
data1=df[df.address=='北京']['avg_salary']
data2=df[df.address=='上海']['avg_salary']
data3=df[df.address=='廣州']['avg_salary']
data4=df[df.address=='深圳']['avg_salary']
data5=df[df.address=='杭州']['avg_salary']
plt.figure(figsize=(12,6),dpi=80)
plt.boxplot([data1,data2,data3,data4,data5],labels=['北京','上海','廣州','深圳','杭州'],
flierprops={'marker':'o','markerfacecolor':'r','color':'k'},
patch_artist=True,boxprops={'color':'k','facecolor':'#FFFACD'})
ax=plt.gca()
ax.patch.set_facecolor('#FFFAFA')
ax.patch.set_alpha(0.8)
plt.title('主要城市薪資水平箱線圖',fontsize=15)
plt.ylabel('薪資(單位:k)',fontsize=12)
plt.show()
image.png
選取薪資水平較高的五個(gè)城市進(jìn)行分析可以發(fā)現(xiàn)膏潮,北京的薪資水平是最高的,杭州上海深圳相對兩級分化大一些满力。
d = df['avg_salary'].groupby(df['diploma'])
d_avg = d.mean()
c = list(d_avg.index)
v = list(range(1,len(c)+1))
w = d_avg.values.astype('int64')
x = d.median().values.astype('int64')
move = 0.4
plt.figure(figsize=(14,8),dpi=80)
plt.bar(v,w,width=move,color='#eed777')
plt.bar([i+move for i in v],x,width=move,color='#334f65')
a = np.arange(0,7)+1.2
plt.xticks(a,c)
plt.yticks(list(range(0,40,5)))
plt.legend(['均值','中位數(shù)'])
plt.title('各學(xué)歷薪資均值及中位數(shù)比較圖',fontsize=16)
plt.xlabel('學(xué)歷',fontsize = 12)
plt.ylabel('薪資(單位K)',fontsize = 12)
for e,f in zip(v,w):
plt.text(e,f,'{}k'.format(f),ha='center',fontsize=12)
for g,h in zip([i+move for i in v],x):
plt.text(g,h,'{}k'.format(h),ha='center',fontsize=12)
plt.show()
image.png
從學(xué)歷看是否是本科焕参,對薪資水平的影響很大
本科與碩士之間并沒有特別大的差距,博士的薪資水平遠(yuǎn)遠(yuǎn)高于其他學(xué)歷油额。
data = df['diploma'].value_counts()
y=data.values
plt.figure(figsize=(10,10),dpi=80)
plt.pie(y,labels=data.index,autopct='%.1f %%')
plt.show()
image.png
從市場需求來看叠纷,要求本科占據(jù)絕大多數(shù),要求碩士的較少潦嘶,而博士則是極少數(shù)涩嚣。
d = df['avg_salary'].groupby(df['experience'])
d_avg = d.mean()
c = list(d_avg.index)
v = list(range(1,len(c)+1))
w = d_avg.values.astype('int64')
x = d.median().values.astype('int64')
move = 0.4
plt.figure(figsize=(14,8),dpi=80)
plt.bar(v,w,width=move,color='#002c53')
plt.bar([i+move for i in v],x,width=move,color='#0c84c6')
a = np.arange(0,4)+1.2
plt.xticks(a,c)
plt.yticks(list(range(0,40,5)))
plt.legend(['均值','中位數(shù)'])
plt.title('各工作年限薪資均值及中位數(shù)比較圖',fontsize=16)
plt.xlabel('工作經(jīng)驗(yàn)',fontsize = 12)
plt.ylabel('薪資(單位K)',fontsize = 12)
for e,f in zip(v,w):
plt.text(e,f,'{}k'.format(f),ha='center',fontsize=12)
for g,h in zip([i+move for i in v],x):
plt.text(g,h,'{}k'.format(h),ha='center',fontsize=12)
plt.show()
image.png
應(yīng)屆生的工資還是比較低的,一旦有3年工作經(jīng)驗(yàn)掂僵,工資水平將直線上升航厚。
data = df['experience'].value_counts()
y=data.values
plt.figure(figsize=(10,10),dpi=80)
plt.pie(y,labels=data.index,autopct='%.1f %%')
plt.show()
image.png
市場上對于工作經(jīng)驗(yàn)的要求還是很強(qiáng)烈,1-5年的經(jīng)驗(yàn)要求占絕大多數(shù)锰蓬,工作經(jīng)驗(yàn)是入職成功與否的關(guān)鍵因素幔睬。
d = df['avg_salary'].groupby(df['lables'])
d_avg = d.mean()
c = list(d_avg.index)
v = list(range(1,len(c)+1))
w = d_avg.values.astype('int64')
x = d.median().values.astype('int64')
move = 0.4
plt.figure(figsize=(20,8),dpi=80)
plt.bar(v,w,width=move,color='#9de0ff')
plt.bar([i+move for i in v],x,width=move,color='#ffa897')
a = np.arange(0,19)+1.3
plt.xticks(a,c)
plt.yticks(list(range(0,40,5)))
plt.legend(['均值','中位數(shù)'])
plt.title('各行業(yè)薪資均值及中位數(shù)比較圖',fontsize=16)
plt.xlabel('行業(yè)',fontsize = 12)
plt.ylabel('薪資(單位K)',fontsize = 12)
for e,f in zip(v,w):
plt.text(e,f,'{}k'.format(f),ha='center',fontsize=12)
for g,h in zip([i+move for i in v],x):
plt.text(g,h,'{}k'.format(h),ha='center',fontsize=12)
plt.show()
image.png
data = df['lables'].value_counts()
y=data.values
plt.figure(figsize=(10,10),dpi=80)
plt.pie(y,labels=data.index,autopct='%.1f %%')
plt.show()
image.png
上2圖顯示 互聯(lián)網(wǎng)行業(yè)和電子商務(wù)對該崗位的需求非常大,同時(shí)薪資水平相比于其他行業(yè)也高了很多芹扭。而其他傳統(tǒng)行業(yè)相對來說麻顶,無論是需求量還是薪資水平,都低一些舱卡。
from wordcloud import WordCloud
text = df['tags'].dropna().to_string()
# 繪制詞云圖
plt.figure(figsize=(10,8))
wordcloud = WordCloud(font_path = "simhei.ttf",
background_color = "white",
min_font_size = 10,
color_func = lambda *args, **kwargs:(0,0,0),
width = 900, height = 600).generate(text)
plt.imshow(wordcloud)
plt.axis("off")
image.png
發(fā)現(xiàn)有些意義不大的字段重復(fù)率高辅肾,去掉以后再看。
from wordcloud import WordCloud
text = df['tags'].dropna().to_string()
text=text.replace("數(shù)據(jù)分析師",'')
text=text.replace("數(shù)據(jù)分析工程師",'')
text=text.replace("數(shù)據(jù)分析員",'')
text=text.replace("數(shù)據(jù)分析",'')
# 繪制詞云圖
plt.figure(figsize=(10,8))
wordcloud = WordCloud(font_path = "simhei.ttf",
background_color = "white",
min_font_size = 10,
color_func = lambda *args, **kwargs:(0,0,0),
width = 900, height = 600).generate(text)
plt.imshow(wordcloud)
plt.axis("off")
image.png