---
title: 'Práctica 2. Estadística Descriptiva con R'
subtitle: 'Medidas descriptivas y creación de nuevas variables'
output:
html_document:
highlight: pygments
theme: cerulean
toc: yes
toc_float: yes
word_document:
toc: yes
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, eval=TRUE, message=FALSE)
```
---
\
\
\
## Objetivos
1. Continuar utilizando las funciones del conjunto de librerías [__tidyverse__](https://www.tidyverse.org/) para la manipulación y análisis de datos, en particular:
* `summarise()`: para resumir variables mediante diversos estadísticos descriptivos.
* `summarise_at()`: para obtener resúmenes estadísticos aplicados a determinadas variables.
* `mutate()`: para la creación de nuevas variables.
2. Familiarizarse con las funciones para el cálculo de estadísticos descriptivos básicos:
* Media Aritmética: `mean()`
* Desviación típica: `sd()`
* Mediana: `median()`
* Máximo y mínimo: `max()` y `min()`
3. Conocer la librería `moments()` para el cálculo de medidas de forma como la asimetría y el apuntamiento.
\
\
\
\
## 0. Preliminares: carga de las librerías que utilizaremos en esta práctica, y lectura del archivo de datos.
```{r}
library(readxl)
library(tidyverse)
library(flextable)
library(moments)
```
```{r}
tortugas <- read_excel("datosP1-1920.xlsx")
```
\
\
## 1. Cálculo de múltiples medidas descriptivas mediante `summarise`.
__Calcula el número de observaciones, la media, desviación típica, Asimetria, Curtosis, mínimo, máximo y Mediana de la variable LCC (NOTA: asimetría y curtosis están en library(moments)).__
```{r}
tortugas %>%
summarise(n(),
mean(LCC),
sd(LCC),
skewness(LCC),
kurtosis(LCC),
min(LCC),max(LCC),
median(LCC))
```
\
__Importante:__ nótese que hemos puesto `LCC` como argumento en todas las funciones menos en `n()`. Ello es debido a que la función `n()` en realidad no cuenta el número de valores de `LCC` sino el número de filas del data.frame sobre el que se está ejecutanto el `summarise` (en este caso, tortugas), que tiene 20 filas. Si escribiéramos `n(LCC)` R nos devolvería un error:
```{r error=TRUE}
tortugas %>% summarise(n(LCC))
```
\
\
\
## 2. Mejora de la presentación
__Presenta los resultados anteriores asignando un nombre a cada columna y conviértelos en una tabla (usando `flextable()`). Ajusta el ancho de columna con `autofit()` y el número de dígitos decimales con `colformat_num(digits=2)`. Por último asigna nombre a la tabla con `set_caption()`.__
```{r}
tortugas %>%
summarise(media=mean(LCC),
sd=sd(LCC),
asimetria=skewness(LCC),
apuntamiento=kurtosis(LCC),
minimo=min(LCC),
mediana=median(LCC),
maximo=max(LCC)) %>%
flextable() %>%
colformat_num(digits=2) %>%
fontsize(size=12,part="all") %>%
autofit() %>%
set_caption("Descripción de la variable LCC")
```
\
\
\
## 3. Creación de una nueva variable utilizando `mutate()`.
__Se puede obtener un valor aproximado de la superficie (en $m^2$) del caparazón mediante la siguiente expresión:__
$$ Sup = \pi \cdot \left(\frac{LCC+ACC}{400}\right)^2$$
__Calcula la superficie aproximada de los caparazones de las tortugas de la muestra.__
\
La función `mutate()` permite crear una nueva variable. Su sintaxis es de la forma:
```{r eval=FALSE}
tortugas %>%
mutate(superf=pi*((LCC+ACC)/400)^2)
```
De esta forma R calcula los valores de `superf` para cada tortuga de la muestra y nos los enseña por pantalla. Si simplemente quisiéramos calcular la superficie media de todos los caparazones, podríamos ejecutar:
```{r}
tortugas %>%
mutate(superf=pi*((LCC+ACC)/400)^2) %>%
summarise(mean(superf))
```
\
Es importante señalar que la nueva variable `superf` __no se ha guardado en ningún sitio__. Si queremos guardar esta nueva variable dentro del data.frame `tortugas` para reutilizarla más adelante en nuestro análisis de los datos, deberemos reasignar el resultado del `mutate()` de nuevo a `tortugas` del modo siguiente:
```{r}
tortugas <- tortugas %>%
mutate(superf=pi*((LCC+ACC)/400)^2)
```
Esta sintaxis puede leerse de la forma:
> _"En `tortugas` metemos el resultado (`<-`) de coger el data.frame `tortugas` transformándolo (` %>% mutate`) mediante la creación de una nueva variable `superf` calculada como `pi*((LCC+ACC)/400)^2`"_
Podemos comprobar que ahora el data.frame `tortugas` tiene una variable más ejecutando:
```{r}
View(tortugas)
```
lo que nos mostrará todas las variables en Rstudio:

\
\
\
## 4. Uso de listas de funciones en `summarise()`
__Describe la variable anterior mediante las mismas medidas descriptivas de la pregunta 1 de esta práctica. Simplifica dicha descripción creando una lista de funciones.__
\
Podemos crear fácilmente una lista de las funciones que queremos aplicar mediante:
```{r}
listaFunciones=list(n=n,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
```
Y ahora, para aplicar esta lista de funciones a la variable `superf` ejecutamos:
```{r error=TRUE}
tortugas %>%
summarise_at(vars(superf), listaFunciones)
```
Como vemos, R nos ha devuelto el error unused argument (superf) . ¿A qué se debe este mensaje? Recordemos que en la pregunta 1 vimos que la función `n()` no puede recibir ningún argumento. El mensaje de error que estamos viendo se debe precisamente a que cuando se ha pasado la variable `superf` a la lista de funciones, hay una función de esa lista (la función `n()`) que recibe un argumento (`superf`) que no usa.
Podemos sustituir la función `n()` por la función `length()` que sí que nos da la longitud (número de valores) de la variable a la que se aplique:
```{r}
listaFunciones=list(n=length,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(superf), listaFunciones) %>%
flextable() %>% autofit()
```
\
\
__Nota 1:__ Dentro de `vars()` se pueden especificar varias variables, y R aplicaría la lista de funciones a cada una de ellas, si bien la presentación del resultado no es demasiado elegante:
```{r}
tortugas %>%
summarise_at(vars(LCC,ACC), listaFunciones) %>%
flextable()
```
\
\
__Nota 2:__ En R los valores perdidos se denotan mediante `NA`. La función `length()` cuenta el número de valores que tiene una variable, incluyendo los perdidos. En la próxima práctica veremos como construir una función que cuente el número de valores válidos y perdidos que tiene una variable.
\
\
\
\