政府統計データ取得 API e-Stat の簡単な使用方法 その 2

政府統計データ取得 API の基本的な流れは、
統計表情報取得 → メタ情報取得 → 統計データ取得
ということを前回説明しました。

今回は統計表情報取得で取得したデータの中身について見ていきたいと思います…が、
前回は取得したレスポンスが json 形式で、
コード上では string 型のままでした。
このままでは解析しにくいため、
これを Dictionary<string, object> 型にパースするコードを追加します。
コードはこちらのサイトを参考に作りましょう。
Parse() メソッドの戻り値は object ですが、
Dictionary<sring, object> がボックス化されているだけなので、
使うときは as 演算子でボックス化解除すれば O.K.。

さて、
string 型 → object 型 -> Dictionary<string, object> 型
に変換することができたので、
これでようやく json の中身をコードで探ることができます。
ここで仕様書を見てみると、
GET_STATS_LIST/DATALIST_INF/TABLE_INF タグに id という属性があり、
これが統計表 ID であると書いてあります。

ではこれをコードで探索してみましょう。

28、37、38 行目で使用している GetValue() メソッドは、
Dictionary<string, object> 型に対する拡張メソッドで、
次に紹介するコードのように定義しました。
要は XML タグを探すときと同じようにタグの中身を覗けるようにするメソッドです。

また、
TABLE_INF タグについては、
検索にヒットした数だけ配列として並ぶ場合があるため、
object[] として取得するようにし、
foreach 文でそれぞれの属性を表示するようにしています。

下記は GetValue() 拡張メソッドのコードです。

GetValue() メソッドは自分を再帰的に呼び出すことで、
自身の階層構造を探索できるようにしています。

実行結果は次のようになります。
ScreenShot01

2012 年に調査した政府統計コード 00200524 に対する検索結果が 22 件あり、
それぞれの統計表 ID と提供統計名がわかりました。

これでやっと統計表 ID がわかったので、
提供統計名から自分の欲しいデータを探し、
それに対応する統計表 ID でメタ情報取得がおこなえるようになりました。

というわけで次回へ続く。

政府統計データ取得 API e-Stat の簡単な使用方法 その 1

せっかくなので簡単な使い方だけ少しまとめておきます。
とはいってもここに仕様書があるからこれ見ればだいたいのことはできるんだけどね。

自分が作成したサンプルソフトのスクリーンショットがこちら。
ScreenShot

API にはバージョンが 1.0 と 2.0 とあるみたいですが、
上位のほうがいいだろうと盲信して 2.0 を使用しています。

また、この API を使用するにあたって、
e-Stat での利用登録とアプリケーション ID の発行が必要となります。
発行されたアプリケーション ID を使用して API と通信します。
登録の流れは、
web 上で必要事項を入力 → 受信したメールから本登録用 URL にアクセス → 登録完了
アプリケーション ID の発行については、
e-Stat にログイン → アプリケーション ID の取得ページにアクセス → 必要事項を入力 → 即時発行
という感じです。
必要事項を入力しなければいけないところがありますが、
大したものではないので、自分の場合は 3 分もかからずに
登録から発行まで完了しました。

さて、
仕様書によるとこの API を通して以下の操作ができるようです。
ここで紹介するのは上の 3 つの操作のみです。
・統計表情報取得
・メタ情報取得
・統計データ取得
・データセット登録
・データセット参照
・データカタログ情報取得

統計データ取得について

 

とにかくやりたいことは統計データを取得することだ!
というわけでいきなり統計データ取得について見てみます。

統計データ取得をおこなう場合、API に対して次のようにアクセスします。

これは他の操作に関しても同様ですが、
2.0 の部分を 1.0 とすると、バージョン 1.0 の API 機能として動作するようです。
また、レスポンスを XML 形式で受信したい場合は “/json” を省略します。
JSONP 形式で受信したい場合は “/json” を “/jsonp” に置き換えます。
ここでは JSON 形式で受信しています。

さて、これだけでは一体何の統計データを取得するのか、
API はおろかリクエストを送信する自分でさえも把握できていません。
具体的に何の統計データを取得するかを指定するために、
次のような絞込データをパラメータとして追加する必要があります。

