Algorithmus zum Entfernen zu großer Werte

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Algorithmus zum Entfernen zu großer Werte
Ich steh grad irgendwie auf dem Schlauf und bräuchte mal etwas geistige Unterstützung. Nachdem mir so ist, als wären hier ein paar Leute, die sich mit Algorithmen und sowas auskennen, frag ich einfach mal hier… :wink:

Jeder kennt das Problem: Man zeichnet ein Diagramm von einer ganzen Menge Werten und dann gibt es diese wenigen Elemente, die so dermaßen zu groß geraten sind, dass die anderen Balken im Diagramm nur unerkennbar klein sind. Diese sehr großen Werte möchte ich rausfiltern, um das erkennen zu können, was wirklich zählt. (Die zu großen Werte sind in diesem Fall Messfehler und sowieso falsch.)

Setzt sich ein Mensch vor so ein Diagramm, kann er ziemlich schnell auf die Werte zeigen, die entfernt werden müssen, damit die Skalierung wieder funktioniert. Sind zwei Zahlen 100-mal größer als alle anderen, ist die Sache klar. Wenn 5 % der Werte noch deutlich größer sind, ist es nicht mehr so eindeutig, aber es kommt schon was brauchbares dabei raus.

Aber mir fällt grad absolut keine Befehlsfolge (vulgo: Algorithmus) ein, die diese Entscheidung automatisch durchführen könnte. Wie sollen die Bedingungen aussehen, anhand derer ein Wert als “zu groß” eingestuft wird? Wie viele zu große Werte sollen abgeschnitten werden? All das ist ja auch irgendwie subjektiv, nehm ich an. Kann mir da jemand weiterhelfen? Hat jemand schonmal sowas gemacht und kann seine Erfahrungen mit mir teilen?


Hier mal nachschauen, da sind ein paar Ausreißertests genannt:
http://de.wikipedia.org/wiki/Ausreißer

Beim Boxplot nimmst du üblicherweise die Punkte als Ausreißer, deren Abstand vom Quartil größer ist als das 1,5-/3,0-fache des Abstands zwischen den Quartilen.
Siehe http://de.wikipedia.org/wiki/Boxplot#Antenne_.28Whisker.29


Aus der Pattern Recognition-Vorlesung fallen mir da spontan der RANSAC-Alrgorithmus, Jackknife und Bootstrap ein – nachdem du die Daten aber anscheinend nicht in ein Modell füttern willst, sondern nur graphisch darstellen willst bin ich mir nicht sicher, in wie weit dir das da weiterhilft. Eventuell reicht dir aber schon die Minimierung der Varianz bei gleichzeitiger Maximierung der Anzahl der nicht ausgeschlossenen Samples.


Es gibt auch einfache statistische Verfahren, die man ueblicherweise anwendet bevor man die hoehere Magie auspackt: Standardabweichung und Mittelwert ausrechnen und alle Punkte wegwerfen die mehr als zweimal die Standardabweichung vom Mittelwert entfernt liegen.

3 „Gefällt mir“

Das würde ich auch als erstes probieren oder ein histogrambasiertes Verfahren, bei dem der Datenbereich so gewählt wird, dass er einen hohen Prozentsatz der Datenpunkte enthält (und dann z.B. wieder mal 2).

Allerdings hängt es von der Verteilung der Daten ab, denn mean+stddev setzen bereits eine Normalverteilung voraus, eine gebräuchliche Annahme, die meistens “gut genug” erfüllt wird…


Bronstein → Stichwortverzeichnis → Abweichung → Messfehler


Okay, danke erstmal für die zahlreichen Antworten (in der Nacht von Samstag auf Sonntag :rolleyes:). Sie sind teilweise deutlich theoretischer ausgefallen als erhofft, das erhöht vielleicht auch den Aufwand, sowas zu verstehen und umzusetzen. Jetzt hab ich erstmal neue Suchbegriffe und genug zu lesen.

