Cálculo de Cuartiles y Valores Atípicos en Java para Diagramas de Caja
Implementación en Java para el Cálculo de Estadísticas de Boxplot
El siguiente código en Java permite calcular los cuartiles y detectar valores atípicos (outliers) para la construcción de un diagrama de caja o boxplot.
Código Fuente
package boxplot;
import java.util.Scanner;
public class HallarValoresBoxplot {
private static int[] a;
private static double Q1, Q2, Q3;
public static void main(String[] args) {
int tam;
System.out.println("Número de elementos: ");
Scanner in = new Scanner(System.in);
tam = in.nextInt();
in.close();
a = llenarArray(tam);
displayArray("Desordenado: ", tam);
ordenarAscendente2(tam);
displayArray("Ordenado: ", tam);
Q2 = calcularValorEnMedio("Q2: ", 1, tam);
if (tam % 2 == 0){ // el array tiene un número par de elementos
Q1 = calcularValorEnMedio("Q1: ", 1, tam/2);
Q3 = calcularValorEnMedio("Q3: ", (tam/2)+1, tam);
} else { // el array tiene un número impar de elementos
Q1 = calcularValorEnMedio("Q1: ", 1, (tam -1 ) / 2);
Q3 = calcularValorEnMedio("Q3: ", ((tam + 1) / 2) + 1, tam);
}
System.out.println("Q1: " + Q1 + " Q2: " + Q2 + " Q3: " + Q3);
displayOutliers(tam);
}
private static void displayArray(String m, int n){
System.out.print(m);
for (int i = 0; i < n; i++){
System.out.print(" " + a[i]);
}
System.out.println("");
}
private static int[] llenarArray(int n){
int [] array = new int[n];
for( int i = 0; i < n; i++){
array[i] = i;
}
return array;
}
// aquí consideramos que contamos de 1 a tam
private static double calcularValorEnMedio (String m, int min, int max){
int n = max - min + 1;
System.out.print(m + " " + "min: " + min + " max: " + max + " n: " + n);
if (n % 2 == 0){ // número par de elementos
int menor;
menor = ((min - 1) + n / 2) - 1;
System.out.println(" menor: " + menor);
return ((double)a[menor]+(double)a[menor+1]) / 2;
} else { // número impar de elementos
int pos = (min - 1)+(n+1)/2;
System.out.println(" pos: " + pos);
return (double)a[pos - 1];
}
}
private static void intercambiar(int i, int j){
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
private static void ordenarAscendente1(int n){
for (int niter = 0; niter < n; niter++){
for (int i = 0; i < n-1; i++){
if (a[i] > a[i+1]){
intercambiar(i, i+1);
}
}
}
}
private static void ordenarAscendente2(int n){
boolean cambiar = true;
for (int niter = 0; niter < n && cambiar; niter++){
cambiar = false;
for (int i = 0; i < n-1; i++){
if (a[i] > a[i+1]){
intercambiar(i, i+1);
cambiar = true;
}
}
}
}
private static double IQR(){
return Q3 - Q1;
}
private static void displayOutliers(int n){
double rangoInterCuartilico;
rangoInterCuartilico = IQR();
System.out.print("Outliers: ");
for (int i = 0; i < n; i++ ) {
if ( (a[i] < Q1 - rangoInterCuartilico * 1.5)
||
(a[i] > Q3 + rangoInterCuartilico * 1.5) ){
System.out.print(" " + a[i]);
}
}
System.out.println("");
}
}Referencias
Desde <https://aulaglobal.uc3m.es/pluginfile.php/7245071/mod_resource/content/1/HallarValoresBoxplot.java>