フリーランチ食べたい

機械学習、Python、ソフトウェアエンジニアリング、プロダクティビティなど

研究がESSSB 17th@ベルギー・ヘントでポスター発表されました!

ESSSBとは

正式名称はEuropean Symposium on Suicide & Suicidal Behaviourで、自殺行動/自殺予防について学際的な観点から研究された発表やポスターが多い学会です。今年はベルギーのヘントで開催されました。

www.esssb17.org

ポスター

タイトルは「Regional suicide rates and affecting factors in Japan: an ecological study by using Generalized Linear Model and Machine Learning」です。各都道府県ごとの自殺率と、失業率、中学/高校進学率、一人当たり災害復旧費などの関係について、状態空間モデルとRidge回帰を使って探索的/仮説検証的の両面から検証した研究になります。自分はモデルの設計/実装とグラフの作成を主に行いました。

f:id:mergyi:20180923174656p:plain

発表

発表はFirstAuthoのOeくんがしてくれました。この研究のアピールポイントは、この分野では今まで活用が少なかったMachineLearningを活用して仮説探索/検証を行った点だったのですが、現地でも好評で興味を持ってくれた方が多かったようです。

f:id:mergyi:20180923180657j:plain

さいごに

全国の実際の自殺率データを扱って考察を得るのは非常に興味深い体験でした。 今回はマクロな視点からの研究だったので、この研究で得られたことを活かしつつ細かい、具体的な見識を得ていきたいと感じました

BigQuery GIS/GeoPandasを使ってお手軽にIPアドレスで地理空間分析を行う「Wikipediaはどこから編集されている?」

TL;DR

アクセスログ解析でのIPアドレス

データ

実際にはアクセスログなどを使うことになると思いますが、テスト用に使える手頃なアクセスログを持ち合わせてないので、BigQuery内にあるsampledataのwikipediaテーブルを使います。wikipediaテーブルには編集者のIPなどが記録されているcontributor_ipというカラムがあります。

https://bigquery.cloud.google.com/table/publicdata:samples.wikipedia

contributor_ip: Typically, either ip or (id and username) will be set. IP information is unavailable for edits from registered accounts. A (very) small fraction of edits have neither ip or (id and username). They show up on Wikipedia as "(Username or IP removed)".

今回は、これを使って「どの地域からのWikipediaの編集が多いか」を可視化してみたいと思います。

Geoip geolocation with Google BigQuery

まずIPアドレスと位置情報の紐づけを行います。紐づけを行えるサービスというものが幾つかあって、最初はipstackなどを使っていました。ipstackは無料で月1000アクセス紐づけを行えるサービスで、手早く試せたので良かったのですが…

ipstack.com

途中で、BigQueryにIPアドレスと位置情報の紐づけ用のTableがあることを知り、こちらを使うことにしました。無料ですし紐づけも高速なので、もしデータがBigQuery上にあるなら使わない手はないと思います。

cloudplatform.googleblog.com

下記のようなSQLfh-bigquery.geocode.geolite_city_bq_b2b にJOINし、緯度経度と都市名、それぞれの場所ごとに何件データがあったかを取得します。IPアドレスと位置情報は都市ごとに紐づけが行われます。

WITH safe AS (
  SELECT
    NET.SAFE_IP_FROM_STRING(contributor_ip) AS ip,  
    LENGTH(NET.SAFE_IP_FROM_STRING(contributor_ip)) AS len 
  FROM
      `publicdata.samples.wikipedia` 
  WHERE contributor_ip IS NOT NULL
),
wiki_ips AS (
  SELECT 
    NET.IPV4_TO_INT64(ip) AS clientIpNum,
    TRUNC(NET.IPV4_TO_INT64(ip)/(256*256)) AS classB_
  FROM safe 
  WHERE ip IS NOT NULL 
    AND len = 4
)
SELECT MAX(b.longitude) AS longitude, MAX(b.latitude) AS latitude, b.city 
FROM wiki_ips  
LEFT JOIN `fh-bigquery.geocode.geolite_city_bq_b2b`AS b ON wiki_ips.classB_ = b.classB
WHERE wiki_ips.clientIpNum BETWEEN b.startIpNum AND b.endIpNum
GROUP BY b.city 
HAVING MAX(b.country) = 'JP'
;

