Introducción al análisis exploratorio de datos

1

¿Qué es y para qué sirve el análisis exploratorio de datos?

2

¿Cómo hacer un análisis exploratorio de datos?

3

Tipos de análisis de datos

4

Tipos de datos y análisis de variables

5

Herramientas de software para el análisis exploratorio de datos

6

Conociendo nuestros datos: palmerpenguins

7

Recolección de datos, limpieza y validación

8

Ejercicio de validación de datos

Quiz: Introducción al análisis exploratorio de datos

Análisis univariado

9

Explorando una variable categórica: conteos y proporciones

10

Estadística descriptiva aplicada: medidas de tendencia central

11

Estadística descriptiva aplicada: medidas de dispersión

12

Ejercicio de obtención de medidas de dispersión

13

Estadística descriptiva aplicada: distribuciones

14

Estadística descriptiva aplicada: funciones de densidad de probabilidad

15

Bonus: Teorema del límite central

Quiz: Análisis univariado

Análisis bivariado

16

Estableciendo relaciones: gráficos de puntos

17

Estableciendo relaciones: gráficos de violín y boxplots

18

Estableciendo relaciones: matrices de correlación

19

Limitantes de los coeficientes de correlación lineal

20

Estableciendo relaciones: análisis de regresión simple

21

Limitaciones del análisis de regresión simple

Quiz: Análisis bivariado

Análisis multivariado

22

Análisis de regresión múltiple

23

Visualización del análisis de regresión múltiple

24

Análisis de regresión logística

25

Paradoja de Simpson

26

¿Qué hacer cuando tengo muchas variables?

Quiz: Análisis multivariado

Conclusiones

27

Diversidad de gráficas al explorar datos

28

Continúa aprendiendo sobre EDA

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Análisis de regresión logística

24/28
Recursos

Aportes 26

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

Creo que debería haber una explicación más detallada y fundamentada sobre qué són los valores coef, std err, z, P>|z|, y cómo debe ser su interpretación conjunta en relación a la pruebas de hipótesis. La verdad es una explicación somera que ni si quiera toca los principios básicos de la interpretación estadística.

Quiero a Platzi y su misión, por eso hago esta crítica para el Team! Hay que empezar a hacer mayor auditoria de calidad a los cursos. El hecho que sean cursos básicos no significa que no se deban explicar los fundamentos conceptuales que llevan al estudiante a construir un conocimiento sólido.

Modelo para definir si un pinguino es Macho o Hembra

  • Creamos el modelo con las variables que consideremos influyen en la eleccion de si es un macho o hembra. Nuestra variable objetivo es categorica (sexo), por tanto, debemos convertirla en numerica para poder aplicar al modelo.
#Modelo logistico de la variable sexo VS longitud de las aletas, ancho del pico, largo del pico, y la isla
smf.logit(
    formula='numeric_sex ~ flipper_length_mm + bill_length_mm + bill_depth_mm + C(island)',
    data=preprocessed_penguins_df
).fit().summary()

Dado que la variable sexo es categorica la convertimos en 0(hembras) y 1(machos), los resultados de la Regresion Logistica viene dado en funcion de los machos.

Los resultados se interpretan asi:

  1. A mayor longitud de las aletas, mas probable que el pinguino sea macho (0.1393).
  2. A mayor longitud de los picos, mas probable que el pinguino sea macho (0.1413).
  3. Mientras mas ancho el pico, mas probable que sea macho (1.6401)
  4. Es menos probable que hayan machos en la isla Dream respecto a la Biscoe (-1.55)
  5. Es menos probable que hayan machos en la isla Torgensen respecto a la Biscoe (-1.03)

El parametro P > abs(Z) indica cuales son las variables mas significativas estadisticamente para el resultado. Mientras mas tienda al valor 0 mas significativa es.

Cuando tenemos tres variables y en los resultados de la regresion logistica solo aparecen dos, indica que los esos valores son respecto a la variable faltante

  • Probabilidad de que hayan mas machos en la isla Dream que en la isla Torgensen
# Restamos los valores de probabilidad de cada isla
-1.55 - (-1.03)

