Está en la página 1de 33

A1 - Preproceso de datos

Solución

Semestre 2021.1

Índice
1. Carga del archivo 3

2. Duplicación de códigos 4

3. Nombres de las variables 5

4. Normalización de los datos cualitativos 5


4.1. Marital Status . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
4.2. Género . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6

5. Normalización de los datos cuantitativos 6


5.1. IniCost y UltCost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
5.2. Edad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
5.3. WeeklyWages, HoursWeek, DaysWeek . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

6. Valores atípicos 13

7. Imputación de valores 17

8. Preparación de los datos 25


8.1. Tiempo de abertura del expediente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
8.2. Diferencia entre IniCost y UltCost . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

9. Estudio descriptivo 27
9.1. Funciones de media y dispersión robustas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
9.2. Estudio descriptivo de las variables cuantitativas . . . . . . . . . . . . . . . . . . . . . . . . . 28

10.Archivo final 33

11.Evaluación de la actividad 33

1
Introducción
En esta actividad realizaremos el preprocesado de un fichero de datos que contiene información de una
muestra de indemnizaciones otorgadas por una compañía de seguros, en función del tiempo de baja laboral del
trabajador. El conjunto de datos tiene 54000 registros y 15 variables. Los datos se han extraído y modificado
parcialmente (por motivos académicos) de la base de datos train3.csv disponible en la plataforma Kaggle:
https://www.kaggle.com/c/actuarial-loss-estimation.
Las variables del fichero de datos son:
ClaimNumber: Identificador de la póliza.
DateTimeOfAccident: Fecha del accidente.
DateReported: Fecha que se comunica a la compañía y se abre el expediente.
Age: Edad del trabajador.
Gender: Sexo.
MaritalStatus: Estado civil, (M)arried, (S)ingle, (U)nknown, (W)idowed, (D)ivorced.
DependentChildren: Número de hijos dependientes.
DependentsOther: Número de dependientes excluyendo hijos.
WeeklyWages: Salario semanal (en EUR).
PartTimeFullTime: Jornada laboral, Part time (P) o Full time(F).
HoursWorkedPerWeek: Número horas por semana.
DaysWorkedPerWeek: Número de días por semana.
ClaimDescription: Descripción siniestros.
InitialIncurredClaimCost: Estimación inicial del coste realizado por la compañía.
UltimateIncurredClaimCost: Coste total pagado por siniestro.
El objetivo de esta actividad es preparar el fichero para su posterior análisis. Para ello, se examinará el fichero
para detectar y corregir posibles errores, inconsistencias y valores perdidos. Además, se presentará una breve
estadística descriptiva.
Criterios de verificación y de normalización de las variables:
A continuación se muestran los criterios con los que deben limpiarse los datos del conjunto:
1. Verificar si hay registros duplicados con el valor ClaimNumber. En caso de duplicación, se deben asignar
nuevos códigos no repetidos.
2. Los valores posibles en la variable MaritalStatus son: M (married), S (single), U (unknown), D (divorced),
W (widowed).
3. Los valores posibles en la variable Género son: F (femenino), M (masculino), U (unknown).
4. En los datos numéricos, el símbolo de separador decimal es el punto y no la coma.
5. Las variables InititalIncurredClaimsCost y UltimateIncurredClaimsCost se debe expresar como variables
numéricas (de tipo entero), en unidades (no en miles) y sin decimales. ‘
6. La variable Edad y DaysWorkedPerWeek deben ser de tipo entero, sin decimales.
7. Las variables WeeklyWages, HoursWorkedPerWeek deben expresarse como variables numéricas y si es
necesario, con decimales.

2
Para realizar el preproceso del fichero, seguir los pasos que se indican a continuación.
Aspectos importantes a tener en cuenta para entregar la actividad:
Es necesario entregar el archivo Rmd y el fichero de salida (PDF o html). El archivo de salida debe
incluir: el código y el resultado de la ejecución del código (paso a paso).
Se debe respetar la misma numeración de los apartados que el enunciado. Si un apartado no se responde,
se puede dejar en blanco para respetar el orden y numeración del documento.
No se pueden realizar listados completos del conjunto de datos en la solución. Esto generaría un
documento con cientos de páginas y dificulta la revisión del texto. Para comprobar las funcionalidades
del código sobre los datos, se pueden usar las funciones head y tail que sólo muestran unas líneas del
fichero de datos.
Se valora la precisión de los términos. Es decir, se debe usar la terminología propia de la estadística.
Se valora también la concisión en la respuesta. No se trata de hacer explicaciones muy largas o
documentos muy extensos. El documento debe estar bien estructurado y ser conciso.

1. Carga del archivo


Cargar el archivo de datos y examinar el tipo de datos con los que R ha interpretado cada variable. Examinar
también los valores resumen de cada tipo de variable.
ds<-read.csv("train3.csv", sep=";", stringsAsFactors=TRUE)

# Obtenemos las dimensiones del conjunto de datos, y su estructura y contenido.


dim(ds)

## [1] 54000 15
str(ds)

## 'data.frame': 54000 obs. of 15 variables:


## $ ClaimNumber : Factor w/ 53996 levels "WC1592889","WC1592905",..: 42980 34371 24824 52
## $ DateTimeOfAccident : Factor w/ 36673 levels "1988-01-01T09:00:00Z",..: 28968 22374 16652 355
## $ DateReported : Factor w/ 6653 levels "1988-01-08T00:00:00Z",..: 5278 4020 3009 6390 98
## $ Age : int 48 43 30 41 36 50 39 56 49 30 ...
## $ Gender : Factor w/ 5 levels "f","F","Fm","M",..: 4 2 4 4 4 4 4 4 4 4 ...
## $ MaritalStatus : Factor w/ 10 levels "","d","D","m",..: 5 4 8 7 5 5 5 5 5 7 ...
## $ DependentChildren : int 0 0 0 0 0 0 0 0 0 0 ...
## $ DependentsOther : int 0 0 0 0 0 0 0 0 0 0 ...
## $ WeeklyWages : Factor w/ 13211 levels "1","1,91","10",..: 8051 8272 11506 9230 4875 14
## $ PartTimeFullTime : Factor w/ 2 levels "F","P": 1 1 1 1 1 1 1 1 1 1 ...
## $ HoursWorkedPerWeek : Factor w/ 424 levels "0","1","10","10,22",..: 227 224 227 227 227 227 2
## $ DaysWorkedPerWeek : int 5 5 5 5 5 5 5 5 5 5 ...
## $ ClaimDescription : Factor w/ 28114 levels "A BACK AND HIT HAND CRUSHED INJURY LEFT HAND",.
## $ InitialIncurredCalimsCost: int 1500 5500 1700 15000 2800 500 500 500 925 1500 ...
## $ UltimateIncurredClaimCost: Factor w/ 54000 levels "0.07782292246K",..: 34330 42562 17536 11588 312
summary(ds)

## ClaimNumber DateTimeOfAccident DateReported


## WC8668542: 3 1991-02-19T11:00:00Z: 9 2001-03-29T00:00:00Z: 25
## WC3501716: 2 2001-05-01T14:00:00Z: 9 1997-09-11T00:00:00Z: 22
## WC6383678: 2 1993-03-22T11:00:00Z: 8 2000-11-22T00:00:00Z: 22

