IT系勉強会を開催する前に知っておきたいこと(1)~Rで分析してみよう~
はじめまして、iotasです。
弥生でエンジニアをしています。
普段はC++やC#を使ってWebアプリやWindowsアプリを作るお仕事をしているのですが、ここ二年ぐらいはプライベートでRを使いながらいろいろな物事を可視化することにはまっています。
今日は、Rを使って勉強会を可視化し、弥生×Misoca主催の勉強会「もくテク#1」の準備に役立てた話をさせてください。
勉強会の怖さ
皆さん、勉強会には参加されていますか?
勉強会で一番怖いことを想像してみてください。
(参加者目線で)
- んー、人が集まらないこと?
- 内容がつまらない?
- なんか勧誘される?
どれも一理あります。勧誘怖い。
ですが、(完璧にはムリでも)どれも事前に察知できること、のように思います。
私が考える一番怖いことは。
- 自分以外の参加者がみんな主催者の身内だった
です。怖い。アウェイ感半端ないです。身内しか呼ばないのに、なぜイベントサイトで公開した。
もくテクはオープンな場にしたいので、こういう状態を避けたいと思いました。
でも、参加者が少ないとどうしても社員の知り合いとかツテを辿ったメンバーの比率が上がっていきます。
じゃあ、どうやったら参加者を増やせるんだろう。
勉強会を主催したことがないので、右も左もわからない状態からのスタートです。
しかし、ここで投げては人様に「趣味は可視化です」とはいえません。
わからないのであればわかるようにしましょう。
なにを分析したのか
まず、場所と時間ですよね。
もくテク#1は弥生本社である秋葉原で開催されることが決まっていました。
- まず、そもそも秋葉原って人来んの?
という疑問がわきます。
- 開催時間って何時だといいの?
というのも気になります。
開始時刻とジャンルによってプロットする
データが集まったら、プロットしていきましょう。
今回はRを使います。単純にplot関数を使ってもできますが、今回はカスタマイズ性に富むggplotを使います。
データが多すぎると大変なので、範囲は「2016年1月」の平日に絞りました。
library(ggplot2) study_meetup <- read.csv("勉強会人数.csv", fileEncoding="shift-jis") p <- ggplot(study_meetup, aes(x=開始時刻, y=参加者)) p + geom_point(aes(colour=分類)) + scale_x_continuous(breaks=seq(0,24), limits=c(10, 22)) + scale_y_continuous(breaks=seq(0,200, by=10), limits=c(0, 200))
読み込ませたCSVファイルはこんな感じです。
開始時刻,終了時刻,種別,分類,参加者,定員
14,18,R,データ分析・機械学習,2,10
16,19,もくもく会,もくもく会,0,8
18.5,21.5,もくもく会,もくもく会,11,12
19,21,もくもく会,もくもく会,6,10
19.5,21.5,マネタイズ,ビジネス,30,30
ちなみに勉強会のジャンルは私が適当に決めました。イベントサイトによっては「iOS」「機械学習」のようなタグがつけられるところもあるので、そちらを利用しても良いかも知れません。
下がプロットした図。
拡大しないと見づらいかもしれませんが、x軸が開始時刻、y軸が参加者数になっています。
こうしてみると、19:00~20:00の間に勉強会の開始が集中していることが見て取れます。
朝方にもぽつぽつありますが、フリーランスや専業主婦の方向けのイベントのようでした。
20:00になると数がだいぶ数が減るので、特に意図が無ければ開催時刻は19:00か19:30あたりに設定するのが無難でしょう。
一応ジャンルで色分けしてみましたが、そこまで顕著な傾向は出ていなさそう。
(交流会だと人が多くなりがち、って程度?)
線形回帰分析も一応試してみましたが、「勉強会の定員数が多い」と「参加者も多くなる」というような当たり前の相関しか確認できませんでした。
開催場所をプロットする
開催場所をプロットしてみます。最初に勉強会が開催されている場所の緯度と経度を含んだcsvファイルを作成します。
「緯度と経度なんてデータに無いよ」って場合は、住所をGoogleのGoogle Maps Geocoding APIで変換しましょう。
今回取得したデータにも緯度・経度の情報がなかったため、Pythonのコードを書いて変換しました。
import requests import json import csv import codecs class GoogleGeoCodingAccessor: def __init__(self): self.__ApiKey = #ここにgoogle apiのAPI KEYを設定 def convertToLatLng(self, address): url = "https://maps.googleapis.com/maps/api/geocode/json?" url += "address=" + address url += "&" url += "key=" + self.__ApiKey res = requests.get(url) print(res.json()) return res.json() accessor = GoogleGeoCodingAccessor() # 使い方サンプル result = accessor.convertToLatLng('東京都千代田区外神田 4-14-1 秋葉原 UDX 21F') position = result['results'][0]['geometry']['location']
以下のようなファイルを作ればOK。
lng,lat
139.7489739,35.606938
139.7489739,35.606938
139.7781072,35.6184039
139.7758712,35.6210896
使用する地図はGoogleMapとし、ggmapで取得します。(今回は、データの範囲を東京23区に絞りました)
library(ggplot2) library(ggmap) library(scales) # ファイルをロードする study_landscape <- read.csv("###ここに座標を示した.csvファイルのパスを入れる###", fileEncoding="shift-jis") # 座標の緯度経度の最小値・最大値をそれぞれ計算する loc <- c(min(study_landscape$lng), min(study_landscape$lat), max(study_landscape$lng), max(study_landscape$lat)) # 範囲指定してGoogleMapから地図を取得する Map <- ggmap(get_map(location=loc, zoom=12, source="google"))+xlab("")+ylab("") # 地図を描画する study_p <- Map + stat_density2d(data=study_landscape, aes(fill=..level.., x=lng, y=lat, alpha=0.1), geom="polygon") + scale_fill_continuous(low="green", high = "red") + geom_point(data=study_landscape, aes(x=lng, y=lat), color="black")+ scale_alpha_continuous(guide="none", range=c(0,.2)) study_p
これを実行すると、以下のような密度マップが出力されます。
勉強会が密集しているところほど色が赤っぽくなります。
見てみると、勉強会の開催地点はだいたい三つのエリアに集中しているようです。
1つめは言わずとしれた渋谷
2つめは新宿
そして3つめが秋葉原です。
だいたいなんとなく「IT系勉強会」と聞いたときにイメージする場所とも合致しているように思いますが、いかがでしょうか。
やっぱり渋谷は強い!
と見える反面、やや飽和気味のようにも感じます。
単純に考えれば、「IT企業の数が多い場所ほど、IT系勉強会の開催も多い」、という相関が考えられますが、実際にその通りになっているかはデータを見比べてみる必要があります。
また、今回のもくテク#1の会場である「秋葉原」もなかなか有望なように見えますが、こちらも勉強会の数が飽和している恐れはないでしょうか。
そういったわけで、次回はIT企業の分布を調べてみたいと思います。