前回、Jupyterノートブック上で、CSVファイルを読み込み、棒グラフを描画する方法を紹介した。今回は、CSVファイルの任意のデータを取り出したり、さらに、いろいろなグラフを描画する方法を紹介する。
人口の増減を確認しよう
前回より、Pandasというライブラリを利用して、CSVデータの読み込みと描画を行っている。Pandasは、非常に強力なデータ分析ライブラリだ。また、前回見たとおり、CSVファイルを読み込んでグラフを描くだけなら、数行記述するだけで事足りるというお手軽さも魅力だ。
さて、今回はもう少しPandasの実力を確認してみよう。最初に、Pandasで特定の列を取り出してみよう。そのためには、以下のように記述する。
import pandas as pd
df = pd.read_csv("population.csv", encoding="SHIFT_JIS")
df["平成28年"]
プログラムにある通りなのだが、pdf.read_csvメソッドでCSVファイルを読み込むと、DataFrame型という表形式のオブジェクトが得られるのだが、df["列名"]のように書くことで、任意の列を取り出すことができる。
また、取り出した複数の列を使って、行列演算を行うこともできる。次に、平成12年と平成28年で、どれだけ人口が増減したのかを調べる計算をしてみよう。
import pandas as pd
df = pd.read_csv("population.csv", encoding="SHIFT_JIS")
df["平成28年"] - df["平成12年"]
このように、取り出した列と列をマイナス演算(-)で計算させると、各列の要素ごとの計算をして結果を出力してくれる。
とは言え、このままでは、わかり辛いので、ラベルを付けて、グラフで描画してみよう。しかも、すべての都道府県についてグラフにするのは、冗長なので、人口が増えたトップ10を抜き出して描画しよう。
%matplotlib inline
import pandas as pd
df = pd.read_csv("population.csv", encoding="SHIFT_JIS")
# 増減を調べる --- (*1)
df['増減'] = df["平成28年"] - df["平成12年"]
# 並び替え --- (*2)
df = df.sort_values(by=["増減"], ascending=False)
# 上位10位を得る --- (*3)
top10 = df[0:10]
# グラフで描画 --- (*4)
top10.plot.bar(y=["増減"], x=["都道府県"])
top10
やはり、東京と神奈川が顕著に増えていることが分かるグラフになっているが、本題のプログラムに注目してみよう。
プログラムの(*1)の部分で、人口の増減を調べるために、平成28年と12年の差を計算する。先ほど紹介したように、Pandasを使って、列を取り出したとき、それぞれの要素について演算を行うことができる。それで、演算した結果を「増減」という列を作って代入しているが、これは、元のデータに「増減」という列を追加することになる。実行結果の表を確認してみて欲しい。最後尾の列に増減という列が増えていることが分かる。
そして、プログラムの(*2)では、人口の増加が多かった順に並び替える。(*3)の部分では、上位10件を取り出し変数top10に代入する。Pandasで任意の範囲の行を取り出すには、df[0:10]のように記述する。これは、0行目から10行目-1(つまり、9行目)までを取り出すという意味になる。そのため、もし、(0から数えて)2行目から8行分を取り出したければ、df[2:9]と記述すると良い。Pythonの配列の特徴だが、終端の指定が-1になるという点は注意が必要だ。
最後に、(*4)の部分で、棒グラフを描画し、表を出力する。棒グラフを描画するplot.barメソッドでは、x軸とy軸にどのデータ列を用いるかを明示的に指定することで、正しいグラフを描画できるようになっている。
ところで、逆に人口が最も減っている都道府県はどこだろうか。気になる人は、自分でプログラムを改良して調べてみよう。ヒントだが、一カ所プログラムを書き換えるだけで調べることができる。
棒グラフを分かりやすく加工しよう
ところで、先ほど、人口増加のトップ10の中に石川県があった。しかし、グラフでなく、表を見てみると、石川県はマイナス成長となっている。そこで、プラス成長とマイナス成長の境目を、しっかりと示すグラフを書いてみよう。
%matplotlib inline
import pandas as pd
df = pd.read_csv("population.csv", encoding="SHIFT_JIS")
# 増減を調べて並び替える
df['増減'] = df["平成28年"] - df["平成12年"]
df = df.sort_values(by=["増減"], ascending=False)
# プラスとマイナスの中間を抜き出す --- (*1)
mid = df[5:15]
# グラフのスタイルに ggplot を利用する --- (*2)
import matplotlib
matplotlib.style.use('ggplot')
# グラフ描画
plt = mid.plot.bar(y=["増減"], x=["都道府県"])
# 0のラインを強調 --- (*3)
plt.axhline(0, color='k')
全体を通して、前回のプログラムとそれほど違いがあるわけではない。異なる部分だけに注目してみよう。(*1)の部分では、(0から数えて)5行目から14行目までを取り出している。
今回、注目したいのが(*2)と(*3)の部分だ。(*2)のように書くと、ggplotというスタイルを適用し、より美しいグラフを描画できるようになる。そして、(*3)の部分では、Y軸の0の境界を強調するように指定している。
人気の都道府県を円グラフにしてみよう
次に、このデータで最新の平成27年と28年を比較して、人口が増加した都道府県のトップ5を円グラフで表示してみよう。
%matplotlib inline
import pandas as pd
import matplotlib
matplotlib.style.use('ggplot')
df = pd.read_csv("population.csv", encoding="SHIFT_JIS")
# 増減を調べ増加順に並び替える
df['増減'] = df["平成28年"] - df["平成27年"]
df = df.sort_values(by=["増減"], ascending=False)
# 上位5位を抽出
top = df[0:5]
# 円グラフで描画 --- (*1)
top["増減"].plot.pie(labels=top["都道府県"], autopct='%.0f')
これを見ると、東京の増加率がすごいことが分かる。そして、愛知・埼玉と続く。
円グラフを描画しているのは、(*1)の部分だ。これまで、plot.barと書いていたところを、plot.pieと書き換える。また、値にラベルを貼るには、引数にlabelsを与えるようにし、パーセンテージを示したいときは、引数autopctを指定する。
他にも、line/barh/hist/box/kde/area/scatter/hexbinなどのグラフを描画できる。詳しくは、Pandasのマニュアルを確認してみよう。
まとめ
前回に引き続き、都道府県の人口データCSVを利用して、いろいろなグラフを描いてみた。
いずれも、10行前後のプログラムなのに、知りたい部分をズバッと示す表やグラフを表示することができた。データ解析ライブラリのPandasを利用すると、簡単に行列演算が行えるのが大きいと感じる。
PandasとJupyterノートブックを使うことによって、より意味のあるグラフを描画できるので、本稿を参考に、データ分析や視覚化に挑戦してみて欲しい。
自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2004年度未踏ユース スーパークリエータ、2010年 OSS貢献者章受賞。技術書も多く執筆している。