r basic course (session 4)stel.ub.edu/sites/default/files/agenda/documents/rcourse4student.pdf ·...
TRANSCRIPT
R basic Course (Session 4)S.Civit
21 de enero de 2020
ContentsObjetivos: 1
Objetivo 4: Gráficos(ggplot2) 1Objetivo 4: Histogramas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2Polígonos de frecuencias (densidades) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Un poco de práctica: Histograma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Diagramas de barras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Diagramas de dispersión . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Diagramas de caja: Boxplot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Asistente para definir el tema en ggplot 30
Ejemplo de gráfico. Visualización interactiva 31
Material complementario de Gráficos 31
Objetivo 4: Tablas 32Introducción . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32Ejemplos de tablas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Objetivos:
-Objetivo 4: Gráficos/Tablas necesarios para realizar nuestros análisis de datos.
Como lo que se pretende es que se entienda la filosofía y la práctica del trabajo con R, todos los conceptosque se introducen se ilustran con ejemplos muy sencillos. No obstante, la selección de funciones que se realizatienen una aplicación directa en el tratamiento real de datos.
Objetivo 4: Gráficos(ggplot2)
Aprenderemos a graficar con ggplot2.
En palabras de Wickham “The list (. . . ) is very friendly to new users”.
Un gráfico realizado con ggplot2 presenta, al menos, tres elementos:
-Datos (Data) que queremos representar (que serán un data frame).
-Características estéticas (aes) (aesthetic mappings) que describen cómo queremos que los datos se veanen el gráfico. Para más información podemos consultar la vignette (vignette(“ggplot2-specs”)). Como luegoveremos, se introducen con la función aes() y se refieren a:
-posición (en los ejes)-color exterior (color) y de relleno (fill)-forma de puntos (shape)
1
-tipo de línea (linetype)-tamaño (size)
-Objetos geométricos (Geom) representan lo que vemos en un gráficos (puntos, líneas, etc.). Todo gráficotiene, como mínimo, una geometría. La geometría determina el tipo de gráfico:
-geom_point (para puntos)-geom_lines (para lineas)-geom_histogram (para histograma)-geom_boxplot (para boxplot)-geom_bar (para barras)-geom_smooth (líneas suavizadas)-geom_polygons (para polígonos en un mapa)-con help.search(“geom_”, package = “ggplot2”) podéis ver el listado de objetos geométricos)
Por tanto, para construir un gráfico con ggplot2 comenzamos con la siguiente estructura de código:ggplot(datos, aes()) + geom_tipo()
A partir de esta estructura básica puede mejorarse la presentación de los gráficos introduciendo, por ejemplo,características estéticas en los objetos geométricos, rotulando el gráficos, etc.
Otros elementos que conviene tener presente en un gráfico de ggplot2 son:
-Stat (Stat), para resumir datos (contar frecuencias, número de intervalos en los histogramas, etc.).-Escalas (Scale). Convierten datos en características estéticas (colores, etc.), crean leyendas... . - Coordenadas (coord): sistema de coordenadas cartesianas, polares, proyecciones, etc.-Faceting (Faceting), permite representar gráficos separados para subconjuntos de los datos originales.#install.packages("ggplot2")library(ggplot2)
Objetivo 4: Histogramas
Para realizar los gráficos vamos a utilizar datos que se encuentran accesibles en el paquete AER. Concreta-mente http://lib.stat.cmu.edu/datasets/CPS_85_Wages#if(!require("AER")) {install.packages("AER")}data(package="AER")library(AER)
## Warning: package 'AER' was built under R version 3.5.3
## Loading required package: car
## Warning: package 'car' was built under R version 3.5.3
## Loading required package: carData
## Loading required package: lmtest
## Warning: package 'lmtest' was built under R version 3.5.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 3.5.3
#### Attaching package: 'zoo'
## The following objects are masked from 'package:base':#### as.Date, as.Date.numeric
2
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 3.5.3
## Loading required package: survivaldata("CPS1985")dim(CPS1985)
## [1] 534 11names(CPS1985)
## [1] "wage" "education" "experience" "age" "ethnicity"## [6] "region" "gender" "occupation" "sector" "union"## [11] "married"
El histograma del Salario (wage). Para ello, usamos la función ggplot(), en la que incluimos
-Los datos y la estética con la que queremos que se presenten en el gráfico.
-Seguidamente le añadimos (+) la geometría (tipo histograma) con la función geom_histogram().
Básico con ggplot2 añadimos capas (layers) con el símbolo +.#frecuencias absolutasggplot(CPS1985, aes(x=wage)) +geom_histogram()
# frecuencias relativasggplot(CPS1985, aes(x=wage)) +
geom_histogram(aes(y=..density..))
# Histograma con 20 intervaloslibrary(ggplot2)
## Warning: package 'ggplot2' was built under R version 3.5.3ggplot(CPS1985, aes(x=wage)) +
geom_histogram(bins=20, color="white", fill="blue")
3
0
50
100
0 10 20 30 40wage
coun
t
# Histograma con amplitud de intervalo igual a 5. Línea discontinua para el contorno del intervaloggplot(CPS1985, aes(x=wage)) +
geom_histogram(binwidth=5, color="white", fill="blue", linetype=2)
4
0
100
200
0 10 20 30 40 50wage
coun
t
#título al gráfico y a los ejes.ggplot(CPS1985, aes(x=wage)) +
geom_histogram(bins=20, color="white", fill="blue") +ggtitle("Distribución del salario (dólares por hora)") +xlab("Salario") +ylab("Número de empleados")
5
0
50
100
0 10 20 30 40Salario
Núm
ero
de e
mpl
eado
sDistribución del salario (dólares por hora)
# Una alternativa al anterior sería:ggplot(CPS1985, aes(x=wage)) +
geom_histogram(bins=20, color="white", fill="blue") +labs(title = "Distribución del salario (dólares por hora)",
x = "Salario",y = "Número de empleados") +
ylim(c(0,150))
6
0
50
100
150
0 10 20 30 40Salario
Núm
ero
de e
mpl
eado
sDistribución del salario (dólares por hora)
ggplot(CPS1985, aes(x=wage)) +geom_histogram(aes(fill=..count..), bins=20, color="white") +geom_vline(aes(xintercept=mean(wage)), color="red") +geom_vline(aes(xintercept=median(wage)), color= "darkgreen") +labs(title = "Distribución del salario (dólares por hora)",
x = "Salario",y = "Número de empleados") +
scale_fill_continuous(name="Empleados") +
theme_classic()
7
0
50
100
0 10 20 30 40Salario
Núm
ero
de e
mpl
eado
s
0
50
100
Empleados
Distribución del salario (dólares por hora)
-Visualizar subconjunto de datos (salario para hombres y salario para mujeres) en distintos paneles.
-Para ello, utilizamos el elemento facet.ggplot(CPS1985, aes(x=wage)) +
geom_histogram(bins=20, color="white", fill="blue") +facet_grid(gender~.)
8
male
female
0 10 20 30 40
0
25
50
75
0
25
50
75
wage
coun
t
#opcion 2ggplot(CPS1985, aes(x=wage)) +
geom_histogram(bins=20, color="white", fill="blue") +facet_wrap(~gender)
9
male female
0 10 20 30 40 0 10 20 30 40
0
25
50
75
wage
coun
t
ggplot(CPS1985, aes(x=wage)) +geom_histogram(bins=20, aes(color=gender) ) +ylim(c(0,150))
ggplot(CPS1985, aes(x=wage, fill=gender)) +geom_histogram(bins=20) +ylim(c(0,150))
ggplot(CPS1985, aes(x=wage)) +geom_histogram(bins=20, aes(fill=gender), position="fill", alpha=0.4) +labs(x= "Salario", y="Empleados", fill="Género") + # títulos de ejes y leyendascale_fill_discrete(labels=c("Hombre","Mujer")) # títulos claves leyenda
Polígonos de frecuencias (densidades)
-Poligono de frecuencias porpor géneroggplot(CPS1985, aes(x=wage)) +
geom_freqpoly(bins=20, aes(color=gender)) +labs(color="Género")
#Densidad de frecuencias:ggplot(CPS1985, aes(x=wage)) +geom_freqpoly(bins=20, aes(y=..density.., color=gender)) +
labs(color="Género")
10
-Para aprender más sobre cómo crear histogramas con ggplot2:
http://t-redactyl.io/blog/2016/02/creating-plots-in-r-using-ggplot2-part-7-histograms.html
http://www.sthda.com/english/wiki/ggplot2-histogram-plot-quick-start-guide-r-software-and-data-visualization
Un poco de práctica: Histograma
-Representad la distribución del salario (en logaritmos: log(wage)) mediante un histograma.
-Comparad la distribución de log(wage) según la raza (ethnicity).
Diagramas de barras
El diagrama de barras, como ya sabemos, puede utilizarse para representar variables categóricas (atributos uordinales) y variables cuantitativas discretas.#Opcion 1: Básicoggplot(CPS1985, aes(ethnicity)) +
geom_bar()
ggplot(CPS1985, aes(education)) +geom_bar()
#Opcion 2: Título al gráfico y a los ejes.ggplot(CPS1985, aes(ethnicity)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros"))
ggplot(CPS1985, aes(education)) +geom_bar() +
labs(title="Diagrama de barras",x= "Educación (en años)",y="Empleados")
#Opcion3: cada barra con un color distintoggplot(CPS1985, aes(ethnicity, fill=ethnicity)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros"))
# eliminamos la leyendo porque en este caso no es ilustrativaggplot(CPS1985, aes(ethnicity, fill=ethnicity)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +
11
guides(fill=FALSE)
#Opcion4: Información sobre el número de casos en las barras
ggplot(CPS1985, aes(ethnicity, fill=ethnicity)) +geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y=NULL) +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +guides(fill=FALSE) +geom_text(stat='count',aes(label=..count..), vjust=-0.5, size=3)
#Opcion 1: Básicoggplot(CPS1985, aes(ethnicity, fill=gender)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_discrete("Género", labels=c("Hombre","Mujer"))
#Opcion 2: Colores a través de una paleta:ggplot(CPS1985, aes(ethnicity, fill=gender)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_manual(values = heat.colors(2),
"Género",labels=c("Hombre","Mujer"))
# Opcion 2 bis. Paleta de coloresggplot(CPS1985, aes(ethnicity, fill=gender)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_brewer(palette = "Accent",
"Género",labels=c("Hombre","Mujer"))
#Opcion3: las barras se sitúen unas junto a las otras con position = “dodge”.
ggplot(CPS1985, aes(ethnicity, fill=gender)) +geom_bar(position="dodge") + # también: position=position_dodge()labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
12
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_brewer(palette = "Accent",
"Género",labels=c("Hombre","Mujer"))
#Opcion4: cambiar la orientación de las barras de vertical a horizontal.
ggplot(CPS1985, aes(ethnicity, fill=gender)) +geom_bar(position="dodge") + # también: position=position_dodge()labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_brewer(palette = "Accent",
"Género",labels=c("Hombre","Mujer")) +
coord_flip()
# Incluimos el número de casosggplot(CPS1985, aes(ethnicity, fill=gender)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_brewer(palette = "Accent",
"Género",labels=c("Hombre","Mujer")) +
geom_text(stat='count',aes(label=..count..),position = "stack",vjust=1,size=2,color="red")
13
204
236
1314 28
39
0
100
200
300
400
Caucásico Hispano OtrosRaza
Em
plea
dos Género
Hombre
Mujer
Diagrama de barras
# en porcentajes:ggplot(CPS1985, aes(ethnicity,y = (..count..)/sum(..count..), fill=gender)) +
geom_bar() +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_brewer(palette = "Accent",
"Género",labels=c("Hombre","Mujer")) +
geom_text(stat="count",aes(label = paste(round((..count..)/sum(..count..)*100), "%")),position = "stack",vjust=1,size=2,color="red")
14
38 %
44 %
2 %3 % 5 %
7 %
0.0
0.2
0.4
0.6
0.8
Caucásico Hispano OtrosRaza
Em
plea
dos Género
Hombre
Mujer
Diagrama de barras
# Opcion 2: Proporción de hombres y mujeres en cada categoría#Emplearemos position = fill dentro de la geometría.ggplot(CPS1985, aes(ethnicity, fill=gender)) +
geom_bar(position = "fill") +labs(title="Diagrama de barras",
x= "Raza",y="Empleados") +
scale_x_discrete(labels=c("Caucásico", "Hispano", "Otros")) +scale_fill_brewer(palette = "Accent",
"Género",labels=c("Hombre","Mujer"))
15
0.00
0.25
0.50
0.75
1.00
Caucásico Hispano OtrosRaza
Em
plea
dos Género
Hombre
Mujer
Diagrama de barras
Diagramas de dispersión
-Si nos preguntamos como es la relación entre el salario (en logaritmos) y la experiencia?. Esta preguntaimplica un nuevo tipo de gráfico que son los denominados gráficos de dispersión# Raw dataggplot(CPS1985, aes(experience, log(wage))) +
geom_point() +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)")
16
0
1
2
3
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
# Opcion 2:# color se ha introducido como una característica estética (con aes())
ggplot(CPS1985, aes(experience, log(wage), color="red")) +geom_point()
17
0
1
2
3
0 20 40experience
log(
wag
e)
colour
red
# Opcion 3.# En esta opción el color se introduce como una constante.
ggplot(CPS1985, aes(experience, log(wage))) +geom_point(color="red")
18
0
1
2
3
0 20 40experience
log(
wag
e)
Con muchos datos es muy probable que se produzca un importante solapamiento de las observaciones.Una alternativa en estos casos es representar lo que se conoce como Hex plot.
El problema es que este gráfico usa geom_hex por defecto usa una escala gradual de tonos azules (azuloscuro equivale a poca frecuencia, azul claro equivale a alta frecuencia). Al revés estamos más acostumbrados.# Hay que instalar el paquete hexbin#install.packages("hexbin")library(hexbin)
## Warning: package 'hexbin' was built under R version 3.5.3ggplot(CPS1985, aes(experience,log(wage))) +
geom_hex() +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)") +
scale_fill_continuous("Empleados") +theme_classic()
19
0
1
2
3
4
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
1
2
3
4
5
6
7Empleados
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
# opcion 2
ggplot(CPS1985, aes(experience,log(wage))) +geom_hex() +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)") +
scale_fill_gradient("Empleados", low="green", high="green4") + # nombres en colors()theme_classic()
20
0
1
2
3
4
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
1
2
3
4
5
6
7Empleados
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
Fijémonos en los siguientes diagramas de dispersión. Vamos a “usar” el género para colorear los puntos.Alguna conclusión descriptiva?# Opción 1ggplot(CPS1985, aes(experience,log(wage), color=gender)) +
geom_point() +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)") +
scale_color_discrete(name="Género", labels=c("Hombre","Mujer"))
21
0
1
2
3
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
Género
Hombre
Mujer
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
# Opción 2ggplot(CPS1985, aes(experience,log(wage))) +
geom_point(aes(color=gender)) +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)") +
scale_color_discrete("Género", labels=c("Hombre","Mujer"))
22
0
1
2
3
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
Género
Hombre
Mujer
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
Fijémonos qué sucede si añadimos la recta de regresión. Esto último lo vamos a hacer añadiendo la**geometría geom_smooth()*+ y especificando como método de estimación lm (linear model).# Opción 1ggplot(CPS1985, aes(experience,log(wage), color=gender)) +
geom_point() +geom_smooth(method="lm", se=FALSE) +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)") +
scale_color_discrete("Género", labels=c("Hombre","Mujer"))
23
0
1
2
3
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
Género
Hombre
Mujer
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
# Opción 2ggplot(CPS1985, aes(experience,log(wage))) +
geom_point(aes(color=gender)) +geom_smooth(method="lm") +labs(title="Diagrama de dispersión",
subtitle= "ScatterPlot",caption="Fuente: CPS1985 (paquete AER)",x="Experiencia (en años)",y="Salario (en logaritmo)") +
scale_color_discrete("Género", labels=c("Hombre","Mujer"))
24
0
1
2
3
0 20 40Experiencia (en años)
Sal
ario
(en
loga
ritm
o)
Género
Hombre
Mujer
ScatterPlot
Diagrama de dispersión
Fuente: CPS1985 (paquete AER)
Un poco de práctica: Diagrama de Dispersión
-Realizar un diagrama de dispersión utilizando la base de datos CPS1988 del paquete AER.
-Incluid en el gráfico colores según una determinada variable categórica,
-Rectas de regresión,
-Cambiar la posición de la leyenda
Diagramas de caja: Boxplot
Para realizar un diagrama de caja utilizamos la geometría: geom_boxplot().# Opción 1ggplot(CPS1985, aes(x=gender, y=wage)) +
geom_boxplot()
# Opción 2# Diagrama de caja con color de rellenoggplot(CPS1985, aes(x=gender, y=wage, fill=gender)) +
geom_boxplot() +labs(x="Género", y="Salario", fill="Género") + # titulo ejes y leyendascale_x_discrete(labels=c("Hombre","Mujer")) + # etiquetas del eje xscale_fill_discrete(labels=c("Hombre","Mujer")) # etiquetas claves leyenda
25
# Opción 3# Diagrama de caja con cambio de posición de la leyendaggplot(CPS1985, aes(x=gender, y=wage, fill=gender)) +
geom_boxplot() +labs(x="Género", y="Salario", fill="Género") +scale_x_discrete(labels=c("Hombre","Mujer")) +scale_fill_discrete(labels=c("Hombre","Mujer")) +theme(legend.position="top") # cambio posición de leyenda
#Opcion 4# cambio dirección de las cajasggplot(CPS1985, aes(x=gender, y=wage, fill=gender)) +
geom_boxplot(outlier.colour = "blue") +labs(x="Género", y="Salario") +scale_x_discrete(labels=c("Hombre","Mujer")) +guides(fill=FALSE) +coord_flip() # cambio dirección de las cajas
Puede resultar interesante localizar la media de cada grupo en los diagramas de caja. Para ello, hacemosuso del elemento stat Se puede añadir stat, básicamente, de dos formas:
-Añadir directamente una función stat_() y de esa forma anular su valor por defecto en la geometría.
-Añadir una función geom_() e introducir el **elemento stat*+ para anular el valor por defecto.# Opción 1# Añadimos la media utilizando la función stat_()ggplot(CPS1985, aes(x=gender, y=wage, fill=gender)) +
geom_boxplot() +labs(x="Género", y="Salario") +scale_x_discrete(labels=c("Hombre","Mujer")) +guides(fill=FALSE) +coord_flip() +stat_summary(fun.y=mean, geom="point", shape=5, size=4)
26
Hombre
Mujer
0 10 20 30 40Salario
Gén
ero
# Opción 2# Añadimos la media utilizando la función geom_() y modificando el elemento statggplot(CPS1985, aes(x=gender, y=wage, fill=gender) ) +
geom_boxplot(alpha=0.3, outlier.colour = "blue") +labs(x="Género", y="Salario") +scale_x_discrete(labels=c("Hombre","Mujer")) +guides(fill=FALSE) +coord_flip() +geom_point(stat= "summary", fun.y=mean, shape=16, size=2, color="red")
27
Hombre
Mujer
0 10 20 30 40Salario
Gén
ero
# Opción 3
#cómo se distribuyen nuestras observaciones/individuos respecto del diagrama de caja# función position_jitter() Añade ruido para ver las observaciones
ggplot(CPS1985, aes(x=gender, y=wage, fill=gender) ) +geom_boxplot(alpha=0.3, outlier.colour = "blue") +labs(x="Género", y="Salario") +scale_x_discrete(labels=c("Hombre","Mujer")) +guides(fill=FALSE) +coord_flip() +geom_point(stat= "summary", fun.y=mean, shape=16, size=4, color="red") +geom_point(position = position_jitter(width = 0.1), alpha = 0.2)
28
Hombre
Mujer
0 10 20 30 40Salario
Gén
ero
# Opción 4# podemos utilizar la geometría geom_jitter().ggplot(CPS1985, aes(x=gender, y=wage, fill=gender) ) +
geom_boxplot(alpha=0.3, outlier.colour = "blue") +labs(x="Género", y="Salario") +scale_x_discrete(labels=c("Hombre","Mujer")) +guides(fill=FALSE) +coord_flip() +geom_point(stat= "summary", fun.y=mean, shape=16, size=4, color="red") +geom_jitter(width = 0.1, alpha = 0.2)
29
Hombre
Mujer
0 10 20 30 40Salario
Gén
ero
Un poco de práctica: Boxplot
-Representad el diagrama de caja del salario (wage) en función de la ocupación (occupation).
Asistente para definir el tema en ggplot
Este paquete lo que nos facilita es la edición del tema, la libreria ggThemeAssist. Dentro de ella existe unaddin para ggplot que facilitaba mucho mucho la tarea de mejorar el aspecto estético de los gráficos (el temadel gráfico)
Para ello, una vez cargado el paquete, seleccionamos el código del gráfico que queremos customizary, acontinuación, del menú Addins seleccionamos el Addin ggplot Theme Assistant.#install.packages("ggThemeAssist")library(ggplot2)data(mtcars)gg<-ggplot(mtcars, aes(x=hp,y=mpg, colour=cyl))+ geom_point()gg
Para ver como funciona aqui teneis una animación
https://raw.githubusercontent.com/calligross/ggthemeassist/master/examples/ggThemeAssist2.gif
De todas fomas, la mejor forma de aprender es viendo cómo cambian las cosas en un gráfico cualquiera.
Para acabar, hacer clic en el botón Done y se generará el código R del gráfico.
30
Ejemplo de gráfico. Visualización interactiva
Para que nos hagamos una idea de las posibilidades que ofrece R, tanto en el tratamiento como en lavisualización de datos, aquí os dejamos este ejemplo que podéis encontrarlo en el tutorial del paquete Eurostat<(https://github.com/rOpenGov/eurostat)>.library(dplyr)library(eurostat)library(sf)library(tmap)
# Cargamos los datos de eurostat
sp_data <- eurostat::get_eurostat("tgs00026",time_format = "raw",
stringsAsFactors = FALSE) %>%# subset to have only a single row per geodplyr::filter(time == 2010, nchar(geo) == 4) %>%# categorisedplyr::mutate(income = cut_to_classes(values, n = 5))
# Descargamos los datos geoespacioales de GISCOgeodata <- get_eurostat_geospatial(output_class = "sf",
resolution = "60",nuts_level = 2,year = 2013)
# unimos los datosmap_data <- inner_join(geodata, sp_data)
# Ahora se construye el mapamap1 <- tmap::tm_shape(geodata) +
tmap::tm_fill("lightgrey") +tmap::tm_shape(map_data) +tmap::tm_grid() +tmap::tm_polygons("income", title = "Disposable household\nincomes in 2010",
palette = "Oranges")print(map1)
# Interactive#tmap_mode("view")#map1
Material complementario de Gráficos
http://rparamuyprincipiantes.blogspot.com/2015/07/paquete-ggplot2-grafico-de-barras-i-stat.html
31
Objetivo 4: Tablas
Introducción
La elaboración de tablas para mostrar resultados es una parte importante (y time consuming) de cualquierinforme o investigación.
• Se empleará y reforzará el uso de la libreria dplyr.
• Con dplyr calcularemos los estadísticos que queramos mostrar almacenándolos en un dataframe.
-Una vez tengamos los resultados en un dataframe nos quedará la tarea de presentarlos como tablas en eldocumento final.
-Para ello, sólo tendremos que llamar a la función kable().
Kable nos permitirá mostrar los resultados como tablas en el documento final, ya sea este un documento .html, .pdf, .doc, . . .
Ejemplos de tablas
#install.packages("kableExtra")kable(x, format, digits = getOption("digits"), row.names = NA,col.names = NA, align, caption = NULL, label = NULL,format.args = list(), escape = TRUE, ...)
knitr::kable(head(mtcars[, 1:4]), "pandoc")
mpg cyl disp hpMazda RX4 21.0 6 160 110Mazda RX4 Wag 21.0 6 160 110Datsun 710 22.8 4 108 93Hornet 4 Drive 21.4 6 258 110Hornet Sportabout 18.7 8 360 175Valiant 18.1 6 225 105
# generate tables in HTML,#knitr::kable(mtcars[1:2, 1:2], "html")
Cambiando formato columna de una tabla
-Usando la funcion col.names subtituimos los nombre de la columnas (variables) con un vector con “nuevosnombres”#Opcion 1: Subtituimos puntos por espacins en la columna nombre :iris2 <- head(iris)iris2
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species## 1 5.1 3.5 1.4 0.2 setosa## 2 4.9 3.0 1.4 0.2 setosa## 3 4.7 3.2 1.3 0.2 setosa## 4 4.6 3.1 1.5 0.2 setosa
32
## 5 5.0 3.6 1.4 0.2 setosa## 6 5.4 3.9 1.7 0.4 setosaknitr::kable(iris2, col.names = gsub("[.]", " ", names(iris)),"pandoc")
Sepal Length Sepal Width Petal Length Petal Width Species5.1 3.5 1.4 0.2 setosa4.9 3.0 1.4 0.2 setosa4.7 3.2 1.3 0.2 setosa4.6 3.1 1.5 0.2 setosa5.0 3.6 1.4 0.2 setosa5.4 3.9 1.7 0.4 setosa
# Opcion 2: Alineaciónknitr::kable(iris2, align = "lccrr","pandoc")
Sepal.Length Sepal.Width Petal.Length Petal.Width Species5.1 3.5 1.4 0.2 setosa4.9 3.0 1.4 0.2 setosa4.7 3.2 1.3 0.2 setosa4.6 3.1 1.5 0.2 setosa5.0 3.6 1.4 0.2 setosa5.4 3.9 1.7 0.4 setosa
# Opcion 3: Títuloknitr::kable(iris2, caption = "An example table caption.","pandoc")
Table 4: An example table caption.
Sepal.Length Sepal.Width Petal.Length Petal.Width Species5.1 3.5 1.4 0.2 setosa4.9 3.0 1.4 0.2 setosa4.7 3.2 1.3 0.2 setosa4.6 3.1 1.5 0.2 setosa5.0 3.6 1.4 0.2 setosa5.4 3.9 1.7 0.4 setosa
-Alineación. Se puede alinear columna a columna con un vector con los siguientes “códigos” de caracterescomo argumentos l (left), c (center), and r (right)
-Titulo: Añadir titulo con el argumento caption argument, e.g.
Cambiando formatos numéricos de una tabla
Podemos formatear los valores numericos conlas funciones round(),format(),o con el argumento digits
-Missings: NA. Pueden ser subtituidos, o elegir no mostrarlos (i.e., leave the NA cells empty) :#generamos tabla con valoresd <- cbind(X1 = runif(3), X2 = 10^c(3, 5, 7), X3 = rnorm(3,
0, 1000))
33
# Opcion1: 4 decimalesknitr::kable(d, digits = 4)
# Opcion2: round de las columnas de forma independienteknitr::kable(d, digits = c(5, 0, 2))
# Opcion3: No uso de scientific notationknitr::kable(d, digits = 3, format.args = list(scientific = FALSE))
# Opcion4 :Añadir separador de milesknitr::kable(d, digits = 3, format.args = list(big.mark = ",",scientific = FALSE))
Tablas con caracteres especiales
#generamos tabla básicam <- lm(dist ~ speed, data = cars)d <- coef(summary(m))knitr::kable(d)
Estimate Std. Error t value Pr(>|t|)(Intercept) -17.579095 6.7584402 -2.601058 0.0123188speed 3.932409 0.4155128 9.463990 0.0000000
# Opcion1: Añadimos coeficientes# add a few math expressions to row and column namesrownames(d) <- c("$\\beta_0$", "$\\beta_1$")colnames(d)[4] <- "$P(T > |t|)$"knitr::kable(d, escape = FALSE)
Estimate Std. Error t value P (T > |t|)β0 -17.579095 6.7584402 -2.601058 0.0123188β1 3.932409 0.4155128 9.463990 0.0000000
knitr::kable(list(
head(cars, 3),head(mtcars[, 1:3], 5)
),caption = 'Two tables placed side by side.',booktabs = TRUE, valign = 't'
)
34
Table 7: Two tables placed side by side.
speed dist4 24 107 4
mpg cyl dispMazda RX4 21.0 6 160Mazda RX4 Wag 21.0 6 160Datsun 710 22.8 4 108Hornet 4 Drive 21.4 6 258Hornet Sportabout 18.7 8 360
35