カーネル密度推定を用いた
  店舗情報の可視化
          2012年2月23日
    heshikik@orkney.co.jp
                 heshikik
きっかけは1枚の絵




                                  アメリカ全土のマクドナルド分布
http://www.datapointed.net/2009/09/distance-to-nearest-mcdonalds/
これの日本版を見てみたい
ググってみる
同じようなことを考える人はいるようです




http://www.codezine.jp/article/detail/6103
                                             http://mglab.blogspot.com/2009/10/blog-post.html
自分でも描いてみよう
まずはマクドナルドの
店舗リストを手に入れよう
そう簡単には手に入らない
じゃあ、自力でリストを作る
公式サイトから住所録を取得




  http://www.mcdonalds.co.jp/shop/map/mcd_shop.php
perlで取得



Web::Scraper を使って
この要素を切り取る
コードはこんな感じ
    :
my $scraper = scraper {
    process '#ShopLists .ShopName dd', 'addressList[]' => 'TEXT';
};
my $list = "./pref_list.txt";
while(<listfile>) {
    my $pref = $_;
    my $res = $scraper->scrape(URI->
new("http://www.mcdonalds.co.jp/shop/map/mcd_shop.php/shops?keywo
rd=".$pref."&search.x=0&search.y=0"));

    foreach my $address(@{$res->{addressList}}){
        print "$address"."¥n";
    };
}
    :
住所リストは取れたので…
北海道岩見沢市八条東10丁目2-55
北海道札幌市厚別区厚別中央二条4丁目4-12
北海道滝川市南滝の川132-1
北海道札幌市南区藤野三条4丁目1-1
北海道日高郡新ひだか町静内末広町2-1-1
北海道河東郡音更町木野大通西17-1-4
北海道札幌市東区東雁来九条4丁目7-1
北海道恵庭市黄金南6-10-2
北海道札幌市清田区里塚二条7丁目1-5
北海道千歳市錦町3-10-1
北海道伊達市舟岡町236-1
 :




   Web APIでジオコーディング
コードはこんな感じ (今度はpython)
 TARGET_FILE = "mac_address.txt“
 OUTPUT_FILE = "mac_latlon.csv“
 TARGET_URL = "http://www.geocoding.jp/api/? "

 f = file(TARGET_FILE, "r")
 writer = csv.writer(file(OUTPUT_FILE, "w"), delimiter="¥t")

 for line in f:
     if line == "¥n": continue
     target = unicode(line, "utf-8", "ignore")
     query = [("q", line[:-1]), ("v", "1.1")]
     url = TARGET_URL + urllib.urlencode(query)
     result = urllib.urlopen(url).read()
     tree = etree.fromstring(result, parser=etree.XMLParser())
     if len(tree.xpath("//lat")) != 0
         lat = tree.xpath("//lat")[0].text
         lng = tree.xpath("//lng")[0].text
     writer.writerow([line[:-1], lat, lng, lat_dms, lng_dms])
     time.sleep(5)
必要なデータは揃った!
 43.05808,141.355735
 43.041,141.326977
 43.087173,141.327749
 43.068373,141.347621
 43.107265,141.339675
 43.14021,141.340742
 43.07117,141.370255
 43.079937,141.403721
 43.096212,141.398004
     :
GRASSにインポート




> v.in.ascii input=C:¥test¥mac_latlon.csv output=mac
拡大するとこんな感じ
これだと、ただの点の集合

  もう少し定量的に
密集度を評価できないか?
空間補間??
標高値を持った点群     ボロノイ図形




        IDW      RST
Z値を持ったデータではないので
  これらの方法は不適切

 密度を算出してその分布を
  可視化できれば良さそう
カーネル密度推定
• 統計学において、確率変数の確率密度関数
  を推定する手法の1つ。
• ある母集団の標本のデータが与えられたとき、
  カーネル密度推定を使えばその母集団の
  データを外挿できる。

             wikipediaより抜粋
度数分布と言えばヒストグラムだけど…




    http://www.econ.kobe-u.ac.jp/~nomura/lecture/10f/kd-estimate.pdf
カーネル密度推定のアイデア




  http://www.econ.kobe-u.ac.jp/~nomura/lecture/10f/kd-estimate.pdf
カーネル密度推定の方法




 http://www.econ.kobe-u.ac.jp/~nomura/lecture/10f/kd-estimate.pdf
カーネル密度推定を用いて
マクドナルド分布を可視化してみる
GRASSで描くとこうなる




> v.kernel input=mac@MAC output=kernel stddeviation=0.03
拡大するとこんな感じ
カラーテーブルを調整
日本版マクドナルド分布を
描くという目的は無事達成
定量的なデータは得られたので
人口密度などとの相関も評価
    できるはず・・・

   to be continued…
参照URL
• http://www.codezine.jp/article/detail/6103
• http://mglab.blogspot.com/2009/10/blog-
  post.html
• http://www.mcdonalds.co.jp/shop/map/mcd_
  shop.php
• http://e8y.net/mag/013-web-scraper/
• http://www.econ.kobe-
  u.ac.jp/~nomura/lecture/10f/kd-estimate.pdf

カーネル密度推定を用いた店舗情報の可視化