« 玄箱 - MUSASHIをインストールしてみる | トップページ | 円ドル表示ガジェット修正します »

2006年10月13日 (金)

玄箱 - MUSASHIをつかってみる

前回、玄箱にMUSASHIをインストールしてみたわけですが、さて玄箱のスペックでMUSASHIが満足に使えるものなのかどうか不安なところです。ということで、ちょっと大きなデータをMUSASHIで処理してみましょう。

まず、データをどうするかですがMUSASHIサイトの人工データのリンクを参考にして、データを生成するというのが有効かと思いましたが、ちょっと興味本位で現実に存在するデータをいじってみたくなりました。で、ここではパッと思いついた郵便番号のデータを使おうと思います。全国一括データ約12万件を利用します。

ken_all.lzhをダウンロードして展開すると、ken_all.csvは121693件のデータでした(2006.10.13現在)動作テストするには十分な量だと思います。このCSVに対してテキストエディタの置換などを使ってダブルクォーテーション(")を削除します。そして、一番先頭に次のヘッダを追加します。

===
全国地方公共団体コード,旧郵便番号,郵便番号,都道府県名,市区町村名,町域名,都道府県名,市区町村名,町域名,一町域が二以上の郵便番号で表される場合の表示,小字毎に番地が起番されている町域の表示,丁目を有する町域の場合の表示,一つの郵便番号で二以上の町域を表す場合の表示,更新の表示,変更理由
===

追加したら、文字コードEUCで上書き保存します。
玄箱はデフォルトでEUCですが、他の文字コードを利用している場合は環境に合わせて変更してください。

データの準備ができたら、FTP等で玄箱にアップロードします。

では、玄箱に接続してみましょう。
とりあえずCSVファイルをみてみます。

---
$ head KEN_ALL.CSV
全国地方公共団体コード,旧郵便番号,郵便番号,都道府県名カナ,市区町村名カナ,町域名カナ,都道府県名,市区町村名,町域名,一町域が二以上の郵便番号で表される場合の表示,小字毎に番地が起番されている町域の表示,丁目を有する町域の場合の表示,一つの郵便番号で二以上の町域を表す場合の表示,更新の表示,変更理由
01101,060  ,0600000,ホツカイドウ,サツポロシチユウオウク,イカニケイサイガナイバアイ,北海道,札幌市中央区,以下に掲載がない場合,0,0,0,0,0,0
01101,064  ,0640941,ホツカイドウ,サツポロシチユウオウク,アサヒガオカ,北海道,札幌市中央区,旭ケ丘,0,0,1,0,0,0
01101,060  ,0600041,ホツカイドウ,サツポロシチユウオウク,オオドオリヒガシ,北海道,札幌市中央区,大通東,0,0,1,0,0,0
01101,060  ,0600042,ホツカイドウ,サツポロシチユウオウク,オオドオリニシ(1-19チヨウメ),北海道,札幌市中央区,大通西(1~19丁目),1,0,1,0,0,0
01101,064  ,0640820,ホツカイドウ,サツポロシチユウオウク,オオドオリニシ(20-28チヨウメ),北海道,札幌市中央区,大通西(20~28丁目),1,0,1,0,0,0
01101,060  ,0600031,ホツカイドウ,サツポロシチユウオウク,キタ1ジヨウヒガシ,北海道,札幌市中央区,北一条東,0,0,1,0,0,0
01101,060  ,0600001,ホツカイドウ,サツポロシチユウオウク,キタ1ジヨウニシ(1-19チヨウメ),北海道,札幌市中央区,北一条西(1~19丁目),1,0,1,0,0,0
01101,064  ,0640821,ホツカイドウ,サツポロシチユウオウク,キタ1ジヨウニシ(20-28チヨウメ),北海道,札幌市中央区,北一条西(20~28丁目),1,0,1,0,0,0
01101,060  ,0600032,ホツカイドウ,サツポロシチユウオウク,キタ2ジヨウヒガシ,北海道,札幌市中央区,北二条東,0,0,1,0,0,0
---

データが正常なのを確認したら、MUSASHIのcsv2xtコマンドでxmlTableに変換します。

---
$ csv2xt -F -i KEN_ALL.CSV -o zip.xt
#END# 27942 2006/10/13 11:17:54 "csv2xt -F -i KEN_ALL.CSV -o zip.xt" in=121692 out=121692
---

csv2xtは、名前のとおりCSVファイルをxmlTable形式に変換するコマンドです。
xmlTableはMUSASHIがデータ処理に使うフォーマットです。

さて、かなり時間がかかるに違いないと思いキー入れたらお茶でも淹れようと席を立ちかけたんですが、この処理は10秒程度で終わってしまいました。思ったよりかなり高速です。これはもしかしたら普通に仕事で使えるかも?と期待が出てきたのでお茶はあとまわしにして、処理を続けてみましょう。

zip.xtの中身は以下のようになっています。

---
$ head -25 zip.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<field no="1" name="全国地方公共団体コード"></field>
<field no="2" name="旧郵便番号"></field>
<field no="3" name="郵便番号"></field>
<field no="4" name="都道府県名カナ"></field>
<field no="5" name="市区町村名カナ"></field>
<field no="6" name="町域名カナ"></field>
<field no="7" name="都道府県名"></field>
<field no="8" name="市区町村名"></field>
<field no="9" name="町域名"></field>
<field no="10" name="一町域が二以上の郵便番号で表される場合の表示"></field>
<field no="11" name="小字毎に番地が起番されている町域の表示"></field>
<field no="12" name="丁目を有する町域の場合の表示"></field>
<field no="13" name="一つの郵便番号で二以上の町域を表す場合の表示"></field>
<field no="14" name="更新の表示"></field>
<field no="15" name="変更理由"></field>
</header>
<body><![CDATA[
01101 060__ 0600000 ホツカイドウ サツポロシチユウオウク イカニケイサイガナイバアイ 北海道 札幌市中央区 以下に掲載がない場合 0 0 0 0 0 0
01101 064__ 0640941 ホツカイドウ サツポロシチユウオウク アサヒガオカ 北海道 札幌市中央区 旭ケ丘 0 0 1 0 0 0
01101 060__ 0600041 ホツカイドウ サツポロシチユウオウク オオドオリヒガシ 北海道 札幌市中央区 大通東 0 0 1 0 0 0
01101 060__ 0600042 ホツカイドウ サツポロシチユウオウク オオドオリニシ(1-19チヨウメ) 北海道 札幌市中央区 大通西(1~19丁目) 1 0 1 0 0 0
01101 064__ 0640820 ホツカイドウ サツポロシチユウオウク オオドオリニシ(20-28チヨウメ) 北海道 札幌市中央区 大通西(20~28丁目) 1 0 1 0 0 0
---

ちゃんと変換されているみたいですね。xmlTable形式については他にドキュメントがあるので調べてみることをおススメします。

では次に、集計に必要な項目を抜き出してみます。項目の選択はxtcutを使います。

---
$ xtcut -f 全国地方公共団体コード,郵便番号,都道府県名 -i zip.xt -o test1.xt
#END# 16235 2006/10/13 11:31:10 "xtcut -f 全国地方公共団体コード,郵便番号,都道府県名 -i zip.xt -o test1.xt" in=121692 out=121692
---

test1.xtを確認します。

---
$ head test1.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<field no="1" name="全国地方公共団体コード"></field>
<field no="2" name="郵便番号"></field>
<field no="3" name="都道府県名"></field>
</header>
<body><![CDATA[
01101 0600000 北海道
01101 0640941 北海道
---

全国地方公共団体コード、郵便番号、都道府県名が切り出されています。
xtcutも2~3秒で終わりました。非常に高速です。

次に、都道府県ごとの郵便番号数を集計してみます。
集計はxtaggで行います。

---
$ xtagg -k 都道府県名 -f 郵便番号:郵便番号数 -c cnt -i test1.xt -o test2.xt
#END# 23059 2006/10/13 11:41:29 "xtagg -k 全国地方公共団体コード -f 郵便番号:郵便番号数 -c sum -i test1.xt -o test2.xt" in=121692 out=1973
---

これも2秒程度で終わりました。
中身は

---
$ head -20 test2.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<field no="1" name="全国地方公共団体コード"></field>
<field no="2" name="郵便番号数"></field>
<field no="3" name="都道府県名" sort="1"></field>
</header>
<body><![CDATA[
23101 6876 愛知県
38201 1734 愛媛県
08201 2818 茨城県
33201 2182 岡山県
47201 790 沖縄県
03201 1934 岩手県
21201 3340 岐阜県
45201 876 宮崎県
04101 3281 宮城県
26101 6657 京都府
43201 1865 熊本県
10201 1502 群馬県
---

こんな感じですね。ちょっとわかりやすくするためにxtsortで郵便番号数で降順ソートしてみましょう。

ソートのついでに全国地方公共団体コードはいらないので削除したいです。xtcutで郵便番号数と都道府県名を切り出します。

これらの処理を一括して行いたい場合はパイプを使って記述します。シェルなどで高度な集計プログラムを作る場合は、このパイプでの一括処理が強力です。

ソートと項目選択の記述は以下のようになります。

---
$ xtsort -k 郵便番号数%nr -i test2.xt | xtcut -f 郵便番号数,都道府県名 -o test3.xt
---

test3.xtは以下のようになります。

---
$ head -20 test3.xt
<?xml version="1.0" encoding="euc-jp"?>
<xmltbl version="1.1">
<header>
<field no="1" name="郵便番号数" sort="1" numeric="1" reverse="1"></field>
<field no="2" name="都道府県名"></field>
</header>
<body><![CDATA[
8205 北海道
6876 愛知県
6657 京都府
5351 新潟県
5200 兵庫県
3909 福島県
3732 大阪府
3529 千葉県
3340 岐阜県
3333 東京都
3281 宮城県
3256 福岡県
3237 富山県
---

これで、「全国郵便番号が多い都道府県ランキング」ができましたw
データをみると、北海道が一位ですね。やはり土地面積が大きいからでしょうか。単純に考えれば面積が大きい県ほど郵便番号が多いと思われますが、面積が小さくても人口密度が高くて居住区画の割り方が細かいところは郵便番号が多くなるはず。大阪や東京が高い順位にきているのはそのせいかもしれません。

都道府県別の土地面積や人口、人口密度などのデータを組み合わせれば、面白い分析ができるかもしれません。単にスピードテストのつもりで郵便番号データを使用しましたが、やってみると発見があるものですな。これがデータ分析の面白いところだと思います。

さて本題に戻すと、玄箱でのMUSASHIは正常に動作し、しかも処理速度は実用に耐えるレベルであるということがわかりました。これはほんとに仕事で使えそうですねえ。でもボク自身MUSASHIは勉強中なのではやくいっちょまえに使えるようになってブログでもMUSASHIを使ったデータマイニングを紹介できればいいなあと思っています。
ガンバルガー!

|

« 玄箱 - MUSASHIをインストールしてみる | トップページ | 円ドル表示ガジェット修正します »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/125677/3789069

この記事へのトラックバック一覧です: 玄箱 - MUSASHIをつかってみる:

« 玄箱 - MUSASHIをインストールしてみる | トップページ | 円ドル表示ガジェット修正します »