Cálculo de Cuartiles y Valores Atípicos en Java para Diagramas de Caja

Informática y Telecomunicaciones5,32 KB

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>

Descargar

PDF Word HTML