FUENTE: Toda la información usada en este tutorial corresponde al equipo 00RTeam de la Universidad de Murcia y está disponible en http://gauss.inf.um.es/



Sistema gráfico Base en R

En R exiten diferentes formas de crear gráficos: son los denominados Sistemas Gráficos. Los Sistemas Gráficos más conocidos son base, ggplot2, y lattice.

En este tutorial se usa el Sistema gráfico Base para crear un gráfico de dispersión (también llamado nube de puntos), al que se le añadirá la recta de regresión.


Con el Sistema gráfico Base los gráficos se construyen paso a paso, donde cada aspecto del gráfico se trata separadamente mediante una serie de funciones.

Hay dos tipos de funciones gráficas en este sistema:

  • Funciones de alto nivel: anzan un device gráfico y producen gráficos completos. Son ejemplos plot( ), hist( ), boxplot(), curve(), barplot().

  • Funciones de bajo nivel: añaden elementos a un gráfico existente. Por ejemplo points( ), text( ), legend().



Nuestros datos

Vamos a trabajar con la base de datos tiendas.csv Está disponible en la dirección http://gauss.inf.um.es/datos/.

Importar la base de datos

La función read.table se usa para importar datos a R. El código o code chunks se comenta a continuación:

  1. Se descarga el fichero de datos tiendas.csv situado en http://gauss.inf.um.es/datos/. Para ello hay que indicar en el argumento file = el sitio dónde están los datos

    • file = "directorio o dirección que apunte al archivo de los datos" R permite acceder directamente a una base de datos externa (que esté en la web por ejemplo, y no en tu propio ordenador). En el caso de indicarle una url o web donde está el archivo, lo descarga e importa a la vez.
  2. Se lee el fichero indicando a R cómo están los datos guardados en la base de datos. Los argumentos son:

    • header = TRUE si la base de datos tiene cabecera: nombre de las columnas o de las variables

    • sep = ";" según los datos estén separados por “;” por “,”

    • dec = "." según si usa para los decimales la “,” o el “.”

  3. Además, se debe indicar cómo quieres que te lo guarde R:

    • encoding = "UTF-8" con formato UTF-8

    • stringsAsFactors = FALSE Por defecto, los datos en forma texto o carácter se identifican como factor. Si hay datos en formato texto, con FALSE le dices que no los identifique como factor. Esto es adecuado, por ejemplo, si tienes una variable que guarda los nombres de clientes, respetará que los nombres son carácter.

  4. Se guardan los datos, asignando <- un nuevo nombre. En este caso tiendCamp

tiendCamp <- read.table( file = "http://gauss.inf.um.es/datos/tiendas.csv",
                      header = TRUE,
                      sep = ";",
                      dec = ".",
                      encoding = "UTF-8",
                      stringsAsFactors = FALSE )

Inspeccionar la base de datos

Una vez tienes tu base de datos en R, es conveniente inspeccionar los datos. En R hay varias funciones que permiten ver “qué” tienes en tu conjunto de datos.

Con head( ) se muestran las seis primeras filas del data frame. Esta funcíón es útil para comprobar visualmente que se ha leido bien tu base de datos.

head( tiendCamp ) # muestra los 6 primeros registros
##   precio peso altura   marca       uso estaciones capacidad.person.
## 1 349.95  960     96 coleman mochilero  primavera                 2
## 2 449.95 1450    107 coleman mochilero  primavera                 3
## 3 159.95 1700    102   kelty mochilero  primavera                 2
## 4 359.95 2160    107 coleman mochilero  primavera                 3
## 5 149.00 2210    107     rei mochilero  primavera                 2
## 6 399.95 1530    107 coleman mochilero  primavera                 2

La función dim( ) examina las dimensiones del data frame. Nos da información sobre el número de casos o registros (filas) y el número de variables (columnas). Nuestro data frame _tiendCamp_tiene 7 variables y 90 registros.

dim( tiendCamp ) # muestra las dimensiones: 90 registros de 7 variables
## [1] 90  7

