Promedio Ponderado en JavaScript: Fórmulas y Casos de Uso
En las clases prácticas de este taller aprendimos a calcular el promedio (media aritmética), la mediana y la moda con JavaScript. En este reto debes encontrar la fórmula de algún otro tipo de promedio, trabajar con alguno de sus casos de uso útiles y traducirlo a código JavaScript.
Responde las siguientes preguntas en los comentarios:
¿Cuál tipo de promedio elegiste para trabajar?
¿Qué casos de uso tiene tu tipo de promedio?
¿Cómo traduces su fórmula a código JavaScript?
Espero tu solución en la sección de aportes.
Solución al promedio ponderado
Elegí trabajar con la media aritmética ponderada. Este es un promedio muy similar a la media aritmética, pero nos permite definir también el peso, importancia o relevancia de cada elemento en nuestro conjunto de números.
Un caso de uso de la media ponderada es el cálculo de notas académicas cuando cada materia o asignatura otorga diferentes "créditos".
Esta es su fórmula:
En español: multiplicar cada número del conjunto por su respectivo crédito, sumar todos los resultados y dividirlo entre la suma de todos los créditos.
Recuerda que no tienen que ser únicamente 3 números, pueden ser lo que desees, esto solo fue un ejemplo.
Ahora sí, vamos paso a paso implementando el promedio ponderado en JavaScript:
Definir el conjunto de números junto al peso de cada elemento
Para esto vamos a crear un array de objetos llamado notes. Cada objeto tendrá tres valores: course con el nombre de la materia (aunque en realidad no lo utilizaremos :sweat_smile:), note con la nota de la materia y credit con los créditos de la materia.
Sumar todos los elementos del arreglo de elementos multiplicados por su peso
Vamos a usar de nuevo el método reduce de los arrays.
Crearemos una nueva variable sumOfNotesWithCredit que tenga como resultado la suma de todos los elementos del arreglo notesWithCredit. Recuerda que la función reduce recibe una función con dos parámetros: el valor acumulado (que para evitar errores debemos inicializar con 0) y el nuevo elemento de los arrays.
const sumOfNotesWithCredit = notesWithCredit.reduce(function(sum =0, newVal){return sum + newVal;});
Sumar todos los pesos (créditos)
Sí, otra vez map y reduce. Vamos a crear un nuevo arreglo credits únicamente con los créditos de cada materia y otra nueva variable sumOfCredits que recorra el arreglo credits y sume sus elementos.
En este caso, el promedio ponderado de una nota de 10 con créditos de 2, otra nota de 8 con un crédito de 5 y una última nota de 7 con créditos de 5 nos da como resultado 7.916.
La media aritmética sin tener en cuenta el peso de cada nota habría sido 8.333.
Espero que este último ejercicio te haya ayudado a interiorizar un poco más el uso de los métodos de los arrays para obtener diferentes resultados con ellos.
Te espero en la siguiente clase.
¡Nunca pares de aprender! 💚
Rta1: Utilicé la media armónica
Rta2: Este tipo de media suele utilizarse, principalmente, en velocidades, tiempos, o en el área de la electrónica. Sin embargo, su uso no está muy extendido en otras disciplinas. Ninguno de los elementos puede ser nulo. fuente: Media Armónica.
Rta3: Aquí el código:
const arr5 =[2,5,6];functionmediaH(array){if(array.includes(0)){return'Number must be different from zero.'}else{let mh = array.length/ array.reduce((acc, elem)=> acc +(1/ elem),0);return mh;}}console.log(`Media Armonica: ${mediaH(arr5)}`);//Expected output => Media Armonica: 3.4615384615384617
muy bien también iba a realizar esa media pero no encontraba con como hacer la fracción 1/n muy buena
Use Rango y Rango Medio:
Se usan para encontrar la brecha entre los extremos de un conjunto de valores, para verificar que tan separados o juntos se encuentran. Es de mucha utilidad para medir el desempeño de grupos basándose en resultados lineales e intentar llevarlo lo más cercano a 0 para una igualdad dentro del conjunto.
¿Cuál tipo de promedio elegiste para trabajar?
Promedio geométrico o media geométrica.
¿Qué casos de uso tiene tu tipo de promedio?
Existen dos usos principales de la media geométrica:
Para promediar porcentajes, indices y cifras relativas y
Para determinar el incremento porcentual promedio en ventas, producción u otras actividades o series económicas de un periodo a otro.
¿Cómo traduces su fórmula a código JavaScript?
/* Calculando el promedio geométrico */// Calcula el promedio geométrico de [2, 3, 8, 27]const array =[2,3,8,27];functioncalcularPromedioGeometrico(array){// raizN(a1*a2*a3*...*aN)constmultArray=(valorAcumulado, nuevoValor)=>{return valorAcumulado*nuevoValor;}const multArrayTotal = array.reduce(multArray);const promedioGeometrico =Math.pow(multArrayTotal,(1/array.length));console.log("El promedio geométrico es "+ promedioGeometrico);}calcularPromedioGeometrico(array);// El promedio geométrico es 6.
¿Cuál tipo de promedio elegiste para trabajar?Promedio Ponderado¿Qué casos de uso tiene tu tipo de promedio?
se utiliza cuando dentro de una serie de datos, uno de los valores tiene una mayor importancia o hay un dato con mayor peso que el resto. Se puede utlizar por ejemplo en las universidades o escuelas donde cada parcial tiene un valor diferente.
¿Cómo traduces su fórmula a código JavaScript?
functioncalcularMediaPonderada(arr){let sumaCredit =0;let noteCredit =0;for(let i =0; i < arr.length; i++){const element = arr[i]; noteCredit += element['result']* element['credit']; sumaCredit += element['credit'];}const mediaPonderada = noteCredit / sumaCredit;return mediaPonderada;}
utilicé el rango medio para traducirlo a código
el rango medio funciona tomando el mayor y menor valor de una lista y se obtiene el promedio entre estos dos valores, sirve para definir la extensión del rango de datos
utilicé una array de ejemplo y me dio el resultado, se resuelve usando el método .sort para ordenar el array y luego se saca el promedio de los valores en la primera y ultima posición de este
Hola, la verdad me tardé en entender como aplicar los métodos de los array que implican mutabilidad. El método Sort modifica el array original, si lo metes en la primera linea de tu función todo lo que venga después contendrá un array mutado con el orden que designes en el método sort por eso ya no es necesario indicar una nueva variable que contenga un nuevo array como en otros métodos.
MI función mas compacta quedó así.
function calcularRangoM(array){
array.sort((a,b) => a - b , 0)
const item1 = array[array.length - 1];
const item2 = array[0];
const rangoM = (item1 + item2)/2;
return rangoM;
}
Si por ejemplo yo hubiera creado una variable para ordenar mi array.
const vectorOrdenado = vector.sort((a,b)=> a - b ,0);
y luego hago un console.log de vectorOrdenado y vector:
Te darás cuenta que el array original cambió de cualquier forma.
++Media cuadratica++
En matemáticas, la media cuadrática, valor cuadrático medio, raíz de la media cuadrática o RMS (del inglés root mean square) es una medida estadística de la magnitud de una cantidad variable. Puede calcularse para una serie de valores discretos o para una función matemática de variable continua por ejemplo movimiento helicoidal. El nombre deriva del hecho de que es la raíz cuadrada de la media aritmética de los cuadrados de los valores.
A veces la variable toma valores positivos y negativos, como ocurre, por ejemplo, en los errores de medida. En tal caso se puede estar interesado en obtener un promedio que no recoja los efectos del signo. Este problema se resuelve, mediante la denominada media cuadrática. Consiste en elevar al cuadrado todas las observaciones (así los signos negativos desaparecen), en obtener después su media aritmética y en extraer, finalmente, la raíz cuadrada de dicha media para volver a la unidad de medida original. La desviación estándar es una media cuadrática.
functionmediaCuadratica(lista){var listUpTwo = lista.map((x)=> x **2)console.log(listUpTwo)var sum = listUpTwo.reduce((sum =0, newVal)=>{return sum + newVal
})console.log(sum)var result =Math.sqrt(sum / lista.length)return result
}
Promedio o media truncada.
Este promedio elimina entre 5% al 25% de los elementos de mi lista según sea el requerimiento, y la eliminación se hace en ambos entremos.
Entonces el uso mas practico es eliminar esos valores atípicos en los extremos que tienden a estar muy distantes de la media real.
Como en el ejemplo de los salarios, podemos eliminar los salarios de los extremos (como el de Bill Gates).
Necesitamos una lista de valores y el % de elementos a eliminar de mi lista:
Ejemplo: lista [2,3,5,1,4,25] 10% de eliminación es decir 0.6, redondeamos a 1.
Vamos a eliminar eliminar entonces el 1er elemento y el ultimo, PERO primero debemos organizar la lista y luego los elementos que quedan le aplicamos una media aritmética como ya la vimos en clases pasada, y esa seria una media truncada.
Media Truncada = 3.5
Vamos al código.
// Calcular media truncada// De una lista de valores, vamos a eliminar entre el 5% al 25% (tanto del extremo mas alto como del mas bajo)// y se calcula una media aritmetica de los valores que queden.const score =[90,40,70,50,60,80]functioncalcularMediaTruncada(array, recorte){/* Vamos a calcular segun el recorte requerido, cuantos
elementos vamos a retirar de nuestro array, desde ambos extremos */let lengthFinal =Math.round(array.length*(recorte/100));// Condicional por si length es < 1 sea 1if(lengthFinal >=1){ lengthFinal=lengthFinal
}else( lengthFinal =1)// Ordenar array array.sort((a , b)=>{if(a > b)return1;if(a < b)return-1;return0;});// Ciclo para aplicar metodo segun la cantidad de veces requeridas por el recortefor(let i=0; i < lengthFinal; i++){ array.shift(); array.pop();}// A los elementos que quedaron en mi array, aplico media aritmeticalet sumaArray = array.reduce((valorAcumulado, valorNuevo)=> valorAcumulado + valorNuevo)let promedio = sumaArray / array.length;console.log(promedio);return promedio.toFixed(2);}// Colocar como argumento array y porcentaje de recorte segun la norma entre 5% - 25%calcularMediaTruncada(score,25);// 65// Vamos a calcular la media truncada de la siguiente lista y eliminando primero el 10% de la listacalcularMediaTruncada([20,2,10,5,22,20,100,43,45,33,95,3],10);// 29.60
Profesor una pregunta, respecto a la forma de resolver un problema influye en la solución, pues anteriormente se me da demasiado bien en la parte de algoritmia y estructura de datos, ahora que observo nuevas funciones que son el sort y reduce, veo que facilita demasiado... ¿Mi pregunta es, influye el metodo de resolver dicho problema?
Por supuesto que influye. Una cosa es ordenar una lista con el sort por defecto de JS y otra muy distinta hacerlo con la menor complejidad posible. Este curso te puede gustar: https://platzi.com/cursos/complejidad-js/
Pregunta 1: La media aritmética simple
Pregunta 2: Su simplicidad y facilidad de interpretación la hacen esencial en diversas áreas, como análisis de datos, finanzas personales, estadística descriptiva, evaluación de desempeño, predicciones, investigación científica, gestión de recursos, evaluación de encuestas, proyecciones poblacionales y diseño de políticas públicas.
Pregunta 3: Código:
¿Cuál tipo de promedio elegiste para trabajar?
Media geometrica:La media geométrica de n números positivos se obtiene por ellos multiplicando todos juntos y luego tomar la enésima raíz
¿Qué casos de uso tiene tu tipo de promedio?
El peso w de una sustancia que tiene pesos hallados por dos balanzas u y v , resulta w = sqrt( u*v)
¿Cómo traduces su fórmula a código JavaScript?
functioncalcularMdiaGeometrica(listaNumerosPositivos){//La media geométrica de n números positivos se obtiene por ellos multiplicando todos juntos y luego tomar la enésima raíz// primera opccion mediante un ciclo for let productoDeElementos =1;for(let index =0; index < listaNumerosPositivos.length; index++){const element = listaNumerosPositivos[index]; productoDeElementos *=element;}// segunda opccion mediante metodos de array, en este caso usamos el metodo de reducefunctionproductoElement(valorAcumulado, nuevoValor){return valorAcumulado * nuevoValor;}const productoDeElementos2 = listaNumerosPositivos.reduce(productoElement);// tercera opccion mediante metodos de array, en este caso usamos el metodo de reduce y arrow function const productoDeElementos3 = listaNumerosPositivos.reduce((valorAcumulado, nuevoValor)=>valorAcumulado * nuevoValor);const raiz =1/ listaNumerosPositivos.length;const mediaGeometrica =Math.pow(productoDeElementos, raiz);console.log({ productoDeElementos, productoDeElementos2, productoDeElementos3, raiz, mediaGeometrica});return mediaGeometrica;}
yo lo hice de esta manera
<code>let creditos =[];let productoNotasCreditos =[];for(let i =0; i < notes.length; i++){ creditos.push(notes[i].credit); productoNotasCreditos.push(notes[i].note* notes[i].credit);}const sumaCreditos = creditos.reduce((acum, elem)=> acum + elem,0);const sumaProducto = productoNotasCreditos.reduce((acum, elem)=> acum + elem,0);const ponderado = sumaProducto / sumaCreditos;console.log("Tu ponderado es: "+ ponderado.toFixed(1));
Yo hize la media geometrica, donde la media geometrica de los números 2, 3 y 14 es igual a (2 * 3 * 14) 1/3 = (84) 1/3 = 4,37952. Me quedo asi:
const numbers =[2,3,14];letmediaGeometrica=list=>{let productResult = list.reduce((a,b)=> a * b);let result =Math.pow(productResult,(1/list.length));console.log(productResult);returnconsole.log(result);};mediaGeometrica(numbers)
Promedio geométrico
Se utiliza para calcular el crecimiento o la tasa de retorno promedio en una serie de valores. Se obtiene multiplicando todos los valores y luego tomando la raíz n-ésima del producto, donde n es el número de valores.
const nums =[1,3,9];functiongeometricAverage(array){const product = array.reduce((accumulator, currentValue)=> accumulator * currentValue
)const average =Math.pow(product,1/array.length);return average
}geometricAverage(nums)
Promedio Ponderado
¿Cuál tipo de promedio elegiste para trabajar?
Promedio ponderado
¿Qué casos de uso tiene tu tipo de promedio?
Las notas de un alumno a lo largo de un semestre universitario tienen distintos pesos, y el promedio final del curso se calcula en función a las notas y pesos.
¿Cómo traduces su fórmula a código JavaScript?
Código:
Test en el navegador:
Definición
En estadística, el término "rango medio" se refiere a la mitad de la amplitud de un conjunto de datos. Es decir, es la diferencia entre el valor máximo y el valor mínimo dividido por dos.
El rango medio puede ser útil para resumir la variabilidad de un conjunto de datos, es importante tener en cuenta que el rango medio es una medida muy sensible a los valores extremos o atípicos, ya que se basa en la amplitud del conjunto de datos completo. Por lo tanto, puede ser útil considerar otras medidas de dispersión, como la desviación estándar o el rango intercuartil, para tener una idea más completa de la variabilidad en los datos.
Fórmula
Ejemplo
Para una muestra de valores (3, 5, 8, 6,3), el dato de menor valor Min= 3 y el dato de mayor valor Max= 8.
En código quedaría tal que así:
functionordenarLista(lista){const listaOrdenada = lista.sort((a,b)=>a-b);// (3, 3, 5, 6, 8)calcularRangoMedio(listaOrdenada);// llamar a la funcion rangoMedio}functioncalcularRangoMedio(lista){const rangoMedio =(lista[0]+lista[lista.length-1])/2;// con lista[0], obtenemos el elemento menor (3). Y con lista[lista.length-1], el elemento mayot (8)/*Aplicando la formula quedaría asi: (3+8)2 = 5.5 */return rangoMedio;}
Representación del medio rango:
!
Elegí la media geométrica
Lo elegí porque me pareció interasante su formulación matemática dado que es la raíz n-ésima del producto de todos los números; es recomendada para datos de progresión geométrica, para promediar razones, interés compuesto y números índice.
yo utilice la media cuadrática:
<code>functionmediaCuadratica(lista){const sumaElementos = lista.reduce((acumulado, item)=>{return acumulado +=Math.pow(item,2);},0);const res =Math.sqrt((sumaElementos/lista.length));return res;};mediaCuadratica(lista);
¿Cuál tipo de promedio elegiste para trabajar?
Media armónica
¿Qué casos de uso tiene tu tipo de promedio?
Sirve para calcular promedios de velocidades, tiempos o cálculos en electrónica.
¿Cómo traduces su fórmula a código JavaScript?
La fórmula es
Datos:
Una persona sale a correr 10km. Los primeros 2km correa a 15 km/h,
los siguientes 2km a 17km/h,
Los siguientes 2km a 14km/h,
Los siguientes 2km a 13km/h
Y finalmente los últimos 2km a 12km/h
Lo primero que haría es tomar los datos de las velocidades x1,x2,x3,x4,x5 en una array
Luego dividir array.length / (1/15)+(1/17)+(1/14)+(1/13)+(1/12)
Para el reto yo utilicé la Media Cuadrática. Este tipo de medida se utiliza cuando se quiere calcular la media de variables que toman valores negativos y positivos. Se suele utilizar cuando el símbolo de la variable no es importante y lo que interesa es el valor absoluto del elemento. Por ejemplo, para calcular la media de errores de medida.
La fórmula que se usa para calcular dicha media está expresada por la ecuación:
En mi caso, el código en JavaScript que utilicé para calcular dicha medida fue el siguiente:
function calculateRMS(list) {
list = list.map((item) => Math.pow(item, 2));
const accList = list.reduce((a, b) => a + b);
return parseFloat(Number.parseFloat(Math.sqrt(accList / list.length)).toFixed(3));
}
En dónde la primera línea dentro de la función se utiliza para elevar al cuadrado cada elemento del arreglo. La segunda línea es la que calcula la sumatoria de los cuadrados. Y en la última línea se calcula la raíz cuadrada de dividir la sumatoria de los cuadrados entre la cantidad de elementos. En esa misma línea se trunca la salida a mostrar solamente tres dígitos significativos del resultado.
Pueden observar la página desplegada en este enlace y pueden mirar el código en GitHub.