BOSS直聘行業信息爬取與分析(二)

本來滿心歡喜的期待能有幾百萬的數據,結果程序還沒跑幾天,BOSS直聘的網站就全面改版,全面改版,全面改版,這麼低概率的事件在這麼短几天內就讓我碰到了,簡直就是晴天霹靂啊,好歹讓我跑完一個來回啊,哎......故事猜到了開始卻沒猜到結尾~~~~~~

考慮到時間緊迫,而且重心是在數據的分析階段(單純的數據不經過分析是沒有任何意義的),就沒有再去修改爬取的代碼,後期如果有剛需會再重構代碼,所以目前的分析都是基於已經獲取的25萬多數據上,只能給大家作為參考~~~

下面先講講在面對幾十萬數據時,該採取怎樣的一個流程去進行分析:

一、確定需求

這一點至關重要,我相信很多人一上來就是各種如何導出數據、如何去除異常值等等,其實這都屬於非常細節的東西,大的脈絡如果沒有理清楚,知道再多的細節也無法推動項目的進展。所以一開始你就要清楚自己的大目標是什麼,也就是我們這裡說的需求分析。對於本項目,暫定以及完成的需求有以下幾點:

(1)各城市對職位的需求量(包括總的公司數與提供的職位數)

(2)同職位(數據分析、機器學習、人工智慧相關行業)在不同城市的薪資對比

(3)數據分析、機器學習、人工智慧相關行業的關鍵詞雲圖

後續待補充......

參考鏈接:拉鉤網數據分析

二、熟悉MySQL語言及基本操作

需求確定好之後就要提取相關數據,最開始沒經驗蠢了一把,將幾十萬數據先從資料庫導出到文件,再利用python從文件里讀取,這樣I/O操作不僅佔用空間大,用時長,效率十分低下。後來想到數據爬取入庫時就利用peewee連接好了資料庫,所以利用peewee資料庫增刪查改操作直接從資料庫里讀取就ok了。

因為數據的篩選提取涉及到的欄位很多,直接在代碼中使用peewee進行操作很容易出錯,所以我會先在資料庫里進行篩選查詢,再進行比對。看似多了一個步驟,卻可以省下大量時間與精力。

如果事先沒有MySQL這方面知識的積累,可以在SQL 教程上進行學習,有一定基礎後推薦大家去sqlzoo上進行一定強度的訓練,這樣下來一般的資料庫操作都沒有太大問題了。

針對上面提出的需求,對應的MySQL查詢語句及結果分別如下:

(1)各城市對職位的需求量(包括總的公司數與提供的職位數)

SELECT city, COUNT(DISTINCT company) company_num, COUNT(*) position_num from bosszhipin_post_info where city in (北京, 上海, 廣州, 深圳, 杭州, 天津, 西安, 蘇州, 武漢, 廈門, 長沙, 成都) GROUP BY city

(2)同職位(數據分析、機器學習、人工智慧相關行業)在不同城市的薪資對比

SELECT city, salary, COUNT(*) FROM bosszhipin_post_info WHERE (post_name like %數據% or post_name like %機器學習% or post_name like %人工智慧%) and (city in (北京, 上海, 廣州, 深圳, 杭州, 天津, 西安, 蘇州, 武漢, 廈門, 長沙, 成都)) GROUP BY city, salary

查詢結果較多,只顯示部分,後續操作會在下面進行詳解。

(3)數據分析、機器學習、人工智慧相關行業的關鍵詞雲圖

SELECT post_name,key_word from bosszhipin_post_info WHERE post_name like %數據% or post_name like %機器學習% or post_name like %人工智慧%

三、利用peewee提取數據並進行可視化分析

依據MySQL語言查詢出的結果,我們已經大致知道有哪些欄位,下面就是考慮如何利用peewee來獲取相同的數據,其實兩者的操作大同小異,只有一些細微的差別,感興趣的可以去研究一下。

在利用matplotlib進行可視化時,遇到了很多問題,先列出來供大家參考一下:

中文圖例顯示亂碼

中文圖例亂碼

單個柱狀圖添加數字

雙個柱狀圖添加數字

使用matplotlib繪製柱狀圖教程

(1)各城市對職位的需求量(包括總的公司數與提供的職位數)

  • 數據獲取

from bosszhipin.model.mysql_db import *import numpy as npimport matplotlib.pyplot as plt#各城市對職位的需求量(包括總的職位數與公司數)Post = bosszhipin_post_infomydata_2 = Post.select(Post.city, fn.COUNT(fn.Distinct(Post.company)).alias(company_num), fn.COUNT(Post.id).alias(position_num)).group_by(Post.city)CityList = [北京, 上海, 廣州, 深圳, 杭州, 天津, 西安, 蘇州, 武漢, 廈門, 長沙, 成都]CompanyNumList = [0]*len(CityList)PositionNumList = [0]*len(CityList)#將城市列表、公司數量、職位數量分別存在列表中for item in mydata_2: if item.city in CityList: dex = CityList.index(item.city) CompanyNumList[dex] = item.company_num PositionNumList[dex] = item.position_num

  • 可視化

