miércoles, 13 de junio de 2012

Generación masiva de muestras estadísticas con macros

Ya vimos como podíamos generar muestras estadísticas para distribuciones (Ver Generación de muestras estadísticas para distribuciones) de forma rápida y simple, pero este método tiene una limitación. Si necesitamos crear una serie de números, pero sin repetición, vamos a tener que utilizar la función aleatorio como se describió en Generación de muestras estadísticas para distribuciones y luego quitar los valores repetidos (con "Quitar Duplicados" por ej.) e ir agregando nuevos números aleatorios, volver a chequear que no hayan repetidos hasta obtener el tamaño de la muestra deseada. Este procedimiento puede no ser muy relevante si no estamos preocupados por el numero de la muestra, pero si lo estamos, esto puede ser muy complicado. Para esto mostraremos una herramienta muy similar a la función aleatorio() o aleatorio.entre(), pero que se hace con macros.

Primero debemos posicionarnos en la viñeta Programador y luego hacemos click en Visual Basic.



Luego seleccionamos Insertar y Modulo


En la pantalla blanca que se abre, colocamos el código que nos interesa:


Sub Aleatoriosunicos()
Dim i As Integer, j As Integer
Dim A() As Long
Dim esta As Boolean
Dim x As Long, y As Long, z As Long, num As Long
x = Application.InputBox(prompt:="Introduzca el rango mínimo al cual quiere que pertenezcan los números aleatorios" _
        , Title:="Generador de Números Aleatorios", Default:=1, Type:=1)
y = Application.InputBox(prompt:="Introduzca el rango máximo" _
        , Title:="Generador de Números Aleatorios", Default:=1000, Type:=1)
z = Application.InputBox(prompt:="Introduzca la cantidad de números aleatorios que desea generar?" _
        & " (<15000)?" _
        , Title:="Generador de Números Aleatorios", Default:=100, Type:=1)
If z = 0 Then Exit Sub
If z > 15000 Then z = 15000
If z > y - x + 1 Then
    MsgBox "!Ha especificado más números " _
    & "de los que son posibles en el rango!"
    Exit Sub
End If
ReDim A(z)
Randomize
A(1) = Int((y - x + 1) * Rnd + x)
For i = 2 To z
    Do
        num = Int((y - x + 1) * Rnd + x)
        esta = False
        For j = 1 To i - 1
           If num = A(j) Then esta = True: Exit For
        Next j
    Loop While esta
    A(i) = num
Next i
For i = 1 To z
    Cells(i, 2) = A(i)
Next i
End Sub

Nos quedará algo así:






Para entender que hace el código, iremos analizando paso por paso, para poder ir cambiando las propiedades más interesantes. Si nos fijamos la macro comienza con Sub Aleatoriosunicos() , si queremos cambiar el nombre de la Macro en vez de Aleatoriosunicos escribiremos el nombre que deseamos.
Luego en esta parte del código


estamos creando InputBox que nos permiten introducir el numero mínimo y máximo que queremos que aparezca en nuestra muestra y el tamaño de ella. Podemos cambiar el dialogo que aparece en los cuadros reemplazando el texto que esta entre comillas después de prompt:=. Además podemos cambiar los números minimos, máximos y tamaño de la muestra que salgan por defecto, esto lo hacemos reemplazando los números después de Default:

Por otro lado podemos ver que 


si el numero que se coloca en el InputBox que corresponde al tamaño de la muestra (z) es igual a 0 la macro deja de correr, si es mayor a 15000, se reemplazará el número introducido por 15000, generando una muestra de este tamaño. Si el tamaño de la muestra introducido es mayor que el rango de los números especificados la macro devuelve un MsgBox que indica el error. Si queremos podemos cambiar este texto reeplazandolo después de MsgBox.

Finalmente el resto del código crea los valores aleatorios comprobando que no estén repetidos una y otra vez.


De esta forma cada vez que queramos crear una muestra, solo debemos hacer correr la macro. Esto lo hacemos en la viñeta Programador, Macros, seleccionando la macro y haciendo click en Ejecutar.


La macro hará que aparezcan los Input Box mencionados, 





al colocar la información que nos piden nos quedará algo así. Podemos observar que la muestra se creará a partir de la celda B1.


Luego estos valores, serán los llamados x en las funciones de distribución. Por ej. podemos calcularlo para la normal, Chi cuadrado y Poisson. Para más detalle ver (Generacion de muestras estadisticas para distribuciones y Generación de distribuciones estadísticas).







Fuentes 

http://excelavanzado.com/macros.htm
http://www.excelavanzado.es/2008/11/generacin-de-nmeros-aleatorios-nicos.html
http://www.computacionynegocios.info/2012/06/generacion-de-muestras-estadisticas.html
http://www.computacionynegocios.info/2012/06/generacion-de-distribuciones.html



No hay comentarios:

Publicar un comentario