Gestire i valori mancanti

Manipolazione dei dati in Julia

Katerina Zahradova

Instructor

Trovare i valori mancanti

# Verifica se ci sono valori mancanti
describe(penguins, :nmissing)
7×2 DataFrame
Row variable           nmissing
    Symbol             Int64
_________________________________
1   species            0
2   island             5
3   culmen_length_mm   0
4   culmen_depth_mm    0
5   flipper_length_mm  0
6   body_mass_g        23
7   sex                0
Manipolazione dei dati in Julia

ismissing()

# Trova le righe con valori mancanti
penguins[ismissing.(penguins.island),:]
5x7 DataFrame
Row species   island    culmen_length_mm  culmen_depth_mm  ... 
    String15  String15  Float64           Float64          ...
___________________________________________________________________
1   Adelie    missing   39.5              17.4             ...
2   Adelie    missing   40.3              18.0             ...
3   Chinstrip missing   46.7              18.3             ...
4   Gentoo    missing   49.3              13.6             ...
5   Gentoo    missing   43.9              17.8             ...
Manipolazione dei dati in Julia

ismissing()

# Trova le righe con valori mancanti
penguins[ismissing.(penguins.island), :species, :sex]
5x3 DataFrame
Row species   island    sex
    String15  String15  String7
________________________________
1   Adelie    missing   MALE
2   Adelie    missing   FEMALE
3   Chinstrip missing   MALE
4   Gentoo    missing   MALE
5   Gentoo    missing   FEMALE
Manipolazione dei dati in Julia

dropmissing()

# Rimuovi tutti i missing
dropmissing!(penguins)

describe(penguins)
7×2 DataFrame
Row variable           nmissing
    Symbol             Int64
1   species            0
2   island             0
3   culmen_length_mm   0
4   culmen_depth_mm    0
5   flipper_length_mm  0
6   body_mass_g        0
7   sex                0
# Rimuovi i missing nella colonna island
dropmissing!(penguins, :island)

describe(penguins)
7×2 DataFrame
Row variable           nmissing
    Symbol             Int64
1   species            0
2   island             0
3   culmen_length_mm   0
4   culmen_depth_mm    0
5   flipper_length_mm  0
6   body_mass_g        23
7   sex                0
Manipolazione dei dati in Julia

replace()

# Sostituisci i missing con un valore
replace!(penguins.body_mass_g, missing => 0)
# Sostituisci i missing con la media
replace!(penguins.body_mass_g, missing => mean(skipmissing(penguins.body_mass_g)))
Manipolazione dei dati in Julia

Sostituire con statistiche riassuntive per gruppo

Confronto tra pinguini

1 Immagine per gentile concessione di www.bas.ac.uk/about/antarctica/wildlife/penguins/
Manipolazione dei dati in Julia

Sostituire con groupby()

# Itera sui gruppi e sostituisci con la media arrotondata per gruppo
for group in groupby(penguins, :species)
    group[ismissing.(group.body_mass_g), :body_mass_g] .= round(mean(skipmissing(group.body_mass_g)))
end

# Controlla i valori mancanti
describe(penguins, :nmissing)
7×2 DataFrame
Row variable           nmissing
    Symbol             Int64
1   species            0
...
6   body_mass_g        0
7   sex                0
Manipolazione dei dati in Julia

Sostituire usando più colonne

# Itera su più gruppi e sostituisci con la media arrotondata per gruppo
for group in groupby(penguins, [:species, :sex])
    group[ismissing.(group.body_mass_g), :body_mass_g] .= round(mean(skipmissing(group.body_mass_g)))
end
Manipolazione dei dati in Julia

Dati insufficienti

# Cosa succede se non ci sono record nel gruppo
for group in groupby(penguins, [:species, :sex, :flipper_length_mm, :culmen_length_mm])
    group[ismissing.(group.body_mass_g), :body_mass_g] .= round(mean(skipmissing(group.body_mass_g)))
end
ArgumentError: median of an empty array is undefined, Any[]
Manipolazione dei dati in Julia

Cheat sheet - trovare e rimuovere i missing

  • ismissing(var): restituisce true se var = missing, altrimenti false
  • ismissing.(df.col): restituisce un vettore di true/false
  • df[ismissing.(df.col),:]: restituisce le righe di df dove col è missing
  • dropmissing(df): rimuove tutte le righe che contengono missing
  • dropmissing!(df, :col): rimuove le righe con missing in col; riscrive df
Manipolazione dei dati in Julia

Cheat sheet - sostituire i missing

  • replace!(df.col, missing => mean(skipmissing(df.col))): sostituisce i missing in col con la media di col (calcolata ignorando i missing)
  • Per sostituire i missing nei singoli gruppi
    for group in groupby(df, :col)
      group[ismissing.(group.col),:col] = value  # o con la media del gruppo
    end
    
Manipolazione dei dati in Julia

Ayo berlatih!

Manipolazione dei dati in Julia

Preparing Video For Download...