パンチカードからChatGPTへ

「パンチカードからChatGPTへ:進化するテクノロジー」

祖父の生成AIへの一瞥

私の母方の祖父、スキップは私の目には常に農夫でした。残念ながら、私が生まれた直後の1988年、私の母は白血病で亡くなりました。家族の最初の孫として、スキップと私は非常に親しい関係でした。子供の頃、毎年の小麦の収穫時にトラクターやコンバインの腕掛けに乗って過ごしました−そして10代になると、夏の仕事として自分自身で農場で働きました。

夏の小麦収穫時のジョンディアのコンバインの空中写真。祖父と私は1990年代後半から2000年代初頭にかけてこれらを2つ使用しました。これが私の最初の「仕事」でした。写真:Scott Goodwill氏提供(Unsplash)

しかし、スキップの以前の人生は、私が知っている農業界とはまったく異なるものでした。私が登場する前に、彼はテキサスA&M大学で統計学の博士課程を修了し、1972年に完成させました。それからすぐに、彼はメリーランド大学で教授職を受け、1974年に論文を完成させました。彼の画期的な研究は、産業現場での安全性と材料のリスクを予測・特定することを目指していました。この巨大な課題には数年の努力が必要でした。彼は多様な企業から10年分の事故報告を手動で収集し、統計を手動で処理し、それらの洞察を大学のコンピュータシステムのパンチカード命令に変換する必要がありました。そのコンピュータでの時間を確保するのはすぐにではありませんでした。数週間または数ヶ月先の予約が必要でした。ひとつのコーディングのミスはゼロからやり直すことを意味し、研究の停滞を数ヶ月間引き起こす可能性がありました。

彼は1980年代にその生活をやめ、東テキサスの家族の農場を引き継ぎ、起業に進出しました。しかし、統計的推論を活用する意欲は、彼が農夫として行っているすべてのことに焼き付けられていました−私が子供の頃はそれに気づきませんでした。私の子供の頭では、スキップは「オフィス仕事」をしていると言っていましたが−実際には、彼はITを利用して予測し、運営費用を確保し、肥料の化学物質を最適化して収穫量を増やし、シカゴ商品取引所で将来の不確実性を減らす戦略を開発するために、1979年にRadio Shackで購入した16 KBのRAMに接続されたドットマトリックスプリンターを使用していました。農業は非常に低利益の事業であり、スキップは統計を使って少しでも競争力を持てると賭けていたのです。

数年を経て、農場は時代の試練に耐えられませんでした。世代を超えた農業は、一世代を飛ばすことを余儀なくされるとあまりうまくいかないことがわかります。そして、今日の投入コストは以前よりも許容しづらくなりました−規模の経済の追求が唯一の収益性のある方法になります−そのため、スキップの世代の多くの小規模農家は買収され、統廃合されました−しかし、それは徐々に、少しずつ起こることです(少なくとも私たちにとっては)。