3
## WC1592889: 1 1988-05-23T10:00:00Z: 7 1991-10-24T00:00:00Z: 21
## WC1592905: 1 1989-10-20T09:00:00Z: 7 2005-02-24T00:00:00Z: 21
## WC1592998: 1 1989-10-25T10:00:00Z: 7 2001-07-12T00:00:00Z: 20
## (Other) :53990 (Other) :53953 (Other) :53869
## Age Gender MaritalStatus DependentChildren
## Min. : 13.00 f : 534 S :26161 Min. :0.0000
## 1st Qu.: 23.00 F :11507 M :21862 1st Qu.:0.0000
## Median : 32.00 Fm: 297 U : 5294 Median :0.0000
## Mean : 34.06 M :41660 married: 316 Mean :0.1192
## 3rd Qu.: 43.00 U : 2 m : 242 3rd Qu.:0.0000
## Max. :999.00 D : 63 Max. :9.0000
## (Other): 62
## DependentsOther WeeklyWages PartTimeFullTime HoursWorkedPerWeek
## Min. :0.000000 200 :12372 F:49112 38 :30829
## 1st Qu.:0.000000 500 : 4271 P: 4888 40 :13283
## Median :0.000000 300 : 570 20 : 894
## Mean :0.009944 400 : 389 30 : 837
## 3rd Qu.:0.000000 350 : 336 35 : 743
## Max. :5.000000 600 : 294 37,5 : 663
## (Other):35768 (Other): 6751
## DaysWorkedPerWeek ClaimDescription
## Min. :1.000 SLIPPED ON ROLLER TENDONITIS RIGHT SHOULDER : 289
## 1st Qu.:5.000 SORTING ALUMINIUM BARS STRAIN SHOULDER NECK : 278
## Median :5.000 SLIPPED USING LATHE IN EYE CORNEA : 258
## Mean :4.906 REDBACK SPIDER BITE RIGHT FOOT RIGHT FRACTURE: 256
## 3rd Qu.:5.000 LIFTING TYRES LOWER BACK STRAIN : 255
## Max. :7.000 LIFTING BACK STRAIN LOWER BACK STRAIN : 253
## (Other) :52411
## InitialIncurredCalimsCost UltimateIncurredClaimCost
## Min. : 1 0.07782292246K: 1
## 1st Qu.: 700 0.1026406584K : 1
## Median : 2000 0.1077643807K : 1
## Mean : 7841 0.1095639966K : 1
## 3rd Qu.: 9500 0.1561992664K : 1
## Max. :2000000 0.1684405259K : 1
## (Other) :53994

2. Duplicación de códigos
Verificad la consistencia en la variable ClaimNumber. Si existen registros duplicados, asignad un nuevo código
para evitar códigos duplicados. El nuevo código debe ser un valor no usado (valores superiores al máximo
valor numérico contenido en ClaimNumber). Conservad el mismo formato que el resto de códigos, con “WC”
delante de la secuencia numérica. Podéis usar la función duplicated de R para detectar los duplicados.
#detectamos si existe códigos duplicados
sum( table(ds$ClaimNumber)>1 )

## [1] 3
#Códigos
codes <- as.character( ds$ClaimNumber )
#posiciones que contienen códigos repetidos
idx <- which( duplicated(codes) == TRUE ); idx

## [1] 111 40049 50091 50279

4
#N es el número de registros duplicados
N <- length(idx); N

## [1] 4
#Generamos una secuencia correlativa desde max+1
max.code <- max( as.numeric( str_sub(codes, 3) )) + 1
new.codes <- seq( max.code, max.code + N-1 )
#Asignamos los nuevos códigos, siguiendo el formato del código con "WC" delante de los dígitos
codes[idx] <- paste("WC", new.codes, sep="")
#Comprobamos
codes[idx]

## [1] "WC9999962" "WC9999963" "WC9999964" "WC9999965"


sum( table(codes)>1 )

## [1] 0
ds$ClaimNumber <- codes

3. Nombres de las variables


Simplificad el nombre de algunas variables para hacer más fácil su manejo. En concreto, cambiad el nombre
de las variables:
InitialIncurredClaimCost por IniCost
UltimateIncurredClaimCost por UltCost
HoursWorkedPerWeek por HoursWeek
DaysWorkedPerWeek por DaysWeek
colnames(ds)[ colnames(ds)=="InitialIncurredCalimsCost" ] = "IniCost"
colnames(ds)[ colnames(ds)=="UltimateIncurredClaimCost" ] = "UltCost"
colnames(ds)[ colnames(ds)=="HoursWorkedPerWeek" ] = "HoursWeek"
colnames(ds)[ colnames(ds)=="DaysWorkedPerWeek" ] = "DaysWeek"

colnames(ds)

## [1] "ClaimNumber" "DateTimeOfAccident" "DateReported"


## [4] "Age" "Gender" "MaritalStatus"
## [7] "DependentChildren" "DependentsOther" "WeeklyWages"
## [10] "PartTimeFullTime" "HoursWeek" "DaysWeek"
## [13] "ClaimDescription" "IniCost" "UltCost"
En el resto del enunciado, usaremos los nuevos nombres de estas variables.

4. Normalización de los datos cualitativos


4.1. Marital Status
Los valores posibles en marital status son: M (married), S (single), U (unknown), D (divorced), W (widowed).
Los valores nulos corresponden a unknown. Si hay valores perdidos (vacíos), modificad estos registros vacíos
para que en su lugar aparezca U (unknown). Revisad también la consistencia del resto de valores de esta
variable.

5
levels(ds$MaritalStatus)

## [1] "" "d" "D" "m" "M" "married" "S"


## [8] "U" "w" "W"
ds$MaritalStatus[ which( ds$MaritalStatus=="") ] <- "U"
ds$MaritalStatus[ grep( "m", ds$MaritalStatus )] <- "M"
ds$MaritalStatus[ grep( "d", ds$MaritalStatus )] <- "D"
ds$MaritalStatus[ grep( "w", ds$MaritalStatus )] <- "W"
ds$MaritalStatus <- as.factor(ds$MaritalStatus)
levels(ds$MaritalStatus)

## [1] "" "d" "D" "m" "M" "married" "S"


## [8] "U" "w" "W"
levels(ds$MaritalStatus) <- as.factor( as.character(ds$MaritalStatus))
levels(ds$MaritalStatus)

## [1] "M" "U" "S" "W" "D"


#Verificando si existen valores NA en MaritalStatus
sum( complete.cases(ds$MaritalStatus) )

## [1] 54000

4.2. Género
Revisad la consistencia de los valores de la variable género y realizad las modificaciones oportunas.
table( ds$Gender )

##
## f F Fm M U
## 534 11507 297 41660 2
str( ds$Gender )

## Factor w/ 5 levels "f","F","Fm","M",..: 4 2 4 4 4 4 4 4 4 4 ...


levels( ds$Gender )

## [1] "f" "F" "Fm" "M" "U"


levels( ds$Gender )<-c( "F", "F", "F", "M", "U")
table( ds$Gender )

