ChatGPTのデータ分析プラグインNoteableで遊んでみよう!
ChatGPTのデータ分析プラグインのNoteableが便利だとSNSで話題になっています。しかし、データ分析と言われても、何に使えばよいのかよく分からないという人も多いでしょう。
そこで、まずはNoteableを使っていろいろなことをやってみて、使い方に慣れるところから始めましょう。
1.Noteableの概要と使い方
Noteableは、PythonやSQLなどのコードを自動的に生成して実行し、グラフなどを作成してデータを可視化することもできるデータ分析ツールで、ChatGPTのプラグインとして提供されています。
ChatGPTの機能と組み合わせることで、自然言語による指示でデータ分析を行うコードを生成・実行し、結果をグラフで可視化することなどができます。
ChatGPTのプラグインは、有料プラン(月20ドル)のChatGPT Plusに加入すれば利用できます。Noteableのプラグインを使用する場合は、予めプラグインストアからNoteableをインストールして、セットしておいてください。
2.100までの素数を調べる
NoteableプラグインをセットしたChatGPTに100までの素数を調べてもらいました。
100までの素数を求めてください。
ちなみに、ノートブックを開くと、以下のようなコードが自動生成されていました。
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本です。
その場合、亀は何匹いますか?
ちなみに、ノートブックを開くと、以下のようなコードが自動生成されていました。
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]
さらに、この問題の解法を可視化してもらいました。
この問題の解法を可視化してください。
このように、簡単な指示でグラフを書いてもらうこともできます。
4.ポケモンの強さを比較する
Noteableプラグインをセットした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が全部やってくれました。
さらに、各ポケモンの特徴が一目で分かるようにレーダーチャートも作成してもらいました。
この結果をレーダーチャートで表してください。
このレーダーチャートを描くために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プラグインは、以下のようにポケモンの画像を表示することができます。
ピカチュウとヒトカゲとゼニガメの画像を示してください。
5.天気予報を調べる
NoteableプラグインをセットしたChatGPTに天気予報を調べてもらいました。
https://api.open-meteo.com/v1/forecastから東京の天気予報の情報を入手して、絵文字付きで、元気なお天気お姉さん風に伝えてください。
current_weatherのパラメータを使用してください。
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」のパラメータを使用するよう指定することによって、失敗せずにデータを取り込めるようになりました。
次に、沖縄の天気について伝えてもらいます。
次は、沖縄の天気を教えてください。
今回、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のデータを利用して、大谷翔平選手の投手成績と打者成績の相関関係を分析してください。
ERA:防御率 IP:投球回数 SO:奪三振数
AVG:打率 HR:ホームラン数 RBI:打点
なお、ここまでに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
相関係数を計算するために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に可視化してもらいました。
この結果を可視化してください。
これを見ると、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()
最後に、この結果を野球解説者の落合博満さんに解説してもらいました。
野球解説者の落合博満さんとして、この結果を解説してください。
今回のデータ分析は少しあてにならないところもありましたが、このように、Noteableプラグインは、工夫次第で様々なデータ分析に活用することができますので、皆さんも是非、使ってみてください。