[備忘録] スマホだけでkaggleのタイタニック号生存者予測コンペやってみた


Kaggleのコンペのほぼすべての工程を、スマホだけでやってみたときの備忘録。

ChatGPTを使用したため、主にChatGPTに対してのInput、ChatGPTのOutputを記載していく。
なお当記事の章構成も、ChatGPTに作らせました。(一部改修)

:::note warn
・当記事はPCで作成したため、挿入している画像はPCでのスクショになります。
・ちなみに、主はデータ分析の超初心者。
・Qiitaで記事を作るのも初めてなので、所々見づらいかもしれません。
　予めご了承ください。
:::

対象のコンペはお馴染みのタイタニック号のやつ。

https://www.kaggle.com/competitions/titanic

# 0.使用したもの
・ChatGPT (GPT-4)
・ChatGPTプラグイン - Noteable、WebPilot
・GitHub　(ファイル共有用。)

:::note info
・Google Cloud StorageやAmazon S3などでも可。
・Noteableに直接アップロードするのも、勿論可。
:::

・コンペのデータセット
**・スマホ!!!!!**

# 1.はじめに
## コンペティションの概要
ざっくりと説明…。

タイタニック号の乗客データ(年齢、性別、乗客クラス、等)を使用し、乗客が生存したかどうかを予測するコンペ。

# 2.データの準備
## データの読み込み
[手順]
・kaggleからデータセットをダウンロード
・自分のGitHubにデータをアップロード
・そのリンクをChatGPTに教える

