Simple Data Visualization

データの理解のための簡潔な可視化

データ解析を行う際にデータを理解することは非常に重要な要素の一つになります。モデル選択の際に役に立つ情報になることはもちろん、モデルに入力する説明変数を選択するときも重要なfactorになるはずです。
様々な可視化やデータの理解のための手法が存在しますが、このチュートリアルでは、説明変数と欠損値に対する理解を主としており、データ分析の前段階として説明変数の特徴を考慮したデータの加工を目的としています。

Required libraries

このチュートリアルでは以下のライブラリが必要になります。

  • numpy 1.12.1
  • matplotlib 2.0.2
  • pandas 0.20.3
  • seaborn 0.8.1
In [1]:
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

Load dataset

今回使用するデータはタイタニックの生存データセットを用います。次のURLからダウンロードすることができます。 http://docs.renom.jp/downloads/train.csv .

In [2]:
train = pd.read_csv("train.csv")
train.head()
Out[2]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S
  • PassengerId - unique ID for each passenger
  • Survived - 0=death 1=survived
  • Pclass - Ticket class(1=rich, 2=middle, 3=low)
  • Name
  • Sex
  • Age
  • SibSp - siblings and spouses riding together
  • Parch - parents and children riding together
  • Ticket - ticket number
  • Fare
  • Cabin
  • Embarked - where they embarked

それぞれの説明変数の特徴については良い影響を与えるもの、そうでないものが存在します。タイタニックのように史実からどんなデータが予測に対して好影響を与えるかどうかある程度知られているものはこのように一つずつデータを見ていくことである程度入力するデータを絞り込むことができます。

In [3]:
train.describe()
Out[3]:
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
In [4]:
sns.countplot("Sex",data=train)
Out[4]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc22f071198>
../../../_images/notebooks_visualization_simple_visualize_notebook_7_1.png
In [5]:
sns.countplot("Embarked", data=train)
Out[5]:
<matplotlib.axes._subplots.AxesSubplot at 0x7fc22f087240>
../../../_images/notebooks_visualization_simple_visualize_notebook_8_1.png

Histogram of each variable

ヒストグラムは単純なプロットですが、重要な意味を持ちます。例えばEmbarkedの列のように欠損が起こっているときに一番シンプルな対策方法は一番頻出しているSという値で補間を行ってしまうことです。数値と違って平均値代入などができないために、数に偏りのある変数の場合はこのように再頻出の値で補間してしまうことが消去する以外の最も単純な対策になります。

In [6]:
def kesson_table(df):
    null_val = df.isnull().sum()
    percent = 100 * df.isnull().sum()/len(df)
    kesson_table = pd.concat([null_val, percent], axis=1)
    kesson_table_ren_columns = kesson_table.rename(columns={0:"欠損数", 1:"%"})
    return kesson_table_ren_columns
kesson_table(train)
Out[6]:
欠損数 %
PassengerId 0 0.000000
Survived 0 0.000000
Pclass 0 0.000000
Name 0 0.000000
Sex 0 0.000000
Age 177 19.865320
SibSp 0 0.000000
Parch 0 0.000000
Ticket 0 0.000000
Fare 0 0.000000
Cabin 687 77.104377
Embarked 2 0.224467

Missing Values rate

他のチュートリアルでも述べさせていただいたように欠損値の処理は予測精度の高いモデルを作成する際にとても重要になってくると思います。欠損値の種類にもいくつかの種類があり、欠損値に対する処理についてもいくつかの処理があります。例えば欠損値の種類については欠損していない他の変数との依存関係などによって補間の方法は異なりますし、対処としても欠損しているデータを削除してはいけないケースも存在します。更には欠損率について見ていくことでその変数を使用するかどうかの指標として考えることもできます。

In [7]:
train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")
kesson_table(train)
Out[7]:
欠損数 %
PassengerId 0 0.000000
Survived 0 0.000000
Pclass 0 0.000000
Name 0 0.000000
Sex 0 0.000000
Age 0 0.000000
SibSp 0 0.000000
Parch 0 0.000000
Ticket 0 0.000000
Fare 0 0.000000
Cabin 687 77.104377
Embarked 0 0.000000
In [8]:
train.loc[train["Sex"]=="male","Sex"] = 0
train.loc[train["Sex"]=="female","Sex"] = 1
train.loc[train["Embarked"]=="S", "Embarked"] = 0
train.loc[train["Embarked"]=="C", "Embarked"] = 1
train.loc[train["Embarked"]=="Q", "Embarked"] = 2
train.head(5)
Out[8]:
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris 0 22.0 1 0 A/5 21171 7.2500 NaN 0
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 1 38.0 1 0 PC 17599 71.2833 C85 1
2 3 1 3 Heikkinen, Miss. Laina 1 26.0 0 0 STON/O2. 3101282 7.9250 NaN 0
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) 1 35.0 1 0 113803 53.1000 C123 0
4 5 0 3 Allen, Mr. William Henry 0 35.0 0 0 373450 8.0500 NaN 0
In [9]:
plt.rcParams["figure.figsize"] = (13.0, 13.0)
train_numeric = train.loc[:, ["PassengerId", "Survived", "Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]]
train_numeric.head(5)
feature_names = train_numeric.columns
correlation_matrix = np.corrcoef(train_numeric.values.astype(np.float).transpose())
sns.heatmap(correlation_matrix, annot=True,
            xticklabels=feature_names,
            yticklabels=feature_names,
            cmap="Reds")
plt.show()
../../../_images/notebooks_visualization_simple_visualize_notebook_14_0.png

Relationship of each explanation variables

説明変数同士の関連や目的変数との関連はもちろん予測モデルを考えることやモデルに入力する説明変数を選択する際の重要な指標の一つになります。例えば今回扱うことのできる問題として、特定のデータに偏った分類モデルが作成されてしまう場合があります。例えば相関関係の強い変数が複数含まれており、それらの変数の値が大きいとその変数ばかりを重視したような予測を行ってしまう場合が多重共線性として知られており、その場合の対処方法として説明変数同士の相関を見て高すぎる相関を持つ説明変数に関してはどちらかの説明変数はモデルに入力しない方がいいときも存在します。このようなヒートマップは説明変数同士の相関を見て、どのようにfeature engineeringをするかという問題に対して、一つのヒントになります。このチュートリアルでは主に説明変数同士の関連や説明変数の一つずつの特徴について見ていきましたが、データの理解の方法は多岐に渡っており、他のチュートリアルで他の様々な可視化についても紹介していきます.