top of page

Prevedere i tempi di consegna con python e il deep learning

La capacità di prevedere i tempi di consegna è cruciale per molti settori, dall'e-commerce alla logistica. Questo perché conoscere in anticipo i tempi di consegna permette di gestire al meglio le risorse, sia in termini di personale che di mezzi di trasporto, e di fornire un servizio efficiente e puntuale ai clienti. In questo articolo, vedremo come utilizzare Python e il deep learning per sviluppare un modello in grado di prevedere i tempi di consegna con un'elevata accuratezza. Attraverso l'utilizzo di tecniche di data preprocessing, costruzione del modello e addestramento, mostreremo come è possibile ottenere risultati promettenti utilizzando questo approccio.


I servizi di consegna di cibo come Zomato e Swiggy devono mostrare il tempo preciso necessario per consegnare il tuo ordine per mantenere la trasparenza con i loro clienti. Queste aziende utilizzano algoritmi di Machine Learning o Deep Learning per prevedere i tempi di consegna del cibo in base a quanto tempo i partner di consegna hanno impiegato per la stessa distanza in passato. Quindi, se vuoi imparare a utilizzare l'apprendimento automatico per la previsione dei tempi di consegna del cibo, questo articolo fa per te. Questo articolo ti illustrerà la previsione dei tempi di consegna del cibo con il Deep Learning utilizzando Python.



Prevedere i tempi di consegna con python e il deep learning
Prevedere i tempi di consegna con python e il deep learning


Previsione dei tempi di consegna con Python

Per prevedere il tempo di consegna del cibo in tempo reale, dobbiamo calcolare la distanza tra il punto di preparazione del cibo e il punto di consumo del cibo. Dopo aver trovato la distanza tra il ristorante e i luoghi di consegna, dobbiamo trovare le relazioni tra il tempo impiegato dai partner di consegna per consegnare il cibo in passato per la stessa distanza.


Quindi, per questa attività, abbiamo bisogno di un set di dati contenente dati sul tempo impiegato dai corrieri per consegnare il cibo dal ristorante al luogo di consegna. Ho trovato un set di dati ideale con tutte le funzionalità per questa attività. È possibile scaricare il set di dati da qui .


Nella sezione seguente, ti illustrerò l'attività di previsione dei tempi di consegna del cibo con l'apprendimento prodondo utilizzando Python.


Se non ti va di seguire il tutorial perchè già sei esperto puoi passare direttamente a scaricare il progetto e i dati :


Clicca qui per scaricare il progetto finito.


Previsione dei tempi di consegna del cibo utilizzando Python

Inizierò l'attività di previsione dei tempi di consegna del cibo importando le librerie Python necessarie e il set di dati :


#importiamlo le librerie
import pandas as pd
import numpy as np
import plotly.express as px

#leggiamo il dataset
data = pd.read_csv("deliverytime.txt")
print(data.head())

Output :

     ID Delivery_person_ID Delivery_person_Age Delivery_person_Ratings \
0 4607 INDORES13DEL02 37 4.9   
1 B379 BANGRES18DEL02 34 4.5   
2 5D6D BANGRES19DEL01 23 4.4   
3 7A6A COIMBRES13DEL02 38 4.7   
4 70A2 CHENRES12DEL01 32 4.6   
   Restaurant_latitude Restaurant_longitude Delivery_location_latitude \
0 22,745049 75,892471 22,765049   
1 12.913041 77.683237 13.043041   
2 12,914264 77,678400 12,924264   
3 11.003669 76.976494 11.053669   
4 12.972793 80.249982 13.012793   
   Luogo_di_consegna_longitudine Tipo_di_ordine Tipo_di_veicolo Tempo_impiegato(min)  
0 75.912471 Snack moto 24  
1 77.813237 Monopattino snack 33  
2 77.688400 Bevande moto 26  
3 77.026494 Buffet moto 21  
4 80.289982 Monopattino snack 30

Diamo un'occhiata agli approfondimenti della colonna prima di andare avanti:


#stampiamo le info
data.info()

Output :

