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/
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().
Vamos a trabajar con la base de datos tiendas.csv
Está disponible en la dirección http://gauss.inf.um.es/datos/.
La función read.table
se usa para importar datos a R. El código o code chunks se comenta a continuación:
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.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 “.”
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.
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 )
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 ...
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
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.
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 ...
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
plot( )
es una función gráfica de alto nivel que lanza un devaice gráfico.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
plot( )
podemos personalizar nuestro gráfico.main =
xlab =
ylab =
xlim =
ylim =
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
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