Shikata Ga Nai

Private? There is no such things.

8. 実践!Kaggle Titanicコンペに挑戦② 〜前処理と特徴量エンジニアリング〜

Hello there, ('ω')ノ

📌 1. データ前処理とは?

機械学習モデルを作る前に、データを クリーンで使いやすい形に整えること が重要です。
Titanicデータでは、以下のような前処理が必要になります。

欠損値の処理(年齢・客室・乗船地など)
カテゴリ変数の変換(性別・乗船地など)
不要な列の削除(名前・チケット番号など)


📊 2. データの前処理

まずは、Titanicデータを読み込み、前処理を行います。

✅ データの読み込み

import pandas as pd

# データの読み込み
train = pd.read_csv("/kaggle/input/titanic/train.csv")
test = pd.read_csv("/kaggle/input/titanic/test.csv")

✅ (1) 欠損値の処理

前回の分析で、"Age"(年齢), "Cabin"(客室), "Embarked"(乗船地) に欠損値があることが分かりました。
それぞれ適切な方法で補完します。

📌 ① Age(年齢)の補完

Age は中央値で補完します。

# 🔹 `Age` 列の欠損値を中央値で補完(推奨方法)
train["Age"] = train["Age"].fillna(train["Age"].median())
test["Age"] = test["Age"].fillna(test["Age"].median())

📌 ② Cabin(客室番号)の補完

Cabin の欠損率が高いため、「有無だけを特徴量にする」 方法を採用します。

# "Cabin"の欠損を0(なし)、そうでない場合を1(あり)に変換
train["Cabin_flag"] = train["Cabin"].notnull().astype(int)
test["Cabin_flag"] = test["Cabin"].notnull().astype(int)

# "Cabin" 列を削除
train.drop("Cabin", axis=1, inplace=True)
test.drop("Cabin", axis=1, inplace=True)

📌 ③ Embarked(乗船地)の補完

最頻値(mode)で補完します。

# 🔹 `Embarked` 列の欠損値を最頻値で補完(推奨の方法)
train["Embarked"] = train["Embarked"].fillna(train["Embarked"].mode()[0])
test["Embarked"] = test["Embarked"].fillna(test["Embarked"].mode()[0])

✅ (2) カテゴリ変数を数値化

機械学習モデルは 数値データしか扱えない ため、Sex(性別)や Embarked(乗船地)を数値に変換します。

📌 ① 性別(Sex)の変換

# "Sex" を数値化(male: 0, female: 1)
train["Sex"] = train["Sex"].map({"male": 0, "female": 1})
test["Sex"] = test["Sex"].map({"male": 0, "female": 1})

📌 ② 乗船地(Embarked)の変換

Embarked は3種類のカテゴリ(C, Q, S)があるので、One-Hot Encoding でダミー変数を作成します。

# One-Hot Encoding
train = pd.get_dummies(train, columns=["Embarked"], drop_first=True)
test = pd.get_dummies(test, columns=["Embarked"], drop_first=True)

「Embarked_C」「Embarked_Q」 の2列が作成され、S は不要なため削除されます。


✅ (3) 不要な列の削除

機械学習に不要な情報(名前・チケット番号・乗客ID)を削除します。

# 不要な列を削除
train.drop(["Name", "Ticket", "PassengerId"], axis=1, inplace=True)
test.drop(["Name", "Ticket", "PassengerId"], axis=1, inplace=True)

📊 3. 特徴量エンジニアリング

特徴量エンジニアリングとは、モデルの精度を上げるために、新しい特徴を作成すること です。
Titanicデータでは、以下の特徴を追加します。

✅ (1) 家族の人数

SibSp(兄弟姉妹)と Parch(親子)を合計して、「家族の人数」カラムを作成します。

# 家族の人数を計算
train["FamilySize"] = train["SibSp"] + train["Parch"] + 1
test["FamilySize"] = test["SibSp"] + test["Parch"] + 1

家族が多い人は生存率が高いのか?単独の方が生存率が高いのか? などを分析できます。


✅ (2) 料金カテゴリ(Fare Binning)

運賃 Fareカテゴリ変数 に変換し、モデルに分かりやすくします。

# 運賃をカテゴリ分け
train["FareCategory"] = pd.qcut(train["Fare"], 4, labels=[0, 1, 2, 3])
test["FareCategory"] = pd.qcut(test["Fare"], 4, labels=[0, 1, 2, 3])

qcut() を使うと、運賃を 4つのグループ に分類できます。


🚀 4. 前処理後のデータを確認

前処理が完了したデータを確認してみましょう!

print(train.head())
print(test.head())

📌 前処理後のデータ例

Survived Pclass Sex Age SibSp Parch Fare Cabin_flag Embarked_C Embarked_Q FamilySize FareCategory
0 3 0 22 1 0 7.25 0 0 0 2 0
1 1 1 38 1 0 71.28 1 1 0 2 3

🎯 まとめ

欠損値の処理を行った!
カテゴリ変数を数値に変換した!
不要な列を削除した!
新しい特徴(家族の人数・運賃カテゴリ)を追加した!

Best regards, (^^ゞ