##
## F M U
## 12338 41660 2

5. Normalización de los datos cuantitativos


Inspeccionar los valores de los datos cuantitativos y realizar las normalizaciones oportunas siguiendo los
criterios especificados anteriormente. Estas normalizaciones tienen como objetivo uniformizar los formatos. Si
hay valores perdidos o valores extremos, se tratarán más adelante.
Al realizar estas normalizaciones, se debe demostrar que la normalización sobre cada variable ha dado el
resultado esperado. Por lo tanto, se recomienda mostrar un fragmento del archivo de datos resultante. Para
evitar mostrar todo el conjunto de datos, se puede mostrar una parte del mismo, con las funciones head y/o
tail.

6
Seguid el orden de los apartados.

5.1. IniCost y UltCost


Revisad el formato de estas variables según el criterio indicado más arriba. Si existen valores extremos, se
tratarán más adelante.
#IniCost
class(ds$IniCost)

## [1] "integer"
head(ds$IniCost)

## [1] 1500 5500 1700 15000 2800 500


tail(ds$IniCost)

## [1] 15000 1000 1000 210 7500 550


summary(ds$IniCost)

## Min. 1st Qu. Median Mean 3rd Qu. Max.


## 1 700 2000 7841 9500 2000000
boxplot(ds$IniCost, main="IniCost")

IniCost
1500000
500000
0

#No se realizan modificaciones sobre IniCost.

#Ultcost
class(ds$UltCost)

7
## [1] "factor"
head(ds$UltCost); tail(ds$UltCost)

## [1] 4303.188001 6105.872938 2098.629955 16282.94081 3771.73258 746.6213097


## 54000 Levels: 0.07782292246K 0.1026406584K 0.1077643807K ... 9999.988695
## [1] 12767.75935 518.9855693 1005.422109 488.0740925 2630.212383 1090.586477
## 54000 Levels: 0.07782292246K 0.1026406584K 0.1077643807K ... 9999.988695
#Cambiamos la coma decimal por el punto y pasamos a unidades.
ds$UltCost <- as.character( ds$UltCost )
ds$UltCost<-gsub("\\,", "\\.", as.character(ds$UltCost) )
idx.k <- grep("k|K", ds$UltCost)
ds$UltCost[idx.k] <- as.numeric( str_extract(ds$UltCost[idx.k], "([[:digit:]]|(\\.))*"))*1000
ds$UltCost <- round( as.numeric( ds$UltCost ) )
head(ds$UltCost)

## [1] 4303 6106 2099 16283 3772 747


tail(ds$UltCost)

## [1] 12768 519 1005 488 2630 1091


boxplot(ds$UltCost, main="UltCost")

UltCost
1000000
500000
0

5.2. Edad
Revisad el formato de la variable Edad y realizad las transformaciones oportunas según los criterios especifi-
cados anteriormente. Si existen valores extremos, se tratarán más adelante.

8
class(ds$Age)

## [1] "integer"
boxplot(ds$Age, main="Age")

Age
1000
800
600
400
200
0

#No se realizan transformaciones. Age es entero y los valores extremos se revisan más adelante.

5.3. WeeklyWages, HoursWeek, DaysWeek


Revisad el formato de estas variables y realizad las transformaciones oportunas según los criterios especificados
anteriormente. Visualizad la distribución de los valores en estas tres variables, usando el tipo de gráfico
adecuado. Si existen valores extremos, se tratarán más adelante.
#WeeklyWages
class(ds$WeeklyWages)

## [1] "factor"
head( ds$WeeklyWages, 30)

## [1] 500 509,34 709,1 555,46 377,1 200 200 200 623,6 857,28
## [11] 480,77 200 391,8 386,18 515 525 347,15 200 320 200
## [21] 300 443,95 200 200 539,97 500 251,08 276,6 500 802,92
## 13211 Levels: 1 1,91 10 10,08 10,15 10,25 10,27 10,3 10,32 10,35 10,4 ... 999,99
ds$WeeklyWages <- as.character( ds$WeeklyWages )
#corregimos la coma por el punto decimal
ds$WeeklyWages <- gsub("\\,","\\.", ds$WeeklyWages)

9
ds$WeeklyWages <- as.numeric( ds$WeeklyWages )
head( ds$WeeklyWages, 30)

## [1] 500.00 509.34 709.10 555.46 377.10 200.00 200.00 200.00 623.60 857.28
## [11] 480.77 200.00 391.80 386.18 515.00 525.00 347.15 200.00 320.00 200.00
## [21] 300.00 443.95 200.00 200.00 539.97 500.00 251.08 276.60 500.00 802.92
boxplot( ds$WeeklyWages, main="WeeklyWages" )

WeeklyWages
6000
4000
2000
0

#HoursWeek
class(ds$HoursWeek)

## [1] "factor"
head( ds$HoursWeek, 30)

## [1] 38 37,5 38 38 38 38 38 40 38 37 40 38 38 38 38
## [16] 40 36 38 40 38 38 40 38 38 37 38 38 12,5 38 40
## 424 Levels: 0 1 10 10,22 10,5 10,57 10,75 100 11 11,25 11,5 11,75 12 ... 93
ds$HoursWeek <- as.character( ds$HoursWeek )
ds$HoursWeek <- gsub("\\,","\\.", ds$HoursWeek)
ds$HoursWeek <- as.numeric( ds$HoursWeek )
head( ds$HoursWeek, 30)

## [1] 38.0 37.5 38.0 38.0 38.0 38.0 38.0 40.0 38.0 37.0 40.0 38.0 38.0 38.0 38.0
## [16] 40.0 36.0 38.0 40.0 38.0 38.0 40.0 38.0 38.0 37.0 38.0 38.0 12.5 38.0 40.0

10
boxplot( ds$HoursWeek, main="HoursWeek" )

HoursWeek
500
300
100
0

hist( ds$HoursWeek,breaks=30, xlab="Horas por semana", ylab="Frecuencia" )

11
Histogram of ds$HoursWeek
50000
30000
Frecuencia

10000
0

0 100 200 300 400 500 600

Horas por semana

#DaysWeek
class(ds$DaysWeek)

## [1] "integer"
head(ds$DaysWeek, 30)

## [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 2 5 5
boxplot( ds$DaysWeek, main="DaysWeek")

12
DaysWeek
7
6
5
4
3
2
1

6. Valores atípicos
Revisad si hay valores atípicos en las variables Edad, WeeklyWages, HoursWeek, y DaysWeek. Si se trata
de un valor anómalo, es decir anormalmente alto o bajo, substituir su valor por NA y posteriormente se
imputará.
#Age
boxplot(ds$Age, main="Age")

13
Age
1000
800
600
400
200
0

x<-boxplot.stats(ds$Age)$out
idx <- which( ds$Age %in % x)
sort(ds$Age[idx])

## [1] 74 74 74 74 74 74 74 75 75 75 75 75 76 76 76 76 78 78 79
## [20] 79 80 81 999 999 999 999 999 999 999 999 999 999 999 999
#se asigna NA a los valores 999. El resto se deja como está.
ds$Age[ ds$Age > 990 ] <- NA

