Mostrando las entradas con la etiqueta Números Aleatorios. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Números Aleatorios. Mostrar todas las entradas

martes, febrero 18, 2020

Clasificación (ranking) ordinal con desempate aleatorio

En mi post anterior sobre clasificación (ranking) con Excel y con Power Query mostré un método de desempate basado en un "sorteo", es decir, asignar a cada miembro de la lista un número aleatorio y determinar la posición en caso de empate de acuerdo a ese número.

Como vimos, si usamos la función Number.Random de Power Query todas las filas de la tabla reciben el mismo número.

Buscando en la Internet dí con esta discusión donde se muestran algunas soluciones (aunque la única que funcionó con mi ejemplo fue a basada en List.Random).

Debo confesar que no entiendo cabalmente la solución propuesta que muestro en el post. Esto me produjo un sentimiento de incomodidad que me llevó a buscar mi propia solución.

Recordemos el problema a solucionar:
  • tenemos un a lista de calificaciones de alumno;
  • queremos ordenarla por calificación, de mayor a menor;
  • en caso de "empate" (dos o más alumnos con la misma calificación), realizamos un sorteo para determinar la posición relativa de los "empatados";
  • el sorteo lo hacemos calculando un número aleatorio para cada alumno. Luego ordenamos los empates de acuerdo al número aleatorio que recibió cada alumno.

La solución que desarrollé esta basada en la función Number.Random y en un "truco": combinar la consulta consigo misma.

Estos son los pasos aplicados partiendo de esta tabla de datos:

lunes, febrero 17, 2020

Ranking con Excel y con Power Query

Un docente me consulta sobre como ordenar una lista de alumnos de acuerdo a sus calificaciones. El problema del docente era cómo determinar la posición (ranking) de cada alumno en caso de empate (es decir, dos o más alumnos con la misma calificación).

Según Wikipedia hay cinco métodos de calcular la posición de un elemento en una lista (ranking)
  • Ordinal simple (1,2,3,4): cada elemento recibe un número de clasificación secuencial sin tomar en cuenta "empates".
  • Competencia estándar (1,2,2,4): los elementos que "empatan" reciben el mismo número de clasificación, y luego se deja un hueco en los números de clasificación.
  • Competencia modificada (1,3,3,4): la clasificación se hace dejando los huecos en los números de clasificación antes de los conjuntos de elementos de igual rango (en lugar de después de ellos como en la clasificación estándar de la competencia).
  • Clasificación Densa (1,2,2,3): los artículos que se "empatan" reciben el mismo número de clasificación, y los siguientes artículos reciben el número de clasificación inmediatamente posterior. 
  • Clasificación fraccionada (1,2.5,2.5,4): los artículos que "empatan" reciben el mismo número de clasificación, que es la media de lo que tendrían en las clasificaciones ordinales. 

En un próximo post volveré sobre el tema de los métodos de ranking. En este post me centraré en el método ordinal simple y algunas variaciones. Digamos que ésta sea la lista de alumnos:

jueves, septiembre 26, 2019

Muestra aleatoria con Power Query

Para el ejemplo del post "BUSCARV o Combinar consultas" necesitaba crear una tabla con 10 productos elegidos aleatoriamente de una lista con más de 70 items. En Excel Clásico resolvemos la cuestión usando la función ALEATORIO() o la función ALEATORIO.ENTRE():

  1. asignamos un número aleatorio a cada fila, 
  2. cancelamos las fórmulas con Copiar--Pegar--Solo valores, 
  3. ordenamos la tabla en forma ascendente o descendente 
  4. elegimos las primeras 10 filas (o el número de filas que deseemos). 

¿Cómo lo haríamos con Power Query?  Contamos con la función Number.Random pero al usarla veremos que suceden cosas extrañas.

Veamos este ejemplo

Partimos de la lista completa, y creamos una consulta

martes, noviembre 06, 2012

Generar muestras aleatorias en Excel

Supongamos que tenemos una lista de nombres como esta (la lista contiene 100 nombres propios)


y queremos extraer una muestra aleatoria de diez nombres.

En Excel podemos hacerlo con facilidad usando la función ALEATORIO.ENTRE para generar números aleatorios y usando este resultado como argumento en la función INDICE. Por supuesto tendremos que superar algunos inconvenientes, como, por ejemplo, números repetidos.

Empezamos por crear un nombre definido que re refiere al rango que contiene la lista (la población, en términos estadísticos)



En la hoja donde queremos que aparezca la muestra creamos una matriz que contenga los nombres (D4:E14 en nuestro ejemplo) y en el rango A5:A14 creamos una columna auxiliar con la fórmula

=ALEATORIO.ENTRE(1,CONTARA(Lista))



La fórmula que extrae los nombre en el rango E5:E14 es

=INDICE(Lista,A5)

donde "Lista" es el nombre que acabamos de definir.

Ahora basta con apretar F9 (Recalcular) para obtener una nueva muestra.

El problema con este modelo es que los números aleatorios no son únicos, es decir, pueden repetirse y por lo tanto generar nombres repetidos.

Para evitar esto creamos un mecanismo que verifique si hay números repetidos y en caso afirmativo, vuelva a calcular. Por supuesto, tendremos que usar macros.

En B5:B14 creamos un rango auxiliar con la fórmula

=CONTAR.SI($A$5:$A$14,A5)

