Kaggleに挑戦:タイタニックの生存問題(データの準備)

AIプログラミング
スポンサーリンク

今回はタイタニックの生存問題でKaggleの挑戦に挑戦してみましょう。

タイタニックは、映画化にもなったタイタニック号の沈没に関する問題です。

当時の乗客のデータをもとに、どの乗客なら生存し、死亡したのかを予測します。

 

1.実装環境

python

Editer : spyder

2.タイタニックの生存予測

kaggleの中でも有名なコンペ課題として、タイタニックの生存予測があります。

kaggleの中でもチュートリアル的な問題となります。

 

この課題に取り組むにあたって、データの準備をする必要があります。

データはKaggleからタイタニックのcsvデータをダウンロードする必要があります。→ https://www.kaggle.com/c/titanic/data

使用するデータは、以下の2つです。

・test.csv

・train.csv

では次に予測に使用できるようにデータを少し加工していきましょう。

 

3.ソースコード詳細(データのインポート・加工)

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import os

まずは必要なライブラリをインポートしましょう。

pnadasはpythonにおいてデータ解析を支援する機能を提供するライブラリです。

特に数表及び時系列データを操作するためのデータ構造と演算を提供するライブラリです。

 

#csvデータのインポート
os.chdir('./Brog_code/taitanic')
train = pd.read_csv('C:/Users/Hayato/Brog_code/taitanic/train.csv') 
test =pd.read_csv('C:/Users/Hayato/Brog_code/taitanic/test.csv')

次にタイタニックのデータをインポートしましょう。

タイタニックのデータはkaggleにcsvファイルでアップされているので、そこからダウンロードしてください。

それをpandasを使用して、データフレーム型で読み込ませましょう。

 

#データの確認(データ)
train.head()
test.head()
#データの確認(データサイズ)
print(train.shape)
print(test.shape)
#データの確認(統計量)
train.describe()
test.describe()

pandasの機能で、pandas.head()でデータフレームの先頭から任意の数を表示させることができます。

例えば、pandas.head(2)であったら、先頭から2行を表示させます。pandas.head()であったら、5行目まで表示されます。

trainとtestのデータは以下の通りです。

 

 

pandasの便利な機能は、pandas.describe()を使用すると、各列ごとに平均や標準偏差、最大値、最小値、最頻値などの統計量を表示させることができます。

 

#train data
#データセットの前処理:使用しないデータの削除(PassengerId/Name/ticket/cabin)
train = train.drop(["PassengerId","Name","Ticket","Cabin"],axis=1)

#データセットの前処理:欠損値の補完
train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")

#データセットの前処理:文字列を数値に置換
train["Sex"][train["Sex"] == "male"] = 0
train["Sex"][train["Sex"] == "female"] = 1
train["Embarked"][train["Embarked"] == "S"] = 0
train["Embarked"][train["Embarked"] == "C"] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2

train.head()

今回は、データフレームの項目にあるPassengerId・Name・ticket・cabinのデータは予測に必要ないので削除します。

pandas.drop():行・列を指定して削除することができる。axis=0は行の指定。axis=1は列の指定。

データをよく見ると、”Age”と”Embarked”は欠損値(NaN)があります。

そこで欠損値は平均値で穴埋めしていきます。

pandas.fillna():欠損値を他の値に置換する。値の設定は以下の種類がある。

pandas.fillna(数値)→かっこ内の数値に欠損値が置き換わる

pandas.fillna(.mean())→欠損値をデータフレームの平均値に置き換える

pandas.fillna(.median())→欠損値をデータフレームの中央値に置き換える ←今回はこちらを使用

pandas.fillna(.mode().iloc)→データフレームの平均値に置き換える

 

さらに、”male”、”female”は1と2に、”Embarked”のS・C・Qは0、1、2に変換して学習できる形にしましょう。

以下が変換した結果です。

 

#test data
test = test.drop(["PassengerId","Name","Ticket","Cabin"],axis=1)
test["Age"] = test["Age"].fillna(test["Age"].median())
test["Embarked"] = test["Embarked"].fillna("S")

#データセットの前処理:文字列を数値に置換
test["Sex"][test["Sex"] == "male"] = 0
test["Sex"][test["Sex"] == "female"] = 1
test["Embarked"][test["Embarked"] == "S"] = 0
test["Embarked"][test["Embarked"] == "C"] = 1
test["Embarked"][test["Embarked"] == "Q"] = 2

test.head()

では、同様にtest dataも変換していきましょう。説明は割愛します。

 

#関連度の高い項目をヒートマップで表示
plt.figure(figsize=(8,6))
sns.heatmap(train.corr(), annot=True, cmap='Blues')

最後に関連度が高いものをヒートマップで表示しましょう。

ヒートマップを作成する目的は、各項目でどの程度相関がみられるのか可視化するためです。

今回のタイタニックのデータを使用したときのヒートマップを以下に示しました。

どれも強い相関はみられませんね。

 

4.ソースコードまとめ(データのインポート・加工)

# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

#csvデータのインポート
train = pd.read_csv("./Brog_code/taitanic/titanic/train.csv") 
test =pd.read_csv("./Brog_code/taitanic/titanic/test.csv")

#データの確認(データ)
train.head()
test.head()
#データの確認(データサイズ)
print(train.shape)
print(test.shape)
#データの確認(統計量)
train.describe()
test.describe()

#train data
#データセットの前処理:使用しないデータの削除(PassengerId/Name/ticket/cabin)
train = train.drop(["PassengerId","Name","Ticket","Cabin"],axis=1)

#データセットの前処理:欠損値の補完
train["Age"] = train["Age"].fillna(train["Age"].median())
train["Embarked"] = train["Embarked"].fillna("S")

#データセットの前処理:文字列を数値に置換
train["Sex"][train["Sex"] == "male"] = 0
train["Sex"][train["Sex"] == "female"] = 1
train["Embarked"][train["Embarked"] == "S"] = 0
train["Embarked"][train["Embarked"] == "C"] = 1
train["Embarked"][train["Embarked"] == "Q"] = 2

train.head()

#test data
test = test.drop(["PassengerId","Name","Ticket","Cabin"],axis=1)
test["Age"] = test["Age"].fillna(test["Age"].median())
test["Embarked"] = test["Embarked"].fillna("S")

#データセットの前処理:文字列を数値に置換
test["Sex"][test["Sex"] == "male"] = 0
test["Sex"][test["Sex"] == "female"] = 1
test["Embarked"][test["Embarked"] == "S"] = 0
test["Embarked"][test["Embarked"] == "C"] = 1
test["Embarked"][test["Embarked"] == "Q"] = 2

test.head()


#関連度の高い項目をヒートマップで表示
plt.figure(figsize=(8,6))
sns.heatmap(train.corr(), annot=True, cmap='Blues')

 

5.おわりに

次回は実際に学習させ、kaggleに提出する方法までやってみましょう。

 

コメント

タイトルとURLをコピーしました