Comment éliminer un intrus (ou deux) dans une série de 10

Bonjour, je fais toutes les 5 minutes des relevés d'un capteur, pensant que la moyenne suffirait, mais il y a souvent un gros intrus qui gâche vraiment tout. Je me demandais comment l'éliminer.
Voici quelques exemples :

6518	6305	6426	6439
6518	6304	6421	>6329
6518	6304	6419	6441
6518	>6042	6415	6437
6518	6304	>6457	6429
>6596	6304	6420	6427
6519	6305	6414	6429
6519	6304	6415	6427
6518	6304	6415	6433
6518	6303	>6165	6428

Bien, à vous,
le vieux

comment avez vous déterminé que c'est un intrus ? c'est le signe '>' ou c'est vous qui l'avez rajouté ?

Bonjour @J-M-L

Avec tout mon respect, Il est évident que c'est moi qui l'ai ajouté, sinon je n'aurais pas besoin de vos conseils.

Merci beaucoup

Sauf votre respect :wink: ce n'est pas évident sinon je n'aurais pas demandé. On a des personnes de tout niveau sur ce forum et donc on voit de tout .

Si on suppose que les données sont en colonnes et pas simplement une seule série avec des passages à la ligne, effectivement sur une représentation graphique on voit bien les points exceptionnels

Si vous ne connaissez pas l'intervalle de valeurs acceptables a priori, comme l'intrus peut arriver au début ou au milieu, peut-être qu'une phase d'initialisation pendant laquelle vous faites un enregistrement d'un certain nombre d'échantillons desquels vous enlevez le min et le max puis calculez la valeur moyenne vous donnerait une "cible" de stabilité et tout point loin de cette cible serait considéré ensuite suspect.

Dans le cas où les mesures fausses sont provoquées par des éléments extérieurs j'utilise l'écart type.

  1. je calcule l'écart type sur toute l'étendue de la série de mesures
  2. J'élimine les mesures à plus de x écarts type --> x est à déterminé en fonction de la situation.
  3. pour vérification je recalcule l'écart type qui doit être plus faible.

Exemple avec ta première colonne et traitement dans un tableur :
J'ai rejeté toutes mesures à plus d'un écart type.
Screenshot_20210706_133548

Le calcul de la moyenne et de la médiane permet de voir qu'après avoir éliminé les points faux les valeurs de la moyenne et de la médiane sont devenues très proches.
Normalement si la distribution est gaussienne les deux valeurs sont égales.

Écart type :
Soit d la distance d'un point de mesure à la moyenne des points de mesure.
L'écart type est égal à la racine carrée de la moyenne des carrés des distances.
C'est ce qu'aux USA ils appellent RMS (root mean square).

Moyenne : c'est la moyenne arithmétique.

Médiane : valeur telle qu'il y a autant de nombre de points supérieurs que de nombre de points inférieurs.

Désolé de vous avoir malmené. @J-M-L
Le titre de mon topic est « Comment éliminer un intrus (ou deux) dans une série de 10 », et j'ai montré plusieurs séries. Votre 1er graphe montre bien les 4 séries problématiques.

J'ai pensé à un intervalle acceptable, mais si la 1ère valeur est foireuse, cela ne va pas fonctionner.
En écrivant tout ceci, mon cerveau commence à ébaucher un algorithme ou tout au moins des conditions, du style qu'au moins 7 valeurs doivent être dans la fourchette acceptable (que seule l'expérimentation pourra me dire). Autrement dit, je commence par un tri et si je n'ai pas 7 valeurs, je supprime la référence (ici la 1ère valeur) et réessaye avec les 9 suivantes.

Y a plu ka :wink:


Entre temps, je vois la réponse plus scientifique de @68tjs
Mais il faut aussi la mettre en œuvre, et c'est aussi un peu pour cela que j'ai ouvert ce topic :wink:

Il faut quelque chose d'économe car c'est pour mettre dans un petit ESP-01

Réfléchissons

Il serait peut-être plus judicieux de trouver l'origine du problème pour corriger à la source.

1 Like

