0. Los datos de la práctica

load(url('https://bit.ly/39ewYXx'))

1. Matrices en R, operaciones y submatrices

m1 = matrix(data=1:6, ncol=3) # montamos matriz de 3 columnas
m1 # observa cómo se han colocado
m2 = matrix(data=1:6, ncol=3, byrow=TRUE) # lo mismo pero por filas
m2 # observa cómo se han colocado
m3 = t(m2) # matriz transpuesta
m3
m1[1,1] # elemento fila 1, col 1
m1[1,] # toda la fila 1 (se convierte en vector)
m1[,1] # toda la col 1 (se convierte en vector)
m1
m1[1:2, c(1,3)] # un bloque (sigue siendo matriz)
m1
m2
m1 + m2 # suma de matrices
m1
m2
m1 * m2 # producto entrada a entrada (NO EL HABITUAL!!!)
m1
2^m1
2^m1 < 10
m1
m1
m2
m1 %*% m2 # no se pueden  multiplicar
m1 %*% m3 # sí se puede

EJERCICIO 1:

  1. Fabrica la matriz con “los cuadrados” de los números naturales del 1 al 50, de modo que cada 10 componentes consecutivas formen una fila.
    • Sol.:

      ##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
      ## [1,]    1    4    9   16   25   36   49   64   81   100
      ## [2,]  121  144  169  196  225  256  289  324  361   400
      ## [3,]  441  484  529  576  625  676  729  784  841   900
      ## [4,]  961 1024 1089 1156 1225 1296 1369 1444 1521  1600
      ## [5,] 1681 1764 1849 1936 2025 2116 2209 2304 2401  2500
  2. Suma los datos de la tercera fila
    • Sol.: 6585
  3. Suma los datos de la séptima columna
    • Sol.: 4645
  4. Suma los datos de la submatriz formada por las filas 1, 3 y 4, y las columnas 2, 4, 6 y 8.
    • Sol.: 7560

FIN DE EJERCICIO 1

2. Hojas de datos en R, funciones y subconjuntos

2.1. Hojas de datos

  • Es la estructura ideada para las muestras multivariantes: vectores de datos en columnas.
    • Cada columna representa una “variable estadística”, y tiene los datos de todos los individuos en dicha “variable estadística”
    • Cada fila representa un “individuo” u “observación”, y tiene los datos de dicho “individuo” en todas las “variables estadísticas”
  • Se pueden definir con la función data.frame(...), poniendo los vectores columna como argumentos.
  • Se suelen leer desde archivos con la función read.table(...).
  • Una vez definidas o leídas de archivos, todas las hojas de datos tienen:
    • Etiquetas de columna (o cabeceras)
    • Números o nombres de cada fila
  • Funciones interesantes que actuan sobre hojas de datos:
    • str(): estructura de la hoja de datos, indica cuántas observaciones en cuántas variables hay, la cabecera de cada columna, el tipo de datos que tiene y sus primeros valores.
    • dim(): devuelve vector de dimensiones (filas, columnas).
    • row.names(): devuelve vector de los nombres de las filas (si hay). Útil para identificar individuos.
    • names(): devuelve vector de las etiquetas de las columnas.
    • head(): primeras filas de la hoja de datos.
    • tail(): últimas filas de la hoja de datos.
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
# Un vistazo a los datos y su naturaleza
str(coches) 
# ¿Cuántos coches analizados? ¿cuántas variables?
dim(coches)
dim(coches)[1] # ¿cuántas filas? (coches)
dim(coches)[2] # ¿cuántas columnas? (variables)
length(coches) # CUIDADO!!! solo cuenta las columnas !!!
row.names(coches) # Nombres de las filas (coches)
names(coches) # Nombres de las columnas (variables)
head(coches) # visualiza primeras filas
tail(coches) # visualiza últimas filas

2.2. Acceso a los vectores columna de una hoja de datos

  • El operador $ permite acceder a los datos de una columna de la hoja de datos (NombreHoja$NombreColumna)
  • Podemos ahorrar escritura si “fijamos” la hoja de datos (attach)
  • Para que no haya confusiones con otras variables que se llamen igual, es conveniente “retirar” la hoja de datos al final de su uso (detach)
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
str(coches) # cómo es la hoja de datos
head(coches) # vemos primeras filas
efi # da error pq no es una variable de R, solo "etiqueta" dentro de "coche"
coches$efi # vector con los datos de columna "efi"
attach(coches) # fijamos la hoja para poder usar nombres de columnas
efi # ya no da error
detach(coches) # retiramos la hoja
efi # vuelve a dar error
  • A partir de ahora usaremos attach() y detach() con todas las hojas de datos para hacer la programación más cómoda y no tener problemas.
  • Los vectores columna de la hoja de datos se comportan como vectores normales, y se pueden manipular como en la Practica 1.

