SQL Mittelwert ohne Ausreißer

Skidrow1988

Lt. Commander Pro
Registriert
Nov. 2014
Beiträge
1.047
Moin @All,

ich schreibe mir gerade ein kleines Programm was auf eine SQL Datenbank zugreift. Ich möchte dort einen Mittelwert ermitteln, der keine Ausreißer enthält. Die Tabellenstruktur sieht quasi so aus.

IDPreis
1100
210
312
43

Dort hätte ich jetzt gerne avg_preis = 11 raus. Gibt es da was "fertiges" oder kann mir da wer einen Tipp geben?

Vielen dank!
 
Welches DBMS?
Allgemeiner Vorschlag: Nimm den Median statt dem Durchschnitt, der ist robust gegenüber Ausreißer. Es sei noch gesagt, dass es keine allgemeine Definition davon gibt, was als Ausreißer zählt und was nicht.
 
  • Gefällt mir
Reaktionen: snaxilian, BAGZZlash, PHuV und 5 andere
Ich nutze MariaDB. Ich bin kein Profi und das läuft auch nur im Heimnetz.

Da die Werte völlig unterschiedlich sein können, hatte ich auf eine Art Statistikfunktion gehofft. Sowas in der Art, das die obersten 10% und die untersten abgeschnitten werden.
 
Du musst den Median, nicht einfach den Mittelwert, berechnen, dieser Wert ist sehr robust gegenüber Ausreißern.
 
Natürlich kannst du das statistisch auswerten, aber das musst du zu Fuß machen, weil ja niemand weiß was genau du auswerten willst.

Grundsätzlich ist der Median für solche Zwecke die bessere Wahl im Vergleich zum arithmetischen Mittel, weil die Größe der Ausreißer beim Median keine Rolle spielt. Ob nu 17 über dem Median=12 liegt oder 5435, ist einerlei. Willst du hingegen eine tiefergehende Analyse betreiben, wirst du die Werte selbst filtern und ggfs mit der Gaußschen Normalverteilung, Standardabweichung, etc. bearbeiten müssen.

Die Frage ist auch inwiefern das überhaupt Aufgabe der Datenbank ist, weil diese ja weitestgehend nur für die Speicherung und den Abruf der Daten zuständig ist (database layer). Die komplexe Weiterverarbeitung der Daten, die über das Mindestmaß an Logik in SQL (zB count/min/max/average) hinausgeht, sollte so oder so eine Schicht darüber stattfinden (business layer).
 
  • Gefällt mir
Reaktionen: Skidrow1988
Viele Dank für die Antworten. Ich gucke mir das mal an und schreibe dann nochmal.
 
Raijin schrieb:
Die Frage ist auch inwiefern das überhaupt Aufgabe der Datenbank ist
Viele DBMS haben jedenfalls entsprechende Funktionen. Wenn der TE genau wüsste was er will, dann könnte er innerhalb von MariaDB z.B. die Standardabweichung berechnen und nur Werte innerhalb des doppelten dieser berücksichtigen.
Er will aber vermutlich einfach den Median nehmen, je nach Anwendungsfall.
 
  • Gefällt mir
Reaktionen: Raijin
Standardabweichung ist das limit was MariaDB (vermutlich) kann und gibt Beispiele dazu im Internet wie man das umsetzt. Für einen nicht kritischen Preisvergleich sollte das ausreichen.
Wenn man bessere statistische Methoden will muss man es selbst schreiben.


yxcvb schrieb:
Du musst den Median, nicht einfach den Mittelwert, berechnen, dieser Wert ist sehr robust gegenüber Ausreißern.
Ja und nein. Hängt von den Daten und Menge ab die man reinschmeißt.
Beispiel: Dein Preis hat zwei Niveaus und springt immer zwischen denen hin und her. Dein Median wird somit eine der beiden extreme annehmen während der Mittelwert dazwischen liegen würde.
 
  • Gefällt mir
Reaktionen: BeBur
BeBur schrieb:
Viele DBMS haben jedenfalls entsprechende Funktionen. Wenn der TE genau wüsste was er will, dann könnte er innerhalb von MariaDB z.B. die Standardabweichung berechnen und nur Werte innerhalb des doppelten dieser berücksichtigen.
Er will aber vermutlich einfach den Median nehmen, je nach Anwendungsfall.
Tatsächlich wird es darauf hinauslaufen. Die Datenbank ist größer als das angegebene. Es ist eine Auswertung von 7 Tagen und das auch nur für bestimmte Produkte. Da steckt schon etwas mehr dahinter. Ich brauchte aber einen Deutschuss um in die richtige Richtung zu gehen zu können. Den habe ich ja jetzt und arbeite erstmal weiter.
 
Skidrow1988 schrieb:
Da die Werte völlig unterschiedlich sein können, hatte ich auf eine Art Statistikfunktion gehofft. Sowas in der Art, das die obersten 10% und die untersten abgeschnitten werden.
Dafür gibts nun die Data Scientisten und Anaylsten, die mit vielschichtigen Methoden und mittels DL das mal so oder so auslegen.
https://towardsdatascience.com/mach...tection-and-condition-monitoring-d4614e7de770
Für sowas verwendet mal aber keine MariaDB, dafür braucht man dann eine sogenannte analytics database (Exasol, Snowflake, BigQuery, RedShift,...). Oder Du nimmst Postgresql, das kann dann auch direkt mit Pyhton Code umgehen, was wiederum DL und Co. kann.
 
PHuV schrieb:
Dafür gibts nun die Data Scientisten und Anaylsten, die mit vielschichtigen Methoden und mittels DL das mal so oder so auslegen.
Also für sehr viele Anwendungsfälle und speziell bei eindimensionalen Daten reicht es vollkommen, Ausreißer ganz normal anhand von Quartilen oder der Standardabweichung zu bestimmen. Da muss man kein NN trainieren oder sonstige fancy Dinge machen. Oder halt einfach den Median nehmen ;-).

Skidrow1988 schrieb:
Die Datenbank ist größer als das angegebene. Es ist eine Auswertung von 7 Tagen und das auch nur für bestimmte Produkte. Da steckt schon etwas mehr dahinter.
Das ist schon klar, aber den Scale musst du schon auch dazu sagen. Ich würde jetzt aber vermuten das es eher so tausende bis zehntausende Datensätze sind und nicht hunderttausend bis millionen.

Die Frage 'was ist ein Ausreißer' ist häufig eher eine Domänenspezifische und nur nachrangig eine statistische. Die Statistik dient eher dazu, Domänenwissen sinnvoll zu kodieren. Das ist auch so ein Aspekt wieso DL häufig kein sinnvoller Ansatz ist.
 
Was als Ausreißer gelten soll, ist im Kontext zu bestimmen. Dazu ist in der Regel eine Art Strukturanalyse der Daten erforderlich (Verteilung der Werte etc.).

Wenn es etwas einfacher sein soll, wird als Grenzwert zur Ausreißer-Eliminierung auch gerne das 2- bis 2,5fache der Standardabweichung herangezogen.

Aber ohne genaue Kenntnis von Umfang, Art und Herkunft der Daten lässt sich das nicht so ohne weiteres festlegen.
 
Zuletzt bearbeitet:
Zurück
Oben