都市ごとにカウントすると下記のようになります。当然といえば当然ですが、東京が圧倒的ですね。5位に高知が来ているのは少し気になります。とてもアクティブな編集者の方がいらっしゃるのでしょうか?

f:id:mergyi:20180916021248p:plain

ちなみに世界版だとこんな感じでした。ロンドンが1位なのはちょっと予想外でした。

f:id:mergyi:20180916030709p:plain

国土地理院地図データ「地球地図日本」

それではこのデータを地理情報として可視化してみたいと思います。Pythonで地図をPlotするためには地図データが必要です。地図データは国土地理院が「地球地図日本」として公開してくれているのでこちらを使います。

地球地図日本|国土地理院

下記のダウンロードスクリプトを使うとローカルに日本地図だけでなく路線地図などもダウンロードしてこれます。

import os
import zipfile
from pathlib import Path
import requests
from tqdm import tqdm
import pandas as pd 

data_dir = Path(os.getcwd())/'data'

# ZipFileがあるURLエンドポイント
gm_jpn_url = 'http://www1.gsi.go.jp/geowww/globalmap-gsi/download/data/gm-japan/gm-jpn-all_u_2_2.zip'

r = requests.get(gm_jpn_url, stream=True)
filename = data_dir/'gm-jpn.zip'

# 容量が大きいのでchunk_sizeごとにダウンロード
with open(filename, 'wb') as f:
    for chunk in tqdm(r.iter_content(chunk_size=1024)):
        if chunk:
            f.write(chunk)
            f.flush()

# Zipファイルを解答
zfile = zipfile.ZipFile(filename)
zfile.extractall(data_dir)

# ダウンロードファイルをチェック
os.listdir(data_dir/'gm-jpn-all_u_2_2')
# => ['trans_jpn.met',
# 'builtupp_jpn.prj',
# 'coastl_jpn.shx',
# 'polbnda_jpn.dbf',
# 'miscl_jpn.dbf',
# 'rstatp_jpn.dbf',
# 'raill_jpn.shp',
# 'coastl_jpn.shp',
# 'inwatera_jpn.prj',
# 'miscp_jpn.dbf',
# 'raill_jpn.shx', ...

GeoPandas

GeoPandas 0.4.0 — GeoPandas 0.4.0 documentation

GeoPandasというPythonのライブラリを使います。GeoPandasはPandasのデータ形式を活用しつつ、地図がPlotできるとても便利なライブラリです。

GeoPandas 0.4.0 — GeoPandas 0.4.0 documentation

※ GeoPandasの基本的な説明は僕が勝手に大尊敬しているsinhrksさんのBlogのエントリがオススメです

sinhrks.hatenablog.com

GeoPandasを使ってどの都市から編集されているかをPlotしてみます。

# 先程のクエリの結果をDataFrameに読み込み
df = pd.read_gbq(query, project_id=os.environ.get('PROJECT_ID'), dialect='standard')

# 日本地図の読み込み
gdf_jpn = gpd.read_file(str(data_dir/'gm-jpn/gm-jpn-all_u_2_2/polbnda_jpn.shp'))

# GeoDataFrame形式に変換
df['coordinates'] = list(zip(df['longitude'].astype(float), df['latitude'].astype(float)))
df['coordinates'] = df['coordinates'].apply(Point)
gdf = gpd.GeoDataFrame(df, geometry='coordinates')

# 日本地図に重ね合わねて表示
fig, axes = plt.subplots(figsize=(24, 8))
gdf_jpn.plot(color='C7', axes=axes)
gdf.plot(axes=axes, alpha=.3, color='C0', markersize=100)
plt.xlim(129, 145)
plt.ylim(30, 45)
plt.grid(False)

f:id:mergyi:20180916021718p:plain

