🧑‍🏫

Data Analysis GPTを先生にしてデータ分析を練習した

2023/12/04に公開

データ分析および機械学習の題材として非常に有名なデータセットに「タイタニック」があります。
航海中に沈没したタイタニック号の乗客名簿が与えられるので、彼らの属性から生存したがどうかを予測する機械学習モデルを作成せよ、というわけです。

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

筆者は機械学習についての知識に乏しかったので、これをやってみようと思いました。
学習にあたって、 タイタニックについて解説している記事・書籍はたくさんあると思いますが、今回は現代的なアプローチとして「ChatGPTにやり方を教わりながらデータセットを分析していく」ことをやってみました。

記事の内容に関して、予め以下の点を捕捉します:

  • これからData Analysis GPTというのが出てくるのですが、名称が長いのと使い方が非常に似ているのを踏まえ、便宜上ChatGPTと書くことがあります(他のGPTは出てきません)
  • 筆者は機械学習について素人です(実務経験はほぼありません)が、最低限の基礎知識はあります。記事でもそれは前提になっています
    • CourseraでAndrew Ngの「Machine Learning」を受講したことがあります
    • 例えば、教師あり学習とか、特徴量とか言われてもそれが何かわかります
    • Pythonなどで基本的なコーディングができます
      • PandasやSeabornを使ってちょっと遊んだり、分からないことがあればドキュメントから調べたりはできます

Data Analysis GPTの紹介

今回、先生になってもらうAIは、Data Analysis GPTです。

2023年の11月に、OpenAIのChatGPTの機能としてGPTsがリリースされました。これを使うと、オリジナルのChatGPTをチューニングすることで用途特化したチャットツールを作成でき、またChatGPTのユーザーは作成されたカスタムのGPTを利用できます。

https://openai.com/blog/introducing-gpts

そんなGPTの1つにData Analysis GPTがあります。GPTとしての名前は"Data Analysis"として登録されています。当人曰く、GPT-4をベースにファインチューニングされており、データ分析に関して深い知識を蓄えているそうです。

こんにちは。あなたはGPT-4のファインチューニングされたモデルですか?

こんにちは!はい、私はGPT-4をベースにしたカスタマイズされたモデルです。私の専門分野は「データ分析」で、データの分析、視覚化、統計的解釈などに特化しています。データ分析に関するご質問やお手伝いがあれば、お気軽にお尋ねください。

このGPTは、例えば生のデータをアップロードすると内容解釈してくれたりするらしいのですが、ここでは単に「データ分析に関して詳しいChatGPT(GPT-4)」として利用します。利用上のインタフェースとしてはChatGPTと同じに見える一方で、厳密にはChatGPTではないらしい点は留意してください。

Data Analysis GPTとの学習セッション(教えてくれたこと)

ChatGPTの使い方としては「私はプログラマーである」「学習のセッションをしたい」など基本的な条件を提示した上で会話を開始しました。会話内容を全部貼ると分量がかなり大きくなるので、この記事ではChatGPTがどういう事をしてくれたかについて、何点かに絞って紹介します。

データセットの読み出し方法

データの準備が面倒そうだなと思っていたら、すぐにそれをするコードを生成してくれました。

よさそうですね。私は、いわゆるタイタニックを使ったデータ分析をしたことがないので、それをやってみたいと考えています。手元にJupyterLabはあります!!

タイタニックデータセットの読み出し方法

データ分析の基本的な流れの解説

さて、分析対象のデータが手に入ったとして、分析にあたりまずは何をするべきでしょうか?

筆者はとっさに答えられなかったのですが、ChatGPTは探索的データ分析(EDA)の一連のステップ行うことを推奨してくれます。

データが読み取れました。
例えば sns.histplot(data=titanic, x='age', hue='survived') とすることで、年齢の分布とそれが生存しているかどうかについて、色分け可視化ができました。
最初に私がやるべきことは、各カラムの全体的な分布がどうなっているかや、それらに相関があるかなど、概観を調査することでしょうか?

はい、まさにその通りです。データ分析プロジェクトにおいては、まずデータの探索的データ分析(Exploratory Data Analysis, EDA)から始めることが一般的です。EDAの目的は、データセットに含まれる特徴の理解、データの品質や構造の評価、パターンや異常値、相関関係などの発見にあります。

EDAの一環として以下のステップを行うことが推奨されます:

  1. 基本的な統計量の確認:平均値、中央値、標準偏差などの基本統計量を確認します。

  2. 個々の特徴の分布の可視化:sns.histplot のような関数を用いて、個々の特徴(年齢、性別、チケットクラスなど)の分布を可視化します。

  3. カテゴリ変数と生存率の関係:性別、チケットクラスなどのカテゴリ変数と生存率との関連を探ります。これは、sns.countplot や sns.barplot を用いて行えます。

  4. 数値変数間の相関の確認:数値データ間の相関を調べるために、相関係数を計算し、sns.heatmap などで相関行列を可視化します。

  5. 欠損値の確認:データセットに欠損値があるかどうかを確認し、その処理方法を考えます。

  6. 異常値(アウトライヤー)の調査:ボックスプロットなどを用いて、異常値が存在しないか調べます。

これらのステップを通じてデータに対する理解を深め、後の分析ステップ(データ前処理、モデル構築、評価など)での方針を決定します。

次に進む前に、これらのEDAのステップについて何か質問はありますか?それとも、実際にいくつかのEDAのステップを実行してみますか?

つまり、タイタニックに特化した解説だけでなく、より一般化された方法論についてもChatGPTは知識を持っていることになりそうです。

投げかけた仮説の評価

こちらが観察・発見した点について、ChatGPTは評価を行ってくれます。例えば、性別ごと生存者・非生存者ごとに年齢分布をバイオリン図で可視化した時のことです。

性別ごと生存カテゴリごとの年齢分布のバイオリン図

可視化ができたので、観察結果をどうでしょうか? とChatGPTに聞いてみることにしました。

sns.catplot(data=titanic, x="sex", y="age", hue="survived", kind="violin") を実行して観察しました。もちろんこれらは、本来は生存率を計算するのが妥当だとは思いますが。
- 女性は、比較的どの年齢層であっても生存率が高い傾向にありそうです
- 男性は、低年齢であるならば生存率は高そうです
- 少し気になるのは、男性の20代のような若い大人層は、生存率が低く見えることです

なるほど。カテゴリ分割した上でヴァイオリンプロットを眺めるだけでも発見があるのですね

あなたの観察は非常に洞察に富んでいます。ヴァイオリンプロットを使用すると、データの分布を直感的に理解できるため、データの傾向やパターンを発見しやすくなります。あなたが挙げたポイントは、タイタニックデータセットに関連するいくつかの重要な洞察を示しています。

  • 女性の高い生存率:これは「女性と子供を先に」という救命ボートへの乗船方針を反映している可能性が高いです。タイタニックの沈没時には、多くの場合、女性と子供が優先的に救命ボートに乗せられました。
  • 低年齢の男性の比較的高い生存率:これも子供を優先的に救出する方針の結果と考えられます。特に若い男の子は、この方針の恩恵を受けた可能性があります。
  • 20代の若い男性の低い生存率:これは社会的な規範や救命ボートへの乗船の優先順位によるものかもしれません。20代の男性は子供ではなく、また年配者と比べて身体的に強いと見なされたため、他の乗客に優先して救命ボートに乗ることが少なかったと考えられます。

これらの観察は、単にデータを分析するだけでなく、その時代の社会的文脈や当時の出来事についても考えるきっかけを与えてくれます。データの背後にある物語や原因を理解することは、データ分析の非常に重要な側面です。

さらに深く探求したい場合は、生存率を直接計算して、性別や年齢層ごとの生存率の違いをより定量的に分析することもできます。興味があれば、そのような分析についても案内できますので、お気軽にお知らせください。

この返信中でも触れられていますが、ChatGPTはデータから背景にあるストーリーを読み解くことが重要だと説きます。

データからストーリーを読み取る能力は、優れたデータ分析家にとって重要なスキルです。データの背後にある物語を理解することで、より深い洞察を得ることができます。

EDA後にどう進めるべきかについてのアドバイス

データセットを理解したなら、それを元に機械学習モデルを作成することになりますが、具体的にどういう手順でやるの?っていう質問にももちろん答えてくれました。

なるほど。そろそろEDAの段階を終えようと思います。

探索的データ分析(EDA)の段階を終える準備ができたとのことで、素晴らしいです。EDAはデータセットの理解を深め、データの品質を評価し、後の分析やモデル構築の方向性を決定するための重要なステップです。

