kaggleチャレンジ15日目 よく使われるデータの可視化方法をまとめてみた

シェアする

  • このエントリーをはてなブックマークに追加
スポンサーリンク

はじめに

今回はカーネルを調べて、kaggler達がどのように可視化しているのかを調べてみました。1回ではまとめきれないので、この記事を更新していくか、何回かに分けていきたいと思います。

kaggleではよく、EDA というワードを目にすると思います。これは、Explanatory Data Analysis(略してEDA)といい、日本語にすると、「探索的データ解析」と呼ばれる作業になります。データの特徴を探求し、構造を理解することを目的としたデータサイエンスの最初の一歩ですね。目的としては、データに触れ、データを可視化したり、データのパターンを探したり、特徴量やターゲット(目的変数)の関係性/相関性をを見つけるといったところでしょうか。

自分は、まだこれを何も見ずにできません。ほかの人がどのように可視化しているのかをカーネルで日々漁りながら真似をするのが現状です。なので、今回はよく使う可視化方法をまとめてみました。

Pythonの可視化ツール

今回は、カーネルでよく見る三つの可視化ツールを取り上げていきたいと思います。(ここでの可視化とはグラフ等のことを指します)

Matplotlib

Matplotlib は、機械学習では頻繁に登場する、最もユーザ数が多い可視化ツールです。多数の拡張ライブラリ、派生パッケージがあることから好まれている傾向にあります。また、MATLABの利用経験があるユーザが簡単に習得できるよう設計されています。

Seaborn

Matplotlib の機能をより美しくグラフを描画できるといわれている「Seaborn」。私もどちらかというと Seaborn の描画の方が好きかもしれません。Matplotlib の機能を拡張したライブラリで統計データに特化しているといわれています。

Matplotlib seaborn と同じ見た目にしたいなら、styleをimportする方法があるらしい。

Plotly

Python以外にもさまざまな言語に対応している。(MATLAB、R、Julia、Scalaなど)
表現力が多彩で、Cufflinksを使うことでpandasのデータを簡単に可視化できる。
Dashboardsに他のユーザが作ったサンプルが山のようにある。

グラフ作成

この三つのツールを使って、グラフを作成していきたいと思います。今回扱うのは、散布図、棒グラフ、ヒートマップです。

データセット

今回は、こちらの記事で扱った、住宅の価格にまつわるデータを使っていきます。

はじめに  今回は、住宅の価格を色々な特徴量から予測していきたいと思います。今回もGoogleColaboratoryを使って...

ライブラリの準備

今回使うものを呼んでおきます。

!pip install plotly cufflinks==0.11.0

import numpy as np 
import pandas as pd
import matplotlib.pyplot as plt 
%matplotlib inline
import seaborn as sns
color = sns.color_palette()
import plotly
import plotly.graph_objs as go
from plotly.graph_objs import *import plotly.graph_objs as go

散布図

Matplotlib

matplotlib.pyplot.scatterの使い方

matplotlib.pyplot.scatter(x, y, s=20, c=None, marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=None, edgecolors=None, hold=None, data=None, **kwargs)

パラメータ:

x, y グラフに出力するデータ
s サイズ (デフォルト値: 20)
c 色、または、連続した色の値
marker マーカーの形 (デフォルト値: ‘o’= 円)。形の種類はこちら
cmap カラーマップ。c が float 型の場合のみ利用可能です。
norm c を float 型の配列を指定した場合のみ有効。正規化を行う場合の Normalize インスタンスを指定。
vmin,vmax 正規化時の最大、最小値。 指定しない場合、データの最大・最小値となります。norm にインスタンスを指定した場合、vmin, vmax の指定は無視されます。
alpha 透明度。0(透明)~1(不透明)の間の数値を指定。
linewidths 線の太さ。
edgecolors マーカーの線の色。

Code:

fig, ax = plt.subplots()
ax.scatter(x = train['GrLivArea'], y = train['SalePrice'])
plt.ylabel('SalePrice', fontsize=13)
plt.xlabel('GrLivArea', fontsize=13)
plt.show()

Seaborn

seaborn.jointplotの使い方

seaborn.jointplot(x, y, data=None, kind='scatter', stat_func=<function pearsonr>,
         color=None, size=6, ratio=5, space=0.2, dropna=True, xlim=None, 
        ylim=None, joint_kws=None, marginal_kws=None, annot_kws=None,
         **kwargs)

パラメータ:

