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

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

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

背景

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

北海道はオープンデータとして北海道観光入込客数調査報告書を公開中である(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)

皆既月食の連続写真をJavaScriptで閲覧する

昨日2014年10月8日(水)に観測された皆既月食の連続写真をJavaScriptで簡便に閲覧できるようにしました。

トリミングがまだやっつけ状態で欠落する写真もありますが、トリミングアルゴリズムを見直して改めて直す予定です。

Webカメラ映像から人を消す

Webカメラ映像から人を消すJavascriptを実装しました。 @yabuki様の「風景から歩行者を消す手軽な方法」に発想を得て作成した物です。

カメラへのアクセスを許可するとWebカメラ映像から人を消すスクリプトが発動します。

実装のポイントは以下の通りです。

  1. WebRTCでWebカメラ映像取得する
  2. ピクセル単位のアクセスをしたいので、Webカメラ映像のバッファを不可視なCanvasに落とし込む
  3. Canvasのピクセルの平均値を計算する(全部の値は持っていられないので逐次更新する平均値とした)
  4. 平均値の計算結果を可視なCanvasに描画する

詳しくは下記ソースをご参照ください。

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

ハイパフォーマンス ブラウザネットワーキング ―ネットワークアプリケーションのためのパフォーマンス最適化

HTML5 Canvas

HTML5 Canvas

社外レンズで撮影したキヤノンEOS RAW画像を純正現像ソフトDPPでレンズ補正する

本エントリでは、シグマ、タムロントキナー等の社外レンズを用いて撮影した、キヤノン製一眼レフカメラ(EOS Digital)のRAW画像を、キヤノン純正現像ソフトDPPでレンズ補正する方法を紹介する。

DPPとは

DPPとはDigital Photo Professionalの略。キヤノン製一眼レフカメラ(EOS Digital)でRAW撮影した写真の現像をするための純正ソフトウェアである。このソフトウェアを使ってRAW画像(CR2ファイル)を現像すれば、ボディ内で生成されるJPEGよりもきれいな写真を現像できる。なぜなら、撮像素子から得られた生のデータを無劣化で保存された情報を元に、PCの計算資源をふんだんに使って現像できるからである。 特にノイズ補正やレンズ補正が強力で、一昔前のボディで撮影した写真も、最新のボディと同等かそれ以上の画質で現像できるのが特徴である。私は特にレンズ補正が大好きである。写真の四隅に現れる色収差(ズレ)が、とてもきれいに修正されるからだ。だから、私は一眼(1D Mark II N, Kiss X4 , EOS M)でもコンデジ(S95,S100)でもできるだけRAWで撮っている。

f:id:colspan:20140709230628j:plain

DPPの制約

しかしながら、DPPのレンズ補正機能は純正レンズのみに限定されている。故に、シグマ、トキナータムロン等の社外レンズに適用できない。レンズ補正のためには光学的な特性を表す様々なパラメタが必要になるためである。

f:id:colspan:20140709230634p:plain

カメラメーカーとしては、純正レンズの優位性を示すためにも、社外のレンズに対してレンズ補正の機能を解放するとは考えられないため、今後の改善は期待できない。素直に社外の現像ソフトを買えばよいのではあるが、購入に踏み切れない人もいるはず(筆者がそうだ)。そこで、無理矢理でもDPPで社外レンズのレンズ補正ができないか、試してみた。結論からいうと、できた。

純正以外のレンズにも適用する方法 = Exifのレンズ情報を純正レンズのものに書き換える

レンズ補正の社外のレンズでも適用可能にする方法がある。それはExifを書き換え、純正レンズに偽装する方法である。これによって、あっけなく適用可能になる。もちろん、補正のための光学的なパラメタはでたらめだろうから、最適な補正ではないことは自明であるが、色収差・色にじみはきれいに消える(微調整もできるのでかなりきれいになる)。この機能を無理矢理にでも使った方が、画質は圧倒的によい。

下記に貼った例は、イタリアのフィレンツェのドゥオモをTokina AT-X PRO 124 DX IIで撮影したものである。当然ながらDPPでのレンズ補正は許されていない。しかしながら、Exifのレンズ情報を純正レンズとして偽装することで可能になった。

f:id:colspan:20140709230540p:plain f:id:colspan:20130531203032j:plain

Exifの書き換え方法

私はexiftoolを使って書き換えた。 Exifにまつわる様々な処理を簡単に行えるコマンドラインツールである。(コマンドプロンプト、ターミナルをある程度使いこなす必要があるので注意)

入手先

以下のexiftoolの公式Webサイトから入手可能である。

ExifTool by Phil Harvey

インストール方法

Windows

上記URLからexiftool-*.zipをダウンロード後、任意の場所に解凍。 PATHを通すなりして任意の場所から実行しやすい環境を作る。

Mac

上記URLからexiftool-*.dmgをダウンロード後、インストーラを実行。インストールするだけで任意パスから実行可能になる。

exiftoolを呼び出す具体的なコマンド

exiftoolを使ってLensType, MinFocalLength, MaxFocalLengthの属性を書き換える。

exiftool -MinFocalLength=[最小焦点距離] -MaxFocalLength=[最大焦点距離] -LensType='[レンズモデル名(選定方法は後述)]' [書き換え対象のファイル名]
※ 上書きされるので注意

偽装レンズの選定方法

偽装するレンズは、撮影したレンズと焦点距離が似ている純正レンズを指定するとよい。 例えば、 Tokina AT-X PRO 124 DX II(12-24mm f4.0)なら、純正の超広角レンズであるCanon EF-S 10-22mm f/3.5-4.5 USMを選ぶ。

exiftool -MinFocalLength=10 -MaxFocalLength=22 -LensType='Canon EF-S 10-22mm f/3.5-4.5 USM' IMG_0155\ 2.CR2
※ 上書きされるので注意

利用可能なレンズ一覧は下記exiftoolのマニュアルサイトの章"Canon LensType Values"に記されている。

Canon Tags

なお、焦点距離の数値(MinFocalLength, MaxFocalLength)は各レンズと一致するように設定すること。そうでなければレンズ補正機能は使えない。

具体例

上記操作によって純正レンズ情報に偽装したRAW画像ファイルをDPPに読ませると、レンズ補正機能が使えるようになる。

f:id:colspan:20140709230638p:plain f:id:colspan:20140709230718p:plain

まとめ

DPPにおいてタムロンやシグマ、トキナーなどの社外レンズで撮影したRAW画像に対してもレンズ補正が可能になる方法を紹介した。 Exifに記録されているレンズ情報を、強制的に純正レンズのものに書き換えることで可能になる。 LightroomSilkypixなどの現像ソフトウェアを買うまでには至らない場合に、間に合わせの機能として使うのはいかがだろうか。

市川ソフトラボラトリー SILKYPIX Developer Studio Pro5 Win/Mac

市川ソフトラボラトリー SILKYPIX Developer Studio Pro5 Win/Mac

参考文献