【機械学習入門 最終回】実践!タイタニック号の生存者予測 - データ分析プロジェクト完全ガイド 🚢
「これまでに学んだモデル構築や評価の知識を、実際のデータで試してみたい!」
「データ分析プロジェクトって、最初から最後までどんな流れで進めるの?」
「データの前処理、モデルの訓練、性能評価…全部まとめてやってみたい!」
こんにちは! AI・機械学習探検隊、隊長のPythonistaです! 前回の第4回では、混同行列や適合率、再現率といった指標を使って、モデルの性能を正しく、そして多角的に評価する方法を学びましたね。これで、AIの「実力」を見抜くための診断スキルが身につきました。
いよいよ、この機械学習入門シリーズも最終回を迎えます。今回は、これまで身につけた全ての知識とスキルを総動員して、最初から最後までの一貫したデータ分析プロジェクトに挑戦します!題材は、データサイエンスの世界で非常に有名な「タイタニック号の生存者予測」です。
乗客のデータ(年齢、性別、客室クラスなど)から、その人が生還できたかどうかを予測するモデルを構築します。データの読み込み、探索的データ分析(EDA)、データの前処理、モデルの訓練、そして性能評価という、データサイエンティストが行う一連のワークフローを一緒に体験していきましょう。このプロジェクトを終える頃には、あなたは自信を持って自分自身のデータ分析プロジェクトを始めるための、確かな実力と経験を手にしているはずです!
1. プロジェクトの準備と目標設定
1.1. 準備:ライブラリのインポート
まずは、今回使用するライブラリを全てインポートしておきましょう。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
# Scikit-learnから必要なモジュールをインポート
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# スタイルの設定
sns.set_theme(style="whitegrid")
plt.rcParams['font.family'] = 'IPAexGothic' # 日本語フォント設定
1.2. プロジェクトの目標
今回の目標は、「乗客の属性データ(特徴量)を使って、その乗客が生存した(Survived=1)か、死亡した(Survived=0)かを予測する分類モデルを構築し、その性能を評価する」ことです。
2. ステップ1:データの読み込みと探索的データ分析 (EDA)
データ分析は、まずデータがどのようなものかを知ることから始まります。Seabornライブラリには、練習用にタイタニックのデータセットが内蔵されています。
2.1. データの読み込みと概要確認
# Seabornからタイタニックデータセットをロード
df = sns.load_dataset('titanic')
print("--- データフレームの最初の5行 ---")
print(df.head())
print("\n--- データフレームの基本情報 (info) ---")
df.info()
df.info()
の結果を見ると、age
(年齢)、deck
(デッキ)、embarked
(乗船港)の列に欠損値があることがわかります。これが、後ほど対処すべき「汚れた」データです。
2.2. データを可視化して特徴を探る
次に、どのような乗客が生き残りやすかったのか、グラフで可視化して傾向を探ります。
# 生存者と死亡者の数をカウント
sns.countplot(x='survived', data=df)
plt.title('生存者数 (0=死亡, 1=生存)')
plt.show()
# 性別と生存の関係
sns.countplot(x='survived', hue='sex', data=df)
plt.title('性別ごとの生存者数')
plt.show()
# 客室クラスと生存の関係
sns.countplot(x='survived', hue='pclass', data=df)
plt.title('客室クラスごとの生存者数')
plt.show()
# 年齢の分布
sns.histplot(df['age'].dropna(), kde=True, bins=30)
plt.title('乗客の年齢分布')
plt.show()
これらのグラフから、「女性の方が生存率が高い」「客室クラスが高い(1等)ほど生存率が高い」といった、映画でも描かれたような傾向がデータから読み取れますね。このような洞察が、後のモデル構築の助けになります。
3. ステップ2:データクリーニングと前処理
EDAで見つけた問題点(欠損値、カテゴリカルデータ)を処理し、機械学習モデルが学習できる形式にデータを整えます。
# --- データクリーニングと前処理 ---
# 1. 欠損値の処理
# 'age'の欠損値を、年齢の中央値で補完
df['age'] = df['age'].fillna(df['age'].median())
# 'deck'列は欠損が多すぎるため、列ごと削除
df = df.drop('deck', axis=1)
# 'embarked'と'embark_town'は情報が重複しており、欠損も少ないので、欠損行を削除
df = df.dropna()
# 2. カテゴリカルデータの数値化 (One-Hot Encoding)
# 'sex'と'embarked'列をダミー変数に変換
df_dummies = pd.get_dummies(df, columns=['sex', 'embarked'], drop_first=True)
# drop_first=Trueは、多重共線性を避けるため(例: sex_maleが0なら女性、1なら男性と分かるのでsex_femaleは不要)
# 3. 不要な列の削除
# 今回のモデルでは使わない、あるいは情報が重複している列を削除
df_final = df_dummies.drop(['who', 'adult_male', 'alive', 'class', 'embark_town', 'pclass', 'sex_female'], axis=1)
print("\n--- 前処理後のデータフレーム情報 ---")
df_final.info()
print("\n--- 前処理後の最初の5行 ---")
print(df_final.head())
これで、全てのデータが数値になり、欠損値もない、機械学習モデルに投入できる綺麗なデータセットが完成しました!
4. ステップ3:モデルの構築と訓練
いよいよモデルを構築します。手順は前回までと同じです。
# 特徴量Xとターゲットyに分割
X = df_final.drop('survived', axis=1)
y = df_final['survived']
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ロジスティック回帰モデルのインスタンス化と学習
model = LogisticRegression(max_iter=1000) # 計算回数の上限を増やす
model.fit(X_train, y_train)
print("\nモデルの学習が完了しました。")
5. ステップ4:モデルの性能評価
最後に、構築したモデルがどれくらいの精度で生存者を予測できるのか、前回学んだ評価指標を使って詳しく見ていきましょう。
# テストデータで予測
y_pred = model.predict(X_test)
# 性能評価
print("\n--- モデルの性能評価 ---")
# 正解率
accuracy = accuracy_score(y_test, y_pred)
print(f"正解率 (Accuracy): {accuracy:.4f}")
# 混同行列
cm = confusion_matrix(y_test, y_pred)
print("\n混同行列:")
print(cm)
# 混同行列を可視化
plt.figure(figsize=(6, 5))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues',
xticklabels=['死亡(予測)', '生存(予測)'],
yticklabels=['死亡(実際)', '生存(実際)'])
plt.title('混同行列')
plt.show()
# 分類レポート
report = classification_report(y_test, y_pred, target_names=['死亡', '生存'])
print("\n分類レポート:")
print(report)
結果を見ると、正解率は約80%前後になりました。混同行列や分類レポートからは、モデルがどのような間違いをしているか(例えば、「生存」を「死亡」と予測してしまうケースが何件あったか)などを詳細に分析することができます。この結果を元に、さらにモデルを改善していくのがデータサイエンティストの仕事の醍醐味です。
まとめ:機械学習プロジェクトの全貌、そして次なる冒険へ
おめでとうございます!あなたは今、データサイエンスプロジェクトの**最初から最後までの一連のワークフロー**を、自分自身の手で完遂しました!
- データ探索(EDA): データの概要を把握し、可視化して傾向を探りました。
- データ前処理: 欠損値を処理し、カテゴリカルデータを数値に変換して、モデルが学習できる形に整えました。
- モデル構築: データを訓練用とテスト用に分割し、Scikit-learnでモデルを学習させました。
- モデル評価: 正解率だけでなく、混同行列や分類レポートを使って、モデルの性能を多角的に評価しました。
この流れは、どんなに複雑な機械学習プロジェクトでも基本となる、非常に重要なプロセスです。この経験は、あなたの自信となり、これから様々なデータに挑戦していく上での強固な土台となるでしょう。
これにて、機械学習入門シリーズは完結です!短い間でしたが、この冒険が皆さんの知的好奇心を刺激し、Pythonとデータサイエンスの面白さを少しでも伝えることができたなら、これほど嬉しいことはありません。あなたの学びの旅は、まだ始まったばかりです。
このブログも、これからも皆さんのプログラミング学習を応援する情報を発信し続けます。またどこかの記事でお会いしましょう!
Happy Analyzing! 🤖
コメント
コメントを投稿