無限壁破り駆動開発 <colspan=∞>

テーマは北海道, オープンデータ, Web技術, HTML5, d3.js, カメラ, 韓国語, Javascript, Ruby, Python

北海道道東地方における大雪

昨日から本日にかけて、北海道の道東では記録的な大雪が振りました。 釧路や十勝では平年の10倍に達する雪が降っています。

www.asahi.com

観測記録的に見て、今回の大雪は大変珍しいことです。 北海道には大雪山日高山脈など、中央に山脈が連なっています。日本海側から吹いてくる季節風の湿った空気はここで遮られるため、道東には雪が降りにくいのです。

日高山脈 - Wikipedia

しかし、今年は全く様子が違います。 道東地方の平年比が大幅に高まっています。 11月はほとんど積もらないのが普通です。

f:id:colspan:20151127215141p:plain f:id:colspan:20151127215426p:plain

現在の天気予報を見ると雨も振りそうですね…。 足元が怖いです。

出典

www.data.jma.go.jp

北海道に関するデータの可視化をコツコツやってみます

先日公開した北海道観光客統計データ閲覧くんを軸に、北海道に関する様々なデータに触れる機会を得ました。 目で見て考えることが、いかに地元の理解を深めることに繋がるかを知りました。

北海道には観光資源が多いことや、北海道新幹線の開通が間近であることなど、明るい話題があるように見えます。その一方で、他の都道府県と同じように過疎化や不況に苦しんでいることも事実です。

北海道には179市町村があります。面積は83,450平方kmもあります。もちろん全国で一番です。ただ、広すぎるが故に北海道にいた頃の私は、地元で何が起こっているかを俯瞰することができませんでした。

しかし、今では自治体のWebサイトに問い合わせれば欲しいデータをすぐ入手できます。世の中の道具を組み合わせて簡単に可視化できます。 だから、毎日コツコツと可視化してみようと思います。

いつかこの積み上げが、都市部への一極集中を食い止める施策につながればうれしいです。

f:id:colspan:20151127212500p:plain

北海道オープンデータハッカソンに参加しました

去る2015年10月17日(土)、北海道札幌市で開催された北海道オープンデータハッカソンin collaboration with W3C Developer Meetup in Sapporoに参加しました。 そこで北海道の観光客統計データの閲覧ツール北海道観光客統計データ閲覧くん」を発表し、クリプトン賞を頂きました。 札幌で大学生活を送った自分には、里帰りの気持ちになれる素晴らしい機会でした。今回のイベントを企画された皆様に本当に感謝しています。

opendata.doorkeeper.jp

発表資料

www.slideshare.net

当日の模様

会場は道庁前のクリプトン・フューチャー・メディア株式会社の会議室でした。素晴らしいオフィスです(私が札幌に住んでいた10年前にこのビルはなかったはず)。 f:id:colspan:20151017194338j:plainf:id:colspan:20151017194342j:plain

f:id:colspan:20151017095506j:plain

オフィスの窓からは道庁の姿も見下ろすことができます。

私はツールの開発を事前に終えていたため、当日はチームを組んだ丸田さん、本間さんと実際にツールを用いてお互いの地元について分析を行いました。お二人からは素晴らしい気づきを得ることができました。

他のチームの方々も短時間の開発であるにもかかわらず、当日に動くものを仕上げていたことに感動しました。 (各プレゼンに聞き入ってしまって写真を全然撮らなかったのが悔いです…)

中でもお気に入りは「バスを使って旬なお魚温泉マップ」です。旬なお魚を視覚的に理解できる教養ツールに仕上がっています。

SAKANA Map in Hokkaido

成果発表後の懇親会では、お互いの作品について、さらにオープンデータ利活用について様々な議論をすることができました。 志の近い方々と非常に濃密な情報交換ができたので、関東から参加して本当に正解でした。北海道のオープンデータのキーマンとなる方々に知り合えたことが本当に大きい。 オープンデータが抱える問題、北海道が抱える問題がよりはっきりと見えてきました。 これからも札幌に通わなきゃいけないかもしれない…。

オフタイム

f:id:colspan:20151017085713j:plain

ハッカソンのあとは、妻と美食の旅を堪能しました。 北海道の今時期は旬の食材の宝庫。 何を食べても超美味しい。

f:id:colspan:20151018112650j:plainf:id:colspan:20151018114716j:plainf:id:colspan:20151018143406j:plainf:id:colspan:20151018143822j:plainf:id:colspan:20151018143843j:plainf:id:colspan:20151017220443j:plain

北海道は本当にいい場所です。今でも大好きです。

北海道の市町村を観光客統計データでクラスタリングする

背景

私はこの数ヶ月間、北海道の観光客統計データを用いて地元の観光について調べている。 出身地にどのような特色があるのか、改めて知りたいと思ったからである。

北海道はオープンデータとして北海道観光入込客数調査報告書を公開中である(CC BY 2.1)。 過去15年分の各市町村における観光客数の月次推移をまとめたものである。延べ総数だけでなく、道外・道内、日帰り・宿泊などの詳細な内訳も含まれている。 そのため、各市町村がどのような特色を持っているかを知ることができる。

