Maison >développement back-end >Tutoriel Python >Prévision de la demande et gestion des stocks dans les magasins de détail - Modèle SARIMA

Prévision de la demande et gestion des stocks dans les magasins de détail - Modèle SARIMA

Linda Hamilton
Linda Hamiltonoriginal
2024-11-27 04:21:20537parcourir

Le magasin de détail gère quotidiennement des stocks à grande échelle, ce qui rend le suivi et la gestion des stocks plus fastidieux. La gestion traditionnelle des stocks des magasins de détail est une méthodologie lourde avec une surveillance, un suivi et une gestion inefficaces. Cela nécessite un système de gestion des stocks numérisé robuste qui effectue de manière transparente des analyses des stocks des magasins de détail afin de réduire les stocks disponibles et d'augmenter les stocks en vente avec moins de travail manuel.

Cet article montre comment SARIMA, un modèle d'apprentissage automatique de séries chronologiques, peut être utilisé pour effectuer efficacement une analyse des stocks des magasins de détail et calculer le paramètre d'inventaire nécessaire pour répondre aux besoins des clients au fil du temps, bénéficiant ainsi au magasin de détail avec un profit maximal.

Demand Forecasting and Inventory Management in Retail Store - SARIMA Model


JEU DE DONNÉES

Pour commencer, téléchargez l'ensemble de données. Cet ensemble de données contient un enregistrement historique d'un produit spécifique qui comprend des informations sur la date, la demande du produit et les niveaux de stock actuels.


CODE

Le code Python pour effectuer la prévision de la demande et la gestion des stocks est le suivant.

import pandas as pd
import numpy as np
import plotly.express as px
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
import matplotlib.pyplot as plt
from statsmodels.tsa.statespace.sarimax import SARIMAX

data = pd.read_csv("demand_inventory.csv")
print(data.head())

data = data.drop(columns=['Unnamed: 0'])

fig_demand = px.line(data, x='Date', y='Demand', title='Demand Over Time')
fig_demand.show()

fig_inventory = px.line(data, x='Date', y='Inventory', title='Inventory Over Time')
fig_inventory.show()

data['Date'] = pd.to_datetime(data['Date'], format='%Y/%m/%d')
time_series = data.set_index('Date')['Demand']

differenced_series = time_series.diff().dropna()

# Plot ACF and PACF of differenced time series
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
plot_acf(differenced_series, ax=axes[0])
plot_pacf(differenced_series, ax=axes[1])
plt.show()

order = (1, 1, 1)
seasonal_order = (1, 1, 1, 2)
model = SARIMAX(time_series, order=order, seasonal_order=seasonal_order)
model_fit = model.fit(disp=False)
future_steps = 10
predictions = model_fit.predict(len(time_series), len(time_series) + future_steps - 1)
predictions = predictions.astype(int)
print(predictions)

# Create date indices for the future predictions
future_dates = pd.date_range(start=time_series.index[-1] + pd.DateOffset(days=1), periods=future_steps, freq='D')

# Create a pandas Series with the predicted values and date indices
forecasted_demand = pd.Series(predictions, index=future_dates)

# Initial inventory level
initial_inventory = 5500

# Lead time (number of days it takes to replenish inventory)
lead_time = 1

# Service level (probability of not stocking out)
service_level = 0.95

# Calculate the optimal order quantity using the Newsvendor formula
z = np.abs(np.percentile(forecasted_demand, 100 * (1 - service_level)))
order_quantity = np.ceil(forecasted_demand.mean() + z).astype(int)

# Calculate the reorder point
reorder_point = forecasted_demand.mean() * lead_time + z

# Calculate the optimal safety stock
safety_stock = reorder_point - forecasted_demand.mean() * lead_time

# Calculate the total cost (holding cost + stockout cost)
holding_cost = 0.1  # it's different for every business, 0.1 is an example
stockout_cost = 10  # # it's different for every business, 10 is an example
total_holding_cost = holding_cost * (initial_inventory + 0.5 * order_quantity)
total_stockout_cost = stockout_cost * np.maximum(0, forecasted_demand.mean() * lead_time - initial_inventory)

# Calculate the total cost
total_cost = total_holding_cost + total_stockout_cost

print("Optimal Order Quantity:", order_quantity)
print("Reorder Point:", reorder_point)
print("Safety Stock:", safety_stock)
print("Total Cost:", total_cost)

COMPRENDRE LE CODE

Nous commençons par visualiser la « Demande au fil du temps » et l’« Inventaire au fil du temps » à partir desquels un modèle saisonnier peut être observé. Nous utilisons donc SARIMA — Moyenne mobile autorégressive saisonnière pour prévoir la demande.

Pour utiliser SARIMA, nous avons besoin de p (ordre auto-régressif), d (degré de différenciation), q (ordre de moyenne mobile), P (ordre AR saisonnier), D (différence saisonnière) et Q (ordre MA saisonnier) . ACF — Fonction d'autocorrélation et PACF — Fonction d'autocorrélation partielle sont tracées pour trouver les valeurs des paramètres.

Maintenant, pour prévoir, nous initialisons quelques valeurs. Nous définissons les étapes futures, c'est-à-dire les jours pour prévoir, à 10, le délai, c'est-à-dire le nombre de jours pour réapprovisionner l'inventaire, à 1 et d'autres valeurs dépendantes du magasin de détail.

Enfin, pour calculer le résultat optimal de l'inventaire, nous utilisons la formule NewsVendor. La formule NewsVendor est dérivée du modèle NewsVendor qui est un modèle mathématique utilisé pour déterminer le niveau de stock optimal. Vous pouvez en savoir plus sur la formule NewsVendor à partir de cet article.

Les résultats finaux évalués sont,

  1. Quantité de commande optimale — Fait référence à la quantité d'un produit qui doit être commandée auprès des fournisseurs lorsque le niveau de stock atteint un certain point.
  2. Point de réapprovisionnement — Le niveau de stock auquel une nouvelle commande doit être passée pour reconstituer le stock avant qu'il ne soit épuisé.
  3. Stock de sécurité – Inventaire supplémentaire conservé pour tenir compte des incertitudes liées à la demande et à l'offre. Il agit comme un tampon contre les variations inattendues de la demande ou des délais de livraison.
  4. Coût total : représente les coûts combinés associés à la gestion des stocks.

Le modèle SARIMA proposé a numérisé la gestion des stocks des magasins de détail de manière efficace en utilisant la formule Newsvendor pour calculer l'inventaire optimal nécessaire pour satisfaire les clients tout en bénéficiant aux détaillants avec un profit maximum.


J'espère que cet article vous a aidé avec ce que vous recherchiez. Toute amélioration ou suggestion pour l’article est la bienvenue. Bravo :)

Consultez mes réseaux sociaux ici et n'hésitez pas à vous connecter ^_^

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn