feed twitter facebook LinkedIn facebook

Java » Calcular la moda de una distribución con Java

noviembre 9, 2010 por Víctor Cuervo 3 Comentarios Imprimir Imprimir

La moda de una distribución es el valor con mayor frecuencia de una distribución. Si hay dos valores de la distribución con la misma frecuencia, es decir, dos modas, dicha distribución será bimodal. Si hay tres modas será trimodal,... Si todos los valores tienen la misma frecuencia, entonces no hay moda.

Lo primero será definir nuestra distribución.

  1. int[] elementos = {1,3,4,5,3,2,1,2,2,1,5,5,8,9,6,6,3,4,3,1,3,5,3};

Lo siguiente que vamos a hacer es recorrer la distribución e ir insertando en un Map con clave/valor el número de veces que aparece un valor en la distribución. La clave será el elemento de la distribución y el valor el número de veces que aparece.

Hay que tener en cuenta que si es la primera vez que aparece el número, habrá que inicializar dicha clave del Map con el valor de 1.

  1. Map<Integer,Integer> m = new HashMap<Integer,Integer>();
  2.  
  3. for (int elemento: elementos){
  4. if (m.containsKey(elemento))
  5. m.put(elemento,m.get(elemento)+1);
  6. else
  7. m.put(elemento,1);
  8. }

Como podemos ver en el código nos apoyamos en los métodos .put() y .get() del Map para añadir/consultar elementos, así como en el método .containsKey() para saber si el elemento está inicializado o no.

Una vez que tenemos nuestro Map cargado, vamos a recorrerlo para consultar cual es el elemento con mayor frecuencia. Como dijimos que podíamos tener varias modas utilizaremos un elemento List para ir guardando dichos valores y una variable repeticiones para saber cuál es el valor de mayor frecuencia.

  1. int repeticiones = 0;
  2. List<Integer> moda = new ArrayList<Integer>();

Pasamos a recorrer el Map utilizando una clase Entry que representa una dupla clave/valor.

  1. Iterator<Entry<Integer, Integer>> iter = m.entrySet().iterator();

Si la frecuencia del elemento del mapa es mayor que la actual, vaciamos la lista -.clear()-, insertamos el valor del elemento -.add()- e indicamos que esa frecuencia es la mayor. Si la frecuencia es igual, añadimos el elemento a la lista y si es menor, simplemente se descarta.

  1. while (iter.hasNext()) {
  2. Entry<Integer,Integer> e = iter.next();
  3.  
  4. if (e.getValue() > repeticiones) {
  5. moda.clear();
  6. moda.add(e.getKey());
  7. repeticiones = e.getValue();
  8. } else if (e.getValue() == repeticiones)
  9. moda.add(e.getKey());
  10.  
  11. }

Ya solo nos quedará comprobar que el número de modas no es igual al número de elementos de la distribución, ya que en ese caso no habrá moda. Si no, simplemente volcamos los elementos de la moda.

  1. if (moda.size() == elementos.length)
  2. System.out.println("No hay moda");
  3. else
  4. System.out.println("La moda de la distribución es " + moda);
Descargar el Codigo
Descargar el código
Error en el Codigo
Error en el código
Foro sobre Java Util
Foro sobre Java Util
tags: , , , , , , , , , , , ,

Artículos relacionados:

3 comentarios »

RSS feed para los comentarios de esta entrada. TrackBack URI

  1. Cayuss
    abril 14, 2014 #

    Buena entrada, se calcula en menos tiempo de esta forma que recorriendo x veces el array buscando las repeticiones. Gracias

Deja un comentario

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*