「GPT-4の能力と限界を探索する」
Exploring the capabilities and limitations of GPT-4.
新しい、より高度なGPT-4が、前身であるChatGPT 3.5と比べてどのような違いがあるのか、気になったことはありませんか?
GPT-4が特筆すべき点は何であり、どこで限界に達するのでしょうか?
言語モデルの制約とその潜在的な応用について深く探求する際には、これらの微妙なニュアンスを理解することが重要です。
- NumPyを使用した効率的なk最近傍(k-NN)解
- 「もしスローガンが真実だったら(ChatGPTによると)」
- 「PIP、Conda、requirements.txtを忘れましょう!代わりにPoetryを使って、私に感謝してください」
人工知能の領域におけるこの旅を通じて、ChatGPT 4の特徴的な機能、革新的なプラグイン、およびそれらがデータサイエンスの技術的な問題や課題の解決方法を革新している方法について強調していきます。
統計や確率の複雑さに取り組むことから、Python、SQL、またはRを使用した複雑なモデリング問題やコーディングクエリに対処することまで、GPT-4がデータサイエンスにおいてどのように支援できるかを探求していきます。
それでは、この探求的な旅に乗り出し、GPT-4とそのデータサイエンスに対するアプローチを再構築する能力の奥にあるものを明らかにしていきましょう!
ChatGPT 3.5とChatGPT 4
GPT-3.5、またはChatGPTとしても知られるものは、OpenAIによって2022年11月に一般公開されました。
それはすぐに世界中で人気を博しました。時にはサーバーの容量を超えるほどの人気ぶりであり、それに対応するためにOpenAIは有料バージョンのChatGPT Plusを導入しました。
GPT-3.5から進化したGPT-4は、3月14日にリリースされました。これには大幅なアップグレードが施されています。
それは高度な推論能力を持っており、テキストではなくデータ(写真など)から意味を生成することもできますが、現行のChatGPT+のバージョンはテキストの出力のみです。
GPT-4の問題解決能力は、GPT-3.5よりも正確です。
現在、有料バージョンのChatGPT+の価格は月額20ドルです。ただし、3時間ごとに25件のメッセージの制限などもあります。
また、マイクロソフトの検索エンジンBingは、カスタマイズされたGPT-4のバージョンを実行しています。
詳細については、OpenAIのウェブサイト上の公式ブログ記事をご覧ください。
ChatGPTプラグイン
OpenAIは3月23日に、ChatGPT向けの新機能であるプラグインを発表しました。
これらのツールは、言語モデルの機能を拡張し、最新の情報へのアクセスや計算を行うことができるように設計されています。
これらのプラグインの展開は、実用性、影響、および潜在的な安全性や整合性の問題を評価するために段階的に行われています。
KAYAK、Klarna、Milo、Shopify、Slack、Speak、Wolfram、Zapierなど、さまざまな企業が最初のプラグインセットを開発しています。
これらのプラグインは、旅行の計画、食料品の注文、計算へのアクセス、リアルタイムデータの取得など、幅広い機能を提供しています。
OpenAIはまた、ウェブブラウザとコードインタプリタの2つのプラグインも提供しています。
ウェブブラウザはGPTモデルの力を使ってウェブにアクセスすることができますし、コードインタプリタはプロンプトだけでデータを操作し分析するのに役立ちます。
NoteableやWolframなどのいくつかのプラグインは、特にデータサイエンスで役立ちます。
これらのプラグインは、ChatGPTの有用性を高めることを目的としています。
データサイエンスの技術的な質問にGPT-4は使えるのか?
データサイエンスの質問は、コーディングと非コーディングの面で分けることができます。
ChatGPT4の能力をこれらのセクションでテストすることで、データサイエンスの技術的な質問にGPT-4がどのように使えるかをより良く理解することができます。
まずは非コーディングの質問から始めましょう。
非コーディングの質問
ここでは、非コーディングの質問を統計、確率、およびモデリングに分けます。
統計
統計は、データ収集、分析、解釈、表示、および整理を含むデータサイエンスにおいて重要です。
GPT-4は統計的な概念についての質問に答える能力を持ち、複雑な統計原理の包括的な理解を提供します。
GPT-4をこのように使用することで、統計理論の理解が向上し、データサイエンティストがデータから有意義な洞察を抽出する能力が向上します。
ここに、チャットの能力をテストするために使用する統計の問題があります。計算を行う際にユーザーを支援するWolframプラグインを使用します。
また、ChatGPT-4とそのプラグインを使用する際の重要な注意点として、それらは優れているかもしれませんが、常に出力を二重チェックする必要があるということです。間違っている可能性があるためです。
プロンプト: なぜMSEは線形回帰の損失関数として頻繁に使用されるのですか?
(Wolframプラグインを使用し、数式を提供する)
ChatGPT : MSEの数式は次のようになります:
ここで:
MSEが一般的に使用される理由は次のとおりです:
- 微分可能性: MSEは滑らかで微分可能な関数です。これは最小値を見つけるために勾配降下などの最適化アルゴリズムが関数の導関数に依存するため重要です。
- 外れ値への感度: MSEの二乗項は大きな誤差により高い重みを与えます。これはモデルが外れ値に対してより感度を持ち、大きな誤差を最小化しようとすることを意味します。
- 解釈可能性: MSEは予測値と実際の値の平均二乗差を表すため、解釈が容易です。より低いMSEはモデルがデータにより適合していることを示します。
- 凸性: MSEは凸損失領域につながります。凸問題には単一のグローバル最小値があり、最適化アルゴリズムを使用して解くのが容易です。
- OLSとの整合性: 線形回帰の場合、MSEを最小化することはOrdinary Least Squares (OLS) において残差を最小化することと同等であり、線形回帰モデルのパラメータを推定するための標準的な方法です。
著者の注: MSEにはこれらの利点があるものの、すべての回帰問題にとって常に最良の選択肢とは限りません。データの特性や問題の性質によって、他の損失関数の方が適している場合もあります。
制御
ChatGPTの回答は詳細で正確です。
確率
確率はデータサイエンスにとって不可欠であり、データの予測と不確実性の理解に構造を提供します。確率は数学的な計算と論理の背後にある特定のイベントの発生確率を詳細に説明することができます。
これにより、データサイエンティストはモデルの構築と確率的な推論に基づいた賢明な意思決定を行うことができます。
ここに、ChatGPTが解決しようとする確率の問題があります。
プロンプト: 2つの公正な6面サイコロを振るゲームを友達とプレイしています。2つのサイコロの合計が7または11であればあなたの勝ちです。そうでなければ、友達の勝ちです。最初のロールで勝つ確率は何ですか?
ChatGPT: 最初のロールで勝つ確率を求めるには、好ましい結果(勝利の結果)の数を計算し、可能な結果の総数で割る必要があります。
この場合、各サイコロには6つの面がありますので、2つのサイコロを振るときの結果の総数は: 66 = 36
最初のロールで勝つためには、2つのサイコロの合計が7または11でなければなりません。好意的な結果の数を以下のように計算することができます:
- 7の合計:この結果を達成する方法は6通りあります:(1, 6)、(2, 5)、(3, 4)、(4, 3)、(5, 2)、および (6, 1)。
- 11の合計:この結果を達成する方法は2通りあります:(5, 6) と (6, 5)。
したがって、好意的な結果は合計で 6 + 2 = 8 通りあります。
さて、最初のロールで勝つ確率を計算するために、好意的な結果の数を全ての可能な結果の数で割ります:
最初のロールで勝つ確率 = 好意的な結果の数 / 全ての可能な結果の数 = 8 / 22 = 2 / 9 = 0.222
したがって、最初のロールで勝つ確率はおおよそ0.222または22.2%です。
制御
出力は正しく、プラットフォームの解決策と一致しています。
モデリング
モデリングは、システムの数学的な表現を形成し、振る舞いを分析および予測するプロセスです。
これにより、データサイエンティストは結果の概念、仮定、実装、および解釈を理解することができます。これにより、予測の向上とデータの理解が得られます。
以下は、テストするモデリングの質問です。
プロンプト:K-meansアルゴリズムはどのように動作しますか?
ChatGPT:K-meansアルゴリズムは、与えられたデータセットをK個のクラスタに分割することを目指す反復クラスタリングアルゴリズムです。ここで、Kはユーザーが定義するパラメータです。
以下のように動作します:
- 初期化:データセットからK個のデータポイントをランダムに選択し、クラスタの初期セントロイド(代表点)とします。
- 割り当て:距離メトリック(通常はユークリッド距離)に基づいて、各データポイントを最も近いセントロイドに割り当てます。このステップにより、K個のクラスタが形成されます。
- 更新:各クラスタに割り当てられたすべてのデータポイントの平均を取ることで、クラスタのセントロイドを再計算します。このステップは、各クラスタの中心を表すより良いセントロイドを見つけることを目指しています。
- 反復:割り当てと更新のステップを収束するまで反復的に繰り返します。収束は、セントロイドが大幅に変化しなくなるか、最大反復回数に達したときに発生します。
- 出力:アルゴリズムは、各データポイントが最も近いセントロイドに属する最終的なK個のクラスタを返します。
K-meansアルゴリズムは、クラスタ内の二乗距離の総和(慣性またはトータルクラスタ内分散とも呼ばれます)を最小化しようとします。クラスタは球状で等しい分散を持つと仮定されます。ただし、セントロイドの初期化によって、アルゴリズムは最適ではない解に収束する可能性があります。
K-meansのパフォーマンスを向上させるためには、複数の初期化を使用したり、よりスマートなセントロイドの初期化方法(例:K-means++)を実行したり、エルボ法を使用して最適なKの値を決定したりするなど、さまざまな技術が適用できます。
K-meansは初期のセントロイドの選択に敏感であり、非線形または不規則な形状のクラスタを含むデータセットでは問題が発生する場合があります。そのような場合には、DBSCANやガウス混合モデル(GMM)などの代替クラスタリングアルゴリズムがより適している場合があります。
制御
ChatGPTの回答は詳細で正しいです。
コーディングの質問
データサイエンティストにとって、コーディングは必須です。データの整理や機械学習のためのPythonの使用、データベースの操作のためのSQL、統計計算のためのRなどが含まれます。GPT-4はコーディングの問題を解決するのに役立ちます。 Image by Author
Pythonから始めて、コーディングの質問でChatGPT-4をテストしましょう。
Python(パイソン)
Pythonはデータサイエンスコミュニティで好まれる言語であり、ユーザーフレンドリーな性質やpandas、numpy、scikit-learnなどの堅牢なライブラリの存在があります。
GPT-4はPythonコードのデバッグ支援、最適なコーディング手法の推奨、特定のタスクのためのコードスニペットの生成など、さまざまなことに役立つことができます。
次に、以下の質問を試してみましょう。
質問1
以下が質問です。
プロンプト:
私のデータセットの名前はairbnb_search_detailsであり、以下に詳細情報があります。
Unnamed: 0:int64
id:int64
price:float64
property_type: object
room_type: object
amenities:object
accommodates:int64
bathrooms:int64
bed_type:object
cancellation_policy:object
cleaning_fee:bool
city:object
host_identity_verified:object
host_response_rate:object
host_since:datetime64[ns]
neighbourhood:object
number_of_reviews:int64
review_scores_rating:float64
zipcode:int64
bedrooms:int64
beds:int64
質問は、ベッドルームの数がバスルームの数と等しい宿泊施設の検索をすべて見つけることです。期待される出力のタイプがデータフレームであることを確認してください。
著者からの注意事項:データセットをチャットに入力するには、以下のようにプラットフォームからコピーするだけです。
ChatGPT: ベッドルームの数がバスルームの数と等しい宿泊施設の検索をすべて見つけるには、次のPythonコードを使用できます。
import pandas as pd
# 'airbnb_search_details'はデータセットを含むDataFrameを想定しています
# 'airbnb_search_details'を実際のDataFrameの名前に置き換えてください(異なる場合)
# 条件に基づいてDataFrameをフィルタリングする:ベッドルームの数 == バスルームの数
result = airbnb_search_details[airbnb_search_details['bedrooms'] == airbnb_search_details['bathrooms']]
# 結果のDataFrameを表示する
print(result)
制御
実際には、ChatGPTの回答のほとんどは正しいですが、最後の行は不要です。print関数を使用して結果のデータフレームを表示する必要はないため、以下のようにコードを更新するとソリューションが機能します。
import pandas as pd
# 'airbnb_search_details'はデータセットを含むDataFrameを想定しています
# 'airbnb_search_details'を実際のDataFrameの名前に置き換えてください(異なる場合)
# 条件に基づいてDataFrameをフィルタリングする:ベッドルームの数 == バスルームの数
result = airbnb_search_details[airbnb_search_details['bedrooms'] == airbnb_search_details['bathrooms']]
# 結果のDataFrameを表示する
result
質問2
こちらはLeetCodeからの質問で、ChatGPT-4に入力する予定です。
プロンプトに書かれた情報をそのままコピー&ペーストします。
プロンプト:
整数配列numsと整数valが与えられた場合、nums内のvalのすべての出現を削除します(インプレースで)。要素の順序は変更される場合があります。次に、nums内のvalと等しくない要素の数を返します。
nums内のvalと等しくない要素の数をkとすると、受け入れられるためには、以下のことを行う必要があります。
配列numsを変更して、numsの最初のk要素に、valと等しくない要素を含めます。numsの残りの要素やnumsのサイズは重要ではありません。
kを返します。
カスタムジャッジ:
ジャッジは次のコードであなたの解答をテストします:
int[] nums = […]; // 入力配列
int val = …; // 削除する値
int[] expectedNums = […]; // 正しい長さを持つ期待される答え
// ソートされており、valと等しい値は存在しない
int k = removeElement(nums, val); // 実装を呼び出す
assert k == expectedNums.length;
sort(nums, 0, k); // numsの最初のk個の要素をソートする
for (int i = 0; i < actualLength; i++) {
assert nums[i] == expectedNums[i];
}
すべてのアサーションがパスする場合、解決策は受け入れられます。
例1:
入力:nums = [3,2,2,3]、val = 3
出力:2、nums = [2,2,_,_]
説明:関数はk = 2を返すべきであり、numsの最初の2つの要素は2です。
返されたkの後ろに何を残すかは重要ではありません(したがって、アンダースコアが表示されます)。
例2:
入力:nums = [0,1,2,2,3,0,4,2]、val = 2
出力:5、nums = [0,1,4,0,3,_,_,_]
説明:関数はk = 5を返すべきであり、numsの最初の5つの要素には0、0、1、3、4が含まれます。
これらの5つの要素の順序は任意です。
返されたkの後ろに何を残すかは重要ではありません(したがって、アンダースコアが表示されます)。
制約:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
解決策の形式:class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
ChatGPT:以下はPythonでの解決策です:
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
k = 0 # valと等しくない要素のカウンター
# 配列をイテレートする
for i in range(len(nums)):
if nums[i] != val:
nums[k] = nums[i] # 要素をk番目の位置に移動する
k += 1
return k
この解決策は、nums配列を直接変更し、valと等しくない要素の数を数えるために二重ポインターの手法を使用しています。変数kは、次の非val要素を配置する位置を追跡するために使用されます。
アルゴリズムは配列をイテレートし、valと等しくない要素が現れるたびにそれをk番目の位置に移動し、kを増やします。最終的に、kはvalと等しくない要素の数を表します。
提供されたカスタムジャッジコードを使用して、与えられた例に対して期待される出力を生成し、アサーションをパスするかどうかを検証することで、解決策をテストできます。
制御
コードは変更なしで完璧に動作しています。
SQL
SQLはデータベースの操作に不可欠です。GPT-4はSQLクエリの作成、データベースの効率化、および複雑なSQLの概念の理解を支援することができます。
質問1
以下は解決しようとするSQLの質問です。
プロンプト:以下が質問です。最近の広告キャンペーンに続いて、マーケティング部門は各製品の販売単位数に基づいて自身の取り組みを分類したいと考えています。
各製品の販売総数を計算し、以下の基準に基づいて広告のパフォーマンスを分類することを担当しています。
優れた:30以上
満足度:20 – 29
不満足度:10 – 19
低評価:1 – 9
出力には、製品ID、降順で総販売数量、およびカテゴリ別の広告パフォーマンスが含まれています。
データセットの名前はmarketing_campaignで、以下がデータ型です。
marketing_campaign
user_id:int
created_at:datetime
product_id:int
quantity:int
price:int
期待される出力は次のとおりです。
製品ID 総販売数 広告パフォーマンス
105 41 優秀
102 29 満足
114 23 満足
118 22 満足
120 21 満足
この問題を解決するためにmysqlを使用してください。
ChatGPT: MySQLを使用してこのタスクを解決するには、与えられた基準に基づいて各製品の総販売数量を計算し、広告パフォーマンスをカテゴリ別に分類するクエリを書くことができます。
以下にクエリを示します。
SELECT
product_id,
SUM(quantity) AS total_sold,
CASE
WHEN SUM(quantity) >= 30 THEN '優秀'
WHEN SUM(quantity) BETWEEN 20 AND 29 THEN '満足'
WHEN SUM(quantity) BETWEEN 10 AND 19 THEN '不満足'
WHEN SUM(quantity) BETWEEN 1 AND 9 THEN '低評価'
END AS ad_performance
FROM
marketing_campaign
GROUP BY
product_id
ORDER BY
total_sold DESC;
このクエリでは、product_idを選択し、quantityの合計をtotal_soldとして計算し、total_soldの値に基づいて広告パフォーマンスをカテゴリ別に分類するためにCASE文を使用しています。クエリはproduct_idで結果をグループ化し、total_soldの降順で並べ替え、必要な出力を提供します。
データベース内のテーブルの実際の名前である”marketing_campaign”を置き換えることを忘れないでください。
このクエリを実行すると、製品ID、総販売数、および基準に従って分類された広告パフォーマンスの期待される出力が得られます。
制御
コードは修正なしで完璧に動作しています。
質問2
ここからLeetCodeからの2番目のSQLの質問です。
Prompt : テーブル:Sales
+————-+——-+
| カラム名 | タイプ |
+————-+——-+
| sale_id | int |
| product_id | int |
| year | int |
| quantity | int |
| price | int |
+————-+——-+
(sale_id, year)はこのテーブルの主キーです。product_idはProductテーブルへの外部キーです。
このテーブルの各行は、特定の年における製品product_idの販売を示しています。価格は単位ごとです。
テーブル:Product
+————–+———+
| カラム名 | タイプ |
+————–+———+
| product_id | int |
| product_name | varchar |
+————–+———+
product_idはこのテーブルの主キーです。
このテーブルの各行は、各製品の製品名を示します。
売られた各製品の最初の年の製品ID、年、数量、および価格を選択するSQLクエリを書いてください。
結果のテーブルは任意の順序で返されます。
クエリの結果の形式は以下の例の通りです。
例1:
入力:
Salesテーブル:
+———+————+——+———-+——-+
| sale_id | product_id | year | quantity | price |
+———+————+——+———-+——-+
| 1 | 100 | 2008 | 10 | 5000 |
| 2 | 100 | 2009 | 12 | 5000 |
| 7 | 200 | 2011 | 15 | 9000 |
+———+————+——+———-+——-+
Product table:
+————+————–+
| product_id | product_name |
+————+————–+
| 100 | Nokia |
| 200 | Apple |
| 300 | Samsung |
+————+————–+
Output:
+————+————+———-+——-+
| product_id | first_year | quantity | price |
+————+————+———-+——-+
| 100 | 2008 | 10 | 5000 |
| 200 | 2011 | 15 | 9000 |
+————+————+———-+——-+
ChatGPT: 製品が販売された最初の年の製品ID、年、数量、価格を選択するには、以下のSQLクエリを使用できます:
SELECT s.product_id, s.year AS first_year, s.quantity, s.price
FROM Sales s
JOIN (
SELECT product_id, MIN(year) AS first_year
FROM Sales
GROUP BY product_id
) t ON s.product_id = t.product_id AND s.year = t.first_year
ORDER BY s.product_id;
説明:
- Salesテーブルから、MIN()関数を使用して各製品の最小の年を選択し、product_idで結果をグループ化するサブクエリ(SELECT product_id, MIN(year) AS first_year FROM Sales GROUP BY product_id)を選択します。
- メインクエリは、メインクエリのproduct_idとyearの列が一致する場合にSalesテーブルとサブクエリを結合し、各製品の最初の年の販売レコードを取得します。
- 一致するレコードのSalesテーブルから、product_id、yearをfirst_yearとして、quantity、priceなどの選択された列が返されます。
- 結果はproduct_idで昇順に並べ替えられます。
クエリは、販売されたすべての製品の最初の年の製品ID、最初の年、数量、価格を返します(例の出力に示されているように)。
Control
このコードは問題なく動作しており、更新は必要ありません。
R
Rは統計評価とデータ可視化のために特別に作られた言語です。GPT-4は、R言語の微妙なニュアンスを理解し、Rコードのデバッグ、さまざまなRパッケージを利用したデータ分析をサポートすることができます。
Question
以下はコーディングの質問です。
Prompt:
次の質問があります:各ゲストレビューアーについて、ゲストがホストに与えた最高のレビュースコアに基づいて、レビューアーのお気に入りホストの国籍を見つけてください。ゲストのユーザーIDとお気に入りホストの国籍を出力します。同じ国から複数のお気に入りホストがある場合は、その国を1回だけ表示します(重複を削除します)。
from_userとto_userの両方はユーザーIDです。
以下は期待される出力です:
from_user nationality
0 Luxembourg
1 Brazil
2 Australia
3 Australia
4 Brazil
以下はデータフレームです:
airbnb_reviews
from_user:int64
to_user:int64
from_type: object
to_type: object
review_score:int64
airbnb_hosts
host_id: int64
nationality: object
gender: object
age:int64
これをRで解決してください。
Hints:
[column_name]を使用してデータフレームから特定の列を選択し、’==’ゲストに等しい値の行を選択します
.groupby(column_name) を使用して、指定された列でデータフレームをグループ化し、max() を使用して各グループごとに最大スコアを取得します。
元のデータフレームとグループ化されたデータフレームを内部結合して、共通のテーブルキーを使用してグループ化されたデータフレームの対応する属性/詳細を取得します(pd.merge(dataframe1, dataframe2, on = common_table_keys) を使用します)。
結果のデータフレームと airbnb_hosts を内部結合します。
[ [ column_name/s] ] を使用して、データフレームの指定された列を選択し、drop_duplicates(column_name) を使用して指定された列の重複値を取得します。
ChatGPT: このタスクを R を使って解決するには、以下の手順に従うことができます:
- ‘airbnb_reviews’ データフレームから必要な列を選択し、’from_type’ が ‘guest’ である行をフィルタリングします。
- フィルタリングされたデータフレームを ‘from_user’ でグループ化し、各ゲストごとに最大のレビュースコアを取得します(max() 関数を使用します)。
- ‘from_user’ と ‘review_score’ の列に基づいて元のデータフレームとグループ化されたデータフレームを内部結合して、各ゲストの最大レビュースコアに対応する行を取得します。
- 結果のデータフレームと ‘airbnb_hosts’ データフレームを ‘to_user’ と ‘host_id’ の列に基づいて内部結合して、お気に入りのホストの国籍を取得します。
- 最終的に結合されたデータフレームから ‘from_user’ と ‘nationality’ の列を選択します。
- ‘nationality’ 列を基準にして重複する行を削除するために distinct() 関数を使用します。
以下はこれを実現するためのコードです:
# airbnb_reviews から必要な列を選択し、'from_type' が 'guest' の行をフィルタリングする
filtered_reviews <- airbnb_reviews[airbnb_reviews$from_type == 'guest', c('from_user', 'to_user', 'review_score')]
# 'from_user' でグループ化し、各ゲストごとに最大のレビュースコアを取得する
max_scores <- aggregate(review_score ~ from_user, filtered_reviews, max)
# 最大のレビュースコアに対応する行を取得するために内部結合を行う
joined_df <- merge(filtered_reviews, max_scores, by = c('from_user', 'review_score'))
# 'to_user' と 'host_id' の列に基づいて 'airbnb_hosts' と内部結合する
final_df <- merge(joined_df, airbnb_hosts, by.x = 'to_user', by.y = 'host_id')
# 最終結合されたデータフレームから必要な列を選択する
result <- final_df[, c('from_user', 'nationality')]
# 'nationality' 列を基準にして重複する行を削除する
distinct_result <- distinct(result, .keep_all = TRUE)
# 最終結果を表示する
distinct_result
このコードを実行すると、’from_user’(ゲストID)とそれぞれのゲストのお気に入りホストの ‘nationality’ を含む期待される出力が得られます。
Control
このコードは、更新の必要なく完璧に動作しています。
ボーナス: ChatGPT でデータプロジェクトを行う
このデータプロジェクトは、Uber のデータサイエンスの採用プロセスで課される課題として使用されています。
全体として、2つの異なるシナリオがあります:
シナリオ1: 土曜日には通常よりも多くの車が必要であり、ドライバーにオンライン登録してもらうために、以下の2つのボーナスオプションをコストの観点から評価しています:
- オプション1: オンラインで最低8時間運行し、リクエストの90%を受け入れ、10回のトリップを完了し、評価が4.7以上のドライバーに対しては、$50 を支給する。
- オプション2: すべてのドライバーに対して、12回のトリップを完了し、評価が4.7以上の場合には、$4/トリップを支給する。
シナリオ2: タクシードライバーは現在、1日あたりの運賃で $200(経費を差し引く前)を稼ぎ、週に6日働き、3週間休みを取り、以下の経費があります:
- ガソリン – 週に $200
- 保険 – 月に $400
- 車のレンタル(週単位)- $500
ドライバーは休みの週にはガソリン代とレンタカー代を支払いません。
ChatGPTファイルアップローダー
さて、データプロジェクトを行うためには、ChatGPTファイルアップローダーのChrome拡張機能が必要です。これにより、ファイルをChatGPTにアップロードすることができます。
既にCode Interpreterプラグインを持っている場合は必要ありません。このプラグインを使用してファイルをアップロードしてください。
詳細については、このビデオをご覧ください。
ファイルアップローダー拡張機能を設定した後、このデータプロジェクトを解決してみましょう。
ChatGPTを開き、この拡張機能のボタンをクリックしてください。
以下のように送信ボタンが表示されます。
出典: https://chat.openai.com/
さて、まずはデータセットを使用してChatGPTにデータを供給し、最初に「ファイルを送信」ボタンをクリックしましょう。
出典: https://chat.openai.com/
データセットを読み込んだ後、ChatGPTはデータセットを求めます。
出典: https://chat.openai.com/
さて、このデータプロジェクトを解決するために使用するべきプロンプトがこちらです。
プロンプト:オペレーションシナリオと提供されたデータセットに基づいて、以下の質問にPythonを使用して回答してください
課題
シナリオ1:土曜日は大規模な日となり、先週よりも多くの車が必要となります。ドライバーにオンラインで働くよう促すため、以下の2つのボーナスオプションをコストの観点で評価しています:
オプション1:8時間以上オンラインで働き、リクエストの90%を受け入れ、10回のトリップを完了し、時間枠内で4.7以上の評価を持つドライバーごとに50ドル;
オプション2:12回のトリップを完了し、4.7以上の評価を持つすべてのドライバーに対してトリップごとに4ドルの報酬。
提供されたデータセットとシナリオ1に基づいて、以下の質問に回答してください:
オプション1の合計ボーナス支払額はいくらですか?
オプション2の合計ボーナス支払額はいくらですか?
オプション1ではボーナスの対象となるドライバーはいくつありますかが、オプション2ではボーナスの対象とならないドライバーはいくつありますか?
オンラインで働くドライバーのうち、10回未満のトリップを完了し、受け入れ率が90%未満で、評価が4.7以上である割合は何%ですか?
シナリオ2:タクシードライバーは現在、1日あたり200ドルの運賃(経費を差し引く前)を稼いでいます。週に6日働き、3週間休みを取り、以下の経費があります:
ガソリン – 週200ドル
保険 – 月400ドル
車のレンタル(週単位)- 500ドル
ドライバーは休みの週にはガソリン代とレンタル代は支払いません。
さて、同じドライバーがTown Carを購入し、Uberと提携する場合を考えてみましょう。その場合、ガソリン代は5%増加し、保険費は20%減少し、車のレンタルはなくなります。ただし、車を購入する必要があります。ドライバーは引き続き1年に3週間休みを取ります。
シナリオ2に基づいて、以下の質問に回答してください:
Uberと提携せずにタクシードライバーは1年間にどれだけの金額(経費を差し引いた後)を稼ぎますか?
上記の同じドライバーを説得して、Town Carを購入し、Uberと提携するようにしてください。新しい車が40,000ドルであると仮定した場合、1年目に車の完全な支払いと同じ年間利益率を維持するために、ドライバーの総運賃は週ごとにいくら増加する必要がありますか?
ChatGPT:
これらの計算を行うには、まずデータセットを読み込み、前処理する必要があります。Pythonのpandasライブラリを使用してCSVファイルを読み込み、必要な列を解析します。
残念ながら、テキストベースのモデルとして、コードを直接実行することはできません。ただし、質問に回答するために使用できるPythonコードを提供できます:
以下は、シナリオ1の質問に答えるために必要なコードです:
import pandas as pd
# データセットの読み込み
data = pd.read_csv('dataset_2.csv')
# 'Accept Rate' をパーセンテージの文字列から浮動小数点数に変換
data['Accept Rate'] = data['Accept Rate'].str.rstrip('%').astype('float') / 100.0
# 両方のオプションでのボーナスの計算
data['Option 1 Bonus'] = ((data['Supply Hours'] >= 8) & (data['Accept Rate'] >= 0.9) &
(data['Trips Completed'] >= 10) & (data['Rating'] >= 4.7)) * 50
data['Option 2 Bonus'] = ((data['Trips Completed'] >= 12) & (data['Rating'] >= 4.7)) * data['Trips Completed'] * 4
# 各オプションの総支払い額の計算
total_payout_option1 = data['Option 1 Bonus'].sum()
total_payout_option2 = data['Option 2 Bonus'].sum()
# オプション1に該当するがオプション2に該当しないドライバーの数を計算
num_option1_only = ((data['Option 1 Bonus'] > 0) & (data['Option 2 Bonus'] == 0)).sum()
# 10回未満のトリップを完了し、受け入れ率が90%未満、かつ評価が4.7以上のドライバーの割合を計算
percent_undesirable_drivers = ((data['Trips Completed'] < 10) & (data['Accept Rate'] = 4.7)).mean() * 100
print('オプション1の総ボーナス支払い額:$', total_payout_option1)
print('オプション2の総ボーナス支払い額:$', total_payout_option2)
print('オプション1に該当するがオプション2に該当しないドライバーの数:', num_option1_only)
print('10回未満のトリップを完了し、受け入れ率が90%未満、かつ評価が4.7以上のドライバーの割合:', percent_undesirable_drivers)
以下は、シナリオ2の質問に答えるためのコードです:
# タクシードライバーの年間収入と経費を計算する
daily_income = 200
weekly_income = daily_income * 6 # 週6日働く
yearly_income = weekly_income * 52 # 1年中働く
yearly_expenses = (200 * 49) + (400 * 12) + (500 * 49) # 休暇週には経費なし
yearly_net = yearly_income - yearly_expenses
# ドライバーがUberと提携した場合の新しい経費と純収入を計算する
new_yearly_expenses = (200 * 1.05 * 49) + (400 * 0.8 * 12) # ガソリン代は5%増加、保険料は20%減少
new_yearly_net = yearly_income - new_yearly_expenses - 40000 # 車の費用を差し引く
# 同じ利益率を維持するために必要な総売上高の増加額を計算する
additional_income_required = yearly_net - new_yearly_net
additional_income_required_weekly = additional_income_required / 52
print('タクシードライバーの年間純収入:$', yearly_net)
print('週ごとの総売上高の必要な増加額:$', additional_income_required_weekly)
read_csv関数のファイルパスを実際のdataset_2.csvファイルのパスに置き換え、これらのコードスニペットをローカルのPython環境で実行できます。
注意
最初のシナリオの出力は完全に正しいです(最初の4つの質問)。ただし、2番目のシナリオの出力は正しくありません。
例えば、ドライバーは3週間休暇を取るため、52週間(1年間)働くと計算しています。
そのため、ChatGPTが行う計算や結果を確認するために、ChatGPTが実行する手順を注意深く確認する必要があります。
数回の試行の結果、ChatGPTが提供する正しい結果を出力するコードは次のとおりです。
# 1年あたりの休暇週数
weeks_off = 3
# 1年あたりの総週数
total_weeks_per_year = 52
# 1年あたりの労働週数
working_weeks = total_weeks_per_year - weeks_off
# 1年あたりの総月数
total_months_per_year = 12
# 経費
gas_per_week = 200
insurance_per_month = 400
vehicle_rent_per_week = 500
# 収入
fare_per_day = 200
work_days_per_week = 6
total_revenue = fare_per_day * work_days_per_week * working_weeks
# 総経費
total_expenses = (gas_per_week + vehicle_rent_per_week) * working_weeks + insurance_per_month * total_months_per_year
# 純収入
net_income = total_revenue - total_expenses
print("1年あたりの純収入:$", net_income)
# 質問6のために:
# 経費の変更
new_gas_per_week = gas_per_week * 1.05 # 5%増加
new_insurance_per_month = insurance_per_month * 0.8 # 20%減少
car_cost = 40000
# 新しい総経費
new_total_expenses = car_cost + (new_gas_per_week * working_weeks) + (new_insurance_per_month * total_months_per_year)
# 同じ純収入を維持するために必要な売上高は:
new_total_revenue = new_total_expenses + net_income
# これは、週ごとの運賃の必要な増加を示します:
additional_fare_per_week = (new_total_revenue - total_revenue) / working_weeks
print("週ごとの運賃の必要な増加:$", additional_fare_per_week)
最後の言葉
この探索は、特にデータサイエンスの領域において、GPT-4の革新的な応用と固有の制約に光を当てました。
複雑な統計や確率の問題、モデリングの問題、またはコーディングの質問に取り組む際、GPT-4は有望な能力を示しました。
しかし、GPT-4は貴重なツールを提供する一方で、品質の向上には人間の監視と理解が不可欠であることを忘れてはなりません。特に数学的な計算においては、品質の確保が重要です。
この探索はGPT-4の旅の始まりに過ぎず、さらなる進歩と改善が常に見込まれています。OpenAIのCEOであるサム・アルトマンは、将来のモデル(GPT5)では、不正確な計算やプロンプトの数の制限に関する問題を解決する予定だと述べています。
好奇心を持ち続け、探求を続け、そしてAIの潜在能力の唯一の制限は私たちが設定するものだということを忘れないでください。
Nate Rosidiはデータサイエンティストであり、製品戦略に携わっています。彼はまた、アナリティクスを教える非常勤の教授であり、StrataScratchというプラットフォームの創設者でもあります。StrataScratchは、一流企業の実際のインタビューの質問を使ってデータサイエンティストがインタビューに備えるのを支援するプラットフォームです。彼とはTwitterのStrataScratchやLinkedInでつながることができます。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles