Ausreisser nach Grubbs

  • Hallo zusammen,


    gestern Abend hatte ich ein kleines Programm geschrieben, dass Messwerte nach Ausreißern durchsucht. In dem nachfolgenden Code kommt der Ausreißer-Test nach Grubbs zum Einsatz. Und ich bin mir sicher, Zentris wird begeistert sein: Hier kommt der Median :cool: vor. Der Algorithmus, nach dem der Median ermittelt wird, spielt hier sogar mehrfach in Form von Quartilsberechnungen eine große Rolle.


    Ich habe heute morgen überlegt, dass so etwas ein gutes Beispiel für objektorientierte Programmierung sein könnte. In Beitrag #2 folgt dann der objektorientierte Code - das geht in Icon auch, wenn davon auch seltener Gebrauch gemacht wird. Da habe ich nicht so die große Übung. Hatte mich phasenweise auch ziemlich genervt, weil ich doch einige Zeit verplempert hatte - ein simples param[] hat's dann ausgemacht. Ich hatte die eckigen Klammern vorher weggelassen.


    Interessanter wird dieser Code sicherlich, wenn die ganzen Daten (Messwerte, Median, innere und äußere Zäune mitsamt milden und extremen Ausreißern graphisch angezeigt werden. Ein Boxplot-Diagramm oder auch ein Box- & Whisker-Plot sind da die richtige Wahl der Mittel. Das mache ich bestimmt auch noch mal, aber nicht mehr heute.




    Das Programm erzeugt eine zufällige Liste an Werten, und hilft noch ein wenig nach, ein paar Ausreißer zu erzeugen. Dann wird der Median nach Zentris ermittelt, nach der gleichen Vorgehensweise die Grenzen des ersten und des dritten Quartils ermittelt, zwei Zäune innen und außen aufgerichtet (innen: +/- 1,5facher Abstand zwischen den beiden Quartilen unter- bzw. oberhalb der Quartile für die milden Ausreißer, der entsprechende 3fache Abstand für die extremen Ausreißer.

    Die milden und extremen Ausreißer werden angezeigt. Die extremen Ausreißer werden entfernt und die Sache neu ausgelotet, neuer Median, Quartile, ..

    Aber Obacht: Ausreißer sollte man nur dann aus einer Messwertliste streichen, wenn man weiß, was man tut und jeden Ausreißer begründen kann. Zum Beispiel: Beim Messen eingeschlafen. Als man wieder aufwachte, zeigte das Messmittel 17 an, wo sonst immer 3 angezeigt wurde.


    Bei der Messung des Ozon-Loches hat man auch großzügig Ausreißer gestrichen. Es handelte sich aber um korrekte Messungen, die nur falsch gedeutet wurden. Da sind rund 10 Jahre verstrichen, bevor man sich des fehlerhaften Streichens echter Messwerte bewusst wurde.



    Ausgabe:



    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited 3 times, last by Andreas ().

  • Hallo zusammen,


    hier der objektorientierte Code:


    Folgende Zeilen haben mich so richtig genervt:

    Code
    procedure constructor(param[])
        return Objekt := Werte_t !param
    end

    Längere Zeit hatte ich versucht, die Parameter-Übergabe (zuerst waren es knapp 10, am Ende deutlich mehr als ein Dutzend Datenfelder und Prozeduren) ganz einfach ohne die eckigen Klammern zu machen.


    OOPS ... Bei Objektorientierung heißt das ja anders... Klassen, Objekte, Methoden, Eigenschaften. Kann Icon auch alles - wer's denn mal brauchen sollte.


    Übrigens die Schreibweise

    Code
        return Objekt := Werte_t !param

    sieht man dann auch seltener.

    Hier kommt der !-Operator zum Einsatz, der alle Elemente einer zusammengesetzten Struktur (Liste, Tabelle, Menge, selbst kreiierter Datensatz, ...) ermittelt und übergibt. Werte_t ist der Klassenname. Eine Klammer ist hier nicht erforderlich.


    Sowas klappt auch bei Funktionen:

    Das kennt jeder:

    Code
    every i := 1 to 10 do
    {   irgendwas(X[i])
    }

    kürzer:

    Code
    every irgendwas(X[1 to 10])


    Noch kürzer so:

    Code
    irgendwas !X

    Ohne Schleifen-Einleitung every, ohne Angabe von Start- und Ende-Werten, selbst ohne die sonst üblichen Klammern () hinter dem Funktionsnamen oder Record-Namen.



    Ausgabe:


    Beste Grüße


    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    • Icon-Tutorials (IDE: Geany) - GPIO-Library - µController-Programmierung in Icon! - ser. Devices - kein Support per PM / Konversation

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Edited 5 times, last by Andreas ().