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

2016-04-03

Cómo crear un histograma a partir de múltiples columnas en R

Title

Problema

Tenemos un data frame con múltiples columnas —en nuestro ejemplo 49— y deseamos utilizar todas las columnas como una única variable. También calcularemos la media de todas las columnas.

df <- read.table(textConnection("1.52 0.39 1.30 1.10 0.82 0.59 1.11 0.44 0.70 0.57 0.65 1.06 0.55 0.34 1.09 0.46 0.43 0.99 0.41 1.04 1.25 0.75 0.54 0.62 0.56 0.58 0.85 0.38 0.66 0.83 1.00 0.56 0.66 0.40 1.44 1.28 0.58 1.05 0.64 0.54 0.52 1.28 0.51 0.64 0.82 0.45 0.83 0.58 0.51"), header = FALSE)
    V1   V2  V3  V4   V5   V6   V7   V8  V9  V10  V11  V12  V13  V14  V15  V16  V17  V18  V19  V20  V21  V22  V23  V24  V25  V26  V27  V28
1 1.52 0.39 1.3 1.1 0.82 0.59 1.11 0.44 0.7 0.57 0.65 1.06 0.55 0.34 1.09 0.46 0.43 0.99 0.41 1.04 1.25 0.75 0.54 0.62 0.56 0.58 0.85 0.38
   V29  V30 V31  V32  V33 V34  V35  V36  V37  V38  V39  V40  V41  V42  V43  V44  V45  V46  V47  V48  V49
1 0.66 0.83   1 0.56 0.66 0.4 1.44 1.28 0.58 1.05 0.64 0.54 0.52 1.28 0.51 0.64 0.82 0.45 0.83 0.58 0.51

