library(dplyr)
library(ggplot2)
library(plotly)

Características de los gráficos

Para ver version html hacer click aquí.

Los gráficos deben ser parsimónicos, autexplicativos y minimalistas, pues su principal objetivo es que se pueda entender en poco tiempo. En general, todos los graficos en R deben:

R cheatsheet

Link Cheatsheet

  1. Cargamos la base de datos
pulse <- read.table( url( "https://raw.githubusercontent.com/edojimenez/r_datascience/main/Pulse.txt" ), header = TRUE, sep = "\t", fileEncoding="utf-16")

Revisamos la base de datos

str(pulse)
## 'data.frame':    110 obs. of  13 variables:
##  $ id      : chr  "1993_A" "1993_B" "1993_C" "1993_D" ...
##  $ name    : chr  "Bonnie" "Melanie" "Consuelo" "Travis" ...
##  $ height  : int  173 179 167 195 173 184 162 169 164 168 ...
##  $ weight  : num  57 58 62 84 64 74 57 55 56 60 ...
##  $ age     : int  18 19 18 18 18 22 20 18 19 23 ...
##  $ gender  : chr  "female" "female" "female" "male" ...
##  $ smokes  : chr  "no" "no" "no" "no" ...
##  $ alcohol : chr  "yes" "yes" "yes" "yes" ...
##  $ exercise: chr  "moderate" "moderate" "high" "high" ...
##  $ ran     : chr  "sat" "ran" "ran" "sat" ...
##  $ pulse1  : int  86 82 96 71 90 78 68 71 68 88 ...
##  $ pulse2  : int  88 150 176 73 88 141 72 77 68 150 ...
##  $ year    : int  1993 1993 1993 1993 1993 1993 1993 1993 1993 1993 ...
summary(pulse)
##       id                name               height          weight      
##  Length:110         Length:110         Min.   : 68.0   Min.   : 27.00  
##  Class :character   Class :character   1st Qu.:165.2   1st Qu.: 56.25  
##  Mode  :character   Mode  :character   Median :172.5   Median : 63.00  
##                                        Mean   :171.6   Mean   : 66.33  
##                                        3rd Qu.:180.0   3rd Qu.: 75.00  
##                                        Max.   :195.0   Max.   :110.00  
##                                                                        
##       age           gender             smokes            alcohol         
##  Min.   :18.00   Length:110         Length:110         Length:110        
##  1st Qu.:19.00   Class :character   Class :character   Class :character  
##  Median :20.00   Mode  :character   Mode  :character   Mode  :character  
##  Mean   :20.56                                                           
##  3rd Qu.:21.00                                                           
##  Max.   :45.00                                                           
##                                                                          
##    exercise             ran                pulse1           pulse2     
##  Length:110         Length:110         Min.   : 47.00   Min.   : 56.0  
##  Class :character   Class :character   1st Qu.: 68.00   1st Qu.: 72.0  
##  Mode  :character   Mode  :character   Median : 76.00   Median : 84.0  
##                                        Mean   : 75.69   Mean   : 96.8  
##                                        3rd Qu.: 82.00   3rd Qu.:125.0  
##                                        Max.   :145.00   Max.   :176.0  
##                                        NA's   :1        NA's   :1      
##       year     
##  Min.   :1993  
##  1st Qu.:1995  
##  Median :1996  
##  Mean   :1996  
##  3rd Qu.:1997  
##  Max.   :1998  
## 

Descripción

Los estudiantes de una clase de introducción a la estadística (MS212 impartida por el profesor John Eccleston y el Dr. Richard Wilson en la Universidad de Queensland) participaron en un experimento sencillo. Los estudiantes tomaron su propio pulso. Luego se les pidió que lanzaran una moneda al aire. Si la moneda salía cara, debían correr en su lugar durante un minuto. De lo contrario, se sentaron durante un minuto. Entonces todos volvieron a tomarse el pulso. Las frecuencias del pulso y otros datos fisiológicos y de estilo de vida se muestran en los datos.

Cinco grupos de clases entre 1993 y 1998 participaron en el experimento. Al conferencista, Richard Wilson, le preocupaba que algunos estudiantes eligieran la opción menos extenuante de sentarse en lugar de correr incluso si su moneda saliera cara, por lo que en los años 1995-1998 se utilizó un método diferente de asignación aleatoria. En estos años, los formularios de datos se entregaron a la clase antes del experimento. Los formularios fueron preasignados para ejecutar o no ejecutar y había un número igual de cada uno. En 1995 y 1998 no se devolvieron todos los formularios, por lo que aún no se controlaba por completo la cantidad de personas que estaban sentadas y corriendo.

Variables: • Height - Height (cm) • Weight - Weight (kg) • Age - Age (years) • Gender - Sex (1 = male, 2 = female) • Smokes - Regular smoker? (1 = yes, 2 = no) • Alcohol - Regular drinker? (1 = yes, 2 = no) • Exercise - Frequency of exercise (1 = high, 2 = moderate, 3 = low) • Ran - Whether the student ran or sat between the first and second pulse measurements (1 = ran, 2 = sat) • Pulse1 - First pulse measurement (rate per minute) • Pulse2 - Second pulse measurement (rate per minute) • Year - Year of class (93 - 98)

Pulse Rates before and after Exercise

