Clase 4

Conceptos relevantes de la clase anterior

Definicioón de Data Science

Es la disciplina que permite convertir datos en conocimiento accionable.

Etapas de Team Data Science Process

  1. Entendimiento del negocio (Business understanding)
  • Formular las objetivos (SMART).
  • Identificar las fuentes de datos relevantes.
  • Realizar las preguntas correctas.
  1. Adquision de los datos y entendimiento (Data acquisition and understanding) En esta fase llevaremos a cabo la limpieza de los datos y es la fase más importante del proceso de datos. Es además aquella que requiere más atención por parte del analista, pues la máquina puede que no tenga el contexto suficiente para leer correctamente los datos.
    Este proceso contempla:
  • Identificacion de variables (Duplicacio)
  • Tratamiento de variables faltantes
  • Tratamiento de outliers
  • Analisis univariado
  • Analisis Bivariado
  • Transformación de variables
  • Creación de variables
  1. Modelamiento (modeling)
  2. Puesta en marcha (Deployment)
  3. Aceptacion del usuario o cliente (Customer acceptance)

Paquete dplyr (RETOMEMOS CLASE ANTERIOR)

El paquete dplyr fue desarrollado por Hadley Wickham de RStudio y es un versión optimizada de su paquete plyr. El paquete dplyr no proporciona ninguna nueva funcionalidad a R per se, en el sentido que todo aquello que podemos hacer con dplyr lo podríamos hacer con la sintaxis básica de R.

Una importante contribución del paquete dplyr es que proporciona una “gramática” (particularmente verbos) para la manipulación y operaciones con dataframes.

Fuente: Programación en R

Se caracteriza por el signo %>% (pipe)

#install.packages("dplyr")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
url <- "https://raw.githubusercontent.com/edojimenez/r_datascience/main/titanic.csv"
titanic<-read.csv(url)

En general, los comandos que más se utilizan son:

Paquete dplyr: Ejemplos

Calcularemos el porcentaje de sobrevivencia por sexo

titanic %>% group_by(Sex) %>% summarise(mean(Survived)*100)

Calcularemos el porcentaje de sobrevivencia por clase

titanic %>% group_by(Pclass) %>% summarise(mean(Survived)*100)

Calcularemos el porcentaje de sobrevivencia por clase por sexo

titanic %>% group_by(Pclass, Sex) %>% summarise(promedio=mean(Survived)*100)
## `summarise()` has grouped output by 'Pclass'. You can override using the `.groups` argument.

Calcularemos cuánto pagaron en promedio por clase aquellos que sobrevivieron

titanic %>% filter(Survived==1) %>% group_by(Pclass) %>% summarise(mean(Fare)) 

Calcularemos cuantos vienen de cada puerto

titanic %>% group_by(Embarked) %>% summarise(total=n())

Calcularemos cuantos vienen por cada puerto por sexo

titanic %>% group_by(Embarked, Sex) %>% summarise(Total=n())
## `summarise()` has grouped output by 'Embarked'. You can override using the `.groups` argument.

Calcularemos cuantos vienen por cada puerto por sexo por clase

titanic %>% group_by(Embarked, Sex, Pclass) %>% summarise(Total=n())
## `summarise()` has grouped output by 'Embarked', 'Sex'. You can override using the `.groups` argument.

Exploración de los datos

La exploración de los datos posee los siguientes los siguientes etapas: - Inspección - Identificación de variables - Tratamiento de datos faltantes - Tratamiento de Outlier - Análisis univariado y bivariado - Transformación de variables - Creación de variables

Inspección

titanic %>% distinct  # Select only unique/distinct rows from a data frame.

Missing Values

No existen reglas rígidas sobre qué hacer en caso que las variables. En general, debo plantearme ciertas preguntas importantes: - Por qué tengo datos faltantes?

Los errores sobre la recolección de datos pueden ser principalmente de 3 tipos: + Missing at random + Missing dependiendo de valores no observados + Missing dependiendo del mismo valor

Qué se puede hacer con los missing entonces?

En general, las alternativas para tratar las observaciones faltantes, solo son válidas cuando la atrición de la base de datos es aleatoria.

Reconocimiento de Missings

