Pythonを利用したオープンデータの分析①・グラフ作成

Image from Gyazo

オープンデータとは

平成24年,日本において公共データの活用促進を目的として電子行政オープンデータ戦略が策定されました. この戦略では,「公共データ活用の推進」「公共データ活用のための環境整備」が具体的な施策とされており, これらの施策の鍵となるのがオープンデータです.

オープンデータは下記に従うことを条件としています.

つまり,行政(地方自治体)が保持している統計データや施設データなどを, 誰もが再利用や再頒布ができることを条件に,コンピュータに扱いやすい形式で公開されたデータをオープンデータと呼びます. 企業や個人のデータでも上記に従えばオープンデータですが,ここでは,行政のデータにターゲットを絞ります(オープンガバメントデータと呼ぶこともあります). 一般に,再利用や再頒布が可能なソフトウェアのことはオープンソースと呼ばれることも合わせて覚えておきましょう.

ここで,ポイントとなるのは,「機械判読に適したデータとは何か?」ということです. 一般に小規模のデータを管理するときには,エクセル を採用することが多いです. 文化情報学部では,1年後期に開講されている「コンピュータと情報 Ⅱ」において,エクセルの使い方を学習します. たしかに,エクセルは,デザイン(書式)や関数など様々な機能を提供しており,人間にとってはとても便利なソフトウェアです. しかし,これらのデータをコンピュータで処理しようとするとき,これらの機能が却って冗長となり,コンピュータによる判読が難しい状況が起こります.

具体例をみてみましょう. まずは,エクセル形式(.xlsx)で表現された日進市の人口のデータ(jinkou.xlsx)です. タイトル部分に太字,表部分に罫線などのデザイン(書式)が設定されていることが分かります. これらは,エクセルを利用している人間が見るためのデザインであり,データの本質ではありません. また,エクセル形式の実態は,XMLや画像などで構成されるZIPファイルであり, エクセルなどの専用のソフトウェアでしか開くことはできません.

https://gyazo.com/1616774a29db01f1cbeeab5f3cae2c40

次に,CSV形式(.csv)で表現された日進市の人口のデータ(jinkou.csv)です. CSVは「しーえすぶい」と読み,オープンデータで頻繁に採用されるデータ形式です. データが「,(カンマ)」で区切られて表現されるだけで,エクセルのようなデザイン(書式)は含みません. このため,一般的なエディタ(メモ帳)でも開くことができます(エクセルでも開けます). エクセル形式に比べると,人間にとっては理解しにくいですが,コンピュータの判読には優れています.

町名,男,女,総数,世帯数
赤池町,1693,1647,3340,1315
浅田町,2593,2431,5024,2086
梅森町,1017,1034,2051,876
野方町,171,173,344,143
蟹甲町,171,200,371,152
折戸町,1404,1381,2785,1073

今回の授業では,日進市のオープンデータポータルサイトで公開されている CSV形式のデータをプログラミング言語のPythonで可視化することを目的とします.

公開されているオープンデータ

オープンデータはウェブで公開されるのが一般的であり, 総務省が運用するData.go.jpがオープンデータのカタログサイトとして知られています. このサイトでは,国土交通省,経済産業省などの組織別のデータセット,また,行財政や観光などのトピックに関するデータ・セットが提供されています. 例えば,観光 というキーワードで検索すると,「平成28年度 国際経済調査事業報告書」,「平成28年度 商店街インバウンド・空き店舗実態調査」などのデータセットがヒットします(平成30年2月28日現在). しかし,残念ながら,これらの多くはPDF形式での提供であり,「機械判読に適したデータ」ではありません. 現状では,まだまだオープンデータの整備は不十分と言えるでしょう.

この他,内閣府のまち・ひと・しごと創生本部が提供している地域経済分析システム(RESAS)が注目されています. RESAS(りーさす)は,総務省が提供している統計情報 e-Statのオープンデータなどを可視化するためのシステムです. 地方自治体の現状や課題を発見することを目的としており,情報を直感的にわかりやすく見える化することができます. 例えば,2015年の愛知県名古屋市の 人口マップ を下記のように可視化することができます. マウスで各市区町村をホバーすると人口が表示され,名古屋市千種区は164,696人であることが分かります. また,人口推移や人口ピラミッドなどのグラフも簡単に描画することができます. このようにデータを可視化して,分かりやすく伝えることも,オープンデータの活用に必要な要素です.

https://gyazo.com/c575390dd62b9f96132d0f7094f7abda

https://gyazo.com/683bc08c165bc4a45cc99d85c977b8bd

https://gyazo.com/772116d1e62edbccc6fda77e87206b36

愛知県下においては,オープンデータに関する取り組みを精力的に進める自治体の一つに 日進市 があります.日進市のウェブサイトでは,オープンデータポータルサイトを開設しており, 住民向け情報(暮らしの情報),事業者向け情報,行政活動情報,観光情報の区分に分けてオープンデータを公開しています. また,平成28年度には,瀬戸市,尾張旭市,豊明市,日進市,みよし市,長久手市,東郷町の7市町で 「7市町オープンデータ検討会」を組織し,連携してオープンデータの整備を始めています. これまでに,7市町が共通のフォーマットで,子育て支援施設,教育機関などのデータを各自治体のウェブサイトで公開しています. 今回は日進市のオープンデータポータルサイトで公開されている 人口データ を加工して利用します. 下記のリンクをダウンロードして確認してください.