しかし、データそのものは無機質なスプレッドシートで、閲覧性に乏しい欠点があった。 市町村、内訳項目、時期など様々な分析軸があるにもかかわらず、閲覧・可視化には手作業による加工が多分に必要であった。

そこで、私は愚直にデータをクレンジングして機械可読化した上に、ヒートマップや各市町村の統計データを閲覧できるツールを作成した。 これにより、飛躍的に閲覧性が高まり、北海道全体の観光の特徴を俯瞰できるようになった。

(本ツールは2015年10月開催の北海道オープンデータハッカソンにてクリプトン賞を頂きました。別件にて起稿予定)

課題

しかし、視覚的に俯瞰できるようになっても、似た特色を持った自治体を探るのは手作業である。 北海道は市町村は179もある。人間には根気が続かず、到底無理である。

藤原製麺 札幌円山動物園白クマ塩ラーメン 112.4g×10袋

藤原製麺 札幌円山動物園白クマ塩ラーメン 112.4g×10袋

手段

機械学習を使って似た特色を持った自治体を探す。 具体的には観光客統計データの1年分の月次推移を12次元ベクトルデータに見立てて、市町村をクラスタリングする。アルゴリズムにはk-meansを用いる。

統計データは北海道観光入込客数調査報告書の2011年度、2012年度(2012年1月〜2012年12月)のデータを用いる。メトリクスは道外観光客数を用いた。道外観光客のほうが、より北海道らしい場所へと行く傾向があると仮定したからである。

クラスタリング結果

結果は以下のようになった。

f:id:colspan:20151028224450p:plain

クラスタ数は手作業で探り、直感的に良いと感じた k=12 に落ち着かせた。 観光客数の絶対数も類似度に含めるため、各ベクトルは正規化しなかった。

考察

思いの外よくまとまった。 ある実行結果から20市町村以下となったクラスタを抜粋し、それぞれに名前をつけてみる。

孤高の都市たち

これらはそれぞれ単独クラスタとなった。北海道を代表する観光地であり、個性をはっきりと示せている都市である。

札幌市

f:id:colspan:20151109195441p:plain

小樽市

f:id:colspan:20151109195457p:plain

旭川市

f:id:colspan:20151109195511p:plain

函館市

f:id:colspan:20151109195521p:plain

あと一歩で孤高の都市

一定規模の観光資源・産業規模はあるものの、孤高の都市にはなりきれなかった都市たちである。 上川町、斜里町洞爺湖町は温泉で有名であるが、なぜかそこに混じってしまう帯広市釧路市。 そして、犬猿の仲である帯広と釧路が交わらないところも実態をよく表している。 登別市千歳市が似ている実感はないが、いずれもGWと夏休みの間の6月にがくんと数を下げる点では一致していた。

(組み合わせA)

f:id:colspan:20151109195553p:plain

(組み合わせB)

f:id:colspan:20151109195603p:plain

(組み合わせC)

f:id:colspan:20151109195611p:plain

スキークラスタ

文句なくスキー場である。ここまで綺麗にくくり出せるとは。

f:id:colspan:20151109195634p:plain

北の国からクラスタ

あーあーーーあああああ~~~~~~~~~。

f:id:colspan:20151109195644p:plain

知る人ぞ知る観光地クラスタ

これらは一定数の観光客を集めているという点で集まった模様である。 いずれも道の駅に寄りたくなる感じがする市町村である。

f:id:colspan:20151109195652p:plain

ソースコード

上記の実験結果はgithubにて公開中である。

github.com

展望

海外観光客や人口のメトリクスを足したり、時系列要素を年またぎで足したり、主成分分析を組み合わせたりすればもっといろんな視点で類似する自治体を集められる気がする。

実践 機械学習システム

実践 機械学習システム

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

データサイエンティスト養成読本 機械学習入門編 (Software Design plus)

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

参考文献

2015/11/04追記

クラスタリング結果の閲覧性を高めました。github pagesにて公開します。

区間推定法の信頼度が実際の推定結果と合致するかを確かめる

統計解析における検定・推定の勉強中に出てきた母平均の区間推定法の信頼度を理解するために行った実験の備忘録。 具体的には区間推定法の信頼度が実際の推定結果と合致するかを確かめた。

正規分布からサンプルしたデータでの母平均の区間推定を何度も行い、その中に真の母平均が含まれる確率を計算するスクリプトを実装した。

スクリプト

import random
import math
import numpy as np
from scipy.stats import norm
conf_results = []

mu0 = 20.0 # 母平均
sig0 = 10.0 # 母分散
N = 1000 # データサンプル数
trial = 1000 # 母平均推定試行回数
for i in range(trial):
    # 正規分布からデータをサンプルする
    data = np.random.normal(loc=mu0, scale=sig0, size=N)
    # サンプル集合の平均値を求める(母平均推定)
    mean = np.mean(data)
    # 母平均推定の信頼区間(95%)を求める
    R = norm.interval(0.95,loc=mean,scale=sig0/math.sqrt(N))
    # 信頼区間に真の母平均が含まれるか否かを評価し、結果を出力する
    conf_results.append( R[0]  < mu0 < R[1] )
