import pandas as pd
# Cargar archivo desde carpeta sample_data
df = pd.read_excel("/content/sample_data/smoking_health_data.xlsx")
# Convertir columnas numéricas con coma a float
columnas = ['age', 'heart_rate', 'cigs_per_day', 'chol']
for col in columnas:
df[col] = df[col].astype(str).str.replace(',', '.').astype(float)
# Confirmar estructura
df.dtypes
0
age
float64
sex
object
current_smoker
object
heart_rate
float64
blood_pressure
object
cigs_per_day
float64
chol
float64
from scipy.stats import ttest_1samp
heart_rates = df['heart_rate'].dropna()
stat, p = ttest_1samp(heart_rates, 75)
print(f"1. Valor p: {p:.4f}")
if p < 0.05:
print("→ Rechazamos H₀: La media no es igual a 75.")
else:
print("→ No se rechaza H₀: La media podría ser 75.")
1. Valor p: 0.0003
→ Rechazamos H₀: La media no es igual a 75.
import seaborn as sns
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 5))
sns.histplot(df['heart_rate'], kde=True, bins=20, color='skyblue')
plt.axvline(75, color='red', linestyle='--', label='Media de referencia = 75')
plt.title('Distribución de la frecuencia cardíaca')
plt.xlabel('Frecuencia cardíaca (lpm)')
plt.ylabel('Cantidad de personas')
plt.legend()
plt.grid(True)
plt.show()
png
cholesterol = df['chol'].dropna()
stat, p = ttest_1samp(cholesterol, 200)
print(f"2. Valor p (una cola): {p/2:.4f}")
if stat > 0 and p/2 < 0.05:
print("→ Rechazamos H₀: El colesterol medio es mayor a 200.")
else:
print("→ No se rechaza H₀.")
2. Valor p (una cola): 0.0000
→ Rechazamos H₀: El colesterol medio es mayor a 200.
from scipy.stats import binomtest
df['colesterol_alto'] = (df['chol'] > 240).astype(int)
exitos = df['colesterol_alto'].sum()
n = df['colesterol_alto'].count()
p_val = binomtest(exitos, n, p=0.20, alternative='greater').pvalue
print(f"3. Valor p: {p_val:.4f}")
if p_val < 0.05:
print("→ Rechazamos H₀: Proporción mayor al 20%.")
else:
print("→ No se rechaza H₀.")
3. Valor p: 0.0000
→ Rechazamos H₀: Proporción mayor al 20%.
import matplotlib.pyplot as plt
# 3. Conteo de personas con colesterol alto
sns.countplot(x='colesterol_alto', data=df, palette='Set2')
plt.xticks([0, 1], ['≤240 mg/dL', '>240 mg/dL'])
plt.title('Frecuencia de colesterol alto')
plt.xlabel('Colesterol alto')
plt.ylabel('Cantidad de personas')
plt.grid(True, axis='y')
plt.show()
<ipython-input-9-89ac87fbd4f6>:2: FutureWarning:
Passing `palette` without assigning `hue` is deprecated and will be removed in v0.14.0. Assign the `x` variable to `hue` and set `legend=False` for the same effect.
sns.countplot(x='colesterol_alto', data=df, palette='Set2')
png
col_counts = df['colesterol_alto'].value_counts(normalize=True)
plt.figure(figsize=(6, 4))
sns.barplot(x=col_counts.index, y=col_counts.values)
plt.xticks([0, 1], ['Normal', 'Colesterol Alto'])
plt.ylabel('Proporción')
plt.title('Proporción de Personas con Colesterol Alto')
plt.ylim(0, 1)
plt.axhline(0.20, color='red', linestyle='--', label='Límite del 20%')
plt.legend()
plt.show()
png
df['taquicardia'] = (df['heart_rate'] > 100).astype(int)
exitos = df['taquicardia'].sum()
n = df['taquicardia'].count()
p_val = binomtest(exitos, n, p=0.20, alternative='greater').pvalue
print(f"4. Valor p: {p_val:.4f}")
if p_val < 0.05:
print("→ Rechazamos H₀: Proporción distinta al 5%.")
else:
print("→ No se rechaza H₀.")
4. Valor p: 1.0000
→ No se rechaza H₀.
taqui_counts = df['taquicardia'].value_counts(normalize=True)
plt.figure(figsize=(6, 4))
sns.barplot(x=taqui_counts.index, y=taqui_counts.values)
plt.xticks([0, 1], ['Normal', 'Taquicardia'])
plt.ylabel('Proporción')
plt.title('Proporción de Personas con Taquicardia')
plt.ylim(0, 1)
plt.axhline(0.20, color='red', linestyle='--', label='Límite del 20%')
plt.legend()
plt.show()
png
import seaborn as sns
import matplotlib.pyplot as plt
# Conteo de personas con y sin taquicardia
taqui_counts = df['taquicardia'].value_counts(normalize=True)
plt.figure(figsize=(6, 4))
sns.barplot(x=taqui_counts.index, y=taqui_counts.values)
plt.xticks([0, 1], ['Sin Taquicardia', 'Con Taquicardia'])
plt.ylabel('Proporción')
plt.title('Proporción de Taquicardia en la Muestra')
plt.ylim(0, 1)
plt.axhline(0.20, color='red', linestyle='--', label='Límite del 20%')
plt.legend()
plt.show()
png
from scipy.stats import ttest_ind
fumadores = df[df['current_smoker'] == 'yes']['chol'].dropna()
no_fumadores = df[df['current_smoker'] == 'no']['chol'].dropna()
stat, p = ttest_ind(fumadores, no_fumadores, equal_var=False)
print(f"5. Valor p: {p:.4f}")
if p < 0.05:
print("→ Rechazamos H₀: Hay diferencia significativa entre medias.")
else:
print("→ No se rechaza H₀.")
5. Valor p: 0.0036
→ Rechazamos H₀: Hay diferencia significativa entre medias.
plt.figure(figsize=(8, 5))
sns.boxplot(data=df, x='current_smoker', y='chol')
plt.title('Colesterol por Estado de Fumador')
plt.xlabel('Fumador (1 = Sí, 0 = No)')
plt.ylabel('Colesterol')
plt.show()
png
fumadores = df[df['current_smoker'] == 'yes']['heart_rate'].dropna()
no_fumadores = df[df['current_smoker'] == 'no']['heart_rate'].dropna()
stat, p = ttest_ind(fumadores, no_fumadores, equal_var=False)
print(f"6. Valor p (una cola): {p/2:.4f}")
if stat > 0 and p/2 < 0.05:
print("→ Rechazamos H₀: Fumadores tienen mayor frecuencia cardíaca.")
else:
print("→ No se rechaza H₀.")
6. Valor p (una cola): 0.0002
→ Rechazamos H₀: Fumadores tienen mayor frecuencia cardíaca.
import seaborn as sns
import matplotlib.pyplot as plt
# Boxplot: frecuencia cardíaca por grupo de fumadores
plt.figure(figsize=(8, 5))
sns.boxplot(data=df, x='current_smoker', y='heart_rate')
plt.title('Frecuencia Cardíaca por Estado de Fumador')
plt.xlabel('Fumador (1 = Sí, 0 = No)')
plt.ylabel('Frecuencia Cardíaca')
plt.show()
# Histograma: distribución de frecuencia cardíaca por grupo
plt.figure(figsize=(8, 5))
sns.histplot(data=df, x='heart_rate', hue='current_smoker', kde=True, bins=20)
plt.title('Distribución de la Frecuencia Cardíaca')
plt.xlabel('Frecuencia Cardíaca')
plt.ylabel('Frecuencia')
plt.show()