Beim Ermitteln von repräsentativen Durchschnittswerten besteht häufig die Schwierigkeit, dass einzelne Werte den Durchschnitt “verfälschen” bzw. verschieben. Sucht man beispielsweise einen repräsentativen Wert aus der Menge der Zahlen 5,3,6,7,2,100,8,1,4, so würden wir bei der konventionellen avg/Durchschnitt-Berechnung ~15 erhalten. Grund dafür ist offensichtlich die 100, die aus dem Rahmen fällt.
Nun gibt es als Abhilfe den Zentralwert bzw. Median, der v.a. in der Statistik durch das Halbieren von Verteilungen häufig eingesetzt wird. Dabei wird den Ausreißer keine Beachtung geschenkt, indem man die Reihe der einzelnen Werte sortiert und anschließend den Wert in der Mitte als Median erhält. Das oben genannte Beispiel sieht sortiert so aus: 1,2,3,4,5,6,7,8,100. In diesem Fall lässt sich die 5 direkt als Zentralwert ablesen. Handelt es sich um eine gerade Anzahl an Werten, z.B. 1,2,3,4,5,6,7,8,9,100, so muss der Durchschnittswert der beiden Werte in der Mitte (avg(5 und 6) => 5.5) als Median berechnet werden.
In PHP könnte die Funktion zur Berechnung des Medians wie folgt aussehen:
function median($values=array())
{
$n=count($values);
if($n==0)
{
return false;
}
sort($values);
if($n%2==0)
return($values[($n/2)-1]+$values[$n/2])/2;
else
return $values[$n/2];
}
Sind die einzelnen Werte relativ weit auseinander, so bietet sich eine weitere Verbesserung des Algorithmus an: Man nehme jeweils den Mittelwert zweier hintereinander folgender Werte in der sortierten Reihe von Werten und erzeuge aus den (neuen) Werten (Mittelwerten) eine neue Reihe. Dieser Vorgang kann auch weitere Male widerholt werden. Aus der neuen Reihe holt man sich nun den Zentralwert. Als Algorithmus könnte das so umgesetzt werden, wobei auf Überprüfungen und Fehlerroutinen verzichtet wurde:
function flat_median($values=array(),$i_flat=2)
{
$n=count($values);
sort($values);
for($i=0;$i<$i_flat+1;$i++)
{
$values=couple_values($values);
sort($values);
}
if($n%2==0)
return($values[($n/2)-1]+$values[$n/2])/2;
else
return $values[$n/2];
}
function couple_values($values)
{
$couple_values=array();
for($i=1;$i
$couple_values[]=($values[$i]+$values[$i-1])/2;
}
return $couple_values;
}
Dadurch wird die Gewichtung der einzelnen Werte noch weiter vermindert. Jedoch darf das Verfahren nicht zu oft aufgerufen werden, da sonst die Reihe "zu kurz" wird und die Randwerte wieder an Bedeutung gewinnen.