Respecto a la isla Dream, es mas probable encontrar macho en la isla Dream que en la Torgensen

  • Exploracion de las variables categoricas. Con un EDA inicial en las variables categoricas podriamos haber llegado a las misma conclusiones que el modelo logistico
#Tabla de conteo de las variables categoricas isla y sexo
(
    preprocessed_penguins_df
    .value_counts(['island', 'sex'])
    .reset_index(name='count')
)

Modelo para identificar si un pinguino pertenece a una determinada clase

  • En esta caso, La variable objetivo (especie) es categorica, por tanto, la convertimos en numerica
preprocessed_penguins_df = (
    preprocessed_penguins_df
    .assign(is_adelie=lambda df: df.species.replace(['Adelie', 'Gentoo', 'Chinstrap'], [1,0,0]))
)
  • Creamos el modelo logistico con las variables que consideramos relevantes para determinar la especie de un pinguino.
#Modelo para determinar si un pinguino es adelie segun su sexo y el largo de las aletas
model_is_adele = smf.logit(
    formula='is_adelie ~ flipper_length_mm + C(sex)',
    data=preprocessed_penguins_df
).fit()
  • Obtenemos los parametros del modelo resultante
model_is_adele.params #muestra solo los parametros del modelo

Los resultados indicas que:

  1. Es mas probable que un pinguino Adelie sea macho que hembra (1.28).
  2. Es menos probable que un pinguino Adelie sea de alas largas (-0.21).
  • Creamos una tabla donde podamos comparar los valores reales con los valores predichos por el modelo
is_adelie_df_prediction = pd.DataFrame(
    dict(
        actual_adelie = preprocessed_penguins_df.is_adelie,
        predicted_values = model_is_adele.predict().round()  #round indica solo si es cero o uno
    )
)

is_adelie_df_prediction
  • Creamos una tabla con los resultados generales de la tabla anterior
(
    is_adelie_df_prediction
    .value_counts(['actual_adelie', 'predicted_values'])
    .reset_index(name='count')
)
  • Visualizacion de los resultados mediante una matriz de confusion
print(
    sklearn.metrics.confusion_matrix(
        is_adelie_df_prediction.actual_adelie,
        is_adelie_df_prediction.predicted_values
    )
)

sklearn.metrics.accuracy_score(
    is_adelie_df_prediction.actual_adelie,
    is_adelie_df_prediction.predicted_values
)

[[151  36]
 [ 17 129]]

0.8408408408408409  #Efectividad de prediccion del modelo
print(
    sklearn.metrics.confusion_matrix(
        is_adelie_df_predictions.actual_adelie,
        is_adelie_df_predictions.predicted_values
    )
)

sklearn.metrics.accuracy_score(
    is_adelie_df_predictions.actual_adelie,
    is_adelie_df_predictions.predicted_values
)

Matriz de Confusión:

Se usa para evaluar la precisión de la clasificación:
[[151 36]
[ 17 129]]

se lee:

  • Verdadero Negativo (0,0): 151
  • Falso Positivo (0,1): 36 (Error Tipo I)
  • Falso Negativo (1,0): 17 (Error Tipo II)
  • Verdadero Positivo (1,1): 129

No me estaba funcionado numeric_sex, dado que estaba definido como parámetro y no como variable. Así que lo generé de esta forma y funcionó. Por si alguien lo necesita:

preprocess_penguins_df['numeric_sex']=numeric_sex(preprocess_penguins_df)
preprocess_penguins_df

En esta clase aprendimos a realizar una clasificación binaria (macho o hembra, es Adelie o no es Adelie) mediante la regresión logística. Sin embargo, si lo que quieres es implementar un modelo para clasificar más de 2 categorías como conocer si un pingüino es Adelie o Gentoo o Chinstrap, este algoritmo no te servirá. En este caso, utilizando al librería Statsmodels, tendrás que utilizar la función mnlogit del módulo statsmodels.formula.api (smf), mnlogit hace referencia a un modelo de regresión logística multinomial, el cual te ayudará con esta tarea.

Para quienes trabajan en Visual Studio Code, debemos importar primero metrics, y accuracy_score:

import sklearn
from sklearn import metrics
from sklearn.metrics import accuracy_score

Aquí se ve mas claro:

