Continuar utilizando las funciones del conjunto de librerías tidyverse para la manipulación y análisis de datos, y la librería flextable para la presentación de resultados.
Aprender a leer archivos csv.
Aprender a construir histogramas con ggplot: geom_histogram()
Aprender a hacer gráficas para grupos de datos: facet_wrap()
Aprender a construir tablas de frecuencias: función tabyl()
en el paquete janitor
.
Aprender a construir diagramas de barras a partir de tablas de frecuencias: geom_col()
Aprender a construir y representar gráficamente tablas de frecuencias cruzadas.
Abrir el archivo .Rmd de la práctica 3 y sustituir la lectura del archivo de datos datosP1-1920.xlsx
por el archivo tortugas.csv
que tiene la muestra completa de algo más de 1200 tortugas.
Los archivos .csv
(comma separated values) son archivos de texto en los que los valores de las variables están separados por comas (en los archivos csv versión inglesa) o por punto y coma (en versión española). Asimismo, en los archivos en versión inglesa, el separador decimal es un punto, mientras que en la versión española el separador decimal es una coma.
Para realizar esta práctica debemos descargar el archivo tortugas.csv
del campus virtual. Este archivo se encuentra en dos versiones (ambas exactamente con el mismo contenido) dependiendo del sistema operativo (Windows o Mac) que se utilice. La única diferencia es la codificación de los caracteres no ingleses (la ñ, las vocales con tilde, la c con cedilla, etc), que se realiza de modo diferente en ambos sistemas; Windows se ajusta al estándar ISO8859-1 y Mac al estandar UTF-8.
En ambos casos, podemos abrir el archivo con algún editor de texto (el Bloc de Notas en Windows o el TextEdit en Mac) y comprobar que el archivo csv está en el estándar español, con puntos y comas separando los valores numéricos, y la coma como símbolo decimal:
Para leer este archivo utilizaremos la función read_csv2()
(si el archivo estuviera en el estándar inglés usaríamos read_csv()
):
Para repetir la práctica 3 con estos nuevos datos, lo único que tenemos que hacer es abrir el archivo practica3.Rmd y buscar la linea donde se leía el archivo de datos:
La borramos y la sustituimos por la anterior.
Procesar el archivo de la practica 3 con los datos de todas las tortugas.
La práctica 3 se realizó con los datos de 20 nidos de tortugas. Una vez que hemos cambiado el archivo con los datos como se ha indicado en el punto anterior (en lugar de leer “datosP1-1920.xlsx”, ahora leemos “tortugas.csv”), podemos procesar de nuevo el archivo de la práctica (pinchando en el botón knit
en Rstudio) y se rehacen automáticamente todas las tablas y gráficos elaboradas en dicha práctica, de forma que ahora se obtienen resultados para los 1277 nidos que componían el estudio original. Aquí está el archivo .Rmd de la práctica 3 modificado, y aquí el resultado obtenido al procesarlo.
geom_hist()
Construye histogramas de las variables LCC, distancia y profNido.
La sintaxis para construir un histograma con ggplot es:
Obsérvese que solo hay que especificar en aes()
la variable cuyo histograma queremos construir. ggplot()
calcula automáticamente las alturas de las barras. La función que construye el histograma es geom_histogram()
y podemos especificar el color del borde de las barras (color
) y el color del relleno (fill
)
Representa la profundidad del nido frente a la distancia a la orilla, dando un color distinto a cada playa.
En este caso basta con indicar en la estética del gráfico (aes()
) que se va a asignar un color a cada playa:
Si queremos representar cada playa no solo con un color distinto, sino en una gráfica distinta, utilizaremos facet_wrap()
, indicando el número de columnas (ncol
) o de filas (nrow
) que queremos que salgan en la gráfica:
tortugas %>%
ggplot(aes(x=distancia,y=profNido,color=playa)) + geom_point() +
facet_wrap(~playa,ncol=2)
Construye una tabla de frecuencias con el número de nidos que hay en cada playa, así como con el porcentaje del total de nidos que representa cada playa.
En R hay varias funciones que permiten construir tablas de frecuencias. La función que mejor interactúa con el resto de funciones del tidyverse es la función tabyl()
del paquete janitor
. Para construir una tabla de frecuencias que nos indique cuántos nidos hay en cada playa procedemos del siguiente modo:
## playa n percent
## Calheta 196 0.1534847
## Ervatao 419 0.3281128
## Ponta Cosme 498 0.3899765
## Porto Ferreiro 164 0.1284260
Podemos mejorar, como siempre, la presentación de la tabla usando flextable()
:
playa | n | percent |
Calheta | 196 | 0.1534847 |
Ervatao | 419 | 0.3281128 |
Ponta Cosme | 498 | 0.3899765 |
Porto Ferreiro | 164 | 0.1284260 |
Como vemos, por defecto, la columna percent
muestra los datos en proporciones; si queremos que los muestre en forma de porcentaje, la librería janitor
ofrece la opción de utilizar la función adorn_pct_formatting()
. Además utilizamos a continuación el tema theme_box()
de la librería flextable()
que permite formatear la tabla de otra manera:
tortugas %>% tabyl(playa) %>%
adorn_pct_formatting() %>%
flextable() %>%
fontsize(size=14) %>%
autofit() %>%
theme_box()
playa | n | percent |
Calheta | 196 | 15.3% |
Ervatao | 419 | 32.8% |
Ponta Cosme | 498 | 39.0% |
Porto Ferreiro | 164 | 12.8% |
Si además utilizamos la función adorn_totals("row")
, nos añade una fila adicional a la tabla con el total de la suma de todas las filas anteriores:
tortugas %>% tabyl(playa) %>%
adorn_totals("row") %>%
adorn_pct_formatting()%>%
flextable() %>%
fontsize(size=14) %>%
autofit() %>%
theme_box()
playa | n | percent |
Calheta | 196 | 15.3% |
Ervatao | 419 | 32.8% |
Ponta Cosme | 498 | 39.0% |
Porto Ferreiro | 164 | 12.8% |
Total | 1277 | 100.0% |
ggplot
Representa el número de tortugas por playa en un diagrama de barras.
Para construir un diagrama de barras con ggplot
debemos usar uan geometría de columnas, geom_col()
. Para ello necesitamos partir de una tabla que contenga las frecuencias que queremos representar; si nos fijamos en la tabla construida en el punto anterior, la frecuencia observada para cada playa se recoge en la variable n
. El diagrama de barras se construye entonces mediante:
Como en la estética del gráfico hemos puesto fill=playa
, cada playa se pinta de un color distinto, y se genera una leyenda a la derecha con el color que corresponde a cada playa. En realidad la leyenda es prescindible, toda vez que el nombre de cada playa aparece ya debajo de cada columna. Como la leyenda corresponde al color de relleno fill
podemos eliminarla añadiendo guides(fill=FALSE)
. Si además queremos poner un título al gráfico y etiquetar los ejes con otros nombres, podemos usar la función labs()
:
tortugas %>% tabyl(playa) %>%
ggplot(aes(x=playa,y=n,fill=playa)) +
geom_col() +
guides(fill=FALSE) +
labs(x="Playa", y="Número de Nidos", title="Isla de Boavista: Número de nidos por playa")
Otro adorno que suele ser interesante para este tipo de gráficos, es añadir el valor numérico de la frecuencia encima de cada barra; para ello se usa la función geom_text()
:
tortugas %>% tabyl(playa) %>%
ggplot(aes(x=playa,y=n,fill=playa)) +
geom_col() +
geom_text(aes(label=n), vjust=1.5, col="white", fontface="bold") +
guides(fill=FALSE) +
labs(x="Playa", y="Número de Nidos", title="Isla de Boavista: Número de nidos por playa")
La gráfica anterior representa las frecuencias absolutas (número de observaciones); si queremos representar las frecuencias relativas (proporción de nidos en cada playa), basta con darse cuenta de que en la tabla de frecuencias la frecuencia relativa se recoge en la variable percent
, y lo único que habrá que hacer es indicar que la altura (y
) de cada barra viene dada por percent
, poniendo y=percent
en la declaración estética aes()
de la gráfica:
tortugas %>% tabyl(playa) %>%
ggplot(aes(x=playa, y=percent, fill=playa)) +
geom_col() +
geom_text(aes(label=percent), vjust=1.5, col="white", fontface="bold") +
guides(fill=FALSE) +
labs(x="Playa", y="Proporción de Nidos", title="Isla de Boavista: Número de nidos por playa")
Obviamente el valor numérico de las proporciones queda bastante feo en la gráfica anterior. Podemos arreglarlo mediante:
tortugas %>% tabyl(playa) %>%
ggplot(aes(x=playa,y=100*percent,fill=playa)) +
geom_col() +
geom_text(aes(label=sprintf("%.2f%%",100*percent)), vjust=1.5, col="white", fontface="bold") +
guides(fill=FALSE) +
labs(x="Playa", y="Porcentaje de Nidos", title="Isla de Boavista: Número de nidos por playa")
¿La presencia/ausencia de cangrejos en los nidos difiere entre las distintas playas? Construye una tabla cruzada de cangrejos frente a playa.
Para responder a esta pregunta debemos averiguar qué proporción de nidos están infestados de cangrejos en cada playa. Para ello podemos construir inicialmente una tabla que nos indique, para cada playa, cuántos nidos tienen cangrejos y cuántos no. Ello se consigue fácilmente con tabyl
:
## cangrejos Calheta Ervatao Ponta Cosme Porto Ferreiro
## 0 45 131 98 31
## 1 97 159 258 81
## NA 54 129 142 52
Si no queremos que nos muestre los valores perdidos (NA) correspondientes a nidos que no se revisaron y por tanto no se sabe si tienen o no cangrejos, usamos la opción show_na=FALSE
:
cangrejos | Calheta | Ervatao | Ponta Cosme | Porto Ferreiro |
0 | 45 | 131 | 98 | 31 |
1 | 97 | 159 | 258 | 81 |
Ahora, para calcular en cada playa qué proporción de nidos tienen cangrejos y qué proporción no los tienen, habremos de calcular la proporción por columnas en la tabla anterior; ello se consigue mediante adorn_percentages("col")
:
tortugas %>% tabyl(cangrejos,playa,show_na = FALSE) %>%
adorn_percentages("col") %>%
flextable() %>% autofit()
cangrejos | Calheta | Ervatao | Ponta Cosme | Porto Ferreiro |
0 | 0.3169014 | 0.4517241 | 0.2752809 | 0.2767857 |
1 | 0.6830986 | 0.5482759 | 0.7247191 | 0.7232143 |
Podemos añadir los porcentajes globales (para todas las playas), y mostrar los resultados en forma de porcentaje:
tortugas %>% tabyl(cangrejos,playa,show_na = FALSE) %>%
adorn_totals("col") %>%
adorn_percentages("col") %>%
adorn_pct_formatting() %>%
flextable() %>%
autofit() %>%
theme_vanilla()
cangrejos | Calheta | Ervatao | Ponta Cosme | Porto Ferreiro | Total |
0 | 31.7% | 45.2% | 27.5% | 27.7% | 33.9% |
1 | 68.3% | 54.8% | 72.5% | 72.3% | 66.1% |
Si queremos, además, que junto a cada porcentaje se muestre además el número de nidos a que corresponde ese porcentaje, usamos adorn_ns()
:
tortugas %>% tabyl(cangrejos,playa,show_na = FALSE) %>%
adorn_totals("col") %>%
adorn_percentages("col") %>%
adorn_pct_formatting() %>%
adorn_ns() %>%
flextable() %>%
autofit() %>%
theme_vanilla()
cangrejos | Calheta | Ervatao | Ponta Cosme | Porto Ferreiro | Total |
0 | 31.7% (45) | 45.2% (131) | 27.5% (98) | 27.7% (31) | 33.9% (305) |
1 | 68.3% (97) | 54.8% (159) | 72.5% (258) | 72.3% (81) | 66.1% (595) |
Representa gráficamente la tabla cruzada anterior.
Representar la tabla cruzada con ggplot es un poco más difícil, ya que ggplot
necesita que haya una única columna (variable) que contenga los valores de frecuencia, tal como hemos visto en el punto 6. Para ello lo único que hay que hacer es utilizar la función pivot_longer()
, que convierte datos de formato “ancho” a formato “largo”. La tabla en formato “ancho” es la que ya tenemos:
## cangrejos Calheta Ervatao Ponta Cosme Porto Ferreiro
## 0 45 131 98 31
## 1 97 159 258 81
y la tabla en formato “largo” se obtiene a partir de ésta mediante:
tortugas %>% tabyl(cangrejos,playa,show_na = FALSE) %>%
pivot_longer(cols =-1, names_to = "playa", values_to = "n")
## # A tibble: 8 x 3
## cangrejos playa n
## <dbl> <chr> <dbl>
## 1 0 Calheta 45
## 2 0 Ervatao 131
## 3 0 Ponta Cosme 98
## 4 0 Porto Ferreiro 31
## 5 1 Calheta 97
## 6 1 Ervatao 159
## 7 1 Ponta Cosme 258
## 8 1 Porto Ferreiro 81
En esta sintaxis le hemos indicado a R que pase a formato largo todas las columnas menos la primera (es lo que significa cols= -1), ya que la primera columna simplemente indica si hay o no cangrejos, pero no contiene ningún valor de frecuencia.
Ahora, para hacer la gráfica debemos convertir la variable cangrejos
en factor (ya que en otro caso R consideraría que es una variable numérica) y a continuación utilizar ggplot
y geom_col
indicando position="dodge"
si se quieren poner las columnas presencia/ausencia de cangrejos una junto a otra:
tortugas %>%
tabyl(cangrejos,playa,show_na = FALSE) %>%
pivot_longer(cols =-1, names_to = "playa", values_to = "n") %>%
mutate(cangrejos=factor(cangrejos,levels=c(0,1),labels=c("No","Si"))) %>%
ggplot(aes(x=playa, y=n, fill=cangrejos, color=cangrejos)) +
geom_col(position = "dodge")
También podemos poner las colummas presencia/ausencia de cangrejos una encima de otra utilizando position="stack"
:
tortugas %>%
tabyl(cangrejos,playa,show_na = FALSE) %>%
pivot_longer(cols =-1, names_to = "playa", values_to = "n") %>%
mutate(cangrejos=factor(cangrejos,levels=c(0,1),labels=c("No","Si"))) %>%
ggplot(aes(x=playa, y=n, fill=cangrejos, color=cangrejos)) +
geom_col(position = "stack")
Si en lugar de representar frecuencias absolutas queremos representar frecuencias relativas, utilizamos la tabla que contiene los datos en proporciones y la pasamos de formato ancho a formato largo; además creamos la variable porcentaje
multiplicando la proporción por 100:
tortugas %>%
tabyl(cangrejos,playa,show_na = FALSE) %>%
adorn_percentages("col") %>%
pivot_longer(cols =-1, names_to = "playa", values_to = "proporcion") %>%
mutate(porcentaje=100*proporcion)
## # A tibble: 8 x 4
## cangrejos playa proporcion porcentaje
## <dbl> <chr> <dbl> <dbl>
## 1 0 Calheta 0.317 31.7
## 2 0 Ervatao 0.452 45.2
## 3 0 Ponta Cosme 0.275 27.5
## 4 0 Porto Ferreiro 0.277 27.7
## 5 1 Calheta 0.683 68.3
## 6 1 Ervatao 0.548 54.8
## 7 1 Ponta Cosme 0.725 72.5
## 8 1 Porto Ferreiro 0.723 72.3
Y ahora creamos la gráfica del mismo modo que antes:
tortugas %>%
tabyl(cangrejos,playa,show_na = FALSE) %>%
adorn_percentages("col") %>%
pivot_longer(cols =-1, names_to = "playa", values_to = "proporcion") %>%
mutate(porcentaje=100*proporcion) %>%
mutate(cangrejos=factor(cangrejos,levels=c(0,1),labels=c("No","Si"))) %>%
ggplot(aes(x=playa, y=porcentaje, fill=cangrejos)) +
geom_col(position = "dodge")
Si queremos superponer el valor numérico del porcentaje a cada columna añadimos geom_text()
:
tortugas %>%
tabyl(cangrejos,playa,show_na = FALSE) %>%
adorn_percentages("col") %>%
pivot_longer(cols =-1, names_to = "playa", values_to = "proporcion") %>%
mutate(porcentaje=100*proporcion) %>%
mutate(cangrejos=factor(cangrejos,levels=c(0,1),labels=c("No","Si"))) %>%
ggplot(aes(x=playa, y=porcentaje, fill=cangrejos)) +
geom_col(position = "dodge") +
geom_text(aes(label=sprintf("%.2f%%",porcentaje)),
position=position_dodge(width=0.9),
vjust=1.5, col="white", fontface="bold") +
labs(fill="Presencia/Ausencia\n de Cangrejos")