-
Notifications
You must be signed in to change notification settings - Fork 1
/
titanic_eda.Rmd
165 lines (117 loc) · 5.22 KB
/
titanic_eda.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
---
title: 'EDA Titanic'
author: "Autor: Víctor Aceña Gil"
output:
html_document:
highlight: default
number_sections: yes
theme: cosmo
toc: yes
toc_depth: 2
pdf_document:
highlight: zenburn
toc: yes
word_document: default
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
******
# Ejemplo de estudio visual con el juego de datos Titanic
******
## Procesos de limpieza del juego de datos
Primer contacto con el juego de datos, visualizamos su estructura.
```{r echo=TRUE, message=FALSE, warning=FALSE}
# Cargamos los paquetes R que vamos a usar
library(ggplot2)
library(dplyr)
library(summarytools)
# Guardamos el juego de datos test y train en un único dataset
test <- read.csv('titanic-test.csv',stringsAsFactors = FALSE)
train <- read.csv('titanic-train.csv', stringsAsFactors = FALSE)
# Unimos los dos juetos de datos en uno solo
totalData <- bind_rows(train,test)
filas=dim(train)[1]
# Verificamos la estructura del juego de datos
str(totalData)
```
```{r}
print(dfSummary(totalData), method = 'render')
```
Trabajamos los atributos con valores vacíos.
```{r echo=TRUE, message=FALSE, warning=FALSE}
# Estadísticas de valores vacíos
colSums(is.na(totalData))
colSums(totalData=="")
# Tomamos valor "C" para los valores vacíos de la variable "Embarked"
totalData$Embarked[totalData$Embarked==""] = "C"
# Tomamos la media para valores vacíos de la variable "Age"
totalData$Age[is.na(totalData$Age)] <- mean(totalData$Age,na.rm=T)
```
Discretizamos cuando tiene sentido y en función de cada variable. (**CAMBIO P1**: Actualizar para incluir en las columnas a discretizar "Sex" y "Embarked" - prueba para git - Probamos un merge).
Actualizar para incluir en las columnas a discretizar "Sex" y "Embarked" - prueba para git).
```{r echo=TRUE, message=FALSE, warning=FALSE}
# ¿Para qué variables tendrá sentido un proceso de discretización?
apply(totalData,2, function(x)
length(unique(x)))
# Discretizamos las variables con pocas clases
cols<-c("Survived","Pclass","Sex","Embarked")
for (i in cols){
totalData[,i] <- as.factor(totalData[,i])
}
```
**CAMBIO P2**: Volvemos a mostrar el dataset para ver como se ha actualizado con los cambios.--HECHO
```{r echo=TRUE, message=FALSE, warning=FALSE}
```
print(dfSummary(totalData), method = 'render')
## Procesos de análisis del juego de datos
Nos proponemos analizar las relaciones entre las diferentes variables del juego de datos.
```{r echo=TRUE, message=FALSE, warning=FALSE}
ggplot(data=totalData[1:filas,],aes(x=Sex,fill=Survived))+geom_bar(position="fill")+geom_bar(position="fill")
```
**CAMBIO P3333333:** Repetimos la grafica anterior utilizando la columna Embarked.
```{r echo=TRUE, message=FALSE, warning=FALSE}
ggplot(data = totalData[1:filas,],aes(x=Embarked,fill=Survived))+geom_bar(position="fill")+ylab("Frecuencia")
```
Obtenemos una matriz de porcentajes de frecuencia.
Vemos, por ejemplo que la probabilidad de sobrebivir si se embarca en "C" es de un **CAMBIO P1**: Poner probabilidad %, "Q" es de un **CAMBIO P2**: Poner probabilidad % y por último "S" es de un **CAMBIO P3**: Poner probabilidad %.
```{r echo=TRUE, message=FALSE, warning=FALSE}
t<-table(totalData[1:filas,]$Embarked,totalData[1:filas,]$Survived)
for (i in 1:dim(t)[1]){
t[i,]<-t[i,]/sum(t[i,])*100
}
t
```
Veamos ahora como en un mismo gráfico de frecuencias podemos trabajar con 3 variables: Embarked, Survived y Pclass.
```{r echo=TRUE, message=FALSE, warning=FALSE}
# Now, let's devide the graph of Embarked by Pclass:
ggplot(data = totalData[1:filas,],aes(x=Embarked,fill=Survived))+geom_bar(position="fill")+facet_wrap(~Pclass)
```
**CAMBIO P3**: Repetir gráfica anterior pero agrupando por sexo
```{r echo=TRUE, message=FALSE, warning=FALSE}
```
Comparemos ahora dos gráficos de frecuencias: Survived-SibSp y Survived-Parch
```{r echo=TRUE, message=FALSE, warning=FALSE}
# Survivial como función de SibSp y Parch
ggplot(data = totalData[1:filas,],aes(x=SibSp,fill=Survived))+geom_bar()
```
**CAMBIO P2**: Repetir grafica para la variable Parch
```{r echo=TRUE, message=FALSE, warning=FALSE}
```
Veamos un ejemplo de construcción de una variable nueva: Tamaño de familia
```{r echo=TRUE, message=FALSE, warning=FALSE}
# Construimos un atributo nuevo: family size.
totalData$FamilySize <- totalData$SibSp + totalData$Parch +1;
totalData1<-totalData[1:filas,]
ggplot(data = totalData1[!is.na(totalData[1:filas,]$FamilySize),],aes(x=FamilySize,fill=Survived))+geom_histogram(binwidth =1,position="fill")+ylab("Probabilidad")
# Observamos como familias de entre 2 y 6 miembros tienen más del 50% de posibilidades de supervivencia.
```
Veamos ahora dos gráficos que nos compara los atributos Age y Survived.
Observamos como el parámetro position="fill" nos da la proporción acumulada de un atributo dentro de otro
```{r echo=TRUE, message=FALSE, warning=FALSE}
# Survival como función de age:
ggplot(data = totalData1[!(is.na(totalData[1:filas,]$Age)),],aes(x=Age,fill=Survived))+geom_histogram(binwidth =3)
```
**CAMBIO P1**: Repetir el histograma anterior cambiando la frecuencia por la probabilidad de superviviencia (Añadir el parámetro position="fill" en geom_histogram y la etiqueta ylab("Frecuencia"))
```{r echo=TRUE, message=FALSE, warning=FALSE}
```