Gestion des Stocks avec Python : Cours et Exercices
La gestion des stocks est un élément crucial dans la gestion d’une entreprise, car elle permet d’assurer la disponibilité des produits tout en minimisant les coûts associés. Cet article vous guidera à travers les concepts clés de la gestion des stocks, les formules essentielles, et vous proposera des exercices pratiques avec des solutions détaillées.
Introduction à la Gestion des Stocks
La gestion des stocks consiste à superviser l’approvisionnement, le stockage, et la distribution des produits. Une gestion efficace des stocks permet de maintenir un équilibre entre la satisfaction des besoins des clients et la réduction des coûts de stockage.
Objectifs de la Gestion des Stocks
- Disponibilité des produits : Assurer que les produits nécessaires soient disponibles au bon moment.
- Réduction des coûts : Minimiser les coûts de stockage, de commande, et de pénurie.
- Amélioration de l’efficacité opérationnelle : Optimiser les processus de commande et de stockage.
Les Différents Types de Stocks
- Stock de sécurité : Stock supplémentaire pour prévenir les pénuries en cas d’imprévus.
- Stock en transit : Stock qui est en cours de transport vers l’entreprise ou les clients.
- Stock obsolète : Produits qui ne sont plus vendables en raison de changements de demande ou de technologie.
Les Méthodes de Gestion des Stocks
- Méthode du juste-à-temps (JAT) : Réduit les niveaux de stock en produisant ou en commandant juste ce qui est nécessaire.
- Méthode de la commande à point de réapprovisionnement : Une commande est passée lorsque le stock atteint un certain niveau prédéfini.
- Méthode ABC : Classe les articles en catégories A, B, ou C selon leur importance relative, pour optimiser la gestion.
Formules Essentielles en Gestion des Stocks
1. La Quantité Économique de Commande (QEC)
La QEC est la quantité optimale à commander pour minimiser les coûts totaux de stockage et de commande.
# Quantité Économique de Commande (QEC)
from math import sqrt
D = 1000 # Demande annuelle en unités
C = 50 # Coût de passation d'une commande en monnaie locale
H = 2 # Coût de stockage unitaire annuel en monnaie locale
QEC = sqrt((2 * D * C) / H)
print("La Quantité Économique de Commande est:", QEC)
Interprétation : La QEC indique combien de produits commander à chaque fois pour minimiser les coûts.
2. Le Point de Réapprovisionnement (PR)
Le PR détermine le niveau de stock auquel une nouvelle commande doit être passée.
# Point de Réapprovisionnement (PR)
d = 10 # Demande journalière moyenne en unités
L = 5 # Délai de livraison en jours
SS = 50 # Stock de sécurité
PR = (d * L) + SS
print("Le Point de Réapprovisionnement est:", PR)
Interprétation : Lorsque le stock atteint le PR, une nouvelle commande doit être passée pour éviter la rupture de stock.
3. Le Stock de Sécurité (SS)
Le stock de sécurité est le stock supplémentaire pour prévenir les ruptures de stock dues aux incertitudes.
# Stock de Sécurité (SS)
d_std = 2 # Écart-type de la demande journalière
L_std = 1 # Écart-type du délai de livraison
z = 1.65 # Facteur de sécurité (niveau de service de 95%)
SS = z * sqrt((L * d_std**2) + (d**2 * L_std**2))
print("Le Stock de Sécurité est:", SS)
Interprétation : Le SS garantit que l’entreprise peut répondre à la demande même en cas de fluctuations.
Exercices Pratiques
Exercice 1 : Calcul de la QEC
Énoncé : Une entreprise a une demande annuelle de 2000 unités pour un produit. Le coût de passation d’une commande est de 40 unités monétaires, et le coût de stockage unitaire est de 1 unité monétaire par an. Calculez la QEC.
# Solution
D = 2000 # Demande annuelle en unités
C = 40 # Coût de passation d'une commande
H = 1 # Coût de stockage unitaire annuel
QEC = sqrt((2 * D * C) / H)
print("La Quantité Économique de Commande est:", QEC)
Réponse : La QEC est de 400 unités.
Exercice 2 : Détermination du Point de Réapprovisionnement
Énoncé : Un produit a une demande journalière moyenne de 15 unités, un délai de livraison de 4 jours, et un stock de sécurité de 60 unités. Calculez le point de réapprovisionnement.
# Solution
d = 15 # Demande journalière moyenne en unités
L = 4 # Délai de livraison en jours
SS = 60 # Stock de sécurité
PR = (d * L) + SS
print("Le Point de Réapprovisionnement est:", PR)
Réponse : Le point de réapprovisionnement est de 120 unités.
Exercice 3 : Calcul du Stock de Sécurité
Énoncé : Pour un produit, l’écart-type de la demande journalière est de 5 unités et celui du délai de livraison est de 2 jours. Le délai de livraison est de 3 jours, et la demande journalière moyenne est de 20 unités. Le facteur de sécurité est de 1,96 (niveau de service de 97,5%). Calculez le stock de sécurité.
# Solution
d_std = 5 # Écart-type de la demande journalière
L_std = 2 # Écart-type du délai de livraison
z = 1.96 # Facteur de sécurité (niveau de service de 97,5%)
L = 3 # Délai de livraison en jours
d = 20 # Demande journalière moyenne
SS = z * sqrt((L * d_std**2) + (d**2 * L_std**2))
print("Le Stock de Sécurité est:", SS)
Réponse : Le stock de sécurité est de 39,2 unités.
Cas Pratique de Gestion de Stock avec Python
Dans ce cas pratique, nous allons développer un petit script Python qui permet de gérer les stocks d’une entreprise. Le script inclura des fonctionnalités pour :
- Ajouter des produits au stock.
- Mettre à jour les quantités en stock.
- Vérifier les niveaux de stock et passer une commande automatique si le stock est inférieur au point de réapprovisionnement.
- Calculer la quantité économique de commande (QEC).
Scénario
Vous gérez un petit entrepôt pour une entreprise de vente de produits électroniques. Chaque produit a une demande journalière moyenne, un délai de livraison spécifique, et un stock de sécurité calculé. Le script doit être capable de gérer plusieurs produits et effectuer les calculs de gestion de stock automatiquement.
Code Python
Voici le code Python pour gérer ce cas pratique :
from math import sqrt
class Product:
def __init__(self, name, daily_demand, lead_time, order_cost, holding_cost, safety_stock):
self.name = name
self.daily_demand = daily_demand
self.lead_time = lead_time
self.order_cost = order_cost
self.holding_cost = holding_cost
self.safety_stock = safety_stock
self.current_stock = 0
def calculate_reorder_point(self):
reorder_point = (self.daily_demand * self.lead_time) + self.safety_stock
return reorder_point
def calculate_economic_order_quantity(self):
QEC = sqrt((2 * self.daily_demand * 365 * self.order_cost) / self.holding_cost)
return QEC
def update_stock(self, quantity):
self.current_stock += quantity
print(f"Stock mis à jour pour {self.name}: {self.current_stock} unités")
def check_stock(self):
reorder_point = self.calculate_reorder_point()
if self.current_stock <= reorder_point:
order_quantity = self.calculate_economic_order_quantity()
print(f"Commande automatique pour {self.name}: {order_quantity} unités")
self.update_stock(order_quantity)
else:
print(f"Stock suffisant pour {self.name}: {self.current_stock} unités")
# Exemple d'utilisation
# Initialisation des produits
product1 = Product(name="Téléphone", daily_demand=20, lead_time=5, order_cost=50, holding_cost=2, safety_stock=100)
product2 = Product(name="Tablette", daily_demand=10, lead_time=7, order_cost=40, holding_cost=3, safety_stock=50)
# Mise à jour du stock initial
product1.update_stock(200)
product2.update_stock(150)
# Vérification du stock et passage de commande si nécessaire
product1.check_stock()
product2.check_stock()
# Affichage des quantités économiques de commande (QEC)
print(f"Quantité Économique de Commande pour {product1.name}: {product1.calculate_economic_order_quantity()} unités")
print(f"Quantité Économique de Commande pour {product2.name}: {product2.calculate_economic_order_quantity()} unités")
Explication du Code
- Classe
Product
: Représente un produit dans l’entrepôt. Elle stocke les informations sur le produit telles que la demande journalière, le délai de livraison, le coût de commande, le coût de stockage, et le stock de sécurité. - Méthode
calculate_reorder_point()
: Calcule le point de réapprovisionnement pour le produit en fonction de la demande journalière, du délai de livraison, et du stock de sécurité. - Méthode
calculate_economic_order_quantity()
: Calcule la quantité économique de commande (QEC) pour minimiser les coûts de stockage et de commande. - Méthode
update_stock(quantity)
: Met à jour la quantité de stock pour le produit. - Méthode
check_stock()
: Vérifie si le stock actuel est inférieur au point de réapprovisionnement. Si oui, une commande est passée automatiquement. - Exemple d’utilisation : Deux produits sont initialisés (
Téléphone
etTablette
), leur stock est mis à jour, et le script vérifie si une commande doit être passée. Il affiche également les quantités économiques de commande pour chaque produit.
Résultat
Le script exécutera les opérations suivantes :
- Mettra à jour le stock pour les produits “Téléphone” et “Tablette”.
- Vérifiera si le stock actuel est suffisant ou si une commande automatique est nécessaire.
- Affichera les quantités économiques de commande calculées pour chaque produit.
Ce script est un exemple simple mais puissant pour gérer efficacement les stocks dans une petite entreprise. Vous pouvez l’adapter pour ajouter des fonctionnalités supplémentaires telles que la gestion des fournisseurs, des alertes par email, ou une interface utilisateur.
Voici quelques sujets supplémentaires pour enrichir vos compétznces de gestion de stock en Python.
Gestion des Fournisseurs et Délais de Livraison
Dans une gestion de stock efficace, la relation avec les fournisseurs est cruciale. Les délais de livraison, la qualité des produits, et la fiabilité des fournisseurs jouent un rôle déterminant dans la gestion des stocks. Dans notre cas pratique, vous pouvez améliorer le script en ajoutant une gestion des fournisseurs pour chaque produit. Par exemple, vous pouvez stocker les informations du fournisseur, surveiller les délais de livraison réels par rapport aux délais prévus, et ajuster le stock de sécurité en fonction de la fiabilité du fournisseur.
⚫ Code pour Gérer les Fournisseurs
class Supplier:
def __init__(self, name, reliability):
self.name = name
self.reliability = reliability # Ex: 95% de livraisons dans les délais
class ProductWithSupplier(Product):
def __init__(self, name, daily_demand, lead_time, order_cost, holding_cost, safety_stock, supplier):
super().__init__(name, daily_demand, lead_time, order_cost, holding_cost, safety_stock)
self.supplier = supplier
# Exemple d'utilisation
supplier1 = Supplier(name="Fournisseur A", reliability=0.95)
product_with_supplier = ProductWithSupplier(name="Ordinateur Portable", daily_demand=5, lead_time=10, order_cost=100, holding_cost=10, safety_stock=20, supplier=supplier1)
print(f"Produit: {product_with_supplier.name}, Fournisseur: {product_with_supplier.supplier.name}, Fiabilité: {product_with_supplier.supplier.reliability}")
Gestion des Pénuries et Stratégies d’Approvisionnement
Les pénuries de stock peuvent avoir des conséquences graves sur les opérations de l’entreprise, y compris des pertes de ventes et une insatisfaction des clients. Pour prévenir les pénuries, une entreprise doit adopter des stratégies d’approvisionnement efficaces telles que la commande anticipée, la diversification des sources d’approvisionnement, et l’utilisation de stocks de sécurité.
Dans le script Python, vous pouvez simuler une situation de pénurie et implémenter une stratégie pour y remédier. Par exemple, si un produit tombe en dessous de son point de réapprovisionnement, le système peut automatiquement passer une commande à un fournisseur alternatif ou activer un stock de réserve.
🟢 Code pour Gérer les Pénuries
class ProductWithShortage(Product):
def handle_shortage(self):
if self.current_stock < self.calculate_reorder_point():
print(f"Attention: Pénurie de stock pour {self.name}. Activation du stock de réserve ou passage de commande urgente.")
# Simuler une commande urgente ou l'utilisation d'un stock de réserve
self.update_stock(self.safety_stock)
print(f"Stock mis à jour après pénurie pour {self.name}: {self.current_stock} unités")
# Exemple d'utilisation
product_shortage = ProductWithShortage(name="Imprimante", daily_demand=3, lead_time=4, order_cost=30, holding_cost=5, safety_stock=15)
product_shortage.update_stock(10)
product_shortage.handle_shortage()
Optimisation des Coûts dans la Gestion des Stocks
L’un des principaux objectifs de la gestion des stocks est la minimisation des coûts, qui incluent les coûts de commande, les coûts de stockage, et les coûts de pénurie. Le modèle de la quantité économique de commande (QEC) est un outil puissant pour atteindre cet objectif, mais il ne doit pas être utilisé de manière isolée. L’entreprise doit également considérer d’autres facteurs tels que les remises pour volume, les fluctuations de la demande, et les coûts d’opportunité.
Vous pouvez enrichir le script Python en intégrant des modèles plus avancés pour l’optimisation des coûts, tels que le modèle de Wilson avec des remises pour volume ou la programmation linéaire pour minimiser les coûts totaux tout en respectant les contraintes opérationnelles.
🟡 Code pour Optimiser les Coûts avec Remises
class ProductWithDiscount(Product):
def calculate_discounted_economic_order_quantity(self, discount_rate):
original_qec = self.calculate_economic_order_quantity()
discounted_qec = original_qec * (1 - discount_rate)
return max(discounted_qec, original_qec)
# Exemple d'utilisation
product_discount = ProductWithDiscount(name="Scanner", daily_demand=4, lead_time=6, order_cost=25, holding_cost=3, safety_stock=10)
discount_rate = 0.10 # 10% de remise pour volume
print(f"QEC avec remise pour {product_discount.name}: {product_discount.calculate_discounted_economic_order_quantity(discount_rate)} unités")
Prévisions de la Demande et Gestion Dynamique des Stocks
La gestion des stocks ne doit pas seulement se baser sur les données historiques, mais aussi anticiper les changements dans la demande future. Pour ce faire, des techniques de prévision telles que la moyenne mobile, lissage exponentiel, ou encore les modèles ARIMA peuvent être intégrées dans le processus de gestion des stocks. Ces techniques permettent de rendre la gestion des stocks plus dynamique et réactive aux variations du marché.
Dans le script Python, vous pourriez implémenter une simple prévision de la demande basée sur une moyenne mobile et ajuster les niveaux de stock en conséquence.
🟤 Code pour Prévisions de la Demande
import numpy as np
class ProductWithForecast(Product):
def forecast_demand(self, past_demand):
return np.mean(past_demand)
# Exemple d'utilisation
product_forecast = ProductWithForecast(name="Routeur", daily_demand=0, lead_time=5, order_cost=20, holding_cost=2, safety_stock=30)
past_demand = [12, 15, 13, 14, 16] # Historique des demandes
forecasted_demand = product_forecast.forecast_demand(past_demand)
print(f"Demande prévue pour {product_forecast.name}: {forecasted_demand} unités par jour")
Ces exemples de code offrent une vue plus complète de la gestion des stocks en intégrant des aspects tels que la gestion des fournisseurs, les stratégies d’approvisionnement, l’optimisation des coûts, et les prévisions de la demande. Ces éléments permettent de construire un système de gestion des stocks plus robuste et adaptable aux réalités du marché.