Kaggleへの参加 (2)


今回は、第二回の「データの理解」になります。その時に用いる一般的な手法をまとめてみました。
開発環境はdockerで構築しましたが、その際の情報などは第一回のKaggleへの登録と結果の提出をご参照ください。

全体

第一回  Kaggleへ登録と結果の提出
第二回  データの理解(EDA)
第三回  評価指標と評価方法
第四回  データの前処理
第五回  モデル構築
第六回  ハイパーパラメタのチューニング

データの理解

データをダウンロードしたらまずやることは、dataの内容を理解するためのEDA(Explatory Data Analysis)になります。EDAの目的としては①データのサイズを把握する②予測する変数の特徴を理解し、識別/回帰/ランキングなど問題の種類を把握する③特徴量の性質を理解するなどがあります。ここでは、EDAで一般的に行われる操作をまとめます。

データサイズの取得

In[]
import numpy as np
import pandas as pd
import os
import matplotlib.pyplot as plt 
plt.style.use('ggplot')

train_data = pd.read_csv('./download/train.csv')
test_data = pd.read_csv('./download/test.csv')
print('train shape:', train_data.shape, 'test shape:', test_data.shape)
Out[]
train shape: (891, 12) test shape: (418, 11)

head : データの内容の把握

In[]
train_data.head(5)

tolist : カラムの種類の取得

In[]
print(train_data.columns.tolist())
print(train_data.keys())
Out[]
['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked']
Index(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
       'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'],
      dtype='object')

type : データのタイプ

In[]
type(train_data), type(train_data.PassengerId), type(train_data.Sex.values)
Out[]
(pandas.core.frame.DataFrame, pandas.core.series.Series, numpy.ndarray)

info : データの情報

In[]
train_data.info()
Out[]
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB

value_counts : カラムの値の個数

In[]
train_data.Pclass.value_counts()
Out[]
3    491
1    216
2    184
Name: Pclass, dtype: int64

unique : ユニークな値の一覧

In[]
train_data.Cabin.unique()
Out[]
array([nan, 'C85', 'C123', 'E46', 'G6', 'C103', 'D56', 'A6',
       'C23 C25 C27', 'B78', 'D33', 'B30', 'C52', 'B28', 'C83', 'F33',
       'F G73', 'E31', 'A5', 'D10 D12', 'D26', 'C110', 'B58 B60', 'E101',
       'F E69', 'D47', 'B86', 'F2', 'C2', 'E33', 'B19', 'A7', 'C49', 'F4',
       'A32', 'B4', 'B80', 'A31', 'D36', 'D15', 'C93', 'C78', 'D35',
       'C87', 'B77', 'E67', 'B94', 'C125', 'C99', 'C118', 'D7', 'A19',
       'B49', 'D', 'C22 C26', 'C106', 'C65', 'E36', 'C54',
       'B57 B59 B63 B66', 'C7', 'E34', 'C32', 'B18', 'C124', 'C91', 'E40',
       'T', 'C128', 'D37', 'B35', 'E50', 'C82', 'B96 B98', 'E10', 'E44',
       'A34', 'C104', 'C111', 'C92', 'E38', 'D21', 'E12', 'E63', 'A14',
       'B37', 'C30', 'D20', 'B79', 'E25', 'D46', 'B73', 'C95', 'B38',
       'B39', 'B22', 'C86', 'C70', 'A16', 'C101', 'C68', 'A10', 'E68',
       'B41', 'A20', 'D19', 'D50', 'D9', 'A23', 'B50', 'A26', 'D48',
       'E58', 'C126', 'B71', 'B51 B53 B55', 'D49', 'B5', 'B20', 'F G63',
       'C62 C64', 'E24', 'C90', 'C45', 'E8', 'B101', 'D45', 'C46', 'D30',
       'E121', 'D11', 'E77', 'F38', 'B3', 'D6', 'B82 B84', 'D17', 'A36',
       'B102', 'B69', 'E49', 'C47', 'D28', 'E17', 'A24', 'C50', 'B42',
       'C148'], dtype=object)

describe : データの要約統計量を取得 (describeの使い方)

In[]
train_data.describe()

drop : 不要なカラムの削除

train_data2 = train_data.drop(['Age'], axis=1)
train_data2.head()

sortby: データのソート

In[]
train_data.sort_values('Age',axis=0, ascending=False)[0:5]

isnull():欠損値の有無

train_data.isnull().any()
PassengerId    False
Survived       False
Pclass         False
Name           False
Sex            False
Age             True
SibSp          False
Parch          False
Ticket         False
Fare           False
Cabin           True
Embarked        True
dtype: bool

groupby : 値による統合(groupbyの使い方)

客室のクラスと性別によって生存率にどの程度の違いがあったのか

In[]
survived_ratio = train_data.groupby(['Pclass', 'Sex'], as_index=False)['Survived'].mean()
survived_ratio

In[]
fig = plt.figure(figsize=(7, 5))
plt.bar(survived_ratio.index, survived_ratio.Survived, width=0.5, alpha=0.8)
plt.xlabel('index')
plt.ylabel('survived ratio')
plt.title('survived ratio across Pclass and Sex')
plt.show()

scatter plot : 年齢と船賃の関係

In[]
plt.scatter(x=train_data['Age'], y=train_data['Fare'], alpha=0.5)
plt.xlabel('Age')
plt.ylabel('Fare')
plt.title('Fare vs Age')
plt.show()

参考にさせていただいた記事

1.pandasのdescribeで各列の要約統計量を取得
2.Pandas の groupby の使い方
3.探索的データ解析(EDA)の基礎操作をPythonを使ってやってみよう
4.House Prices: EDA to ML (Beginner)
5.Supervised Learning with scikit-learn
6.Winning a Kaggle Competition in Python