#WeeklyWages
boxplot(ds$WeeklyWages, main="WeeklyWages")

14
WeeklyWages
6000
4000
2000
0

x<-boxplot.stats(ds$WeeklyWages)$out
length(x)

## [1] 1478
sort(x)[1:100]

## [1] 950.18 950.18 950.45 950.45 950.83 951.00 951.00 951.28 951.30 951.92
## [11] 952.00 952.05 952.05 952.28 952.60 952.67 952.70 953.00 953.60 953.60
## [21] 953.84 954.05 954.05 954.61 954.65 954.78 955.14 955.17 955.17 955.22
## [31] 956.05 957.00 957.11 957.23 957.23 957.27 957.58 958.37 958.37 958.64
## [41] 958.84 958.87 959.00 959.40 959.78 960.00 960.00 960.00 960.00 960.00
## [51] 960.00 960.00 960.00 960.00 960.00 960.00 960.00 960.00 960.00 960.00
## [61] 960.00 960.00 960.00 960.00 960.00 960.05 960.75 960.75 960.95 960.95
## [71] 961.00 961.00 961.14 961.29 961.35 961.50 961.50 961.50 961.53 961.53
## [81] 961.53 961.53 961.54 961.54 961.54 961.54 961.54 961.54 961.54 961.60
## [91] 961.60 961.64 961.64 961.78 962.08 963.30 963.30 964.00 964.00 964.70
#No se cambian valores porque a pesar de destacar muchos valores
#como outliers, como se ve en el boxplot, no se consideran valores anómalos.

#HoursWeek
boxplot(ds$HoursWeek,main="HoursWeek")

15
HoursWeek
500
300
100
0

x<-boxplot.stats(ds$HoursWeek)$out
sum(ds$HoursWeek>50)

## [1] 1038
idx <- which( ds$HoursWeek %in % x)
head( sort(ds$HoursWeek[idx],decreasing=TRUE) , 30)

## [1] 640.00 638.00 638.00 627.00 627.00 538.30 538.30 462.08 462.08 450.00
## [11] 450.00 450.00 417.20 410.00 410.00 400.00 400.00 400.00 389.00 389.00
## [21] 389.00 387.00 387.00 387.00 387.00 385.00 383.00 380.00 360.00 360.00
#se asigna NA a los valores mayores de 50. Si usáis otro criterio menos restrictivo, también lo consid
#El resto se deja como está.
ds$HoursWeek[ ds$HoursWeek > 50 ] <- NA

#DaysWeek
boxplot(ds$DaysWeek,main="DaysWeek")

16
DaysWeek
7
6
5
4
3
2
1

#Los valores son correctos. No se modifica.

7. Imputación de valores
Buscad si existen valores perdidos en las variables cuantitativas Age, WeeklyWages, HoursWeek, IniCost y
UltCost
En caso de valores perdidos, aplicad el proceso siguiente:
Para Age, aplicad imputación por la media aritmética.
En el resto de variables, aplicad imputación por vecinos más cercanos, usando la distancia de Gower,
considerando en el cómputo de los vecinos más cercanos el resto de variables cuantitativas mencionadas
en este apartado. Además, considerad que la imputación debe hacerse con registros del mismo género.
Es decir, si un registro a imputar es de género "M", se debe realizar la imputación usando las variables
cuantitativas de los registros de género "M". Para realizar esta imputación, podéis usar la función "kNN"
de la librería VIM.
Mostrad que la imputación se ha realizado correctamente, mostrando el resultado de los datos afectados por
la imputación.
sum(complete.cases(ds$Age))

## [1] 53988
sum(complete.cases(ds$WeeklyWages))

## [1] 54000

17
sum(complete.cases(ds$HoursWeek))

## [1] 52962
sum(complete.cases(ds$IniCost))

## [1] 54000
sum(complete.cases(ds$UltCost))

## [1] 54000
#Hay valores perdidos en Age y HoursWeek
#Age
idx <- which(is.na(ds$Age))
ds$Age[idx]

## [1] NA NA NA NA NA NA NA NA NA NA NA NA
ds$Age[idx] <- round( mean( ds$Age, na.rm=TRUE ))
ds$Age[idx]

## [1] 34 34 34 34 34 34 34 34 34 34 34 34
#Valores perdidos en HoursWeek
variables.num <- which( colnames(ds) %in % c("HoursWeek", "WeeklyWages", "IniCost", "UltCost"))
idx <- which( is.na(ds$HoursWeek))
#Identificamos por separado los NAs de género femenino y masculino
fem.idx <- which( is.na(ds$HoursWeek) & (ds$Gender=="F") ); fem.idx

## [1] 1205 2887 3192 3519 4312 4364 4709 4802 5233 5511 6075 6132
## [13] 6361 6385 6431 7498 7529 7552 7772 8048 8689 8860 9237 9539
## [25] 10054 10125 10901 11139 11204 11271 11323 11914 12683 12900 13309 14811
## [37] 15958 16160 16190 16272 17272 18361 18799 20020 21368 21459 21967 22290
## [49] 25212 25286 25795 26353 26519 27701 28372 28384 28844 30090 30367 30538
## [61] 30809 31091 31292 32197 32346 32903 32981 33673 33821 33926 33975 34399
## [73] 34664 35032 36167 36445 36869 37607 38289 38302 38760 38989 38992 39264
## [85] 39367 39446 39725 39856 39865 39975 40162 40627 40694 42513 44953 45245
## [97] 47222 47336 47384 48071 48834 49180 49596 49688 50495 51287 52304 52596
## [109] 52734 52889 53447 53743
mas.idx <- which( is.na(ds$HoursWeek) & ds$Gender=="M"); mas.idx

## [1] 105 139 144 216 242 258 308 324 335 411 481 513
## [13] 577 608 620 654 834 974 979 1031 1096 1339 1340 1365
## [25] 1387 1436 1459 1510 1774 1897 1909 1924 1932 1935 1967 2101
## [37] 2131 2196 2214 2222 2247 2249 2427 2439 2500 2608 2640 2695
## [49] 2729 2847 2894 2939 2955 3181 3289 3395 3399 3500 3570 3651
## [61] 3692 3697 3711 3741 3743 3772 3855 3987 4025 4147 4478 4489
## [73] 4503 4523 4540 4549 4594 4672 4769 4791 4829 4845 4961 5059
## [85] 5160 5201 5230 5303 5309 5327 5351 5377 5433 5473 5489 5494
## [97] 5514 5541 5585 5589 5610 5616 5619 5649 5771 5806 5813 5816
## [109] 6027 6052 6120 6203 6283 6344 6404 6435 6489 6510 6515 6534
## [121] 6785 6830 6844 6859 6862 6979 7139 7183 7238 7348 7352 7373
## [133] 7416 7501 7685 7813 7824 7875 7882 8065 8104 8117 8224 8280
## [145] 8313 8320 8405 8453 8486 8539 8662 8709 8788 8979 9066 9112
## [157] 9162 9183 9255 9309 9324 9333 9366 9371 9399 9482 9591 9612
## [169] 9704 9736 9745 9781 9839 9889 10045 10064 10078 10111 10278 10289

