Imputación de un valor condicional II

Podríamos plantearnos también si las edades medias por sexo y clase justificarían una imputación en función de ambas variables. Si mostramos esta información:

age_by_sex_and_class = titanic.groupby(["sex", "class"]).mean(numeric_only  = True)["age"]
age_by_sex_and_class
sex     class 
female  First     33.970653
        Second    28.701729
        Third     23.548332
male    First     39.464586
        Second    30.739535
        Third     27.650503
Name: age, dtype: float64

vemos que, para ambos sexos, hay diferencias notables de una clase a otra. Si ahora quisiéramos considerar ambas variables (sexo y clase) en la imputación, tendríamos que repetir el proceso, llevando a los índices de la Serie compuesta por el campo age los campos sex y class:

titanic.set_index(["sex", "class"])["age"]
sex     class 
male    Third     22.000000
female  First     38.000000
        Third     26.000000
        First     35.000000
male    Third     35.000000
                    ...    
        Second    27.000000
female  First     19.000000
        Third     27.915709
male    First     26.000000
        Third     32.000000
Name: age, Length: 891, dtype: float64

y realizar la imputación en esta Serie:

t = titanic.set_index(["sex", "class"])["age"].fillna(age_by_sex_and_class)

Nuevamente, también aquí podemos confirmar que la imputación ha sido la esperada extrayendo una muestra del dataset original:

sample = titanic[titanic.age.isna()].sample(10, random_state = 4)[["sex", "class", "age"]]
sample

Imputación de un valor condicional

y mostrando los valores imputados:

t.iloc[sample.index]
sex     class 
male    First     41.281386
        Second    30.740707
        First     41.281386
female  Third     21.750000
male    Second    30.740707
        Third     26.507589
        Third     26.507589
female  Third     21.750000
male    Second    30.740707
        Third     26.507589
Name: age, dtype: float64