Análisis Bivariable de los datos

Por Jose R. Zapata

Ultima actualización: 19/Feb/2026

📚 Import libraries

# base libraries for data science
import sys
import warnings
from pathlib import Path

import pandas as pd
import seaborn as sns

warnings.simplefilter(action="ignore", category=FutureWarning)
# configuration to show only 2 decimal places
pd.set_option("display.float_format", "{:.2f}".format)
# print library version for reproducibility

print("Python version: ", sys.version)
print("Pandas version: ", pd.__version__)
Python version:  3.11.11 (main, Dec  6 2024, 20:02:44) [Clang 18.1.8 ]
Pandas version:  2.2.3

💾 Load data

The dataset has correct data types, fixed in:

Exploración inicial de datos

DATA_DIR = Path.cwd().resolve().parents[1] / "data"

titanic_df = pd.read_parquet(
    DATA_DIR / "02_intermediate/titanic_type_fixed.parquet", engine="pyarrow"
)

📊 Data description

General data information

titanic_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 10 columns):
 #   Column      Non-Null Count  Dtype
---  ------      --------------  -----
 0   Unnamed: 0  1309 non-null   int64
 1   pclass      1309 non-null   int64
 2   survived    1309 non-null   bool
 3   name        1309 non-null   object
 4   sex         1309 non-null   category
 5   age         1046 non-null   float64
 6   sibsp       1309 non-null   int64
 7   parch       1309 non-null   int64
 8   fare        1308 non-null   float64
 9   embarked    1307 non-null   category
dtypes: bool(1), category(2), float64(2), int64(4), object(1)
memory usage: 75.8+ KB

Ordinal data has to be converted again

information about the pclass column can be chech in the notebook

Exploración inicial de datos

titanic_df["pclass"] = pd.Categorical(
    titanic_df["pclass"], categories=[3, 2, 1], ordered=True
)

# column Unnamed: 0 is not needed
titanic_df = titanic_df.drop(columns=["Unnamed: 0"])

General information about the data set:

titanic_df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1309 entries, 0 to 1308
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype
---  ------    --------------  -----
 0   pclass    1309 non-null   category
 1   survived  1309 non-null   bool
 2   name      1309 non-null   object
 3   sex       1309 non-null   category
 4   age       1046 non-null   float64
 5   sibsp     1309 non-null   int64
 6   parch     1309 non-null   int64
 7   fare      1308 non-null   float64
 8   embarked  1307 non-null   category
dtypes: bool(1), category(3), float64(2), int64(2), object(1)
memory usage: 56.8+ KB
# size of the dataframe
titanic_df.shape
(1309, 9)
# sample of the dataframe
titanic_df.sample(5)

pclasssurvivednamesexagesibspparchfareembarked
10333TrueMoss, Mr. Albert JohanmaleNaN007.78S
2221FalseOvies y Rodriguez, Mr. Servandomale28.500027.72C
10703FalseO'Brien, Mr. TimothymaleNaN007.83Q
9523FalseLarsson-Rondberg, Mr. Edvard Amale22.00007.78S
7063FalseCaram, Mrs. Joseph (Maria Elias)femaleNaN1014.46C

Number of missing values

titanic_df.isnull().sum()
pclass        0
survived      0
name          0
sex           0
age         263
sibsp         0
parch         0
fare          1
embarked      2
dtype: int64

Target Variable = Survived

General statistics of the data set

Numerical variables
titanic_df.describe()

agesibspparchfare
count1046.001309.001309.001308.00
mean29.880.500.3933.30
std14.411.040.8751.76
min0.170.000.000.00
25%21.000.000.007.90
50%28.000.000.0014.45
75%39.001.000.0031.27
max80.008.009.00512.33
Categorical variables
# categorical columns description
titanic_df.describe(include="category")

pclasssexembarked
count130913091307
unique323
top3maleS
freq709843914

📈 Bivariate Analysis

Is important to check the relationship between the target variable and the other variables.

The target variable is Survived

Target vs Numerical Variables

survived vs age

variable = "age"

titanic_df.plot(
    kind="box",
    column=variable,
    by="survived",
    grid=False,
    title=f"Survived vs {variable} boxplot",
);

png

titanic_df[titanic_df["survived"] == 1][variable].plot(
    kind="kde",
    label="Survived",
    legend=True,
    title=f"Survived vs {variable} density plot",
)
titanic_df[titanic_df["survived"] == 0][variable].plot(
    kind="kde",
    label="Not Survived",
    legend=True,
    xlabel=variable,
    ylabel="Density",
);

png

survived vs sibsp

variable = "sibsp"