nisshin_population.csv

Google Colaboratory

データの分析・可視化は Python の開発プラットフォームの一つであるGoogle Colaboratoryを利用します.

Google Colaboratory

本来は Python の基本から習得が必要ですが,この授業ではデータの分析・可視化の流れを体験することを目的とし,コードをコピー&ペーストしながら作業を進めます. コピーするには「Ctrl + c(「コントロールキー」を押しながら「c」)」,ペーストするには「Ctrl + v(「コントロールキー」を押しながら「v」)」を利用します. コードの詳細を理解する必要はありませんが,何を目的としてコーディングしているかは把握しながら進めましょう.

オープンデータの可視化

それでは,Google Colaboratoryを利用して,オープンデータの可視化とグラフの作成に挑戦しましょう.

ノートブックの作成

まずは,ノートブックを作成します. ノートブックの名前は chapter1.ipynb に設定します.

Image from Gyazo

データの分析・可視化に利用するライブラリを導入します. 最初にグラフ描画ライブラリのmatplotlibを 日本語化するjapanize-matploblibpipコマンド でインストールします. 先頭に「!」を付けることに注意してください.

!pip install japanize-matplotlib

上記のmatplotlibに加えて, データ解析ライブラリであるpandasをインポートします. pyplotの別名としてpltpandasの別名としてpdを指定しています.

import matplotlib.pyplot as plt
import japanize_matplotlib
import pandas as pd

データフレーム(pandas)

pandasを利用して, CSV形式のオープンデータ(nisshin_population.csv)を読み込みます. 読み込まれたデータは データフレーム と呼ばれる形式で保持されます. ここでは,dfという変数(データを記録する箱)にデータフレームが代入されます. データフレームは2次元の表であり,エクセルのワークシートと同じような概念です. 行番号として$0,1,\cdots,100$,列ラベルとして年齢合計 などが設定されています.

# nisshin_population.csv
url = "https://mukai-lab.info/classes/seminar_fundamental_areas/csv/nisshin_population.csv"

# データフレームの生成
df = pd.read_csv(url)

# HTMLで表示(=display(df))
df

Image from Gyazo

データの抽出

列ラベルを指定して,データを抽出するには,df[列ラベル]と記述します.

df["男"]

Image from Gyazo

複数の列ラベルを指定して,データを抽出するには,df[列ラベル1,列ラベル2,...]と記述します.

df[["年齢","男","女"]]

Image from Gyazo

行番号を指定して,データを抽出するには,df[先頭の行番号:後尾の行番号]と記述します. このとき抽出されるのは,後尾の行番号は含まず,一つ前のデータまでが含まれることに注意してください.

df[18:22]

Image from Gyazo

条件を設定してデータを抽出することができます. 例えば,年齢20のデータを抽出するには下記のように記述します. ここで,==は左辺と右辺が一致することを意味します.

df[df["年齢"] == 20]

Image from Gyazo

複数の条件を設定してデータを抽出することができます. 例えば,年齢18以上,21以下であるデータを抽出するには下記のように記述します. ここで,>=は「左辺は右辺以上である」,<=は「左辺は右辺以下である」ことを意味します.

df[(df["年齢"] >= 18) & (df["年齢"] <= 21)]

Image from Gyazo

グラフの作成

matplotlibを利用して,データをグラフで可視化します. 棒グラフを作成するにはdf.plot.bar()を用います. ここで,xはX軸,yはY軸,figsizeはグラフの大きさを意味します.

df.plot.bar(x="年齢", y=["女"], figsize=(12, 8))

Image from Gyazo

折れ線グラフを作成するにはdf.plot.line()を用います. ここでは,Y軸にのデータを指定しています.

df.plot.line(x="年齢", y=["男", "女"], figsize=(12, 8))

Image from Gyazo

横棒グラフを作成するにはdf.plot.barh()を用います. ここでは,5歳間隔で人口を集計します. df.rolling()を用いると指定した区間のデータをまとめて対象にすることができ, sum()によって対象の区間の合計を算出します. また,列番号に[::5]と指定することで,5列おきにデータが抽出されます.

df_population = df[["男", "女"]].rolling(5).sum() # 5歳分を合計
df_population = df_population[::5] # 5歳間隔で抽出
df_population[1:].plot.barh(figsize=(12, 8)) # 0歳を除く

Image from Gyazo

本日のノートブックは下記URLで確認できます.

chapter1.ipynb

課題

Google Colaboratoryで作成した chapter1.ipynb を保存し, 共有用のリンクノートブック(.ipynb) をダウンロードして提出しなさい. 提出の前に必ず下記の設定を行うこと.

参考書籍

愛知県名古屋市にある椙山女学園大学 文化情報学部 向研究室の公式サイトです. 専門は情報科学であり,人工知能やデータベースなどの技術要素を指導しています. この公式サイトでは,授業で使用している教材を公開すると共に, ベールに包まれた女子大教員のミステリアスな日常を4コマ漫画でお伝えしていきます. サイトに関するご意見やご質問はFacebookまたはTwitterでお問い合わせください.