Es la disciplina que permite convertir datos en conocimiento accionable.
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.
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:
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.
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
titanic %>% distinct # Select only unique/distinct rows from a data frame.
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
En general, las alternativas para tratar las observaciones faltantes, solo son válidas cuando la atrición de la base de datos es aleatoria.
Eliminación: Puedo borrar toda las variables que tengan alguna observacion, sin embargo, reduce el poder predictivo de la muestra. Otra forma es eliminar esa observación en particular, sin embargo, existe el problema que tengo diferentes tamaños para cada variable.
Imputación: Se puede imputar la media, mediana o la moda a las observaciones faltantes. Existen dos tipos de datos posibles: Imputación generalizada o imputación por casos similares.
Predicción: Crear un modelo predictivo para estimar los valores que van a sustituitr los datos. En general, este procedimiento consta de separar la base de datos en dos, una que no contiene datos faltantes y otra que si lo tiene.
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
¿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
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
En general, las alternativas para tratar las observaciones faltantes, solo son válidas cuando la atrición de la base de datos es aleatoria.
Eliminación: Puedo borrar toda las variables que tengan alguna observacion, sin embargo, reduce el poder predictivo de la muestra. Otra forma es eliminar esa observación para cada columna en particular, sin embargo, existe el problema de diferentes tamaños para cada variable.
Imputación: Se puede imputar la media, mediana o la moda a las observaciones faltantes. Existen dos tipos de datos posibles: Imputación generalizada o imputación por casos similares.
Predicción: Crear un modelo predictivo para estimar los valores que van a sustituitr los datos. En general, este procedimiento consta de separar la base de datos en dos, una que no contiene datos faltantes y otra que si lo tiene.
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:
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)
# 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)
¿Qué hacer con los outliers?
titanic %>% group_by(Survived) %>% summarise(Mean_age=mean(Age,na.rm = TRUE), Total=n())
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())
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")
#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?