7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

KaggleAdvent Calendar 2023

Day 8

KaggleのTitanicでデータ分析を学ぶ

Last updated at Posted at 2023-12-08

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()

スクリーンショット 2023-12-08 2.24.14.png

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()

スクリーンショット 2023-12-08 0.37.45.png

この図からは情報を読み取れないため、パラメータのhueをSurvivedに指定します。

sns.pairplot(train[["Survived", "Pclass", "Age", "SibSp", "Parch", "Fare"]], hue="Survived")
plt.show()

スクリーンショット 2023-12-08 0.38.02.png

この図から、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()

スクリーンショット 2023-12-08 2.20.12.png

femaleのほうが生存率が高いことがわかります。

次に、seaborn.countplotを用います。

sns.countplot(x="Sex", hue="Survived", data=train)
plt.show()

スクリーンショット 2023-12-08 2.29.34.png

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()

スクリーンショット 2023-12-08 2.20.37.png

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()

スクリーンショット 2023-12-08 2.32.20.png

Pclassが1、2のfemaleは、生存率が1に近いことがわかります。

データ前処理

trainとtestの連結

pandas.concatを用いて、データフレームを結合します。

data = pd.concat([train, test], sort=False)

欠損値の確認

pandas.isnullpandas.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

7
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?