En esta sección, aplicaremos los conceptos de inferencia estadística aprendidos a través de ejemplos prácticos con datasets reales en Python. Utilizaremos librerías como Pandas para la manipulación de datos, SciPy para las pruebas estadísticas y Seaborn/Matplotlib para la visualización.
El dataset `tips` contiene información sobre propinas dadas en un restaurante, incluyendo el monto de la cuenta, la propina, el sexo del pagador, si era fumador, el día de la semana, la hora y el tamaño de la mesa. Es ideal para explorar relaciones entre variables categóricas y numéricas.
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
# Cargar el dataset de propinas
tips = sns.load_dataset("tips")
print("Primeras 5 filas del dataset tips:")
print(tips.head())
# Separar las propinas por grupo (fumadores vs. no fumadores)
fumadores = tips[tips['smoker'] == 'Yes']['tip']
no_fumadores = tips[tips['smoker'] == 'No']['tip']
print(f"\nMedia de propina para fumadores: {fumadores.mean():.2f}")
print(f"Media de propina para no fumadores: {no_fumadores.mean():.2f}")
# Realizar la prueba t para dos muestras independientes (prueba de Welch, asumiendo varianzas desiguales)
# Usamos equal_var=False porque no asumimos que las varianzas de las propinas sean iguales entre grupos.
# Esto es una buena práctica a menos que haya una razón fuerte para asumir igualdad de varianzas.
t_stat, p_val = stats.ttest_ind(fumadores, no_fumadores, equal_var=False)
print("\n--- Prueba t (fumadores vs no fumadores) ---")
print(f" Estadístico t: {t_stat:.3f}")
print(f" Valor p: {p_val:.4f}")
alfa = 0.05
if p_val < alfa:
print(f" Dado que p-value ({p_val:.4f}) < alfa ({alfa}), se rechaza la hipótesis nula.")
print(" Conclusión: Hay una diferencia significativa en la propina promedio entre fumadores y no fumadores.")
else:
print(f" Dado que p-value ({p_val:.4f}) >= alfa ({alfa}), no se rechaza la hipótesis nula.")
print(" Conclusión: No hay evidencia suficiente de diferencia en la propina promedio entre fumadores y no fumadores.")
# Visualización de los resultados
plt.figure(figsize=(8, 6))
# Se corrige el llamado a boxplot para evitar el FutureWarning, asignando 'x' a 'hue' y ocultando la leyenda.
sns.boxplot(x='smoker', y='tip', data=tips, hue='smoker', palette={'Yes': 'lightcoral', 'No': 'skyblue'}, legend=False)
plt.title('Distribución de Propinas por Estado de Fumador')
plt.xlabel('Fumador')
plt.ylabel('Monto de la Propina')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Primeras 5 filas del dataset tips:
total_bill tip sex smoker day time size
0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4
Media de propina para fumadores: 3.01
Media de propina para no fumadores: 2.99
--- Prueba t (fumadores vs no fumadores) ---
Estadístico t: 0.092
Valor p: 0.9269
Dado que p-value (0.9269) >= alfa (0.05), no se rechaza la hipótesis nula.
Conclusión: No hay evidencia suficiente de diferencia en la propina promedio entre fumadores y no fumadores.
El resultado del p-value (0.9269) es muy alto, lo que indica que la pequeña diferencia observada en las medias de las propinas es muy probablemente producto del azar y no de una diferencia real entre los grupos.
El dataset `titanic` contiene información sobre los pasajeros del Titanic, incluyendo si sobrevivieron, su clase, sexo, edad, etc. Es excelente para analizar la relación entre variables categóricas.
import pandas as pd
import seaborn as sns
from scipy import stats
import matplotlib.pyplot as plt
# Cargar el dataset titanic
titanic = sns.load_dataset("titanic")
print("Primeras 5 filas del dataset titanic:")
print(titanic.head())
# Crear una tabla de contingencia (frecuencias cruzadas)
contingency_table = pd.crosstab(titanic['sex'], titanic['survived'])
print(f"\nTabla de Contingencia (Sexo vs Supervivencia):\n{contingency_table}")
# Realizar la prueba de Chi-cuadrado de independencia
chi2_stat, p_val, dof, expected = stats.chi2_contingency(contingency_table)
print("\n--- Prueba Chi-cuadrado (Sexo vs Supervivencia) ---")
print(f" Estadístico Chi-cuadrado: {chi2_stat:.3f}")
print(f" Valor p: {p_val:.4f}")
print(f" Grados de libertad (dof): {dof}")
print(f" Frecuencias esperadas:\n{expected.round(2)}")
alfa = 0.05
if p_val < alfa:
print(f" Dado que p-value ({p_val:.4f}) < alfa ({alfa}), se rechaza la hipótesis nula.")
print(" Conclusión: Existe una asociación significativa entre el sexo y la supervivencia en el Titanic.")
else:
print(f" Dado que p-value ({p_val:.4f}) >= alfa ({alfa}), no se rechaza la hipótesis nula.")
print(" Conclusión: No hay evidencia suficiente de asociación entre el sexo y la supervivencia en el Titanic.")
# Visualización de los resultados
plt.figure(figsize=(8, 6))
# Se corrige el diccionario de la paleta para usar llaves enteras (0 y 1) en lugar de strings.
sns.countplot(x='sex', hue='survived', data=titanic, palette={0: 'lightcoral', 1: 'skyblue'})
plt.title('Supervivencia en el Titanic por Sexo')
plt.xlabel('Sexo')
plt.ylabel('Número de Pasajeros')
plt.legend(title='Sobrevivió', labels=['No', 'Sí'])
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.show()
Primeras 5 filas del dataset titanic:
survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone
0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True
Tabla de Contingencia (Sexo vs Supervivencia):
survived 0 1
sex
female 81 233
male 468 109
--- Prueba Chi-cuadrado (Sexo vs Supervivencia) ---
Estadístico Chi-cuadrado: 260.717
Valor p: 0.0000
Grados de libertad (dof): 1
Frecuencias esperadas:
[[193.47 120.53]
[355.53 221.47]]
Dado que p-value (0.0000) < alfa (0.05), se rechaza la hipótesis nula.
Conclusión: Existe una asociación significativa entre el sexo y la supervivencia en el Titanic.
El p-value extremadamente bajo (prácticamente cero) nos da una fuerte evidencia para rechazar la hipótesis nula. La conclusión es clara: el sexo y la supervivencia no son independientes. La visualización confirma esto, mostrando que la proporción de mujeres que sobrevivieron es drásticamente mayor que la de los hombres.
Como se ha visto en los ejemplos anteriores, la visualización es una parte integral de la inferencia estadística. Los gráficos no solo ayudan a entender la distribución de los datos y las diferencias entre grupos, sino que también son cruciales para comunicar los hallazgos de manera efectiva.
Siempre acompaña tus análisis estadísticos con visualizaciones claras y bien etiquetadas para reforzar tus conclusiones y facilitar la comprensión.