Solución

  • Histograma
  • Simplemente transponemos el data frame antes de crear el histograma.

    hist(t(df))
    

  • Calculamos la media
  • Tenemos dos alternativas: mean o rowMeans.

    mean(t(df)) # or 
    rowMeans(df)
    

    [1] 0.752449 
    

    Entradas relacionadas

    Referencias

    2015-01-22

    Medidas de tendencia central en histogramas en R: moda

    Title En esta entrada añadiremos a los histogramas otra medida de tendencia central: la moda. Completamos así una entrada anterior en la que añadimos la media y la mediana.

    Asimétrica negativa o a la izquierda

    media < mediana < moda

      rbeta(n, 5, 2)

    Simétrica

    media = mediana = moda

      rbeta(n, 5, 5)

    Asimétrica positiva o a la derecha

    media > mediana > moda

      rbeta(n, 2, 5)
      parámetro x de legend = "topright"

    Código

    Instalamos y cargamos el paquete modeest, para calcular la moda de las distribuciones con las funciones betaMode y normMode.

    install.packages("modeest")
    library(modeest)
    
    Empleamos la función de densidad de beta:

    dbeta(x, shape1, shape2, ncp = 0, log = FALSE)

    Modificaremos los parámetros de la distribución beta a (shape1) y b (shape2) para alterar la forma de la distribución y que sea asimétrica negativa, simétrica o asimétrica positiva.

    Asimétrica negativa: shape1 = 5, shape2 =2
    Simétrica: shape1 = 5, shape2 =5
    Asimétrica positiva: shape1 = 2, shape2 =5

    # Ejemplo: asimétrica negativa
    set.seed(2014)
    vble  <- rbeta(1000000, 5, 2) # Parametros a modificar
    
    # Histograma
    hist(vble, 
         prob = TRUE,
         xlim = c(0, 1),
         col = "slategray2",
         border = "white",
         main = "Asimetría negativa", 
         xlab = "", 
         las = 1) 
    
    # Función de densidad
    lines(density(vble), # density plot
          lwd = 2, # thickness of line
          col = "darkblue")
    
    # Líneas
      # Media
    mean  <- mean(vble)
    segments(x0 = mean, y0 = 0, 
             x1 = mean, y1 = dbeta(mean, 5, 2), # Parametros a modificar
             col = "blue", lwd = 2) # lty = 3 dotted line
      # Mediana
    median <-  median(vble)
    segments(x0 = median, y0 = 0, 
             x1 = median, y1 = dbeta(median, 5, 2), # Parametros a modificar
             col = "red", lwd = 2)
      # Moda
    mode <- betaMode(5, 2)
    segments(x0 = mode, y0 = 0, x1 = mode, 
             y1 = dbeta(mode, 5, 2), 
             col = "orange", lwd = 2)
    
    # Leyenda
    legend(x = "topleft", # Ubicación de la leyenda
           c("Función de densidad", "Media", "Mediana"),
           col = c("darkblue", "blue", "red"),
           lwd = c(2, 2, 2),
           bty = "n")
    

    Alternativa

    Podemos añadir las líneas de la media y mediana mediante la función abline. La diferencia respecto al ejemplo anterior con segments es que la línea cortará a la función de densidad pues es infinita.

    set.seed(2014)
    vble  <- rnorm(n = 1000000) 
    hist(vble, 
         prob = TRUE,
         xlim = c(-3,3), 
         ylim = c(0, .4),
         col = "slategray2",
         border = "white",
         main = "Simétrica", 
         xlab = "", 
         las = 1) 
    
    # Función de densidad
    lines(density(vble), # density plot
          lwd = 2, # thickness of line
          col = "darkblue")
    # Media
    abline(v = mean(vble),
           col = "blue",
           lwd = 2)
    # Mediana
    abline(v = median(vble),
           col = "red",
           lwd = 2)
    # Mode
    abline(v = normMode(),
           col = "orange",
           lwd = 2)
    

    Entradas relacionadas

  • Calcular la moda en R usando el paquete modeest
  • Medidas de tendencia central en histogramas en R: media y mediana
  • Generar una distribución normal aleatoria en R
  • Operaciones básicas con la distribución normal en R
  • 2015-01-07

    Medidas de tendencia central en histogramas en R: media y mediana

    Title En esta entrada añadiremos a los histogramas dos medidas de tendencia central: la media y la mediana. Construiremos 3 distribuciones usando la distribución beta: asimétrica negativa, simétrica y asimétrica positiva:

    Asimétrica negativa o a la izquierda

    media < mediana

      rbeta(n, 5, 2)

    Simétrica

    media = mediana

      rbeta(n, 5, 5)

    Asimétrica positiva o a la derecha

    media > mediana

      rbeta(n, 2, 5)
      parámetro x de legend = "topright"

    Código

    Empleamos la función de densidad de beta:

    dbeta(x, shape1, shape2, ncp = 0, log = FALSE)

    Modificaremos los parámetros de la distribución beta a (shape1) y b (shape2) para alterar la forma de la distribución y que sea asimétrica negativa, simétrica o asimétrica positiva.

    Asimétrica negativa: shape1 = 5, shape2 =2
    Simétrica: shape1 = 5, shape2 =5
    Asimétrica positiva: shape1 = 2, shape2 =5

    # Ejemplo: asimétrica negativa
    set.seed(2014)
    vble  <- rbeta(1000000, 5, 2) # Parametros a modificar
    
    # Histograma
    hist(vble, 
         prob = TRUE,
         xlim = c(0, 1),
         col = "slategray2",
         border = "white",
         main = "Asimetría negativa", 
         xlab = "", 
         las = 1) 
    
    # Función de densidad
    lines(density(vble), # density plot
          lwd = 2, # thickness of line
          col = "darkblue")
    
    # Líneas
      # Media
    mean  <- mean(vble)
    segments(x0 = mean, y0 = 0, 
             x1 = mean, y1 = dbeta(mean, 5, 2), # Parametros a modificar
             col = "blue", lwd = 2) # lty = 3 dotted line
      # Mediana
    median <-  median(vble)
    segments(x0 = median, y0 = 0, 
             x1 = median, y1 = dbeta(median, 5, 2), # Parametros a modificar
             col = "red", lwd = 2)
    
    # Leyenda
    legend(x = "topleft", # Ubicación de la leyenda
           c("Función de densidad", "Media", "Mediana"),
           col = c("darkblue", "blue", "red"),
           lwd = c(2, 2, 2),
           bty = "n")
    

    Alternativa

    Podemos añadir las líneas de la media y mediana mediante la función abline. La diferencias respecto al ejemplo anterior con segments es que la línea cortará a la función de densidad pues es infinita.

    set.seed(2014)
    vble  <- rnorm(n = 1000000) 
    hist(vble, 
         prob = TRUE,
         xlim = c(-3,3), 
         ylim = c(0, .4),
         col = "slategray2",
         border = "white",
         main = "Simétrica", 
         xlab = "", 
         las = 1) 
    
    # Función de densidad
    lines(density(vble), # density plot
          lwd = 2, # thickness of line
          col = "darkblue")
    # Media
    abline(v = mean(vble),
           col = "blue",
           lwd = 2)
    # Mediana
    abline(v = median(vble),
           col = "red",
           lwd = 2)
    

    Entradas relacionadas

  • Generar una distribución normal aleatoria en R
  • Operaciones básicas con la distribución normal en R
  • 2014-10-23

    Operaciones básicas con la distribución normal en R

    Title En esta entrada emplearemos diferentes funciones en R para el cálculo de valores asociados con la distribución normal. Los valores por defecto son los de la distribución normal estándar, una media de 0 y una desviación típica de 1: N(0, 1).

    Los prefijos antepuestos a las funciones de distribución de probabilidad, en nuestra entrada de la normal (norm), son:

    d - density, densidad
    p - probability, probabilidad
    q - quantile, cuantil
    r - random, aleatorio

    dnorm

    Devuelve la altura de la función de densidad en un punto. La marcamos con una línea vertical punteada

    # Altura en el punto x = 0
    v <- 0
    curve(dnorm(x), xlim = c(-3, 3), las = 1, 
          main = bquote("dnorm:" ~ .(round(dnorm(v), 4))))
    segments(x0 = v, y0 = 0, x1 = v, y = dnorm(v), lty = 3)
    

    pnorm

    Dado un número o una lista, devuelve la probabilidad acumulada a la izquierda de los valores suministrados. Veamos varios ejemplos.

      P(X<=-0.24)
    pnorm(-0.24)
    
    [1] 0.4051651
    
    Al ser simétrica podemos calcular la probabilidad de Pr(X>0.24)

    # Probabilidad acumulada partiendo de la derecha
    pnorm(0.24, lower.tail = FALSE)
    # Restamos a la probabilidad total la acumulada a la izquierda 
    1 - pnorm(0.24)
    
      P(X>=-1)
    # P(X>=-1)
    1 - pnorm(-1)
    pnorm(-1, lower.tail = FALSE)
    pnorm(1)
    
    [1] 0.8413447
    
    pnorm(2.89) - pnorm(0.3)
    1-pnorm(0.3) - pnorm(-2.89)
    pnorm(0.3, lower.tail = FALSE) - pnorm(2.89, lower.tail = FALSE)
    
    [1] 0.913085
    
      P(-1< X <1)
    1-pnorm(-1)-pnorm(-1)
    1-pnorm(-1) - pnorm(1, lower.tail = FALSE)
    pnorm(-1, lower.tail = FALSE) - pnorm(1, lower.tail = FALSE)
    
    [1] 0.6826895
    

    qnorm

    Es la función inversa de pnorm. Dada una probabilidad devuelve el número que deja a la izquierda la probabilidad acumulada suministrada. Calculamos la inversa de los ejemplos anteriores.

      Ejemplo 1: valor central

    qnorm(0.5)
    
    [1] 0.5
    
      Ejemplo 2: cola de la izquierda

    qnorm(0.4051651)
    
    [1] -0.2400001
    
      Ejemplo 3: cola de la derecha

    qnorm(0.8413447, lower.tail = FALSE)
    
    [1] -1
    
      Ejemplo 4: intervalo

    qnorm((1-0.6826895)/2) # Izquierda
    qnorm((1 - 0.6826895)/2, lower.tail = FALSE) # Derecha
    
    [1] -1
    [1] 1
    

    rnorm

    Genera números aleatorios de la distribución normal. Lo empleamos al comienzo de la entrada para dibujar la distribución normal.

    A continuación creamos un histograma al que añadimos la curva de la distribución normal. Empleamos la función set.seed para que generar números pseudoaleatorios y que los resultados sean los mismos si le asignamos el mismo número.

    set.seed(123) 
    hist(rnorm(10000), prob = TRUE, xlab = "x", main = "Histograma", 
         xlim = c(-3, 3), ylim = c(0, 0.4), las = 1)
    curve(dnorm(x), xlim = c(-3, 3), add = TRUE, las = 1, 
          col = "darkblue", lwd = 2)
    
    Creamos la tabla de frecuencias del histograma anterior:

    set.seed(123)
    rangos <- seq(-3, 3, 0.5)
    intervalos <- cut(rnorm(10000), breaks = rangos) 
    tabla.frec  <- table(intervalos)   # Crea la tabla de frecuencias
    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
    

    Entradas relacionadas

    2014-03-05

    Distribución de frecuencias en R

    Title

    En dos entradas anteriores vimos como crear histogramas y tablas de frecuencias en Excel y Access. En esta entrada haremos lo mismo en R usando los mismos datos.

    Manipulación de los datos

    datos <- read.csv("datos.txt", sep = ";")  # Fichero en el directorio
    hist(datos$año)  # Intentamos crear histograma
    
    ## Error in hist.default(datos$año) : 'x' must be numeric
    
    names(datos)  # Genera error por la ñ en Año
    
    ## [1] "Id" "Nombre" "Año"
    
    colnames(datos) <- c("id", "nombre", "fecha")  # Renombramos las columnas
    names(datos)
    
    ## [1] "id" "nombre" "fecha"
    

    Tabla de frecuencias

    intervalos <- seq(from = 1913, to = 2013, by = 10) 
    frecuencias <- cut(datos$fecha, # Usamos la nueva columna: fechas
                     breaks = intervalos,   
                     dig.lab = 4,   # Nº de dígitos de los intervalos
                     right = FALSE) # Intervalos [a, b). Por defecto: (a, b]
    tabla.frec  <- table(frecuencias)   # Crea la tabla de frecuencias
    as.data.frame(tabla.frec) # O cbind(tabla.frec) mejoramos el formato
    
    ##    frecuencias Freq
    ## 1  [1913,1923)   16
    ## 2  [1923,1933)    8
    ## 3  [1933,1943)   18
    ## 4  [1943,1953)    3
    ## 5  [1953,1963)    7
    ## 6  [1963,1973)   11
    ## 7  [1973,1983)    6
    ## 8  [1983,1993)    9
    ## 9  [1993,2003)   14
    ## 10 [2003,2013)    8
    

    Histograma

    # Creamos histograma por defecto
    hist(datos$fecha) 
    

    plot of chunk unnamed-chunk-1

    Queremos el formato aproximado al gráfico que creamos en esta entrada.

    #Formateamos el histograma
    intervalos <- seq(from = 1913, to = 2013, by = 10) 
    h <- hist(datos$fecha, 
              breaks = intervalos,  # Añadimos los intervalos
              freq = TRUE, # Representa frecuencias
              right = FALSE, # Intervalos [a, b). Por defecto: (a, b]
              col = rgb(79, 129, 189, max = 255), # Color de las columnas
              border = "white",     # Color del borde
              labels = TRUE,        # Etiquetas de las columnas
              main = "Frecuencias", # Título del gráfico
              xaxt = "n",           # Eliminamos eje x
              yaxt = "n",           # Eliminamos eje y
              xlab = "Años",        # Título del eje x
              ylab = NULL,          # Título del eje y
              ylim = c(0, 20))      # Escala de y (fijamos max en 20)
    axis(side = 1, at = intervalos)  # Etiquetas del eje x 
    

    Entradas relacionadas

    Nube de datos