x, y データをベクトルで指定、または、データセットの列名を文字列で指定。
data 描画に用いるデータフレーム。出力対象の列名は上記 x と y で指定します。
kind プロットの種類。以下から指定する。
"scatter" : 散布図
"reg": 散布図と回帰直線
"resid": y 軸に回帰直線からの残差 (誤差) を出力する
"kde": カーネル密度推定を用いた等高線風の図
"hex": 六角形のヒートマップ
stat_func 散布図の右上に表示する統計量を計算する関数。入力パラメータは、(x, y) の 2 値であり、出力は (統計量, p 値) で構成される必要があります。
color 各要素をプロットする際に用いる matplotlib の色名を指定。
size 図のサイズを数値で指定。
ratio : numeric, optional Ratio of joint axes size to marginal axes height.
space 散布図と散布図の外側に出力するヒストグラムの間の空きスペースの大きさを数値で指定する。
dropna True に設定すると、欠損値を乗り除きます。
xlim, ylim x軸、y軸の下限、上限をタプル (下限, 条件) で指定。
joint_kws, marginal_kws, annot_kws プロットに用いる各種オプションをディクショナリで指定。

Code:

sns.jointplot(x= 'GrLivArea', y= 'SalePrice', data=train);
sns.plt.show()

Plotly

Plotlyを使った作図手順は次のようになっています。

  1. traceを作成する.
  2. layoutを定義する.
  3. iplot, もしくはplotで作図.

私からすると一つ一つしっかりしていてわかりやすいです。

Plotlyに関しては、他のユーザが作ったサンプルが多く公開されているので、自分の気に入ったものを選んで使うのがよさそう。Plotlyの公式の散布図サンプルのページ

次の関数を定義しないとエラー吐かなくてもGoogleColaboratory上で表示されなかった。

Code:

def configure_plotly_browser_state():
 import IPython display(IPython.core.display.HTML(''' <script src="/static/components/requirejs/require.js">
 </script>
 <script>
 requirejs.config({ paths: { base: '/static/base', plotly: 'https://cdn.plot.ly/plotly-latest.min.js?noext', }, });
 </script>
 '''))

GoogleColaboratory上で動かしたい場合はこの関数を定義してあげて、plotlyで出力させてあげたいセル毎この関数を呼ぶ。(めんどくさくない?)

自分の環境だけなのか、他の方法があったら教えてください。

plotly.offline.init_notebook_mode(connected=True) 
configure_plotly_browser_state() 
trace = go.Scatter(
     x = np.array(train['GrLivArea'].values),
     y = np.array(train['SalePrice'].values),
     name = "price",     mode = "markers",
     marker = dict(size=10, color="rgba(0, 0, 255, 0.5)")) 
layout = Layout(
     title = 'タイトル',
     xaxis = dict(
         title = 'GrLivArea',
     ),
     yaxis = dict(
         title = 'SalePrice',
     ) ) 
data = [trace] 
fig = go.Figure(data = data, layout = layout) 
plotly.offline.iplot(fig)

棒グラフ

今度は欠損値の割合を棒グラフで出力させていきたいと思います。

ntrain = train.shape[0] 
ntest = test.shape[0] 
y_train = train.SalePrice.values 
all_data = pd.concat((train, test)).reset_index(drop=True) 
all_data.drop(['SalePrice'], axis=1, inplace=True) 
print("all_data size is : {}".format(all_data.shape)) 
all_data_na = (all_data.isnull().sum() / len(all_data)) * 100 
all_data_na = all_data_na.drop(all_data_na[all_data_na == 0].index).sort_values(ascending=False)[:30] 
missing_data = pd.DataFrame({'Missing Ratio' :all_data_na}) 
missing_data.head(20)

Matplotlib

matplotlib.pyplot.bar

matplotlib.pyplot.bar(left, height, width=0.8, bottom=None, hold=None,data=None, **kwargs)

パラメータ:

left (必須) 各棒の X 軸上の数値
height (必須) 各棒の高さ
width 棒の太さ (デフォルト値: 0.8)
bottom 各棒の下側の余白。
color 棒の色。
edgecolor 棒の枠線の色。
linewidth 棒の枠線の太さ。
tick_label 透棒の枠線の太さ。
xerr X 軸方向の誤差範囲 を出力する場合、数値または配列を指定。
yerr Y 軸方向の誤差範囲 を出力する場合、数値または配列を指定。
ecolor エラーバーの色を値または配列で指定。
capsize エラーバーの傘のサイズを指定。
align  棒の位置。’edge’ (垂直方向の場合:左端, 水平方向の場合:下端) または ‘center’ (中央)
log True に設定すると、対数目盛で出力します。 (デフォルト値: False)
yerr Y 軸方向の誤差範囲 を出力する場合、数値または配列を指定。

