メインコンテンツへスキップ
見出し画像

ChatGPTのデータ分析プラグインNoteableで遊んでみよう!

    ChatGPTのデータ分析プラグインのNoteableが便利だとSNSで話題になっています。しかし、データ分析と言われても、何に使えばよいのかよく分からないという人も多いでしょう。
    そこで、まずはNoteableを使っていろいろなことをやってみて、使い方に慣れるところから始めましょう。


    1.Noteableの概要と使い方

    Noteableは、PythonやSQLなどのコードを自動的に生成して実行し、グラフなどを作成してデータを可視化することもできるデータ分析ツールで、ChatGPTのプラグインとして提供されています。
    ChatGPTの機能と組み合わせることで、自然言語による指示でデータ分析を行うコードを生成・実行し、結果をグラフで可視化することなどができます。

    ChatGPTのプラグインは、有料プラン(月20ドル)のChatGPT Plusに加入すれば利用できます。Noteableのプラグインを使用する場合は、予めプラグインストアからNoteableをインストールして、セットしておいてください。

    画像
    プラグインストアのNoteableプラグイン

    2.100までの素数を調べる

    NoteableプラグインをセットしたChatGPTに100までの素数を調べてもらいました。

    100までの素数を求めてください。
    画像
    ChatGPTの回答

    ちなみに、ノートブックを開くと、以下のようなコードが自動生成されていました。

    def is_prime(n):
        if n <= 1:
            return False
        elif n <= 3:
            return True
        elif n % 2 == 0 or n % 3 == 0:
            return False
        i = 5
        while i * i <= n:
            if n % i == 0 or n % (i + 2) == 0:
                return False
            i += 6
        return True
    
    primes = [x for x in range(101) if is_prime(x)]
    primes

    このように、Noteableプラグインは、入力したプロンプトの内容から判断して、自動でコードを生成して実行し、回答を出力することができます。


    3.鶴亀算を解く

    NoteableプラグインをセットしたChatGPTに鶴亀算を解いてもらいました。

    鶴の足は2本、亀の足は4本です。鶴と亀の合計は5匹で、足の数を合計すると14本です。
    その場合、亀は何匹いますか?
    画像
    ChatGPTの回答

    ちなみに、ノートブックを開くと、以下のようなコードが自動生成されていました。

    from sympy import symbols, Eq, solve
    
    T, K = symbols('T K')  # 鶴の数 T、亀の数 K
    
    # 方程式を設定
    eq1 = Eq(T + K, 5)  # 鶴と亀の合計数
    eq2 = Eq(2*T + 4*K, 14)  # 足の合計数
    
    # 連立方程式を解く
    solution = solve((eq1,eq2), (T, K))
    solution[K]

    さらに、この問題の解法を可視化してもらいました。

    この問題の解法を可視化してください。
    画像
    ChatGPTの回答

    このように、簡単な指示でグラフを書いてもらうこともできます。


    4.ポケモンの強さを比較する

    NoteableプラグインをセットしたChatGPTに、ピカチュウとヒトカゲとゼニガメの強さを比較してもらいました。

    ピカチュウとヒトカゲとゼニガメの強さを比較するグラフを作成してください。
    画像
    ChatGPTの回答①
    画像
    ChatGPTの回答②
    画像
    ChatGPTの回答③

    この棒グラフを描くためにNoteableが自動生成したコードは以下のとおりです。

    import matplotlib.pyplot as plt
    
    # データフレームを転置
    df_transposed = df.set_index('Pokemon').T
    
    # 棒グラフを作成
    df_transposed.plot(kind='bar', figsize=(12, 6))
    plt.title('Base Stats of Pikachu, Charmander, and Squirtle')
    plt.ylabel('Value')
    plt.xlabel('Stat')
    plt.show()

    最初の手順では、「基本ステータスを手動で入力します。」となっていましたが、実際には、ChatGPTが全部やってくれました。

    さらに、各ポケモンの特徴が一目で分かるようにレーダーチャートも作成してもらいました。

    この結果をレーダーチャートで表してください。
    画像
    ChatGPTの回答④

    このレーダーチャートを描くためにNoteableが自動生成したコードは以下のとおりです。

    import numpy as np
    
    # レーダーチャートを作成するための準備
    labels=np.array(['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed'])
    num_vars = len(labels)
    
    # 各ポケモンのステータス
    stats = df.drop(columns='Pokemon').values
    
    # 角度を計算
    angles = np.linspace(0, 2 * np.pi, num_vars, endpoint=False).tolist()
    
    # チャートを閉じるために最初の角度を追加
    angles += angles[:1]
    
    # 描画
    fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
    for i, color in enumerate(['orange', 'red', 'blue']):
        values = stats[i].tolist()
        values += values[:1]
        ax.plot(angles, values, color=color, linewidth=1, label=df['Pokemon'][i])
        ax.fill(angles, values, color=color, alpha=0.25)
    
    # グラフの見た目を整える
    ax.set_theta_offset(np.pi / 2)
    ax.set_theta_direction(-1)
    ax.set_thetagrids(np.degrees(angles[:-1]), labels)
    ax.set_rlabel_position(180 / num_vars)
    ax.set_yticklabels([])
    ax.set_ylim(0, 100)
    ax.legend(loc='upper right', bbox_to_anchor=(1.3, 1.1))
    plt.title('Base Stats of Pikachu, Charmander, and Squirtle')
    plt.show()

    このように、データを基に様々なグラフを作成することができ、グラフの見方も示してくれます。

    ちなみに、Wolframプラグインは、以下のようにポケモンの画像を表示することができます。

    ピカチュウとヒトカゲとゼニガメの画像を示してください。
    画像
    WolframプラグインをセットしたChatGPTの回答

    5.天気予報を調べる

    NoteableプラグインをセットしたChatGPTに天気予報を調べてもらいました。

    https://api.open-meteo.com/v1/forecastから東京の天気予報の情報を入手して、絵文字付きで、元気なお天気お姉さん風に伝えてください。
    current_weatherのパラメータを使用してください。
    画像
    ChatGPTの回答①
    画像
    ChatGPTの回答②

    Open-MeteoのAPIから天気情報を取得するためにNoteableが自動生成したコードは以下のとおりです。

    import requests
    import json
    def get_weather_forecast():
        url = 'https://api.open-meteo.com/v1/forecast'
        params = {'latitude': 35.6895, 'longitude': 139.6917, 'current_weather': True}
        response = requests.get(url, params=params)
        data = response.json()
        return data
    weather_data = get_weather_forecast()
    weather_data
    def weather_forecast_message(weather_data):
        temperature = weather_data['current_weather']['temperature']
        windspeed = weather_data['current_weather']['windspeed']
        weathercode = weather_data['current_weather']['weathercode']
        is_day = weather_data['current_weather']['is_day']
        time = weather_data['current_weather']['time']
        if weathercode <= 50:
            weather_emoji = '☀️'
            weather_status = '晴れ'
        elif weathercode <= 100:
            weather_emoji = '🌧️'
            weather_status = '雨'
        elif weathercode <= 200:
            weather_emoji = '❄️'
            weather_status = '雪'
        else:
            weather_emoji = '☁️'
            weather_status = '雲'
        day_night = '昼' if is_day else '夜'
        message = f'こんにちは!今日の東京の天気は{weather_emoji} {weather_status}です!\n'
        message += f'現在の気温は{temperature}度、風速は{windspeed}m/sです。\n'
        message += f'現在の時間は{time}で、{day_night}です。\n'
        message += '素敵な一日をお過ごしください!🌈'
        return message
    forecast_message = weather_forecast_message(weather_data)
    forecast_message

    最初は、APIからの天気情報の取り込みが上手くいかなかったのですが、「current_weather」のパラメータを使用するよう指定することによって、失敗せずにデータを取り込めるようになりました。

    次に、沖縄の天気について伝えてもらいます。

    次は、沖縄の天気を教えてください。
    画像
    ChatGPTの回答③

    今回、Noteableが自動生成したコードは以下のとおりです。

    def get_weather_forecast(latitude, longitude):
        url = 'https://api.open-meteo.com/v1/forecast'
        params = {'latitude': latitude, 'longitude': longitude, 'current_weather': True}
        response = requests.get(url, params=params)
        data = response.json()
        return data
    okinawa_weather_data = get_weather_forecast(26.5013, 127.9454)
    okinawa_weather_data
    okinawa_forecast_message = weather_forecast_message(okinawa_weather_data)
    okinawa_forecast_message

    このように、Noteableプラグインは、外部からデータを取得し、そのデータを加工して出力することができます。


    6.大谷選手の成績を分析する

    NoteableプラグインとWebPilotプラグインをセットしたChatGPTに大谷選手の成績を分析してもらいました。

    必要なデータは、メジャーリーグの歴史に登場するすべての選手の野球統計データを提供するBaseballReferenceのWebサイトから入手します。WebPilotプラグインは、Webサイトからのデータの取得を補助するために使用しました。

    https://www.baseball-reference.com/players/o/ohtansh01.shtmlのデータを利用して、大谷翔平選手の投手成績と打者成績の相関関係を分析してください。
    画像
    ChatGPTの回答①

    ERA:防御率 IP:投球回数 SO:奪三振数
    AVG:打率 HR:ホームラン数 RBI:打点

    画像
    ChatGPTの回答②

    なお、ここまでにNoteableが自動生成したコードは以下のとおりです。

    import pandas as pd
    from scipy.stats import pearsonr
    
    # 投手成績データ
    pitching_data = {
        'Year': [2018, 2019, 2020, 2021, 2022, 2023],
        'ERA': [3.31, 0.00, 37.80, 3.18, 2.56, 2.58],
        'IP': [51.2, 0.0, 1.2, 130.1, 77.1, 94.0],
        'SO': [63, 0, 3, 156, 89, 115]
    }
    pitching_df = pd.DataFrame(pitching_data)
    
    # 打者成績データ
    batting_data = {
        'Year': [2018, 2019, 2020, 2021, 2022, 2023],
        'AVG': [.285, .286, .190, .257, .269, .272],
        'HR': [22, 18, 7, 46, 41, 28],
        'RBI': [61, 62, 24, 100, 98, 70]
    }
    batting_df = pd.DataFrame(batting_data)
    
    pitching_df, batting_df
    画像
    ChatGPTの回答③

    相関係数を計算するためにNoteableが自動生成したコードは以下のとおりです。

    # データフレームをマージする
    df = pd.merge(pitching_df, batting_df, on='Year')
    
    # ERAとAVGの相関関係を計算する
    corr_era_avg, _ = pearsonr(df['ERA'], df['AVG'])
    
    # ERAとHRの相関関係を計算する
    corr_era_hr, _ = pearsonr(df['ERA'], df['HR'])
    
    # ERAとRBIの相関関係を計算する
    corr_era_rbi, _ = pearsonr(df['ERA'], df['RBI'])
    
    # IPとAVGの相関関係を計算する
    corr_ip_avg, _ = pearsonr(df['IP'], df['AVG'])
    
    # IPとHRの相関関係を計算する
    corr_ip_hr, _ = pearsonr(df['IP'], df['HR'])
    
    # IPとRBIの相関関係を計算する
    corr_ip_rbi, _ = pearsonr(df['IP'], df['RBI'])
    
    # SOとAVGの相関関係を計算する
    corr_so_avg, _ = pearsonr(df['SO'], df['AVG'])
    
    # SOとHRの相関関係を計算する
    corr_so_hr, _ = pearsonr(df['SO'], df['HR'])
    
    # SOとRBIの相関関係を計算する
    corr_so_rbi, _ = pearsonr(df['SO'], df['RBI'])
    
    corr_era_avg, corr_era_hr, corr_era_rbi, corr_ip_avg, corr_ip_hr, corr_ip_rbi, corr_so_avg, corr_so_hr, corr_so_rbi

    このように、Noteableは外部のデータを取り入れ、自動的にコードを作成して実行することにより、データ分析を行うことができます。

    次に、この相関分析の結果が分かりやすくなるようにNoteableに可視化してもらいました。

    この結果を可視化してください。
    画像
    ChatGPTの回答④
    画像
    ChatGPTの回答⑤

    これを見ると、ERA(防御率)とAVG(打率)の負の相関というのは、かえって、投手成績の良い(防御率が低い)ときは、打者成績も良い(打率が高い)ということを表しているように見えますが。。。

    散布図を描くためにNoteableが自動生成したコードは以下のとおりです。

    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 投手成績データ
    pitching_data = {
        'Year': [2018, 2019, 2020, 2021, 2022, 2023],
        'ERA': [3.31, 0.00, 37.80, 3.18, 2.56, 2.58],
        'IP': [51.2, 0.0, 1.2, 130.1, 77.1, 94.0],
        'SO': [63, 0, 3, 156, 89, 115]
    }
    pitching_df = pd.DataFrame(pitching_data)
    
    # 打者成績データ
    batting_data = {
        'Year': [2018, 2019, 2020, 2021, 2022, 2023],
        'AVG': [.285, .286, .190, .257, .269, .272],
        'HR': [22, 18, 7, 46, 41, 28],
        'RBI': [61, 62, 24, 100, 98, 70]
    }
    batting_df = pd.DataFrame(batting_data)
    
    # データフレームをマージする
    df = pd.merge(pitching_df, batting_df, on='Year')
    
    # ERAとAVGの散布図をプロットする
    plt.figure(figsize=(10, 6))
    sns.scatterplot(x='ERA', y='AVG', data=df)
    plt.title('ERA vs AVG')
    plt.show()
    
    # IPとHRの散布図をプロットする
    plt.figure(figsize=(10, 6))
    sns.scatterplot(x='IP', y='HR', data=df)
    plt.title('IP vs HR')
    plt.show()
    
    # SOとRBIの散布図をプロットする
    plt.figure(figsize=(10, 6))
    sns.scatterplot(x='SO', y='RBI', data=df)
    plt.title('SO vs RBI')
    plt.show()

    最後に、この結果を野球解説者の落合博満さんに解説してもらいました。

    野球解説者の落合博満さんとして、この結果を解説してください。

    入力 野球解説者の落合博満さんとして、この結果を解説してください。

    出力 落合博満氏の視点からこの結果を解説すると、以下のようになります。

    まず、大谷翔平選手の投手成績(ERA、IP、SO)と打者成績(AVG、HR、RBI)の間には一定の相関関係が見られます。特に、ERA(防御率)とAVG(打率)の間には強い負の相関が見られ、これは防御率が低い(つまり、投手としてのパフォーマンスが良い)年は打率が低い傾向にあり、逆に防御率が高い(投手としてのパフォーマンスが低い)年は打率が高い傾向にあることを示しています。これは、大谷選手が投手としての活躍が多い年は打者としてのパフォーマンスが低下する傾向にあることを示唆しています。

    一方で、IP(投球回数)とHR(ホームラン数)、SO(奪三振数)とRBI(打点)の間には強い正の相関が見られます。これは、多くのイニングを投げたり、多くの奪三振を記録したりする(つまり、投手としての活躍が多い)年は、ホームラン数や打点も増える傾向にあることを示しています。これは、大谷選手が投手としての活躍が多い年でも、打者としてのパフォーマンスが高いレベルを維持できる能力を持っていることを示しています。

    これらの結果から、大谷選手の投手と打者のパフォーマンスは一定の相関関係を持っていることがわかりますが、その関係性は一概には定義できません。大谷選手のように投手と打者の両方で活躍する選手は珍しく、そのパフォーマンスは多くの要素によって影響を受けます。したがって、これらの結果はあくまで一部の観察に過ぎず、より広範なデータと詳細な分析が必要となるでしょう。

    また、落合氏のようなデータ分析に基づく野球の戦略を提唱する者にとって、このような分析は非常に有用です。大谷選手のような二刀流の選手をどのように最適に活用するか、そのパフォーマンスのバランスを理解することは、チーム全体の戦略を考える上で重要な要素となります。大谷選手のような二刀流の選手は、その存在自体がチームにとって大きな戦略的価値を持っています。投手としても打者としても高いパフォーマンスを発揮できる彼の能力は、相手チームに対するプレッシャーを増加させ、我々のチームが有利に試合を進めることを可能にします。

    しかし、その一方で、彼の投手としてのパフォーマンスが打者としてのパフォーマンスに影響を与える可能性があることも、このデータから読み取ることができます。特に、防御率が低い年は打率が低く、防御率が高い年は打率が高いという傾向は、彼の体力管理や試合の起用法について考える上で重要な示唆を与えています。

    これらの情報を踏まえ、大谷選手を最大限に活用するためには、彼の体調やコンディションを常にチェックし、投手としての起用と打者としての起用を適切にバランスさせることが求められます。また、彼のパフォーマンスに影響を与える可能性のある他の要素、例えば試合の状況や対戦相手の投手なども考慮に入れる必要があります。

    データ分析は、これらの判断を行う上で非常に有用なツールとなります。大谷選手のような特異な才能を持つ選手をどのように活用するかは、常に試行錯誤を伴うものですが、データに基づく分析により、より科学的かつ効率的な戦略を立てることが可能となります。

    ChatGPTの回答⑥

    今回のデータ分析は少しあてにならないところもありましたが、このように、Noteableプラグインは、工夫次第で様々なデータ分析に活用することができますので、皆さんも是非、使ってみてください。


     
     
    AI小説家、プロンプトエンジニア、GPTs職人。最新のAI技術やAIサービスの利用法を分かりやすく解説する記事をnoteで公開しています。GPTsについてのガイドブック「GPTsでChatGPTを優秀な部下にしよう!」 https://amzn.to/4dd0FYJ 絶賛発売中。

    あなたへのおすすめ