エンジニアの求職者が弊社HPを訪れた場合必ず立ち寄るであろう、
[お仕事案件ページ]
(https://ritsuan.com/job/)
ここの更新頻度が非常に低く、古い案件も埃を被ったままメンテナンスがされていないのである。
駄目だこいつ…早くなんとかしないと…
そんな事を思いながらしばらくネット上を徘徊していたらこんなのを見つけてしまった。
[県別データの可視化]
(https://qiita.com/SaitoTsutomu/items/6d17889ba47357e44131)
お仕事案件ページの県別案件数を可視化して更新を促してやろう!
最近事業範囲拡大してるようだし、日本全国主要都市周りの案件数が多い結果になるんだろうな!(前フリ)
ひらめいたこと
- お仕事案件情報を都道府県名でスクレイピング
- 都道府県別に案件数をリスト化
- 案件数に応じてjapanmapでコロプレス図表示
- そろそろQiitaに投稿しないと忘れられちゃう(切実)
環境
- Windows10
- python : 3.6.3
- japanmap : 0.0.21
- requests : 2.22.0
- beautifulsoup4 : 4.7.1
- matplotlib : 3.1.3
- pandas : 0.25.3
案件数可視化
試行錯誤してとりあえず出来上がったのがこちら。
※jupyter notebook上で表示している為、記事上一部不要なコードあり。
改善点があれば諸先輩方には是非ともご指摘いただきたい。
import requests
from bs4 import BeautifulSoup
from japanmap import pref_names, picture
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
plis=[]
for y in range(47):
plis.append(0)
for z in range(50):
r = requests.get('https://ritsuan.com/job/page/{}'.format(z+1))
bs = BeautifulSoup(r.text, 'html.parser')
for i in range(47):
pnlist = pref_names[i+1]
for j in bs.select("div[class=main_container] h2"):
pc = j.text
if pnlist in pc:
plis[i] += 1
dic={}
for k in range(47):
pdic = pref_names[k+1]
dic[pdic] = plis[k]
cmap = plt.get_cmap("Reds")
df = pd.DataFrame.from_dict(dic, orient="index", columns=["案件数"])
norm = plt.Normalize(vmin=df.min(), vmax=df.max())
fcol = lambda x: '#' + bytes(cmap(norm(x), bytes=True)[:3]).hex()
plt.rcParams['figure.figsize'] = 20, 20
plt.colorbar(plt.cm.ScalarMappable(norm, cmap))
plt.imshow(picture(df.案件数.apply(fcol)))
結果
こうなった。
なんだこれは。関東~東海地域だけがやたらと濃い。
本社が静岡県である以上こうなるのは予想していたが、事業範囲はもっと拡大しているのではなかったのか。
そうか、一部地域が突出しているせいで他の地域が埋もれて薄く見えてしまっているんだな。
早速確認だ。リスト化しよう。
df = pd.DataFrame.from_dict(dic, orient="index", columns=["案件数"])
df.to_excel("job_list.xlsx", sheet_name="job_list")
都道府県 | 案件数 | 都道府県 | 案件数 | 都道府県 | 案件数 |
---|---|---|---|---|---|
北海道 | 0 | 石川県 | 0 | 岡山県 | 0 |
青森県 | 1 | 福井県 | 0 | 広島県 | 2 |
岩手県 | 0 | 山梨県 | 2 | 山口県 | 0 |
宮城県 | 1 | 長野県 | 0 | 徳島県 | 0 |
秋田県 | 0 | 岐阜県 | 3 | 香川県 | 0 |
山形県 | 0 | 静岡県 | 62 | 愛媛県 | 0 |
福島県 | 0 | 愛知県 | 90 | 高知県 | 0 |
茨城県 | 12 | 三重県 | 7 | 福岡県 | 2 |
栃木県 | 1 | 滋賀県 | 4 | 佐賀県 | 0 |
群馬県 | 7 | 京都府 | 0 | 長崎県 | 0 |
埼玉県 | 9 | 大阪府 | 3 | 熊本県 | 0 |
千葉県 | 2 | 兵庫県 | 1 | 大分県 | 1 |
東京都 | 133 | 奈良県 | 0 | 宮崎県 | 0 |
神奈川県 | 60 | 和歌山県 | 0 | 鹿児島県 | 0 |
新潟県 | 0 | 鳥取県 | 0 | 沖縄県 | 2 |
富山県 | 0 | 島根県 | 0 |
oh...
申し訳なさ程度に案件数一桁の地域があるが、これは本当に存在しているのだろうか。
該当地域の求職者の方が見たらあのセリフが聞こえてきそうだ。
「うわっ…私の地域案件少なすぎ…?」
これではコロプレス図で可視化してもほぼ表示されないわけだ。
さて、日本全国主要都市に案件数が多い結果になるというはずだったが、予想を大幅に覆す結果となり驚愕している。(回収)
関西にも事業所があると聞いていたが、やはり更新されてないようだ。
これでエビデンス(?)も揃ったので、更新を煽ることができる。
想定外だったこと
今回、お仕事案件リストにある【〇〇県~】の部分を検索しているのだが、この中に企業名や複数の地域名が記載されているパターンがあり検索数としてカウントされていない。このような統一性のない記載方法は世間的に受け入れられないだろう。検索できないので早急に直すべきである。
尚、「住所」欄で検索しようと試みてはみたが、htmlの記述内容から手間がかかりそうだったので実施していない。
今後調整したい内容
- 地域毎の業種の偏り
- お仕事案件情報最終ページ認識と終了
最後に
matplotlibのcolormapには沢山の種類があり、今回全種類試してみたので掲載しておく。
完全に趣味の領域であるがのんびりとご覧いただきたい。
viridis


inferno

magma

cividis

Greys

Purples

Blues

Greens

Oranges

Reds

YlOrBr

YlOrRd

OrRd

PuRd

RdPu

BuPu

GnBu

PuBu

YlGnBu

PuBuGn

BuGn

YlGn

binary

gist_yarg

gist_gray

gray

bone

pink

spring

summer

autumn

winter

cool

Wistia

hot

afmhot

gist_heat

copper

PiYG

PrGn

BrBG

PuOr

RdGy

RdBu

RdYlBu

RdYlGn

Spectral

coolwarm

bwr

seismic

twilight

twilight_shifted

hsv

Pastel1

Pastel2

Paired

Accent

Dark2

Set1

Set2

Set3

tab10

tab20

tab20b

tab20c

flag

prism

ocean

gist_earth

terrain

gist_stern

gnuplot

gnuplot2

CMRmap

cubehelix

brg

gist_rainbow

rainbow

jet

nipy_spectral

gist_ncar

ここまでスクロールしたあなたも物好きな方と見受けられる。
エンジニアにはこのような遊び心も時には大事だろう。