2.3. Selección de parte de una hoja de datos

  • En ocasiones interesa analizar sólo parte de los datos de una muestra:
    • Ciertas variables (columnas), y no otras.
    • Cierto grupo de individuos (filas), no todos.
  • Para ello se usan los operadores:
    • $: con la sintaxis hoja$etiqueta, devuelve sólo el vector columna etiquetada con etiqueta (ver ejemplos). Como es un vector, se puede indexar con el operador [] como se explica en la Practica 1.
      • Si has usado attach() con la hoja de datos, ya puedes usar directamente el nombre de la columna, sin usar el nombre de la hoja ni el dólar $.
      • Ejemplo: copia y pega el siguiente bloque en la consola de R:
      # Toda la hoja de datos
      coches
      # fijamos para poder usar los nombres de columna
      attach(coches)
      # Datos de columna eficiencia (efi)
      efi # es un vector
      # Datos de columna embrague (embrag)
      embrag # es un vector
      # Datos de eficiencia para los 10 primeros coches
      efi[1:10]
      # Datos de eficiencia para coches de embrague automático
      efi[embrag=='Autom']
      # Datos de eficiencia para coches de embrague automático
      # y 8 cilindros
      efi[embrag=='Autom' & ncil==8]
      # Nombres de los coches (filas) de transmisión automática
      row.names(coches)[ embrag=='Autom' ]
      # ¿Cuántos coches de embrague "manual" hay en la muestra?
      length( embrag[ embrag=="Manual" ] )
      # ¿Cuántos coches de embrague "manual" y de 4 cilindros hay?
      length( embrag[ embrag=="Manual" & ncil==4 ] )
      # Máxima "eficiencia" de TODOS los coches de la muestra
      max(efi)
      # Máxima "eficiencia" entre los coches "automáticos" de la muestra
      max(efi[embrag=="Autom"])
      # Nombre del coche de máxima eficiencia de la muestra
      row.names(coches)[ efi == max(efi) ]
      # Nombre del coche "automático" de máxima eficiencia de la muestra
      row.names(coches)[ (efi == max(efi[embrag=="Autom"])) & embrag=="Autom" ]
    • []: con un argumento, selecciona SOLO COLUNMAS (por posición o etiqueta, o vector de posiciones o de etiquetas). Esto NO lo usaremos
    • [,]: con dos argumentos, selecciona FILAS Y COLUMNAS.
      • Antes de la coma se seleccionan las filas:
        • indicando las posiciones (p.ej. Hoja[ c(1:5, 7,11), ]),
        • o indicando nombres de las filas (p.ej. Hoja[ c("Id1", "Id2", "Id5"), ], caso que fueran esos los nombre de algunas filas),
        • o indicando una condición que verifican sólo los individuos a seleccionar (normalmente una condición que involucra las otras columnas de la hoja de datos, ver ejemplos).
      • Después de la coma se seleccionan las columnas:
        • indicando número de posición (p.ej. Hoja[ , c(1,3:10) ]),
        • o indicando etiqueta (p.ej. Hoja[ , c("Var3", "Var5")]).
      • Ejemplo: copia y pega el siguiente bloque en la consola de R:
      # Visualiza la submuestra de coches automáticos (todas las variables)
      coches[ embrag=='Autom', ]
      # Visualiza la submuestra de las variables 'efi', 'ncil' y 'pot' (todos los coches)
      coches[ ,c('efi','ncil','pot') ]
      # Visualiza la submuestra de coches automáticos en las variables 'efi', 'ncil' y 'pot'
      coches[ embrag=='Autom' , c('efi','ncil','pot') ]

EJERCICIO 2: Sobre los datos de los coches (hoja de datos coches):

  1. ¿Cuántos coches son automáticos? ¿cuántos coches son de 6 cilindros? ¿cuántos coches son automáticos y de 6 cilindros?
    • Sol: 19, 7 y 4, respectivamente.
  2. ¿Cuál es el peso máximo de la muestra? ¿Es de un coche manual o automático?
    • Sol: El peso máximo es 5.424 miles de libras y se trata de un coche Autom.
  3. ¿Qué coche es el que recorre el cuarto de milla en menos tiempo?
    • Sol: Ford Pantera L.
  4. ¿Cuál es la cilindrada del coche con más potencia de la muestra? (ojo, columna cil)
    • Sol: 301 pulgadas cúbicas.

FIN DE EJERCICIO 2

3. Estadística descriptiva multivariante en R

