2013-03-02 10 views
7

nehme ich eine Auswahl von Datenbankeinträgen probieren, die die folgenden Zahlen zurück:Suchen und Entfernen von Ausreißern in PHP

20.50, 80.30, 70.95, 15.25, 99.97, 85.56, 69.77 

Gibt es einen Algorithmus, der in PHP effizient umgesetzt werden kann, um die Ausreißer zu finden (falls vorhanden) aus einer Reihe von Schwimmern basierend darauf, wie weit sie vom Mittelwert abweichen?

+7

Ausreißer basierend auf was? – dynamic

+0

vielleicht mit Mathe-Erweiterung: [http://www.php.net/manual/en/book.stats.php](http://www.php.net/manual/en/book.stats.php) – bitWorking

+1

@ llnk basierend auf den Zahlen im angegebenen Ergebnis. Von dem, was ich verstehe, würden die Ausreißer auf den inneren und äußeren Quartilen basieren ... aber andererseits gebe ich bereitwillig zu, dass ich in statistischer Mathematik nicht groß bin. – eComEvo

Antwort

23

Ok nehmen wir an, Sie Ihre Datenpunkte in einem Array haben etwa so:

<?php $dataset = array(20.50, 80.30, 70.95, 15.25, 99.97, 85.56, 69.77); ?> 

Dann können Sie die folgende Funktion verwenden (siehe Kommentare für das, was geschieht), um alle Zahlen zu entfernen, die außerhalb fallen der Mittelwert +/- Standardabweichung mal eine Größenordnung stellen Sie (Standard: 1):

<?php 

function remove_outliers($dataset, $magnitude = 1) { 

    $count = count($dataset); 
    $mean = array_sum($dataset)/$count; // Calculate the mean 
    $deviation = sqrt(array_sum(array_map("sd_square", $dataset, array_fill(0, $count, $mean)))/$count) * $magnitude; // Calculate standard deviation and times by magnitude 

    return array_filter($dataset, function($x) use ($mean, $deviation) { return ($x <= $mean + $deviation && $x >= $mean - $deviation); }); // Return filtered array of values that lie within $mean +- $deviation. 
} 

function sd_square($x, $mean) { 
    return pow($x - $mean, 2); 
} 

?> 

Für Ihr Beispiel diese Funktion die folgenden mit einer Größe von 1 zurück:

Array 
(
    [1] => 80.3 
    [2] => 70.95 
    [5] => 85.56 
    [6] => 69.77 
) 
+0

Danke! Funktioniert ziemlich gut. Ich bin gut mit Algorithmen, aber seltsam schrecklich in Mathe. Nicht sicher, wie das passiert ist! :) – eComEvo

+0

@EcomEvolution NP ... der '$ filter' Teil war unnötig, habe nicht bemerkt, dass ich ihn gepostet habe, damit du ihn entfernen kannst. Außerdem bin ich nicht der Beste in Mathe, also habe ich Wikipedia dafür benutzt. –

+0

Ich brauche eine Funktion, um Ausreißer aus einem Array zu entfernen und ich stoße auf Ihre Antwort. Ähm, warum nicht einfach '$ Magnitude = 1' in der Argumentliste setzen, anstatt zuerst' NULL' zu setzen und dann danach 1 zuzuweisen? :) – mavili

1

Bei einem normal verteilten Datensatz werden Werte mit mehr als 3 Standardabweichungen vom Mittelwert entfernt.

<?php 
function remove_outliers($array) { 
    if(count($array) == 0) { 
     return $array; 
    } 
    $ret = array(); 
    $mean = array_sum($array)/count($array); 
    $stddev = stats_standard_deviation($array); 
    $outlier = 3 * $stddev; 
    foreach($array as $a) { 
     if(!abs($a - $mean) > $outlier) { 
      $ret[] = $a; 
     } 
    } 
    return $ret; 
} 
+0

Ich mag das und es funktioniert, aber der Client, für den ich entwickle, möchte keine PECL-Erweiterung installieren müssen. Leider bedeutete das, dass man die Statistikbibliothek nicht verwenden konnte. Vielen Dank für Ihre Hilfe und helfen Sie mir zu erklären, was ich wollte! – eComEvo

+0

Ich denke, wäre gut nehmen Medianwert (in $ Mittelwert). –

Verwandte Themen