はじめに
初めまして。マオと申します。
前回は初心者として楽天の株価データを用いて株価分析を行ったブログを作成しました。
僕の簡単な自己紹介は前回のブログに書いてありますので、下記から興味がある方はぜひ読んでもらえると嬉しいです。
↓
https://qiita.com/mao2424/items/69be048ee43d7015bd30
そして次はタイタニック号をテーマに生存確率を予測してみたいと思い、このブログを作成しました。
タイタニック号の生存予測をテーマにした理由
ほぼタイトルにある通りです。
初心者がデータサイエンスを学ぶなら、まずは自分がワクワクできるテーマじゃないと、途中で息切れしちゃうんですよね。興味のないデータを無理やり扱っても、「これ、なんでやってるんだっけ?」ってなりがちです。だからこそ、タイタニック号の生存予測を選びました。映画でも有名だし、あのシーンとか浮かべながら取り組めば、データ分析がただの数字遊びじゃなくて、「あの人、助かってほしいな」とか、ちょっと感情移入までできちゃうんです。
しかも、タイタニックデータセットって、シンプルで手軽に扱えるし、歴史的な背景もあるから、ただの練習課題以上のものを感じるんです。このテーマで勉強を進めることで、どれだけ自分のスキルが上がってきたか実感できるし、「学ぶ」ことの楽しさを改めて感じられると思ったんです。データの裏にある人々のストーリーを考えることで、学びが一気に深まるって、なんか素敵じゃないですか?
分析方法について
タイタニック号のブログを書くにあたって、いろんな記事やブログを参考にしてみたんですけど、正直どこか冷たく感じました。ブログ自体はめちゃくちゃ丁寧に作られてるんですけど、「Pythonの知識ないと読んじゃダメですよ」みたいな圧を勝手に感じちゃって、なんか突き放された気分になったんですよね。これって、たぶん自分が初心者だからこそ感じた違和感なんだと思います。だからこそ、「ただコードを眺めるんじゃなくて、データが語るストーリーや背景にもっと焦点を当てられないかな?」って考えました。
もちろん、初心者としては「色んなモデルを作って比較して、Pythonの技術をしっかり身につけよう」っていう流れも大事なんだろうけど、今回はそこをちょっとスルーして、タイタニック号そのものの考察に力を入れたいと思ってます。コードの細かい手順とか、「Pythonの勉強がしたい!」って人は、他のもっとガッツリしたブログを参考にした方がいいかもしれません。
僕は今回は、タイタニック号のデータに隠されたストーリーを掘り下げることに重きを置きたい。だから、ちょっと肩の力を抜いて、このブログを読んでくれたら嬉しいです。
分析モデルについて
こっからはちょっと真面目にいきます。
以下の流れで分析を進めました。
⓵ ロジスティック回帰
⬇︎
② ランダムフォレスト
⓵だけでは分析に必要な情報を読み解くのが難しかったので、
このような順序となりました。
❶ ロジスティック回帰での分析
# 必要なライブラリのインポート
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report
# タイタニックデータセットのロード
# データセットは seaborn ライブラリから取得する
titanic = sns.load_dataset('titanic')
# データの前処理
# 目的変数: 'survived'(生存/死亡)
# 説明変数: 'sex', 'age', 'fare', 'class', 'embarked'
# 'sex'と'class'をダミー変数化し、欠損値を除去する
data = titanic[['survived', 'sex', 'age', 'fare', 'class', 'embarked']].dropna()
data = pd.get_dummies(data, drop_first=True)
# 説明変数と目的変数に分ける
X = data.drop('survived', axis=1)
y = data['survived']
# データを学習用とテスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# ロジスティック回帰モデルの作成と学習
log_reg = LogisticRegression(max_iter=1000)
log_reg.fit(X_train, y_train)
# テストデータでの予測
y_pred = log_reg.predict(X_test)
# 精度の計算
accuracy = accuracy_score(y_test, y_pred)
# 混同行列を作成し、ヒートマップで表示
conf_matrix = confusion_matrix(y_test, y_pred)
# グラフの設定
plt.figure(figsize=(8, 6))
sns.heatmap(conf_matrix, annot=True, fmt="d", cmap="Blues", xticklabels=["Died", "Survived"], yticklabels=["Died", "Survived"])
plt.title(f'Logistic Regression Confusion Matrix (Accuracy: {accuracy:.2f})')
plt.xlabel('Predicted')
plt.ylabel('Actual')
# 精度と混同行列の表示
accuracy, conf_matrix
ロジスティック回帰モデルを使用してタイタニック号の生存予測を行った結果、テストデータにおける**精度(Accuracy)**は約 79.4% でした。
⚫︎ グラフの解釈
左上(107件): 実際に死亡した人を正しく「死亡」と予測したケース。
右上(15件): 実際に死亡した人を「生存」と誤って予測したケース。
左下(29件): 実際に生存した人を「死亡」と誤って予測したケース。
右下(63件): 実際に生存した人を正しく「生存」と予測したケース。
この結果から、モデルは生存した人よりも死亡した人を正しく予測する傾向があることがわかります。
⚫︎ 評価結果からわかること
ロジスティック回帰モデルでは、次のような結論を導けます。
精度が79.4%であるため、概ね8割近いケースで正しい予測を行っている。
特に「死亡」を予測する際の精度が高く(107件中15件しか誤りがない)、全体の結果において死亡を予測するのに強いモデルであることがわかります。
ただこの分析結果だけでは、生死に対してどのような要因が関係しているのかが不透明です。
そのため、別のモデルで考えてみます。
❷ ランダムフォレストでの分析
from sklearn.ensemble import RandomForestClassifier
# ランダムフォレストモデルを使用した特徴量の重要度を可視化する
# ランダムフォレストモデルの作成と学習
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# テストデータでの予測
y_pred_rf = rf_model.predict(X_test)
# 正解率の計算
accuracy_rf = accuracy_score(y_test, y_pred_rf)
# 正解率の出力
print(f'Random Forest Accuracy: {accuracy_rf:.2f}')
# 特徴量の重要度を取得
feature_importances = rf_model.feature_importances_
# 特徴量名と重要度をデータフレーム化
feature_df = pd.DataFrame({
'Feature': X.columns,
'Importance': feature_importances
})
# 重要度が高い順に並び替え
feature_df = feature_df.sort_values(by='Importance', ascending=False)
# 特徴量の重要度を棒グラフで表示
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=feature_df, palette='viridis')
plt.title('Feature Importances in Titanic Survival Prediction (Random Forest)')
plt.xlabel('Importance Score')
plt.ylabel('Features')
plt.show()
# 重要度データフレームの表示
feature_df
上記のグラフと表を見てみると、次のようなことがわかります。
年齢(age):
最も重要な特徴量で、全体の30.3%の寄与度を持っていることがわかります。
つまり、年齢が生存に大きな影響を与えており、特定の年齢層(例えば、子供や若年層)が生存確率に影響を与えている可能性があります。
運賃(fare):
次に大きな影響を与えており、全体の29.4%を占めています。
運賃は乗客がどのクラスの部屋にいたかを反映しているため、高い運賃を支払った人は生存確率が高かったと考えられます。
性別(sex_male):
26.0%の寄与度で、男性かどうかが生存確率に影響を与えています。
実際、タイタニック号では「女性と子供を優先」という方針が取られたことから、女性の生存率が高かったことが示唆されます。
乗客クラス(class_Third, class_Second):
乗客クラスも生存率に影響を与えています。特に三等客(class_Third)は約9.3%の影響度を持っているため、三等客であったことが生存に対して不利だったことを表しています。
このように、ランダムフォレストを使用すると、各特徴量がどの程度生死の予測に関わっているかを視覚的に理解できます。
考察
- 性別や年齢の重要性の背景
性別: タイタニック号では「女性と子供を優先して救助する」という当時の慣習が避難時に大きな影響を与えました。この慣習は、船の乗組員や一部の男性が女性や子供を先に救命ボートに乗せることを指示したため、女性と子供の生存率が男性よりも高くなりました。例えば、女性の生存率は約74%、男性は約20%という大きな差が見られます。この背景には、1912年という時代的なジェンダーの役割意識もあります。
年齢: 若年層、特に子供は、救命ボートに優先して乗せられたため、比較的高い生存率を持っています。また、年齢は体力や素早い行動能力にも関連し、若い人々は迅速に避難できた可能性があります。一方で高齢者は、避難時の混乱や体力的な問題により、迅速に行動できなかったことが考えられます。
2. 乗客クラス(客室等級)と生存率の関係
三等客の生存率が低かった理由:
タイタニック号では、三等客の生存率は非常に低く、これは船の設計と社会的な階層によるものが大きいです。三等客室は船の下層に位置し、上層の救命ボートにアクセスするには複雑な経路を通らなければならない状況でした。さらに、三等客は避難経路についての情報が不十分であり、船の乗組員からの支援も限られていたと報告されています。加えて、当時の社会的背景として、上層階級の乗客が優先される風潮も影響していたと考えられます。
3 . 運賃(Fare)と生存確率の相関
運賃と生存率の関係: 運賃が高いほど、生存率が高くなる傾向がありました。運賃の高い一等客は、より高いデッキや船の上層部に位置していたため、救命ボートに到達する時間が他のクラスよりも早かったと考えられます。また、一等客は乗組員から特に手厚く保護された可能性が高く、これは経済的・社会的な階級が当時の避難プロセスに影響を与えた一例です。
最後に
いやー真面目な感じは疲れました。
最後は普段の自分のキャラでこのブログを締めたいと思います。
「タイタニック」って聞くと、普通はラブストーリーの映画を思い浮かべると思いますが、実はその裏にはとんでもなく複雑な現実が隠れてました。データ分析してみて、映画だけじゃわからない背景にどんどん気づいてしまい、正直、見方がガラッと変わっちゃいました。
タイタニック号の悲劇って、ただの事故じゃなくて、当時の社会の不平等が、どれだけ生存に影響を与えたかを教えてくれます。そんな事実を知ると、「救命ボートに乗れたかどうかは運次第」なんて言えなくなりますよね。
このブログが、少しでも多くの人に、タイタニック号やその背景について考えるきっかけになれば嬉しいです。まぁ、硬いことは言いませんが、ちょっとでも興味を持ってもらえたらいいかな、くらいで!