パラメータ名 意味 設定内容
statsDataId 統計表ID 統計表情報取得で得られる統計表 ID を指定する。
cdArea 地域エリア単一コード 特定の項目コードでの絞り込み。
メタ情報取得で得られる各メタ情報の項目コードを指定する。
コードはカンマ区切りで 100 個まで指定できる。
cdCat01 分類事項01 単一コード 特定の項目コードでの絞り込み。
メタ情報取得で得られる各メタ情報の項目コードを指定する。
コードはカンマ区切りで 100 個まで指定できる。

この他にも色々絞込条件はありますが、
詳しくは仕様書を見て下さい。

パラメータの内容を見てみると、
統計データを指定するには、
「統計表情報取得」で “統計表 ID” を取得し、
「メタ情報取得」で “項目コード” を取得する必要があるようです。
つまり、リクエスト URL は最終的にこんな感じになるということです。

それでは各情報取得について順番に見ていきます。

 

統計表情報取得について

統計表情報取得をおこなう場合、API に対して次のようにアクセスします。

上記のアクセス方法では、e-Stat が持っている統計表情報すべてを受信してしまうため、
かなり膨大な量となる上に、多種の情報が交錯してしまうため、
あまり有用なデータとして受信できません。
統計表情報取得の際には次のようなパラメータを追加して、
条件を絞り込んでデータを取得するようにします。

パラメータ名 意味 設定内容
surveyYears 調査年月 以下のいずれかの形式で指定できる。
yyyy : 単年検索
yyyymm : 単月検索
yyyymm-yyyymm : 範囲検索
statsField 統計分野 以下のいずれかの形式で指定できる。
数値 2 桁 : 統計大分類で検索
数値 4 桁 : 統計小分類で検索
statsCode 政府統計コード 以下のいずれかの形式で指定できる。
数値 5 桁 : 作成機関で検索
数値 8 桁 : 政府統計コードで検索
searchWord 検索キーワード 任意の文字列
表題やメタ情報に含まれている文字列を検索する。
AND、OR、NOT を指定できる。

上記のパラメータを指定する場合は先ほどの “http:// ~” に “&” を付けて追加します。
この他にも指定できるパラメータはありますが、
詳細は仕様書を見て下さい。

それでは C# コードから実際にアクセスしてみます。

 

13 行目の appId には、自分が取得したアプリケーション ID をコピペして下さい。
16、17行目で surveyYear と statsCode パラメータを指定しています。
ここでは 2012 年に調査された人口推計データの政府統計コードを指定しています。
statsCode パラメータについては e-Stat の提供データから確認できます。
20 行目で API にリクエストを投げるメソッドをコールしています。

実行してみると、次のような結果が返ってきます。
本当はもっともっとも~っと長いんですが、
先頭の 100 文字だけを出力しています。
getStatsList

getStatsList リクエストに対するレスポンスなので、
先頭が “GET_STATS_LIST” となっています。
その後、”GET_STATS_LIST/RESULT/STATUS” に
エラーコードが格納されます。
このエラーコードが “0” なら正常終了です。
その他の場合はデータが存在しないか、
リクエスト時のパラメータの指定が間違っています。

予想以上に長くなってきたのでここでいったん打ち切り。
全然 “簡単な” 使用方法ではないな…。

政府統計データ取得 API e-Stat を使ったサンプルソフト作ってみました

政府統計の総合窓口というページでは、
様々な統計データを web 上で見たりダウンロードできたりと、
非常に大きな統計データを公開しています。
http://www.estat.go.jp/

そして、
その統計データをアプリケーションから取得できるようにした
API 機能が公開されていました。
http://www.e-stat.go.jp/api/

というわけでとりあえず使ってみたくなるのが開発者のサガなのか…。
こんなソフト作ってみたよ。

人口推計の他にもいろいろな統計データが公開されています。
API 機能に対応しているデータはこちらのページで確認できます。

せっかくなのでこのソフトはここで公開。
この API で何か面白いアプリ作れないかなぁ。

サンプルアプリ:YKStatistics (128KB)

WPF で棒グラフコントロールを作ってみた

とりあえず結果をどーん.
BarGraph

折れ線グラフと違って,
棒グラフの場合は横軸に何が来るのかわからないので,
何が来ても表示できるように対応しました.
ItemsControl と同じように ItemTemplate を指定することで
統一された表示形式で横軸アイテムを並べられるようにしています.
いや~苦労した.

