0

I'm trying to find outliers using the 1st and 3rd quartile. This is what I have currently:

$data = Data::select('created_at', 'value')
        ->get();

$median = collect($data)->median("value");
jarlh
  • 42,561
  • 8
  • 45
  • 63
Jay Lee
  • 1
  • 1

1 Answers1

0

You can create a private function like this:

function Quartile($Array, $Quartile) {
  sort($Array);
  $pos = (count($Array) - 1) * $Quartile;

  $base = floor($pos);
  $rest = $pos - $base;

  if( isset($Array[$base+1]) ) {
    return $Array[$base] + $rest * ($Array[$base+1] - $Array[$base]);
  } else {
    return $Array[$base];
  }
}

function Average($Array) {
  return array_sum($Array) / count($Array);
}

function StdDev($Array) {
  if( count($Array) < 2 ) {
    return;
  }

  $avg = Average($Array);

  $sum = 0;
  foreach($Array as $value) {
    $sum += pow($value - $avg, 2);
  }

  return sqrt((1 / (count($Array) - 1)) * $sum);
}

Then, you can call the Quartile() method depends on which quartile you want, if you want the first quartile, then put 0.25 for the as $Quartile's parameter value, for the third quartile, its 0.75.

Source answer

felixbmmm
  • 362
  • 3
  • 13