18
## [181] 10363 10466 10555 10617 10704 10750 10792 10802 10833 10876 10885 10940
## [193] 10998 11071 11141 11228 11241 11297 11389 11421 11446 11503 11655 11731
## [205] 11775 11787 11877 11902 11936 11985 12009 12017 12052 12055 12069 12154
## [217] 12194 12253 12382 12431 12512 12542 12557 12662 12725 12733 12772 12774
## [229] 12856 12898 12947 13041 13060 13163 13206 13245 13247 13304 13307 13362
## [241] 13481 13559 13609 13678 13776 13791 13827 13849 13872 13877 13889 13946
## [253] 14180 14188 14232 14308 14336 14400 14476 14496 14522 14727 14744 14775
## [265] 14791 14805 14842 14884 14985 15002 15013 15083 15127 15203 15231 15256
## [277] 15292 15322 15417 15430 15455 15600 15736 15775 15802 15846 15919 15952
## [289] 16044 16178 16275 16296 16331 16446 16624 16873 16897 16923 16988 17094
## [301] 17140 17174 17192 17226 17261 17274 17296 17316 17393 17538 17701 17746
## [313] 17846 17863 17888 17889 17929 17963 18027 18263 18338 18434 18512 18627
## [325] 18666 18712 18717 18813 18814 18867 18927 19065 19068 19109 19126 19357
## [337] 19382 19676 19751 19798 19813 19925 19977 19982 20238 20271 20389 20432
## [349] 20433 20505 20594 20595 20673 20735 20750 20761 20767 20827 20849 20941
## [361] 20961 20962 21022 21082 21151 21295 21358 21492 21541 21610 21645 21683
## [373] 21765 21903 21924 22006 22050 22165 22199 22213 22219 22221 22237 22243
## [385] 22355 22371 22400 22444 22478 22526 22601 22673 22687 22704 22712 22716
## [397] 22855 23055 23096 23173 23229 23281 23290 23317 23561 23579 23679 23722
## [409] 23804 23856 23955 24021 24039 24170 24184 24193 24253 24268 24300 24326
## [421] 24357 24359 24365 24366 24466 24490 24513 24644 24739 24791 24978 25034
## [433] 25061 25184 25273 25314 25496 25549 25603 25617 25750 25772 25820 25825
## [445] 25827 25845 25852 25862 25904 25964 26012 26032 26194 26199 26229 26364
## [457] 26373 26423 26436 26465 26493 26517 26679 26692 26748 26846 26873 26875
## [469] 26909 27000 27003 27116 27169 27196 27197 27316 27343 27371 27427 27439
## [481] 27541 27613 27670 27761 27810 27836 27886 27915 27929 27988 28090 28125
## [493] 28131 28239 28368 28423 28424 28564 28566 28655 28749 28886 28918 29033
## [505] 29042 29116 29166 29245 29280 29323 29324 29405 29470 29568 29589 29597
## [517] 29619 29734 29943 29970 30055 30059 30069 30314 30379 30382 30391 30445
## [529] 30548 30610 30730 30831 30832 30870 30872 30901 30982 31012 31039 31291
## [541] 31298 31308 31335 31358 31362 31412 31453 31501 31587 31635 31737 31815
## [553] 31893 31914 32048 32049 32056 32121 32152 32158 32223 32305 32326 32373
## [565] 32433 32543 32650 32685 32844 33017 33044 33100 33120 33144 33267 33270
## [577] 33288 33306 33439 33506 33525 33729 33916 33934 33941 33952 34192 34228
## [589] 34264 34315 34418 34455 34471 34575 34576 34599 34677 34697 34711 34856
## [601] 34878 34885 34969 34985 34986 35027 35234 35382 35392 35397 35427 35456
## [613] 35460 35504 35574 35577 35653 35694 35699 35736 35776 35903 35963 36045
## [625] 36153 36191 36259 36260 36275 36430 36452 36455 36502 36554 36616 36646
## [637] 36653 36890 36904 36959 36966 37054 37128 37144 37238 37281 37284 37458
## [649] 37485 37502 37505 37595 37639 37667 37668 37690 37776 37858 37866 37878
## [661] 37882 37887 37988 38044 38189 38231 38233 38411 38431 38633 38689 38750
## [673] 38813 38815 38850 38892 38923 38935 39009 39057 39239 39317 39501 39510
## [685] 39540 39582 39615 39620 39646 39657 39707 39709 39802 39824 39894 39963
## [697] 40083 40186 40258 40275 40481 40529 40546 40799 40812 40869 40893 40938
## [709] 41102 41181 41189 41251 41316 41538 41551 41675 41780 41859 41952 41959
## [721] 42082 42093 42132 42187 42213 42228 42315 42393 42405 42516 42535 42578
## [733] 42608 42747 42867 42868 42885 42984 43003 43011 43057 43153 43178 43185
## [745] 43191 43213 43224 43459 43560 43568 43602 43605 43627 43693 43729 43751
## [757] 43773 43801 43862 43879 43984 44064 44091 44454 44578 44657 44662 44715
## [769] 44746 44752 44788 44792 44807 44822 44861 44876 44955 44972 44996 45001
## [781] 45038 45046 45079 45113 45157 45287 45329 45459 45495 45739 45833 45885
## [793] 45909 45919 45935 46065 46119 46128 46175 46189 46269 46314 46537 46558
## [805] 46640 46710 46721 46733 46738 46830 46869 46870 47034 47215 47258 47275
## [817] 47342 47365 47379 47559 47585 47593 47603 47635 47755 47761 47767 47788

19
## [829] 47820 47854 47901 47909 47975 48010 48067 48091 48093 48266 48338 48351
## [841] 48353 48435 48455 48473 48498 48560 48592 48595 48728 48738 48852 49042
## [853] 49074 49108 49158 49168 49208 49209 49235 49290 49360 49405 49499 49515
## [865] 49568 49615 49638 49780 49978 50063 50083 50088 50098 50204 50264 50337
## [877] 50486 50687 50691 50756 50757 50761 50774 50775 50777 50782 50844 51007
## [889] 51054 51099 51259 51352 51407 51561 51600 51731 51773 51817 51895 51949
## [901] 52046 52171 52178 52307 52359 52383 52415 52470 52563 52627 52690 52695
## [913] 52706 53050 53104 53131 53240 53296 53330 53367 53438 53468 53699 53869
## [925] 53901 53945
#Imputamos en registros "F"
new.ds.fem<- kNN( ds[ ds$Gender=="F", variables.num], variable="HoursWeek", k=11)
ds[fem.idx, variables.num]

## WeeklyWages HoursWeek IniCost UltCost


## 1205 777.87 NA 35000 27800
## 2887 206.10 NA 2700 3960
## 3192 975.00 NA 12000 34423
## 3519 325.40 NA 500 736
## 4312 300.00 NA 4500 4401
## 4364 329.60 NA 22500 19251
## 4709 200.00 NA 10000 4566
## 4802 646.40 NA 2000 3037
## 5233 200.00 NA 600 1867
## 5511 703.00 NA 1500 6838
## 6075 231.99 NA 11000 9879
## 6132 456.00 NA 800 1877
## 6361 900.05 NA 7000 12388
## 6385 200.00 NA 1500 4102
## 6431 608.00 NA 2500 6067
## 7498 1800.00 NA 1500 5319
## 7529 350.00 NA 3500 14540
## 7552 927.00 NA 6000 11696
## 7772 458.00 NA 9500 10625
## 8048 599.67 NA 300 1339
## 8689 1800.00 NA 1500 5627
## 8860 1500.00 NA 2000 8435
## 9237 601.05 NA 425 557
## 9539 483.15 NA 42500 25864
## 10054 200.00 NA 500 809
## 10125 870.00 NA 500 49372
## 10901 650.00 NA 55000 43436
## 11139 735.00 NA 3000 9048
## 11204 977.80 NA 9500 13533
## 11271 610.70 NA 11340 14418
## 11323 1021.60 NA 35000 35442
## 11914 546.73 NA 20000 13391
## 12683 200.00 NA 4000 2338
## 12900 421.50 NA 18600 14813
## 13309 266.00 NA 640 936
## 14811 600.00 NA 1025 2297
## 15958 730.80 NA 10000 9677
## 16160 549.00 NA 3500 7038
## 16190 428.05 NA 2000 2360
## 16272 200.00 NA 300 572

20
## 17272 699.40 NA 30000 21907
## 18361 620.00 NA 2000 1870
## 18799 1800.00 NA 1000 14107
## 20020 310.65 NA 11300 8870
## 21368 680.96 NA 1500 2230
## 21459 605.77 NA 29000 152398
## 21967 200.00 NA 6000 13966
## 22290 746.18 NA 43000 24859
## 25212 675.00 NA 2000 2815
## 25286 319.92 NA 1500 1752
## 25795 350.00 NA 420 300
## 26353 481.00 NA 500 1579
## 26519 916.44 NA 132000 70366
## 27701 621.39 NA 90936 73728
## 28372 513.00 NA 350 975
## 28384 679.68 NA 4500 3842
## 28844 1109.72 NA 22000 77979
## 30090 1500.00 NA 1000 3240
## 30367 1050.00 NA 1500 2743
## 30538 927.40 NA 10000 10878
## 30809 1630.00 NA 20000 20696
## 31091 708.32 NA 51000 45602
## 31292 927.40 NA 50880 72817
## 32197 526.00 NA 100000 44473
## 32346 615.38 NA 5000 8753
## 32903 372.52 NA 500 1640
## 32981 1.00 NA 6700 3651
## 33673 960.00 NA 7500 7488
## 33821 600.00 NA 3400 4273
## 33926 1500.00 NA 1980 15118
## 33975 277.44 NA 500 1340
## 34399 532.71 NA 26000 21495
## 34664 421.80 NA 1500 2227
## 35032 454.86 NA 250 368
## 36167 1542.48 NA 10000 10960
## 36445 1249.29 NA 1100 2121
## 36869 1986.32 NA 250000 155090
## 37607 737.87 NA 44000 32852
## 38289 933.51 NA 2500 5131
## 38302 771.57 NA 9400 10263
## 38760 1067.85 NA 180000 61573
## 38989 1312.50 NA 1000 4862
## 38992 881.72 NA 1500 2331
## 39264 1417.22 NA 100000 419589
## 39367 906.35 NA 14031 11070
## 39446 200.00 NA 400 954
## 39725 1606.95 NA 91000 128561
## 39856 1500.00 NA 1500 108169
## 39865 1417.22 NA 100000 50984
## 39975 346.65 NA 250 572
## 40162 200.00 NA 400 481
## 40627 127.45 NA 4356 2932
## 40694 200.00 NA 7500 3787
## 42513 300.00 NA 500 481

21
## 44953 1900.00 NA 5000 8715
## 45245 1744.09 NA 1000 2836
## 47222 1000.00 NA 3000 5388
## 47336 500.00 NA 3800 3319
## 47384 770.04 NA 57600 56587
## 48071 418.85 NA 7000 5952
## 48834 654.60 NA 21000 20440
## 49180 250.00 NA 1638 1674
## 49596 391.90 NA 15300 9968
## 49688 200.00 NA 252 523
## 50495 675.62 NA 22000 26816
## 51287 500.00 NA 10156 14843
## 52304 365.00 NA 3500 4969
## 52596 775.63 NA 30000 19831
## 52734 849.20 NA 3500 3230
## 52889 1148.95 NA 50000 38322
## 53447 1777.75 NA 5500 12843
## 53743 500.00 NA 5200 4679
new.ds.fem[new.ds.fem$HoursWeek_imp==TRUE,]

## WeeklyWages HoursWeek IniCost UltCost HoursWeek_imp


## 275 777.87 38.0 35000 27800 TRUE
## 648 206.10 38.0 2700 3960 TRUE
## 707 975.00 38.0 12000 34423 TRUE
## 777 325.40 38.0 500 736 TRUE
## 965 300.00 38.0 4500 4401 TRUE
## 974 329.60 38.0 22500 19251 TRUE
## 1064 200.00 38.0 10000 4566 TRUE
## 1082 646.40 38.0 2000 3037 TRUE
## 1181 200.00 38.0 600 1867 TRUE
## 1257 703.00 38.0 1500 6838 TRUE
## 1392 231.99 30.0 11000 9879 TRUE
## 1407 456.00 38.0 800 1877 TRUE
## 1459 900.05 40.0 7000 12388 TRUE
## 1464 200.00 38.0 1500 4102 TRUE
## 1484 608.00 38.0 2500 6067 TRUE
## 1724 1800.00 40.0 1500 5319 TRUE
## 1735 350.00 38.0 3500 14540 TRUE
## 1738 927.00 38.0 6000 11696 TRUE
## 1790 458.00 38.0 9500 10625 TRUE
## 1853 599.67 38.0 300 1339 TRUE
## 2017 1800.00 40.0 1500 5627 TRUE
## 2064 1500.00 40.0 2000 8435 TRUE
## 2147 601.05 38.0 425 557 TRUE
## 2213 483.15 38.0 42500 25864 TRUE
## 2328 200.00 38.0 500 809 TRUE
## 2340 870.00 40.0 500 49372 TRUE
## 2500 650.00 38.0 55000 43436 TRUE
## 2555 735.00 40.0 3000 9048 TRUE
## 2565 977.80 38.0 9500 13533 TRUE
## 2577 610.70 38.0 11340 14418 TRUE
## 2590 1021.60 38.0 35000 35442 TRUE
## 2730 546.73 38.0 20000 13391 TRUE
## 2896 200.00 38.0 4000 2338 TRUE

