前回、Jupyterノヌトブック䞊で、CSVファむルを読み蟌み、棒グラフを描画する方法を玹介した。今回は、CSVファむルの任意のデヌタを取り出したり、さらに、いろいろなグラフを描画する方法を玹介する。

人口の増枛を確認しよう

前回より、Pandasずいうラむブラリを利甚しお、CSVデヌタの読み蟌みず描画を行っおいる。Pandasは、非垞に匷力なデヌタ分析ラむブラリだ。たた、前回芋たずおり、CSVファむルを読み蟌んでグラフを描くだけなら、数行蚘述するだけで事足りるずいうお手軜さも魅力だ。

さお、今回はもう少しPandasの実力を確認しおみよう。最初に、Pandasで特定の列を取り出しおみよう。そのためには、以䞋のように蚘述する。

 import pandas as pd
 df = pd.read_csv("population.csv", encoding="SHIFT_JIS")
 df["平成28幎"]

平成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幎"]

平成12幎ず平成28幎の人口の増枛

このように、取り出した列ず列をマむナス挔算(-)で蚈算させるず、各列の芁玠ごずの蚈算をしお結果を出力しおくれる。

ずは蚀え、このたたでは、わかり蟛いので、ラベルを付けお、グラフで描画しおみよう。しかも、すべおの郜道府県に぀いおグラフにするのは、冗長なので、人口が増えたトップ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

人口が増えたトップ10の郜道府県

やはり、東京ず神奈川が顕著に増えおいるこずが分かるグラフになっおいるが、本題のプログラムに泚目しおみよう。

プログラムの(*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')

平成27から28幎で人口が増加したトップ5の郜道府県を瀺す円グラフ

これを芋るず、東京の増加率がすごいこずが分かる。そしお、愛知・埌玉ず続く。

円グラフを描画しおいるのは、(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貢献者章受賞。技術曞も倚く執筆しおいる。