La función str( ) permite examinar la estructura de los datos que contiene el data frame. Esta función proporciona información muy completa: qué tipo de objeto es tu base de datos (en nuestro caso, un data frame), número de observaciones (90 obs.) y número de variables (7 variables), y detalle de cada variable (su nombre, tipo o naturaleza, y el valor para las primeras observaciones).

str( tiendCamp ) # ofrece un detalle de los datos
## 'data.frame':    90 obs. of  7 variables:
##  $ precio           : num  350 450 160 360 149 ...
##  $ peso             : num  960 1450 1700 2160 2210 1530 2690 1840 3200 850 ...
##  $ altura           : int  96 107 102 107 107 107 117 114 122 97 ...
##  $ marca            : chr  "coleman" "coleman" "kelty" "coleman" ...
##  $ uso              : chr  "mochilero" "mochilero" "mochilero" "mochilero" ...
##  $ estaciones       : chr  "primavera" "primavera" "primavera" "primavera" ...
##  $ capacidad.person.: int  2 3 2 3 2 2 3 4 4 1 ...

Análisis Descriptivo de los datos

R tiene varias funciones para hacer estadística descriptiva de un conjunto de datos. Veremos dos funciones para obtener estos descriptivos: summary( ) y stat.desc( )

La función summary( ) ofrece los descriptivos básicos para variables cuantitativas. Con tiendCamp[ c("precio", "peso", "altura") ] seleccionamos sólo estas tres variables de nuestro data frame.

summary( tiendCamp[ c("precio", "peso", "altura") ])
##      precio           peso          altura     
##  Min.   : 99.5   Min.   : 850   Min.   : 90.0  
##  1st Qu.:261.5   1st Qu.:1855   1st Qu.:102.0  
##  Median :344.5   Median :2405   Median :112.0  
##  Mean   :349.2   Mean   :3395   Mean   :125.8  
##  3rd Qu.:399.9   3rd Qu.:4756   3rd Qu.:151.5  
##  Max.   :700.0   Max.   :9554   Max.   :203.0

Si quieres que los resultados de las tres variables se muestren en la misma tabla, usa la función apply( )

resumen_descriptivos <- apply( tiendCamp[,1:3], 2, summary )

resumen_descriptivos
##           precio     peso   altura
## Min.     99.5000  850.000  90.0000
## 1st Qu. 261.5000 1855.000 102.0000
## Median  344.4750 2405.000 112.0000
## Mean    349.1556 3394.599 125.8333
## 3rd Qu. 399.9500 4755.625 151.5000
## Max.    699.9500 9553.800 203.0000

Una descripción de los resultados obtenidos sería:

  • Para la variable precio, tiene una media es 349.2, se mueve entre un precio de 99.5 y 700, la mayoría está por debajo del precio de 399.9 (3r cuartil, el 75% de las observaciones)

  • Para la variable peso: su media es 3395, se mueve entre un peso de 850 y 9554, aunque la mitad está por debajo de 2405 (mediana, el 50% de las observaciones), la mayoría está por debajo del peso de 4756 (3r cuartil, el 75% de las observaciones).

  • Para la variable altura su media es 125.8, las observaciones se mueven entre una altura de 90 y 203, la mayoría está por debajo de la altura de 151.5 (3r cuartil, el 75% de las observaciones).

Por su parte la función stat.desc( ) ofrece una lista completa de descriptivos. Esta función pertenece al paquete pastecs, si no lo tienes cargado en R no olvides añadir library( pastecs ) a tu código.