Si el número aparece una única vez en el rango, el resultado es 1; en caso contrario será mayor que 1. Por ejemplo, en este caso el número 75 aparece dos veces y por lo tanto el nombre Cristian aparece dos veces en la muestra



En la celda B15 agregamos la fórmula " =SUMA(B5:B14)". Creamos el nombre definido " ControlValoresUnicos" que se refiere a esta celda. Si todos los números aparecen una única vez, el valor de la celda será 10; si es mayor de 10, sabemos que hay números repetidos.

Para automatizar esta operación usamos esta macro que ponemos en un módulo común del editor de Vb

Sub valores_unicos()

    Calculate
    While Range("ControlValoresUnicos") <> 10
        Calculate
    Wend
  
End Sub


La primer línea del código recalcula la hoja; luego la estructura While…Wend sigue recalculando hasta que la celda " ControlValoresUnicos" contiene el resultado 10.

El último paso es ocultar las columnas auxiliares y agregar un botón de la colección de Formularios de manera que el usuario puede generar una nueva muestra apretando este botón



El archivo con el ejemplo puede descargarse aquí

sábado, junio 16, 2007

Números aleatorios únicos con Excel

En mi nota sobre Cómo generar números aleatorios con Excel mostraba cómo generar una serie de números aleatorios únicos, es decir, sin repeticiones. Esta técnica se basaba en un generar intencionalmente una referencia circular.
Hay, por supuesto, otras posibilidades que detallo en este archivo




1 – "Unique Numbers": Microsoft propone un macro para generar números aleatorios únicos. Esta macro siempre pone los resultados a partir de la celda A3 (en el original desde la celda A1, pero la he modificado para poder poner el comando en el encabezamiento).

2 – "RndNum": no recuerdo de que foro tome esta macro.

3 – "UDF" (user defined function): tomada del sitio de Ozgrid. Esta es una función volátil, es decir, cada vez que se produce algún cambio en la hoja, Excel recalcula la función. El resultado aparece como texto en al celda que contiene la función.

4 – "MRAND": mi favorito. Esta función forma parte del complemento desarrollado por Laurent Longre que ya he mencionado en mi nota sobre la función INDIRECTO con cuadernos Excel cerrados. Esta función tiene muchas ventajas. Al ponerla como función matricial, nos permite definir una matriz (x filas X y columnas) de números aleatorios no repetidos. Además podemos definir si la función debe ser volátil o no. La sintaxis es:
{=MRAND(máximo, inicio, cantidad, volátil o estática)}.

Este archivo contiene los ejemplos y los códigos de las macros.




Technorati Tags:

martes, febrero 14, 2006

Cómo generar números aleatorios con Excel

La función ALEATORIO (RAND en la versión inglesa) de Excel genera números aleatorios. Esta función no tiene argumentos y es recalculada nuevamente cada vez que se produce un cambio en la hoja, excepto que el modo de cálculo sea "manual".
Los números que produce ALEATORIO (RAND) van de del 0 al 1.
En esta hoja usamos la fórmula =ALEATORIO() en el rango A2:A11




Si queremos producir una serie de números aleatorios enteros, debemos combinar la función ALEATORIO con la función REDONDEAR (ROUND), o con alguna otra función de este tipo como REDONDEAR.MAS o REDONDEAR.MENOS.
En esta hoja, usamos la fórmula combinada =REDONDEAR(ALEATORIO()*100,0) para producir números aleatorios entre 0 y 100



Si queremos producir números aleatorios que se encuentren en un rango entre dos números, digamos entre 12 y 88, podemos usar la fórmula


=REDONDEAR(ALEATORIO()*(88-12)+12,0)


Con esta técnica podemos generar, por ejemplo, números aleatorios para la lotería. Aquí, por ejemplo, el Loto sortea 6 números entre el 1 y el 36. El problema de esta fórmula es que puede generar números duplicados, como en este ejemplo



Supongo que hay más de una técnica para superar este problema. Mencionaré aquí dos de ellas.
La primera es, simplemente, recalcular la hoja (presionar F9) hasta lograr una serie sin números repetidos.
La otra consiste en condicionar la creación de los números aleatorios. Esta técnica consiste en generar una referencia circular intencional, para lo cual es necesario que la opción Iteración en Opciones/Cálculo esté activada (pueden bajar el archivo del ejemplo con las fórmulas Numeros Aleatoriosaqui)



La fórmula que usamos en el rango A2:A11 es


=SI(SUMA($B$2:$B$11)<>10,REDONDEAR(ALEATORIO()*(36-1)+1,0),REDONDEAR(ALEATORIO()*(36-1)+1,0))

en el rango B2:B11 usamos la fórmula =CONTAR.SI($A$2:$A$11,A2). Esta fórmula controla si hay números duplicados. Si el resultado es 1, el número aparece una sola vez.



La fórmula en el rango A2:A11 controla si todos los resultados en el rango B2:B11 no suman 10, es decir que hay algún numero duplicado; en ese caso calcula un número aleatorio. Si la condición lógica no se cumple, vuelve a calcular. Como ven hay aquí una referencia circular. Como hemos activado la opción "Iteración", Excel intentará encontrar la serie de 10 números que cumplan con la condición. Si no la encuentra, deberemos pulsar nuevamente F9 (recalcular) hasta encontrar la solución.

Esta técnica fue sugerida por John Walkenbach en su libro "Microsoft Excel 2000 Formulas".




Categorías: Funciones&Formulas_, Varios_