Mise en situation : avant de publier une moyenne, un analyste vérifie qu'une poignée de valeurs extrêmes ne la porte pas à elle seule. C'est le contrôle que vous allez outiller.
Écrivez outlier_report(values, seuil=2.0), qui reçoit une liste de mesures et retourne :
{
"moyenne": <moyenne, arrondie à 2 décimales>,
"ecart_type": <écart-type, arrondi à 2 décimales>,
"nb_outliers": <nombre de valeurs dont le z-score dépasse le seuil>,
"part_outliers": <leur part en %, arrondie à 2 décimales>,
"moyenne_nettoyee": <moyenne des valeurs restantes, arrondie à 2 décimales>,
}
Une valeur est aberrante quand |valeur − moyenne| / écart-type > seuil.
Contraintes — sans boucle for, tout doit passer par l'indexation booléenne et le broadcasting :
- liste vide → tout à 0.0 / 0, sans exception ;
- écart-type nul (toutes les valeurs identiques) → aucun outlier : c'est le cas qui provoque une division par zéro si on ne le traite pas ;
nb_outlierss'obtient en sommant un masque booléen,part_outliersen calculant sa moyenne.