ステップ7:機械学習のためにデータを整える
🎯 このステップでやること文字を数字に変え、空欄を埋めて、機械学習にかけられる形にする。所要時間:約10分。地味ですが、ここが実作業の本体です。
なぜ「整える」必要があるのか
機械学習のプログラムには、2つの弱点があります。
- 文字が計算できない。
maleやfemaleのままでは扱えません。 - 空欄があると止まる。
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 になった表が出ます。
| Pclass | Sex | Age | SibSp | Parch | Fare | Embarked | |
|---|---|---|---|---|---|---|---|
| 0 | 3 | 0 | 22.0 | 1 | 0 | 7.2500 | 0 |
| 1 | 1 | 1 | 38.0 | 1 | 0 | 71.2833 | 1 |
| 2 | 3 | 1 | 26.0 | 0 | 0 | 7.9250 | 0 |
| 3 | 1 | 1 | 35.0 | 1 | 0 | 53.1000 | 0 |
| 4 | 3 | 0 | 35.0 | 0 | 0 | 8.0500 | 0 |
表の中に文字が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人と圧倒的に多いためです。最も多い値(最頻値)で埋めるのは、カテゴリの定番の埋め方です。
✅ ここまでできたら
これで機械学習にかける準備ができました。 次はいよいよモデルの学習です。