<class 'pandas.core.frame.DataFrame'> RangeIndex: 45593 entries, 0 to 45592 Data columns (total 11 columns):  #   Column                       Non-Null Count  Dtype   ---  ------                       --------------  -----    0   ID                           45593 non-null  object   1   Delivery_person_ID           45593 non-null  object   2   Delivery_person_Age          45593 non-null  int64    3   Delivery_person_Ratings      45593 non-null  float64  4   Restaurant_latitude          45593 non-null  float64  5   Restaurant_longitude         45593 non-null  float64  6   Delivery_location_latitude   45593 non-null  float64  7   Delivery_location_longitude  45593 non-null  float64  8   Type_of_order                45593 non-null  object   9   Type_of_vehicle              45593 non-null  object   10  Time_taken(min)              45593 non-null  int64   dtypes: float64(5), int64(2), object(4) memory usage: 3.8+ MB


Ora diamo un'occhiata se questo set di dati contiene o meno valori nulli:


#vediamo se questo set di dati contiene o meno valori nulli
data.isnull().sum()

Output :

ID                             0 Delivery_person_ID             0 Delivery_person_Age            0 Delivery_person_Ratings        0 Restaurant_latitude            0 Restaurant_longitude           0 Delivery_location_latitude     0 Delivery_location_longitude    0 Type_of_order                  0 Type_of_vehicle                0 Time_taken(min)                0 dtype: int64

Il set di dati non ha valori Null. Andiamo oltre!



Calcolo della distanza tra latitudine e longitudine con python

Il set di dati non ha alcuna funzionalità che mostri la differenza tra il ristorante e il luogo di consegna. Tutto quello che abbiamo sono i punti di latitudine e longitudine del ristorante e il luogo di consegna. Possiamo usare la formula haversine per calcolare la distanza tra due posizioni in base alle loro latitudini e longitudini.


Di seguito è riportato come possiamo trovare la distanza tra il ristorante e il luogo di consegna in base alle loro latitudini e longitudini utilizzando la formula haversine:


#raggio terra in km
R = 6371

# Converte i gradi in radianti
def deg_to_rad(degrees):
    return degrees * (np.pi/180)

# Funzione per calcolare la distanza tra due punti usando la haversine formula
def distcalculate(lat1, lon1, lat2, lon2):
    d_lat = deg_to_rad(lat2-lat1)
    d_lon = deg_to_rad(lon2-lon1)
    a = np.sin(d_lat/2)**2 + np.cos(deg_to_rad(lat1)) * np.cos(deg_to_rad(lat2)) * np.sin(d_lon/2)**2
    c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
    return R * c
  
# Calcoliamo la distanza per ogni coppiaa di punti
data['distance'] = np.nan

for i in range(len(data)):
    data.loc[i, 'distance'] = distcalculate(data.loc[i, 'Restaurant_latitude'], 
                                        data.loc[i, 'Restaurant_longitude'], 
                                        data.loc[i, 'Delivery_location_latitude'], 
                                        data.loc[i, 'Delivery_location_longitude'])
    

Ora abbiamo calcolato la distanza tra il ristorante e il luogo di consegna. Abbiamo anche aggiunto una nuova funzionalità nel set di dati come distanza. Diamo un'occhiata di nuovo al set di dati:


print(data.head())

Oputput:

     ID Delivery_person_ID  Delivery_person_Age  Delivery_person_Ratings  \ 0  4607     INDORES13DEL02                   37                      4.9    1  B379     BANGRES18DEL02                   34                      4.5    2  5D6D     BANGRES19DEL01                   23                      4.4    3  7A6A    COIMBRES13DEL02                   38                      4.7    4  70A2     CHENRES12DEL01                   32                      4.6        Restaurant_latitude  Restaurant_longitude  Delivery_location_latitude  \ 0            22.745049             75.892471                   22.765049    1            12.913041             77.683237                   13.043041    2            12.914264             77.678400                   12.924264    3            11.003669             76.976494                   11.053669    4            12.972793             80.249982                   13.012793        Delivery_location_longitude Type_of_order Type_of_vehicle  Time_taken(min)  \ 0                    75.912471        Snack      motorcycle                24    1                    77.813237        Snack         scooter                33    2                    77.688400       Drinks      motorcycle                26    3                    77.026494       Buffet      motorcycle                21    4                    80.289982        Snack         scooter                30         distance   0   3.025149   1  20.183530   2   1.552758   3   7.790401   4   6.210138  


Esplorazione dei dati

Ora esploriamo i dati per trovare le relazioni tra le caratteristiche. Inizierò osservando la relazione tra la distanza e il tempo impiegato per consegnare il cibo:



