---
title: "Introducción - Software R"
author:
  - Francisco Charte Ojeda - fcharte.com
  - Universidad de Jaén - DaSCI
date: "`r format(Sys.time(), '%d %B %Y')`"
output:
  html_notebook:
    toc: yes
subtitle: Seminario Permanente de Formación en Inteligencia Artificial Aplicada a
  la Defensa
---

## Introducción a R

### ¿Qué es R?

R es una herramienta y al mismo tiempo un lenguaje:

   * **Herramienta** - Programa software en el que introduciremos las órdenes para analizar los datos y generar los gráficos
   
   * **Lenguaje** - El conjunto de órdenes que entiende el software forman el lenguaje R
   
### ¿Qué es RStudio?

Una herramienta más cómoda a la hora de trabajar con el lenguaje R. Respecto al entorno de trabajo de R, RStudio nos ofrece:

   * Visualización de los gráficos integrada en el mismo entorno
   * Acceso cómodo a la ayuda electrónica sobre R
   * Un editor que nos permite guardar nuestro trabajo

En lugar de descargar e instalar RStudio, podemos ir a [RStudio Cloud](https://rstudio.cloud/), iniciar sesión con nuestra cuenta Google o crear una cuenta a medida y usar RStudio desde el navegador.

![El entorno de RStudio](figuras/EntornoRStudio.png)

### ¿Qué es un paquete en R?

R es una herramienta extensible. Las funciones que facilita el núcleo de R se pueden ampliar mediante **paquetes**. Los paquetes se instalan una única vez en el equipo, la primera vez que se necesitan, y luego se cargan cada vez que van a ser usados.

Para instalar un paquete usaremos la opción `Install Packages...` del menú `Tools` de RStudio, indicando el nombre del paquete que se necesita:

![Opción de instalación de paquetes](figuras/InstallPackage.png)

Alternativamente, se puede instalar un paquete desde la línea de comandos de R con el comando `install.packages()`, facilitando entre los paréntesis y entrecomillado el nombre del paquete.

Una vez que el paquete está instalado en el sistema, cada vez que vaya a usarse hay que cargarlo desde el disco al entorno de R. Para ello se usa el comando `library()`. En el siguiente ejemplo se carga el paquete para gráficos `ggplot2`, lo cual permite utilizar los comandos que hay dicho paquete:

```{r}
library(ggplot2)
```

### Realización de tareas habituales

Algunas de las tareas que necesitaremos llevar a cabo habitualmente en el entorno de RStudio:

   * **Cambiar la carpeta**: en el panel `Files` (parte inferior derecha del entorno) aparece en la parte superior la ruta de la carpeta actual. Podemos usar los botones para cambiarla. También se puede usar el comando `setwd()` en la consola de R para cambiar a la carpeta que se necesite. Por ejemplo:
   
```{r eval="FALSE"}
setwd("D:/FCharte/Clases/2019-2020/MADOC")  # Cambiar a la carpeta de trabajo
```
   
   * **Consultar la ayuda**: en el panel 'Help' se encuentran los elementos para acceder al índice y buscar cualquier tema en la documentación electrónica integrada. También podemos acceder a la misma desde la consola de R, con el comando `help()`.

   * **Cargar datos de un archivo de texto**: para trabajar con un conjunto de datos el primer paso es cargarlo en memoria. Asumiendo que los datos están en un archivo de texto, recurriremos a una de las siguientes alternativas:
   
      + **Formato CSV estándar**: los datos están separados por comas y se usa el punto decimal
      `read.csv("misdatos.csv")`
      
```{r eval=FALSE}      
cultivos <- read.csv("datos/cultivos.csv")
cultivos
```
      
      + **Formato CSV alternativo**: los datos están separados por punto y coma y se usa la coma decimal
      `read.csv2("misdatos.csv")`
      
      + **Separación con tabuladores**: si los datos están separados con tabuladores, como ocurre al pegar desde Excel al portapapeles
      `read.delim("misdatos.txt")`
      
  * **Cargar datos desde una hoja Excel**: en caso de que nuestros datos estén en una hoja Excel tenemos distintas alternativas para importarlos en R y trabajar con ellos:
  
     + **Mediante el portapapeles**: si tenemos los datos abiertos en Excel, esta es la vía más cómoda. El procedimiento consta de los pasos siguientes:
     
        1. Seleccionamos en Excel el rango de celdillas que contienen los datos que nos interesan
        1. Copiamos los datos al portapapeles 
        1. Cambiamos al entorno de R e introducimos en la consola el siguiente comando: `misdatos <- read.delim("clipboard")`
     
     + **Mediante el paquete xlsx**: si los datos están almacenados en un libro Excel que no tenemos abierto, podemos recurrir al siguiente procedimiento:
     
        1. Cargamos el paquete `xlsx` con el comando `library("xlsx")`. Si este comando falla es porque no tenemos instalado dicho paquete, en cuyo caso tendríamos que instalarlo primero.
        1. Usamos el comando `read.xlsx()` de dicho paquete para cargar los datos: `misdatos <- read.xlsx("libroexcel.xlsx", sheetName = "nombreHoja")`

```{r}
library(xlsx)

poblacion <- read.xlsx("datos/DatosPoblacion.xlsx", "HistoricoMundial", encoding = "UTF-8")
poblacion
```
        
  * **Obtener una lista de conjuntos de datos disponibles**: R incorpora multitud de conjuntos de datos de ejemplo con los que podemos trabajar. Para obtener una lista de ellos usaremos el comando `data()`. El nombre que aparece en la columna de la izquierda es el nombre del conjunto de datos, el que utilizaremos para trabajar con su contenido. En los ejemplos del punto anterior, al cargar datos externos, asignábamos el nombre `misdatos` a nuestro conjunto de datos.
  
  * **Obtener información de un conjunto de datos**: basta introducir `?nombre` en la línea de comandos para obtener información sobre los cambios de un conjunto de datos:
  
```{r}
?diamonds
```

  
## Análisis exploratorio de datos

En esta sección vamos a trabajar con uno de los conjuntos de datos de ejemplo que incorpora R: `iris`. En él se facilita información de distintas familias de lirios (flores). Veamos cómo explorar ese conjunto de datos para obtener una visión general de su contenido.

### Estructura del conjunto de datos
```{r}
str(iris)  # Resumen de la estructura
ncol(iris) # Cantidad de columnas
nrow(iris) # Cantidad de filas
colnames(iris) # Nombres de las columnas
head(iris) # Ver algunas filas del inicio del conjunto de datos
tail(iris) # Ver algunas filas del final del conjunto de datos
iris$Sepal.Width # Ver todos los valores de una de las columnas
```

### Obtención de estadísticos básicos
```{r}
min(iris$Sepal.Width) # Valor mínimo de Sepal.Width
max(iris$Sepal.Width) # Valor máximo de de Sepal.Width
mean(iris$Sepal.Width) # Media de Sepal.Width
median(iris$Sepal.Width) # Mediana de Sepal.Width
var(iris$Sepal.Width) # Varianza de Sepal.Width
sd(iris$Sepal.Width) # Desviación de Sepal.Width
```

### Estadística descriptiva de todo el conjunto de datos
```{r}
summary(iris)
```

### Cálculo del coeficiente de correlación
```{r}
cor(iris$Petal.Length, iris$Petal.Width) # Pearson entre Petal.Length y Petal.Width
```

### Tabla de contingencia de dos variables
```{r}
table(iris$Petal.Width, iris$Species)
```

## La importancia de visualizar los datos
Los indicadores estadísticos resumen un gran conjunto de datos en unos pocos valores, lo cual **implica pérdida de información** que puede resultar de importancia.

![La métafora de los pollos](figuras/Pollos.jpg)

### El conjunto de datos `anscombe`
Este conjunto de datos son realmente cuatro subconjuntos formados por parejas `x`-`y`. Usemos alguno de los comandos de R que hemos conocido para explorar sus características. La función `round()` redondea el resultado: las medias, varianzas, etc., al número de decimales indicado.

```{r}
str(anscombe)  # Estructura del conjunto de datos

round(c(mean(anscombe$x1), 
        mean(anscombe$x2), 
        mean(anscombe$x3), 
        mean(anscombe$x4)),1) # Medias de las X

round(c(mean(anscombe$y1), 
        mean(anscombe$y2), 
        mean(anscombe$y3), 
        mean(anscombe$y4)),1) # Medias de las Y

round(c(var(anscombe$x1), 
        var(anscombe$x2), 
        var(anscombe$x3), 
        var(anscombe$x4)),1) # Varianzas de las X

round(c(var(anscombe$y1), 
        var(anscombe$y2), 
        var(anscombe$y3), 
        var(anscombe$y4)),1) # Varianzas de las Y

round(c(cor(anscombe$x1, anscombe$y1),   # Coeficientes de correlación
  cor(anscombe$x2, anscombe$y2), 
  cor(anscombe$x3, anscombe$y3), 
  cor(anscombe$x4, anscombe$y4)), 2)

lm(anscombe$y1 ~ anscombe$x1)   # Línea de regresión
lm(anscombe$y2 ~ anscombe$x2)
lm(anscombe$y3 ~ anscombe$x3)
lm(anscombe$y4 ~ anscombe$x4)

```

A la vista de estos resultados, podríamos concluir que los subconjuntos de datos `(xN, yN)` siguen todos la misma distribución y, por tanto, su población es básicamente idéntica. ¿SEGURO?

### Visualización de las muestras de datos
La vía más efectiva y rápida, y en ocasiones la única, para comprobar si las muestras de datos tienen una distribución similar es la visualización. 

```{r}
plot(anscombe$x1, anscombe$y1)
plot(anscombe$x2, anscombe$y2)
plot(anscombe$x3, anscombe$y3)
plot(anscombe$x4, anscombe$y4)

```

Como es fácil apreciar, la distribución de estos cuatro subconjuntos de datos son totalmente distintas, de ahí la importancia de visualizar los datos y no confiar únicamente en los indicadores estadísticos.

## Visualización básica de datos
La visualización es una herramienta **esencial en el análisis exploratorio** de datos. No obstante existen multitud de tipos de visualización distintos y no todos sirven en todos los casos. Al que tiene un martillo todo le parecen clavos, pero es importante **elegir la herramienta adecuada** a cada trabajo. Dependiendo de los datos y de la información que se quiera analizar en los mismos, será preciso seleccionar el tipo de visualización adecuado. 

### Gráfica de dispersión (*scatter plot*)
Nos permite examinar la posición de los individuos en el plano (2D) o espacio (3D).

```{r}
plot(iris$Petal.Length, iris$Petal.Width, col=iris$Species,  pch = 19,
     xlab = 'Longitud del pétalo', ylab = 'Ancho del pétalo')

title(main = 'IRIS', 
      sub = 'Exploración de los pétalos según especie', 
      col.main = 'blue', col.sub = 'red')

legend("bottomright", legend = levels(iris$Species),
       col = unique(iris$Species), ncol = 3, pch = 19, bty = "y")
```

El comando `plot()` forma parte de la instalación básica de R, pero hay paquetes que ofrecen gráficos de mayor calidad. Uno de ellos es `ggplot2`.

```{r}
library(ggplot2)

ggplot(iris, aes(x = Petal.Length, y = Petal.Width)) + 
  geom_point(aes(colour=Species, size = Sepal.Width))
```

Con el paquete `scatterplot3d` podemos usar el comando del mismo nombre, capaz de representar los puntos en 3D en lugar de un plano:

```{r}
library(scatterplot3d)

scatterplot3d(iris$Petal.Length, iris$Petal.Width, iris$Sepal.Length, 
              col.axis = "blue", color = as.numeric(iris$Species),
              col.grid = "lightblue", main = "IRIS", pch = 19)

```

### Gráfica de dispersión con densidad (*hexbin*)
En ocasiones una gráfica de dispersión puede ocultar información si hay mucho solapamiento entre los puntos:

```{r}
ggplot(diamonds, aes(x=carat, y=price)) + geom_point() + labs(x = "Peso", y = "Precio")
```

En estos casos se puede recurrir a un método que consiste en dividir la gráfica en hexágonos, contar el número de puntos que hay en su interior y colorear según la densidad:

```{r}
ggplot(diamonds, aes(x=carat, y=price)) + stat_binhex() + labs(x = "Peso", y = "Precio")
```

### Gráficas de líneas y barras
Las gráficas de líneas deben utilizarse exclusivamente para analizar la evolución de una magnitud respecto a otra. Por ejemplo:

```{r}
ggplot(economics, aes(x=date, y=pop)) + geom_line() + labs(x = "Año", y = "Población")
```

Cuando lo que interesa no es la evolución en sí, sino la relación (comparación) entre cada entrada en el eje X y la altura en el eje Y, habitualmente es mejor usar una gráfica de barras:


```{r}
ggplot(diamonds, aes(cut)) + geom_line(aes(group="cut"), stat="count") + 
  labs(x = "Tipo de corte", y = "Cantidad")
ggplot(diamonds, aes(cut)) + geom_bar() + labs(x = "Tipo de corte", y = "Cantidad")
```

Es posible comparar más de una magnitud simultáneamente, agrupando las barras según los valores de una variable:

```{r}
ggplot(mpg, aes(cyl, hwy, fill=class)) + scale_fill_brewer() +
  geom_bar(stat="identity", position="dodge")
```

Asimismo, podemos introducir varias líneas en una misma gráfica para representar la evolución de dos magnitudes:

```{r}
ggplot(economics, aes(x=date)) + geom_line(aes(y=pop)) + geom_line(aes(y=unemploy))
```


#### Ajustes visuales sobre gráficas de líneas y barras
+ Podemos personalizar la apariencia de una gráfica de líneas con los siguientes parámetros:

    * `colour`: establece el color de la línea. Ejemplos: `colour = "red"` `colour = class`
    * `size`: establece el grosor de la línea. Ejemplos: `size = 1` `size = cyl`
    * `linetype`: establece el tipo de trazo. Ejemplos: `linetype = 3` `linetype = "dashed"`
    * `arrow`: permite agregar flechas a las líneas: Ejemplo: `arrow = arrow()`
  
```{r}
ggplot(economics, aes(x=date)) + 
  geom_line(aes(y=pop), linetype="solid", size=2, color="blue", arrow = arrow()) + 
  geom_line(aes(y=unemploy), linetype = "dashed", color = "red")
```

+ Podemos personalizar la apariencia de una gráfica de barras con los siguientes parámetros:

    * `width`: establece el ancho relativo de las barras. Ejemplo: `width = 0.5`
    * `colour`: establece el color del borde de las barras. Ejemplo: `colour="blue"
    * `fill`: establece el color de relleno de las barras. Ejemplo: `fill="red"`
    * `coord_flip()`: no es un parámetro, sino un objeto que se agrega para cambiar la orientación de las barras
    
    
```{r}
ggplot(diamonds, aes(cut)) + 
  geom_bar(colour="blue", fill="green", width=0.5) + 
  coord_flip() + labs(x = "Tipo de corte", y = "Cantidad")
```

## Cantidades que forman parte de un todo
Cuando las magnitudes que están comparándose en una gráfica conforman un todo, podemos optar por otro tipo de representación que denote esa idea. La primera opción, para una única serie de datos, sería una gráfica de tarta o bien una barra apilada:

```{r}
grafica <- ggplot(diamonds, aes("", fill=cut)) + 
  labs(x="Tipo de corte", y="Cantidad")   # Gráfica con los datos básicos

grafica + geom_bar() + coord_polar("y")  # Gráfica de tarta

grafica + coord_polar("y") +  # Gráfica de tarta con porcentaje y esquema de color
  geom_bar(aes(y = (..count..)/sum(..count..)*100)) + 
  scale_fill_brewer(palette="Blues") +  theme_minimal()

grafica + geom_bar()   # Barra apilada básica

grafica + geom_bar(aes(y = (..count..)/sum(..count..)*100))   # Barra con porcentaje en lugar de cuenta
```

Esta técnica puede combinarse con la representación de múltiples series de datos, cada una de ellas como una barra apilada:

```{r}
ggplot(diamonds, aes(cut)) + geom_bar(aes(fill=color))
ggplot(diamonds, aes(cut)) + geom_bar(aes(fill=color), position = "fill")
```

La apariencia de la gráfica puede personalizarse con los atributos enumerados anteriormente, cambiando la orientación, colores, ancho de las barras, etc.

```{r}
ggplot(diamonds, aes(cut)) + 
  geom_bar(aes(fill=clarity), colour="blue", width=0.5) + 
  coord_flip() + labs(x = "Tipo de corte", y = "Cantidad")

```

## Análisis de la distribución de los datos
En ocasiones trabajaremos con una o más series de datos y lo que nos interesará no será hacer comparaciones o analizar la evolución, sino estudiar cómo se distribuyen esas muestras y **comparar las distribuciones**. Con este fin recurriremos habitualmente a dos tipos de representaciones: los diagramas de cajas y bigotes y los histogramas.

### Diagrama de cajas y bigotes (*boxplot*)
Sirven para obtener los estadísticos esenciales de la distribución de un conjunto de valores. Podemos generar este tipo representación con el comando `boxplot()` o bien con `ggplot()`, como otros tipos de gráficas.

```{r}
boxplot(iris) # Distribución de cada una de las variables
boxplot(iris$Sepal.Length ~ iris$Species) # Distribución de una variable agrupada según los valores de otras
```


```{r}
ggplot(iris, aes("", Sepal.Width)) + geom_boxplot()
ggplot(iris, aes(Species, Sepal.Width)) + geom_boxplot()
```

Podemos superponer a los diagramas de cajas y bigotes la posición que ocupe cada integrante de la muestra:

```{r}
ggplot(iris, aes(Species, Sepal.Width)) + geom_boxplot() + geom_jitter()
```


#### Ajustes visuales de un diagrama de cajas y bigotes
* Podemos personalizar la apariencia de algunos de los elementos de este tipo de gráfica con los siguientes parámetros:

    + `color` y `fill`: establecen el color de borde y relleno de las cajas
    + `outlier.colour` y `outlier.size`: establecen el color y tamaño de los casos extremos (*outliers*)
    + `coord_flip()`: al igual que con las gráficas de barras, podemos girar los ejes de coordenadas
    + `notch`: por defecto es `FALSE`. Asignándole `TRUE` se dibujará el intervalo de confianza de la mediana
    
```{r}
ggplot(iris, aes(Species, Sepal.Width)) + 
  geom_boxplot(aes(fill=Species), color = "blue", outlier.colour = "red", notch = TRUE) +
  coord_flip()
```

### Histogramas
Se utilizan para **agrupar los valores** de una muestra de datos **en intervalos** y representar la frecuencia de cada intervalo, facilitando así el análisis de la distribución subyacente.

```{r}
hist(rnorm(1000))  # Histograma de una distribución normal
hist(diamonds$price) # Histograma del precio de los diamantes

ggplot(diamonds, aes(price)) + geom_histogram(color="black") # Alternativa con ggplot

```

El número de divisiones (*bins*) en que se agrupan los valores es configurable. Usaremos `breaks` en el caso del comando `hist()` y `bins` con ggplot. También podemos establecer títulos de los ejes y color de las barras:

```{r}
hist(diamonds$price, breaks=40, 
     xlab="Precio", ylab = "Cantidad", main="Diamantes", col = "yellow")

ggplot(diamonds, aes(price)) + 
  geom_histogram(bins = 40, color="black", fill="yellow") +
  labs(title = "Diamantes", x = "Precio", y = "Cantidad")

```

Es posible ajustar el color de las barras de forma individual, por ejemplo usando una gama de colores concreta, estableciendo el color en función del valor representado o incluso estableciendo criterios a medida:

```{r}
hist(diamonds$price, breaks=40, col=topo.colors(10), main="Diamantes", xlab="Precio")

ggplot(diamonds, aes(price)) + 
  geom_histogram(bins = 40, color="black", aes(fill=..count..)) + 
  scale_fill_gradient("Count", low = "blue", high = "red")

histograma <- hist(diamonds$price, breaks = 100)
plot(histograma, col = 
       ifelse(histograma$breaks < 2500, 'green', 
              ifelse(histograma$breaks > 10000,  "red", "blue")), 
     main = 'Diamantes', xlab = 'Precio')

```

### Curva de densidad
Una representación alternativa de la distribución de un conjunto de valores es la curva de densidad. En esta no se dibujan barras, como en el caso del histograma, sino una línea continua que denota la densidad en cada punto de la escala X:

```{r}
plot(density(diamonds$price))

ggplot(diamonds, aes(price)) + geom_density() 
  
```

Podemos superponer la curva de densidad al histograma:

```{r}
ggplot(diamonds, aes(price)) + 
  geom_histogram(color="black", aes(y=..density..))  + 
  geom_density(color="green", size=2, alpha=0.5)
```


Este tipo de gráfica permite representar simultáneamente la distribución de varias variables, por ejemplo agrupando los precios según el tipo de corte:

```{r}
ggplot(diamonds, aes(price, fill=cut)) + 
  geom_density(alpha=0.25) 

```

## 7. Gráficas avanzadas
Las posibilidades gráficas en R son muy extensas, habiendo disponibles **varias decenas de paquetes** que, como `ggplot`, ofrecen un extenso conjunto de comandos para elaborarlas. A continuación aprenderemos a usar algunas de ellas.

### Combinación de múltiples gráficas
La posibilidad de combinar en una misma imagen múltiples gráficas facilita la comparación visual rápida, por ejemplo entre distintas variables.


```{r}
plot(iris[ ,-5], col = iris$Species)

ggplot(iris, aes(Sepal.Length, Sepal.Width)) + 
  geom_point() + facet_wrap(~Species)

grafica <- ggplot(diamonds, aes(price)) + 
  geom_histogram(bins=20, color="black", fill="yellow") + 
  scale_x_log10()
  
grafica + facet_wrap(~cut, scales = "free_y")
grafica + facet_grid(color~cut, scales = "free_y")  


par(mfrow=c(2,2))

plot(iris$Sepal.Length, iris$Sepal.Width, col=iris$Species)
barplot(iris$Sepal.Length[1:25])
boxplot(iris)
hist(iris$Sepal.Length)

```

### Representación de relaciones
Las gráficas circulares conocidas como tipo *circos* facilitan la visualización de porcentajes y relaciones entre variables:

```{r}
library(circlize) # Cargamos el paquete necesario para esta gráfica

HairEyeColor # Examinamos el dataset HairEyeColor

# Podemos traducir las denominaciones
attr(HairEyeColor,"dimnames")$Eye <- c("Marrones", "Azules", "Avellana", "Verdes")  
attr(HairEyeColor,"dimnames")$Hair <- c("Negro", "Castaño", "Pelirrojo", "Rubio")  

chordDiagram(HairEyeColor[,,2])

mosaicplot(HairEyeColor)
```

### Comparación de diferentes alternativas atendiendo a varios criterios
En ocasiones se cuenta con diferentes vías para solucionar un mismo problema y la calidad de cada una de ellas puede evaluarse con distintos criterios, lo cual dificulta el análisis y selección de la mejor opción. La gráfica de tipo *radar* o *spider* está pensada para estos casos.

```{r}
library('fmsb')  # Cargamos el paquete donde está el comando

dat <- data.frame(    # Simulamos tres métodos con cinco criterios de evaluación
  Prec = runif(3, 0, 1),
  Accu  = runif(3, 0, 1),
  Reca    = runif(3, 0, 1),
  AUC       = runif(3, 0, 1),
  Kapp     = runif(3, 0, 1)
  )
rownames(dat) <- c("SVM", "C4.5", "MLP")

radarchart(dat, maxmin = FALSE) # Dibujamos la gráfica

# Agregamos una leyenda para indicar los criterios
legend("bottomleft", rownames(dat),
       col = c('black', 'green', 'red'),
       lty = 1:3, lwd = 2, ncol = 1)
```

Alternativamente, también podría utilizarse una gráfica de tipo *heatmap*. Esta es una matriz en la que se representan todos los posibles valores, asignando un color a cada celdilla en función del valor correspondiente:

```{r}
heatmap(as.matrix(dat), scale="column", Colv=NA, Rowv=NA)
```


### Representación gráfica de funciones
R es capaz de representar cualquier función matemática, ya sea una función incluida en R o cualquier otra que podamos necesitar siempre que la definamos de forma adecuada. Los siguientes son algunos ejemplos:

```{r}
# Curva a partir de funciones existentes (sin y cos)
curve(sin, from = -4, to = 4, col = 'blue', lty = 'dotted', lwd = 2,
      ylab='sin(x) vs cos(x)', xname = "Valores de entrada")
curve(cos, from = -4, to = 4, col = 'cyan', lty = 'dashed', lwd = 2, add = TRUE)
legend("topleft", c("sin(x)", "cos(x)"), col = c('blue', 'cyan'),
       lty = c('dotted','dashed'), lwd = 2, ncol = 2)

# Curva del valor absoluto
curve(abs, from = -10, to = 10)

# Curvas a partir de polinomios
curve(x^2 - x, lty = 3, lwd = 2, from = -10, to = 10)
curve(x^3 - x^2 + 1, lty = 2, lwd = 2, from = -10, to = 10, add = TRUE)

# A partir de una función parámetrica definida por el usuario
heart <- function(t) {
  x <- 16 * sin(t)^3
  y <- 13 * cos(t) - 5 * cos(2*t) - 2 * cos(3*t) - cos(4*t)
  c(x,y)
}

mpoints <- matrix(sapply(seq(0,2*pi,0.1), heart), ncol = 2, byrow = TRUE)
plot(mpoints)
lines(mpoints)
```

### Geometría con gráficos de tortuga
Incluso podemos generar gráficos con geometrías definidas algorítmicamente acorde con el lenguaje Logo, conocidos como gráficos de tortuga:

```{r}
library('TurtleGraphics')

turtle_init()
turtle_do({
  for(j in 1:45) {
    for(i in 1:6) {
      turtle_forward(20)
      turtle_right(360/6)
    }
    turtle_right(360/45)
  }
})

```

## 8. Almacenamiento de las gráficas
Tras generar una gráfica lo habitual es que nos interese guardarla en algún formato a fin de, posteriormente, imprimirla o incluirla en algún estudio. El panel `Plots` de RStudio, en el que han ido apareciendo las gráficas de los ejercicios, cuenta con un menú `Export` desde el que podemos guardar la gráfica actual tanto en formato PDF como en distintos formatos gráficos.

![El panel para guardar una gráfica](figuras/SavePlot.png)

La mayoría de formatos gráficos son estáticos, por lo que únicamente permiten mostrar una configuración concreta de la información representada. Algunos de ellos, sin embargo, contemplan el uso de *animaciones*. Con el comando `saveGIF()` del paquete `animation` podemos generar una gráfica animada, mostrando cómo cambia la función representada en función de algún parámetro de entrada. En lugar de `saveGIF()` podemos utilizar el comando `saveVideo()` para generar un vídeo MPEG.

```{r}
library(animation)

saveGIF({
  for(lim in seq(-3.14,3.14,by=0.1))
    curve(sin, from=lim,  to=lim + 9)
}, movie.name="animacion.gif", interval=0.2, ani.width=640, ani.height=640)

```
![Animación producida por el código previo](figuras/animacion.gif)

## 9. Ejercicio

Para finalizar nuestro aprendizaje de R y la forma de usarlo para analizar y visualizar datos se propone realizar el ejercicio que se describe a continuación. Los resultados se resumirán en un _notebook_ R que nos servirá como material útil posteriormente, a la hora de recordar cómo realizar cualquier tarea.

1. Instalación del software

    * [Descarga la versión de R](https://cran.rediris.es/) apropiada para el sistema operativo que tenga tu ordenador: Windows, OS X o GNU/Linux, y completa la instalación
    
    * [Descarga la versión de RStudio](https://www.rstudio.com/products/rstudio/download) apropiada para el sistema operativo de tu ordenador y completa la instalación
    
    * Inicia RStudio e instala al menos el paquete `ggplot2`
    
    * Comprueba que todo funciona perfectamente generando alguna gráfica básica con el conjunto de datos `iris`
    
2. Carga/Selección de los datos

    * Selecciona algún **conjunto de datos propio** relacionado con tu actividad o investigación. Si los datos están en un archivo de texto o una hoja de Excel, usa los comandos explicados en la primera sección. Si están en algún otro formato/aplicación, puedes consultarnos sobre cómo importarlos en R
    
    * Si no cuentas con datos propios, usa el comando `data()` de R para obtener una lista de conjuntos de datos y selecciona uno o dos que te resulten interesantes
    
3. Estadística descriptiva

    * Recopila los estadísticos básicos de las variables con que cuente tu conjunto de datos y lleva a cabo un pequeño análisis de la distribución que parecen seguir: ¿es similar para algunas variables? ¿hay correlación entre algunas de ellas?
    
4. Generación de gráficas

    * Dependiendo de lo que te interese de los datos con que trabajas: analizar la evolución de una variable respecto a otra, compararlas, etc., genera las gráficas que creas adecuadas
    
    * Guarda las gráficas en archivos a fin de poder incluirlas en el documento a entregar
    
5. Análisis de la distribución de los datos

    * Agrega a las gráficas previas algunas específicas para estudiar la distribución de las variables que creas adecuadas: diagrama de cajas y bigotes o histogramas
    
    * Guárdalos también para incluirlos en el documento
    
6. Completar el documento

    * Completa el documento con las explicaciones que consideres necesarias, en todo caso someras, sobre los aspectos de interés o conclusiones que obtengas
    