人工が多い都市圏に固まっているのは予想通りですが、予想以上に全国的に満遍なく分布していることがわかりました。また北陸地方が少し多めなことも気になりました。もしかしたらJAISTなどがあることが影響しているのかもしれません。

BigQuery GIS

さて、実は本当に最近なのですが、BigQuery GISというサービス/機能群がGoogleから発表されて、今GeoPandasでやったようなことを BigQueryを書くだけでできる ようになりました。簡単に使い方を説明しながら地図上にPlotしてみたいと思います。

www.youtube.com

Geo Vizにアクセス

可視化には、BigQuery GISの中のGeo Vizを使います。まず下のURLにアクセスします。

BigQuery Geo Viz

Queryの入力

下記画像のSelect Dataに下記のようなQueryを入力します。

f:id:mergyi:20180916024041p:plain

WITH safe AS (
  SELECT
    NET.SAFE_IP_FROM_STRING(contributor_ip) AS ip,  
    LENGTH(NET.SAFE_IP_FROM_STRING(contributor_ip)) AS len 
  FROM
      `publicdata.samples.wikipedia` 
  WHERE contributor_ip IS NOT NULL
),
wiki_ips AS (
  SELECT 
    NET.IPV4_TO_INT64(ip) AS clientIpNum,
    TRUNC(NET.IPV4_TO_INT64(ip)/(256*256)) AS classB_
  FROM safe 
  WHERE ip IS NOT NULL 
    AND len = 4
), 
address AS (
  SELECT MAX(b.longitude) AS longitude, MAX(b.latitude) AS latitude, b.city, COUNT(*) AS count
  FROM wiki_ips  
  LEFT JOIN `fh-bigquery.geocode.geolite_city_bq_b2b`AS b ON wiki_ips.classB_ = b.classB
  WHERE wiki_ips.clientIpNum BETWEEN b.startIpNum AND b.endIpNum
  GROUP BY b.city 
  HAVING MAX(b.country) = 'JP'
)
SELECT 
    ST_GeogPoint(SAFE_CAST(longitude AS FLOAT64), SAFE_CAST(latitude AS FLOAT64))  AS wkt, count
FROM address 
ORDER BY count DESC
;

Queryは先程のものに少しだけクエリを追加しています。 ポイントは ST_GeogPoint(SAFE_CAST(longitude AS FLOAT64), SAFE_CAST(latitude AS FLOAT64)) です。ここでPOINT型に変換しています。BigQueryのWebConsoleで見ると変換されていることがわかります。

f:id:mergyi:20180916024228p:plain

他の型や変換方法についてはDocumentに記載されています。 Geography Functions in Standard SQL  |  BigQuery  |  Google Cloud

カラムを選択

POINT型が入っているカラムを選びます

f:id:mergyi:20180916024314p:plain

スタイルを選択します

マーカーの色や大きさ、透過度などを設定できます

f:id:mergyi:20180916024537p:plain

完成

BigQueryを書いて少し設定するだけで地理情報を可視化することができました。 f:id:mergyi:20180916030135g:plain

ちなみに世界版の同様に簡単に作れます。こちらは次の項目で書きますが2000件の上限に引っかかってしまい全ての点をPlotできていない点にご注意ください。アメリカの西側がやけに少ないのはそれが原因だと思います。

f:id:mergyi:20180916031246p:plain

制限

Geo Vizには幾つかの制限があるのでご注意ください。例えば実際に業務で使う際には下記のような制限が影響してくる可能性が高いです。

  • Geo Vizには上限2000個の結果しかPlotできません
  • Geo Vizはシェアや保存はできません

こういった場合は、GeoPandasなど他の選択肢を検討するのが良さそうです。

まとめ&感想

  • BigQueryに入っているIPデータからGeoPandasやBigQuery GISを使ってお手軽に地理空間分析を行えることがわかりました
  • Geo VizにはJupyterNotebookのExtensionもあって、Jupyterからも表示できるみたいなのでこちらも触ってみたいと思いました
  • Geo Vizは注意点としてはまだBeta版としては挙動が怪しい場面もちょくちょくありますが、その際はリロードしたら直りましたので参考にしてください!

