2  Preprocesamiento de datos

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

2.1 Ejercicios Resueltos

Para la realización de esta práctica se requieren los siguientes paquetes:

using CSV  # Para la lectura de archivos CSV.
using DataFrames  # Para el manejo de datos tabulares.
using PrettyTables  # Para mostrar tablas formateadas.
using Plots  # Para el dibujo de gráficas.
using Makie  # 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.

  1. Crear un data frame con los datos de la tabla.

    Utilizar la función DataFrame del paquete DataFrames para partir el rango de valores en intervalos y asociar a cada intervalo una categoría.

    using DataFrames
    df = DataFrame(
        Mes = ["Enero", "Febrero", "Marzo", "Abril"],
        Ingresos = [45000, 41500, 51200, 49700],
        Gastos = [33400, 35400, 35600, 36300],
        Impuestos = [6450, 6300, 7100, 6850]
        )
    4×4 DataFrame
    Row Mes Ingresos Gastos Impuestos
    String Int64 Int64 Int64
    1 Enero 45000 33400 6450
    2 Febrero 41500 35400 6300
    3 Marzo 51200 35600 7100
    4 Abril 49700 36300 6850
  2. Crear una nueva columna con los beneficios de cada mes (ingresos - gastos - impuestos).

    df.Beneficios = df.Ingresos - df.Gastos - df.Impuestos
    df
    4×5 DataFrame
    Row Mes Ingresos Gastos Impuestos Beneficios
    String Int64 Int64 Int64 Int64
    1 Enero 45000 33400 6450 5150
    2 Febrero 41500 35400 6300 -200
    3 Marzo 51200 35600 7100 8500
    4 Abril 49700 36300 6850 6550
  3. Crear una nueva columna con la variable Balance con dos posibles categorías: positivo si ha habido beneficios y negativo si ha habido pérdidas.

    df.Balance = ifelse.(df.Beneficios .> 0, "positivo", "negativo")
    df
    4×6 DataFrame
    Row Mes Ingresos Gastos Impuestos Beneficios Balance
    String Int64 Int64 Int64 Int64 String
    1 Enero 45000 33400 6450 5150 positivo
    2 Febrero 41500 35400 6300 -200 negativo
    3 Marzo 51200 35600 7100 8500 positivo
    4 Abril 49700 36300 6850 6550 positivo
  4. Filtrar el conjunto de datos para quedarse con los nombres de los meses y los beneficios de los meses con balance positivo.

    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.

  1. Crear un data frame con los datos de todos los pacientes del estudio a partir del fichero colesterol.csv.

    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].

    using CSV
    df = CSV.read(download("https://aprendeconalf.es/aprendizaje-automatico-practicas-julia/datos/colesterol.csv"), DataFrame)
    14×6 DataFrame
    Row nombre edad sexo peso altura colesterol
    String Int64 String1 Float64? Float64 Float64?
    1 José Luis Martínez Izquierdo 18 H 85.0 1.79 182.0
    2 Rosa Díaz Díaz 32 M 65.0 1.73 232.0
    3 Javier García Sánchez 24 H missing 1.81 191.0
    4 Carmen López Pinzón 35 M 65.0 1.7 200.0
    5 Marisa López Collado 46 M 51.0 1.58 148.0
    6 Antonio Ruiz Cruz 68 H 66.0 1.74 249.0
    7 Antonio Fernández Ocaña 51 H 62.0 1.72 276.0
    8 Pilar Martín González 22 M 60.0 1.66 missing
    9 Pedro Gálvez Tenorio 35 H 90.0 1.94 241.0
    10 Santiago Reillo Manzano 46 H 75.0 1.85 280.0
    11 Macarena Álvarez Luna 53 M 55.0 1.62 262.0
    12 José María de la Guía Sanz 58 H 78.0 1.87 198.0
    13 Miguel Angel Cuadrado Gutiérrez 27 H 109.0 1.98 210.0
    14 Carolina Rubio Moreno 20 M 61.0 1.77 194.0
  2. Crear una nueva columna con el índice de masa corporal, usando la siguiente fórmula

    IMC=Peso (kg)Altura (cm)2

    df.imc = df.peso ./ (df.altura .^ 2)
    df
    14×7 DataFrame
    Row nombre edad sexo peso altura colesterol imc
    String Int64 String1 Float64? Float64 Float64? Float64?
    1 José Luis Martínez Izquierdo 18 H 85.0 1.79 182.0 26.5285
    2 Rosa Díaz Díaz 32 M 65.0 1.73 232.0 21.7181
    3 Javier García Sánchez 24 H missing 1.81 191.0 missing
    4 Carmen López Pinzón 35 M 65.0 1.7 200.0 22.4913
    5 Marisa López Collado 46 M 51.0 1.58 148.0 20.4294
    6 Antonio Ruiz Cruz 68 H 66.0 1.74 249.0 21.7994
    7 Antonio Fernández Ocaña 51 H 62.0 1.72 276.0 20.9573
    8 Pilar Martín González 22 M 60.0 1.66 missing 21.7738
    9 Pedro Gálvez Tenorio 35 H 90.0 1.94 241.0 23.9133
    10 Santiago Reillo Manzano 46 H 75.0 1.85 280.0 21.9138
    11 Macarena Álvarez Luna 53 M 55.0 1.62 262.0 20.9572
    12 José María de la Guía Sanz 58 H 78.0 1.87 198.0 22.3055
    13 Miguel Angel Cuadrado Gutiérrez 27 H 109.0 1.98 210.0 27.8033
    14 Carolina Rubio Moreno 20 M 61.0 1.77 194.0 19.4708
  3. Crear una nueva columna con la variable obesidad recodificando la columna imc en las siguientes categorías.

    Rango IMC Categoría
    Menor de 18.5 Bajo peso
    De 18.5 a 24.5 Saludable
    De 24.5 a 30 Sobrepeso
    Mayor de 30 Obeso

    Utilizar la función cut del paquete CategoricalArrays para partir el rango de valores en intervalos y asociar a cada intervalo una categoría.

    using CategoricalArrays
    df.obesidad = cut(df.imc, [0, 18.5, 24.5, 30, Inf],
                    labels=["Bajo peso", "Saludable", "Sobrepeso", "Obeso"],
                    extend=true)
    df
    14×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 Pilar Martín González 22 M 60.0 1.66 missing 21.7738 Saludable
    9 Pedro Gálvez Tenorio 35 H 90.0 1.94 241.0 23.9133 Saludable
    10 Santiago Reillo Manzano 46 H 75.0 1.85 280.0 21.9138 Saludable
    11 Macarena Álvarez Luna 53 M 55.0 1.62 262.0 20.9572 Saludable
    12 José María de la Guía Sanz 58 H 78.0 1.87 198.0 22.3055 Saludable
    13 Miguel Angel Cuadrado Gutiérrez 27 H 109.0 1.98 210.0 27.8033 Sobrepeso
    14 Carolina Rubio Moreno 20 M 61.0 1.77 194.0 19.4708 Saludable
  4. Seleccionar las columnas nombre, sexo y edad.

    df[:, [:nombre, :sexo, :edad]]
    14×3 DataFrame
    Row nombre sexo edad
    String String1 Int64
    1 José Luis Martínez Izquierdo H 18
    2 Rosa Díaz Díaz M 32
    3 Javier García Sánchez H 24
    4 Carmen López Pinzón M 35
    5 Marisa López Collado M 46
    6 Antonio Ruiz Cruz H 68
    7 Antonio Fernández Ocaña H 51
    8 Pilar Martín González M 22
    9 Pedro Gálvez Tenorio H 35
    10 Santiago Reillo Manzano H 46
    11 Macarena Álvarez Luna M 53
    12 José María de la Guía Sanz H 58
    13 Miguel Angel Cuadrado Gutiérrez H 27
    14 Carolina Rubio Moreno M 20
  5. Anonimizar los datos eliminando la columna nombre.

    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.

    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
  6. Reordenar las columnas poniendo la columna sexo antes que la columna edad.

    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
  7. Filtrar el data frame para quedarse con las mujeres.

    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
  8. Filtrar el data frame para quedarse con los hombres mayores de 30 años.

    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
  9. Filtrar el data frame para quedarse con las filas sin valores perdidos.

    Utilizar la función dropmissing del paquete DataFrames para eliminar las filas con valores perdidos.

    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
  10. Filtrar el data frame para eliminar las filas con datos perdidos en la columna colesterol.

    Utilizar la función dropmissing, col donde col es el nombre de la columna que contiene los valores perdidos.

    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
  11. Imputar los valores perdidos en la columna colesterol con la media de los valores no perdidos.

    Utilizar la función coalesce para reemplazar los valores perdidos por otros valores.

    using Statistics
    media_colesterol = mean(skipmissing(df.colesterol))
    df.colesterol = coalesce.(df.colesterol, media_colesterol)
    df
    14×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 Pilar Martín González 22 M 60.0 1.66 220.231 21.7738 Saludable
    9 Pedro Gálvez Tenorio 35 H 90.0 1.94 241.0 23.9133 Saludable
    10 Santiago Reillo Manzano 46 H 75.0 1.85 280.0 21.9138 Saludable
    11 Macarena Álvarez Luna 53 M 55.0 1.62 262.0 20.9572 Saludable
    12 José María de la Guía Sanz 58 H 78.0 1.87 198.0 22.3055 Saludable
    13 Miguel Angel Cuadrado Gutiérrez 27 H 109.0 1.98 210.0 27.8033 Sobrepeso
    14 Carolina Rubio Moreno 20 M 61.0 1.77 194.0 19.4708 Saludable
  12. Ordenar el data frame según la columna nombre.

    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.

    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
  13. Ordenar el data frame ascendentemente por la columna sexo y descendentemente por la columna edad.

    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.

  1. Crear un data frame con los datos de los alumnos del curso a partir del fichero notas-curso2.csv.

    using CSV, DataFrames
    df = CSV.read(download("https://aprendeconalf.es/aprendizaje-automatico-practicas-julia/datos/notas-curso2.csv"), DataFrame; missingstring="NA")
    120×9 DataFrame
    95 rows omitted
    Row sexo turno grupo trabaja notaA notaB notaC notaD notaE
    String7 String7 String1 String1 Float64 Float64? Float64? Float64? Float64?
    1 Mujer Tarde C N 5.2 6.3 3.4 2.3 2.0
    2 Hombre Mañana A N 5.7 5.7 4.2 3.5 2.7
    3 Hombre Mañana B N 8.3 8.8 8.8 8.0 5.5
    4 Hombre Mañana B N 6.1 6.8 4.0 3.5 2.2
    5 Hombre Mañana A N 6.2 9.0 5.0 4.4 3.7
    6 Hombre Mañana A S 8.6 8.9 9.5 8.4 3.9
    7 Mujer Mañana A N 6.7 7.9 5.6 4.8 4.2
    8 Mujer Tarde C S 4.1 5.2 1.7 0.3 1.0
    9 Hombre Tarde C N 5.0 5.0 3.3 2.7 6.0
    10 Hombre Tarde C N 5.3 6.3 4.8 3.6 2.3
    11 Mujer Mañana A N 7.8 missing 6.5 6.7 2.8
    12 Hombre Mañana A N 6.5 8.0 5.0 3.2 3.3
    13 Hombre Mañana B N 6.6 7.6 5.3 4.0 1.0
    109 Mujer Tarde C N 5.4 7.3 3.5 2.5 4.6
    110 Hombre Mañana B N 7.4 7.4 6.2 5.8 1.1
    111 Mujer Tarde C S 5.1 8.1 5.2 5.1 4.5
    112 Hombre Mañana A N 6.9 7.8 3.9 2.8 missing
    113 Hombre Tarde C N 3.6 4.8 2.1 0.5 5.6
    114 Hombre Tarde C S 5.9 6.2 5.0 3.9 1.9
    115 Hombre Mañana B N 6.8 7.2 4.9 3.8 2.8
    116 Hombre Mañana A N 6.5 6.1 5.8 4.9 1.2
    117 Mujer Mañana B N 6.2 7.0 5.6 5.4 1.7
    118 Mujer Tarde C N 5.0 6.5 4.0 2.8 3.6
    119 Hombre Tarde C N 4.7 6.0 1.3 0.4 2.2
    120 Hombre Tarde C S 4.5 4.7 6.0 4.9 1.8
  2. Obtener el número de datos perdidos en cada columna.

    describe(df)[:, [:variable, :nmissing]]
    9×2 DataFrame
    Row variable nmissing
    Symbol Int64
    1 sexo 0
    2 turno 0
    3 grupo 0
    4 trabaja 0
    5 notaA 0
    6 notaB 5
    7 notaC 1
    8 notaD 2
    9 notaE 2
  3. Recodificar la variable grupo en una colección de columnas binarias.

    Utilizar la función onehotbatch del paquete OneHotArrays para recodificar una variable categórica en una colección de columnas binarias.

    using OneHotArrays
    codificacion = permutedims(onehotbatch(df.grupo, unique(df.grupo)))
    hcat(df, DataFrame(codificacion, :auto))
    120×12 DataFrame
    95 rows omitted
    Row sexo turno grupo trabaja notaA notaB notaC notaD notaE x1 x2 x3
    String7 String7 String1 String1 Float64 Float64? Float64? Float64? Float64? Bool Bool Bool
    1 Mujer Tarde C N 5.2 6.3 3.4 2.3 2.0 true false false
    2 Hombre Mañana A N 5.7 5.7 4.2 3.5 2.7 false true false
    3 Hombre Mañana B N 8.3 8.8 8.8 8.0 5.5 false false true
    4 Hombre Mañana B N 6.1 6.8 4.0 3.5 2.2 false false true
    5 Hombre Mañana A N 6.2 9.0 5.0 4.4 3.7 false true false
    6 Hombre Mañana A S 8.6 8.9 9.5 8.4 3.9 false true false
    7 Mujer Mañana A N 6.7 7.9 5.6 4.8 4.2 false true false
    8 Mujer Tarde C S 4.1 5.2 1.7 0.3 1.0 true false false
    9 Hombre Tarde C N 5.0 5.0 3.3 2.7 6.0 true false false
    10 Hombre Tarde C N 5.3 6.3 4.8 3.6 2.3 true false false
    11 Mujer Mañana A N 7.8 missing 6.5 6.7 2.8 false true false
    12 Hombre Mañana A N 6.5 8.0 5.0 3.2 3.3 false true false
    13 Hombre Mañana B N 6.6 7.6 5.3 4.0 1.0 false false true
    109 Mujer Tarde C N 5.4 7.3 3.5 2.5 4.6 true false false
    110 Hombre Mañana B N 7.4 7.4 6.2 5.8 1.1 false false true
    111 Mujer Tarde C S 5.1 8.1 5.2 5.1 4.5 true false false
    112 Hombre Mañana A N 6.9 7.8 3.9 2.8 missing false true false
    113 Hombre Tarde C N 3.6 4.8 2.1 0.5 5.6 true false false
    114 Hombre Tarde C S 5.9 6.2 5.0 3.9 1.9 true false false
    115 Hombre Mañana B N 6.8 7.2 4.9 3.8 2.8 false false true
    116 Hombre Mañana A N 6.5 6.1 5.8 4.9 1.2 false true false
    117 Mujer Mañana B N 6.2 7.0 5.6 5.4 1.7 false false true
    118 Mujer Tarde C N 5.0 6.5 4.0 2.8 3.6 true false false
    119 Hombre Tarde C N 4.7 6.0 1.3 0.4 2.2 true false false
    120 Hombre Tarde C S 4.5 4.7 6.0 4.9 1.8 true false false

2.2 Ejercicios propuestos

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)
  1. Crear un data frame con los datos de los vinos a partir del fichero vinos.csv.

  2. Obtener el número de valores perdidos en cada columna.

  3. Imputar los valores perdidos del alcohol con la media de los valores no perdidos para cada tipo de vino.

  4. 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
  5. 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
  6. 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.

  7. ¿Cuántos vinos blancos con un contenido en alcohol superior al 12% y una calidad superior a 8 hay en el conjunto de datos?

  8. ¿Cuáles son los 10 mejores vinos tintos crianza secos?