#はじめに
Pythonで転職サイトをスクレイピングして「必要なスキル」について簡単に調査してみました。
当方がエンジニアを目指しているので、実際に転職サイトではどういった要件が掲げられているのか気になったというのが事の発端です。
アイデアや実装はスクレイピングを勉強したので、未経験者がWEBディレクターになる方法をデータドリブンで考察してみたの記事を思いっきり参考にさせて頂いてます。
間違い、細かいミスなどもじゃんじゃん指摘して下さい!
#必要スキル結論
結果だけちゃちゃっと見たい方へ
-
共通
-
チームでの開発・コミュニケーション能力
-
Git・GitHub
-
フロントエンド
-
html・css・javascript は必修
-
vue・Reactのどちらかが出来ると良い、次いでAngular
-
デザインスキル UI/UXの知見
-
PHP・Ruby・Javaといったサーバーサイド側の言語
-
Photoshop・Illustratorを扱うスキル
-
webpack
-
etc……
-
サーバーサイド
-
Ruby・PHP・Python・C(C#?)・Javaといった言語の習得
-
AWS・GCPなどのクラウドの知見
-
サーバー・インフラ全般の知見
-
Rails・Laravel・Djangoといったwebアプリケーションフレームワーク
-
データベース全般
-
ネットワーク全般
-
フロントエンド側の言語
-
Dockerコンテナ
-
CI/CD
-
etc……
途中から雑になってるのは気にしない。
予想通りの結果という感じでしょうか。
それでは中身の方へ。
#環境&構築順序
-
環境
-
MacOS Mojave 10.14.6
-
Python3.8.1
-
環境構築
-
Homebrewをインストール(元から入ってました)
-
Mysqlインストール(元から入ってました)
-
homebrewでpyenvをインストール
-
pyenvでpythonをインストール
-
venvでディレクトリ下にpython環境を作る
-
bs4,MeCab,jupyter notebook,pandasなどのライブラリをインストール
-
参考
#転職サイトから情報収集
スクレイピング→形態素解析の実装は概ね参考記事の通りなので省略。
1件ごとの求人URL取得→URLを開いて必要スキルの部分を取得→形態素解析で名詞ごとの頻度を算出、という流れになります。
PythonとBeautiful Soupでスクレイピングや公式ドキュメントも参考にさせて頂きました。
スクレイピングは特に
・ページを開く前にsleepを挟む
・robots.txtを見てdisallowをチェック
は気を付けましょう。
取得求人件数は、
フロントエンド:208件
サーバーサイド:181件
ゲーム:175件
でした
#分析
分析に使用したコードはこちら。
import MeCab
import pandas as pd
import numpy as np
import mysql.connector as mydb
import pandas.io.sql as psql
import collections
pd.set_option('display.max_rows', 500)
#textから名詞を抜き出すメソッド
def devide_by_mecab(text):
tagger = MeCab.Tagger("-Ochasen")
node = tagger.parseToNode(text)
word_list = []
while node:
pos = node.feature.split(",")[0]
if pos in ["名詞"]:
word = node.surface
word_list.append(word)
node = node.next
return " ".join(word_list)
#MySQLへ接続 ここに個人の設定
connection = mydb.connect(
host = '',
port = '',
user = '',
password = '',
database = ''
)
#DBからデータを取得
df_frontend = psql.read_sql("SELECT * FROM table WHERE search_word = 'フロントエンド'",connection)
df_serverside = psql.read_sql("SELECT * FROM table WHERE search_word = 'サーバーサイド'",connection)
df_game = psql.read_sql("SELECT * FROM table WHERE search_word = 'ゲームプログラマー'",connection)
#need_skillsを名詞に分解して返すメソッド
def get_all_words(df):
all_words = []
for index, row in df.iterrows():
words = devide_by_mecab(row['need_skills']).split()
all_words.extend(words)
return all_words
count_of_words_frontend = collections.Counter(get_all_words(df_frontend))
count_of_words_serverside = collections.Counter(get_all_words(df_serverside))
count_of_words_game = collections.Counter(get_all_words(df_game))
#全ての名詞を頻度順に見る
count_of_words_frontend.most_common()
count_of_words_serverside.most_common()
count_of_words_game.most_common()
#スキルに関係する単語の配列作成(count >= 6)
frontend_top_words = ['JavaScript', 'CSS', 'HTML', 'js', 'Vue', 'React', 'デザイン', 'チーム', 'Git', 'UI', 'PHP', 'UX', 'Angular', 'Ruby', 'Javascript', 'jQuery', 'Photoshop', 'コミュニケーション', 'API', 'TypeScript', 'SPA', 'Java', 'Sass', 'デザイナー', 'Illustrator', 'JS', 'テスト', 'サーバー', 'webpack', 'GitHub', 'AWS', 'AngularJS', 'WordPress', 'Webpack', 'Rails', 'iOS', 'CMS', 'Python', 'Redux', 'MySQL', 'Gulp', 'Android', 'gulp', 'C', 'SCSS', 'git', 'DB', 'Linux', 'Babel', 'Docker', 'CI']
serverside_top_words = ['Ruby', 'PHP', 'AWS', 'Python', 'C', 'Java', 'サーバー', 'Rails', 'チーム', 'インフラ', 'js', 'Git', 'サーバ', 'Android', 'JavaScript', 'Go', 'Linux', 'Perl', 'HTML', 'MySQL', 'RDBMS', 'CSS', 'クラ', 'ウド', 'API', 'フロント', 'マネジメント', 'GitHub', 'iOS', 'DB', 'GCP', 'React', 'Vue', 'ネットワーク', 'Node', 'HTTP', 'Swift', 'CI', 'Objective', 'Docker', 'セキュリティ', 'Javascript', 'Azure', 'ネイティブ', 'PostgreSQL', 'アーキテクチャ', 'SQL', 'テスト', '#', 'スマート', 'フォン', 'UI', 'MVC', 'コミュニケーション', 'git', 'Scala', 'Kotlin' , 'CD', 'データベース', 'TypeScript', 'Apache', 'LAMP', 'デザイナー', 'コンテナ', 'RDB', 'Laravel']
game_top_words = ['C', '3', 'D', 'Unity', 'Java', 'PHP', 'デザイン', '++', 'サーバー', '++、', 'ネットワーク', 'JavaScript', 'Android', 'マネジメント', '#、', 'Objective', 'Photoshop', 'Maya', 'チーム', 'デザイナー', 'Linux', 'MySQL', 'Ruby', 'Python', 'インフラ', '#', 'グラフィックス', 'サーバ', 'Excel', 'グラフィック', 'コミュニケーション', 'Unreal', 'DCG', 'AWS', 'Perl', 'Illustrator', 'Engine', 'プランナー', 'Word', 'ネイティブ', 'モーション', 'ディレクター', 'HTML', 'UI', 'Flash', 'エフェクト', 'VB', 'サウンド', 'DS', 'OpenGL', 'iOS', 'DirectX']
#単語と出現数のDataFrameを作るメソッド
def get_top_word_df(top_words,count_of_words):
df = pd.DataFrame({})
for i,word in enumerate(top_words):
word_data = pd.Series([word,count_of_words[word]], index=['word','count'], name=i)
df = df.append(word_data)
return df
df_frontend_top_words = get_top_word_df(frontend_top_words,count_of_words_frontend)
df_serverside_top_words = get_top_word_df(serverside_top_words,count_of_words_serverside)
df_game_top_words = get_top_word_df(game_top_words,count_of_words_game)
for df in [df_frontend_top_words,df_serverside_top_words,df_game_top_words]:
df['rank'] = df['count'].rank(ascending = False, method = 'min').astype(int)
df['count'] = df['count'].astype(int)
df_frontend_top_words[['rank','word','count']]
df_serverside_top_words[['rank','word','count']]
df_game_top_words[['rank','word','count']]
まず一度全ての単語を頻度順に出力、スキルと関係のなさそうな単語を人力で除いて再度出力させた形となります。
ゲームプログラマーは個人的に興味があったので追加。
結果は以下の通り。
##フロントエンド
rank | word | count |
---|---|---|
1 | JavaScript | 147 |
2 | CSS | 145 |
3 | HTML | 131 |
4 | js | 72 |
5 | Vue | 63 |
5 | React | 63 |
7 | デザイン | 60 |
8 | チーム | 40 |
9 | Git | 34 |
9 | UI | 34 |
11 | PHP | 31 |
12 | UX | 30 |
13 | Angular | 29 |
14 | Ruby | 23 |
15 | Javascript | 21 |
16 | jQuery | 20 |
16 | Photoshop | 20 |
18 | コミュニケーション | 18 |
18 | API | 18 |
18 | TypeScript | 18 |
18 | SPA | 18 |
22 | Java | 16 |
22 | Sass | 16 |
24 | デザイナー | 15 |
24 | Illustrator | 15 |
24 | JS | 15 |
24 | テスト | 15 |
28 | サーバー | 14 |
29 | webpack | 13 |
29 | GitHub | 13 |
29 | AWS | 13 |
29 | AngularJS | 13 |
33 | WordPress | 12 |
33 | Webpack | 12 |
33 | Rails | 12 |
36 | iOS | 11 |
36 | CMS | 11 |
36 | Python | 11 |
36 | Redux | 11 |
40 | MySQL | 10 |
40 | Gulp | 10 |
42 | Android | 9 |
42 | gulp | 9 |
42 | C | 9 |
45 | SCSS | 8 |
45 | git | 8 |
47 | DB | 7 |
47 | Linux | 7 |
49 | Babel | 6 |
49 | Docker | 6 |
49 | CI | 6 |
##サーバーサイド
rank | word | count |
---|---|---|
1 | Ruby | 81 |
2 | PHP | 67 |
3 | AWS | 50 |
4 | Python | 43 |
5 | C | 42 |
6 | Java | 41 |
7 | サーバー | 37 |
8 | Rails | 34 |
9 | チーム | 33 |
10 | インフラ | 31 |
11 | js | 29 |
12 | Git | 27 |
12 | サーバ | 27 |
14 | Android | 26 |
14 | JavaScript | 26 |
14 | Go | 26 |
17 | Linux | 24 |
17 | Perl | 24 |
19 | HTML | 21 |
19 | MySQL | 21 |
19 | RDBMS | 21 |
22 | CSS | 19 |
23 | クラ | 18 |
23 | ウド | 18 |
23 | API | 18 |
26 | フロント | 17 |
26 | マネジメント | 17 |
26 | GitHub | 17 |
29 | iOS | 16 |
30 | DB | 15 |
30 | GCP | 15 |
30 | React | 15 |
33 | Vue | 14 |
34 | ネットワーク | 12 |
34 | Node | 12 |
36 | HTTP | 11 |
36 | Swift | 11 |
36 | CI | 11 |
36 | Objective | 11 |
40 | Docker | 10 |
40 | セキュリティ | 10 |
40 | Javascript | 10 |
40 | Azure | 10 |
44 | ネイティブ | 9 |
44 | PostgreSQL | 9 |
44 | アーキテクチャ | 9 |
44 | SQL | 9 |
44 | テスト | 9 |
49 | # | 8 |
49 | スマート | 8 |
49 | フォン | 8 |
49 | UI | 8 |
49 | MVC | 8 |
49 | コミュニケーション | 8 |
49 | git | 8 |
49 | Scala | 8 |
57 | Kotlin | 7 |
57 | CD | 7 |
57 | データベース | 7 |
57 | TypeScript | 7 |
57 | Apache | 7 |
57 | LAMP | 7 |
63 | デザイナー | 6 |
63 | コンテナ | 6 |
63 | RDB | 6 |
63 | Laravel | 6 |
##ゲームプログラマー
rank | word | count |
---|---|---|
1 | C | 156 |
2 | 3 | 62 |
3 | D | 49 |
4 | Unity | 45 |
5 | Java | 32 |
6 | PHP | 31 |
7 | デザイン | 29 |
8 | ++ | 26 |
9 | サーバー | 22 |
10 | ++、 | 19 |
10 | ネットワーク | 19 |
12 | JavaScript | 17 |
13 | Android | 15 |
14 | マネジメント | 14 |
15 | #、 | 13 |
16 | Objective | 12 |
16 | Photoshop | 12 |
16 | Maya | 12 |
19 | チーム | 11 |
19 | デザイナー | 11 |
19 | Linux | 11 |
19 | MySQL | 11 |
19 | Ruby | 11 |
19 | Python | 11 |
25 | インフラ | 10 |
25 | # | 10 |
25 | グラフィックス | 10 |
28 | サーバ | 9 |
28 | Excel | 9 |
30 | グラフィック | 8 |
30 | コミュニケーション | 8 |
30 | Unreal | 8 |
30 | DCG | 8 |
30 | AWS | 8 |
30 | Perl | 8 |
36 | Illustrator | 7 |
36 | Engine | 7 |
36 | プランナー | 7 |
36 | Word | 7 |
36 | ネイティブ | 7 |
36 | モーション | 7 |
42 | ディレクター | 6 |
42 | HTML | 6 |
42 | UI | 6 |
42 | Flash | 6 |
42 | エフェクト | 6 |
42 | VB | 6 |
42 | サウンド | 6 |
42 | DS | 6 |
42 | OpenGL | 6 |
42 | iOS | 6 |
42 | DirectX | 6 |
概ね期待通りの結果が得られたような気がします。
本来はちゃんと'javascript' 'Javascript' 'js'など同一の単語を名寄せするべきですが、word数が多くてしんどそうだったので挫折(おい)。
#結論
フロントエンドエンジニア:
html,css,javascriptが飛びぬけており必須と言えそうです。加えてデザイン・UI/UXを強化しつつ、Vue・Reactといったフレームワークを使えるようになることが第二ステップで、以後サーバーサイド側の理解も深めていくと良さそうです。
サーバーサイドエンジニア:
クラウドが'クラ'と'ウド'に分割されてる!……閑話休題。Ruby・PHP・Python・Java辺りが主要言語のようですね(Cはどっちか分かりません)。加えてクラウドも必修科目。データベース、ネットワーク、フロントエンド側の理解も欲しい。勉強することがとにかく多そう。
ゲームプログラマー:
やはり少し方向性が違って面白いですね。C++,C#とUnity、3Dがメインフィールドで、プログラミングをしつつグラフィック周りも習得していく必要がありそうです。
知識が浅いので本当にざっくりとしたことしか言えません……orz。この結果をもとにこれから勉強していきたいと思います!
#課題
-
少し厳しめの単語にしたので取得件数が少なめ(200件前後)
-
1サイトのみの調査なので偏りがある
-
小文字大文字・省略形・誤字脱字などの名寄せ
#終わり
簡単に頻度を見ただけですが、これから学習すべき分野の指針にもなったので良かったです。
複数サイトで比較してみたり、横断型サイトでやってみるともっと面白いかもしれませんね。
気になった人はぜひとも自分の目で確かめて欲しい!