3.1. Resúmenes (marginales) de cada variable

  • summary(): aplicado a una hoja de datos, resume todas las columnas separadamente: las cualitativas por frecuencias, y las cuantitativas por estadísticos.
  • Cualquier otra estadística marginal de una variable se debe pide sobre el vector columna deseado (ver práctica 1).
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
# Resumen de todas las variables a una
summary(coches)
# Tabla de frecuencias del tipo de embrague
table(embrag)
# Potencia media de todos los coches (columna 'pot') 
mean(pot) 
# Potencia media de los coches automáticos
mean( pot[ embrag=='Autom' ] )
# Histograma de pesos de coches de 4 cilindros
# con 5 intervalos
hist(peso[ncil==4], breaks=1:6)
# Resumen de datos del titanic
summary(titanic1012)
# Resumen de datos de flores
summary(iris)

EJERCICIO 3: Sobre los datos de los coches (hoja de datos coches):

  1. Calcula el peso medio y la cuasidesviación típica de todos los coches de 8 cilindros.
    • Sol: 3.9992143 y 0.7594047 miles de libras, respectivamente.
  2. Dibuja un diagrama de puntos de los tiempos en recorrer el cuarto de milla de todos los coches (columna tiempo).
    • Sol:

FIN DE EJERCICIO 3

3.2. Tablas de frecuencias (conjuntas)

  • Útil sólo para 2 ó 3 variables.
  • table(...)
  • Argumentos:
    • Dos o tres vectores “emparejados”, o bien
    • Una hoja de datos con sólo 2 ó 3 columnas
  • Recuerda “cortar en intervalos” las variables numéricas cuyos datos no se repiten demasiado (práctica 1, función cut(x, breaks)).
  • Devuelve la tabla de frecuencias absolutas en forma de matriz
  • Para hacer frecuencias RELATIVAS hay que DIVIDIR por el tamaño de la muestra.
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
# Tabla de frecuencias conjuntas 
# del tipo de embrague y el número de marchas
table(coches[, c('embrag', 'marchas')])
table(embrag, marchas)
# Tabla de frecuencias conjuntas relativas 
# del tipo de embrague y el número de marchas
table(coches[c('embrag', 'marchas')])/dim(coches)[1]
# Tabla de frecuencias conjuntas 
# de la potencia y el número de marchas
# con 3 intervalos para la potencia
table(cut(pot, breaks=c(50, 150, 250, 350)), marchas)

3.3. Estadísticos bivariantes (variables numéricas!)

  • Covarianza (entre pares de variables numéricas)
    • cov(x, y), donde x e y son dos vectores numéricos.
      • Devuelve la covarianza (un valor).
    • cov(x), donde x es una hoja de datos con columnas numéricas.
      • Devuelve la matriz de varianzas y covarianzas (varianzas en la diagonal y covarianzas fuera de ella)
  • Coeficiente de correlación lineal de Pearson (entre pares de variables numéricas)
    • cor(x, y), donde x e y son dos vectores numéricos.
      • Devuelve el coeficiente de correlación lineal (un valor).
    • cor(x), donde x es una hoja de datos con columnas numéricas.
      • Devuelve la matriz de correlaciones
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
# covarianza entre eficiencia y potencia
cov(efi, pot)
# matriz de varianzas-covarianzas de esas dos variables
cov(coches[ , c('efi', 'pot')])

cov(coches) # da error pq hay columnas no numéricas

# correlación entre eficiencia y potencia
cor(efi, pot)
# matriz de correlaciones de esas dos variables
cor(coches[ , c('efi', 'pot')])
# Matriz de correlaciones entre pares de variables
# para coches de 4 cilindros
cor(coches[ ncil==4, c('efi', 'cil', 'pot', 'tiempo')])

EJERCICIO 4: Para los datos de los coches (variable coche):

  1. Calcula el coeficiente de correlación entre las variables peso y efi para todos los coches, y para los coches separados por tipo de embrague.
    • Sol.: -0.8676594 para todos los coches, -0.7676554 para los automáticos y -0.9089148 para los manuales.
  2. Escribe la matriz de varianzas y covarianzas entre las variables efi, peso y tiempo.
    • Sol.:

      ##              efi       peso     tiempo
      ## efi    36.324103 -5.1166847  4.5091492
      ## peso   -5.116685  0.9573790 -0.3054816
      ## tiempo  4.509149 -0.3054816  3.1931661

FIN EJERCICIO 4

3.4. Gráficos bivariantes

  • Se supone los datos en una hoja de datos o en vectores emparejados.
  • FUNCIÓN plot()
  • Es una función polivalente que realiza un gráfico distinto según sea la clase del argumento.
    • CUALITATIVA vs CUALITATIVA: mosaico (frecuencias marginales y condicionadas).
    • CUALITATIVA vs CUANTITATIVA: boxplots comparativos verticales en paralelo.
    • CUANTITATIVA vs CUALITATIVA: diagramas de puntos comparativos horizontales en paralelo.
    • CUANTITATIVA vs CUANTITATIVA: nube de puntos.
  • Utilización: pueden ser dos casos,
    • plot(x) con x hoja de datos (con las dos columnas).
    • plot(x, y) con xe y los vectores de datos emparejados.
  • Eje X: primera columna de hoja de datos (o primer vector)
  • Eje Y: segunda columna de hoja de datos (o segundo vector)
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
# Todos los gráficos bivariantes cruzados
plot(coches)
# Eficiencia en función del peso
plot(coches[, c('peso', 'efi')])
plot(peso, efi)
# Eficiencia en función del peso, 
# solo con coches automáticos
plot(coches[embrag=='Autom', c('peso', 'efi')])
plot(peso[embrag=='Autom'], efi[embrag=='Autom'])
# Potencia en función del tipo de embrague,
plot(coches[, c('embrag', 'pot')])
plot(embrag, pot)
# Si se ponen al reves no salen las cajas !!!
plot(coches[, c('pot', 'embrag')]) # mejor NO
plot(pot, embrag) # mejor NO

Para ver la gráfica que relaciona dos variables cualitativas, hacer el siguiente ejercicio.

EJERCICIO 4: La variable titanic1012 recoge ciertos rasgos de cada pasajero del barco, así como si sobrevivió al accidente o no. Recuerda usar attach() para usar los nombres de columnas como variables.

  1. Visualiza las primeras filas de los datos para conocer los nombres de las columnas y de las filas (Ayuda: head()).

    • Sol.:

      ##   Class    Sex   Age Survived
      ## 1   3rd   Male Adult       No
      ## 2   3rd   Male Child       No
      ## 3   3rd Female Child      Yes
      ## 4   2nd Female Adult      Yes
      ## 5  Crew   Male Adult       No
      ## 6   3rd Female Adult       No
  2. Muestra un resumen de las columnas (ayuda: summary())

    • Sol.:

      ##   Class         Sex          Age       Survived  
      ##  1st :325   Male  :1731   Child: 109   No :1490  
      ##  2nd :285   Female: 470   Adult:2092   Yes: 711  
      ##  3rd :706                                        
      ##  Crew:885
  3. Representa gráficamente la distribución de la supervivencia (columna Survived) en un diagrama de sectores (ver Practica 1).

  4. Representa gráficamente la relación entre la clase de cada pasajero (eje X) y la supervivencia al accidente (eje Y).

  5. Representa gráficamente la relación entre la clase de cada pasajero (eje X) y la supervivencia al accidente (eje Y), pero usando SOLO los datos de los hombres.

  6. Representa gráficamente la relación entre la clase de cada pasajero (eje X) y la supervivencia al accidente (eje Y), pero usando SOLO los datos de las mujeres.

    • Sol.:

FIN EJERCICIO 4

3.5. Ejercicios preparatorios extra

EJERCICIO 6: Analizamos los datos de las flores (variable iris). Recuerda usar attach() para usar los nombres de columnas como variables.

  1. Visualiza un resumen de todas las variables.

    ##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
    ##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
    ##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
    ##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
    ##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
    ##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
    ##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
    ##        Species  
    ##  setosa    :50  
    ##  versicolor:50  
    ##  virginica :50  
    ##                 
    ##                 
    ## 
  2. Escribe la matriz de varianzas y covarianzas de las columnas 1 a 3.

    ##              Sepal.Length Sepal.Width Petal.Length
    ## Sepal.Length    0.6856935  -0.0424340    1.2743154
    ## Sepal.Width    -0.0424340   0.1899794   -0.3296564
    ## Petal.Length    1.2743154  -0.3296564    3.1162779
  3. Calcula el coeficiente de correlación entre la longitud y anchura de pétalos para cada especie de flores.

    • Sol.: 0.33163 para “setosa”, 0.7866681 para “versicolor”, y 0.3221082 para “virginica”,
  4. Representa la longitud de pétalo (eje Y) en función de la especie de la flor (eje X).

  5. Representa la relación entre longitud (eje X) y anchura (eje Y) de pétalos para las flores es especie “setosa”.

  6. Calcula la media y cuasidesviación típica de la longitud de sépalo para cada especie de flor.

    • Sol.: Para “setosa”, media 5.006 y cuasidesviación típica 0.3524897. Para “versicolor”, media 5.936 y cuasidesviación típica 0.5161711. Para “virginica”, media 6.588 y cuasidesviación típica 0.6358796.

FIN EJERCICIO 6