2018-09-04

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 2.2.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 2.2. Utiliza el conjunto de datos Income (renta). A la izquierda los puntos rojos representan los valores observados de renta (en miles de dólares) y los años de educación de 30 individuos. A la derecha la curva azul representa la verdadera relación subyacente entre la renta y los años de educación, que es generalmente desconocida (pero es conocida en este caso porque los datos fueron simulados). Las líneas negras representan el error asociado con cada observación. Hay errores positivos (si la observación se sitúa por encima de la curva azul) y negativos (si la observación se sitúa por debajo de la curva). En total, la media de estos errores es aproximadamente cero.

Solución

Necesitamos crear un nuevo data frame, en el que añadimos una nueva columna con los valores ajustados calculado por el modelo usado por ggplot2 (el método loess es usado para menos de 1.000 observaciones)

library(ggplot2)
library(cowplot)
income_1 <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Income1.csv")

# Gráfico A
p1 <- ggplot(income_1, aes(x= Education, y = Income)) + 
  geom_point()+
  geom_smooth()

# Gráfico B
mod <- loess(Income ~ Education, data = income_1)
income <- transform(income_1, fitted = fitted(mod))
p2 <- ggplot(income, aes(x= Education, y = Income)) + 
  geom_point(colour = "red")+
  geom_smooth(se = FALSE)+
  geom_segment(aes(x = Education, y = Income,
                   xend = Education, yend = fitted))

# Ambos gráficos
theme_set(theme_grey()) # Mantiene theme_grey
plot_grid(p1, p2 , labels = "AUTO")

Entradas relacionadas

Referencias

2018-09-02

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 2.1.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 2.1. Utilizan el conjunto de datos Advertising. El gráfico representa las ventas en unidades de mil como una función de los presupuestos de televisión, radio o prensa, para 200 mercados. En cada gráfico se muestra la recta de regresión lineal que mejor se ajusta para las ventas y cada variable, descrito en el capítulo 3 del libro. En otras palabras, cada línea azul representa un modelo simple que puede ser usado para predecir las ventas usando la televisión, radio o prensa respectivamente.

Solución

library(tidyr)
library(ggplot2)
ad <- read.csv("http://www-bcf.usc.edu/~gareth/ISL/Advertising.csv")
ad_long <-  gather(ad, media, budgets,  TV:newspaper, factor_key = TRUE)
ggplot(ad_long, aes(x = budgets, y = sales, colour = media)) +
  geom_point()
ggplot(ad_long, aes(x = budgets, y = sales)) +
  geom_point() +
  facet_grid( ~ media, scales = "free") +
  geom_smooth(method = "lm")

Entradas relacionadas

2018-08-31

Gráficos de An Introduction to Statistical Learning con ggplot2 y plotly - Figura 1.4. interactiva

Problema

Queremos añadir interactividad al gráfico creado en la entrada anterior, el gráfico de la derecha de la figura 1.4 del libro An Introduction to Statistical Learning. El gráfico representa el conjunto de datos NCI-60, cada tipo de cáncer con un color y símbolo diferente. Las observaciones que corresponden al mismo tipo de cáncer tienden a estar cerca em este espacio bidimensional.

Solución

Empleamos el paquete plotly que permite crear gráficos interactivos en la web. En concreto la función de ggplotly que convierte un objeto ggplot2 en un objeto plotly.

# Librerías y datos NCI60 
library(ISLR)
library(tidyverse)
library(plotly)
nci.labs <- NCI60$labs
nci.data <- NCI60$data
pr.out <- prcomp(nci.data, scale = TRUE)

# Gráfico 2
df2 <- data.frame(pr.out$x[, 1:2], nci.labs)
p2 <- ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  theme_bw()+
  theme(legend.position="none")

# Interactividad
ggplotly(p2)

Entradas relacionadas

2018-08-30

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 1.4.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning. En esta ocasión replicaremos los gráficos de la figura 1.4. Se trata de dos diagramas de dispersión del conjunto de datos NCI-60 y cada observación representa una de las 64 líneas celulares (cell lines) correspondientes a un tipo de cáncer. A la izquierda, representados dos vectores de análisis de componentes principales. Parece haber 4 grupos de observaciones que separamos por colores. A la derecha, el mismo gráfico de la izquierda pero representados cada tipo de cáncer con un color y símbolo diferente. Las observaciones que corresponden al mismo tipo de cáncer tienden a estar cerca en este espacio bidimensional.

Solución con ggplot2

# Librerías y datos NCI60 
library(ISLR)
library(tidyverse)
nci.labs <- NCI60$labs
nci.data <- NCI60$data

# Análisis de componentes principales (ACP o PCA) con NCI60 
pr.out <- prcomp(nci.data, scale=TRUE)

# Gráfico 1
df1 <- data.frame(pr.out$x[, 1:2], nci.labs) %>% 
  mutate(groups =ifelse(
  PC1 < -40, 'group1', ifelse(
  PC1 > -42 & PC2 > 1, 'group2', ifelse(
  PC1 > 25 & PC2 < 1, 'group3', 'group4'))))
p1 <- ggplot(df1, aes(x = PC1, y = PC2, colour = groups)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  scale_color_manual(values = c("group1" = "red", "group2" = "blue", "group3" = "green4", "group4" = "cyan4" ))+
  theme_bw()+
  theme(legend.position="none")

# Gráfico 2
df2 <- data.frame(pr.out$x[, 1:2], nci.labs)
p2 <- ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2")+
  theme_bw()+
  theme(legend.position="none")

# Gráficos lado a lado: dos alternativas
library(gridExtra)
grid.arrange(p1, p2, ncol = 2)

library(cowplot)
plot_grid(p1, p2, labels = "AUTO")

# Con leyenda modificando su título
ggplot(df2, aes(x = PC1, y = PC2, colour = nci.labs)) +
  geom_point(size = 3)+
  labs(x = "Z1", y = "Z2", colour = "Types of cancer")+
  theme_bw()

Gráficos con ggplot2

Alternativa con el paquete Graphics

Con el paquete graghics de la configuración base de R.

# Asigno colores manualmente para el primer gráfico
df3 <- data.frame(pr.out$x[, 1:2], nci.labs) %>% 
  mutate(groups =ifelse(
  PC1 < -40, 'red', ifelse(
  PC1 > -42 & PC2 > 1, 'blue', ifelse(
  PC1 > 25 & PC2 < 1, 'green4', 'cyan4'))))

# Función para asignar colores del segundo gráfico
Cols <- function(vec){
  cols=rainbow(length(unique(vec)))
  return(cols[as.numeric(as.factor(vec))])
}
# Gráficos
par(mfrow = c(1,2))
plot(df1[, 1:2], col = df3$groups, pch = 19, xlab = "Z1", ylab = "Z3")
plot(df1[, 1:2], col = Cols(nci.labs), pch = 19, xlab = "Z1", ylab = "Z2")

Entradas relacionadas

2018-08-27

Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 1.3.

Gráfico a replicar

Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning con ggplot2 parte 1. En esta ocasión replicaremos el gráfico de la figura 1.3. Se trata de un diagrama de caja en el que representamos el resultado de un análisis discriminante cuadrático (lda). Aplicamos un análisis análisis discriminante cuadrático al subconjunyo de datos de Smarket comprendido entre 2001-2007 y predecimos la probabilidad de que el mercado de valores decrezca usando los datos de 2005.

Solución

# Análisis discriminante cuadrático
library(ISLR)
library(MASS)
library(ggplot2)
train <- (Smarket$Year < 2005)
Direction.2005 <- Smarket$Direction[!train]
Smarket.2005 <- Smarket[!train,]
qda.fit <-  qda(Direction ~ Lag1 + Lag2, data = Smarket, subset = train)
qda.class <- predict(qda.fit, Smarket.2005)$class
mean(qda.class == Direction.2005)
[1] 0.5992063
En media la predicción de probabilidad de que decrezca el mercado de valores es mayor en los días en los que el mercado decrece. Basándonos en estos resultados, podemos predecir correctamente la dirección del movimiento de mercado en un 60% de las veces.

  • Gráfico
  • En este caso la creación del gráfico es sencilla y prácticamente idéntica a la de la entrada anterior. El único reto es utilizar correctamente la salida de datos de qda.pred.

    qda.pred <- predict(qda.fit, Smarket.2005)
    qda.pred <- cbind(data.frame(qda.pred), pred = Direction.2005)
    
    ggplot(qda.pred, aes(x = pred, y = posterior.Down, fill = pred)) +
      stat_boxplot(geom = "errorbar", width = 0.5) +
      geom_boxplot(show.legend = FALSE, outlier.alpha = .5) +
      scale_fill_manual(values = c("royalblue", "orangered")) +
      labs(x = "Today's Direction", y = "Predicted probability")
    
    Dejo el panel de fondo por defecto pues ayuda a evaluar mejor el gráfico. Si lo que queremos en blanco tal y como el libro añadiríamos al código anterior:

    theme(panel.background = element_blank())

    Entradas relacionadas

    2018-08-14

    Gráficos de An Introduction to Statistical Learning con ggplot2 - Figura 1.2

    Gráfico a replicar

    Continuamos con la serie iniciada sobre la creación de gráficos del libro An Introduction to Statistical Learning con ggplot2 parte 1. En esta ocasión replicaremos el gráfico de la figura 1.2. Se trata de tres pares de diagramas de caja, representando el índice S&P 500 entre 2001 y 2005. En cada uno de ellos se representa si el índice subió o bajó respecto al día anterior para tres momentos en el tiempo: ayer, hace dos días y hace tres días.

    Solución

    No lo replicamos idénticamente a propósito. Es más eficinet usar facet_grid para mostrar los tres en un solo gráfico y no repetir títulos de los ejes 3 veces. La parte esencial para obtenerlo es la transformación del data frame de formato ancho a largo con la función gather de tidyr. Renombramos los niveles de la variable key y añadimos colores similares, títulos de los ejes y cierto nivel de transparencia para los valores atípicos (outliers).

    library(tidyr)
    library(dplyr)
    Smarket %>%
      gather(key, value, Lag1:Lag3) %>%
      mutate(key = recode(
        factor(key),
        Lag1 = "Yesterday",
        Lag2 = "Two Days Previous",
        Lag3 = "Three Days Previous"
      )) %>% 
      ggplot(aes(x = Today, y = value, fill = Direction)) +
      geom_boxplot(outlier.alpha = .5) +
      facet_grid( ~ key) +
      scale_fill_manual(values = c("royalblue", "orangered")) +
      labs(x = "Today's Direction", y = "Percentage change in S&P")+
      theme(panel.background = element_blank())
    
  • Alternativa
  • Podríamos haber creado los tres gráficos de manera independiente como mostramos a continuación y unirlos con gridExtra. En este caso necesitamos repetir cada argumento o refinamiento del gráfico tres veces.

    library(gridExtra)
    # Yesterday
    p1 <-
      ggplot(Smarket, aes(x = Direction, y = Lag1, fill = Direction)) +
      geom_boxplot(show.legend = FALSE, outlier.alpha = .5) + ggtitle("Yesterday") +
      scale_fill_manual(values = c("royalblue", "orangered")) +
      labs(x = "Today's Direction", y = "Percentage change in S&P")
    # Two Days Previous
    p2 <-
      ggplot(Smarket, aes(x = Direction, y = Lag2, fill = Direction)) +
      geom_boxplot(show.legend = FALSE, outlier.alpha = .5) + ggtitle("Two Days Previous") +
      scale_fill_manual(values = c("royalblue", "orangered")) +
      labs(x = "Today's Direction", y = "Percentage change in S&P")
    # Three Days Previous
    p3 <-
      ggplot(Smarket, aes(x = Direction, y = Lag3, fill = Direction)) +
      geom_boxplot(show.legend = FALSE, outlier.alpha = .5) + ggtitle("Three Days Previous") +
      scale_fill_manual(values = c("royalblue", "orangered")) +
      labs(x = "Today's Direction", y = "Percentage change in S&P")
    grid.arrange(p1, p2, p3, ncol = 3)
    

    Entradas relacionadas

    Nube de datos