グラフの棒とか目盛線とかは
折れ線グラフコントロールと同様に,
OnRender を override して,
DrawingRectangle やら DrawingLine やらの嵐.
折れ線グラフほどデータ量が多くはないので
描画速度は全然気にならないかな.
むしろサンプルで表示させようとした横軸ラベルの画像の表示に時間がかかっていたり….
ItemTemplate の適用方法がまずかったのかなぁとも思いつつ,
こんなコントロール多用はしないだろうということで放置.

折れ線グラフコントロールとほぼ共通ですが,
グラフメニューも用意してあります.
GraphMenu
右クリックするとよく使うメニューがショートカットメニューとして表示されます.
カメラマークは表示中のグラフを .bmp で保存するボタン.
Configuration ボタンを押すとさらに詳細設定画面が開く仕様となっています.

カスタムコントロールの内部構造のお話ですが.
折れ線グラフコントロールがウィンドウを持ってて,
そのウィンドウに対する ViewModel があったりとかした時代もありました.
複雑怪奇でメンテナンスする気も全然起きなかったので,
思い切って内部構造を改良したはいいものの,
今までとはまったく互換が無いものに仕上がってしまったりなど,
グラフコントロールの内部構造は紆余曲折ありましたが,
なんとか他のコントロールとほぼ同じような内部構造となり,
メンテナンスもしやすいようになりました.

Windows Phone はじめました

何を思ったか、SIM フリーの Windows Phone である
Nokia Lumia 630 を購入してしまいました。
いろいろ調べてたら購買意欲が急激に上がってそのままポチってたw

かなりの低価格でぬるぬる動く Windows Phone マジ最強とか思ってたのに、
携帯変わりましたメールを一斉送信したら
ほぼすべてが一斉に戻ってきました。
はい、PC メールから携帯キャリアメールに送信できないという
罠に見事にかかったワタクシでございます。

受信は問題ないということなので、
とりあえず旧携帯で携帯変わりましたメールを送信して周知。
こっちから連絡取りたくなったら SMS 送信の方針で。

失敗したのは携帯変わりましたメールにドメイン拒否されないように
設定をお願いする一文を書かなかったこと。
よく連絡する一部の友人とかには個別でメールを送りなおしてなんとか対処。
あーもう、なんでこうなるかなぁ。
予想斜め上の展開に呆然。

でも 4.5 インチで見る娘の写真のロック画面はかなり癒されます。
というわけで前途多難なスマホデビュー。

折れ線グラフに関して

以前折れ線グラフの作り方を少しずつ紹介していましたが,
ぶっちゃけ途中で面倒になって頓挫していました.

現段階での折れ線グラフはこのような外観になりました.
screenshot
設定ウィンドウなんかも用意してあります.
screenshot2

ドラッグによる移動/拡大操作機能も付いて,
自分としてはまあまあ使いやすくなったかな.
まだ足りない機能がたくさんあるけど,
とりあえず実装するには問題ないレベルに到達したかな.

一応 DrawingVisual なんかを駆使しながら,
なんとか描画速度にストレスがないように工夫してやっています.
が,やっぱり市販のチャートソフトにはかないそうにありません.
みんなどうやってるのかなー.気になるなー.
でもこれ以上マニアックなことに突っ込むと,
仕事の片手間では時間が足りないと思うので
これで満足することにします.

WPF で二重起動を防止する

メモメモ.

アプリケーションが立ち上がる前に確認しなければならないので,
App.xaml.cs のスタートアップイベントを登録して記述します.

まず App.xaml に次のような記述をします.

Startup イベントと Exit イベントにハンドラを追加しています.

次に App.xaml.cs に当該ハンドラを実装します.

ポイントは 1 行目と 6 行目.
1 行目で特定の名前を付けた Mutex を生成します.
6 行目ではミューテックスの所有権を要求し,
特定の名前が既に使われているかどうかを確認しています.
上記の例では,既に使われている場合は
メッセージダイアログを表示した後にアプリケーションを終了させています.
もちろん mutex の Close() 等の後片付けを忘れずに.

アプリケーションを終了するときの処理も忘れずに.

mutex を解放しておかないと,
ひとつも起動していないのに
ミューテックスの所有権を得られずに二度と起動できないことになってしまいます.

コントロールの外観を変更する

しばらく間が空いてしまいましたが,
最近はコントロールの外観を変更する方法を試行錯誤しておりました.
そんなわけでできあがってきたのがこんなサンプルソフト.
screenshot