Scatterplots

Primero, haremos un gráfico que muestre la relación entre la edad y el peso

ggplot( pulse, aes( x = age, y = weight ) ) +
  geom_point() + theme_bw() + labs(title= " Relación entre el peso y la edad")

ggplot( pulse, aes( x = age, y = weight ) ) +
  geom_point( aes( color = exercise ) ) +  theme_bw() + labs(title= " Relación entre el peso y la edad")

ggplot( pulse, aes( x = age, y = weight ) ) +
  geom_point( aes( color = exercise, shape = gender )) +  theme_bw() + labs(title= " Relación entre el peso y la edad")

Ahora, haremos el gráfico interactivo

ggplotly(ggplot( pulse, aes( x = age, y = weight ) ) +
  geom_point( aes( color = exercise, shape = gender ) ) +  theme_bw() + labs(title= " Relación entre el peso y la edad"))

GGPLOTLY

ggplot( pulse, aes( x = age, y = weight ) ) +
  geom_point( aes( color = exercise, shape = gender ))  +
 facet_wrap( . ~ year ) + theme_bw() + labs(title= " Relación entre el peso y la edad")

ggplot( pulse, aes( x = height, y = weight ) ) +
  geom_point( aes( color = exercise, shape = gender, size= age))  +
 facet_wrap( ~ year ) + theme_bw() + labs(title= " Relación entre el peso y la altura")

face_wrap()

Piensen en facet_wrap() como una cinta de gráficos que organiza los paneles en filas y columnas y elige el diseño que mejor se adapta al número de paneles.

facet_grid()

En lugar de permitir que facet_wrap() decida el diseño de filas y columnas, puede usar facet_grid() para la organización y personalización.

La sintaxis sigue el patrón facet_grid(row_variable ~ column_variable) y podemos aplicar esta sintaxis a cualquier gráfico.

¿Por que usamos “. ~” en facet_wrap(. ~ year )?

FACET_WRAP and FACET_GRID

Tarea 1:

Hacer un grafico que tenga como eje x el pulso 1, como y el pulso 2, y que se pueda distinguir los resultados por sexo y que los puntos se diferencien por color para identificar si toma alcohol o no. El gráfico además debe tener título

ggplot(pulse, aes(x=pulse1 ,y=pulse2)) + geom_point(aes(color = alcohol)) + theme_bw() +  facet_wrap(.~ gender) + labs(title = "Relación entre pulso 1  y pulso 2 (antes y después del experimento)")
## Warning: Removed 1 rows containing missing values (geom_point).

Histogramas

ggplot( pulse, aes( x = pulse1 ) ) +
  geom_histogram()
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
## Warning: Removed 1 rows containing non-finite values (stat_bin).

ggplot( pulse, aes( x = pulse2 ) ) +
  geom_histogram( binwidth = 10, boundary = 100 ) + theme_bw()
## Warning: Removed 1 rows containing non-finite values (stat_bin).

ggplot( pulse ) +
  geom_histogram( aes( x = pulse1 ), alpha = 0.3, fill = "blue", binwidth = 10, boundary = 100 ) +
  geom_histogram( aes( x = pulse2 ), alpha = 0.3, fill = "red",  binwidth = 10, boundary = 100 ) + theme_bw() 
## Warning: Removed 1 rows containing non-finite values (stat_bin).

## Warning: Removed 1 rows containing non-finite values (stat_bin).

Boxplot

ggplot( pulse, aes( x = exercise, y = age ) ) + 
  geom_boxplot()

BOXPLOTS

ggplot( pulse, aes( x = exercise, y = age, color = gender ) ) + 
  geom_boxplot() + theme_bw()

Line Plot

ggplot( pulse, aes( x = pulse1, y = pulse2) ) +
  geom_line()
## Warning: Removed 1 row(s) containing missing values (geom_path).

ggplot( pulse, aes( x = pulse1, y = pulse2, color = ran ) ) +
  geom_line() + theme_bw()
## Warning: Removed 1 row(s) containing missing values (geom_path).

ggplot( pulse, aes( x = pulse1, y = pulse2, color = ran ) ) +
  geom_line() +
  geom_point( aes( shape = exercise )) + theme_bw()
## Warning: Removed 1 row(s) containing missing values (geom_path).
## Warning: Removed 1 rows containing missing values (geom_point).

ggplot( pulse, aes( x = pulse1, y = pulse2, color = ran ) ) +
 geom_line()   +
  geom_text( aes( label = name ), size = 3, angle = -45, alpha = 0.8 )  + theme_bw()
## Warning: Removed 1 row(s) containing missing values (geom_path).
## Warning: Removed 1 rows containing missing values (geom_text).

Empalme Dplyr con ggplot

Haremos un gráfico solo de los hombres que fuman, que muestre su pulse1 promedio dependiendo si hacen ejercicio o no.

pulse %>% filter(gender=="male" & smokes=="yes")   %>% group_by(exercise) %>% summarise(promedio=mean(pulse1, na.rm = TRUE)) %>% ggplot( aes(x=exercise, y=promedio)) + geom_bar(stat = "identity") + theme_bw()

Tarea 2:

Tomar aquellos que tienen menos de 30 años, y graficar el promedio por sexo del pulse1 dependiendo si hacen ejercicio o no y que sea interactivo.