政府や行政が主導して国内でも環境が整いつつあるオープンデータの活用。今回は特別編として、オープンデータを活用した実践的な分析を展開します。
第5回までの連載ではPythonを使った分析環境の準備や基本的な使い方、データクレンジングの方法を紹介してきました。説明で扱うデータはサンプルデータではなく実際のデータを使い、実践的なスキルを身に付けていただけるように紹介してきましたが、やはり実践の場で使おうと思うと、連載の中で紹介した内容だけでは解決するのが難しい問題に直面してしまいます。
今回は特別編ということで、より実践的なデータ処理を身に付けていただくために、最近話題の「オープンデータ」を題材に、より実践的なスキルを身につけていただけるようなテクニックを紹介したいと思います。
最近の例では、武雄市・千葉市・奈良市・福岡市の4自治体が中心となって「ビッグデータ・オープンデータ活用推進協議会」を設置し、アイディアコンテストなどを実施することにより、自治体が所有するオープンデータの活用を推進しようという動きもあります。
取り組みの中心になっている自治体の1つである千葉県では、積極的に情報公開を行い、地方自治のためのみならず地域に関連する企業のビジネスにも活用してもらいたいと考えているようです。
例えば地域のことを詳しく知る手段の1つとして人口統計の情報がありますが、千葉市は区別の統計情報のみならず年齢別、町丁別に分かれている細かなメッシュの統計情報を公開しています。
このように、オープンデータはさまざまな分析に活用できる素材なのですが、残念ながら、そのままでは分析できる形式になっていません。そこで、これまでの連載で紹介してきた内容を使って、データの統合や変換、クレンジングを行う必要があります。
例えばデータは区別、年度別にExcelデータとして公開されています。上記6区では、平成5年から平成25年までの21年分のデータがあるので、126のExcelファイルにあるデータを統合する必要があります。また図1のように、データは町丁と年齢でクロス集計されていますのでクロス集計前の形式に戻す必要があります。
このほかにも細かいクレンジングなどが必要となりますので、以下に必要な作業をまとめました。
それぞれについて解説していきたいと思います。なお、本稿では、連載バックナンバーで示したPytohn実行環境やライブラリが整っている前提で解説しています。各ツールのバージョンなどによって挙動が変更になる可能性がありますので、各ツールのドキュメントなども併せて確認してください。
第3回で紹介した方法を使うとWeb上に公開されているExcelファイルを直接pandasのDataFrameに取り込むことが出ます(バックナンバー参照)。
ただし、残念ながら今回のケースでは、区ごとや年度ごとに公開されているディレクトリが統一されていないので、汎用的なアルゴリズムを作るのが難しいケースもあります。データの内容としては過去のデータであり更新されることがないデータですので、ちょっと面倒ですが、あらかじめダウンロードしておくという方法が楽な場合もあります。
In [1]: import pandas as pd In [2]: import urllib2 In [3]: link = 'http://www.city.chiba.jp/sogoseisaku/sogoseisaku/tokei/download/tyu_tyo2503.xls' In [4]: socket = urllib2.urlopen(link) In [5]: xls = pd.ExcelFile(socket) In [6]: df = xls.parse(xls.sheet_names[0], skiprows=2, parse_cols="B:DE") In [7]: df.head() Out[7]: <class 'pandas.core.frame.DataFrame'> Int64Index: 5 entries, 0 to 4 Columns: 108 entries, Unnamed: 0 to Unnamed: 107 dtypes: float64(105), object(3)
区ごと、年度ごとにファイルが分割されていますので統合する必要があります。今回のケースでは126のExcelファイルがありますので、これらを順に取り込みます。幸いファイル名は規則性がありますので[区]と[年度]の配列を作ってfor文で繰り返し処理を行います。
In [1]: wardlist = ['han', 'ina', 'mid', 'mih', 'tyu', 'wak'] In [2]: yearlist = ['05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25'] In [3]: month = '03' In [4]: for ward in wardlist: # 区毎のループ処理 ....: for year in yearlist: # 年毎のループ処理 ....: filename = ward + '_tyo' + year + month + '.xls' ....: print filename ....:
Copyright © ITmedia, Inc. All Rights Reserved.