4
4

More than 3 years have passed since last update.

Pythonでwebエンジニアになるために必要なスキルを探ってみた

Last updated at Posted at 2020-02-03

はじめに

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……

途中から雑になってるのは気にしない。

予想通りの結果という感じでしょうか。

それでは中身の方へ。

環境&構築順序

転職サイトから情報収集

スクレイピング→形態素解析の実装は概ね参考記事の通りなので省略。
1件ごとの求人URL取得→URLを開いて必要スキルの部分を取得→形態素解析で名詞ごとの頻度を算出、という流れになります。
PythonとBeautiful Soupでスクレイピング公式ドキュメントも参考にさせて頂きました。

スクレイピングは特に
・ページを開く前にsleepを挟む
・robots.txtを見てdisallowをチェック
は気を付けましょう。

取得求人件数は、
フロントエンド:208件
サーバーサイド:181件
ゲーム:175件
でした

分析

分析に使用したコードはこちら。

analysis_job_search.py
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サイトのみの調査なので偏りがある

  • 小文字大文字・省略形・誤字脱字などの名寄せ

終わり

簡単に頻度を見ただけですが、これから学習すべき分野の指針にもなったので良かったです。

複数サイトで比較してみたり、横断型サイトでやってみるともっと面白いかもしれませんね。
気になった人はぜひとも自分の目で確かめて欲しい!

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4