今回はタイタニックの生存問題で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に提出する方法までやってみましょう。
コメント