pyhaya’s diary

プログラミング、特にPythonについての記事を書きます。Djangoや機械学習などホットな話題をわかりやすく説明していきたいと思います。

Kaggleのデータセットで遊んでみた 1 データの可視化

Kaggleとは、機械学習とデータサイエンスのプラットフォームのことです。このサイトでは、様々なデータを使って自分で分析を行うことができたり、データ解析のコンペティションに参加して精度を競い合ったりすることができます。

今回はKaggleの中で最初に出会うであろうTaitanicのデータセットを使ってデータ解析作業の大枠を紹介しているカーネルを紹介したいと思います。下のサイトを参考にしています。すごく良いカーネルなのでぜひ読んでみてください!
A Comprehensive ML Workflow with Python | Kaggle

作業環境

Kaggleのノートブック環境を利用しても、自分のJupyter Notebook環境を使っても構いません。構成の詳細は下のようになっています。

from sklearn.cross_validation import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
import matplotlib.pylab as pylab
import matplotlib.pyplot as plt
from pandas import get_dummies
import matplotlib as mpl
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib
import warnings
import sklearn
import scipy
import numpy
import json
import sys
import csv
import os

print('matplotlib: {}'.format(matplotlib.__version__))
print('sklearn: {}'.format(sklearn.__version__))
print('scipy: {}'.format(scipy.__version__))
print('seaborn: {}'.format(sns.__version__))
print('pandas: {}'.format(pd.__version__))
print('numpy: {}'.format(np.__version__))
print('Python: {}'.format(sys.version))

# 以下出力
"""
/opt/conda/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.
  "This module will be removed in 0.20.", DeprecationWarning)
matplotlib: 2.2.3
sklearn: 0.19.1
scipy: 1.1.0
seaborn: 0.9.0
pandas: 0.23.4
numpy: 1.15.2
Python: 3.6.6 |Anaconda, Inc.| (default, Oct  9 2018, 12:34:16) 
[GCC 7.3.0]
"""

基本設定

この後、様々な処理をしていくにあたって、プロットについて基本的な設定をしておきます。

sns.set(style='white', context='notebook', palette='deep')
pylab.rcParams['figure.figsize'] = 12,8
warnings.filterwarnings('ignore')
mpl.style.use('ggplot')
sns.set_style('white')
%matplotlib inline

ここら辺のスタイルは各自の好みで変えてよいと思います。

データを見てみる

散布図

train = pd.read_csv('../input/train.csv')
test = pd.read_csv('../input/test.csv')

train_columns
#以下出力
"""
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')
"""

このデータには「PassengerId」など12個のカラムがあります。今回予測するのは'Survived'つまりタイタニック事故で特定の人が生き残るか死ぬかを予測することになります。そのため、データの分析は基本的には'Survived'とほかの変数の間の関係を見ていくことになります。

試しに、Pclass(客の経済的な豊かさ、1が最も裕福)、年齢、乗船料とSurviveの関係を見てみます。

g = sns.FacetGrid(train, hue="Survived", col="Pclass", margin_titles=True,
                  palette={1:"seagreen", 0:"gray"})
g=g.map(plt.scatter, "Fare", "Age",edgecolor="w").add_legend();

下のようなグラフが表示されます。
f:id:pyhaya:20181115231859p:plain
生存者と死者の間に明確な違いは見受けられません。

コードの説明

1行目のsns.FaceGridではtrainからデータをとってきてプロットをすることを示し、colに指定されたPclassごとにグラフを用意することを宣言しています。なので今回はPclassが1,2,3の3つのグラフが描画されます。hueはSurviveの値で区別してプロットすることを意味しています。Surviveには生存(1)と死亡(0)の2種類がありますが、それぞれを何色でプロットするかはpaletteで指定されています。

実際のグラフ描画はg.mapで行われています。

コード 動作
plt.scatter 散布図スタイルでプロットする
"Fare" 横軸はFare(乗船料)
"Age" 縦軸はAge(年齢)
edgecolor ドットの淵は白(white)
add.legend() 凡例を入れる

Boxプロット(箱ひげ図)

各変数がどのような値の範囲をとるのか図示します。

train.plot(kind='box', subplots=True, layout=(2,4), sharex=False, sharey=False)
plt.subplots_adjust(wspace=0.5, hspace=0.6)

f:id:pyhaya:20181115233910p:plain

箱ひげ図の見方についてはWidipediaを見てください。

コードの説明
コード 動作
train.plot Pandasライブラリの機能でプロットする
kind='box' プロットの種類は箱ひげ図
subplots=True グラフをサブプロットに分ける
layout=(2, 4) 2行4列にサブプロットを配置する
sharex=False, sharey=False x, y軸の値の範囲を共有しない
plt.subplots_adjust(wspace=0.5, hspace=0.6) グラフ同士の幅、高さの間隔調整

ヒストグラム

ヒストグラムは、各変数値にどのくらいのデータがあるのか知るのに便利です。

train.hist(figsize=(15, 20))
plt.show()

f:id:pyhaya:20181115235614p:plainf:id:pyhaya:20181115235618p:plainf:id:pyhaya:20181115235611p:plain