22
## 2946 421.50 38.0 18600 14813 TRUE
## 3043 266.00 38.0 640 936 TRUE
## 3388 600.00 38.0 1025 2297 TRUE
## 3631 730.80 38.0 10000 9677 TRUE
## 3666 549.00 38.0 3500 7038 TRUE
## 3670 428.05 38.0 2000 2360 TRUE
## 3688 200.00 38.0 300 572 TRUE
## 3907 699.40 38.0 30000 21907 TRUE
## 4153 620.00 38.0 2000 1870 TRUE
## 4269 1800.00 40.0 1000 14107 TRUE
## 4573 310.65 37.5 11300 8870 TRUE
## 4884 680.96 38.0 1500 2230 TRUE
## 4901 605.77 38.0 29000 152398 TRUE
## 5030 200.00 38.0 6000 13966 TRUE
## 5100 746.18 38.0 43000 24859 TRUE
## 5781 675.00 40.0 2000 2815 TRUE
## 5803 319.92 38.0 1500 1752 TRUE
## 5898 350.00 37.5 420 300 TRUE
## 6040 481.00 38.0 500 1579 TRUE
## 6065 916.44 38.0 132000 70366 TRUE
## 6344 621.39 38.0 90936 73728 TRUE
## 6495 513.00 40.0 350 975 TRUE
## 6499 679.68 38.0 4500 3842 TRUE
## 6597 1109.72 40.0 22000 77979 TRUE
## 6865 1500.00 40.0 1000 3240 TRUE
## 6939 1050.00 38.0 1500 2743 TRUE
## 6975 927.40 38.0 10000 10878 TRUE
## 7040 1630.00 40.0 20000 20696 TRUE
## 7097 708.32 38.0 51000 45602 TRUE
## 7143 927.40 38.0 50880 72817 TRUE
## 7343 526.00 38.0 100000 44473 TRUE
## 7369 615.38 38.0 5000 8753 TRUE
## 7485 372.52 38.0 500 1640 TRUE
## 7503 1.00 38.0 6700 3651 TRUE
## 7660 960.00 38.0 7500 7488 TRUE
## 7698 600.00 38.0 3400 4273 TRUE
## 7725 1500.00 40.0 1980 15118 TRUE
## 7737 277.44 38.0 500 1340 TRUE
## 7842 532.71 38.0 26000 21495 TRUE
## 7899 421.80 38.0 1500 2227 TRUE
## 7999 454.86 38.0 250 368 TRUE
## 8255 1542.48 40.0 10000 10960 TRUE
## 8325 1249.29 38.0 1100 2121 TRUE
## 8405 1986.32 38.0 250000 155090 TRUE
## 8579 737.87 38.0 44000 32852 TRUE
## 8727 933.51 37.5 2500 5131 TRUE
## 8732 771.57 38.0 9400 10263 TRUE
## 8845 1067.85 38.0 180000 61573 TRUE
## 8895 1312.50 38.0 1000 4862 TRUE
## 8896 881.72 38.0 1500 2331 TRUE
## 8959 1417.22 38.0 100000 419589 TRUE
## 8980 906.35 38.0 14031 11070 TRUE
## 9003 200.00 38.0 400 954 TRUE
## 9063 1606.95 40.0 91000 128561 TRUE

23
## 9088 1500.00 38.0 1500 108169 TRUE
## 9091 1417.22 38.0 100000 50984 TRUE
## 9117 346.65 38.0 250 572 TRUE
## 9161 200.00 38.0 400 481 TRUE
## 9283 127.45 17.0 4356 2932 TRUE
## 9305 200.00 38.0 7500 3787 TRUE
## 9725 300.00 38.0 500 481 TRUE
## 10307 1900.00 40.0 5000 8715 TRUE
## 10370 1744.09 40.0 1000 2836 TRUE
## 10806 1000.00 38.0 3000 5388 TRUE
## 10838 500.00 38.0 3800 3319 TRUE
## 10848 770.04 38.0 57600 56587 TRUE
## 10993 418.85 38.0 7000 5952 TRUE
## 11165 654.60 40.0 21000 20440 TRUE
## 11232 250.00 30.0 1638 1674 TRUE
## 11322 391.90 38.0 15300 9968 TRUE
## 11346 200.00 38.0 252 523 TRUE
## 11531 675.62 38.0 22000 26816 TRUE
## 11713 500.00 38.0 10156 14843 TRUE
## 11930 365.00 38.0 3500 4969 TRUE
## 12026 775.63 38.0 30000 19831 TRUE
## 12066 849.20 40.0 3500 3230 TRUE
## 12099 1148.95 38.0 50000 38322 TRUE
## 12213 1777.75 40.0 5500 12843 TRUE
## 12279 500.00 38.0 5200 4679 TRUE
ds[fem.idx,]$HoursWeek <- new.ds.fem[new.ds.fem$HoursWeek_imp==TRUE,]$HoursWeek
#Imputamos en registros "M"
new.ds.mas <- kNN( ds[ ds$Gender=="M", variables.num], variable="HoursWeek", k=11)
ds[mas.idx,]$HoursWeek <- new.ds.mas[new.ds.mas$HoursWeek_imp==TRUE,]$HoursWeek

sum( complete.cases(ds$HoursWeek) )

## [1] 54000
boxplot( ds$HoursWeek, main="HoursWeek")

24
HoursWeek
50
40
30
20
10
0

8. Preparación de los datos


8.1. Tiempo de abertura del expediente
Calculad el tiempo que se tarda en abrir el expediente desde el suceso del accidente, a partir de las variables
DateOfTimeAccident y DateReported. Para ello, debéis convertir las variables en formato fecha (Date) y
realizar posteriormente el cálculo. Guardad la información en una variable Time del conjunto de datos.
t.accident <- as.Date(ds$DateTimeOfAccident)
t.report <- as.Date(ds$DateReported)
ds$Time <- as.numeric(t.report - t.accident)
ds[1:30, c("DateTimeOfAccident", "DateReported", "Time")]

## DateTimeOfAccident DateReported Time


## 1 2002-04-09T07:00:00Z 2002-07-05T00:00:00Z 87
## 2 1999-01-07T11:00:00Z 1999-01-20T00:00:00Z 13
## 3 1996-03-25T00:00:00Z 1996-04-14T00:00:00Z 20
## 4 2005-06-22T13:00:00Z 2005-07-22T00:00:00Z 30
## 5 1990-08-29T08:00:00Z 1990-09-27T00:00:00Z 29
## 6 1999-06-21T11:00:00Z 1999-09-09T00:00:00Z 80
## 7 2001-07-13T11:00:00Z 2001-07-23T00:00:00Z 10
## 8 2000-03-09T09:00:00Z 2000-04-16T00:00:00Z 38
## 9 1994-03-24T16:00:00Z 1994-04-26T00:00:00Z 33
## 10 2005-12-07T11:00:00Z 2005-12-22T00:00:00Z 15
## 11 1991-04-11T17:00:00Z 1991-04-22T00:00:00Z 11
## 12 1997-07-09T13:00:00Z 1997-07-25T00:00:00Z 16