Gleichzeitig habe ich mich doch dazu entschieden, die Messwerte bereits bei ihrer Erfassung auf halbwegs plausible Werte zu prüfen und ggf. zu löschen. Denn solche Ausreißerkorrekturen sind zwar für einzelne Diagramme gut, in denen Rohdaten angezeigt werden. In weiteren Aggregationen, die direkt in der Datenbank berechnet werden, fallen sie aber nicht mehr auf und verfälschen nur noch unerkannt den Eindruck, weshalb die bloße Filterung bei der Anzeige vermutlich eh zu kurz greifen würde. Jetzt heißt es wieder, abwarten und Daten sammeln…


“Outlier Detection” googeln


Ich weiß ja jetzt nicht, worum genau es geht, aber das Entfernen von vermeintlichen Messfehlern zur Erfassungszeit kann eine Menge Risiken und Probleme in sich bergen:

  • Es gibt Situationen, in denen vermeintliche Ausreiser wahre Werte sein können und trotzdem herausgefiltert werden.
  • Die Menge der Ausreiser und deren Verteilung mitzuerfassen ermöglicht es, quantitative Aussagen über die Qualität der Datenerfassung zu treffen und ggf. sogar Fehler in Messungen zu diagnostizieren, die einem sonst entgehen.
  • Die Erfassung verbessert die Vergleichbarkeit mehrerer Messreihen, da bei vergleichbaren Messreihen auch die Ausreiserquote und Verteilung ähnlich sein sollte.
  • Bei auch nur fehlerhafter Implementierung eines kleinsten Teilstücks eines Zweigs des Filters können unbemerkt ein winziger Teil korrekter Werte ausgefiltert werden und diese Werte können im Nachhinein nicht mehr reproduziert werden. Dies kann zu einer unbemerkten Verfälschung von Messergebnissen führen. Erhält man alle Daten und erstellt anschließend Berechnungen nur auf Grund einer Teilmenge, hat man immerhin noch die „Ursuppe“, um das Ergebnis einem Plausabilitätstest zu unterziehen.
1 „Gefällt mir“

Richtig. Aus diversen Gruenden sollte man die moeglichst vollstaendig ungefilterten Rohdaten immer mit aufheben, wenn auch nur der Hauch einer Chance besteht, dass sich bei der Analyse und Darstellung Fehler einschleichen koennten und jemand das nochmal neu analysieren koennen wollte.

1 „Gefällt mir“

Es geht hier um eine Web-Analytics-Anwendung, bei der u. a. die Aktivitätsdauer des Benutzers auf einer Webseite gemessen wird. Das alleine birgt ja schon mehrere Ungenauigkeiten, eine exakte Wissenschaft ist das also gewiss nicht. Immer wieder fehlen einzelne Messwerte und das ist okay, die fließen dann einfach nicht in eine bestimmte Auswertung mit ein.

Die allermeisten Werte liegen hier bislang im Bereich von 0 bis 300 Sekunden. Hin und wieder kommt es aber vor, dass – vermutlich aufgrund eines Fehlers im Erfassungscode oder eines sehr seltsamen Browsers (soll vorkommen) – Messwerte von mehreren bis sogar mehreren hundert Stunden zustandekommen. Auf den Daten mehrerer Monate habe ich mir alle Vorkommen von mehr als 30 Minuten einzeln angeschaut und da schadet es nicht, sie auf 30 Minuten zu begrenzen. Alle Vorkommen von mehr als 90 Minuten waren völlig unrealistisch und konnten tatsächlich gelöscht werden. Insgesamt waren das aber nur etwa 1 ‰ der Datensätze.


Haben die vielleicht einfach den Tab offen gelassen und im nächsten weitergesurft? Soll Leute geben, bei denen ein Tab schon mal ein paar Wochen offen bleibt… :rolleyes: ^^


Dann verliert das andere Tab den Fokus (blur, focusout oder visibilitychange) oder der Benutzer wird nach ner Minute oder so ohne Input-Events als inaktiv geführt.


