Comment choisir les bonnes visualisations et les mettre en œuvre dans Streamlit pour mieux déboguer vos modèles de prévision ?
TL ; DR
Lorsqu'il s'agit de modèles de prévision, la meilleure approche est souvent d'itérer en permanence, en ajoutant des sources data , en améliorant l'ingénierie des caractéristiques, en peaufinant les paramètres du modèle... La plupart du temps, les scientifiques de Data ont tendance à se fixer sur un seul KPI(c.-à-d. RMSE, précision des prévisions...). Il y a souvent beaucoup plus d'informations derrière ces KPI qui doivent être analysées pour améliorer la prédiction. Construire un outil de visualisation approprié est un excellent moyen de plonger en profondeur dans le comportement du modèle, de repérer rapidement les points faibles de votre modèle, et donc de gagner en précision de manière efficace.
Cet article développera les questions clés que l'on doit se poser lors de l'évaluation d'un modèle de prévision, puis présentera les visualisations indispensables pour répondre à ces questions et enfin proposera une implémentation rapide sous un outil unifié pour rassembler toutes ces visualisations à l'aide de Streamlit.
Contexte
Cet article résume ce que nous avons appris en construisant un outil de visualisation unifié pour aider Data Scientists, Software Engineers, Product Owners & Demand Planner (experts commerciaux) à développer des modèles de prévision des ventes pour plus de 10 unités commerciales dans une entreprise de produits alimentaires et de boissons. Nos modèles établissaient des prévisions au niveau quotidien x entrepôt x produit, pour les 14 semaines à venir. Ils ont été développés à l'aide de méthodes de boosting et prennent en compte les caractéristiques des produits, les ventes historiques, les événements et les promotions data.
Questions clés à poser lors de l'évaluation d'un modèle de prévision
1. Le modèle est-il bon par rapport à la base de référence ?
Il est très utile d'avoir accès aux prévisions actuelles (par exemple les prévisions du planificateur de la demande) sur le même périmètre. Cela permet de bien comprendre le comportement de l'entreprise sur une période, un produit ou un lieu spécifique. Plus vous interrogez l'entreprise, plus vous obtenez d'informations et plus vous pouvez mettre en œuvre les bonnes fonctionnalités.
2. Chasse aux sur ou sous-prédictions et baisse de la précision des prévisions
Les questions incontournables sont les suivantes : Ai-je saisi la tendance globale ? Le modèle prend-il en compte les événements récurrents connus tels que les vacances, les fermetures d'entrepôts, les vacances scolaires ? Y a-t-il des baisses de précision sur des périodes particulières ?
Pourquoi est-ce important ?
Repérer ces événements est un excellent moyen d'obtenir des prévisions plus précises. Ces événements sont souvent bien connus des planificateurs de la demande et assez simples à mettre en œuvre dans votre modèle lorsque vous disposez des informations nécessaires. Par exemple, dans bon nombre de nos unités commerciales, certains produits sont vendus pour les déjeuners scolaires. L'introduction et la préparation d'une caractéristique représentant les vacances scolaires ont permis d'améliorer considérablement notre précision sur ces périodes particulières.
3. Traiter les spécificités des produits
Mes performances sont-elles homogènes sur mes marques / familles de produits ? Y a-t-il d'autres distinctions entre mes produits (produits vendus uniquement pendant les périodes de promotion, best-sellers vs. produits à faible volume, produits ) ?
Pourquoi est-ce important ?
Ces questions vous aident à comprendre l'entreprise plus précisément. Par exemple, la division des modèles en fonction de l'importance des produits en termes de volume permet souvent d'accroître les performances. En effet, la demande de produits courants est très différente de la demande de produits promotionnels ou de produits moins courants, qui peuvent être fortement corrélés avec les périodes de promotion ou avoir un profil de vente très épars. Dans la plupart des cas, nous avons formé des modèles distincts pour traiter ces différents types de produits.
4. Les effets constitutifs sont-ils correctement pris en compte ?
Le modèle saisit-il correctement les effets de promotion ? Existe-t-il des effets de cannibalisation ? Le modèle s'adapte-t-il bien aux phénomènes exogènes (ex : grèves) ?
Pourquoi est-ce important ?
N'hésitez pas à vous référer à l'article précédent de notre série Prévisions pour aborder la promotion data: 5 conseils pour mieux prendre en compte la promotion data
Comment analyser votre modèle de prévision : des macro-IPC à l'évaluation sur un périmètre spécifique
Quelles sont les visualisations indispensables ?
Pour construire votre outil d'évaluation, vous devez combiner deux éléments :