summary(titanic)
##   PassengerId       Survived          Pclass          Name          
##  Min.   :  1.0   Min.   :0.0000   Min.   :1.000   Length:891        
##  1st Qu.:223.5   1st Qu.:0.0000   1st Qu.:2.000   Class :character  
##  Median :446.0   Median :0.0000   Median :3.000   Mode  :character  
##  Mean   :446.0   Mean   :0.3838   Mean   :2.309                     
##  3rd Qu.:668.5   3rd Qu.:1.0000   3rd Qu.:3.000                     
##  Max.   :891.0   Max.   :1.0000   Max.   :3.000                     
##                                                                     
##      Sex                 Age            SibSp           Parch       
##  Length:891         Min.   : 0.42   Min.   :0.000   Min.   :0.0000  
##  Class :character   1st Qu.:20.12   1st Qu.:0.000   1st Qu.:0.0000  
##  Mode  :character   Median :28.00   Median :0.000   Median :0.0000  
##                     Mean   :29.70   Mean   :0.523   Mean   :0.3816  
##                     3rd Qu.:38.00   3rd Qu.:1.000   3rd Qu.:0.0000  
##                     Max.   :80.00   Max.   :8.000   Max.   :6.0000  
##                     NA's   :177                                     
##     Ticket               Fare           Cabin             Embarked        
##  Length:891         Min.   :  0.00   Length:891         Length:891        
##  Class :character   1st Qu.:  7.91   Class :character   Class :character  
##  Mode  :character   Median : 14.45   Mode  :character   Mode  :character  
##                     Mean   : 32.20                                        
##                     3rd Qu.: 31.00                                        
##                     Max.   :512.33                                        
## 

Reconocimiento de Missings

Identifico las variables que tienen NA

colSums(is.na(titanic))
## PassengerId    Survived      Pclass        Name         Sex         Age 
##           0           0           0           0           0         177 
##       SibSp       Parch      Ticket        Fare       Cabin    Embarked 
##           0           0           0           0           0           0

¿Qué pasa si hago intento calcular estadísticas con la base como esta?

sum(titanic$Age)
## [1] NA
median(titanic$Age)
## [1] NA
mean(titanic$Age)
## [1] NA

¡¡NO FUNCIONA!!

Entonces, tengo que agregar na.rm para que los calculos ocurran adecuadamente

sum(titanic$Age, na.rm = TRUE)
## [1] 21205.17
mean(titanic$Age, na.rm = TRUE)
## [1] 29.69912
median(titanic$Age, na.rm = TRUE)
## [1] 28
max(titanic$Age, na.rm = TRUE)
## [1] 80

Clase 4: Missings, Outliers, creación y transformación de variables

Identificacion de la consistencia de las variables

Missing Values

Por qué es importante? Datos faltantes pueden reducir el ajuste de mi modelo o pueden tener sesgos porque no estamos analizando de manera correcta el comportamiento de las variables, es decir, estamos dejando asociaciones afuera que pueden llevar a una mala predicción o clasificación.

No existen reglas rígidas sobre qué hacer en caso que las variables. En general, debo plantearme ciertas preguntas importantes: - Por qué tengo datos faltantes? - Como afectan a mis resultados?

Los errores sobre la recolección de datos pueden ser principalmente de 3 tipos: + Missing at random + Missing dependiendo de valores no observados + Missing dependiendo del mismo valor

Qué se puede hacer con los missing entonces?

En general, las alternativas para tratar las observaciones faltantes, solo son válidas cuando la atrición de la base de datos es aleatoria.

Reconocimiento de Missings

url <- "https://raw.githubusercontent.com/edojimenez/r_datascience/main/titanic.csv"
titanic<-read.csv(url)

summary(titanic)
##   PassengerId       Survived          Pclass          Name          
##  Min.   :  1.0   Min.   :0.0000   Min.   :1.000   Length:891        
##  1st Qu.:223.5   1st Qu.:0.0000   1st Qu.:2.000   Class :character  
##  Median :446.0   Median :0.0000   Median :3.000   Mode  :character  
##  Mean   :446.0   Mean   :0.3838   Mean   :2.309                     
##  3rd Qu.:668.5   3rd Qu.:1.0000   3rd Qu.:3.000                     
##  Max.   :891.0   Max.   :1.0000   Max.   :3.000                     
##                                                                     
##      Sex                 Age            SibSp           Parch       
##  Length:891         Min.   : 0.42   Min.   :0.000   Min.   :0.0000  
##  Class :character   1st Qu.:20.12   1st Qu.:0.000   1st Qu.:0.0000  
##  Mode  :character   Median :28.00   Median :0.000   Median :0.0000  
##                     Mean   :29.70   Mean   :0.523   Mean   :0.3816  
##                     3rd Qu.:38.00   3rd Qu.:1.000   3rd Qu.:0.0000  
##                     Max.   :80.00   Max.   :8.000   Max.   :6.0000  
##                     NA's   :177                                     
##     Ticket               Fare           Cabin             Embarked        
##  Length:891         Min.   :  0.00   Length:891         Length:891        
##  Class :character   1st Qu.:  7.91   Class :character   Class :character  
##  Mode  :character   Median : 14.45   Mode  :character   Mode  :character  
##                     Mean   : 32.20                                        
##                     3rd Qu.: 31.00                                        
##                     Max.   :512.33                                        
## 
#Identifico las variables que tienen NA
colSums(is.na(titanic))
## PassengerId    Survived      Pclass        Name         Sex         Age 
##           0           0           0           0           0         177 
##       SibSp       Parch      Ticket        Fare       Cabin    Embarked 
##           0           0           0           0           0           0