EDAを終えた後の次のステップは通常、以下のようなものがあります:

  1. データの前処理:欠損値の処理、カテゴリ変数のエンコーディング、特徴量のスケーリング、不要な特徴の削除などを行います。

  2. 特徴量エンジニアリング:既存のデータから新しい特徴量を作成したり、特徴量の選択を行ったりして、モデルの性能を向上させます。

  3. モデルの選択と構築:機械学習モデルを選択し、データにフィットさせます。これには、単純なロジスティック回帰から始めて、必要に応じてより複雑なモデルに進むことも含まれます。

  4. モデルの評価:交差検証、精度(Accuracy)、再現率(Recall)、精密度(Precision)、F1スコアなどのメトリクスを使用してモデルを評価します。

  5. モデルのチューニング:ハイパーパラメータの調整を行い、モデルの性能を最適化します。

  6. 結果の解釈と報告:モデルの結果を解釈し、ビジネスや実務への洞察を提供します。

次に進む前に、特に注力したい領域や、さらに詳しく知りたいトピックがあれば、ぜひお知らせください。また、データの前処理やモデル構築の具体的な実装についてのサポートが必要な場合も、お気軽にご相談ください。

この辺りは一般論なので、あえてChatGPTに聞かずとも得られる知識かもしれません。

機械学習モデルの構築についても

最近はもうあんまり驚かなくなってしまいましたが、勾配ブースティングのライブラリを使った機械学習コードも直ちに生成してくれました。

ふむふむ。EDAで得られた知見からすると、age, sex, pclassが、surviveを予測する上で有望そうだと思います。これらを勾配ブースティングの特徴量とするのが出発点だと考えましたが、いかがでしょうか? よさそうなら、どのようなコードを書けばいいか生成してみてほしいです。

ChatGPTは出力に文章補足を入れてくれていましたが、ここではコードのみを示します。

import pandas as pd
import xgboost as xgb
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.preprocessing import LabelEncoder

# データの準備
features = ['age', 'sex', 'pclass']
target = 'survived'

# カテゴリ変数を数値に変換
le = LabelEncoder()
titanic['sex'] = le.fit_transform(titanic['sex'])

# 欠損値の処理
titanic['age'].fillna(titanic['age'].median(), inplace=True)

# 特徴量とターゲットの分割
X = titanic[features]
y = titanic[target]

# 訓練セットとテストセットに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデルの構築と訓練
model = xgb.XGBClassifier(use_label_encoder=False, eval_metric='logloss')
model.fit(X_train, y_train)

# モデルの評価
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')

ちなみにこのコード、欠損値の補完やデータの分割(訓練データとテストデータを分ける)などもいい感じに対応してくれています。特に細かい指示は出してないのですが。

ここでChatGPTが暗黙のうちに採用した(しなかった)手法について会話することもできます。例えば、pclassはone-hot encodingする方が意味的に自然なのでは?といった疑問に対してトレードオフを提示してくれます。

そもそもみたいな話ですが、決定木ベースの機械学習モデルを使おうと提案してきたのもChatGPTです。ベースラインの機械学習モデルをまず作るべきか?などの方法論について会話していた時に教えてくれました。

現代においては、ランダムフォレストや勾配ブースティングマシン(例:XGBoost、LightGBM)などのアンサンブルモデルも、比較的簡単に実装でき、強力なベースラインモデルとなり得ます。これらはより複雑なモデルですが、多くの機械学習コンペティションや実務で良好なパフォーマンスを示しています。

やってみた感想と発見

総合的に言って満足度は高かったです。データ分析に関心があったとしても、それをするためにはまずデータセットの準備がいるなど、ちょっとしたハードルはいくつもあります。筆者の場合はそういったハードルを越えるのが面倒に感じ、学習に二の足を踏みがちでした。

ChatGPTの場合は手早い手段を提示して 「押して」くれる ので、モチベーションを保ちながら手を動かす部分に集中できた感じがします。

巷でしばしば言われる、ChatGPTによって仕事の生産性が向上するかもしれないという話がありますが:

https://note.com/m_datasci/n/n52a4e7f79287

スキルの学習においても、同様の効果が一定程度当てはまるかもしれないと感じました。

タイタニックの典型的な「答え」を知っていた

会話をしている様子からすると、ChatGPTはタイタニックデータセットの一般的な解釈について知識があるので、筆者の提示する仮説にうまく反応してくれました。

例えば筆者が 港Cは運賃が高い傾向にあり、彼らは生存しやすかったように見えます と投げかけると解説をしてくれました。これはその一部です。