C'est un capteur de pression dans une une situation stable. Ces variations sont malheureusement normales. Là, je fais des relevés pour mesurer l'impact de la pression atmosphérique.
une salve de 10 relevés toutes les 5 minutes, + le relevé d'un BMP180

Bonjour

cette librairie fera peut être l'affaire (filtre median) :
https://www.arduino.cc/reference/en/libraries/medianfilterlib/
(d'autres libariries implémentant un fltre médian sont disponibles dans le gestionnaire de librairie)

Tu pourrais faire un filtre médian.
On tri les valeurs par ordre croissant et on garde la valeur centrale.
Sur une dizaine de valeurs c'est rapide. L'avantage c'est qu'il n'y a pas de calcul en flottant.

1 Like

Ah bin oui, voilà une idée qui est bonne :
J'ai augmenté le nbre de relevés à 11, on a ainsi un vrai médian.

int Median(int Table[], int size)
{
  int i ;
  int j ;
  int tmp ;
  int m ;
  for (i = 0; i < size ; i++)
  {
    for (j = i; j < size; j++)
    {
      if (Table[j] < Table[i]) {
        tmp = Table[i];
        Table[i] = Table[j];
        Table[j] = tmp;
      }
    }
  }
  m = int((size / 2)+.5);
  return Table[m];
}

Exemple :

16:17:40.117 -> 1 : 4657
16:17:40.117 -> 2 : 4663
16:17:40.117 -> 3 : 4663
16:17:40.117 -> 4 : 4664
16:17:40.117 -> 5 : 4665
16:17:40.117 -> 6 : 4667
16:17:40.117 -> 7 : 4667
16:17:40.117 -> 8 : 4669
16:17:40.117 -> 9 : 4671
16:17:40.117 -> 10 : 4671
16:17:40.117 -> 11 : 4674
16:17:40.117 -> Médian = 4667

**Nickel. Un grand merci ! @fdufnews **

Voilà un exemple des mesures, en // avec un bmp180 pour la pression en PA et la température en °C.
Je vais le laisser tourner 24 h, même si ces premiers relevés ne sont pas de bons augures.
La pression atmosphérique n'est pas corrigée par la hauteur du senseur. Cela n'a pas d'importance ici. Mais j'espère que les relevés seront plus cohérents que ces trois premiers !

16:52:25.308 -> Athmos PA | Temp | Médian
16:52:25.308 -> 100611 | 22.60 | 4712
16:57:25.244 -> 100614 | 22.60 | 4718
17:02:25.190 -> 100625 | 22.50 | 4715

Il aurait été plus simple d'utiliser un capteur de pression différentiel dans ce cas.
Une entrée raccordée au tube dans l'eau, une entrée à l'air libre.

Ouaip, avec un ESP-01 ?
J'ai vu plein de tutos avec plein d'étoiles où il n'y a ka et qui se révèlent foireux parce que ce paramètre n'est pas pris en compte. Moi, je veux déceler des fuites ou actes malveillants avant que les tonneaux ne se vident (cas vécus). Ces variations me gênent. Bref, on verra

c'est le cas du capteur utilisé
image

Bonjour à tous et toutes,

Édit : je vais en faire un nouveau topic, ce sera + logique.

Un premier point : je pensais mon USB -> TTL déficient, mais non, c'était le câble. À lire à gauche et à droite, j'ai fini par brancher la petite bête directement sur le PC (en frontal) et c'est passé comme une lettre à la poste. Je ne me souviens plus comment j'avais programmé avant (c'est un vrai bordel sur ma table de travail).

Le 2nd point : J'ai fait le relevé pendant 24 h toutes les 5 minutes de la valeur médiane (donc), mais aussi, avec un BMP 180, de la pression atmosphérique et de la température.
C'est ainsi que j'ai pu remarquer visuellement que les variations des relevés dépendent de la température et pas de la pression atmosphérique (Normal, puisque c'est corrigé par le capteur).


Le graphe amplifie la température, mais je crois que l'on pourrait trouver une formule correctrice
Maintenant, il faudra voir l'impact sous pression, si ces dérives sont significatives ou pas.

Le fichier xlsx en zip :
relevés 5 minutes.zip (43.2 KB)