PyCon JP 2018のトークのスケジューリングを行い、Blog投稿しました

ついに来週PyCon JP 2018です

今週buildersconに参加してきたのもあって、体が温まっている感じがします。笑 今回、PyCon JPには運営側で参加しますが、そもそも PyCon JPに参加するのがはじめてなので(!)そういう意味でもとてもワクワクしています。

トークのスケジューリングをBlogに投稿しました

自分の担当は以前Blogに投稿したように(PyCon JP2018のHPを作成しました。 - フリーランチ食べたい) システムなのですが、「タイムテーブルを作る人でが足りてない」とのことだったので助っ人として手伝わせていただきました。ただ、自分も当然もともとのシステムチームのタスクもあるので、そこまでガッツリ時間を取ることは難しそうで、そこから今回の最適化問題としてスケジューリングをするというアイディアが浮かびました。

pyconjp.blogspot.com

来週遊びに来てください

PyCon JP 2018のチケットは社会人分は完売しているのですが、学生分はまだ少数あるみたいなので、もし興味がある方いれば是非是非遊びに来てくださいね

pycon.jp

JSPN2018: 第114回日本精神神経学会で「DPATの個別対応と決定要因に関する分析」というタイトルでポスター発表を行いました

JSPN2018でポスター発表を行いました

実際に話したのはボスなので、何というのが正確かはわかりませんが、ポスター発表の実際の研究部分を担当しました。

www.congre.co.jp

ざっくりとした背景と内容

DPATという自然災害などの後に、被災地域に入り、精神科医療および精神保健活動の支援を行う専門的チームがあります。

www.dpat.jp

このDPATは2016年の熊本地震の際にも稼働し、被災地の医療行為を行っていました。熊本地震のように被災地が広い場合は当然限られた人的リソースを配分する必要があり、今回も行っていたのですが、配分のやり方について、まだ知見が溜まっておらずヒューリスティックにその場その場で判断していました。震災後、配分方法のデータだったり、患者さん/症状、実際にどう対応したかのデータが集まってきたのでそれを元に適切なリソース配分方法だったり、それ以外の関連する気づきを得るのが今回の目的でした。

ポスター

f:id:mergyi:20180909194905p:plain

最後に

このようにポスターをブログに載せるというのはあまり一般的ではないと思いますが、こういった研究成果をエンジニア/データサイエンティストとして、どのように集約していくか、は難しいと感じている背景があります。アカデミックな領域だけで簡潔するのであればアカデミックなやり方で全て簡潔しますが、自分のようにエンジニア/データサイエンティストとして適切に評価を受けたい場合、アカデミック以外の方にもわかりやすくまとめられていることが必要になります。こういった課題を抱えている方はそんなに多くないと思いますが、自分だけではないと思うので他の方がどうやっているかを調べたり、自分なりに検討していきたいと思います。

PyCon JP2018のHPを作成しました。

PyCon JP2018

今年の5~7月に主に開発をしていたPyCon JP2018のHPが7月に無事完成し、ブログを投稿しました。自分はPyCon JP2018システムチームなので実装、調整で携わっていました。

pyconjp.blogspot.com

pycon.jp

自分の担当とコード

PyCon JP2018は Vue.jsのフレームワークである、nuxt.jsと、APIとしてGoogleAppsScriptを使って開発されています。自分はAPI側の実装全てとフロント側のスポンサーページの実装を担当しました。HPは主に3~4人で開発されています。コードは全てPublicになっているので誰でも見ることができます。

github.com

github.com

なぜ転載しているか

前回のブログに書かせてもらったとおり、Forkwellのポートフォリオサイトのために投稿しています。

blog.ikedaosushi.com

Kaizen Platformの開発者ブログに「BigQueryのコスト可視化ダッシュボード」について投稿しました。

下記記事です

実は恥ずかしながらはてなブックマークホッテントリに入ったことがなかったので今回はじめて入ってとても嬉しかったです。

developer.kaizenplatform.com

なぜ転載したか