以下、実際のプロンプト文、及び回答。
プラグインをぶん回している様子。
回答の続きは [4.探索的データ分析](https://qiita.com/drafts/5c6140418b4c2d2c9314/edit#4%E6%8E%A2%E7%B4%A2%E7%9A%84%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90) へ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/f2109d5f-6e7f-3477-e0fd-403962601e85.png)

## データの概観
面倒なのでここもChatGPTに書かせる。

---以下よりChatGPT---

この章では、Kaggleのタイタニック号生存者予測コンペティションで使用するデータセットの読み込みと初期の探索を行います。

まず、3つのデータセットをダウンロードします。
次に、Pandasの`read_csv`関数を使用して、これらのCSVファイルをデータフレームとして読み込みます。

```python
import pandas as pd

# Load the data
train_data = pd.read_csv('train.csv')
test_data = pd.read_csv('test.csv')
```

データが正しく読み込まれたことを確認するために、`head`関数を使用して、各データフレームの最初の数行を表示します。

```python
# Display the first few rows of the train data
print(train_data.head())

# Display the first few rows of the test data
print(test_data.head())
```

これにより、データの概観を把握することができます。各列の名前、データ型、そしてデータの一部を確認することで、次のステップであるデータの前処理や探索的データ分析（EDA）に進む前に、データの理解を深めることができます。

---ここまで---


# 3.データの前処理
## 欠損値の処理
実際にChatGPTがNoteableに書いたコードを見てみる。
```python
# Fill missing values
train_data['Age'].fillna(train_data['Age'].median(), inplace=True)
train_data['Fare'].fillna(train_data['Fare'].median(), inplace=True)
test_data['Age'].fillna(test_data['Age'].median(), inplace=True)
test_data['Fare'].fillna(test_data['Fare'].median(), inplace=True)
```
中央値で補完してるぽい。

## データの標準化
先ほどと同様に、実際にChatGPTがNoteableに書いたコードを見てみる。
```python
# Standardize the data
scaler = StandardScaler()
scaled_data = scaler.fit_transform(train_data[['Pclass', 'Age', 'SibSp', 'Parch', 'Fare']])
```
こんな感じ。

# 4.探索的データ分析
## 相関分析
まずコード。
```python
import seaborn as sns
import matplotlib.pyplot as plt

# Calculate the correlation matrix
corr_matrix = train_data.corr()

# Visualize the correlation matrix
plt.figure(figsize=(10, 8))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f")
plt.show()
```
[データの読み込み](https://qiita.com/drafts/5c6140418b4c2d2c9314/edit#%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF)で記載した回答の続きを以下に示す。
プラグインをフル活用したあと、結果が出力された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/00d23ac0-3e82-4f50-9d81-72bcc893a27d.png)
ヒートマップはこちら。
![IMG_3323.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/926a59d4-1932-da45-0d2d-4a3521e1899e.png)

## クラスタリング
主からのInputは、"クラスタリングと可視化をして。"のみ。
以下、ChatGPTのOutputしたコード。
```python
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

# Perform clustering
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(scaled_data)

# Use PCA for visualization
pca = PCA(n_components=2)
reduced_data = pca.fit_transform(scaled_data)
reduced_data = pd.DataFrame(reduced_data, columns=['Dimension 1', 'Dimension 2'])
reduced_data['Cluster'] = kmeans.labels_

# Visualize the clusters
plt.figure(figsize=(10, 8))
sns.scatterplot(data=reduced_data, x='Dimension 1', y='Dimension 2', hue='Cluster', palette='viridis')
plt.title('Clusters of Titanic Dataset')
plt.show()
```
クラスタリングの結果が以下。
![IMG_3324.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/53f9bad2-4983-714e-22cb-1d6b516c38bd.png)

(結果として良いのか悪いのかわからない:joy:)

# 5.一次予測
ここで一旦、予測モデルを作らせた。
![スクリーンショット 2023-06-18 140500.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/6abb8fc1-e581-5142-d68f-e2d563773647.png)
"特徴量を追加しながら"と頼んだが追加していなかったため、次節より特徴量を追加している。
この時点でモデルの予測精度は **約80.4%** 。
改善点も挙げてくれているので、次節では"じゃあそれやって改善して。"と頼んだ。

# 6.特徴量エンジニアリング
## 新たな特徴量の作成 → 二次予測
以下、プロンプトと、そのOutput。
![スクリーンショット 2023-06-18 141129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/ce9d0b0f-635e-03bf-f629-7311c023f07c.png)
新しい特徴量として、"分かりやすいのにして"と言ったら、ごく単純な`FamilySize`を作成した。
用いたアルゴリズムはランダムフォレスト分類器。
この時点で予測精度は **約81.1%** となり、0.7%改善できたみたい。

コードを以下に示す。
```python
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder

# Preprocess the data
train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1
le = LabelEncoder()
train_data['Sex'] = le.fit_transform(train_data['Sex'])

# Define the features and the target
X = train_data[['Pclass', 'Sex', 'Age', 'FamilySize', 'Fare']]
y = train_data['Survived']

# Split the data into training and validation sets
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=0)

# Train the model
model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
model.fit(X_train, y_train)

# Make predictions on the validation set
predictions = model.predict(X_val)

# Calculate the accuracy of the model
accuracy = accuracy_score(y_val, predictions)
```
# 7.Kaggleへの提出
## 提出ファイルの作成
"提出用のファイルを作成して"とだけ頼んだら、トライアンドエラーを繰り返して、Noteable内に作ってくれた。
以下、Output。
![スクリーンショット 2023-06-18 143141.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/d8ac736f-cfab-7c97-6e0b-50d3faf0e994.png)
```python
# 訓練データの読み込み
train_data = pd.read_csv('train.csv')

# モデルの訓練
model = RandomForestRegressor(n_estimators=100, random_state=0)
model.fit(train_data[features], train_data[target])

# テストデータに対する予測
predictions = model.predict(test_data[features])

# 提出ファイルの作成
output = pd.DataFrame({'Id': test_data.Id, 'SalePrice': predictions})
output.to_csv('submission.csv', index=False)
```
![スクリーンショット 2023-06-18 143336.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/82c631ee-3a55-4b82-1189-180c4f841876.png)
```python
from sklearn.ensemble import RandomForestClassifier
```
![スクリーンショット 2023-06-18 143345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/d2c6d174-53d3-169a-cb3f-192e50fcd7c0.png)


## 提出 → スコアの確認
Noteableにアクセスし、提出用のcsvファイル('submission.csv')をダウンロードし、kaggleに提出した。
以下、スコアと順位。
**スコア：0.77990**
**提出時の順位：3535位/約16000人(2023年6月17日時点)**

…一応上から数えたほうが早い方だから、良い結果と言えるのかな？:thinking:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/ccc21f96-4e10-d91c-5391-b243d7bbbc5a.png)
# 8.まとめ
全然理解できていなくてもできてしまって困惑しています。

あと、スマホだけで出来るけどPCでやった方が絶対楽。
電車乗りながらでもできましたが、おすすめはしません。

最後まで見ていただいた方、ありがとうございました。

# 付録
今後kaggleをChatGPTにやらせるときの指示は、どんな内容が最適か聞いてみた。ご参考までに。
![スクリーンショット 2023-06-18 152304.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1898170/064ce406-71be-929d-41c0-8c3c33e2d6df.png)