Code:

f, ax = plt.subplots(figsize=(15, 12)) 
plt.xticks(rotation='90') 
plt.bar(all_data_na.index, all_data_na) 
plt.xlabel('Features', fontsize=15) 
plt.ylabel('Percent of missing values', fontsize=15) 
plt.title('Percent missing data by feature', fontsize=15)

Seaborn

seaborn.barplot の使い方

seaborn.barplot(x=None, y=None, hue=None, data=None, order=None, hue_order=None,
                estimator=<function mean>, ci=95, n_boot=1000, units=None,
                orient=None, color=None, palette=None, saturation=0.75,
                errcolor='.26', errwidth=None, capsize=None, ax=None, **kwargs)saturation=0.75, ax=None, **kwargs)

パラメータ:

x, y 集計対象の列名。x に指定した場合縦方向に、y に指定した場合横方向にグラフを描画します。
hue 各軸をさらに分割して集計する場合に利用する列名を指定。
data 集計対象のデータフレーム。
order 出力する順番を文字列のリストで指定。
hue_order 上記 hue で指定した列を出力する順番を文字列のリストで指定。
estimator (デフォルト値: )
ci 信頼区間の幅。None を指定すると、ブートストラップを行わず、エラーバーも出力しません。 (デフォルト値: 95)
n_boot 信頼区間を求めるために行うブートストラップの繰り返し回数。 (デフォルト値: 1000)
units マルチレベルでブートストラップを行う際にサンプリング単位。data で指定したデータフレームの列名または、配列で指定。 (デフォルト値: None)
orient グラフの向きを指定。”v”(vertical, 垂直) または、”h” (horizontal, 水平) のいずれかを指定。
color 各列の色をリストまたはパレットで指定。
palette 上記 hue で指定した列の色リストまたはパレットで指定。 (デフォルト値: None)
saturation 色の彩度。1 に近いほど原色に近く、0 に近いほど白・黒に近い色合いで出力。 (デフォルト値: 0.75)
errcolor 信頼区間を示すバーの色。/td>
errwidth 信頼区間を示すバーの幅
capsize 信頼区間を示すバーの終端の線(キャップ)のサイズ
ax 軸を重ねて出力する場合に指定。

Code:

f, ax = plt.subplots(figsize=(15, 12)) 
plt.xticks(rotation='90') 
sns.barplot(x=all_data_na.index, y=all_data_na) 
plt.xlabel('Features', fontsize=15) 
plt.ylabel('Percent of missing values', fontsize=15) 
plt.title('Percent missing data by feature', fontsize=15)

Plotly

Plotlyの公式の棒グラフのサンプルのページ

Plotlyで棒グラフを描くときは、traceにgo.Barを使い、あとはx軸とy軸の数値を入れてあげるだけでほとんど変わりません。レイアウトや表示にこだわりたい方はDashboardを参考にしてください。

Code:

configure_plotly_browser_state() 
trace = go.Bar( 
 x = all_data_na.index, 
 y = all_data_na,
 marker = dict(color="rgba(0, 0, 255, 0.7)")) #markerでstyleを変更できる 
layout = go.Layout( title = "Percent missing data by feature",
 xaxis = dict(title="Features"),
 yaxis = dict(title="Percent of missing values", )) 
data = [trace] 
fig = dict(data=data, layout=layout) 
plotly.offline.iplot(fig, filename='sample-bar-digits', image="png")

ヒートマップ

Seaborn

seaborn.heatmap の使い方

seaborn.heatmap(data, vmin=None, vmax=None, cmap=None, center=None, robust=False,
annot=None, fmt='.2g', annot_kws=None, linewidths=0,
linecolor='white', cbar=True, cbar_kws=None, cbar_ax=None,
square=False, ax=None, xticklabels=True, yticklabels=True,
mask=None, **kwargs)

パラメータ:

