🧑‍🏫📊

Regresión Logística con Python

por el Prof. Logístico – 30 años haciendo que los datos hablen

🧠 La función sigmoide (binomial)

$$P(Y=1) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots)}}$$

🍕 La función softmax (multinomial)

$$P(Y=k) = \frac{e^{z_k}}{\sum_{j=1}^{K} e^{z_j}}, \quad \text{donde } z_j = \beta_{0j} + \beta_{1j}X_1 + \cdots$$

Odds ratio para interpretar coeficientes: \(OR = e^{\beta_i}\) – “por cada unidad que aumenta \(X_i\), las posibilidades se multiplican por \(e^{\beta_i}\)”.

🚢 Simulador de supervivencia – Titanic

Ajusta las características de un pasajero y observa la probabilidad de sobrevivir según un modelo logístico entrenado.

22
7
0

Coeficientes ficticios basados en un modelo típico. Solo con fines educativos.

📚 5 ejemplos paso a paso (Google Colab)

1. Titanic – Supervivencia (Binomial)

Dataset clásico. Predecimos si un pasajero sobrevivió según clase, sexo, edad...


import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns

url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/titanic.csv'
df = pd.read_csv(url)
df.dropna(subset=['age','embarked'], inplace=True)
df = df[['survived','pclass','sex','age','fare','embarked']]
df = pd.get_dummies(df, columns=['sex','embarked'], drop_first=True)

X = df.drop('survived', axis=1)
y = df['survived']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)

print(classification_report(y_test, y_pred))
sns.heatmap(confusion_matrix(y_test, y_pred), annot=True, fmt='d')
     

Abrir en Google Colab (copia y pega el código)

2. Admisión universitaria – GRE, GPA y prestigio (Binomial)

¿Será admitido un estudiante de posgrado? Basado en su GRE, expediente y rango de la universidad de origen.


url = 'https://stats.idre.ucla.edu/stat/data/binary.csv'
adm = pd.read_csv(url)
adm.rename(columns={'rank':'prestige'}, inplace=True)
adm = pd.get_dummies(adm, columns=['prestige'], drop_first=True)

X = adm.drop('admit', axis=1)
y = adm['admit']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

model = LogisticRegression()
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
     
3. Rotación de clientes (Telco) – Churn (Binomial)

¿Se irá el cliente de la compañía telefónica? Variables como duración del contrato, cargos mensuales...


url = 'https://raw.githubusercontent.com/IBM/telco-customer-churn-on-icp4d/master/data/Telco-Customer-Churn.csv'
churn = pd.read_csv(url)
churn['TotalCharges'] = pd.to_numeric(churn['TotalCharges'], errors='coerce')
churn.dropna(inplace=True)
churn['Churn'] = churn['Churn'].map({'Yes':1, 'No':0})
features = ['tenure','MonthlyCharges','TotalCharges','Contract','PaymentMethod','InternetService']
churn = pd.get_dummies(churn[features + ['Churn']], drop_first=True)
X = churn.drop('Churn', axis=1)
y = churn['Churn']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))
     
4. Pingüinos de Palmer – 3 especies (Multinomial)

Clasificamos pingüinos Adelie, Chinstrap y Gentoo por tamaño de pico y aletas.


from sklearn.linear_model import LogisticRegression
import seaborn as sns

penguins = sns.load_dataset('penguins').dropna()
X = penguins[['bill_length_mm','bill_depth_mm','flipper_length_mm','body_mass_g']]
y = penguins['species']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)
model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=200)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))

# Odds ratios (respecto a Adelie)
import numpy as np
import pandas as pd
odds = np.exp(model.coef_)
pd.DataFrame(odds, columns=X.columns, index=model.classes_)
     
5. Evaluación de coches – 4 categorías (Multinomial)

Dataset UCI: clasifica coches en inaceptable, aceptable, bueno, muy bueno según precio, seguridad...


columnas = ['buying','maint','doors','persons','lug_boot','safety','class']
car = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/car/car.data',
          header=None, names=columnas)
car_dummies = pd.get_dummies(car.drop('class', axis=1), drop_first=True)
y = car['class']
X_train, X_test, y_train, y_test = train_test_split(car_dummies, y, test_size=0.2, stratify=y, random_state=1)

model = LogisticRegression(multi_class='multinomial', solver='lbfgs', max_iter=500)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
print(classification_report(y_test, y_pred))