Trabajo con los missings en R

#Hago estadistica con eso
#sum(titanic$Age)
#median(titanic$Age)
#mean(titanic$Age)

#Tengo que agregar na.rm para que los calculos ocurran adecuadamente
#sum(titanic$Age, na.rm = TRUE)
#mean(titanic$Age, na.rm = TRUE)
#median(titanic$Age, na.rm = TRUE)
#max(titanic$Age, na.rm = TRUE)

##Outliers Un outlier es una observación que diverge del resto de de la distribución de la variable. En general, pueden haber dos tipos outliers: Univariados y multivariados.

Existen diferentes fuentes de una variable outlier:

Los impactos de los outliers son los siguientes:

  1. Detectar un outlier Univariado Una forma de detectar lo outliers es por medio de un boxplot. Es un gráfico que muestra la distribución de una variable, la mediana, el quartil 25 y 75 y un rango de 1.5 RIQ.
library(dplyr)
titanic_numeric<-select_if(titanic, is.numeric)
boxplot(titanic_numeric)

#Voy a eliminar el numero de pasajeros
titanic_numeric<-titanic_numeric %>% select(-PassengerId)
boxplot(titanic_numeric)

#Veré solo el outlier de age
boxplot(titanic_numeric$Age)

  1. Outlier Bivariado Ejemplo práctico:Pondremos artificialmente outliers en una base de datos precargada.
# Agregamos los outliers en los datos
cars1 <- cars[1:30, ]  # original data
cars_outliers <- data.frame(speed=c(19,19,20,20,20), dist=c(190, 186, 210, 220, 218))  # Generamos un vector con los outliers
cars2 <- rbind(cars1, cars_outliers) # Pegamos outliers a los datos

# Hacemos un grafico con los datos con outliers
par(mfrow=c(1, 2))
plot(cars2$speed, cars2$dist, xlim=c(0, 28), ylim=c(0, 230), main="Con Outliers", xlab="speed", ylab="dist", pch="*", col="red", cex=2)
abline(lm(dist ~ speed, data=cars2), col="blue", lwd=3, lty=2)

# Datos originales sin outliers
plot(cars1$speed, cars1$dist, xlim=c(0, 28), ylim=c(0, 230), main="Sin outliers", xlab="speed", ylab="dist", pch="*", col="red", cex=2)
abline(lm(dist ~ speed, data=cars1), col="blue", lwd=3, lty=2)

link

¿Qué hacer con los outliers?

Ejercicio práctico 1: Queremos ver cómo cambia la caracterización de los sobrevivientes en cuanto a la edad según el tipo de imputación.

Rerefencia: Bases sin hacer ningun tipo de cambio

titanic %>%  group_by(Survived) %>%  summarise(Mean_age=mean(Age,na.rm = TRUE), Total=n())

Todas las observaciones que tengan algún missings y eliminar los outliers

Dado esto, que nos parece eliminar las variables?

titanic_sinna <- titanic[complete.cases(titanic), ] # Solo me quedo 
titanic_sinna %>%  group_by(Survived) %>%  summarise(Mean_age=mean(Age,na.rm = TRUE), Total=n())

Imputacion a la media

titanic_imputado_media<-titanic
titanic_imputado_media$Age[is.na(titanic_imputado_media$Age)] <- mean(titanic_imputado_media$Age, na.rm = TRUE)
titanic_imputado_media %>%  group_by(Survived) %>%  summarise(Mean_age=mean(Age, Total=n()))

La media parece ser un buen predictor, sin embargo, que cambió?

hist(titanic$Age, xlab='Age', main="Antes de la imputación")

hist(titanic_sinna$Age, xlab='Age', main="Eliminación NA")

hist(titanic_imputado_media$Age, xlab='Age', main="Imputación a la media")

Ejercicio práctico 2: Analisis de Base de datos sin conocer

#Importamos la base de datos

Cuántas observaciones hay por lealtad?

Cuántas observaciones hay por lealtad y genero?

Cuántos casas existen en la base de datos?

Existen varitas que se repitan? cuáles?

Existen variables con missings?

Existen variables outliers?