Ja ok. Aber wie kriegst du mit, dass ein Benutzer den Fokus wieder aufnimmt?


Auch dafür gibt es entsprechende Events. :wink:


Für wie viele Browser und was für ein Spektrum von Konfigurationen hast Du den Code denn getestet? Alle Fehler lassen sich zwar Grundsätzlich nie sicher ausschließen, aber wenn Du schon den Verdacht hast, dass es am Code liegt, sollte das Ganze mit ausreichend Testcases eventuell reproduzierbar sein. Und wenn es an „seltsamen Browserverhalten“ liegen könnte, sollte man auch konkrete Beispiele dafür als Begründung nennen können.

Hört sich für mich nach javascript an und da hast Du dann noch eine Menge anderer Möglichkeiten, die teilweise nicht berücksichtigt werden können, aber durchaus erfassenswert wären. Z.B. wie behandelst Du Besuche, bei denen mittendrin der Browser abschmiert?

Wenn das nur so ein kleiner Anteil ist, dann kostet es auch relativ wenig Speicher, diese Ausreiser mitzuerfassen. Je nachdem, welche Datenbank Du verwendest, um die Daten zu speichern, kannst Du die Daten von vornherein über Hilfsstrukturen so verknüpfen, dass Du kaum zusätzlichen Rechenaufwand bei der Auswertung hast und die von Dir gewünschte Menge <= 90 Minuten direkt über eine sql-Abfrage bekommst.


Grundsätzlich getestet nur mit den verbreitetsten Browsern, in den meisten Versionen der letzten 10 Jahre. Überwiegend Windows, wenig Linux und mangels Geräten kein Mac.

Ich denke mir einfach mal, dass es wohl irgendwo am Code liegen müsste, woran sonst? Testfälle hab ich für diese Anwendung gar keine, das geht weit über den eigentlichen Entwicklungsaufwand hinaus und für ein Freizeitprojekt kann ich das nicht leisten. Seltsame Browser gibt es immer und überall, das ist eine ungeschriebene Grundregel im Web. Das fängt schon damit an, dass man nichtmal sicher weiß, welchen Browser man da vor sich hat, da sich jeder Browser als irgendein anderer ausgeben kann. Wenn Search-Crawler sich als Netscape 6 ausgeben und JavaScript ausführen, weiß ich nichtmal ansatzweise, was die da tun.

Ja, das meiste läuft über JavaScript. Die Aktivitätsdauer ausschließlich damit. Das Script startet und stoppt bei entsprechenden Events oder Timeouts einen Zähler und meldet den aktuellen Stand gelegentlich an den Server. Beim Verlassen der Seite wird er nochmal übertragen. Auch für den Fall, dass der Browser plötzlich verschwindet oder dass am Seitenende keine Übertragung mehr durchkommt (manche Browser sind generell so, ich glaube Opera mind. bis 12 und Chrome beim Beenden des Browsers), gilt eben einfach der zuletzt gesendete Wert. Wie gesagt, das ist nicht exakt, kann es aber auch nicht sein.

Wäre auch eine Idee, ja. Aber was will ich von Messwerten, die ich nachher sowieso nicht beachten will und für dessen Ausblenden die Auswertungen wieder komplexer werden? Ich könnte den Grenzwert noch konfigurierbar machen. Auf den Webseiten, die ich betreibe, verbringt kein Besucher sinnvoll mehr als einige Minuten. Anderswo kann das anders sein.

Allerdings stellt sich bei einem so allgemeinen Wert wie der Aktivitätsdauer sowieso die Frage, was genau man damit anfangen will. Wenn ein einzelner Besucher eine ganze Stunde auf einer Seite zugebracht hat, bedeutet das, dass er nicht gut im Textverständnis ist oder dass er den Text studiert und übersetzt? Wenn alle anderen nur 1-2 Minuten lesen. Ab einer gewissen Dauer reicht mir auch ein einfaches „lang“ aus.