KaggleのTitanicでデータ分析を学びます。
私は最近Kaggleを始めた初心者です。
研究でPythonやRを使っておりデータ分析のスキルに少し自信があったのですが、Kaggleを始めてから、私のデータ分析スキルが微々たるものであることを痛感しました。
そこで、KaggleのTitanicでデータ分析を学び、データ分析スキルを上げようと思います。
この記事では、Titanicコンペのコードを書き、学んだことを書いていきます。
ライブラリの読み込み
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
データの読み込み
pandas.dataframeを用いて、学習データ、テストデータ、提出データをデータフレームとして代入します。
train = pd.read_csv("/kaggle/input/titanic/train.csv")
test = pd.read_csv("/kaggle/input/titanic/test.csv")
gender_submission = pd.read_csv("/kaggle/input/titanic/gender_submission.csv")
データの可視化
Survivedの可視化
seaborn.countplotを用います。
sns.countplot(x="Survived", data=train)
plt.show()
Survivedは、0がNo、1がYesです。
0のほうが多いことがわかります。
つまり、生存率は50%より低いことがわかります。
Survived、Pclass、Age、SibSp、Parch、Fareの関係の可視化
seaborn.pairplotを用います。
sns.pairplot(train[["Survived", "Pclass", "Age", "SibSp", "Parch", "Fare"]])
plt.show()
この図からは情報を読み取れないため、パラメータのhueをSurvivedに指定します。
sns.pairplot(train[["Survived", "Pclass", "Age", "SibSp", "Parch", "Fare"]], hue="Survived")
plt.show()
この図から、Pclassが3だと生存率が低く、Ageが低いと生存率が高いことがわかります。
SurvivedとSexの可視化
seaborn.catplotを用います。
g = sns.catplot(x="Sex",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()
femaleのほうが生存率が高いことがわかります。
次に、seaborn.countplotを用います。
sns.countplot(x="Sex", hue="Survived", data=train)
plt.show()
maleの0が多いことがわかります。
SurvivedとPclassの可視化
seaborn.catplotを用います。
g = sns.catplot(x="Pclass",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()
Pclassが小さいほど生存率が高いことがわかります。
Survived、Pclass、Sexの関係の可視化
seaborn.catplotを用います。
g = sns.catplot(x="Pclass",y="Survived", data=train, kind="bar")
g = g.set_ylabels("survival rate")
plt.show()
Pclassが1、2のfemaleは、生存率が1に近いことがわかります。
データ前処理
trainとtestの連結
pandas.concatを用いて、データフレームを結合します。
data = pd.concat([train, test], sort=False)
欠損値の確認
pandas.isnull、pandas.DataFrame.sumを用いて、欠損値をカウントします。
data.isnull().sum()
Sex
ラベルエンコーディングにはsklearn.preprocessing.LabelEncoderを用います。
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
data['Sex'] = le.fit_transform(data['Sex'])
data.head()
femaleが0、maleが1となりました。
Embarked
pandas.DataFrame.fillnaを用いて欠損値をSで置換した後、ラベルエンコーディングを行います。
data['Embarked'].fillna(('S'), inplace=True)
data['Embarked'] = le.fit_transform(data['Embarked'])
data.head()
Cが0、Qが1、Sが2となりました。
Fare
欠損値を平均値で置換します。
data['Fare'].fillna(np.mean(data['Fare']), inplace=True)
Age
欠損値を中央値で置換します。
data['Age'].fillna(data['Age'].median(), inplace=True)
Name、PassengerId、Ticket、Cabinの削除
データ分析に用いない列、Name、PassengerId、Ticket、Cabinを削除します。
delete_columns = ['Name', 'PassengerId', 'Ticket', 'Cabin']
data.drop(delete_columns, axis=1, inplace=True)
学習データとテストデータの抽出
train = data[:len(train)]
test = data[len(train):]
y_train = train['Survived']
X_train = train.drop('Survived', axis = 1)
X_test = test.drop('Survived', axis = 1)
LightGBMで学習
sklearn.model_selection.train_test_splitを用いて、学習データを学習用、検証用に分割します。
パラメータのstratifyを指定することで、正解ラベルの割合をそろえることができます。
from sklearn.model_selection import train_test_split
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.3, random_state=0, stratify=y_train)
Pclass、Sex、Embarkedをカテゴリ変数として入力します。
カテゴリに順序性がない変数をカテゴリ変数として入力するのがよいそうです。
categorical_features = ['Pclass', 'Sex', 'Embarked']
LightGBMで学習、予測を行います。
import lightgbm as lgb
lgb_train = lgb.Dataset(X_train, y_train, categorical_feature=categorical_features)
lgb_eval = lgb.Dataset(X_valid, y_valid, reference=lgb_train, categorical_feature=categorical_features)
params = {
'objective': 'binary'
}
model = lgb.train(
params, lgb_train,
valid_sets=[lgb_train, lgb_eval],
verbose_eval=10,
num_boost_round=1000,
callbacks=[lgb.early_stopping(10)]
)
y_pred = model.predict(X_test, num_iteration=model.best_iteration)
予測結果を表示します。
y_pred[:10]
array([0.06799741, 0.53092879, 0.12402525, 0.10202349, 0.39770746,
0.49337154, 0.70464621, 0.13773163, 0.68496324, 0.0487823 ])
0.5より大きい場合に1として、予測結果を再び表示します。
y_pred = (y_pred > 0.5).astype(int)
y_pred[:10]
array([0, 1, 0, 0, 0, 0, 1, 0, 1, 0])
予測結果が0または1になりました。
提出
提出データをsubmission.csvとして出力します。
sub = gender_submission
sub['Survived'] = list(map(int, y_pred))
sub.to_csv("submission.csv", index=False)
Public Scoreは0.76794でした。
学んだことを書きながら、データ分析スキルを上げることができました。
次は、LightGBMのパラメータやクロスバリデーションについて学びたいです。
参考文献
https://qiita.com/upura/items/3c10ff6fed4e7c3d70f0
https://www.kaggle.com/code/sishihara/upura-kaggle-tutorial-01-first-submission
https://ct-innovation01.xyz/DL-Freetime/kaggle-003/
https://qiita.com/kunishou/items/bd5fad9a334f4f5be51c
https://qiita.com/Maron_T/items/707ca62653a6d56cccbe
https://tebasakisan.hatenadiary.com/entry/2019/01/27/222102