data ndarray 形式に変換可能な 2 次元のデータセット指定。Pandas のデータフレームを指定した場合、列名とインデックスが使われます。
vmin, vmax カラーマップと値の範囲を関連付ける必要がある際に最小値、最大値を指定します。指定しない場合、データや他の引数から推測されます。発散的 (diverging) なデータセット (0 を起点として正負に広がるデータ) と推測された場合、これらの値は無視される場合があります。(デフォルト値: None)
cmap Matplotlib のカラーマップまたは、オブジェクトを指定。値の大小をどの色に変換する際に用います。指定のない場合、cubehelix カラーマップ (値が連続量の場合) もしくは、RdBu_r カラーマップ (発散的なデータの場合) が利用されます。参考: color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation (デフォルト値: None)
center colormap の 中心とする値。この値を指定すると、発散的なカラーマップを使うことを意味します。(デフォルト値: None)
robust True に設定し vmin と vmax が設定されていない場合、カラーマップが使う色とその値の範囲はロバストな推定を行い、極端に大きな値や小さい値の影響を受けないように計算されます。(デフォルト値: False)
annot True に設定すると、セルに値を出力します。行列などのデータセットを指定すると、任意の値を出力できます。(デフォルト値: None)
fmt annot=True に設定した場合、またはデータセットを指定した場合の出力フォーマットを文字列で指定します。(デフォルト値: ‘.2g’)
annot_kws annot=True に設定した場合、またはデータセットを指定した場合のオプションを Matplotlib のキーワードを設定します。参考:Text properties and layout — Matplotlib 2.0.2 documentation (デフォルト値: None)
linewidths 各セル間の線の太さを数値で指定。(デフォルト値: 0)
linecolor 各セル間の線の色。参考:matplotlib で指定可能な色の名前と一覧 (デフォルト値: ‘white’)
cbar True に設定すると、カラーバーを出力します。(デフォルト値: True)
cbar_kws カラーバーのオプションを Matplotlib のキーワードをで指定します。参考:colorbar — Matplotlib 2.0.2 documentation (デフォルト値: None)
cbar_ax カラーバーを出力する際の軸を Matplotlib の軸で指定します。(デフォルト値: None)
square True に設定すると、X 軸、Y 軸を正方形になるように調整し、軸を設定します。(デフォルト値: False)
ax 図を出力する際の軸を Matplotlib の軸で指定。(デフォルト値: None)
xticklabels True に設定すると、データフレームの列名を x 軸に出力します。False に設定すると、カラム名を出力しません。リストを指定すると、x 軸に任意のテキストを出力します。整数を指定すると、カラム名を出力しますが指定した数毎に出力します。(デフォルト値: True)
yticklabels True に設定すると、データフレームの列名を y 軸に出力します。False に設定すると、カラム名を出力しません。リストを指定すると、y 軸に任意のテキストを出力します。整数を指定すると、カラム名を出力しますが指定した数毎に出力します。(デフォルト値: True)
mask 値をマスクするセルを指定。True または False の 2 値で構成されるデータフレームまたは、行列で指定します。なお、欠損値は、自動的にマスクされます。(デフォルト値: None)
kwargs Matplotlib の ax.pcolormesh に渡すオプションをディクショナリ形式で指定。(デフォルト値: None)

Code:

corrmat = train.corr() 
filteredCorrMat_features = corrmat.index[abs(corrmat['SalePrice'])>=0.5] 
plt.figure(figsize=(12,12)) 
sns.heatmap(train[filteredCorrMat_features].corr(),annot=True,cmap='winter')

Plotly

Plotlyでヒートマップを作ろうとした時、調べたんですが詳しく書かれているものが少なく、自分なりに実装しました。その結果…、Seabornと表示が上下反対になってしまいました…。また直したいと思います。

やっていることは、ヒートマップを使うときは、go.Heatmapを使い、データをリストにしてzに渡してあげる必要があります。なので、今回は、pandas.DataFrameオブジェクトからcorr()メソッドで各列の間の相関係数をだし、.valuesでNumPy配列を取得し、tolist()でリストに変換してzに渡しています。

そして、インデックスとカラムをそれぞれxとyに入れてあげているという形になっています。

Code:

configure_plotly_browser_state() 
filteredCorrMat_features = corrmat.index[abs(corrmat['SalePrice'])>=0.5] 
trace= go.Heatmap(
 z=train[filteredCorrMat_features].corr().values.tolist(), colorscale='Viridis',
 x =train[filteredCorrMat_features].corr().columns, 
 y =train[filteredCorrMat_features].corr().index )
data = [trace]
fig = dict(data=data) 
plotly.offline.iplot(fig, filename='sample-heatmap', image="png")

いかがだったでしょうか。今回は、よく使う散布図、棒グラフ、ヒートマップをそれぞれのツールで実装したものをまとめてみました。次回も同じようにそれぞれで実装したものをまとめたいと思います。

最後まで読んでいただきありがとうございました。よろしければこの記事をシェアしていただけると励みになります。よろしくお願いします

スポンサーリンク
レクタングル広告(大)
レクタングル広告(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
レクタングル広告(大)