北海道道東地方における大雪
北海道に関するデータの可視化をコツコツやってみます
先日公開した北海道観光客統計データ閲覧くんを軸に、北海道に関する様々なデータに触れる機会を得ました。 目で見て考えることが、いかに地元の理解を深めることに繋がるかを知りました。
北海道には観光資源が多いことや、北海道新幹線の開通が間近であることなど、明るい話題があるように見えます。その一方で、他の都道府県と同じように過疎化や不況に苦しんでいることも事実です。
北海道には179市町村があります。面積は83,450平方kmもあります。もちろん全国で一番です。ただ、広すぎるが故に北海道にいた頃の私は、地元で何が起こっているかを俯瞰することができませんでした。
しかし、今では自治体のWebサイトに問い合わせれば欲しいデータをすぐ入手できます。世の中の道具を組み合わせて簡単に可視化できます。 だから、毎日コツコツと可視化してみようと思います。
いつかこの積み上げが、都市部への一極集中を食い止める施策につながればうれしいです。
北海道オープンデータハッカソンに参加しました
去る2015年10月17日(土)、北海道札幌市で開催された北海道オープンデータハッカソンin collaboration with W3C Developer Meetup in Sapporoに参加しました。 そこで北海道の観光客統計データの閲覧ツール「北海道観光客統計データ閲覧くん」を発表し、クリプトン賞を頂きました。 札幌で大学生活を送った自分には、里帰りの気持ちになれる素晴らしい機会でした。今回のイベントを企画された皆様に本当に感謝しています。
発表資料
www.slideshare.net
当日の模様
会場は道庁前のクリプトン・フューチャー・メディア株式会社の会議室でした。素晴らしいオフィスです(私が札幌に住んでいた10年前にこのビルはなかったはず)。
- 出版社/メーカー: クリプトン・フューチャー・メディア
- 発売日: 2013/09/26
- メディア: DVD-ROM
- この商品を含むブログ (5件) を見る
オフィスの窓からは道庁の姿も見下ろすことができます。
私はツールの開発を事前に終えていたため、当日はチームを組んだ丸田さん、本間さんと実際にツールを用いてお互いの地元について分析を行いました。お二人からは素晴らしい気づきを得ることができました。
他のチームの方々も短時間の開発であるにもかかわらず、当日に動くものを仕上げていたことに感動しました。 (各プレゼンに聞き入ってしまって写真を全然撮らなかったのが悔いです…)
中でもお気に入りは「バスを使って旬なお魚温泉マップ」です。旬なお魚を視覚的に理解できる教養ツールに仕上がっています。
成果発表後の懇親会では、お互いの作品について、さらにオープンデータ利活用について様々な議論をすることができました。 志の近い方々と非常に濃密な情報交換ができたので、関東から参加して本当に正解でした。北海道のオープンデータのキーマンとなる方々に知り合えたことが本当に大きい。 オープンデータが抱える問題、北海道が抱える問題がよりはっきりと見えてきました。 これからも札幌に通わなきゃいけないかもしれない…。
オフタイム
- 出版社/メーカー: 六花亭
- メディア: その他
- この商品を含むブログ (4件) を見る
ハッカソンのあとは、妻と美食の旅を堪能しました。 北海道の今時期は旬の食材の宝庫。 何を食べても超美味しい。
北海道は本当にいい場所です。今でも大好きです。
北海道の市町村を観光客統計データでクラスタリングする
背景
私はこの数ヶ月間、北海道の観光客統計データを用いて地元の観光について調べている。 出身地にどのような特色があるのか、改めて知りたいと思ったからである。
北海道はオープンデータとして北海道観光入込客数調査報告書を公開中である(CC BY 2.1)。 過去15年分の各市町村における観光客数の月次推移をまとめたものである。延べ総数だけでなく、道外・道内、日帰り・宿泊などの詳細な内訳も含まれている。 そのため、各市町村がどのような特色を持っているかを知ることができる。
しかし、データそのものは無機質なスプレッドシートで、閲覧性に乏しい欠点があった。 市町村、内訳項目、時期など様々な分析軸があるにもかかわらず、閲覧・可視化には手作業による加工が多分に必要であった。
そこで、私は愚直にデータをクレンジングして機械可読化した上に、ヒートマップや各市町村の統計データを閲覧できるツールを作成した。 これにより、飛躍的に閲覧性が高まり、北海道全体の観光の特徴を俯瞰できるようになった。
(本ツールは2015年10月開催の北海道オープンデータハッカソンにてクリプトン賞を頂きました。別件にて起稿予定)
課題
しかし、視覚的に俯瞰できるようになっても、似た特色を持った自治体を探るのは手作業である。 北海道は市町村は179もある。人間には根気が続かず、到底無理である。
- 作者: 実業之日本社
- 出版社/メーカー: 実業之日本社
- 発売日: 2013/06/26
- メディア: ムック
- この商品を含むブログを見る
藤原製麺 札幌円山動物園白クマ塩ラーメン 112.4g×10袋
- 出版社/メーカー: 藤原製麺
- メディア: 食品&飲料
- 購入: 7人 クリック: 168回
- この商品を含むブログ (14件) を見る
手段
機械学習を使って似た特色を持った自治体を探す。 具体的には観光客統計データの1年分の月次推移を12次元ベクトルデータに見立てて、市町村をクラスタリングする。アルゴリズムにはk-meansを用いる。
統計データは北海道観光入込客数調査報告書の2011年度、2012年度(2012年1月〜2012年12月)のデータを用いる。メトリクスは道外観光客数を用いた。道外観光客のほうが、より北海道らしい場所へと行く傾向があると仮定したからである。
クラスタリング結果
結果は以下のようになった。
クラスタ数は手作業で探り、直感的に良いと感じた k=12 に落ち着かせた。 観光客数の絶対数も類似度に含めるため、各ベクトルは正規化しなかった。
考察
思いの外よくまとまった。 ある実行結果から20市町村以下となったクラスタを抜粋し、それぞれに名前をつけてみる。
孤高の都市たち
これらはそれぞれ単独クラスタとなった。北海道を代表する観光地であり、個性をはっきりと示せている都市である。
札幌市
小樽市
旭川市
函館市
あと一歩で孤高の都市
一定規模の観光資源・産業規模はあるものの、孤高の都市にはなりきれなかった都市たちである。 上川町、斜里町、洞爺湖町は温泉で有名であるが、なぜかそこに混じってしまう帯広市と釧路市。 そして、犬猿の仲である帯広と釧路が交わらないところも実態をよく表している。 登別市と千歳市が似ている実感はないが、いずれもGWと夏休みの間の6月にがくんと数を下げる点では一致していた。
(組み合わせA)
- 釧路市
- 上川町
(組み合わせB)
(組み合わせC)
スキークラスタ
文句なくスキー場である。ここまで綺麗にくくり出せるとは。
北の国からクラスタ
あーあーーーあああああ~~~~~~~~~。
知る人ぞ知る観光地クラスタ
これらは一定数の観光客を集めているという点で集まった模様である。 いずれも道の駅に寄りたくなる感じがする市町村である。
ソースコード
上記の実験結果はgithubにて公開中である。
展望
海外観光客や人口のメトリクスを足したり、時系列要素を年またぎで足したり、主成分分析を組み合わせたりすればもっといろんな視点で類似する自治体を集められる気がする。
- 作者: Willi Richert,Luis Pedro Coelho,斎藤康毅
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/10/25
- メディア: 大型本
- この商品を含むブログ (4件) を見る
データサイエンティスト養成読本 機械学習入門編 (Software Design plus)
- 作者: 比戸将平,馬場雪乃,里洋平,戸嶋龍哉,得居誠也,福島真太朗,加藤公一,関喜史,阿部厳,熊崎宏樹
- 出版社/メーカー: 技術評論社
- 発売日: 2015/09/10
- メディア: 大型本
- この商品を含むブログ (5件) を見る
Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理
- 作者: Wes McKinney,小林儀匡,鈴木宏尚,瀬戸山雅人,滝口開資,野上大介
- 出版社/メーカー: オライリージャパン
- 発売日: 2013/12/26
- メディア: 大型本
- この商品を含むブログ (11件) を見る
参考文献
- K-means : scikit-learn による最も基本的なクラスタリング分析
- 結果の可視化 : GeoJSONを軽くするだけじゃない! TopoJSONクライアント TIPS
2015/11/04追記
区間推定法の信頼度が実際の推定結果と合致するかを確かめる
統計解析における検定・推定の勉強中に出てきた母平均の区間推定法の信頼度を理解するために行った実験の備忘録。 具体的には区間推定法の信頼度が実際の推定結果と合致するかを確かめた。
正規分布からサンプルしたデータでの母平均の区間推定を何度も行い、その中に真の母平均が含まれる確率を計算するスクリプトを実装した。
スクリプト
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オプションを付与する
上記エラーを回避するためには、MacPortsのmecabのヘッダの有りかを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) | ぎ |