ステップ7:機械学習のためにデータを整える

🎯 このステップでやること文字を数字に変え、空欄を埋めて、機械学習にかけられる形にする。所要時間:約10分。地味ですが、ここが実作業の本体です。


なぜ「整える」必要があるのか

機械学習のプログラムには、2つの弱点があります。

  1. 文字が計算できない。 male や female のままでは扱えません。
  2. 空欄があると止まる。 NaN が1つでもあるとエラーになります。

だから、使う前に次の2つをやります。

文字 → 数字に変換     (male → 0,  female → 1)
空欄 → 何かで埋める   (Age の空欄 → 全体の中央値28歳)

この作業を 前処理(preprocessing) と呼びます。

7-1. 使う列を決める

ステップ4で「効きそう」とわかった列を選びます。

📋 コード

features = ["Pclass", "Sex", "Age", "SibSp", "Parch", "Fare", "Embarked"]

X      = train[features].copy()   # 学習に使う材料
y      = train["Survived"]        # 当てたい答え
X_test = test[features].copy()    # 予測する相手

print("X     :", X.shape)
print("y     :", y.shape)
print("X_test:", X_test.shape)

✅ こう出れば成功

X     : (891, 7)
y     : (891,)
X_test: (418, 7)

💡 X と y は、機械学習の世界の共通の呼び名です。

  • X = 特徴量(予測の材料。複数列あるので大文字)
  • y = 目的変数(当てたい答え。1列なので小文字)

Kaggleのどのコードを見てもこの名前が出てきます。ここで覚えてしまってください。

⚠️ Name Ticket Cabin PassengerId は、いったん 使いません。(Name はステップ11で使います。Cabin は8割が空欄、Ticket は形がバラバラ、PassengerId はただの番号なので予測に関係ありません)

7-2. 空欄を埋めるための値を用意する

📋 コード

age_median  = train["Age"].median()
fare_median = train["Fare"].median()

print("年齢の中央値:", age_median)
print("運賃の中央値:", fare_median)

✅ こう出れば成功

年齢の中央値: 28.0
運賃の中央値: 14.4542

⚠️ なぜ train の値を使うのか?空欄を埋める値は、必ず学習データ(train)から計算します。テストデータの情報を使って準備をすると、「本来知り得ない情報を見た」ことになり、リーク(leakage) という反則になります。今は「そういう作法」とだけ覚えてください。

7-3. 変換する関数を作る

train と test に まったく同じ処理 をする必要があります。2回書くと間違えるので、1つの関数にまとめます。

📋 コード

def prepare(df):
    df = df.copy()

    # 文字 → 数字
    df["Sex"] = df["Sex"].map({"male": 0, "female": 1})
    df["Embarked"] = df["Embarked"].fillna("S").map({"S": 0, "C": 1, "Q": 2})

    # 空欄 → 中央値で埋める
    df["Age"]  = df["Age"].fillna(age_median)
    df["Fare"] = df["Fare"].fillna(fare_median)

    return df


X      = prepare(train[features])
X_test = prepare(test[features])

X.head()

✅ こう出れば成功 Sex の列が 0 と 1 に、Embarked の列が 0・1・2 になった表が出ます。

PclassSexAgeSibSpParchFareEmbarked
03022.0107.25000
11138.01071.28331
23126.0007.92500
31135.01053.10000
43035.0008.05000

表の中に文字が1つも残っていなければ成功です。

7-4. 空欄が消えたか確認する

📋 コード

print("X の空欄:", X.isnull().sum().sum())
print("X_test の空欄:", X_test.isnull().sum().sum())

✅ こう出れば成功

X の空欄: 0
X_test の空欄: 0

両方 0 ならクリアです。 ここで0になっていないと、次のステップで必ずエラーになります。

⚠️ 0になっていないときは

  • prepare() を実行し忘れていないか
  • X = prepare(train[features]) の行を実行したか
  • ステップ3で見た通り、test の Fare には空欄が1つあります。fillna(fare_median) の行があるか確認してください

💡 何をしたのか(読み飛ばし可)

コード意味
.copy()元の表を壊さないよう、複製してから加工する
.map({"male": 0, ...})値を別の値に置き換える(辞書で対応表を渡す)
.fillna(値)空欄をその値で埋める
def prepare(df):自分で作った処理のまとまり(関数)。同じ処理を何度も使える

中央値を使うのはなぜ?(平均ではなく)

平均は、極端な値(1人だけ80歳など)に引っ張られます。中央値は「真ん中の人の値」なので、外れ値に強いのです。年齢や金額では中央値が定番です。

Embarked の空欄を "S" で埋めたのはなぜ?

Embarked は S が644人と圧倒的に多いためです。最も多い値(最頻値)で埋めるのは、カテゴリの定番の埋め方です。


✅ ここまでできたら

これで機械学習にかける準備ができました。 次はいよいよモデルの学習です。