Euzinho

Felip Barbosa de Medeiros


Membro da FSF desde 2018, sou um analista de sistemas com experiência em software livre, programação, mineração de dados, infraestrutura e segurança.
Atualmente no Jornal Brasília Capital, antes na Vegan, HortMinas e CEBGAS.


Analisando a Frequência

Algoritmo que calcula a frequência de ocorrencias em determinada base de dados e retorna valores acumulados e relativos, além de valores intervalados através do método de sturges.

<?php
header('Content-Type: text/html; charset=utf-8');
$dados = array("27", "32", "33", "25", "33",
               "34", "26", "18", "35", "24",
               "19", "36", "29", "21", "38",
               "19", "22", "33", "19", "23",
               "39", "39", "25", "38", "28",
               "45", "31", "38", "44", "39");
$k = round(1 + 3.22 * log10(round((max($dados)-min($dados)))));
asort($dados);
function frequencia ($dados, $init, $limit, $primeiro=0) {
  $x = 0;
  if($primeiro==0) {
    foreach(array_values($dados) as $valor => $quantidade){
      if($quantidade>=$init && $quantidade<=$limit) {
        $x++;
      }
    }
  } else {
    foreach(array_values($dados) as $valor => $quantidade){
      if($quantidade>$init && $quantidade<=$limit) {
        $x++;
      }
    }
  }
  return $x;
}
function format($frequencia, $dados) {
  return number_format(($frequencia * 100)/count($dados), 2, '.', '');
}
?>
<table border="1">
  <thead>
    	<tr><th colspan="5">Tabela de Frequência</th></tr>
      <tr>
          <th>Valor</th>
          <th>Frequência</th>
          <th>Frequência Acumulada</th>
          <th>Frequência Relativa</th>
          <th>Frequência Relativa Acumulada</th>
      </tr>
  </thead>
  <tbody>
    <?php
      foreach(array_count_values($dados) as $valor => $frequencia){
        echo '<tr>';
          echo '<td>' . $valor . '</td>';
          echo '<td>' . $frequencia . '</td>';
          if(empty($ultimafrequencia)){
            echo '<td>' . $frequencia . '</td>';
              $ultimafrequencia = $frequencia;
          }
          else {
            if(empty($acumulado)) {
              $acumulado = $frequencia + $ultimafrequencia;
              echo '<td>' . $acumulado . '</td>';
            } else {
              $acumulado = $frequencia + $acumulado;
              echo '<td>' . $acumulado . '</td>';
            }
          }
          echo '<td>' . format($frequencia, $dados) . '%</td>';
          if(empty($ultimafrequencia_ac)){
            echo '<td>' . format($frequencia, $dados) . '%</td>';
            $ultimafrequencia_ac = format($frequencia, $dados);
          }
          else {
            if(empty($acumulado_rel)) {
              $acumulado_rel = format($frequencia, $dados) + $ultimafrequencia_ac;
              echo '<td>' . $acumulado_rel . '%</td>';
            } else {
              $acumulado_rel = format($frequencia, $dados) + $acumulado_rel;
              echo '<td>' . $acumulado_rel . '%</td>';
            }
          }
        echo '</tr>';
      }
    ?>
  </tbody>
</table>
<br><br><br>
<table border="1">
  <thead>
    	<tr><th colspan="5">Tabela de Frequência Intervalar</th></tr>
      <tr>
          <th>Faixa</th>
          <th>Frequência</th>
          <th>Frequência Acumulada</th>
          <th>Frequência Relativa</th>
          <th>Frequência Relativa Acumulada</th>
      </tr>
  </thead>
  <tbody>
  <?php
    for ($i=0; $i < $k; $i++) {
      echo '<tr>';
      if($i==0) {
        $init = min($dados);
        $limit = $init+$k-1;
        echo '<td>' . $init . '|-|' . $limit . '</td>';
      } else {
        if(empty($acumulado_intervalar)) {
          $acumulado_intervalar = $limit+$k-1;
          $int = $limit;
          $lmt = $acumulado_intervalar;
          echo '<td>' . $int . ' -|' . $lmt . '</td>';
        } else {
          if($i<($k-1)){
            $int = $acumulado_intervalar;
            $lmt = $acumulado_intervalar+$k-1;
            echo '<td>' . $int . ' -|' . $lmt . '</td>';
            $acumulado_intervalar = $acumulado_intervalar+$k-1;
          } else {
            $int = $acumulado_intervalar;
            $lmt = max($dados);
            echo '<td>' . $int . ' -|' . $lmt . '</td>';
            $acumulado_intervalar = max($dados);
          }
        }
      }
      if($i==0) {
        echo '<td>' . frequencia($dados, $init, $limit) . '</td>';
      } else {
        echo '<td>' . frequencia($dados, $int, $lmt, 1) . '</td>';
      }
      if(empty($freq_acumulada)){
        echo '<td>' . frequencia($dados, $init, $limit) . '</td>';
        $freq_acumulada = frequencia($dados, $init, $limit);
      }
      else {
        if(empty($next_freq_acumulada)) {
          $next_freq_acumulada = frequencia($dados, $int, $lmt, 1) + $freq_acumulada;
          echo '<td>' . $next_freq_acumulada . '</td>';
        } else {
          $next_freq_acumulada = frequencia($dados, $int, $lmt, 1) + $next_freq_acumulada;
          echo '<td>' . $next_freq_acumulada . '</td>';
        }
      }
      if($i==0) {
        echo '<td>' . format(frequencia($dados, $init, $limit), $dados) . '%</td>';
      } else {
        echo '<td>' . format(frequencia($dados, $int, $lmt, 1), $dados) . '%</td>';
      }
      if(empty($ultimafrequencia_ac_int)){
        echo '<td>' . format(frequencia($dados, $init, $limit), $dados) . '%</td>';
        $ultimafrequencia_ac_int = format(frequencia($dados, $init, $limit), $dados);
      }
      else {
        if(empty($acumulado_rel_int)) {
          $acumulado_rel_int = format(frequencia($dados, $int, $lmt, 1), $dados) + $ultimafrequencia_ac_int;
          echo '<td>' . $acumulado_rel_int . '%</td>';
        } else {
          $acumulado_rel_int = format(frequencia($dados, $int, $lmt, 1), $dados) + $acumulado_rel_int;
          echo '<td>' . $acumulado_rel_int . '%</td>';
        }
      }
      echo '</tr>';
    }
  ?>
  </tbody>
</table>