Opino que la idea de esta clase está bien planteada, pero lamentablemente hay puntos importantes que están pésimamente presentados. En especial me preocupa como presentan el significado estadístico de los coeficientes,P> |z|, etc.

  • coeffs: En los casos de regresión representan la tasa de cambio de de “log odss” respecto de alguna variable independiente en específico (bill_length_mm, island, etc.). Creo que no es responsable establecer de forma concreta si un coeficiente es “importante” si no se considera el rango numérico de la varibable independiente en cuestión, pero en general uno podría decir que mientras más lejos de cero el coeficiente, más efecto tiene una variable en específico.

  • P>|z| es el p-value que establece si un coeff es estadisticamente significativo en el modelo. Si p-value < alpha (0< alpha <1, elegido bajo nuestro criterio, usualmente 0.05) entonces el coeficiente tiene significancia estadística en el modelo.

  • LLR p-value: Es el p-value del modelo en general. Si LLR p-value < alpha, entonces nuestro modelo es útil para hacer predicciones.

Al final en las conclusiones, [diganme si estoy mal], pero, no es macho y hembra, es si ¿ Adelie TRUE o False? , o sea cuentas veces acertamos que era Adelie vs cuantas no.
de ahí la eficiencia del 80%

si debes volver a comoboertir las variables categoricas en variables numericas y asignarlas a una nueva columna usa esto o guiate para hacerlo

diccionario_sexo = {
    'male' : 0,
    'female' : 1,
}
binario = data['sex'].map(diccionario_sexo)
data['sex_numeric'] = binario

psss inri no copies por copiar trata de entender el porque del codigo

En lugar de usar replace(), otra manera para reemplazar tus datos:

df.assign(is_adelie=lambda x: np.where(x.species=='Adelie', 1, 0))

donde los valores TRUE los cambia por 1, los FALSE en 0.

Para lar personas que quedaron un poco vagas con la explicación, les dejo este artículo dónde podrán entender mejor lo visto en clase (Sobre la tabla de regresión logística).
.
Por lo que pude entender, las columnas son las mismas, exceptuando por 'P>|z|'
Espero que les sirva, si tienen alguna recomendación o explicación adicional, se les agradece

👾✨

Me quede enamorado de sklearn:

bastante pobre la interpretación de los parámetros estadísticos , deja mucho que desear

El modelo utiliza una regresión logística para estimar la probabilidad de que una ave sea macho (numeric_sex = 1) en función de la longitud de la aleta (flipper_length_mm), la longitud del pico (bill_length_mm), la profundidad del pico (bill_depth_mm) y la isla en la que se encuentra (Dream, Torgersen o Biscoe).

Los coeficientes de la regresión logística se presentan en la tabla “Coefficients”. Cada coeficiente representa el cambio en la log odds de ser macho (numeric_sex = 1) por una unidad de cambio en la variable correspondiente, manteniendo las demás variables constantes.

Por ejemplo, el coeficiente para la longitud de la aleta (flipper_length_mm) es positivo y igual a 0.1393, lo que significa que por cada aumento en 1 mm de la longitud de la aleta, la log odds de ser macho aumenta en 0.1393, es decir, la probabilidad de ser macho aumenta.

Los intervalos de confianza del 95% para cada coeficiente también se proporcionan en la tabla. Los intervalos de confianza reflejan la incertidumbre en la estimación de los coeficientes y proporcionan una guía para determinar si un coeficiente es estadísticamente significativo. Si el intervalo de confianza no incluye cero, significa que el coeficiente es estadísticamente significativo al nivel de confianza del 95%.

Además, se puede ver que el modelo se ajustó con éxito, ya que se encontró una solución óptima y la log-verosimilitud es negativa, lo que indica un buen ajuste. La pseudo-R cuadrada también es positiva, lo que indica un buen ajuste y que las variables explican una parte significativa de la varianza en la variable dependiente (numeric_sex).

Gran recomendación la de visualizar los datos antes de construir los modelos 👍

Si a alguien ejecuta:

processed_penguins_df = (
    processed_penguins_df
    .assign(is_adelie = lambda df: df.species.replace(['Adelie','Gentoo','Chinstrap'], [1,0,0]))
)

y le aparece este error:

'endog has evaluated to an array with multiple columns that has shape (333, 2). This occurs when the variable converted to endog is non-numeric (e.g., bool or str).'

