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, (^^ゞ