library( pastecs )
## Loading required package: boot
stat.desc( tiendCamp[ c("precio", "peso", "altura") ], norm = TRUE )
##                     precio         peso        altura
## nbr.val       9.000000e+01 9.000000e+01  9.000000e+01
## nbr.null      0.000000e+00 0.000000e+00  0.000000e+00
## nbr.na        0.000000e+00 0.000000e+00  0.000000e+00
## min           9.950000e+01 8.500000e+02  9.000000e+01
## max           6.999500e+02 9.553800e+03  2.030000e+02
## range         6.004500e+02 8.703800e+03  1.130000e+02
## sum           3.142400e+04 3.055139e+05  1.132500e+04
## median        3.444750e+02 2.405000e+03  1.120000e+02
## mean          3.491556e+02 3.394599e+03  1.258333e+02
## SE.mean       1.267329e+01 2.365488e+02  3.483840e+00
## CI.mean.0.95  2.518156e+01 4.700174e+02  6.922316e+00
## var           1.445510e+04 5.035979e+06  1.092343e+03
## std.dev       1.202294e+02 2.244099e+03  3.305061e+01
## coef.var      3.443433e-01 6.610792e-01  2.626538e-01
## skewness      4.824659e-01 1.091811e+00  9.916428e-01
## skew.2SE      9.496165e-01 2.148964e+00  1.951807e+00
## kurtosis     -1.108976e-01 5.327963e-02 -5.970462e-01
## kurt.2SE     -1.102502e-01 5.296861e-02 -5.935609e-01
## normtest.W    9.720198e-01 8.492400e-01  7.980569e-01
## normtest.p    4.911124e-02 3.979086e-08  9.120384e-10

Elaborar un Gráfico de Dispersión

Vamos a hacer un gráfico de dispersión enfrentando las variables peso y altura, indicando por colores la variable uso y con distintos símbolos para la variable capacidad.

Comprobar las variables

Primero examino las variables que se usan en el gráfico plot , por si tuviera que transformar alguna previamente:

str( tiendCamp )
## 'data.frame':    90 obs. of  7 variables:
##  $ precio           : num  350 450 160 360 149 ...
##  $ peso             : num  960 1450 1700 2160 2210 1530 2690 1840 3200 850 ...
##  $ altura           : int  96 107 102 107 107 107 117 114 122 97 ...
##  $ marca            : chr  "coleman" "coleman" "kelty" "coleman" ...
##  $ uso              : chr  "mochilero" "mochilero" "mochilero" "mochilero" ...
##  $ estaciones       : chr  "primavera" "primavera" "primavera" "primavera" ...
##  $ capacidad.person.: int  2 3 2 3 2 2 3 4 4 1 ...

La variable tiendCamp$uso es de tipo chr cadena “character” (alfanumérico). Es necesario transformarla a factor, de forma que R reconozca cada una de las clases (alpinismo, caravana, mochilero) como niveles de la variables. Se hace con la función as.factor( )

summary( tiendCamp$uso ) # detalle de la variable
##    Length     Class      Mode 
##        90 character character
table( tiendCamp$uso ) # niveles o clases de la variable
## 
## alpinismo  caravana mochilero 
##         6        25        59
tiendCamp$uso <- as.factor( tiendCamp$uso ) # transformación de los datos de caracter a factor
str( tiendCamp$uso ) # comprobar que ahora es factor
##  Factor w/ 3 levels "alpinismo","caravana",..: 3 3 3 3 3 3 3 3 3 3 ...

Fijar algunos parámetros para todos los gráficos

En ocasiones es adecuado fijar algunos parámetros gráficos. Por ejemplo, que todos tengan el mismo color de título y un tamaño de letra para ese título. Con la función par( ) indicamos cómo queremos que sean nuestros gráficos a partir de ahora. De forma que los atributos que indiquemos en par( ) ya estarán por defecto en los gráficos posteriores que hagamos (en estos gráficos ya no hay que ponerles esos atributos).

AVISO: cuando ya no quieras mantener los parámetros, debes pasar el código dev.off( ) y así restaurar el device original (los parámetros que por defecto pone R a los gráficos).

Con el siguiente código indicamos que a partir de ahora todos mis gráficos tengan el título de color azul y un tamaño superior (1.5).

par( col.main = "blue",
    cex.main = 1.5 )

# dev.off( ) para restaurar el device original