転載には一応理由があって、実は最近Forkwellというサイトで自分のポートフォリオページを作ってみました。このポートフォリオページは結構よく出来ていて、自分のブログのRSSをそのまま活動として反映することができます。 portfolio.forkwell.com ということでポートフォリオページに活動をまとめるために転載しました。 今後もKaizen PlatformのBlogやPyCon JPのブログを書くことはありそうなので、そのときはこちらに投稿しようと思います!

カリフォルニア大学サンディエゴのAlgorithmic Toolbox @ Courseraを修了しました!

ここ1ヶ月半くらいで、Courseraで「Algorithmic Toolbox」という名前のCSのコースを受けており、今週、6週分の授業・課題を全てクリアし今週修了証をゲットしました 👏

f:id:mergyi:20180902130629p:plain

https://www.coursera.org/account/accomplishments/verify/JKBYCPYP7U69

Data Structures and Algorithms

この授業が何かと言うと、Data Structures and AlgorithmsというSpecializationの第一コースです。Specializationとは、Coursera用語らしく(?)、一連のCourse郡を束ねた名前のようです。(Specializationについては解説してくださっている方がいるので、こちら参照。Coursera|Specializationとは : MOOCsブログ)

(Data Structures and Algorithms Course1)www.coursera.org

そして、Data Structures and Algorithmsの特徴を説明文を引用して説明します。

No other online course in Algorithms even comes close to offering you a wealth of programming challenges that you may face at your next job interview.

このSpecializationの特徴は、単なるアルゴリズムの解説だけではなく採用面接などで必要になるアルゴリズムのプログラミングスキルを身につけられる ということです。

Algorithmic Toolbox

www.coursera.org

Algorithmic ToolboxはSpecializationの第一コースということで、基本的な内容から始まります。下記のようにWeek6に分かれています。

  • Programming Challenges
  • Algorithmic Warm-up
  • Greedy Algorithms
  • Divide-and-Conquer
  • Dynamic Programming 1
  • Dynamic Programming 2

毎週プログラミング課題があり、Java/C++/Python/Javascript/Rustなどの中から好きな言語を選べ、理解を深めることができます。

Week1、Week2の「Programming Challenges」「Algorithmic Warm-up」はアルゴリズムの重要性や計算コストの考え方など基礎から始まります。Week3の「 Greedy Algorithms」から本格的にアルゴリズムの内容が開始され、課題も難しくなります…。

なので後半は結構大変でした。でもGreedy AlgorithmsやDynamic Programmingを実装できるようになったのは、とても便利で今度別の(ある組織の)ブログで書くと思いますが、早速現実の問題にも適用するタイミングがありました。

Computer Science Complex をCourseraで治療する

geek-out.jp

先月、GeekOutに僕が強く尊敬するエンジニアの1人であるHigeponさんの記事が掲載されていました。Higeponさんが「ComputerScienceにコンプレックスをずっと持っていた」と書かれていましたが、まさに自分も同じ悩みを持っています。今年エンジニア4年目に突入し、普段はなんとなくプログラミング出来てしまうのですが、「ああライブラリがいい感じにやってくれるからそれに頼り切って実装してるな」と無力感を感じてしまうんですよね。

きっと自分以外にも同じような気持ちを持っている人は多いのではないでしょうか。そんな方にこのコースはオススメです。個性豊かな講師陣で話を聞いてるだけで割と面白いですし、資料も説明も工夫が凝らされてます。全て英語なので、自分にとっては言語の壁も大きいのですが、説明が工夫されてるのでなんとかついていける、と感じてます。

修了証を集めるのがゲーム感覚で楽しい

Courseraで取得した修了証はLinkedInに追加できるので純粋にRPGで武器を集めるような感覚で楽しいですし、もちろん就職、転職にも活用することができます。 https://www.linkedin.com/in/yutaro-ikeda-8b1015147/

Data Structures and AlgorithmsはCourseraの中では有料のコースになってしまうのですが、十分受ける価値はあると思います。来週からCourse2のData Structuresに挑戦します。また修了したら感想を書きたいと思います!

www.coursera.org