figure = px.scatter(data_frame = data, 
                    x="distance",
                    y="Time_taken(min)", 
                    size="Time_taken(min)", 
                    trendline="ols", 
                    title = "Relationship Between Distance and Time Taken")
figure.show()
Prevedere i tempi di consegna con python e il deep learning
Prevedere i tempi di consegna con python e il deep learning

Esiste una relazione coerente tra il tempo impiegato e la distanza percorsa per consegnare il cibo. Significa che la maggior parte dei partner di consegna consegna il cibo entro 25-30 minuti, indipendentemente dalla distanza.


Ora diamo un'occhiata al rapporto tra il tempo impiegato per consegnare il cibo e l'età del partner di consegna:


figure = px.scatter(data_frame = data, 
                    x="Delivery_person_Age",
                    y="Time_taken(min)", 
                    size="Time_taken(min)", 
                    color = "distance",
                    trendline="ols", 
                    title = "Relationship Between Time Taken and Age")
figure.show() 
Prevedere i tempi di consegna con python e il deep learning
Prevedere i tempi di consegna con python e il deep learning

Esiste una relazione lineare tra il tempo impiegato per consegnare il cibo e l'età del partner di consegna. Significa che i giovani partner di consegna impiegano meno tempo per consegnare il cibo rispetto ai partner più anziani.


Ora diamo un'occhiata al rapporto tra il tempo impiegato per consegnare il cibo e le valutazioni del partner di consegna:



figure = px.scatter(data_frame = data, 
                    x="Delivery_person_Ratings",
                    y="Time_taken(min)", 
                    size="Time_taken(min)", 
                    color = "distance",
                    trendline="ols", 
                    title = "Relationship Between Time Taken and Ratings")
figure.show()
Prevedere i tempi di consegna con python e il deep learning
Prevedere i tempi di consegna con python e il deep learning

Esiste una relazione lineare inversa tra il tempo impiegato per consegnare il cibo e le valutazioni del partner di consegna. Significa che i partner di consegna con valutazioni più elevate impiegano meno tempo a consegnare il cibo rispetto ai partner con valutazioni basse.


Ora diamo un'occhiata se il tipo di cibo ordinato dal cliente e il tipo di veicolo utilizzato dal partner di consegna influisce o meno sui tempi di consegna:

fig = px.box(data, 
             x="Type_of_vehicle",
             y="Time_taken(min)", 
             color="Type_of_order")
fig.show()
Prevedere i tempi di consegna con python e il deep learning
Prevedere i tempi di consegna con python e il deep learningPrevedere i tempi di consegna con python e il deep learning

Non c'è molta differenza tra il tempo impiegato dai corrieri a seconda del veicolo che stanno guidando e il tipo di cibo che stanno consegnando.


Quindi le caratteristiche che contribuiscono maggiormente ai tempi di consegna del cibo in base alla nostra analisi sono:

  • età del partner di consegna

  • valutazioni del partner di consegna

  • distanza tra il ristorante e il luogo di consegna

Nella sezione seguente, ti illustrerò come addestrare un modello di Machine Learning per la previsione dei tempi di consegna del cibo.


Quindi le caratteristiche che contribuiscono maggiormente ai tempi di consegna del cibo in base alla nostra analisi sono:

  • età del partner di consegna

  • valutazioni del partner di consegna

  • distanza tra il ristorante e il luogo di consegna

Nella sezione seguente, ti illustrerò come addestrare un modello di Machine Learning per la previsione dei tempi di consegna del cibo.



Modello di previsione dei tempi di consegna del cibo

Ora addestriamo un modello di Machine Learning utilizzando un modello di rete neurale LSTM per l'attività di previsione del tempo di consegna del cibo:



# dividiamo i dati
from sklearn.model_selection import train_test_split
x = np.array(data[["Delivery_person_Age", 
                   "Delivery_person_Ratings", 
                   "distance"]])
y = np.array(data[["Time_taken(min)"]])
xtrain, xtest, ytrain, ytest = train_test_split(x, y, 
                                                test_size=0.10, 
                                                random_state=42)

