Mostrando entradas con la etiqueta Aleatorio. Mostrar todas las entradas
Mostrando entradas con la etiqueta Aleatorio. Mostrar todas las entradas

2016-06-04

Generar letras aleatorias en Excel

Title

Problema

Queremos generar aleatoriamente, en un rango de celdas, letras de la A a la Z.

Solución

Empleamos la función ALEATORIO.ENTRE para generar números del juego de caracteres ANSI y devolver el carácter asociado a ese número con la función CARACTER.

  • Mayúsculas
  • =CARACTER(ALEATORIO.ENTRE(65;90))

  • Minúsculas
  • =CARACTER(ALEATORIO.ENTRE(97;122))

    Resultado final

    Entradas relacionadas

  • Generar números aleatorios entre dos valores con decimales
  • Referencias

  • CARACTER (función CARACTER)
  • 2015-07-27

    Dividir aleatoriamente los datos en dos partes con R

    Title

    Problema

    Deseamos dividir aleatoriamente nuestros datos en dos partes. Será por ejemplo necesario para evaluar modelos estadísticos o de machine learning, y necesitemos construir dos conjuntos de datos, uno de entrenamiento o prueba del modelo (training) y otro de prueba independiente del mismo (test),

    Solución

    Utilizamos el siguiente código con el data frame mtcars.

    set.seed(1234)
    ind <- sample(2, nrow(mtcars), replace = TRUE, prob = c(0.7, 0.3))
    data1 <- mtcars[ind == 1, ]
    data2 <- mtcars[ind == 2, ] 
    
    Generamos un índice de unos y doses para el número de filas de nuestro conjunto de datos —nrow— con las probabilidades deseadas, en nuestro ejemplo un 70% y un 30%. Con ese índice creamos los dos subconjuntos: data1 y data2.

    # Primera parte
    data1
    
                       mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Mazda RX4          21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
    Mazda RX4 Wag      21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    Datsun 710         22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
    Hornet 4 Drive     21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    Valiant            18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
    Duster 360         14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
    Merc 240D          24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    Merc 230           22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
    Merc 280           19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    Merc 280C          17.8   6 167.6 123 3.92 3.440 18.90  1  0    4    4
    Merc 450SE         16.4   8 275.8 180 3.07 4.070 17.40  0  0    3    3
    Merc 450SL         17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
    Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
    Chrysler Imperial  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    Fiat 128           32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
    Honda Civic        30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
    Toyota Corolla     33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
    Toyota Corona      21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    Dodge Challenger   15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
    AMC Javelin        15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
    Camaro Z28         13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
    Pontiac Firebird   19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
    Porsche 914-2      26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
    Ferrari Dino       19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    Maserati Bora      15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    Volvo 142E         21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2
    
    # Segunda parte
    data2
    
                         mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
    Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4
    Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    

    Entradas relacionadas

    Referencias

    2015-07-05

    Muestra aleatoria de filas por grupos en R

    Title

    Problema

    Deseamos extraer una muestra aleatoria de filas por grupos de un data frame en R.

    Solución

    Veremos dos ejemplos: con un grupo o varios (dos para simplificar).

    Un grupo

    Extraemos 3 registros de cada una de las especias: setosa, versicolor y virginica.

  • Paquete base
  • set.seed(1)
    iris1 <- lapply(split(iris, iris$Species), function(x) x[sample(nrow(x), 3), ])
    do.call("rbind", iris1) 
    
                  Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    setosa.14              4.3         3.0          1.1         0.1     setosa
    setosa.19              5.7         3.8          1.7         0.3     setosa
    setosa.28              5.2         3.5          1.5         0.2     setosa
    versicolor.96          5.7         3.0          4.2         1.2 versicolor
    versicolor.60          5.2         2.7          3.9         1.4 versicolor
    versicolor.94          5.0         2.3          3.3         1.0 versicolor
    virginica.148          6.5         3.0          5.2         2.0  virginica
    virginica.133          6.4         2.8          5.6         2.2  virginica
    virginica.131          7.4         2.8          6.1         1.9  virginica
    
  • Paquete dplyr
  • library(dplyr)
    set.seed(1)
    iris %>%
      group_by(Species) %>%
      sample_n(., 3)
    
     Source: local data frame [9 x 5]
    Groups: Species
    
      Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
    1          4.3         3.0          1.1         0.1     setosa
    2          5.7         3.8          1.7         0.3     setosa
    3          5.2         3.5          1.5         0.2     setosa
    4          5.7         3.0          4.2         1.2 versicolor
    5          5.2         2.7          3.9         1.4 versicolor
    6          5.0         2.3          3.3         1.0 versicolor
    7          6.5         3.0          5.2         2.0  virginica
    8          6.4         2.8          5.6         2.2  virginica
    9          7.4         2.8          6.1         1.9  virginica
    
    Dos grupos

    Por cada número de cilindros de los coches (4, 6 u 8) extraemos dos con transmisión automática = 0 y dos con transmisión manual = 1.

  • Paquete base
  • set.seed(1)
    mtcars1 <- lapply(split(mtcars, list(mtcars$cyl, mtcars$am)), function(x) x[sample(nrow(x), 2), ])
    do.call("rbind", mtcars1) 
    
                           mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    0.4.Merc 240D         24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    0.4.Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    1.4.Fiat X1-9         27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    1.4.Lotus Europa      30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    0.6.Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    0.6.Merc 280          19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    1.6.Ferrari Dino      19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    1.6.Mazda RX4 Wag     21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    0.8.Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    0.8.Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    1.8.Ford Pantera L    15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    1.8.Maserati Bora     15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    
  • Paquete dplyr
  • set.seed(1)
    mtcars %>%
      group_by(cyl, am) %>%
      sample_n(., 2)
    
    Source: local data frame [12 x 11]
    Groups: cyl, am
    
        mpg cyl  disp  hp drat    wt  qsec vs am gear carb
    1  24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
    2  21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
    3  27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
    4  30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
    5  21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
    6  19.2   6 167.6 123 3.92 3.440 18.30  1  0    4    4
    7  19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
    8  21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
    9  14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
    10 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
    11 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
    12 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
    

    Entradas relacionadas

    2015-06-20

    Generar números aleatorios en tipos de datos Autonumeración en Ms Access

    Title

    Problema

    Queremos crear una clave principal que utilice números aleatorios en lugar de valores numéricos incrementales.

    Solución

    1. Creamos una nueva tabla o abrimos una ya existente en Vista Diseño.
    2. En tipo de datos seleccionamos Autonumeración. En las Propiedades del campo, en Nuevos Valores seleccionamos Aleatoriamente.
    3. Por cada un nuevo registro a nuestra tabla, se generará un número aleatorio en el campo recién creado.

    Notas

    El objetivo del tipo de datos Autonumeración es generar un valor número único que Access insertará automáticamente cuando se agrega un registro. Se suelen usar como clave principal, aunque podemos crearlos y no utilizarlos como clave principal o quitarla posteriormente.

    Referencias

    2015-04-20

    Muestra aleatoria de filas de un data frame en R

    Title

    Problema

    Deseamos extraer una muestra aleatoria de filas de un data frame en R.

    Solución

    Emplearemos los datos incluidos en el paquete hflights. Es un data frame de 227.496 filas y 21 columnas que contiene información sobre los vuelos que parten de los aeropuertos de Houston: IAH (George Bush Intercontinental) y HOU (Houston Hobby).

    require(hflights)
    head(hflights)
    
    • Paquete base
    set.seed(1)
    hflights[sample(nrow(hflights), 10), ] # 10 filas
    # Mostramos solamente 5 columnas:
    hflights[sample(nrow(hflights), 10), 1:5]
    
            Year Month DayofMonth DayOfWeek DepTime
    1366969 2011     3         14         1    1825
    1040415 2011     3         12         6    1745
    4202032 2011     9         18         7     915
    2209673 2011     5         16         1    1521
    4693709 2011    10         15         6    1350
    3107473 2011     7         23         6    1644
    4323034 2011     9         28         3    1739
    5987852 2011    12         17         6     800
    2206152 2011     5         18         3     736
    4699698 2011    10          6         4     748
    
    • dplyr
    hflights %>% 
      sample_n(10) %>% 
      select(1:5)
    
    • sqldf
    require(sqldf)
    sqldf("SELECT * FROM hflights ORDER BY RANDOM(*) LIMIT 10")
    
    La desventaja con sqldf es que no podemos generar números pseudoaletorios con set.seed para obtener los mismos resultados y que sean reproducibles pues la función RANDOM de SQLITE no lo permite.

    Entradas relacionadas

    2014-10-19

    Generar una distribución normal aleatoria en R

    Title En R, podemos generar un histograma de una distribución normal mediante la función rnorm.

    Muestras aleatorias de una distribución normal

    Para que los resultados sean reproducibles generamos números pseudoaleatorios con al función set.seed

    set.seed(123)
    normal <- rnorm(10000)
    head(data.frame(normal))
    
           normal
    1 -0.56047565
    2 -0.23017749
    3  1.55870831
    4  0.07050839
    5  0.12928774
    6  1.71506499
    
    Comprobamos que los resultados son muy parecidos a los que esperaríamos de una distribución normal estándar N(0, 1). Recordar que la notación de la distribución normal N(media, varianza), es distinta de la empleada por R: N(media, desviación típica).

    mean(normal) # Calculamos la media
    
    [1] -0.002371702
    
    # Calculamos la varianza ≃ 1
    sd(normal)^2 
    var(normal)
    
    [1] 0.9986366
    
    Si deseamos generar muestras aleatorias distintas de la distribución estándar, especificamos la media y la desviación típica.

    N(-2, 0.5)

    set.seed(123)
    normal <- rnorm(10000, -2, sqrt(.5))
    head(data.frame(normal))
    
    mean(normal)
    
    [1] -2.001677
    
    # Calculamos la varianza ≃ 0.5
    sd(normal)^2 
    var(normal)
    
    [1] 0.4986376
    

    Histograma de la distribución

    set.seed(123)
    hist(rnorm(10000), prob = TRUE, xlab = "x", 
         main = "Histograma", xlim = c(-3, 3), ylim = c(0, 0.4))
    
    Añadimos la curva de la función de densidad de probabilidad sobre el histograma:

    curve(dnorm(x), xlim = c(-3, 3), add = TRUE, las = 1, 
          col = "darkblue", lwd = 2) 
    

    Tabla de frecuencias

    Creamos la tabla de frecuencias de la muestra aleatoria generada.

    set.seed(123)
    rangos <- seq(-3, 3, 0.5)
    intervalos <- cut(rnorm(10000), breaks = rangos)
    tabla.frec  <- table(intervalos) 
    as.data.frame(tabla.frec)
    

       intervalos Freq
    1   (-3,-2.5]   46
    2   (-2.5,-2]  173
    3   (-2,-1.5]  438
    4   (-1.5,-1]  942
    5   (-1,-0.5] 1451
    6    (-0.5,0] 1978
    7     (0,0.5] 1899
    8     (0.5,1] 1484
    9     (1,1.5]  924
    10    (1.5,2]  431
    11    (2,2.5]  161
    12    (2.5,3]   45
    
    Algunos valores de los 10.000 generados están fuera de los intervalos fijados de -3 y 3: 28

    sum(tabla.frec)
    

     [1] 9972
    
    Referencias:

    2014-07-21

    Muestra aleatoria en Excel

    Title Tenemos una lista de datos de los que queremos extraer una muestra aleatoria de valores. Partimos de la misma idea de una entrada anterior. Creamos una columna auxiliar con números aleatorios y, basándonos en el orden de esa columna, extraeremos n valores de la misma. Si hay duplicados aparecerán también en la muestra.

    En la columna A tenemos la lista con los datos originales y en B la columna auxiliar con números aleatorios. En las columnas C y D la lista ordenada aleatoriamente, según la columna B, de dos maneras.

    Fórmulas

    'Columna C
    =INDICE($A$3:$A$10;COINCIDIR(K.ESIMO.MAYOR($B$3:$B$10;FILA(A1));$B$3:$B$10;))
    'Columna D
    =INDICE($A$3:$A$10;JERARQUIA(B3;$B$3:$B$10))
    
    La segunda función es más clara y sencilla. Presenta la desventaja de que JERARQUIA se ha reemplazado en Excel 2010 y puede que en el futuro no sea compatible con nuevas versiones de Excel.

    Usando nombres

    =INDICE(lista;COINCIDIR(K.ESIMO.MAYOR(aleatorios;FILA(A1));aleatorios;))
    =INDICE(lista;JERARQUIA(B3;aleatorios))
    
    Facilitan la lectura y el mantenimiento de la fórmula. Para los nombres lista y aleatorios sean dinámicos visita esta entrada.

    Entradas relacionadas

  • Consulta para generar una muestra aleatoria en Ms Access
  • Nube de datos