私はもちろん、統計と農業の強い関連性を理解しました。私は、毎年訪れる米国農務省の徹底的な作物収穫サンプリング(私たちも含めてすべての農場で)を鮮明に覚えています。それは、私の意見では、歴史上最も素晴らしい無名のデータプロジェクトの一つであり、世代を超える農家が「データに基づいた」意思決定をするのを助けている−それが流行語になる前ですら。しかし、私自身の分析とデータサイエンスのキャリアを始めた後、スキップの数十年後に彼がやっていたことをさらに理解するようになりました−私は20代と30代をアメリカ陸軍の将校として勤め、世界中を飛び回った後の私自身のセカンドアクトです。私はしばしば彼と電話で再接続し、彼が「昔のやり方」で回帰分析やシミュレーションをどのように実行していたのか、ランダムサンプリングに対するコントロール方法を教えてもらいます。そして、機械学習、深層学習、強化学習といった概念を彼に説明すると、彼の興奮を感じるのが時折楽しみです−−彼にとってはまるでSFのようなものですが−彼はそれについて聞くことが大好きです−たとえそれが彼にとっては現実ではなくなってしまっていても、彼の人生の終わりに近づいているとしてもです。

  • 東テキサスで1000エーカーの農地を持っている
  • 100万ドルのスタートアップキャピタルで機器を購入するために銀行から1年間の運営費用の信用枠を確保する必要がある
  • 小麦と大豆を育てることに興味がある(Skipが以前栽培していたもの)
  • まずは簡単なスタートを切りました:

    Prompt 1: 「東テキサスで小麦と大豆を育てる新しい農場を始めるためのビジネスプランの概要を書いてください」。

    Skipはすぐに長文の結果に感銘を受けました。しかし、まだ始まったばかりです…

    Prompt 2: 「始めるために必要な機器のリストを教えてください」Prompt 3: 「それをテーブルにまとめ、最も緊急のものから最も緊急でないものまでを数値で優先順位付けしてください」Prompt 4: 「予算配分のための新しい列を作成し、リースと購入の組み合わせを使用することを前提として、リース対購入を推奨するための追加の列を作成し、スタートアップキャピタルが100万ドルあると仮定します」

    (経過時間 4 分)

    結果:

    <img 4によって生成されたデータ、画像提供:著者

    この時点で、私はSkipが再びアポロ11を目撃したような気分になりました。彼は興奮を抑えることができませんでした。しかし、まだ終わっていません…

    Prompt 6: 「私が入力仮定を調整し、予算への影響をテストできるモンテカルロシミュレーションを書いてください」

    結果:

    import numpy as npimport matplotlib.pyplot as plt# シミュレーションの数を指定n_simulations = 10000# 仮定 [平均、標準偏差]wheat_seed_cost = [20, 2]  # 1エーカーあたりのコストsoybean_seed_cost = [50, 5]fertilizer_wheat_cost = [50, 5]fertilizer_soybean_cost = [40, 4]labor_cost = [25, 3]pesticide_cost = [30, 3]fuel_maintenance_cost = [15, 2]miscellaneous_cost = [10, 1]def simulate_farm_costs():    wheat_seed = np.random.normal(wheat_seed_cost[0], wheat_seed_cost[1])    soybean_seed = np.random.normal(soybean_seed_cost[0], soybean_seed_cost[1])    fertilizer_wheat = np.random.normal(fertilizer_wheat_cost[0], fertilizer_wheat_cost[1])    fertilizer_soybean = np.random.normal(fertilizer_soybean_cost[0], fertilizer_soybean_cost[1])    labor = np.random.normal(labor_cost[0], labor_cost[1])    pesticide = np.random.normal(pesticide_cost[0], pesticide_cost[1])    fuel_maintenance = np.random.normal(fuel_maintenance_cost[0], fuel_maintenance_cost[1])    miscellaneous = np.random.normal(miscellaneous_cost[0], miscellaneous_cost[1])        total_cost = (wheat_seed + soybean_seed + fertilizer_wheat + fertilizer_soybean +                   labor + pesticide + fuel_maintenance + miscellaneous) * 1000  # 1000エーカーあたり    return total_costresults = [simulate_farm_costs() for _ in range(n_simulations)]# 可視化plt.hist(results, bins=50, edgecolor='black', alpha=0.7)plt.title('農場コストの分布')plt.xlabel('総費用')plt.ylabel('頻度')plt.grid(True, alpha=0.2)plt.show()

    さあ、真実の瞬間です – コードは実行されるでしょうか? コードを実行するためにJupyterノートブックに移動しました。そして、最初の試行で次のように表示されました:

    ChatGPT 4から生成されたデータ、Pythonから生成された画像、著者による画像

    この時点で、われわれはたった10〜15分しか経っていません。まだ余裕があります…インタラクティブにすることはできるでしょうか?

    スライダー上で仮定を動的に調整できるパラメーターのリストを作成する必要があります。再び、以前に構築したモンテカルロに基づいてこれらのパラメーターがどうであるべきかの推奨をChatGPTに求めます:

    GPT 4によって生成されたデータ、著者による画像

    パラメーターのリストを作成したら、ユーザーが入力を手動で選択し、モンテカルロシミュレーションをダイナミックに更新できる16つのスライサー視覚化に関連する「メジャー」テーブルをPower BIで作成します。これを行うために、Power BIで「Python Visual」を作成し、すべてのメジャーをドラッグし、次のようにコードを更新します:

    # データフレームを作成し、重複行を削除するための次のコードは常に実行され、スクリプトの前文として機能します:# dataset = pandas.DataFrame(fertilizer_soybean_cost_avg Value, fertilizer_soybean_cost_std Value, fertilizer_wheat_cost_avg Value, fertilizer_wheat_cost_std Value, fuel_maintenance_cost_avg Value, fuel_maintenance_cost_std Value, labor_cost_avg Value, labor_cost_std Value, miscellaneous_cost_avg Value, miscellaneous_cost_std Value, pesticide_cost_avg Value, pesticide_cost_std Value, soybean_seed_cost_avg Value, wheat_seed_cost_avg Value, wheat_seed_cost_std Value)# dataset = dataset.drop_duplicates()# スクリプトコードをここに貼り付けるか、入力します:import numpy as npimport pandas as pdimport matplotlib.pyplot as plt# Power BIからデータが'dataset'として渡されたと仮定しますdf = dataset# データセットから値を取得するwheat_seed_cost_avg = df['wheat_seed_cost_avg Value'].iloc[0]wheat_seed_cost_std = df['wheat_seed_cost_std Value'].iloc[0]soybean_seed_cost_avg = df['soybean_seed_cost_avg Value'].iloc[0]soybean_seed_cost_std = df['soybean_seed_cost_std Value'].iloc[0]fertilizer_wheat_cost_avg = df['fertilizer_wheat_cost_avg Value'].iloc[0]fertilizer_wheat_cost_std = df['fertilizer_wheat_cost_std Value'].iloc[0]fertilizer_soybean_cost_avg = df['fertilizer_soybean_cost_avg Value'].iloc[0]fertilizer_soybean_cost_std = df['fertilizer_soybean_cost_std Value'].iloc[0]labor_cost_avg = df['labor_cost_avg Value'].iloc[0]labor_cost_std = df['labor_cost_std Value'].iloc[0]pesticide_cost_avg = df['pesticide_cost_avg Value'].iloc[0]pesticide_cost_std = df['pesticide_cost_std Value'].iloc[0]fuel_maintenance_cost_avg = df['fuel_maintenance_cost_avg Value'].iloc[0]fuel_maintenance_cost_std = df['fuel_maintenance_cost_std Value'].iloc[0]miscellaneous_cost_avg = df['miscellaneous_cost_avg Value'].iloc[0]miscellaneous_cost_std = df['miscellaneous_cost_std Value'].iloc[0]# シミュレーションの数を定義するn_simulations = 10000# 平均、標準偏差付きの仮定wheat_seed_cost = [wheat_seed_cost_avg, wheat_seed_cost_std]soybean_seed_cost = [soybean_seed_cost_avg, soybean_seed_cost_std]fertilizer_wheat_cost = [fertilizer_wheat_cost_avg, fertilizer_wheat_cost_std]fertilizer_soybean_cost = [fertilizer_soybean_cost_avg, fertilizer_soybean_cost_std]labor_cost = [labor_cost_avg, labor_cost_std]pesticide_cost = [pesticide_cost_avg, pesticide_cost_std]fuel_maintenance_cost = [fuel_maintenance_cost_avg, fuel_maintenance_cost_std]miscellaneous_cost = [miscellaneous_cost_avg, miscellaneous_cost_std]def simulate_farm_costs():    wheat_seed = np.random.normal(wheat_seed_cost[0], wheat_seed_cost[1])    soybean_seed = np.random.normal(soybean_seed_cost[0], soybean_seed_cost[1])    fertilizer_wheat = np.random.normal(fertilizer_wheat_cost[0], fertilizer_wheat_cost[1])    fertilizer_soybean = np.random.normal(fertilizer_soybean_cost[0], fertilizer_soybean_cost[1])    labor = np.random.normal(labor_cost[0], labor_cost[1])    pesticide = np.random.normal(pesticide_cost[0], pesticide_cost[1])    fuel_maintenance = np.random.normal(fuel_maintenance_cost[0], fuel_maintenance_cost[1])    miscellaneous = np.random.normal(miscellaneous_cost[0], miscellaneous_cost[1])    total_cost = (wheat_seed + soybean_seed + fertilizer_wheat + fertilizer_soybean +                  labor + pesticide + fuel_maintenance + miscellaneous) * 1000  # 1000エーカーに対してreturn total_costresults = [simulate_farm_costs() for _ in range(n_simulations)]# 結果をデータフレームに変換df_simulated_results = pd.DataFrame(results, columns=['Total Cost'])# 四分位範囲(IQR)を計算するQ1 = df_simulated_results['Total Cost'].quantile(0.25)Q3 = df_simulated_results['Total Cost'].quantile(0.75)# ヒストグラムをプロットするplt.figure(figsize=(10, 6))n, bins, patches = plt.hist(df_simulated_results['Total Cost'], bins=50, color='blue', edgecolor='black', alpha=0.7)plt.title('SimulationからのYear 1可変費用の分布')plt.xlabel('Year 1可変費用')plt.ylabel('頻度')plt.grid(True, which='both', linestyle='--', linewidth=0.5)# IQRを影で塗りつぶすfor i in range(len(bins)):    if bins[i] > Q1 and bins[i] < Q3:        patches[i].set_facecolor('green')plt.axvline(Q1, color='red', linestyle='dashed', linewidth=1)plt.axvline(Q3, color='red', linestyle='dashed', linewidth=1)plt.tight_layout()plt.savefig('simulated_costs_histogram.png')  # これにより、図を画像ファイルとして保存しますplt.show()

    面白半分で、ChatGPTに対して四分位範囲(IQR)を定義させ、異なる色で塗り分けました。また、チャートのラベルやx軸の更新も手動で行いました。その他のビジュアル面をPower BIで少し整え、ユーザーフレンドリーにしました。最終的な結果は以下の通りです:

    ユーザーが選択したパラメータ入力を基にしたモンテカルロシミュレーションで生成されたデータ。ChatGPT 4によって生成されたPythonコード。MS PowerBIで作成されたダッシュボード。画像提供:著者

    これで、異なる入力コストの仮定を試して、農業事業を立ち上げるために必要な可変の運営費用を予測する動的なモンテカルロシミュレーションができました。ChatGPT 4を活用し、ほとんどの作業をiPhoneで画面共有しながら行い、最後の部分はPBIデスクトップで構築し、PBI iPhoneアプリで画面共有しました。作業時間は約30〜40分でした。

    私の祖父の評価は「昔のように自分でやるには2年かかっただろうことを40分で実現した」というものでした。もちろん、これからもっとできることはたくさんありますし、この「シミュレーション」は完全ではありません(例えば、大豆と小麦の割合を区別していません)。しかし、40分でこれだけのことができるのは印象的です。そして、これがGen AIの約束です——データサイエンスの民主化、実験の推進、技術を活用した開発の迅速化を手のひらで行うことができます。祖父と孫が統計データや新しい予想外の方法でテクノロジーを利用しながら再びつながる機会を得ることができます。

    We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

    Share:

    Was this article helpful?

    93 out of 132 found this helpful

    Discover more