Introducción a R

Instalando R y R studio

R es un lenguaje de progración para computacion estadistica y ciencia de datos.
RStudio es una herramienta libre y open-source integrated development environment (IDE) para R. 1. Bajar e instalar R: http://cran.stat.sfu.ca/. 2. Bajar e instalar R Studio: : https://www.rstudio.com/products/rstudio/#Desktop.

Instando paquetes

Inspeccionaremos dos paquetes. - dplyr: para manipulacion de datos - ggplot2: para visualización de datos

Puedes instalar con código. (Ctrl + Enter)

#install.packages("dplyr")
#install.packages("ggplot2")

Algunos trucos útiles

Para ejecutar una línea de código, mueva el cursor a esa línea y luego escriba Ctrl+Enter. Por ejemplo:

# Presiona Ctrl-Enter.
print("Bienvenidos al curso Introductorio a R!")
## [1] "Bienvenidos al curso Introductorio a R!"

Para asignar valores a las variables, usamos <- – se puede obtener más rápidamente con Alt+-

x <- 4

Comentar o eliminar el comentario de una línea de código, mueva el cursor a esa línea y luego escriba Ctrl+Shift+C. Por ejemplo:

# print("Ctrl+Shift+C")

Contenido de Publicación EDA

EDA

¿Qué es el análisis exploratorio de datos (EDA) y por qué importa?

En estadística, el análisis exploratorio de datos (EDA) es un enfoque para analizar conjuntos de datos para resumir sus características principales, a menudo con métodos visuales. —Wikipedia

EDA sirve para muchos propósitos, incluyendo:

  • comprender mejor la estructura de los datos (es decir, tipos de datos, estadísticas resumidas) e identificar relaciones entre variables.
  • comprobación de problemas con los datos (es decir, datos faltantes o error de medición)
  • ayudar en la formación de hipótesis

EDA es importante porque brinda a los analistas una mejor idea sobre en qué deben enfocarse, o simplemente deciden detenerse si los datos no brindan ninguna información antes de que inviertan más recursos en ellos.

Para el ejemplo se explorará una estructura de datos y realizar un EDA simple con los paquetes dplyr y ggplot2,

Para dplyr, hay 5 funciones principales:

  • select(): obtener un subconjunto de columnas
  • filter(): obtener un subconjunto de filas
  • mutate(): crear una nueva columna
  • group_by(): definir grupos según los valores en una o más columnas
  • summarise(): reducir muchas filas a un único valor de interés.

Para ggplot2:

  • configurar un gráfico con ggplot()
  • Se puede elegir qué variables trazar usando el argumento mapping = aes(x, y) en ggplot()
  • Se puede elegir qué tipo de trama usando geom_
  • Se puede agregar título y subtítulo usando labels

Para cargar los paquetes para este taller.

library(dplyr)
library(ggplot2)

Exploración basica de los datos

Los datos que usaremos se pueden encontrar aquí, [Kaggle: encuesta de salud mental en tecnología] (https://www.kaggle.com/osmi/mental-health-in-tech-survey)

Antes de intentar hacer algun modelo de prediccion, clasificacion u otro análisis, primero debemos entender cómo se ven los datos. Veamos las primeras filas de datos con head().

# cargando los datos
setwd("~/Escritorio/intro_R")
mental_data <- read.csv('survey.csv')
# observando las primeras filas de los datos
head(mental_data)
##             Timestamp Age Gender        Country state self_employed
## 1 2014-08-27 11:29:31  37 Female  United States    IL          <NA>
## 2 2014-08-27 11:29:37  44      M  United States    IN          <NA>
## 3 2014-08-27 11:29:44  32   Male         Canada  <NA>          <NA>
## 4 2014-08-27 11:29:46  31   Male United Kingdom  <NA>          <NA>
## 5 2014-08-27 11:30:22  31   Male  United States    TX          <NA>
## 6 2014-08-27 11:31:22  33   Male  United States    TN          <NA>
##   family_history treatment work_interfere   no_employees remote_work
## 1             No       Yes          Often           6-25          No
## 2             No        No         Rarely More than 1000          No
## 3             No        No         Rarely           6-25          No
## 4            Yes       Yes          Often         26-100          No
## 5             No        No          Never        100-500         Yes
## 6            Yes        No      Sometimes           6-25          No
##   tech_company   benefits care_options wellness_program  seek_help  anonymity
## 1          Yes        Yes     Not sure               No        Yes        Yes
## 2           No Don't know           No       Don't know Don't know Don't know
## 3          Yes         No           No               No         No Don't know
## 4          Yes         No          Yes               No         No         No
## 5          Yes        Yes           No       Don't know Don't know Don't know
## 6          Yes        Yes     Not sure               No Don't know Don't know
##                leave mental_health_consequence phys_health_consequence
## 1      Somewhat easy                        No                      No
## 2         Don't know                     Maybe                      No
## 3 Somewhat difficult                        No                      No
## 4 Somewhat difficult                       Yes                     Yes
## 5         Don't know                        No                      No
## 6         Don't know                        No                      No
##      coworkers supervisor mental_health_interview phys_health_interview
## 1 Some of them        Yes                      No                 Maybe
## 2           No         No                      No                    No
## 3          Yes        Yes                     Yes                   Yes
## 4 Some of them         No                   Maybe                 Maybe
## 5 Some of them        Yes                     Yes                   Yes
## 6          Yes        Yes                      No                 Maybe
##   mental_vs_physical obs_consequence comments
## 1                Yes              No     <NA>
## 2         Don't know              No     <NA>
## 3                 No              No     <NA>
## 4                 No             Yes     <NA>
## 5         Don't know              No     <NA>
## 6         Don't know              No     <NA>

También podemos usar la función str() para obtener una vista general de los datos, que presentan muy bien el número de filas y columnas, nombres de variables, tipos de datos y valores de ejemplo..

str(mental_data)
## 'data.frame':    1259 obs. of  27 variables:
##  $ Timestamp                : chr  "2014-08-27 11:29:31" "2014-08-27 11:29:37" "2014-08-27 11:29:44" "2014-08-27 11:29:46" ...
##  $ Age                      : num  37 44 32 31 31 33 35 39 42 23 ...
##  $ Gender                   : chr  "Female" "M" "Male" "Male" ...
##  $ Country                  : chr  "United States" "United States" "Canada" "United Kingdom" ...
##  $ state                    : chr  "IL" "IN" NA NA ...
##  $ self_employed            : chr  NA NA NA NA ...
##  $ family_history           : chr  "No" "No" "No" "Yes" ...
##  $ treatment                : chr  "Yes" "No" "No" "Yes" ...
##  $ work_interfere           : chr  "Often" "Rarely" "Rarely" "Often" ...
##  $ no_employees             : chr  "6-25" "More than 1000" "6-25" "26-100" ...
##  $ remote_work              : chr  "No" "No" "No" "No" ...
##  $ tech_company             : chr  "Yes" "No" "Yes" "Yes" ...
##  $ benefits                 : chr  "Yes" "Don't know" "No" "No" ...
##  $ care_options             : chr  "Not sure" "No" "No" "Yes" ...
##  $ wellness_program         : chr  "No" "Don't know" "No" "No" ...
##  $ seek_help                : chr  "Yes" "Don't know" "No" "No" ...
##  $ anonymity                : chr  "Yes" "Don't know" "Don't know" "No" ...
##  $ leave                    : chr  "Somewhat easy" "Don't know" "Somewhat difficult" "Somewhat difficult" ...
##  $ mental_health_consequence: chr  "No" "Maybe" "No" "Yes" ...
##  $ phys_health_consequence  : chr  "No" "No" "No" "Yes" ...
##  $ coworkers                : chr  "Some of them" "No" "Yes" "Some of them" ...
##  $ supervisor               : chr  "Yes" "No" "Yes" "No" ...
##  $ mental_health_interview  : chr  "No" "No" "Yes" "Maybe" ...
##  $ phys_health_interview    : chr  "Maybe" "No" "Yes" "Maybe" ...
##  $ mental_vs_physical       : chr  "Yes" "Don't know" "No" "No" ...
##  $ obs_consequence          : chr  "No" "No" "No" "Yes" ...
##  $ comments                 : chr  NA NA NA NA ...

El summary() también es útil para calcular estadísticas de resumen rápidas de los datos.

# calcula estadisticas summary de las 6 primeras columnas
summary(mental_data[, 1:6])
##   Timestamp              Age                Gender            Country         
##  Length:1259        Min.   :-1.726e+03   Length:1259        Length:1259       
##  Class :character   1st Qu.: 2.700e+01   Class :character   Class :character  
##  Mode  :character   Median : 3.100e+01   Mode  :character   Mode  :character  
##                     Mean   : 7.943e+07                                        
##                     3rd Qu.: 3.600e+01                                        
##                     Max.   : 1.000e+11                                        
##     state           self_employed     
##  Length:1259        Length:1259       
##  Class :character   Class :character  
##  Mode  :character   Mode  :character  
##                                       
##                                       
## 

Para verificar datos. Por ejemplo, para comprobar si faltan valores, debe saber que los valores faltantes afectarían al análisis y es posible que deba solucionarlos mediante la eliminación o imputación (por ejemplo, imputación con la media).

# calcula el numero de NAs en cada columna
check_na <- function(x) {
      return(colSums(is.na(x)))
}
check_na(mental_data)
##                 Timestamp                       Age                    Gender 
##                         0                         0                         0 
##                   Country                     state             self_employed 
##                         0                       515                        18 
##            family_history                 treatment            work_interfere 
##                         0                         0                       264 
##              no_employees               remote_work              tech_company 
##                         0                         0                         0 
##                  benefits              care_options          wellness_program 
##                         0                         0                         0 
##                 seek_help                 anonymity                     leave 
##                         0                         0                         0 
## mental_health_consequence   phys_health_consequence                 coworkers 
##                         0                         0                         0 
##                supervisor   mental_health_interview     phys_health_interview 
##                         0                         0                         0 
##        mental_vs_physical           obs_consequence                  comments 
##                         0                         0                      1095

Formular una pregunta

Una buena práctica para el proceso de análisis exploratorio de datos es formular una pregunta y dejar que sea una guía a través del proceso. Ayuda a reducir el número de todas las rutas potenciales a un número manejable, lo que es extremadamente útil para conjuntos de datos de gran dimensión.

Para el ejemplo, intentamos responder a esta pregunta: > P: ¿Cómo se relaciona el grupo de edad, el sexo y el programa de bienestar del empleado de una persona con la probabilidad de buscar tratamiento para una afección de salud mental? Para responder a esta pregunta, necesitaríamos tener estas columnas:

  • Age: la edad de la persona, en años
  • Gender: el género de la persona
  • wellness_program: ¿el programa de bienestar de los empleados incluye salud mental?
  • treatment: hacer que una persona busque tratamiento por una condición de salud mental

Subdividir columnas con select()

select() toma una lista de nombres de columnas y devuelve un marco de datos pero solo con esas columnas. Veamos select() en acción con un marco de datos de juguete.

muestra <- data.frame(
      paciente     = c("Alicia",           "Pedro",         "Ivan",              "Carola"),
      enfermedad     = c("Desorden Mental", "Depresion",  "Desorden Mental",    "Depresion"),
      grado_enfermedad = c(1.5,               1.5,           0.1,                  3),
      edad         = c(24,                22,            16,                   30)
)
# un vistazo
muestra
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
## 2    Pedro       Depresion              1.5   22
## 3     Ivan Desorden Mental              0.1   16
## 4   Carola       Depresion              3.0   30
# seleccionar la columna disease
select(.data = muestra, enfermedad)
##        enfermedad
## 1 Desorden Mental
## 2       Depresion
## 3 Desorden Mental
## 4       Depresion

Con el operador de canalización: %>%, esto toma la salida de la línea de código anterior y la pasa como el primer argumento de la siguiente línea. El siguiente código se leería como “comenzar con muestra, luego select enfermedad.

muestra %>% 
      select(enfermedad)
##        enfermedad
## 1 Desorden Mental
## 2       Depresion
## 3 Desorden Mental
## 4       Depresion

Práctica1: creación de subconjuntos de las columnas age y treatment.

Usando nuestro marco de datos de encuesta mental, seleccione solo las columnas Edad y tratamiento.

mental_data %>% 
      select(Age,Gender,wellness_program,treatment
      ) %>% 
      head()
##   Age Gender wellness_program treatment
## 1  37 Female               No       Yes
## 2  44      M       Don't know        No
## 3  32   Male               No        No
## 4  31   Male               No       Yes
## 5  31   Male       Don't know        No
## 6  33   Male               No        No

Práctica2: renombrado de columnas age y treatment.

Usando el anterior marco de trabajo se debe cambiar el nombre de columnas con la funcion colnames

mental_data %>%
      select(Age,Gender,wellness_program,treatment) %>% rename(edad=Age,genero=Gender, programa_bienestar=wellness_program,tratamiento=treatment)%>%head()
##   edad genero programa_bienestar tratamiento
## 1   37 Female                 No         Yes
## 2   44      M         Don't know          No
## 3   32   Male                 No          No
## 4   31   Male                 No         Yes
## 5   31   Male         Don't know          No
## 6   33   Male                 No          No

Excelente!!! . Ahora Con las 4 variables de interés y guárdelas en un nuevo marco de datos. (Aunque este paso no es necesario, facilitará el análisis de las variables que nos interesan. ¡Esto es más útil cuando el número total de variables del marco de datos original es grande!)

mental_data_selected <- mental_data %>%
      select(
           Age,Gender,wellness_program,treatment
      ) %>% rename(edad=Age,genero=Gender, programa_bienestar=wellness_program,tratamiento=treatment)
      
mental_data_selected %>% 
      head()
##   edad genero programa_bienestar tratamiento
## 1   37 Female                 No         Yes
## 2   44      M         Don't know          No
## 3   32   Male                 No          No
## 4   31   Male                 No         Yes
## 5   31   Male         Don't know          No
## 6   33   Male                 No          No

Subdividir filas con filter()

Es común que sus datos contengan entradas de error o valores faltantes, y desee eliminarlos. O es posible que desee crear un subconjunto de filas que satisfagan algunas condiciones.

Podemos usar la función filter() de dplyr para hacer esto: mantiene solo las filas en un marco de datos que coinciden con una condición. Por ejemplo:

muestra
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
## 2    Pedro       Depresion              1.5   22
## 3     Ivan Desorden Mental              0.1   16
## 4   Carola       Depresion              3.0   30
# Usar `==` para "iguales"
muestra %>% 
  filter(paciente == "Alicia")
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
# Mayor que `>`, menor que `<`.
muestra %>% 
      filter(edad > 23)
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
## 2   Carola       Depresion              3.0   30
# Use `|` para "o".
muestra %>% 
  filter(paciente == "Pedro" | paciente == "Ivan")
##   paciente      enfermedad grado_enfermedad edad
## 1    Pedro       Depresion              1.5   22
## 2     Ivan Desorden Mental              0.1   16
# En `filter()`, cada coma es tratado como "and". pero tambien puedes utilizar `&`.
muestra %>% 
  filter(paciente == "Pedro" | paciente == "Ivan",
         enfermedad == "Fiebre")
## [1] paciente         enfermedad       grado_enfermedad edad            
## <0 rows> (or 0-length row.names)
# Use `!` para negación. 
muestra %>% 
  filter(edad != 22,
         paciente != "Ivan")
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
## 2   Carola       Depresion              3.0   30

Para ver un resumen de los datos se tiene

summary(mental_data_selected)
##       edad               genero          programa_bienestar tratamiento       
##  Min.   :-1.726e+03   Length:1259        Length:1259        Length:1259       
##  1st Qu.: 2.700e+01   Class :character   Class :character   Class :character  
##  Median : 3.100e+01   Mode  :character   Mode  :character   Mode  :character  
##  Mean   : 7.943e+07                                                           
##  3rd Qu.: 3.600e+01                                                           
##  Max.   : 1.000e+11
str(mental_data_selected)
## 'data.frame':    1259 obs. of  4 variables:
##  $ edad              : num  37 44 32 31 31 33 35 39 42 23 ...
##  $ genero            : chr  "Female" "M" "Male" "Male" ...
##  $ programa_bienestar: chr  "No" "Don't know" "No" "No" ...
##  $ tratamiento       : chr  "Yes" "No" "No" "Yes" ...

Práctica: averigua en el campo edad aquellos que no tienen sentido.

Puede esperar que la ‘Edad’ de las personas oscile entre 0 y 90, y las que están fuera del rango pueden ser tratadas como valores atípicos. Ahora comprobamos si hay observaciones fuera de este rango.

# filtrar filas donde la edad `edad < 0`
mental_data_selected %>% 
      filter(edad <0
            # answer here
      )
# filtrar filas donde la edad `edad > 900`
mental_data_selected %>% 
      filter(edad>90
            # answer here
      )

Para realizar un grafico basico

boxplot(mental_data_selected$edad)

En el fragmento de código a continuación, elimino las filas donde edad es mayor que 90 o menor que 0.

mental_data_filtered <- mental_data_selected %>% 
      filter(edad < 90 & edad > 0)
boxplot(mental_data_filtered$edad)

Verifiquemos la cantidad de filas que se eliminan, y debería ser 5.

paste("numero de filas borradas:", 
      nrow(mental_data_selected) - nrow(mental_data_filtered))
## [1] "numero de filas borradas: 5"

Creando nuevas columnas con mutate()

A continuación, vamos a crear una columna que nos diga cuál era el grupo de edad de la persona, “0-24”, “25-34” y “35+”.

Usaremos la función mutate() y la columna edad para agregar los resultados.

Veamos los siguientes ejemplos:

muestra
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
## 2    Pedro       Depresion              1.5   22
## 3     Ivan Desorden Mental              0.1   16
## 4   Carola       Depresion              3.0   30
# We can fill our new column with whatever we like!
muestra %>% 
  mutate(new_column = "hello!")
##   paciente      enfermedad grado_enfermedad edad new_column
## 1   Alicia Desorden Mental              1.5   24     hello!
## 2    Pedro       Depresion              1.5   22     hello!
## 3     Ivan Desorden Mental              0.1   16     hello!
## 4   Carola       Depresion              3.0   30     hello!
muestra %>% 
  mutate(new_column = 2018)
##   paciente      enfermedad grado_enfermedad edad new_column
## 1   Alicia Desorden Mental              1.5   24       2018
## 2    Pedro       Depresion              1.5   22       2018
## 3     Ivan Desorden Mental              0.1   16       2018
## 4   Carola       Depresion              3.0   30       2018

Incluso podemos usar las otras columnas para determinar el contenido de la nueva. Calculemos cuándo se le diagnosticó la enfermedad a la persona por primera vez.

# nice! we get the `first_diagnosed` time 
muestra %>% 
      mutate(primer_diagnostico = edad - grado_enfermedad)
##   paciente      enfermedad grado_enfermedad edad primer_diagnostico
## 1   Alicia Desorden Mental              1.5   24               22.5
## 2    Pedro       Depresion              1.5   22               20.5
## 3     Ivan Desorden Mental              0.1   16               15.9
## 4   Carola       Depresion              3.0   30               27.0

Práctica: calcular el máximo, mínimo y promedio para la edad

Use mutate() y edad para calcular el máximo, el mínimo y la media llamados max_edad, min_edad y mean_edad.

Sugerencia: utilice las funciones max(), min() y mean(). Puede usar ?max para buscar la documentación.

mental_data_filtered %>% 
      mutate(max_edad=max(edad), min_edad=min(edad), mean_edad=mean(edad)
           
      ) %>% 
      head()

Para responder a nuestra pregunta inicial, necesitaremos usar otra función case_when().

case_when() toma una serie de fórmulas de dos lados. El lado izquierdo de cada fórmula es una condición y el lado derecho es el resultado deseado. Por ejemplo:

cool_values <- c(TRUE, FALSE, FALSE)
cool_values
## [1]  TRUE FALSE FALSE
case_when(
  cool_values == TRUE ~ "Aqui es verdadero!",
  cool_values == FALSE ~ "que paso?"
)
## [1] "Aqui es verdadero!" "que paso?"          "que paso?"
cool_numbers <- c(1,2,3,4,5,6,7,8,9,10)
cool_numbers
##  [1]  1  2  3  4  5  6  7  8  9 10
case_when(
  cool_numbers < 5 ~ "small",
  cool_numbers > 5 ~ "BIG!!!!",
  TRUE ~ "default_value"
)
##  [1] "small"         "small"         "small"         "small"        
##  [5] "default_value" "BIG!!!!"       "BIG!!!!"       "BIG!!!!"      
##  [9] "BIG!!!!"       "BIG!!!!"

Ahora, vamos a usar case_when() dentro de mutate() para crear una nueva columna que nos diga si la edad de la persona estaba en los grupos que nos interesan:

# Guarda el resultado en nuevo df llamado `mental_data_mutated`.
mental_data_mutated <- mental_data_filtered %>% 
      mutate(
            GrupoEdad = case_when(
            edad < 25             ~ "0-24",
            edad >= 25 & edad < 35 ~ "25-34",
            edad >= 35            ~ "35+"
      )
)
# para ver datos
mental_data_mutated %>% 
      head()
##   edad genero programa_bienestar tratamiento GrupoEdad
## 1   37 Female                 No         Yes       35+
## 2   44      M         Don't know          No       35+
## 3   32   Male                 No          No     25-34
## 4   31   Male                 No         Yes     25-34
## 5   31   Male         Don't know          No     25-34
## 6   33   Male                 No          No     25-34

Cálculo de resúmenes agregados de subgrupos con group_by() y summarise()

Ahora necesitamos calcular la proporción de personas que buscaron tratamiento en diferentes géneros.

Para ello, podemos utilizar dos funciones:

  • group_by(): especifica qué variable(s) desea usar para calcular resúmenes dentro
  • summarise(): reduce el marco de datos a una sola fila por grupo, creando una columna con cualquier valor de resumen que especifique

Veamos algunos ejemplos:

muestra
##   paciente      enfermedad grado_enfermedad edad
## 1   Alicia Desorden Mental              1.5   24
## 2    Pedro       Depresion              1.5   22
## 3     Ivan Desorden Mental              0.1   16
## 4   Carola       Depresion              3.0   30
# Usar`summarise` para calcular
# un resumen estadistico
muestra %>% 
      summarise(mean_edad = mean(edad))
##   mean_edad
## 1        23
# Se puede usar `group_by` y `summarise` 
# para calcular la media por edad por cada enfermedad
muestra %>% 
      group_by(enfermedad) %>% 
      summarise(mean_age = mean(edad))
## # A tibble: 2 × 2
##   enfermedad      mean_age
##   <chr>              <dbl>
## 1 Depresion             26
## 2 Desorden Mental       20
#o extraer el maximo y minimo de la edad
muestra %>% 
      group_by(enfermedad) %>% 
      summarise(
            min_age = min(edad),
            max_age = max(edad)
            )
## # A tibble: 2 × 3
##   enfermedad      min_age max_age
##   <chr>             <dbl>   <dbl>
## 1 Depresion            22      30
## 2 Desorden Mental      16      24

Práctica: calcular la edad promedio para diferentes grupos

Ahora, calculemos la edad promedio de las personas que buscaron tratamiento y de las que no.

mental_data_mutated %>% 
      group_by(
            tratamiento
      ) %>% 
      summarise(
            edad_promedio=mean(edad)
      ) 

Para calcular la proporción de personas que buscaron tratamiento en diferentes géneros, primero debemos codificar los valores de tratamiento de Yes y No a TRUE y FALSE. Podemos hacer esto usando mutate() con case_when().

mental_data_mutated <- mental_data_mutated %>% 
      mutate(tratamiento = case_when(
            tratamiento == "Yes" ~ TRUE,
            tratamiento == "No" ~ FALSE
      ))

Ahora podemos calcular el resumen agrupando genero y tomar la media de tratamiento

mental_data_summarised <- mental_data_mutated %>% 
      group_by(genero) %>% 
      summarise(proporcion_tratamiento = mean(tratamiento))
mental_data_summarised
## # A tibble: 47 × 2
##    genero             proporcion_tratamiento
##    <chr>                               <dbl>
##  1 A little about you                    1  
##  2 Agender                               1  
##  3 Androgyne                             1  
##  4 Cis Female                            1  
##  5 cis male                              0  
##  6 Cis Male                              1  
##  7 Cis Man                               1  
##  8 cis-female/femme                      1  
##  9 Enby                                  1  
## 10 f                                     0.6
## # … with 37 more rows
## # ℹ Use `print(n = ...)` to see more rows

Visualización con ggplot2

El paquete ggplot2 es la mejor manera de crear visualizaciones en R, basado en The Grammar of Graphics. El código para cada visualización viene en dos partes principales:

  • Mapeo de variables sobre la estética (las propiedades visuales del gráfico). Por ejemplo, podemos asignar tratamiento al eje x y edad al eje y.
  • Selección de una “geom” (“objeto geométrico”): determina si quieres un diagrama de dispersión, un histograma o una línea.

Configurar un gráfico

Para iniciar una visualización, necesitamos usar ggplot(), que ayuda a configurar un gráfico. Sin embargo, este solo iniciará un espacio en blanco si lo llamamos solo.

Necesitamos mapear diferentes variables en diferentes estéticas, y lo más importante, el eje. Para configurar el eje, usamos el argumento mapping = aes(x, y). Aquí, pongamos el tratamiento en el eje x y la edad en el eje y.

mental_data_mutated %>% 
      ggplot(mapping = aes(x = tratamiento, y = edad)) 

Después de configurar el eje, debemos decidir el objeto geométrico. En este caso, usaríamos el diagrama de caja.

mental_data_mutated %>% 
      ggplot(mapping = aes(x = tratamiento, y = edad)) +
      geom_boxplot()

Para que la gráfica sea más descriptiva, agregaremos un título y etiquetas para los ejes x e y.

mental_data_mutated %>% 
      ggplot(mapping = aes(x = tratamiento, y = edad)) +
      geom_boxplot() +
      labs(title = "Box-plot de edad por diferentes grupos de tratamientos",
           # solo para ilustracion 
           x = "tratamiento",  
           y = "edad")

> Conclusion1: Parece que las personas más jóvenes tienen menos probabilidades de tener problemas mentales.

Además del diagrama de caja, hay otros objetos geom_ útiles para EDA:

  • geom_point(): diagrama de dispersión; útiles dos variables cuantitativas
  • geom_bar() y geom_col: gráfico de barras; geom_bar() automáticamente cuenta el número de x como valores de y. Para proporcionar sus propios valores de y, usamos geom_col().
  • geom_histogram() y geom_density(): diagrama de histograma y densidad; útil para visualizar la distribución de variables continuas.

Veamos de nuevo la distribución por edades para diferentes tratamientos, pero esta vez con geom_histogram, y dividiendo el gráfico en dos paneles con facet_wrap.

Consejos: Para hacer el gráfico más bonito, podemos proporcionar la variable GrupoEdad al argumento fill, lo que significa rellenar las barras con diferentes colores.

mental_data_mutated %>% 
      ggplot(mapping = aes(x = edad, fill = tratamiento)) +
      geom_histogram() +
      facet_wrap(~ tratamiento) +
      labs(title = "Histograma de edad para diferentes tratameintos")

Ahora, intentemos usar geom_col() para visualizar los datos para diferentes géneros.

mental_data_summarised %>% filter(genero=='female' | genero=='male') %>% 
      ggplot(mapping = aes(x = genero, y = proporcion_tratamiento, fill = genero)) +
      geom_col() +
      labs(title = "Proporcion de personas con condiciones mentales por generos diferentes",
           y = "proporcion de condicion mental")

Conclusion2: Las mujeres son mucho más propensas a tener problemas mentales, mientras que los hombres tienen menos probabilidades de tener problemas.

Aunque estas afirmaciones pueden no ser estadísticamente significativas, lo llevan a verificar la relación en análisis futuros.

Desafío: visualizar la relación entre programa_bienestar y tratamiento

Sugerencia: es posible que deba ‘summarize’ el programa de bienestar de manera similar a Género.

mental_data_mutated %>% 
      # analsiis
      
      ggplot()

Actividad

  • Formule su pregunta para guiar a través del proceso de análisis
  • Usa head(), str(), summary() para tener una idea de los datos
  • Comprobar los valores faltantes y/o desarrollar estrategias para tratar con ellos si es necesario
  • Discutir los datos y utilizar la visualización para identificar la relación