はじめに
データサイエンスにおいて、データの可視化は非常に重要です。価値あるデータが揃っていても、それを正しく、わかりやすく可視化できなければ意味がありません。
可視化で使用するツールはたくさんありますが、今回は、searborn
ライブラリのpairplot
を利用した例を示します。 pairplot
を使用すると、単一変数の分布と2つの変数間の関係を同時に確認することができます。
データの準備
Gapminderの国別社会経済データを利用します。
csv_fileとして、GitHubに置いてます。=> gapminder.csv
Jupyter Notebookを開いて、pandasデータフレームとしてデータを読み込みます。
import numpy as np
import pandas as pd
# csvデータの読み出し
df = pd.read_csv('gapminder.csv')
# column名を編集
df.columns = ['country', 'continent', 'year', 'life_exp', 'pop', 'gdp_per_cap']
# 上位5行を表示
df.head()
データの説明
データの各行は1年間の1つの国の各種観測値を表しています。
2つのカテゴリ列(countryとcontinent)と、4つの数値列があります。
■ column名
1. country : 国名
2. continent : 大陸 (Asia, Europe,,,)
3. year : 1952年から2007年 (5年ステップ)
4. life_exp : 出生児平均寿命
5. pop : 人口
6. gdp_per_cap : 国民1人あたりの$ベースGDP
pairplot の作成
デフォルトの pairplot は数値列のみを使用するので、今回の場合だと、year, life_exp, pop, gdp_per_cap が使用されます。
# matplotlib と seaborn をインポート
import matplotlib
import seaborn as sns
# 出力されるグラフのフォントサイズをカスタマイズ
matplotlib.rcParams['font.size'] = 5
sns.set_context('talk', font_scale=0.9);
# pairplot図を出力
sns.pairplot(df, diag_kind='hist');
たった1行のコードで、上のグラフが得られます。
pairplot では、対角線上に単一変数の分布のヒストグラムを、それら以外の図は2つの変数間の関係を示した散布図を表示します。たとえば、2行目の一番左のプロットは、life_exp(平均寿命)とyear(年)の散布図を示しています。
このグラフからも、すでに考察することができます。
上から2行目の一番右のプロットから、平均余命と1人当たりのgdpは、正の相関関係にあることがわかります(高所得国の人々は長生きする傾向があると推察できる)。
また、同じ行の一番左のプロットから、世界中の平均寿命は年々伸びていることもわかります。
データ編集
上記の pairplot図では、popとgdpのグラフが大きく左に偏っています。
このような場合は、軸を対数表示にすることで、直感的なグラフにすることができます。
df['log_pop'] = np.log10(df['pop'])
df['log_gdp_per_cap'] = np.log10(df['gdp_per_cap'])
# 元の'pop'と'gdp_per_cap'列を削除
df = df.drop(columns = ['pop', 'gdp_per_cap'])
さらにグラフを色分けすることで、さらに深い考察へ向かいます。今回は各大陸ごとに色分けしてみると良さそうです。seaborn では、簡単に実行できます。
sns.pairplot(df, hue='continent', diag_kind='hist');
非常にわかりやすいグラフになってきました。
このグラフからは、オセアニアとヨーロッパの平均寿命が最も長く、アジアの人口が最も多いのがわかります。また、popとgdpを対数表示にしたことで、より比較が容易なグラフとなっています。
さらに手を加えていきます。
ヒストグラム図において、大陸ごとのデータが重なっていてわかりにくいので、密度プロット(KDE)を利用します。また、より視覚性を上げるために、点の透明度、サイズ、およびエッジカラー等のパラメータを追加します。
matplotlib.rcParams['font.size'] = 5
sns.set_context('talk', font_scale=1.2);
sns.pairplot(df, hue = 'continent', diag_kind = 'kde',
plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
height = 4);
対角線上の密度プロット(KDE)に変更することで、大陸間の分布比較がしやすくなりました。
最後に、2000年以降の年のみのデータをプロットしてみます。また、大陸ごとに色分けしますが、年はプロットしません。 プロットされる列を指定するためには、varsリストをパラメータとして渡します。
sns.pairplot(df[df['year'] >= 2000],
vars = ['life_exp', 'log_pop', 'log_gdp_per_cap'],
hue = 'continent', diag_kind = 'kde',
plot_kws = {'alpha': 0.6, 's': 80, 'edgecolor': 'k'},
height = 4);
非常にわかりやすくなりました。もしここからモデリングを進める場合、これらのプロットからどのモデルを使用すれば良いかが容易に判断できます。 たとえば、log_gdp_per_capはlife_expと正の相関があることがわかっているので、この関係を定量化するための線形モデルを作成していくことで考察を進めていくことができそうです。
まとめ
データ分析プロジェクトでは、多くの場合、価値の大部分は派手な機械学習ではなく、データの直接的な視覚化にあります。seaborn
ライブラリの pairplot
は、データセット内の分布と関係をすばやく調べるための強力なツールであることがわかりました。