# サンプルデータ群の正解率(実測の信頼度)
print float(sum(conf_results)) / float(trial)

実行結果

0.946

設定した信頼度95%とほぼ一致している。

MacPortsで入れたmecabをRubyから使う

MacPortsからmecabを入れる

杉村様がブログで公開されている方法を参考に入れました。MacPortsから普通に入れた上に、UTF−8の辞書に差し替えます。

参考

$ sudo port install mecab
$ sudo port install mecab-ipadic-utf8
$ sudo vi /opt/local/etc/mecabrc

;dicdir =  /opt/local/lib/mecab/dic/sysdic    ←コメントアウト
dicdir =  /opt/local/lib/mecab/dic/ipadic-utf8

gemパッケージ mecab のインストールする

そのままでは入らない

mecab.hのありかがわからないためエラーが起きます。

$ sudo gem install mecab
Fetching: mecab-0.996.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing mecab:
    ERROR: Failed to build gem native extension.

    /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby extconf.rb
checking for make... yes
checking for main() in -lstdc++... yes
checking for main() in -lmecab... yes
checking for main() in -lstdc++... yes
checking for mecab.h... yes
creating Makefile

make "DESTDIR="
compiling mecab_wrap.cpp
mecab_wrap.cpp:1855:10: fatal error: 'mecab.h' file not found
#include "mecab.h"
         ^
1 error generated.
make: *** [mecab_wrap.o] Error 1


Gem files will remain installed in /Library/Ruby/Gems/2.0.0/gems/mecab-0.996 for inspection.
Results logged to /Library/Ruby/Gems/2.0.0/gems/mecab-0.996/ext/mecab/gem_make.out

解決方法 : CPPFLAGSオプションを付与する

上記エラーを回避するためには、MacPortsmecabのヘッダの有りかをgemコマンドに教えます。

$ sudo gem install mecab -- --with-cppflags=-I/opt/local/include

MacPorts以外にもHomeBrew等でも同様の指定ができるのではないかと思われます。

参考

余談

下記のサイトなどではgemファイルそのものを改変する方法が紹介されているが、少なくとも今現在はそこまでしなくても上記オプション付与で対処できる模様です。

日韓漢字読みの法則

日韓言語の間にある漢字読み法則について、学生の頃にまとめた表の存在を思い出したので公開します。
わかる人にはちょっと便利な表だと思います。


子音
g/k n d/t r m b/p s 母音 j/ch ch k t p h

母音
a ya eo yeo o yo u yu eu i

 

=ㅏ+ㅣ ae =a+i
=ㅓ+ㅣ e =eo+i
=ㅕ+ㅣ ye =yeo+i
=ㅗ+ㅏ wa =o+a
=ㅗ+ㅣ we =o+i
=ㅜ+ㅓ weo =u+eo
=ㅜ+ㅣ wi =u+i
=ㅡ+ㅣ wee =eu+i

子音の法則

韓国語子音 日本語子音 (日本語読み)

(g/k)
カ行 可(가/ga)

(n)
ナ行/(ラ行)/(ダ行) 那(나/na)

(d/t)
タ行/ダ行 多(다/da)

(r)
ラ行 羅(라/ra)

(m)
マ行/バ行 馬(마/ma) ま/ば

(b/p)
ハ行/バ行 負(부/bu)

(s)
サ行/ザ行 使(사/sa)

(母音)
ア行/カ行/ガ行 阿(아/a)

(j/ch)
タ行/サ行/ダ行/ザ行 自(자/ja)

(ch)
タ行/サ行/ダ行/ザ行 差(차/cha)

(k)
カ行 快(쾌/kwe) かい

(t)
タ行/ダ行 他(타/ta)

(p)
ハ行/バ行 波(파/pa)

(h)
カ行/ワ行 下(하/ha)


  • 韓国語では語頭で子音が落ちる傾向がある
  • 「h」の子音がカ行になる
  • 「p」「b」の発音対応は、昔の日本でハ行を唇をくっつけて発音していたことと一致

母音法則

ここからは多少数が増えてきて、例を示すのが大変になってくるがご了承いただきたい。

韓国語 日本語 (日本語読み)

(a)
あ/い 亜(아/a)

(ya)
野(야/ya)

(eo)
え/お 低(저/jeo) てい

(yeo)
え/よ 麗(려/ryeo) れい

(o)
お/う 汚(오/o)

(yo)
曜(요/yo) よう

(u)
う/お 右(우/u) ゆう/う

(yu)
有(유/yu) ゆう

(eu)
い/お 音(음/eum) いん/おん

(i)
異(이/i)

韓国語 日本語 (日本語読み)

(ae)
あい 愛(애/ae) あい

(e)
憩(게/ge) けい

(ye)
え/よ 予(예/ye)

(wa)
果(과/gwa)

(we)
あい 頼(뢰/rwe) らい

(weo)
え/い 原(원/weon) げん

(wi)
位(위/wi)

(wee)
義(의/wee)