es porque el Data Frame está considernado la columna ‘is_adelie’ como 'category" y no como ‘int’. Yo usé la siguiente solución:

processed_penguins_df['is_adelie'] = processed_penguins_df['is_adelie'].astype('int')

PD. Estaba trabajando con jupyter notebooks en Visual Studio Code en lugar de Deepnote. Casi siempre ocurrió que creando la variable numérica a partir de la variable categórica (ej. de sex a numerix_sex) no la tomaba de inmediato como ‘int’ sino como 'category

Por si alguien requiere volver a calcular `numeric_sex` les dejo mi forma de hacerlo: ```js preprocessed_penguins_df.loc[preprocessed_penguins_df['sex'] == 'male', 'numeric_sex'] = 1 preprocessed_penguins_df.loc[preprocessed_penguins_df['sex'] == 'female', 'numeric_sex'] = 0 ```
Muy largos los videos

Regresión Múltiple: Se utiliza para predecir una variable numérica continua basada en dos o más variables predictoras continuas o categóricas.

Regresión Logística: Se utiliza para predecir la probabilidad de que ocurra un evento binario (por ejemplo, sí/no, 1/0) basado en una o más variables predictoras continuas o categóricas.

Puede ocurrir que falle:

Problema:

Solución:

  • El análisis de regresión logística es una técnica de modelado estadístico utilizada para predecir la probabilidad de un resultado binario (0 o 1) en función de las variables predictoras. Es útil para analizar relaciones entre variables categóricas o continuas y variables binarias.

  • La regresión logística utiliza una función logarítmica para modelar la relación entre las variables predictoras y la variable de respuesta. La función logística se utiliza para transformar la variable de respuesta de una escala lineal a una escala de probabilidad, lo que permite la estimación de la probabilidad de un resultado binario en función de las variables predictoras.

  • Para realizar un análisis de regresión logística en Python, podemos utilizar la biblioteca “statsmodels”. Por ejemplo, si queremos predecir la probabilidad de que un pingüino de la especie Adelia tenga una longitud de aleta superior a 200 mm en función de su masa corporal y su longitud de pico, podemos utilizar el siguiente código:
import statsmodels.api as sm

X = penguins[['body_mass_g', 'bill_length_mm']]
y = (penguins['flipper_length_mm'] > 200).astype(int)

X = sm.add_constant(X)

model = sm.Logit(y, X).fit()

print(model.summary())

  • Este código ajusta un modelo de regresión logística utilizando la función “Logit” de “statsmodels”. El modelo incluye la masa corporal y la longitud del pico como variables predictoras y la longitud de la aleta como la variable de respuesta binaria. La función “astype” se utiliza para convertir la variable de respuesta en un formato binario (0 o 1).

Agregando bill_length_mm en el modelo de prediction_isadelie me arrojo un score de 99.66, teniendo solo un falso positivo y cero falsos negativos. Les comparto el código.

<prediction_is_adelie = smf.logit(
    formula = "is_adelie ~ flipper_length_mm + C(sex) + bill_length_mm",
    data = preproced_penguins_df
).fit()

prediction_is_adelie.params> 

is_adelie_df = pd.DataFrame(
    dict(
        actual_adelie = preproced_penguins_df.is_adelie,
        is_adelie_prediction = prediction_is_adelie.predict().round()
    )
)
is_adelie_df.value_counts(["actual_adelie","is_adelie_prediction"]).reset_index(name ="count")


print(
    sklearn.metrics.confusion_matrix(
        is_adelie_df.actual_adelie,
        is_adelie_df.is_adelie_prediction
    )
)

sklearn.metrics.accuracy_score(
    is_adelie_df.actual_adelie,
    is_adelie_df.is_adelie_prediction
)

Resultado:

<[[186   1]
 [  0 146]]
0.996996996996997> 

Por si alguno le hace falta, el código para agregar una variable categorica (‘sex’) como variable discreta (‘numeric_sex’) en nuestros data frame (‘pre_penguin_df’):

pre_penguin_df = (
    pre_penguin_df
    .assign(
        numeric_sex=lambda df: df.sex.replace(['female','male'],[0,1])
    )
)