コントロールの外観を定義する Xaml を含む
カスタムコントロールライブラリを DLL 化して使用しています.
DLL に Style 定義があらかじめ用意されているため,
XAML 上では Button とか CheckBox 等をそのまま書いています.
ユーザ(この場合はアプリケーション開発者)が特に手を入れなくても
勝手に上記の画面のようなコントロールになります.

ドロップダウンボタンやスピンボタン,カラーピッカーはカスタムコントロールとして定義しているので,
こちらもユーザ側は小難しいことはせず,例えば下記のように書くだけで OK.

メッセージボックスなんかもカスタマイズしたものをコールできるようにしました.
messagebox

後は動的なテーマ変更も実装してなかなかいい感じになったかな.
他にもシステムメニューを封印したり,実は WindowChrome を使っていたりなどなど,
細かいところにちょっとした実装が含まれています.

カスタムコントロ-ルはまだ数が少ないので徐々に増やしていくつもり.
そろそろ折れ線グラフコントロールをまともに作り直したい.

RichTextBox とデータバインディングする

Visual Studio とかでは当たり前のように表示されている出力ウィンドウのような部分で使われているのは
おそらく RichTextBox に類するものではないかと思っています.
テキストの種類によって色を変えたり太さを変えたりしてますよね.
自分のソフトでも同じようなものを実現しようとすると,
WPF では RichTextBox を使いたくなります.
RichTextBox は XAML 上では次のように使うようです.

Document プロパティは FlowDocument クラスのようで,
その下に Paragraph を並べることで文章を表示するようです.

じゃあ MVVM で RichTextBox の中身をデータバインディングしてほげほげしましょ.
と調子に乗って Document にバインドしようとすると次のように怒られてしまいました.
DisBindable
Document プロパティは DependencyProperty ではないようで,
このままではデータバインディングできないようです.

そこで CodePlex かどこかで紹介されていたネタがこちら.

DependencyProperty ではないのなら DependencyProperty にすればいいじゃない!
というわけで RichTextBox から派生させた BindableRichTextBox クラスを 定義します.
Document プロパティを改めて定義し直し,
Document プロパティが変更されたら RichTextBox クラスとしての Document プロパティに横流ししています.

さらに,このまま FlowDocument としてデータバインドするのもいいんですが,
出力ウィンドウのようなものを考えた場合,
もう少し情報量を制限したものとバインドしたほうがやりやすいと思うので,
次のようなクラスを作ります.

文字列を格納する Text プロパティと,
それを修飾するための Foreground プロパティと FontWeight プロパティ.
それから行間を決める Margin プロパティです.
このクラスのコレクションをバインドして,
あとはコンバータで FlowDocument に変換させます.

こうすることで例えば ObservableCollection<RichTextItem> 型の OutMessage プロパティを用いて

というような感じで Document プロパティにバインドできる RichTextBox ができあがります.
BindableRichTextBox
上の画像は Add ボタンでその上の TextBox の内容をランダムな色で追加するというもので,
10 行目を追加したところ.
後は自動的に末尾にスクロールさせたりとかすれば,
出力ウィンドウの再現もそう遠くはないはず.

TextBox の自動スクロール

だいぶ二番煎じかと思われますが,
自分メモとして残します.

テキストが追加されたときに
自動的に最後尾までスクロールしてくれる TextBox は何かと便利です.
しかし,これを実現するためには
MSDN にもあるように C# コードで次のようにする必要があります.

 

これだけのために C# コードを書かないといけないのはなんだか美しくない.
ということでもう少し調べてみたら,ScrollViewer を利用する方法が紹介されていました.
ScrollViewer には ScrollToBottom() というメソッドがあり,
TextBox の TextChanged イベントでこのメソッドをコールするという方法です.
相変わらず C# コード書かないといけないのは変わらないんですが,
自分は TextBox を自分好みにしたカスタムコントロールを使っていて,
TextBox を ScrollViewer でラップしていたので,
これを利用することにしました.

カスタムコントロールの実装部では C# コードから ScrollToBottom() メソッドをコールしていますが,
このコントロ-ルを使う側では,IsAutoVerticalScroll プロパティを True に設定するだけで
自動スクロールが実現されるという仕様にしたので,
かなり使い勝手が良くなりました.