#繪製柱狀圖N = len(CityList)index = np.arange(N)total_width, n = 0.8, 2bar_width = total_width / nindex = index - (total_width - bar_width) / 2plt.bar(index, CompanyNumList, width=bar_width, label=u公司數量)plt.bar(index + bar_width, PositionNumList, width=bar_width, label=u職位數量)#設置x軸坐標文本plt.xticks(index + 0.5*bar_width, CityList) #前面參數控制文本顯示位置# 添加數據標籤for a, b in zip(index, CompanyNumList): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)for a, b in zip(index + bar_width, PositionNumList): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)#x、y軸標籤與圖形標題# plt.xlabel(u城市)# plt.ylabel(u數量)plt.title(u不同城市的公司數與職位數)#添加圖例plt.legend()plt.show()

  • 分析

從上圖可以分析出以下幾點:

  1. 一線城市北上廣深對人才的需求量還是遠遠高於其他城市,一個是政治中心、一個是經濟中心、一個是珠三角省會、一個是經濟特區,多年來的高速發展已經成滾雪球般的態勢,發展越好,對於人才的需求也更大。
  2. 帝都北京穩居第一,遠超其他三個一線城市,首先跟北京的特殊地位——首都有一定關係,其次互聯網+、人工智慧時代的到來使得互聯網行業成為最熱門的選擇,而最早的一批互聯網公司基本都在北京創立,這一行業的發展吸引了相應行業的人聚集,人的聚集又相應帶動公司的聚集,兩者相互影響使得北京成了互聯網的主力軍。
  3. 杭州一躍成為僅次於一線城市的人才聚集地,跟中國的轉型(依靠科技創新)有著密切的關係,阿里巴巴、網易等知名互聯網公司極大的提高了杭州的科技創新能力和第三產業的發展速度,加大了杭州對於人才的需求。
  4. 武漢、成都、西安等二線城市近年也有崛起之勢,跟國家發展中西部的戰略有很大關係,沿海一線城市逐漸趨於飽和,因為資源、面積、環境等各方面壓力,國家有意向發展二、三線城市,武漢、成都、西安等城市憑藉優良的地理位置,有非常大的發展空間,成為國家發展的首選,各種人才引進計劃使得需求量逐日上升。

(2)同職位(數據分析、機器學習、人工智慧相關行業)在不同城市的薪資對比

  • 數據獲取

from bosszhipin.model.mysql_db import *import numpy as npimport matplotlib.pyplot as pltimport re#分析同職位不同城市的薪資對比Post = bosszhipin_post_infomydata = Post.select(Post.city, Post.salary, fn.COUNT(Post.id).alias(num)).where(Post.post_name % %數據%| Post.post_name % %機器學習%| Post.post_name % %人工智慧%).group_by(Post.city, Post.salary)Number = len(mydata) #記錄的總個數CityList = [北京, 上海, 廣州, 深圳, 杭州, 天津, 西安, 蘇州, 武漢, 廈門, 長沙, 成都]range_1 = [0]*len(CityList) #0k—5k(包含5)range_2 = [0]*len(CityList) #5k—10k(包含10)range_3 = [0]*len(CityList) #10k—15k(包含15)range_4 = [0]*len(CityList) #15k—20k(包含20)range_5 = [0]*len(CityList) #20k以上for item in mydata: if item.city in CityList: m = re.match(r(.*)K-(.*)K, item.salary) MinSalaryNum = int(m.group(1)) MaxSalaryNum = int(m.group(2)) AveSalary = (MinSalaryNum + MaxSalaryNum) / 2 dex = CityList.index(item.city) if AveSalary > 0 and AveSalary <= 5: range_1[dex] += item.num elif AveSalary > 5 and AveSalary <= 10: range_2[dex] += item.num elif AveSalary > 10 and AveSalary <= 15: range_3[dex] += item.num elif AveSalary > 15 and AveSalary <= 20: range_4[dex] += item.num else: range_5[dex] += item.num

  • 可視化

