Entra nell’esperimento.

Durante il fine settimana ho deciso di farlo mostrare, non raccontare. Volevo che Skip sperimentasse di persona la nuova tecnologia, non solo sentirmi parlarne. E se potessimo realizzare un business plan per lanciare un’ipotetica nuova azienda agricola in meno di 40 minuti? Potrei farlo utilizzando un ChatGPT 4 con l’analisi avanzata dei dati abilitata, tramite la condivisione dello schermo sul suo iPhone: collaboreremo insieme per realizzarlo.

Abbiamo discusso brevemente le nostre ipotesi:

  1. Abbiamo 1.000 acri da coltivare nel Texas orientale
  2. Disponiamo di 1 milione di dollari di capitale iniziale con cui acquistare attrezzature
  3. Per iniziare, dobbiamo ottenere una linea di credito da una banca sulle spese operative del primo anno
  4. Siamo interessati alla coltivazione di grano e soia (quelli che Skip effettivamente coltivava in passato)

Abbiamo iniziato in modo semplice:

Suggerimento 1: “Scrivetemi uno schema per un piano aziendale per avviare una nuova azienda agricola nel Texas orientale per coltivare grano e soia”.

Skip è rimasto immediatamente colpito dai risultati del formato lungo. Ma aspetta, avevamo appena iniziato…

Suggerimento 2: “Dammi un elenco delle attrezzature di cui ho bisogno per iniziare”
Suggerimento 3: “Inseriscilo in una tabella e stabilisci la priorità numerica in base a ciò che è più urgentemente necessario a meno urgente”
Suggerimento 4: “ora crea una nuova colonna per l’allocazione del budget, supponiamo che utilizzerò una combinazione di leasing e acquisti, crea una colonna aggiuntiva per consigliare leasing rispetto a acquisto, supponi di avere $ 1 milione di capitale iniziale.”

(Tempo trascorso 4 minuti)

Risultato:

Dati generati da GPT-4, immagine dell’autore.

Suggerimento 5: “Quanto dovrei accantonare per chiedere una linea di credito per costi variabili (sementi, fertilizzanti, manodopera, ecc.), supponendo 1000 acri. Crea una nuova tabella.”

Risultato:

Dati generati da ChatGPT 4, immagine dell’autore

A questo punto, mi sentivo come se Skip avesse appena assistito di nuovo all’Apollo 11. Riusciva a malapena a contenere la sua eccitazione. Ma non avevamo ancora finito…

Suggerimento 6: “Scrivimi una simulazione Monte Carlo in cui posso modificare le mie ipotesi di input e testare il risultato sul mio budget”

Risultati:

import numpy as np
import matplotlib.pyplot as plt

# Define number of simulations
n_simulations = 10000

# Assumptions with (mean, std deviation)
wheat_seed_cost = (20, 2) # Cost per acre
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 # for 1000 acres

return total_cost

results = (simulate_farm_costs() for _ in range(n_simulations))

# Visualization
plt.hist(results, bins=50, edgecolor='black', alpha=0.7)
plt.title('Distribution of Total Farm Costs')
plt.xlabel('Total Cost')
plt.ylabel('Frequency')
plt.grid(True, alpha=0.2)
plt.show()

Ora arriva il momento della verità: il codice funzionerà? Siamo passati al notebook Jupyter per eseguire il codice. Ed eccola al primo tentativo:

Dati generati da ChatGPT 4, immagine generata da Python, immagine dall’autore

A questo punto, mancavano solo 10-15 minuti. Abbiamo ancora un po’ di tempo a disposizione… Potremmo renderlo interattivo?

Dobbiamo creare un elenco di parametri che consentano all’utente di regolare dinamicamente le ipotesi su uno slider. Ancora una volta utilizziamo ChatGPT per alcuni consigli su quali parametri devono essere basati sul Monte Carlo che abbiamo creato in precedenza:

Dati generati da GPT 4, immagine dell’autore

Una volta creato l’elenco di parametri, creiamo una tabella di “misure” in Power BI legata a 16 elementi visivi di affettatura che consentono all’utente di selezionare manualmente i propri input e aggiornare dinamicamente la simulazione Monte Carlo. Per fare ciò creiamo un “Python Visual” in Power BI, trasciniamo tutte le nostre misure e quindi aggiorniamo il codice come segue:

# The following code to create a dataframe and remove duplicated rows is always executed and acts as a preamble for your script: 

# 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()

# Paste or type your script code here:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# Assuming the data from Power BI is passed as 'dataset'
df = dataset

# Fetch values from the 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)

# Define number of simulations
n_simulations = 10000

# Assumptions with (mean, std deviation)
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 # for 1000 acres

return total_cost

results = (simulate_farm_costs() for _ in range(n_simulations))

# Convert results into a dataframe
df_simulated_results = pd.DataFrame(results, columns=('Total Cost'))

# Calculate the Interquartile Range (IQR)
Q1 = df_simulated_results('Total Cost').quantile(0.25)
Q3 = df_simulated_results('Total Cost').quantile(0.75)

# Plotting the histogram
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('Distribution of Year 1 Variable Farm Costs from Simulation')
plt.xlabel('Year 1 Variable Cost')
plt.ylabel('Frequency')
plt.grid(True, which='both', linestyle='--', linewidth=0.5)

# Shade the 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') # This will save the figure as an image file
plt.show()

Solo per divertimento, abbiamo chiesto a ChatGPT di definire l’intervallo interquartile (IQR) e di ombreggiarlo con un colore diverso, abbiamo anche aggiornato manualmente le etichette del grafico e l’asse x. Il resto è semplicemente ripulire un po’ gli elementi visivi in ​​Power BI per renderlo un po’ più facile da usare. Il risultato finale:

Dati generati dalla simulazione Monte Carlo in base agli input dei parametri selezionati dall’utente, codice Python generato da ChatGPT 4, dashboard integrato in MS PowerBI, immagine dell’autore

Ora disponiamo di una simulazione Monte Carlo dinamica per giocare con diverse ipotesi sui costi di input e proiettare le spese operative variabili di cui avremmo bisogno per far decollare la nostra attività agricola. Sfruttando ChatGPT 4, non abbiamo scritto praticamente alcun codice, lo abbiamo solo modificato un po’, abbiamo eseguito la maggior parte del lavoro da un iPhone tramite condivisione dello schermo, creato l’ultimo pezzo nel desktop PBI e lo schermo lo ha condiviso tramite l’app PBI per iPhone. Il tutto in circa 30–40 minuti di lavoro.

Il verdetto di mio nonno? “Abbiamo realizzato in 40 minuti ciò che gli avrebbe richiesto 2 anni per fare da solo ‘ai tempi’.” Sì, riconosco che c’è molto di più potremmo fare – e la sua “simulazione” è lungi dall’essere perfetta. (Ad esempio, non delineiamo tra la percentuale di colture dedicate alla soia e quella al grano.) Ma per 40 minuti? Anche io sono rimasto impressionato. E questa è la promessa della Gen AI: democratizzare la scienza dei dati, incoraggiare la sperimentazione e accelerare la capacità di sviluppare tutto nel palmo della tua mano. Concedere a un nonno e a suo nipote l’opportunità di riconnettersi su alcune statistiche e sfruttare la tecnologia in modi nuovi e inaspettati.

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *