Esta práctica contiene ejercicios que muestran como preprocesar un conjunto de datos con Julia. El preprocesamiento de datos es una tarea fundamental en la construcción de modelos de aprendizaje automático que consiste en la limpieza, transformación y preparación de los datos para que puedan alimentar el proceso de entrenamiento de los modelos, así como para la evaluación de su rendimiento. El preprocesamiento de datos incluye tareas como
Limpieza de datos.
Imputación de valores perdidos.
Recodificación de variables.
Creación de nuevas variables.
Transformación de variables.
Selección de variables.
Fusión de datos.
Reestructuración del conjunto de datos.
División del conjunto de datos en subconjuntos de entrenamiento y prueba.
2.1 Ejercicios Resueltos
Para la realización de esta práctica se requieren los siguientes paquetes:
usingCSV# Para la lectura de archivos CSV.usingDataFrames# Para el manejo de datos tabulares.usingPrettyTables# Para mostrar tablas formateadas.usingPlots# Para el dibujo de gráficas.usingMakie# Para obtener gráficos interactivos.
Ejercicio 2.1 La siguiente tabla contiene los ingresos y gastos de una empresa durante el primer trimestre del año.
Crear un data frame con los datos de la tabla.
Ayuda
Utilizar la función DataFrame del paquete DataFrames para partir el rango de valores en intervalos y asociar a cada intervalo una categoría.
Filtrar el conjunto de datos para quedarse con los nombres de los meses y los beneficios de los meses con balance positivo.
Solución
df[df.Balance .=="positivo", [:Mes, :Beneficios]]
3×2 DataFrame
Row
Mes
Beneficios
String
Int64
1
Enero
5150
2
Marzo
8500
3
Abril
6550
Ejercicio 2.2 El fichero colesterol.csv contiene información de una muestra de pacientes donde se han medido la edad, el sexo, el peso, la altura y el nivel de colesterol, además de su nombre.
Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero colesterol.csv.
Ayuda
Utilizar la función CSV.read del paquete CSV para crear und data frame a partir de un fichero CSV. Si el fichero está en una url, utilizar la función download(url) para descargar el fichero y después leerlo con la función [CSV.read].
Anonimizar los datos eliminando la columna nombre.
Ayuda
Utilizar la función select del paquete DataFrames para seleccionar las columnas deseadas y eliminar las columnas no deseadas. Existe también la función select! que modifica el data frame original eliminando las columnas no seleccionadas.
Solución
select(df, Not(:nombre))
14×7 DataFrame
Row
edad
sexo
peso
altura
colesterol
imc
obesidad
Int64
String1
Float64?
Float64
Float64?
Float64?
Cat…?
1
18
H
85.0
1.79
182.0
26.5285
Sobrepeso
2
32
M
65.0
1.73
232.0
21.7181
Saludable
3
24
H
missing
1.81
191.0
missing
missing
4
35
M
65.0
1.7
200.0
22.4913
Saludable
5
46
M
51.0
1.58
148.0
20.4294
Saludable
6
68
H
66.0
1.74
249.0
21.7994
Saludable
7
51
H
62.0
1.72
276.0
20.9573
Saludable
8
22
M
60.0
1.66
missing
21.7738
Saludable
9
35
H
90.0
1.94
241.0
23.9133
Saludable
10
46
H
75.0
1.85
280.0
21.9138
Saludable
11
53
M
55.0
1.62
262.0
20.9572
Saludable
12
58
H
78.0
1.87
198.0
22.3055
Saludable
13
27
H
109.0
1.98
210.0
27.8033
Sobrepeso
14
20
M
61.0
1.77
194.0
19.4708
Saludable
Reordenar las columnas poniendo la columna sexo antes que la columna edad.
Solución
select(df, Cols(:sexo, :edad, Not(:sexo, :edad)))
14×8 DataFrame
Row
sexo
edad
nombre
peso
altura
colesterol
imc
obesidad
String1
Int64
String
Float64?
Float64
Float64?
Float64?
Cat…?
1
H
18
José Luis Martínez Izquierdo
85.0
1.79
182.0
26.5285
Sobrepeso
2
M
32
Rosa Díaz Díaz
65.0
1.73
232.0
21.7181
Saludable
3
H
24
Javier García Sánchez
missing
1.81
191.0
missing
missing
4
M
35
Carmen López Pinzón
65.0
1.7
200.0
22.4913
Saludable
5
M
46
Marisa López Collado
51.0
1.58
148.0
20.4294
Saludable
6
H
68
Antonio Ruiz Cruz
66.0
1.74
249.0
21.7994
Saludable
7
H
51
Antonio Fernández Ocaña
62.0
1.72
276.0
20.9573
Saludable
8
M
22
Pilar Martín González
60.0
1.66
missing
21.7738
Saludable
9
H
35
Pedro Gálvez Tenorio
90.0
1.94
241.0
23.9133
Saludable
10
H
46
Santiago Reillo Manzano
75.0
1.85
280.0
21.9138
Saludable
11
M
53
Macarena Álvarez Luna
55.0
1.62
262.0
20.9572
Saludable
12
H
58
José María de la Guía Sanz
78.0
1.87
198.0
22.3055
Saludable
13
H
27
Miguel Angel Cuadrado Gutiérrez
109.0
1.98
210.0
27.8033
Sobrepeso
14
M
20
Carolina Rubio Moreno
61.0
1.77
194.0
19.4708
Saludable
Filtrar el data frame para quedarse con las mujeres.
Solución
df[df.sexo .=="M", :]
6×8 DataFrame
Row
nombre
edad
sexo
peso
altura
colesterol
imc
obesidad
String
Int64
String1
Float64?
Float64
Float64?
Float64?
Cat…?
1
Rosa Díaz Díaz
32
M
65.0
1.73
232.0
21.7181
Saludable
2
Carmen López Pinzón
35
M
65.0
1.7
200.0
22.4913
Saludable
3
Marisa López Collado
46
M
51.0
1.58
148.0
20.4294
Saludable
4
Pilar Martín González
22
M
60.0
1.66
missing
21.7738
Saludable
5
Macarena Álvarez Luna
53
M
55.0
1.62
262.0
20.9572
Saludable
6
Carolina Rubio Moreno
20
M
61.0
1.77
194.0
19.4708
Saludable
Filtrar el data frame para quedarse con los hombres mayores de 30 años.
Solución
df[(df.sexo .=="H") .& (df.edad .>30), :]
5×8 DataFrame
Row
nombre
edad
sexo
peso
altura
colesterol
imc
obesidad
String
Int64
String1
Float64?
Float64
Float64?
Float64?
Cat…?
1
Antonio Ruiz Cruz
68
H
66.0
1.74
249.0
21.7994
Saludable
2
Antonio Fernández Ocaña
51
H
62.0
1.72
276.0
20.9573
Saludable
3
Pedro Gálvez Tenorio
35
H
90.0
1.94
241.0
23.9133
Saludable
4
Santiago Reillo Manzano
46
H
75.0
1.85
280.0
21.9138
Saludable
5
José María de la Guía Sanz
58
H
78.0
1.87
198.0
22.3055
Saludable
Filtrar el data frame para quedarse con las filas sin valores perdidos.
Ayuda
Utilizar la función dropmissing del paquete DataFrames para eliminar las filas con valores perdidos.
Solución
dropmissing(df)
12×8 DataFrame
Row
nombre
edad
sexo
peso
altura
colesterol
imc
obesidad
String
Int64
String1
Float64
Float64
Float64
Float64
Cat…
1
José Luis Martínez Izquierdo
18
H
85.0
1.79
182.0
26.5285
Sobrepeso
2
Rosa Díaz Díaz
32
M
65.0
1.73
232.0
21.7181
Saludable
3
Carmen López Pinzón
35
M
65.0
1.7
200.0
22.4913
Saludable
4
Marisa López Collado
46
M
51.0
1.58
148.0
20.4294
Saludable
5
Antonio Ruiz Cruz
68
H
66.0
1.74
249.0
21.7994
Saludable
6
Antonio Fernández Ocaña
51
H
62.0
1.72
276.0
20.9573
Saludable
7
Pedro Gálvez Tenorio
35
H
90.0
1.94
241.0
23.9133
Saludable
8
Santiago Reillo Manzano
46
H
75.0
1.85
280.0
21.9138
Saludable
9
Macarena Álvarez Luna
53
M
55.0
1.62
262.0
20.9572
Saludable
10
José María de la Guía Sanz
58
H
78.0
1.87
198.0
22.3055
Saludable
11
Miguel Angel Cuadrado Gutiérrez
27
H
109.0
1.98
210.0
27.8033
Sobrepeso
12
Carolina Rubio Moreno
20
M
61.0
1.77
194.0
19.4708
Saludable
Filtrar el data frame para eliminar las filas con datos perdidos en la columna colesterol.
Ayuda
Utilizar la función dropmissing, col donde col es el nombre de la columna que contiene los valores perdidos.
Solución
dropmissing(df, :colesterol)
13×8 DataFrame
Row
nombre
edad
sexo
peso
altura
colesterol
imc
obesidad
String
Int64
String1
Float64?
Float64
Float64
Float64?
Cat…?
1
José Luis Martínez Izquierdo
18
H
85.0
1.79
182.0
26.5285
Sobrepeso
2
Rosa Díaz Díaz
32
M
65.0
1.73
232.0
21.7181
Saludable
3
Javier García Sánchez
24
H
missing
1.81
191.0
missing
missing
4
Carmen López Pinzón
35
M
65.0
1.7
200.0
22.4913
Saludable
5
Marisa López Collado
46
M
51.0
1.58
148.0
20.4294
Saludable
6
Antonio Ruiz Cruz
68
H
66.0
1.74
249.0
21.7994
Saludable
7
Antonio Fernández Ocaña
51
H
62.0
1.72
276.0
20.9573
Saludable
8
Pedro Gálvez Tenorio
35
H
90.0
1.94
241.0
23.9133
Saludable
9
Santiago Reillo Manzano
46
H
75.0
1.85
280.0
21.9138
Saludable
10
Macarena Álvarez Luna
53
M
55.0
1.62
262.0
20.9572
Saludable
11
José María de la Guía Sanz
58
H
78.0
1.87
198.0
22.3055
Saludable
12
Miguel Angel Cuadrado Gutiérrez
27
H
109.0
1.98
210.0
27.8033
Sobrepeso
13
Carolina Rubio Moreno
20
M
61.0
1.77
194.0
19.4708
Saludable
Imputar los valores perdidos en la columna colesterol con la media de los valores no perdidos.
Ayuda
Utilizar la función coalesce para reemplazar los valores perdidos por otros valores.
Utilizar la función sort para ordenar las filas del data frame según los valores de una o varias columnas. Utilizar el parámetro rev para especificar mediante un vector de booleanos si el orden es ascendente o descendente.
Solución
sort(df, :nombre)
14×8 DataFrame
Row
nombre
edad
sexo
peso
altura
colesterol
imc
obesidad
String
Int64
String1
Float64?
Float64
Float64
Float64?
Cat…?
1
Antonio Fernández Ocaña
51
H
62.0
1.72
276.0
20.9573
Saludable
2
Antonio Ruiz Cruz
68
H
66.0
1.74
249.0
21.7994
Saludable
3
Carmen López Pinzón
35
M
65.0
1.7
200.0
22.4913
Saludable
4
Carolina Rubio Moreno
20
M
61.0
1.77
194.0
19.4708
Saludable
5
Javier García Sánchez
24
H
missing
1.81
191.0
missing
missing
6
José Luis Martínez Izquierdo
18
H
85.0
1.79
182.0
26.5285
Sobrepeso
7
José María de la Guía Sanz
58
H
78.0
1.87
198.0
22.3055
Saludable
8
Macarena Álvarez Luna
53
M
55.0
1.62
262.0
20.9572
Saludable
9
Marisa López Collado
46
M
51.0
1.58
148.0
20.4294
Saludable
10
Miguel Angel Cuadrado Gutiérrez
27
H
109.0
1.98
210.0
27.8033
Sobrepeso
11
Pedro Gálvez Tenorio
35
H
90.0
1.94
241.0
23.9133
Saludable
12
Pilar Martín González
22
M
60.0
1.66
220.231
21.7738
Saludable
13
Rosa Díaz Díaz
32
M
65.0
1.73
232.0
21.7181
Saludable
14
Santiago Reillo Manzano
46
H
75.0
1.85
280.0
21.9138
Saludable
Ordenar el data frame ascendentemente por la columna sexo y descendentemente por la columna edad.
Solución
sort(df, [:sexo, :edad], rev=[false, true])
14×8 DataFrame
Row
nombre
edad
sexo
peso
altura
colesterol
imc
obesidad
String
Int64
String1
Float64?
Float64
Float64
Float64?
Cat…?
1
Antonio Ruiz Cruz
68
H
66.0
1.74
249.0
21.7994
Saludable
2
José María de la Guía Sanz
58
H
78.0
1.87
198.0
22.3055
Saludable
3
Antonio Fernández Ocaña
51
H
62.0
1.72
276.0
20.9573
Saludable
4
Santiago Reillo Manzano
46
H
75.0
1.85
280.0
21.9138
Saludable
5
Pedro Gálvez Tenorio
35
H
90.0
1.94
241.0
23.9133
Saludable
6
Miguel Angel Cuadrado Gutiérrez
27
H
109.0
1.98
210.0
27.8033
Sobrepeso
7
Javier García Sánchez
24
H
missing
1.81
191.0
missing
missing
8
José Luis Martínez Izquierdo
18
H
85.0
1.79
182.0
26.5285
Sobrepeso
9
Macarena Álvarez Luna
53
M
55.0
1.62
262.0
20.9572
Saludable
10
Marisa López Collado
46
M
51.0
1.58
148.0
20.4294
Saludable
11
Carmen López Pinzón
35
M
65.0
1.7
200.0
22.4913
Saludable
12
Rosa Díaz Díaz
32
M
65.0
1.73
232.0
21.7181
Saludable
13
Pilar Martín González
22
M
60.0
1.66
220.231
21.7738
Saludable
14
Carolina Rubio Moreno
20
M
61.0
1.77
194.0
19.4708
Saludable
Ejercicio 2.3 El fichero notas-curso2.csv contiene información de las notas de los alumnos de un curso.
Crear un data frame con los datos de los alumnos del curso a partir del fichero notas-curso2.csv.
Ejercicio 2.4 El fichero vinos.csv contiene información sobre las características de una muestra de vinos portugueses de la denominación “Vinho Verde”. Las variables que contiene son:
Variable
Descripción
Tipo (unidades)
tipo
Tipo de vino
Categórica (blanco, tinto)
meses.barrica
Mesesde envejecimiento en barrica
Numérica(meses)
acided.fija
Cantidadde ácidotartárico
Numérica(g/dm3)
acided.volatil
Cantidad de ácido acético
Numérica(g/dm3)
acido.citrico
Cantidad de ácidocítrico
Numérica(g/dm3)
azucar.residual
Cantidad de azúcarremanente después de la fermentación
Numérica(g/dm3)
cloruro.sodico
Cantidad de clorurosódico
Numérica(g/dm3)
dioxido.azufre.libre
Cantidad de dióxido de azufreen formalibre
Numérica(mg/dm3)
dioxido.azufre.total
Cantidadde dióxido de azufretotal en forma libre o ligada
Numérica(mg/dm3)
densidad
Densidad
Numérica(g/cm3)
ph
pH
Numérica(0-14)
sulfatos
Cantidadde sulfato de potasio
Numérica(g/dm3)
alcohol
Porcentajede contenidode alcohol
Numérica(0-100)
calidad
Calificación otorgada porun panel de expertos
Numérica(0-10)
Crear un data frame con los datos de los vinos a partir del fichero vinos.csv.
Obtener el número de valores perdidos en cada columna.
Imputar los valores perdidos del alcohol con la media de los valores no perdidos para cada tipo de vino.
Crear la variable categórica Envejecimiento recodificando la variable meses.barrica en las siguientes categorías.
Rango en meses
Categoría
Menos de 3
Joven
Entre 3 y 12
Crianza
Entre 12 y 18
Reserva
Más de 18
Gran reserva
Crear la variable categórica Dulzor recodificando la variable azucar.residual en las siguientes categorías.
Rango azúcar
Categoría
Menos de 4
Seco
Más de 4 y menos de 12
Semiseco
Más de 12 y menos de 45
Semidulce
Más de 45
Dulce
Filtrar el conjunto de datos para quedarse con los vinos Reserva o Gran Reserva con una calidad superior a 7 y ordenar el data frame por calidad de forma descendente.
¿Cuántos vinos blancos con un contenido en alcohol superior al 12% y una calidad superior a 8 hay en el conjunto de datos?
¿Cuáles son los 10 mejores vinos tintos crianza secos?