OBSERVACION con todo respeto.
Esta solución no funciona al detalle ya que esta tomando el numero mas bajo que tiene la maxima frecuencia absoluta. Me explico, si a tu función se le pasa un array donde hay mas de 1 valor con la misma maxima frecuencia absoluta, debería mostrarlos y no los muestra, muestra el mas bajo.
Por otra parte en terminos estadisticos se considera que una muestra no tiene moda, o que no hay utilidad con ella cuando hay mas de 2 valores con la misma maxima frecuencia absoluta.
Investigue y existen tres tipos de modas dependiendo la cantidad de valores que tengan el mismo número de repeticiones máximas.
Tipos de moda estadística
La moda estadística se clasifica de la siguiente manera:
Moda unimodal: tipo de moda estadística en la cual un único valor se repite el mayor número de veces dentro de un conjunto de datos.
Moda bimodal: tipo de moda estadística en la que 2 valores diferentes presentan el mismo número máximo de repeticiones, dentro de un conjunto de datos.
Moda multimodal: tipo de moda estadística en la que 3 o más valores diferentes presentan el mismo número máximo de repeticiones dentro de un conjunto de datos.
Fuente de información:
Moda estadística
Moda (estadística))
Utilice esta función para imprimir múltiples modas:
muy buena clase!! es muy satisfactorio pausar la clase y darte cuenta que estás entendiendo porque lo pudiste resolver solo. Y aunque no se pueda, también se aprende muchísimo equivocándose. Lo que más me gusta es poder entender en forma más clara como funcionan los métodos de arrays, porque sinceramente aún no sé leer con claridad la documentación de developer.mozilla
Done! usando arrow functions y entendiendo que cada objeto paso a ser un elemento del array, se puede acceder a cada elemento de cada array, así seleccionando el "1" que sería el segundo, es decir el value, es decir el valor que nos interesa para saber el elemento más repetido:
.
.
.
let list =[2,7,4,7,2,4,1,7,3,8];functionfindMode(arr){let objectList ={};for(let i =0; i < arr.length; i++){let element = arr[i];if(objectList[element]){ objectList[element]+=1;}else{ objectList[element]=1;}}const objectArray =Object.entries(objectList);const orderObjectArray = objectArray.sort((a, b)=> a[1]- b[1]);return orderObjectArray;}findMode(list);
NOTAS DE LA CLASE
gracias!, muy genial tus apuntes!
Comparto ambas soluciones (1ra que hice antes de ver las clases y la segunda con la implementación del Object.entries()
constmoda=(array)=>{let storage ={};let answerModa;for(let number of array){//storage[number]-->key!storage[number]?(storage[number]=1): storage[number]++;}let max =Math.max(...Object.values(storage));for(let key in storage){if(storage[key]== max){ answerModa = key;}}return`La moda es ${answerModa} y se repite ${max} veces`;};constmoda1=(array)=>{let storage ={};let answerModa;for(let number of array){//storage[number]-->key!storage[number]?(storage[number]=1): storage[number]++;}let arrayOfArrys =Object.entries(storage);let order = arrayOfArrys.sort((a, b)=> a[1]- b[1]); answerModa = order[order.length-1];return`La moda es ${answerModa[0]} y se repite ${answerModa[1]} veces`;};
Ejemplo con emojis, y una manera más corta, pero no por eso más fácil de comprender.
Esta es mi solución en caso exista mas de una moda.
functionmoda(arr){const objarr ={}; arr.forEach(element=>{if(objarr[element]){ objarr[element]+=1;}else{ objarr[element]=1;}});const objlist =Object.entries(objarr);let newarr = objlist.sort((acumulado,valor)=>valor[1]-acumulado[1]);const newe = newarr[0][1];//esto por si hay mas de 1 moda newarr.forEach(element=>{if(newe==element[1]){console.log("La moda es "+ element[0]);}})}
Despues de ver esta clases por quinta vez al fin entendi...
Siempre es bueno complementar las clases con lecturas de la documentacion oficial
Hola buen si alguien me puede sacar de esta duda: Tengo entendido que cuando se aplica .entries pasa de objeto a arreglo pero en la misma posición si organizarse pero en mi código me lo devuelve ordenado antes de invocarle la función de ordenar entonces me tiene con la duda por que se esta devolviendo ordenada .
El método sort modifica el array original. Para evitar ese comportamiento una de las cosas que puedes hacer es copiar el Array utilizando el operador spread, y luego a ese nuevo Array aplicarle el sort
Tengo la misma pregunta, me pasa lo mismo que a ti y es cierto que cuando llamamos el sort despues modifica el array original, pero por que al profe no le pasa eso?
Comparto mi solución para incluir el caso de que haya más de una moda:
const numeros =[6,6,5,6,2,6,6,8,9,5,1,4,7,6,3,6,3,3,3,3,3,3];var repeticiones ={};var modas ={};functionencontrarModa(){for(var numero of numeros){if(repeticiones[numero]){ repeticiones[numero]+=1;}else{ repeticiones[numero]=1;}if(repeticiones[numero]==Math.max.apply(null,Object.values(repeticiones))){ masRepetido = numero; vecesRepetido = repeticiones[numero]; modas[masRepetido]= vecesRepetido;}}if(Object.keys(modas).length==1){console.log('El numero que más veces se repite es el '+ masRepetido +' unas '+ vecesRepetido +' veces.')}else{console.log('Los numeros que mas se repiten son '+'('+Object.keys(modas).length+')'+': '+Object.keys(modas)+' unas '+ vecesRepetido +' veces cada uno.')};};encontrarModa();
Reto cumplido de arreglar arrays bidimiensionales:
noentendí
Dejo el código del profe con su explicación:
let number_list =[20,20,30,30,10,10,10,10,10,80,80,80,80];functionmoda(list){let new_list ={};for(let i=0; i<list.length; i++){let item = list[i]; new_list[item]? new_list[item]+=1: new_list[item]=1;}console.log('Array', number_list);console.log('Objeto', new_list);// De objeto a array de arrays let array_list =Object.entries(new_list);console.log('Array de arrays', array_list);let sort_by_value =sort_two_dimensional_list(array_list,1);console.log('Ordenado por valor',sort_by_value);let find_moda = sort_by_value[sort_by_value.length-1];console.log('Find moda', find_moda);let found_mode = find_moda[0];console.log('Found moda', found_mode);}moda(number_list);functionsort_two_dimensional_list(unordered_list, i){functionsort_list(a,b){return a[i]- b[i];}let sorted_list = unordered_list.sort(sort_list);return sorted_list;}
Explicación:
Este es un código de JavaScript que encuentra la moda (el valor que aparece con mayor frecuencia) en una lista de números.
Primero, define una lista de números llamada "number_list".
Luego, se define una función llamada "moda" que toma como parámetro una lista.
Dentro de la función, se crea un objeto llamado "new_list" que se usará para contar la cantidad de veces que aparece cada número en la lista.
Se recorre la lista con un bucle "for" y para cada número se verifica si ya está en el objeto "new_list". Si es así, se incrementa la cuenta en 1, y si no, se agrega al objeto con una cuenta inicial de 1.
Después de crear el objeto "new_list", se convierte en un "array de arrays" (cada subarray tiene dos elementos: el número y su cuenta) utilizando el método "Object.entries()".
Luego, se utiliza la función "sort_two_dimensional_list" para ordenar el "array de arrays" por el valor de la cuenta en orden ascendente.
Finalmente, se retorna el último elemento del "array de arrays" ordenado, que corresponde a la moda, y se guarda en la variable "found_mode".
La función "sort_two_dimensional_list" es una función auxiliar que toma dos parámetros: una lista bidimensional y el índice de la columna por la que se desea ordenar la lista. Esta función utiliza la función "sort" para ordenar la lista bidimensional por la columna especificada y retorna la lista ordenada.
Aquí mi solución al problema propuesto teniendo en cuenta la existencia de varios términos con el mismo número de apariciones: