0. Los datos de la práctica

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

1. Matrices en R, operaciones y submatrices

m1 = matrix(data=1:30, ncol=6) # montamos matriz de 3 columnas
m1 # observa cómo se han colocado
m2 = matrix(data=1:30, ncol=6, 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[c(1,3,5), c(1,2,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
m1^2
m1^2 < 100
m1
m1
m2
m1 %*% m2 # producto matricial: dimensiones no compatibles
m1 %*% m3 # producto matricial: 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 “acortar” la escritura si “fijamos” la hoja de datos (attach) al entorno de programación.
    • Las columnas serán accesibles como vectores usando “solo” el nombre de columna.
    • Pero ¡ojo! Si antes hay alguna variable definida que tiene el mismo nombre que una columna, entonces esa columna no será accesible “solo” con su nombre.
  • 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 Práctica 1.
  • 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" ] )
table(embrag) # aprovechar la tabla de frecuencias
# ¿Cuántos coches de embrague "manual" y de 4 cilindros hay?
length( embrag[ embrag=="Manual" & ncil==4 ] )
table(embrag, ncil) # esto lo veremos después
# 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" ]

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

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 sección anterior).
    • []: con un argumento, selecciona SOLO COLUMNAS (por posición o etiqueta, o vector de posiciones o de etiquetas). Esto NO lo usaremos porque podemos confundirlo con los vectores.
    • [ , ]: 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:
      # Coches automáticos, todas las columnas
      coches[ embrag=='Autom', ]
      # Todos los coches, columnas 'efi', 'ncil' y 'pot'
      coches[ ,c('efi','ncil','pot') ]
      # Coches automáticos, columnas 'efi', 'ncil' y 'pot'
      coches[ embrag=='Autom' , c('efi','ncil','pot') ]
      • Y si resulta muy complicada la sintaxis anterior, hay una función algo más “amable”. subset(x, subset, select), donde x es la hoja de datos, subset son lógicos (la comparación que permite sleccionar filas) y select es el vector de las columnas a seleccionar (por etiqueta o posición).
      • Compara el bloque anterior de ejemplo con el siguiente:
      # Coches automáticos, todas las columnas
      subset(x=coches, subset=(embrag=='Autom')) # no ponemos nada en "select"
      # Todos los coches, columnas 'efi', 'ncil' y 'pot'
      subset(x=coches, select=c('efi','ncil','pot')) # no ponemos nada en "subset"
      # Coches automáticos, columnas 'efi', 'ncil' y 'pot'
      subset(x=coches, subset=(embrag=='Autom'), select=c('efi','ncil','pot'))

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 hace sobre el vector columna deseado (ver Sección 2.2 para acceder al vector columna, y Práctica 1 para las funciones estadísticas).
  • 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 la media y cuasidesviación típica de los pesos 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: si alguna variable es numérica sin grandes repeticiones, “córtala en intervalos” (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 (absolutas) 
# del tipo de embrague y el número de marchas
# usando vectores
table(embrag, marchas)
# usando hoja
table(coches[ , c('embrag', 'marchas')])
# Tabla de frecuencias conjuntas RELATIVAS 
# del tipo de embrague y el número de marchas
# usando vectores
table(embrag, marchas)/dim(coches)[1]
# usando hoja
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
# solo se puede hacer con vectores
table(cut(pot, breaks=c(50, 150, 250, 350)), marchas)

3.3. Estadísticos bivariantes (¡sólo 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 (todas las varianzas en la diagonal, y las covarianzas de todas las parejas de variables 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 (1 en la diagonal, y las correlaciones de todas las parejas de variables fuera de ella)
  • Ejemplo: copia y pega el siguiente bloque en la consola de R:
cov(coches) # da error pq hay columnas no numéricas
# covarianza entre eficiencia y potencia
# usando los vectores
cov(efi, pot)
# usando la hoja de datos (matriz de var-covar)
cov(coches[ , c('efi', 'pot')])
# covarianza entre eficiencia y potencia en coches de 4 cilindros
# usando los vectores
cov(efi[ncil==4], pot[ncil==4])
# usando la hoja de datos (matriz de var-covar)
cov(coches[ ncil==4, c('efi', 'pot')])
# correlación entre eficiencia y potencia
cor(efi, pot)
# matriz de correlaciones de esas dos variables
# usando la hoja de datos (matriz de correlaciones)
cor(coches[ , c('efi', 'pot')])

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 (de los) argumento(s).
    • CUALITATIVA vs CUALITATIVA: mosaico (frecuencias marginales de la primera variable, y condicionadas de la segunda variable), el mejor gráfico para este tipo de datos.
    • CUALITATIVA vs CUANTITATIVA:
      • Si la cualitativa va primero: boxplots comparativos verticales en paralelo (el mejor para este caso).
      • Si la cualitativa va segunda: diagramas de puntos comparativos horizontales en paralelo (¡no es bueno, mejor cambiar el orden de los argumentos para hacer cajas!).
    • CUANTITATIVA vs CUANTITATIVA: nube de puntos (el mejor para este caso).
  • Utilización: pueden ser dos casos,
    • plot(x) con x hoja de datos con las dos columnas. Si se ponen más columnas, se hacen múltiples gráficas para todas las parejas de variables.
    • 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
# usando sub-hoja de datos
plot(coches[ , c('peso', 'efi')])
# usando vectores columna
plot(peso, efi)
# Eficiencia en función del peso, 
# solo con coches automáticos
# usando sub-hoja de datos
plot(coches[embrag=='Autom', c('peso', 'efi')])
# usando vectores columna (hay que repetir el filtrado)
plot(peso[embrag=='Autom'], efi[embrag=='Autom'])
# Potencia en función del tipo de embrague,
# usando sub-hoja de datos
plot(coches[ , c('embrag', 'pot')])
# usando vectores columna
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 5: 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 Práctica 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 5

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 4.

    ##              Sepal.Length Sepal.Width Petal.Length Petal.Width
    ## Sepal.Length    0.6856935  -0.0424340    1.2743154   0.5162707
    ## Sepal.Width    -0.0424340   0.1899794   -0.3296564  -0.1216394
    ## Petal.Length    1.2743154  -0.3296564    3.1162779   1.2956094
    ## Petal.Width     0.5162707  -0.1216394    1.2956094   0.5810063
  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