# creiamo un LSTM neural network model
from keras.models import Sequential
from keras.layers import Dense, LSTM
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape= (xtrain.shape[1], 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
model.summary()

Oputput:


Modello: "sequenziale"
_________________________________________________________________
 Livello (tipo) Output Shape Param #   
=================================================== ===============
 lstm (LSTM) (Nessuno, 3, 128) 66560     
 lstm_1 (LSTM) (Nessuno, 64) 49408     
 denso (Denso) (Nessuno, 25) 1625      
 dense_1 (Dense) (Nessuno, 1) 26        
=================================================== ===============
Parametri totali: 117.619
Parametri addestrabili: 117.619
Parametri non addestrabili: 0

Penultimo passaggio, alleniamo il modello con queste linee di codice :


# Alleniamo il modello
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(xtrain, ytrain, batch_size=1, epochs=9)

l'output sarà questo :

Epoch 1/9 41033/41033 [==============================] - 188s 4ms/step - loss: 68.9068 

Epoch 2/9 41033/41033 [==============================] - 183s 4ms/step - loss: 64.1141 

Epoch 3/9 41033/41033 [==============================] - 177s 4ms/step - loss: 61.7114 

Epoch 4/9 41033/41033 [==============================] - 178s 4ms/step - loss: 60.5743 

Epoch 5/9 41033/41033 [==============================] - 177s 4ms/step - loss: 59.7754 

Epoch 6/9 41033/41033 [==============================] - 182s 4ms/step - loss: 59.5807 

Epoch 7/9 41033/41033 [==============================] - 177s 4ms/step - loss: 59.0811 

Epoch 8/9 41033/41033 [==============================] - 174s 4ms/step - loss: 59.3632 

Epoch 9/9 41033/41033 [==============================] - 161s 4ms/step - loss: 59.2885 

<keras.callbacks.History at 0x7fc38c25d400>

Ora testiamo le prestazioni del nostro modello fornendo input per prevedere il tempo di consegna del cibo:


#divertiti a fare previsioni
print("Food Delivery Time Prediction")
a = int(input("Età del Delivery Partner: "))
b = float(input("Voto della precedente consegna: "))
c = int(input("Distanza totale: "))

features = np.array([[a, b, c]])
print("Tempo previsto dal modello da aspettare in minuti = ", model.predict(features))

l'output sarà questo :

Food Delivery Time Prediction 

Età del Delivery Partner: 28 

Voto della precedente consegna: 2.8 

Distanza totale: 5 

1/1 [==============================] - 1s 782ms/step 

Tempo previsto dal modello da aspettare in minuti =  [[32.381138]]



Quindi è così che puoi utilizzare Deep Learning per l'attività di previsione dei tempi di consegna del cibo utilizzando il linguaggio di programmazione Python.


Riepilogo

Per prevedere il tempo di consegna del cibo in tempo reale, è necessario calcolare la distanza tra il punto di preparazione del cibo e il punto di consumo del cibo. Dopo aver trovato la distanza tra il ristorante e i luoghi di consegna, è necessario trovare le relazioni tra il tempo impiegato dai corrieri a consegnare il cibo in passato per la stessa distanza. Naturalmente questo si limita ad essere un semplice esempio. Per renderlo più realistico si potrebbe collegare alle api di google maps per aggiungere dati come il traffico, il numero di strade o percorsi disponibili, la velocità media percorsa in quelle strade e molto altro. Se ti va di estendere il progetto o di scaricarlo clica il bottone qui sotto:




PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png

Ciao 

🤗 Articoli consigliati dalla nostra
Intelligenza Artificiale in base ai tuoi interessi

Correlazione Alta

Correlazione Media

Correlazione Bassa

Iscriviti

VUOI DIVENTARE UN MEMBRO DI INTELLIGENZA ARTIFICIALE ITALIA GRATUITAMENTE E TRARNE I SEGUENTI BENEFICI?

Corsi Gratis

più di 150 lezioni online

Dataset Gratis

più di 150o dataset

Ebook Gratis

più di 10 libri da leggere

Editor Gratis

un editor python online

Progetti Gratis

più di 25 progetti python

App Gratis

4 servizi web con I.A.

Unisciti Ora a oltre
1.000.000
di lettori e appassionanti d'I.A.

Tutto ciò che riguarda l'intelligenza Artificiale, in unico posto, in italiano e gratis.

MEGLIO DI COSI' NON SI PUO' FARE

Dopo l'iscrizione riceverai diversi Regali

VUOI SCRIVERE ARTICOLI INSIEME A NOI.

Grazie

bottom of page