titanic_df.plot(
    kind="box",
    column=variable,
    by="survived",
    grid=False,
    title=f"Survived vs {variable} boxplot",
);

png

titanic_df[titanic_df["survived"] == 1][variable].plot(
    kind="hist",
    label="Survived",
    legend=True,
    bins=8,
    alpha=0.5,
    title=f"survived vs {variable} density plot",
)
titanic_df[titanic_df["survived"] == 0][variable].plot(
    kind="hist",
    label="Not Survived",
    legend=True,
    bins=8,
    alpha=0.3,
    xlabel=variable,
    ylabel="Density",
);

png

survived vs parch

variable = "parch"

titanic_df.plot(
    kind="box",
    column=variable,
    by="survived",
    grid=False,
    title=f"Survived vs {variable} boxplot",
);

png

titanic_df[titanic_df["survived"] == 1][variable].plot(
    kind="hist",
    label="Survived",
    legend=True,
    bins=9,
    alpha=0.5,
    title=f"Survived vs {variable} density plot",
)
titanic_df[titanic_df["survived"] == 0][variable].plot(
    kind="hist",
    label="Not Survived",
    legend=True,
    bins=9,
    alpha=0.3,
    xlabel=variable,
    ylabel="Density",
);

png

survived vs fare

variable = "fare"

titanic_df.plot(
    kind="box",
    column=variable,
    by="survived",
    grid=False,
    title=f"Survived vs {variable} boxplot",
);

png

titanic_df[titanic_df["survived"] == 1][variable].plot(
    kind="kde",
    label="Survived",
    legend=True,
    title=f"Survived vs {variable} density plot",
)
titanic_df[titanic_df["survived"] == 0][variable].plot(
    kind="kde",
    label="Not Survived",
    legend=True,
    xlabel=variable,
    ylabel="Density",
);

png

Target vs Categorical Variables

survived vs pclass

column = "pclass"