あなたの観察とストーリーの類推は、データから得られる洞察をうまく反映しており、かなり妥当性があると考えられます。あなたが行った sns.catplot による可視化は、embarked(乗船した港)、fare(運賃)、そして survived(生存)の関係を探るのに適した方法です。この分析から得られる主な洞察をまとめると以下のようになります:

  1. 港C(シェルブール)からの乗客は高運賃を支払っていた:これは、シェルブールがフランスに位置し、裕福なヨーロッパ大陸の乗客が利用していた可能性を示唆しています。これらの乗客は高い社会経済的地位を持っており、より良い客室(第一クラスや第二クラス)に滞在していた可能性が高いです。
    (省略)

答えを知りつつ解説をしてくれる点で、ChatGPTはまさに教師という感じです。有名なデータセットを題材に選んだことも成功理由かもしれません。よりマイナーなデータセットを学習教材に選んでいたとしたら、ここまで上手くいかなかったかも?

アドバイスと生成コードがシームレスにつながる体験は他の学習手段では得難い

ある関係を調べたいとなった時に、すぐにそれができるコードを生成してくれるのは非常にありがたかったです。書籍等のチュートリアルだとそういった柔軟性はありません。

機械学習やデータ分析の専門家に付きっきりになってもらうと、学習効率はより高いかもしれません。しかし人に見てもらうのは(自分も相手も)それなりに大変なので、人間を介さずに、しかしインタラクティブな練習ができるのは画期的だと感じました。

たまに出力が怪しい

具体的に述べるのが難しいのですが、しばしば生成される会話が怪しいなと感じることがありました。

  • 現在の会話のコンテキストを踏まえて返答してほしいところ、妙に一般論に逃げるというか、具体性がないぼんやりした話を提示してくることがありました。そういった会話はあまり有益でない事が多いと感じました
    • プロンプトエンジニアリングの観点、つまり文章の投げ方がよくないなど、筆者側の問題もあるかもしれません
  • 提示してくれるコードは、以前のコードとうまく辻褄が合わず、動作しないコードを出力することがありました。

また、会話セッションの最初の方は比較的スムーズな印象がある一方で、セッションが進んで会話のコンテキストが深くなると、学習セッションであったことを忘れているような印象を抱きました。事実かは分かりませんが、会話が長くなるとコンテキストを捉えきれなくなるのかもしれないと感じました。

現在だと一定の限界を感じる部分もありますが、AIモデルの開発・改良は盛んにおこなわれているので、近い将来にはまた違った結果が得られるのかもしれません。

背景知識が皆無だとちょっと辛いかも

今回、セッションに入る前の環境構築は自力で行い、PythonやらJupyterLabやらを準備したりするのは自前で行いました。ChatGPTの力は借りていません。ほとんど引っかかる場所はなく、ただ面倒だっただけですが、細かいハマりポイントはいくつもありました。

例えば、Graphvizが足りてないのでインストールしたが環境変数が効いておらず、PCの再起動が必要でした。

https://qiita.com/daimyo404/items/cbed720c6ed90945246b

他にも、xgboostを使おうとしたらsklearnとの干渉関係があるのか? 一回アンインストールをしなければならなかった事もありました。

https://stackoverflow.com/questions/52818807/xgboosterror-sklearn-needs-to-be-installed-in-order-to-use-this-module-gcp-da

そういった、細かいトラブルはいくつかありました。

これらはもちろん難しい問題ではないですが、ChatGPTに聞きながら解決策を探っていたとしたら、非常に時間がかかったはずです。チャットによる文章生成はそれほど高速ではなく、そもそも状況を説明する文章を書くのもそれなりにコストがかかります。解決するかも定かではありません。例えば、エラーメッセージを元に検索する方がずっと効率的なはずです。

つまりは、断片的であっても多少の知識があったからこそ、チャットによる学習セッションが効率よく成立したのかもしれません。チャット形式で必要な情報を取り出すのは、独特の癖がある印象を持ちました。

まとめ

GPTの一種であるData Analysis GPTに教わりながら、データ分析や機械学習の基礎について学習しました。学習にはタイタニックデータセットを題材として使いましたが、Data Analysis GPTは一般論のみならずこのデータセットについての知識も持っていたので、筆者のさまざまな疑問に答えながらセッションを進めてくれました。

細かい問題は感じられたものの、データ分析の各段階で適切そうなアドバイスがもらえ、学習効果はまずまず高かったのではないかと感じました。

また、能動的に行わなければならない資料読みなどと比較して、Data Analysis GPTの「押してくれる・促してくれる」感じはとてもユニークで、有益に感じました。

今回はたまたま、初学者がタイタニックデータセットに対して行ったから比較的上手くいったのかもしれず、別のデータセットや状況下で試してみるのも一興かもしれないですね。

Discussion