Ejecutar el gráfico (por colores y formas)

  1. La función plot( ) es una función gráfica de alto nivel que lanza un devaice gráfico.
  • Cuando se enfrentan dos variables cuantitativas plot( ) ejecuta un gráfico de dispersión. En nuestro caso, un gráfico de las variables peso frente a la de altura plot (x, y), con peso en el eje de abscisas x, con altura en el eje de ordenadas y.
plot( tiendCamp$peso, tiendCamp$altura ) # gráfico de dispersión

  1. Añadiendo distintos argumentos a la función plot( ) podemos personalizar nuestro gráfico.
  • Título principal del gráfico main =
  • Etiquetar los ejes xlab = ylab =
  • Modificar el rango de los ejes xlim = ylim =
  1. Añadir nuevas variables al gráfico de dispersión: uso y capacidad.

    • Mostrar cada clase de la variable uso ((alpinismo, caravana, mochilero) en un color. Función col = (variable)

    • Mostrar un símbolo para cada uno de los tipos (de 1 a 6) de la variable capacidad.person.. Función pch = (variable)

plot( tiendCamp$peso, tiendCamp$altura, 
     xlab = "Peso", # Etiqueta eje x
     ylab = "Altura", # Etiqueta eje y
     main = "Gráfico de dispersión: Peso - Altura", # Titulo principal del grafico
     xlim = c(0, 10000), # Rango de los datos de la variable peso (x)
     ylim = c(80, 220), # Rango de los datos de la variable altura (y)
     col = tiendCamp$uso, # Pintar por colores la variable uso
     pch = tiendCamp$capacidad.person. ) # Distitintos simbolos para la variable capacidad

Modelo de Regresión Lineal

Vamos a crear un modelo de regresión lineal que se ajuste a la nube de puntos (nuestro gráfico de dispersión creado antes), y añadir a ese grafico la recta de regresión.

Como vamos a usar el modelo de regresión en otras funciones, debemos guardar nuestro modelo asignándole <- un nombre, por ejemplo, lo llamamos modelo(originales no somos, cierto).

Hacemos la regresión lineal la función lm( y ~ x, data). Y la guardamos con el nombre de modelo. El código es:

modelo <- lm( altura ~ peso, data = tiendCamp ) # modelo de regresión

Examinamos los coeficientes del modelo de regresión. Como sabes la función summary( ) se usa para hacer un resumen del objeto que le indiquemos. En nuestro caso modelo.

summary( modelo ) # coeficientes del modelo de regresión
## 
## Call:
## lm(formula = altura ~ peso, data = tiendCamp)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -45.982  -5.977  -0.976   6.219  49.418 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 8.040e+01  2.661e+00   30.21   <2e-16 ***
## peso        1.338e-02  6.551e-04   20.43   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 13.87 on 88 degrees of freedom
## Multiple R-squared:  0.8259, Adjusted R-squared:  0.8239 
## F-statistic: 417.4 on 1 and 88 DF,  p-value: < 2.2e-16

Por último, añadimos la recta de regresión a nuestro gráfico de dispersión. La función para añadir líneas a un gráfico es abline().

Con funciones gráficas de bajo nivel se van añadiendo elementos (puntos, rectas, textos,…) a un gráfico ya creado (en nuestro caso la función gráfica de alto nivel plot( ))

Como la función abline( ) es de bajo nivel, tenemos que ejecutar de nuevo la función plot( ) para lanzar el device gráfico y así poder añadir la recta de regresión.

plot( tiendCamp$peso, tiendCamp$altura, 
     xlab = "Peso", # Etiqueta eje x
     ylab = "Altura", # Etiqueta eje y
     main = "Gráfico de dispersión: Peso - Altura", # Titulo principal del grafico
     xlim = c(0, 10000), # Rango de los datos de la variable peso (x)
     ylim = c(80, 220), # Rango de los datos de la variable altura (y)
     col = tiendCamp$uso, # Pintar por colores la variable uso
     pch = tiendCamp$capacidad.person. ) #

abline ( modelo, col = "magenta" ) # añadir la recta al gráfico