(
    pd
    .crosstab(titanic_df[column], titanic_df["survived"], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption("Survived vs pclass Heatmap")
)
Survived vs pclass Heatmap
survivedFalseTrueAll
pclass   
3528181709
2158119277
1123200323
All8095001309
titanic_df.groupby(column, observed=True).agg({"survived": "mean"}) * 100

survived
pclass
325.53
242.96
161.92

2nd class passengers had twice the survival rate of 3rd class and 1st class passengers had even better rates

(
    pd.crosstab(titanic_df[column], titanic_df["survived"]).plot(
        kind="bar", stacked=True, title=f"Survived vs {column} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column], titanic_df["survived"]).plot(
        kind="bar",
        title=f"Survived vs {column} barplot",
    )
);

png

survived vs sex

column = "sex"

(
    pd
    .crosstab(titanic_df[column], titanic_df["survived"], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption("Survived vs pclass Heatmap")
)
Survived vs pclass Heatmap
survivedFalseTrueAll
sex   
female127339466
male682161843
All8095001309
titanic_df.groupby(column, observed=True).agg({"survived": "mean"}) * 100

survived
sex
female72.75
male19.10
(
    pd.crosstab(titanic_df[column], titanic_df["survived"]).plot(
        kind="bar", stacked=True, title=f"Survived vs {column} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column], titanic_df["survived"]).plot(
        kind="bar",
        title=f"Survived vs {column} barplot",
    )
);

png

survived vs embarked

column = "embarked"

(
    pd
    .crosstab(titanic_df[column], titanic_df["survived"], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption("Survived vs pclass Heatmap")
)
Survived vs pclass Heatmap
survivedFalseTrueAll
embarked   
C120150270
Q7944123
S610304914
All8094981307
titanic_df.groupby(column, observed=True).agg({"survived": "mean"}) * 100

survived
embarked
C55.56
Q35.77
S33.26
(
    pd.crosstab(titanic_df[column], titanic_df["survived"]).plot(
        kind="bar", stacked=True, title=f"Survived vs {column} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column], titanic_df["survived"]).plot(
        kind="bar",
        title=f"Survived vs {column} barplot",
    )
);

png

Numerical vs Numerical Variables

age vs sibsp

# scatter plot of age vs sibsp

titanic_df.plot(
    kind="scatter",
    x="age",
    y="sibsp",
    title="age vs Sibsp scatter plot",
);

png

age vs parch

# scatter plot of age vs parch

titanic_df.plot(
    kind="scatter",
    x="age",
    y="parch",
    title="age vs Parch scatter plot",
);

png

age vs fare

# scatter plot of age vs fare

titanic_df.plot(
    kind="scatter",
    x="age",
    y="fare",
    title="age vs fare scatter plot",
);

png

sibsp vs parch

# scatter plot of sibsp vs parch

titanic_df.plot(
    kind="scatter",
    x="sibsp",
    y="parch",
    title="Sibsp vs parch scatter plot",
);

png

sibsp vs fare

# scatter plot of sibsp vs fare

titanic_df.plot(
    kind="scatter",
    x="sibsp",
    y="fare",
    title="Sibsp vs fare scatter plot",
);

png

parch vs fare

# scatter plot of parch vs fare

titanic_df.plot(
    kind="scatter",
    x="parch",
    y="fare",
    title="parch vs fare scatter plot",
);

png

Categorical vs Categorical Variables

pclass vs sex

column_1 = "pclass"
column_2 = "sex"

(
    pd
    .crosstab(titanic_df[column_1], titanic_df[column_2], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption(f"{column_1} vs {column_2} Heatmap")
)
pclass vs sex Heatmap
sexfemalemaleAll
pclass   
3216493709
2106171277
1144179323
All4668431309
(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar", stacked=True, title=f"{column_1} vs {column_2} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar",
        title=f"{column_1} vs {column_2} barplot",
    )
);

png

pclass vs embarked

column_1 = "pclass"
column_2 = "embarked"

(
    pd
    .crosstab(titanic_df[column_1], titanic_df[column_2], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption(f"{column_1} vs {column_2} Heatmap")
)
pclass vs embarked Heatmap
embarkedCQSAll
pclass    
3101113495709
2287242277
11413177321
All2701239141307
(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar", stacked=True, title=f"{column_1} vs {column_2} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar",
        title=f"{column_1} vs {column_2} barplot",
    )
);

png

sex vs embarked

column_1 = "sex"
column_2 = "embarked"

(
    pd
    .crosstab(titanic_df[column_1], titanic_df[column_2], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption(f"{column_1} vs {column_2} Heatmap")
)
sex vs embarked Heatmap
embarkedCQSAll
sex    
female11360291464
male15763623843
All2701239141307
(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar", stacked=True, title=f"{column_1} vs {column_2} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar",
        title=f"{column_1} vs {column_2} barplot",
    )
);

png

sex vs pclass

column_1 = "sex"
column_2 = "pclass"

(
    pd
    .crosstab(titanic_df[column_1], titanic_df[column_2], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption(f"{column_1} vs {column_2} Heatmap")
)
sex vs pclass Heatmap
pclass321All
sex    
female216106144466
male493171179843
All7092773231309
(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar", stacked=True, title=f"{column_1} vs {column_2} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar",
        title=f"{column_1} vs {column_2} barplot",
    )
);

png

embarked vs pclass

column_1 = "embarked"
column_2 = "pclass"

(
    pd
    .crosstab(titanic_df[column_1], titanic_df[column_2], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption(f"{column_1} vs {column_2} Heatmap")
)
embarked vs pclass Heatmap
pclass321All
embarked    
C10128141270
Q11373123
S495242177914
All7092773211307
(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar", stacked=True, title=f"{column_1} vs {column_2} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar",
        title=f"{column_1} vs {column_2} barplot",
    )
);

png

embarked vs sex

column_1 = "embarked"
column_2 = "sex"

(
    pd
    .crosstab(titanic_df[column_1], titanic_df[column_2], margins=True)
    .style.background_gradient(cmap="coolwarm")
    .set_caption(f"{column_1} vs {column_2} Heatmap")
)
embarked vs sex Heatmap
sexfemalemaleAll
embarked   
C113157270
Q6063123
S291623914
All4648431307
(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar", stacked=True, title=f"{column_1} vs {column_2} stacked barplot"
    )
);

png

(
    pd.crosstab(titanic_df[column_1], titanic_df[column_2]).plot(
        kind="bar",
        title=f"{column_1} vs {column_2} barplot",
    )
);

png

Categorical vs Numerical Variables

pclass vs age

column_cat = "pclass"
column_num = "age"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

pclass vs sibsp

column_num = "sibsp"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

pclass vs parch

column_num = "parch"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

pclass vs fare

column_num = "fare"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

sex vs age

column_cat = "sex"
column_num = "age"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

sex vs sibsp

column_num = "sibsp"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

sex vs parch

column_num = "parch"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

sex vs fare

column_num = "fare"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

embarked vs age

column_cat = "embarked"
column_num = "age"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

embarked vs sibsp

column_num = "sibsp"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

embarked vs parch

column_num = "parch"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

embarked vs fare

column_num = "fare"

titanic_df.plot(
    kind="box",
    column=column_num,
    by=column_cat,
    xlabel=column_cat,
    ylabel=column_num,
    title=f"{column_num} by {column_cat} boxplot",
    grid=False,
);

png

sns.barplot(
    data=titanic_df,
    x=column_cat,
    y=column_num,
    errorbar="ci",
    capsize=0.1,
    hue=column_cat,
).set_title(f"{column_num} by {column_cat} barplot");

png

📊 Analysis of Results

Target vs Numerical Variables

  • survived vs age: The age distributions for survived and not-survived passengers are similar overall, but children (age 0–10) show a noticeably higher survival rate. The median age is slightly lower for survivors. There is no strong linear relationship between age and survival.
  • survived vs sibsp: Passengers with 1 sibling/spouse aboard had a higher survival rate than those traveling alone (sibsp = 0) or those with many siblings/spouses. Having too many siblings/spouses (sibsp ≥ 3) is associated with very low survival.
  • survived vs parch: Similar to sibsp, passengers with 1–2 parents/children aboard survived at higher rates than those alone or with large families. Passengers with parch ≥ 4 had very low survival rates.
  • survived vs fare: Survivors paid significantly higher fares on average. The fare distribution for survivors is right-skewed with a higher median, while non-survivors cluster at lower fares. Fare is strongly associated with survival.

Target vs Categorical Variables

  • survived vs pclass: 1st class passengers had the highest survival rate (~62%), 2nd class had a moderate rate (~43%), and 3rd class had the lowest (~26%). Almost all Pclass 1 females survived and so did most of Pclass 2. Pclass 3 female survival was around 50%, and almost all (86%) Pclass 3 males did not survive.
  • survived vs sex: Female passengers had a dramatically higher survival rate (~73%) compared to males (~19%). Sex is the single strongest predictor of survival.
  • survived vs embarked: Passengers who embarked in Cherbourg (C) had the highest survival rate, followed by Queenstown (Q) and Southampton (S). This is likely confounded by the higher proportion of 1st class passengers embarking at Cherbourg.

Numerical vs Numerical Variables

  • age vs sibsp / parch: No strong correlation observed. Family size variables are largely independent of age.
  • age vs fare: Weak correlation. Older passengers do not necessarily pay higher fares.
  • sibsp vs parch: Weak positive correlation. Passengers with siblings/spouses tend to also have parents/children aboard, but the relationship is not strong.
  • sibsp vs fare / parch vs fare: Moderate positive correlation. Larger families tend to pay higher total fares.

Categorical vs Categorical Variables

  • pclass vs sex: The gender distribution is relatively balanced across classes, though 3rd class has a higher proportion of males.
  • pclass vs embarked: Most Southampton passengers were in 3rd class. Cherbourg had a higher proportion of 1st class passengers, which helps explain the higher survival rate for Cherbourg embarkation.
  • sex vs embarked: The gender distribution across embarkation ports is relatively similar, with a slight male majority across all ports.

Categorical vs Numerical Variables

  • pclass vs fare: Fare is very strongly correlated with passenger class — 1st class passengers paid the highest fares, and 3rd class the lowest. This confirms that fare is essentially a proxy for class.
  • pclass vs age: Age distribution is similar across classes, with no strong relationship between class and age.
  • sex vs age / fare: Males and females have similar age distributions. However, females tend to have slightly higher fares, likely because a higher proportion of female passengers traveled in 1st and 2nd class.
  • embarked vs fare: Cherbourg passengers paid the highest average fares (consistent with the higher proportion of 1st class passengers), while Southampton and Queenstown passengers paid lower fares on average.
  • embarked vs age: Age distributions are similar across embarkation ports.

Key Takeaways

  1. The two variables with the strongest association with survival are sex and pclass. Females and higher-class passengers had significantly better survival outcomes.
  2. Fare is highly correlated with class and acts as a strong proxy for socioeconomic status, which in turn is associated with survival.
  3. Family size matters: Traveling with 1–2 family members (sibsp or parch) improved survival odds compared to traveling alone or in very large groups.
  4. Children (age 0–10) had higher survival rates, consistent with the “women and children first” evacuation policy.
  5. Embarkation port (embarked) is confounded with class: Cherbourg passengers survived more because they were disproportionately 1st class, not because of the port itself.
  6. Age alone is not a strong predictor of survival, except at the extremes (very young children).

💡 Proposals and Ideas

For first baseline model, could use the following features:

  • sex
  • pclass
  • age

and can be done with heuristics or with a simple model like a decision tree.

📖 References

Visualización

EDA

Statistical tests

Anterior
Siguiente