#繪製柱狀圖N = len(CityList)index = np.arange(N)total_width, n = 0.8, 5bar_width = total_width / nindex = index - (total_width - bar_width) / 2plt.bar(index, range_1, width=bar_width, label=0k-5k)plt.bar(index + bar_width, range_2, width=bar_width, label=5k-10k)plt.bar(index + 2*bar_width, range_3, width=bar_width, label=10k-15k)plt.bar(index + 3*bar_width, range_4, width=bar_width, label=15k-20k)plt.bar(index + 4*bar_width, range_5, width=bar_width, label=u20k以上)#設置x軸坐標文本plt.xticks(index + 2*bar_width, CityList) #前面參數控制文本顯示位置# 添加數據標籤for a, b in zip(index, range_1): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)for a, b in zip(index + bar_width, range_2): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)for a, b in zip(index + 2*bar_width, range_3): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)for a, b in zip(index + 3*bar_width, range_4): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)for a, b in zip(index + 4*bar_width, range_5): if b != 0: plt.text(a, b+0.05, %.0f % b, ha=center, va=bottom, fontsize=11)#x、y軸標籤與圖形標題# plt.xlabel(u城市)# plt.ylabel(u數量)plt.title(u同職位不同城市的薪資對比)#添加圖例plt.legend()plt.show()

  • 分析

該需求所涉及的行業是與數據分析、機器學習、人工智慧等相關的,從上圖可以分析出以下幾點:

  1. 最直觀的就是北京20K以上的職位數遠遠大於其他城市,接近第二位(杭州)的2倍,這也有力的支持了北京平均薪酬水平全國最高的觀點,有報道北京地區平均薪資排名前十的行業中,互聯網相關的行業就佔據了較多的席位,如互聯網/電子商務、IT服務(系統/數據/維護)等。
  2. 北上廣深杭五個城市的低薪職位數量(5K以下)佔比非常小,相比之下高薪(20K以上)職位數佔有非常大的比例,高薪的誘惑也是近年來驅動相關從業者大量湧入這些城市的原因。
  3. 除北上廣深杭這幾個城市外,其他城市各檔薪資職位數的分布較為均勻。
  4. 數據分析、機器學習、人工智慧相關行業的職位絕大多數都集中在北上廣深杭這些城市,其他城市提供相關行業的機會較少,可供選擇的不多。

(3)數據分析、機器學習、人工智慧相關行業的關鍵詞雲圖

利用python製作詞雲圖還是第一次接觸,中間也折騰了很久,參考了大量的資料:

文件寫入中英文字元串

寫入中文亂碼

安裝wordcloud出錯解決方法

製作詞雲圖

詞雲圖中文亂碼

  • 數據獲取與可視化

from bosszhipin.model.mysql_db import *import matplotlib.pyplot as pltimport codecsimport jiebafrom wordcloud import WordCloud#製作詞雲圖Post = bosszhipin_post_info#模糊查詢,並使用了OR操作mydata_2 = Post.select(Post.key_word).where(Post.post_name % %數據%| Post.post_name % %機器學習%| Post.post_name % %人工智慧%)#將字元串存入文件中fr = codecs.open(word_set.txt, a, encoding=utf8)#print(len(mydata_2))for item in mydata_2: fr.write(item.key_word) fr.write(,)fr.close()#從文件中提取字元串並進行分詞text = codecs.open(word_set.txt,"r", encoding=utf8).read()cut_text= jieba.cut(text)result= .join(cut_text)# print(result)#找到能用的中文字體font = rC:WindowsFontssimfang.ttfwc = WordCloud(collocations=False, font_path=font,background_color=white,width=800,height=600,max_font_size=100,max_words=500)#,min_font_size=10)#,mode=RGBA,colormap=pink)wc.generate(result)#保存圖片wc.to_file("E:/bosszhipin/bosszhipin/bosszhipin/analysis/wordcloud.png")#顯示圖片plt.figure("關鍵詞雲圖") #指定所繪圖名稱plt.imshow(wc) # 以圖片的形式顯示詞雲plt.axis("off") #關閉圖像坐標系plt.show()

  • 分析

上面的詞雲圖是根據數據分析、機器學習、人工智慧相關行業的關鍵詞生成的,字體越大,說明在所有關鍵詞中出現的次數越多。從上圖中,我們挑選出現次數最多的10個詞語,分別為『數據分析』、『數據挖掘』、『數據處理』、『機器學習』、『數據倉庫』、『MySQL』、『python』、『資料庫』、『Hadoop』、『Hive』等,這說明相關職位對於求職者的技能要求大都體現在這些方面,可以有選擇的進行學習。在此推薦幾本相關的書籍:《深入淺出數據分析》、周志華的《機器學習》,Peter的《機器學習實戰》,《數據挖掘:概念與技術》等。

進一步的分析還在進行中,後面會陸續更新,大家有什麼問題或建議可以直接評論區留言或私信,你們的反饋將是我最寶貴的財富!

未經許可,禁止轉載!!!

推薦閱讀:

2018年一定要收藏的20款免費預測分析軟體!
選全明星哪家強,機器學習來幫忙
Python LEVEL4:數據分析標準步驟
基於新浪微博的男女性擇偶觀數據分析

TAG:boss直聘 | 數據分析 | 數據可視化 |