La partie filtre doit permettre de filtrer sur plusieurs axes : la période d'analyse, les lieux (détaillant, entrepôt...), les produits (un ensemble de produits), et enfin les catégories de produits.
Nous recommandons au moins les 4 visualisations suivantes :
Comment commencer à construire le tableau de bord de votre studio de prévision en utilisant Streamlit ?
Streamlit est une bibliothèque python open source qui permet de créer des applications web partageables en quelques minutes et qui continue de gagner en popularité au sein de la communauté scientifique Data . Dans cet article, nous ne présenterons pas l'outil car de nombreux articles sont déjà disponibles sur ce sujet, mais nous nous concentrerons sur la mise en œuvre facile d'une visualisation.
Le choix d'utiliser Streamlit pour ce type de projet a été motivé par plusieurs conditions préalables :
1. Structure globale de votre tableau de bord de prévision
Avant de se plonger dans la mise en œuvre, le préalable à la construction d'un tableau de bord est de dessiner les parties de votre application.
Pour une mise en œuvre propre, vous pouvez diviser votre code en plusieurs parties :
| ├── config.py | ||
| ├── forecasting_studio | ||
| │ ├─── forecast_analysis | ||
| │ │ └── fig_forecast_analysis.py | ||
| │ └─── pages | ||
| │ └── forecast_analysis.py | ||
|
La page principale présente la structure globale de votre application, c'est-à-dire la disposition globale de votre application : dans notre cas, une disposition large, et une barre latérale pour afficher le nom de votre application et les pages disponibles.
| importation streamlit comme st | |
| from forecasting_studio.pages import forecast_analysis | |
| PAGES = | |
| def write_page(page) : | |
| page.write() | |
| def main() : | |
| st.sidebar.title("Forecasting Studio") | |
| selection = st.sidebar.selectbox("", list(PAGES.keys())) | |
| page = PAGES[sélection] | |
| write_page(page) | |
| si __name__ == "__main__": | |
| st.set_page_config(layout="wide") | |
| main() |
Le fichier de configuration, dans lequel nous rassemblons les couleurs et les différentes configurations pour toutes vos figures Plotly.
| X_AXIS_TEMPLATE = dict(showline=True, | |
| showgrid=False, | |
| showticklabels=True, | |
| linecolor="grey", | |
| largeur deligne=2, | |
| ticks="outside", | |
| tickfont=dict(family="Arial",size=12, color="rgb(82, 82, 82)")) | |
| Y_AXIS_TEMPLATE = dict(showline=True, | |
| showgrid=True, | |
| linecolor="grey", | |
| gridcolor="lightgrey") | |
| LEGEND = dict(orientation="h", yanchor="bottom", y=1.02, xanchor="right",x=1) | |
| COLORDISCRETE = ["#002244", "#ff0066", "#66cccc", "#ff9933", "#337788", | |
| "#429e79", "#474747", "#f7d126", "#ee5eab", "#b8b8b8"]. |
2.Construction de la visualisation de l'évolution de la précision des prévisions
Tout d'abord, nous allons rassembler nos figures Plotly dans un script :
| importation pandas comme pd | |
| de typage importer Liste | |
| import plotly.graph_objects as go | |
| from config import COLORDISCRETE, LEGEND, X_AXIS_TEMPLATE, Y_AXIS_TEMPLATE | |
| def fig_evolution_of_fa(forecasts_per_target_date: pd.DataFrame, | |
| events: List = None) -> go.Figure : | |
| "Figure représentant l'évolution de la précision des prévisions | |
| sur la période de backtest | |
| Paramètres | |
| ---- | |
| forecasts_per_target_date : pd.DataFrame | |
| Ensemble de données prévisionnelles contenant au moins 3 colonnes : | |
| - 'target_date' : la date pour laquelle vous faites des prévisions | |
| - 'forecast_accuracy' : votre ICP de précision | |
| - 'week_nb' : identifiant de la semaine (de 0 à 52) | |
| - (facultatif) 'demand_planner_forecast_accuracy' : votre prévision de base | |
| Clé primaire : 'target_date' | |
| événements : Liste, optionnel | |
| une liste de couples de dates, représentant des périodes, par défaut None | |
| """ | |
| fig_fa_score = go.Figure() | |
| fig_fa_score.add_trace( | |
| go.Scatter( | |
| name="Model Forecast Accuracy", | |
| x=forecasts_per_target_date['target_date'], | |
| y=forecasts_per_target_date['forecast_accuracy'], | |
| hovertext=forecasts_per_target_date['week_nb'], | |
| marker_color=COLORDISCRETE[0])) | |
| # Si vous disposez d'une ligne de base, vous pouvez ajouter une colonne supplémentaire à votre | |
| # jeu de données pour l'afficher sur un graphique linéaire | |
| if 'demand_planner_forecast_accuracy' in forecasts_per_target_date.columns: | |
| fig_fa_score.add_trace( | |
| go.Scatter( | |
| name="Précision des prévisions des planificateurs de la demande", | |
| x=forecasts_per_target_date['target_date'], | |
| y=forecasts_per_target_date['demand_planner_forecast_accuracy'], | |
| hovertext=forecasts_per_target_date['week_nb'], | |
| marker_color=COLORDISCRETE[2])) | |
| fig_fa_score.update_xaxes(range=(min(forecasts_per_target_date['target_date']), | |
| max(forecasts_per_target_date['target_date']))) | |
| fig_fa_score.update_traces(mode='lines+markers', line_shape='spline') | |
| fig_fa_score.update_layout( | |
| xaxis_title="Date cible", | |
| yaxis_title="FA Score", | |
| plot_bgcolor='white', | |
| legend=LEGEND, | |
| xaxis=X_AXIS_TEMPLATE, | |
| yaxis=Y_AXIS_TEMPLATE) | |
| si les événements: | |
| fig_fa_score.update_layout( | |
| shapes=[get_vertical_filled_area(segment[0], segment[1], 'rgb(102, 204, 204)') | |
| pour segment dans événements]) | |
| retour fig_fa_score | |
| def get_vertical_filled_area(start: float, end: float, color: str = "blue") -> dict: | |
| """Retourne une dictée de forme verticale tracée, utilisée pour mettre en évidence des événements sur des figures"" | |
| return dict(type="rect", | |
| xref="x", | |
| yref="paper", | |
| x0=début, | |
| y0=0, | |
| x1=fin, | |
| y1=1, | |
| fillcolor=color, | |
| layer="below", | |
| largeur_de_ligne=0, | |
| opacité=0,5) |
Nous allons enfin mettre en place notre page d'analyse des prévisions, qui chargera notre jeu de données, répartira nos chiffres sur différentes colonnes, ...
| importation pandas comme pd | |
| importation streamlit comme st | |
| from forecasting_studio.forecast_analysis.fig_forecast_analysis import fig_evolution_of_fa | |
| def write() -> None: | |
| st.title('Analyse des prévisions') | |
| df = pd.read_csv('your_dataset.csv') | |
| # Vous pouvez charger ici des événements personnalisés à afficher | |
| # ex : events = [('2019-07-01', '2019-09-01'), ('2020-07-01', '2020-09-01')] | |
| événements = Aucun | |
| evo_cont1, evo_cont2 = st.beta_columns(2) | |
| evo_cont1.subheader('Evolution de la précision des prévisions') | |
| fig_evo_fa = fig_evolution_of_fa(df, events) | |
| evo_cont1.plolty_fig(fig_evo_fa) | |
| si __name__ == "__main__" : | |
| écrire() |
Tadam ! Voici notre application :

Jetons un coup d'œil à la figure présentée. En ce qui concerne les points précédents que nous avons discutés, voici les points clés de notre figure :
Conclusion :
Une fois que vous avez construit votre outil de visualisation, il est temps de le déployer. Voici une excellente ressource pour partager votre application : Comment déployer et sécuriser votre application Streamlit dans GCP ?
Merci beaucoup d'avoir lu jusqu'à présent, n'hésitez pas à nous contacter si vous avez des questions. Vous pouvez en savoir plus sur nos projets en visitant notre blog.

BLOG