25
## 13 1990-11-13T11:00:00Z 1990-11-21T00:00:00Z 8
## 14 1996-12-09T08:00:00Z 1996-12-17T00:00:00Z 8
## 15 1993-09-23T06:00:00Z 1993-10-25T00:00:00Z 32
## 16 2002-01-30T09:00:00Z 2002-02-07T00:00:00Z 8
## 17 1991-05-08T11:00:00Z 1991-05-10T00:00:00Z 2
## 18 1990-08-28T15:00:00Z 1990-09-29T00:00:00Z 32
## 19 1993-01-18T11:00:00Z 1993-02-09T00:00:00Z 22
## 20 1995-03-15T13:00:00Z 1995-05-01T00:00:00Z 47
## 21 1988-07-18T14:00:00Z 1988-10-02T00:00:00Z 76
## 22 1989-06-20T11:00:00Z 1989-06-30T00:00:00Z 10
## 23 2000-03-10T18:00:00Z 2000-03-20T00:00:00Z 10
## 24 1992-04-23T08:00:00Z 1992-06-10T00:00:00Z 48
## 25 1999-07-07T10:00:00Z 2000-06-29T00:00:00Z 358
## 26 2002-12-04T10:00:00Z 2002-12-14T00:00:00Z 10
## 27 1997-02-12T16:00:00Z 1997-02-27T00:00:00Z 15
## 28 1990-01-21T11:00:00Z 1990-03-13T00:00:00Z 51
## 29 2003-03-06T16:00:00Z 2003-03-19T00:00:00Z 13
## 30 2002-09-23T15:00:00Z 2002-10-20T00:00:00Z 27

8.2. Diferencia entre IniCost y UltCost


Calculad la diferencia entre el coste final y el coste inicial estimado.
ds$dif <- ds$UltCost - ds$IniCost
boxplot( ds$dif, main="Dif UltCost - IniCost" )

Dif UltCost − IniCost


1000000
−500000
−2000000

26
hist( ds$dif, breaks=1000, xlim=c(-50000,50000), xlab="Diferencia", ylab="Frecuencia" )

Histogram of ds$dif
25000
15000
Frecuencia

5000
0

−40000 −20000 0 20000 40000

Diferencia

9. Estudio descriptivo
9.1. Funciones de media y dispersión robustas
Implementad una función en R que, dado un vector con datos numéricos, calcule la media recortada y la
media Winsor. Estas funciones se deben definir como sigue:
media.recortada <- function( x, perc=0.05){}

media.winsor( x, perc=0.05){}
donde x es el vector de datos y perc la fracción de los datos a recortar (por defecto, 0.05). Implementad estas
funciones en R y comprobad que funcionan correctamente.
perc<-0.05
media.recortada <- function( x, perc=0.05 ){
x.sorted <- sort(x)
n <- length(x.sorted)
low <- trunc(n*perc)+1
high <- n-low+1
x.sorted <-x.sorted[ low:high ]
return (mean(x.sorted,na.rm=TRUE))
}

27
media.winsor <- function( x, perc=0.05 ){
x.sorted <- sort(x)
n <- length(x.sorted)
low <- trunc(n*perc)+1
high <- n-low+1
x.sorted[1:(low-1)] <- x.sorted[low]
x.sorted[(high+1):n]<- x.sorted[high]
return (mean(x.sorted,na.rm=TRUE))
}

#test
a<-ds$Age
media.recortada(a, 0.05); mean(a, trim=0.05, na.rm=TRUE); mean(a,na.rm=TRUE);

## [1] 33.31743
## [1] 33.31743
## [1] 33.84165
media.winsor(a); winsor.mean(a,0.05)

## [1] 33.68569
## [1] 33.68569

9.2. Estudio descriptivo de las variables cuantitativas


Realizad un estudio descriptivo de las variables cuantitativas Age, WeeklyWages, DaysWeek, HoursWeek,
IniCost, UltCost.
Para ello, preparad una tabla con varias medidas de tedencia central y dispersión, robustas y no robustas.
Usad, entre otras, las funciones del apartado anterior. Presentad, asimismo gráficos donde se visualice la
distribución de los valores de estas variables cuantitativas.
idx.numeric <- which( colnames(ds) %in % c("HoursWeek", "DaysWeek", "IniCost", "UltCost", "WeeklyWages",
mean.n <- as.vector(sapply( ds[,idx.numeric ],mean,na.rm=TRUE ) )
std.n <- as.vector(sapply(ds[,idx.numeric ],sd, na.rm=TRUE))
median.n <- as.vector(sapply(ds[,idx.numeric], median, na.rm=TRUE))
mean.trim.0.05 <- as.vector(sapply(ds[,idx.numeric], media.recortada, perc=0.05))
mean.winsor.0.05 <- as.vector(sapply(ds[,idx.numeric], media.winsor, perc=0.05))
IQR.n <- as.vector(sapply(ds[,idx.numeric],IQR, na.rm=TRUE))
mad.n <- as.vector(sapply(ds[,idx.numeric],mad, na.rm=TRUE))

kable(data.frame(variables= names(ds)[idx.numeric],
Media = mean.n,
Mediana = median.n,
Media.recort.0.05= mean.trim.0.05,
Media.winsor.0.05= mean.winsor.0.05
),
digits=2, caption="Estimaciones de Tendencia Central")

kable(data.frame(variables= names(ds)[idx.numeric],
Desv.Standard = std.n,
IQR = IQR.n,
MAD = mad.n
),

28
Cuadro 1: Estimaciones de Tendencia Central

variables Media Mediana Media.recort.0.05 Media.winsor.0.05


Age 33.84 32.0 33.32 33.69
WeeklyWages 416.36 392.2 394.62 406.01
HoursWeek 37.02 38.0 37.92 37.22
DaysWeek 4.91 5.0 4.98 4.93
IniCost 7841.15 2000.0 5102.87 6108.34
UltCost 10195.46 3179.0 6196.30 7538.67

Cuadro 2: Estimaciones de Dispersión

variables Desv.Standard IQR MAD


Age 12.12 20.00 13.34
WeeklyWages 248.64 300.00 225.65
HoursWeek 5.92 2.00 0.00
DaysWeek 0.55 0.00 0.00
IniCost 20584.08 8800.00 2223.90
UltCost 29023.52 7771.25 3753.94

digits=2, caption="Estimaciones de Dispersión")

#Gráficos
boxplot(ds$Age, main="Age")

Age
80
70
60
50
40
30
20

29
boxplot( ds$IniCost, ds$UltCost, main="IniCost y UltCost", names=c("IniCost", "UltCost"))

IniCost y UltCost
1500000
500000
0

IniCost UltCost

table(ds$DaysWeek) %> % kable()

Var1 Freq
1 183
2 513
3 1436
4 1476
5 49185
6 884
7 323
barplot( table(ds$DaysWeek), main="DaysWeek")

30
DaysWeek
30000
10000
0

1 2 3 4 5 6 7

boxplot( ds$HoursWeek, main="HoursWeek")

31
HoursWeek
50
40
30
20
10
0

boxplot(ds$WeeklyWages, main="WeeklyWages")

32
WeeklyWages
6000
4000
2000
0

10. Archivo final


Una vez realizado el preprocesamiento sobre el archivo, copiad el resultado de los datos en un archivo llamado
“train_clean.csv”.
write.csv(ds, "train_clean.csv", row.names = FALSE)

11. Evaluación de la actividad


Apartados 1,2 (20 %)
Apartados 3,4 (10 %)
Apartado 5 (10 %)
Apartado 6 (10 %)
Apartado 7 (10 %)
Apartado 8 (10 %)
Apartados 9,10 (20 %)
Calidad del informe dinámico (calidad del código, formato y estructura del documento, concisión y
precisión en las respuestas) (10 %)

33

También podría gustarte