TIC, TAC, TEP: Aprender en el siglo XXI

IA, IoT y Tecnologías Información, Aprendizaje y Participación


5 comentarios

Predictor de infidelidad (III): Ejemplo de regresión logística en Python

Ya estamos llegando al final del nuestro experimento. Tras introducir el problema y explorar el dataset en el primer post, y aprender cómo funciona el algoritmo de regresión logística, en el segundo, ya estamos listos para crear nuestro modelo a partir de los datos y… aplicarlo.  ¿Te animas a llegar hasta el final?  

En este tercer y último  post aprenderemos lo siguiente:

  • Como crear un predictor usando el modelo de regresión logística de scikit-learn
  • Cómo valorar sus métricas 
  • Cómo hacer una predicción
  • Qué conclusiones podemos extraer

Retomamos pues, nuestro Python notebook, donde, ya habíamos realizado la carga y exploración de los datos y creado la variable objetivo, a la que llamamos «infidelity». 

(Como hemos hecho en los post anteriores, primero, explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuestro notebook )

 

3. Aplicación del modelo.

Para aplicar el modelo de regresión logística, vamos a usar una librería de Python, Patsy, que permite generar de forma muy cómoda el formato de matrices con el que funciona este modelo. Vamos a recordar un poco cómo era la notación matemática, para entender cuál debe ser el formato de entrada al modelo. La regresión logística era una transformación lineal (con salida no lineal) que se podía expresar de la siguiente manera:

Fórmula de una transformación lineal.
Figura 1: Fórmula de una transformación lineal.

Donde Y es la variable dependiente u objetivo que queremos estimar (“infidelity”), y X son las variables dependientes o predictoras, que “condicionan” el valor de la Y (“age”, “religious”, “children” etc). Los valores de los coeficientes βi son los que el modelo va a aprender” entrenándose con valores conocidos del dataset. Una vez entrenado el modelo, será capaz de predecir qué valor tendrá Y para un caso no recogido en los datos de entrenamiento. La fórmula  también puede expresarse de esta forma, como producto escalar:

Transformación lineal expresada como producto escalar.
Figura 2: Transformación lineal expresada como producto escalar.

Si  generalizamos para más de una observación Xi, necesitamos generar una matriz como esta:

Figura 3: Transformación lineal expresada de forma matricial.

3.1 Formateamos los datos con Patsy

La librería Patsy permite, precisamente, generar estas matrices de forma muy ágil gracias a la función dmatrices   y a su notación de fórmula. Además, dmatrices añade de forma automática la columna de “1” necesaria para obtener los términos de corte (εi), conocidos como “intercept terms”.

Otra de las ventajas de Patsy es que permite trabajar con datos categóricos de forma muy flexible, gracias a la función C(), que indica que los datos entre los paréntesis deben tratarse como etiquetas y no como números. En nuestro ejemplo, vamos a usarlo para que no considere como números los códigos de ocupación. Esta operación es lo que se llama, convertir datos en “dummy”.

Por tanto, al aplicar la función dmatrices con esta sintaxis, obtenemos como resultado dos matrices. La primera, con los resultados o valores de la variable objetivo “y”, y la segunda, con los valores de las variables independientes X o datos predictores:

Sintaxis de de función dmatrices de Patsy.
Figura 4: Sintaxis de de función dmatrices de Patsy.

Para nuestro ejemplo:

y, X = dmatrices(‘infidelity ~ rate_marriage + age +  yrs_married + children + religious+ educ + C(occupation) + C(occupation_husb) ‘, dta, return_type = ‘dataframe’)

Con esta sentencia obtenemos las dos matrices que hemos mencionado antes, en las que los valores de  “infidelity”(y) son iguales al producto de los valores de la matriz que representa las variables independientes (X) por unos coeficientes, más un término de corte. Al mismo tiempo indicamos que no use los valores de códigos de ocupación como numéricos sino como categóricos.

Código para convertir la matriz de datos en el formato necesario para aplicar el modelo.
Figura 5: Código para convertir la matriz de datos en el formato necesario para aplicar el modelo.

Comprobamos las dimensiones de las matrices de salida, y sus índices:

Código para comprobar las dimensiones de las matrices.
Figura 6: Código para comprobar las dimensiones de las matrices.

3.2 Aplicamos el modelo

Ya sólo nos queda un último paso para poder aplicar el modelo de regresión logística de scikit-learn, y es convertir el vector columna y en matriz 1D.  A continuación, ya podemos aplicar directamente el modelo LogisticRegression. Como resultado del entrenamiento del modelo, obtenemos la matriz de coeficientes:

Aplicación del modelo.
Figura 7: Aplicación del modelo.

Podemos ver que la precisión del modelo es de un 73%:

Estimación de la precisión.
Figura 8: Estimación de la precisión.

También, podemos estimar también qué porcentaje de individuos tienen alguna aventura, obteniendo un resultado de un 32%

Porcentaje de individuos infieles.
Figura 9: Porcentaje de individuos infieles.

La matriz de coeficientes obtenida muestra qué peso tiene cada uno de los coeficientes. Para visualizarlo, podemos usar List(zip), que crea una matriz a partir de dos listas, la que contiene el nombre de los índices, en la primera columna, y los valores en la segunda.

Código para obtener la matriz de coeficientes.
Figura 10: Código para obtener la matriz de coeficientes.

Por ejemplo, podemos ver cómo los incrementos en rate_marrige y religiousnes disminuyen la probabilidad de infidelidad. Lo cual es consistente con el análisis de correlación de variables que hicimos en el primer post.

Coeficientes.
Figura 11: Coeficientes.

 

3.3 Evaluamos el modelo

Para evaluar el modelo, dividimos el dataset en dos partes. Dejamos un 75% de los datos como datos de entrenamiento (train), y reservamos el 25% restando como datos de prueba (test). A continuación, entrenamos el modelo de nuevo, pero ahora sólo con los datos de entrenamiento. 

Dividimos el dataset en train y test.
Figura 12: Dividimos el dataset en train y test.

 Una vez entrenado el modelo, lo aplicamos a los datos reservados como «test», y calculamos las  métricas precisión (Accurary) y exactitud (Precision). Cuidado con los «false friends»- Hemos obtenido unos valores de un 73% para la precisión, que no es que sea muy alto, pero tampoco es un mal resultado. Indica que la dispersión de los valores es baja. Sin embargo, la exactitud, es sólo de un 62%. No es un dato muy bueno, ya que se refiere a lo cerca que está un resultado del valor verdadero. Los valores de la diagonal principal de la matriz de confusión (993, 176) indican las predicciones correctas, tanto para verdaderos positivos, como verdaderos negativos. La otra diagonal (con valores 316, 117) recoge las predicciones erróneas.

 Calculamos precisión, exactitud y matriz de confusión.
Figura 13: Calculamos precisión, exactitud y matriz de confusión.

  Para ver la matriz de confusión de forma mucho más «visual», podemos hacerlo en forma de mapa de calor:

Vemos la matriz de confusión como mapa de calor usando seaborn.
Figura 14: Código para ver la matriz de confusión como mapa de calor usando seaborn.
Matriz de confusión en forma de mapa de calor.
Figura 15: Matriz de confusión en forma de mapa de calor.

3.4 Hacemos una predicción

 Por último, ya sólo nos queda hacer una predicción usando el modelo que acabamos de crear.  Para que nos resulta más fácil «escribir» los datos de entrada, usaremos el indexador iloc para extraer ,como ejemplo, uno de los registros de la matriz de datos. En particular hemos elegido el registro número 4.

Extraemos un registro del dataset como ejemplo.
Figura 16: Extraemos un registro del dataset como ejemplo.

 Como resultado, podemos ver el aspecto que tiene este registro en concreto, lo reconvertimos en el formato necesario para poder aplicar el modelo y, ya que estamos, lo probamos. En este caso, la probabilidad de infidelidad es de un 30%. 

Visualización de ese registro concreto.
Figura 17: Visualización de ese registro concreto.

A continuación, lo usaremos de base para introducir en el modelo los datos concretos para los que queremos obtener una predicción mediante el método keys(). Por ejemplo: mujer de 35 años, con 3 hijos, no religiosa,nivel educativo alto, con ocupaciones (ambos) técnicos especializados y una buena valoración de su matrimonio.

F.keys();F[‘age’]=35; F[‘children’]=3; F[‘yrs_married’]=10; F[‘religious’]=1; F[‘religious’]=1; F[‘C(occupation_husb)[T.3.0]’]=1

Cambiamos con F.keys() los valores de cada variable para introducir los que queramos
Figura 18: Cambiamos con F.keys() los valores de cada variable para introducir los que queramos

Al aplicar el modelo a este caso en particular, obtenemos como resultado una probabilidad de infidelidad del 29%. Prueba con los datos que quieras, ¿qué resultados obtienes?

esultado obtenido al aplicar el modelo al nuevo caso.
Figura 19: Resultado obtenido al aplicar el modelo al nuevo caso.

¿Te animas a probarlo? A continuación, tienes el código completo del experimento, que puedes cortar y pegar en tu Jupyter notebook. Te recomendamos que lo vayas haciendo paso a paso, como lo hemos explicado, para poder entender qué se hace en cada momento. Incluso, puedes ir introduciendo pequeñas modificaciones para probar cosas nuevas.

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

4. Conclusiones

Llegado el momento de sacar conclusiones, tenemos que pararnos a reflexionar. ¿Cuál ha sido el objetivo del experimento?. Hemos aprendido a crear un modelo de predicción basado en regresión logística. Hemos conocido y aprendido a cargar los datasets de Statsmodels. Hemos recordado un poco de álgebra de matrices para comprender mejor el modelo. Y sí, hemos aplicado el modelo a nuestros datos (¿a que no te has resistido?), pero ¿tiene algún tipo de validez el resultado?.

A pesar de haber hecho un análisis serio, que, por supuesto se podría haber hecho siguiendo otros enfoques, por ejemplo, reduciendo por ejemplo el número de variables a considerar tras el análisis de correlación, o aplicando el modelo de statsmodel en lugar del del scikit learn, o incluso eligiendo otro algoritmo de clasificación; nunca debemos olvidar sobre qué estamos construyendo nuestro modelo. Nos referimos, por supuesto, a los datos. Y un dataset cuyo origen es una encuesta realizada en los años 70 por una revista femenina en EEUU no parece que pueda ser extrapolable al momento actual, ni a latitudes tan distantes como la nuestra. Si embargo, en la era de las apps «para ligar» o encontrar tu media naranja, hay que ser conscientes de lo que una buena analítica de datos podría obtener a partir de sus bases de datos que, por supuesto, están protegidas por leyes de privacidad. Pero…ahí están.

Aquí puedes encontrar todos los post de este experimento:

Si quieres echar un vistazo a otros post «Valentinianos» aquí los tienes:

Anuncio publicitario


5 comentarios

Predictor de infidelidad (II): ¿Qué es la regresión logística?

En el post anterior, planteamos crear un «predictor de infidelidad» a partir del dataset «afairs», cargamos los datos y realizamos una breve exploración/visualización de éstos. En el post de hoy, analizaremos el tipo de problema, y el algoritmo que vamos a utilizar para la nuestro modelo de predicción, la regresión logística.  Antes de aplicarlo, merece la pena detenerse a comprenderlo un poco mejor.

En este segundo post aprenderemos lo siguiente:

  • Cómo definir la variable objetivo en un problema de clasificación
  • Qué es y para qué sirve la regresión logística
  • Cómo explicar de forma intuitiva las matemáticas del modelo
  • Cuáles son sus limitaciones

(También podríamos haberlo abordado como variable de texto, siempre hay enfoques alternativos para la solución de cualquier problema).

Tras el breve análisis que hicimos en el post anterior, es fácil deducir que nos hayamos ante un problema de clasificación. Esto no es nada raro, ya que, aproximadamente un 70% de los problemas de Data Science son de este tipo. Decimos que es de tipo binario, porque la variable objetivo, aquella cuyo valor queremos predecir, podrá tener dos valores enteros (0=fiel, 1=infiel).

Por tanto, definimos una nueva variable, «infidelity«, que será la variable objetivo (target variable) cuyo valor sea «0» cuando la variable «affairs» es 0 y 1 cuando esta variable es >0. Recordemos que la variable «affairs» era una medida del tiempo dedicado a tener una «aventura extramarital». Si pedimos de nuevo que muestre los 10 primeros registros, vemos que, en este caso, el valor de la nueva variable es 1 (= amores «no oficiales»).

Definición de la variable objetivo "infidelity".
Figura 1: Definición de la variable objetivo «infidelity».
Impresión de los 10 primeros valores de la variable.
Figura 2: Impresión de los 10 primeros valores de la variable.

Hay distintas familias de algoritmos que se pueden usar para cada tipo de problema en Machine Learning. Lo habitual es usar varios modelos, evaluar su rendimiento y así elegir el más adecuado a cada caso. En este caso, obviamos ese análisis porque queremos trabajar con un modelo concreto, la regresión logística que, como veremos, es una elección muy razonable.

2. ¿En qué consiste la regresión logística?

La regresión logística es uno de los algoritmos de aprendizaje supervisado más sencillos y más utilizados en Machine Learning para problemas de clasificación. Es un tipo de análisis de regresión que permite  predecir el resultado de una variable categórica, (binaria o múltiple) en función de las variables independientes o predictoras. Nos vamos a centrar en el primer caso, regresión logística binaria.

Para entenderlo mejor, veamos uno de los ejemplos más típicos: los detectores de spam. A partir de una serie de variables independientes o características de entrada, tales como el remitente de un mensaje, si va dirigido a una única persona o a un grupo de ellas, o si en el campo «Asunto» aparecen determinadas palabras; es capaz de predecir si es correo deseado o no (variable dependiente binaria con dos valores posibles: «correo deseado» o «correo deseado»).

En el siguiente vídeo, Ligdi González explica de forma breve y sencilla cómo funcionan estos algoritmos:

En resumen, los algoritmos de regresión logística, a pesar de su nombre, son algoritmos de clasificación, donde la variable dependiente (valor a predecir), es categórica y binaria. Por tanto, no se trata de predecir valor numérico (como en el caso de la regresión lineal), sino una «etiqueta» de clasificación.

En nuestro ejemplo concreto, queremos predecir la probabilidad de que una persona sea fiel o infiel, basándonos en los valores de las variables rate_marriage, years_marriage, children, religious, occupation, occupation_husb y educ.

2.1 Comprendiendo las matemáticas del modelo.

Sin meternos mucho en profundidades matemáticas, el objetivo de la regresión logística es obtener la probabilidad de que la variable dependiente tenga un valor categórico u otro (en nuestro ejemplo o “infidelity”= 0 o “infidelity”= 1), en función de los valores de las variables de entrada.

Para ello utiliza un modelo de probabilidad lineal, en el que la probabilidad condicionada es función lineal de los valores de las variables de entrada. Esta función es la que se conoce como función logits(Y) y su resultado es un score o puntuación. Su expresión matemática es la siguiente;

Figura 1: Fórmula de la función logits.
Figura 3: Fórmula de la función logits.

Para entenderlo un poco mejor. Como el objetivo es predecir una «probabilidad», nos movemos en el ámbito de las matemáticas probabilísticas, que son una rama de las matemáticas que se ocupa de medir o determinar cuantitativamente la posibilidad de que un suceso o experimento produzca un determinado resultado. La probabilidad está basada en el estudio de la combinatoria y es fundamento necesario de la estadística. Por otra parte, se trata de una probabilidad condicionada, ya que el valor que tenga la variable que queremos predecir, está influido por los valores de las variables predictoras. Y se trata de una función linealporque se puede expresar como una función polinómica de primer grado, es decir, como una suma de valores correspondientes a las variables xi multiplicados por un coeficiente βi, cuya representación en el plano cartesiano es una recta.

El problema es que este “score” puede tomar cualquier valor. Para poder convertirlo en una “etiqueta” (recordemos que estamos ante un problema de clasificación, en este caso binario), usamos una función matemática que garantice que la probabilidad condicionada estará entre cero y uno. Para ello, usamos la función Softmax, que para el caso particular de una regresión logística binaria, sería la función Sigmoidea. La función sigmoidea ya nos es una función lineal, sino logarítmica. Por eso decimos que la regresión logística es un algoritmo lineal con una transformación no lineal en la salida.

Figura 2: Función sigmoidea.
Figura 4: Función sigmoidea.

  En el blog Data Aspirant, podemos encontrar una imagen que resume muy bien todo el proceso.

Proceso de regresión logística para clasificación binaria.
Figura 5: Proceso de regresión logística para clasificación binaria.  

2.2 Comprendiendo las limitaciones del modelo.

Antes de seguir codificando nuestro predictor, debemos recordar lo siguiente:  

  • La variable de salida es binaria. Predice la probabilidad de que una instancia pertenezca a la clase predeterminada, que se puede ajustar en una clasificación 0 o 1. En este caso, infidelity=1
  • La regresión logística es muy sensible a los outliers, o datos anómalos. Habrá que revisar este tema antes de aplicar el algoritmo.
  • Habrá que revisar la correlación entre variables, ya que, como en el caso de la regresión lineal, si hay dos o más variables altamente correlacionadas, podemos tener problemas de sobreajuste o de convergencia del modelo.

Si recordáis, aunque no mencionamos la razón, en el post anterior donde introdujimos el experimento, ya nos aseguramos de comprobar que no hubiera campos vacíos ni correlación entre las variables. En el tercer y último post de esta miniserie, retomaremos nuestro Jupyter Notebook en el punto en que lo dejamos. Prepararemos los datos para poder aplicar el modelo, lo entrenaremos, valoraremos los resultados, haremos una predicción y sacaremos conclusiones.

¡Todavía nos queda bastante trabajo, pero merece la pena!.¿no?

Aquí puedes encontrar todos los post de este experimento:

Si quieres echar un vistazo a otros post «Valentinianos» aquí los tienes:


6 comentarios

Especial San Valentin: ¿Podemos predecir la infidelidad con Inteligencia Artificial?

Hoy en «honor a San Valentín», una broma. Porque no vamos a hablar de amor, sino más bien de lo contrario. Aunque los amores «no oficiales» también pueden serlo de verdad ¿no?. Pero dejémonos de disquisiciones filosóficas, que lo que queremos es ver, con un sencillo ejemplo en Python, y el dataset «affairs», un viejo conocido para los científicos de datos noveles, si podemos construir un predictor de infidelidad. ¿te animas a probarlo con nosotros?

El año pasado también celebramos San Valentín con un poco de humor, en este caso, estadístico: ¿Por qué nunca tendré novia?.

Este año vamos a «trabajar» un poco más y vamos a construir un «predictor de infidelidad» en Python. Para que no se haga demasiado largo, vamos a dividir en experimento en tres partes:

  1. Introducción del experimento, carga, exploración y visualización de los datos (¡este post!)
  2. Explicación del modelo que vamos a utilizar: algoritmo de regresión logística
  3. Aplicación y evaluación del modelo. Conclusiones.

En particular, en este primer post aprenderemos:

  • Qué es Statsmodels y cómo cargar una de sus librerías. Desde Kaggle, por ejemplo, se puede cargar una versión reducida del dataset, pero nosotros trabajaremos con la completa
  • Cómo averiguar las características del dataset (descripción, fuente, dimensiones etc)
  • Cómo detectar si faltan datos
  • Cómo analizar la correlación entre variables
  • Cómo visualizar los datos para hacer una exploración previa

Introducción del experimento, carga, exploración y visualización de los datos

Nos gusta probar distintas formas de hacer las cosas, ya que es una estupenda forma de aprender y poder elegir después el entorno en el que nos sentimos más cómodos. Podemos trabajar con los notebooks de Azure Machine Learning Studio, como hicimos en nuestro experimento: «Titanic: Tu primer experimento en Azure Machine Learning Studio». Otra opción es usar Jupyter Notebooks en local. Si te animaste a seguir nuestra serie «Atrévete con Python: un experimento para todos los públicos», ya tendrás instalado Anaconda con todo lo que necesitas para empezar a trabajar. Incluso puedes trabajar con la versión online de Jupyter, o, con los notebooks de Microsoft Azure que usamos en el experimento «Machine Learning for kids: construye con tus hijos un bot experto en su animal favorito». Como veis, opciones, no faltan.

Nosotros vamos a elegir trabajar con Jupiter Notebooks en local. (si no sabes cómo instalarlos/utilizarlos, te recomendamos que sigas la serie «Atrévete con Python», donde lo explicamos de forma clara y sencilla).

(Explicaremos paso a paso con imágenes cómo hacerlo, y al final del proceso, incorporamos la versión final editable de la que podéis copiar directamente el código para pegarlo en vuestro notebook )

Empezamos creando un nuevo notebook Python 3 .Lo primero que vamos a hacer es importar los módulos y librerías que vamos a necesitar. En particular, trabajaremos con algunos de los módulos de Python más importantes para trabajar con probabilidad y estadística que si recordamos son:

  • numpy: El popular paquete matemático de Python, Ofrece funciones estadísticas que podemos aplicar fácilmente sobre los arrays de Numpy.
  • pandas: Esta es la librería más popular para análisis de datos y finanzas. Ofrece funciones muy útiles de estadística descriptiva  y facilita mucho el trabajo con series de tiempo. series de tiempo.
  • Scikit Learn: Construida sobre NumPy, SciPy y matplotlib, esta librería contiene un gran número de herramientas para machine learning y modelado estadístico. En nuestro ejemplo, usaremos su algoritmos de regresión logística, la herramienta de split que divide el dataset en una parte para entrenamiento y otra para test, y las  métricas. 
  • scipy.stats: Es un submodulo del paquete científico Scipy que se complementa con Numpy. Las funciones estadísticas que no están en uno, se pueden encontrar en el otro. 
  • matplotlib: Es la librería más popular en Python para visualizaciones y gráficos. 
  • statsmodels: Esta librería nos brinda un gran número de herramientas para explorar datos, estimar modelos estadísticos, realizar pruebas estadísticas y muchas cosas más.
  • Seaborn: basada en matplotlib, se usa para hacer más atractivos los gráficos e información estadística en Python. En nuestro ejemplo lo usaremos para hacer mapas de calor.
Figura 1: Carga de módulos y librerías.
Figura 1: Carga de módulos y librerías.


1.1 Carga de datos

A continuación, cargamos los datos, y pedimos que muestre los 10 primeros registros. El dataset “affairs” se puede cargar desde la librería Statsmodel.

(Para ver paso a paso cómo cargar datasets en Python desde statsmodels, scikit-learn, y seaborn, puedes leer este post de Sergiy Kolesnikov ).

Figura 1: Carga de módulos y librerías.
Figura 2: Carga de datos.


 Echamos un vistazo a los datos.
Figura 3: Echamos un vistazo a los datos.

Si no tienes statsmodels instalado, puedes hacerlo usando pip:

pip install -U statsmodels

También se puede instalar mediante el instalador de Anaconda. Puedes instalar la última versión usando:

conda install -c conda-forge statsmodels


Statsmodels es una de las librerías científicas de Python principalmente orientada al análisis de datos, ciencia de datos y estadística. Trabaja sobre las librerías numéricas NumPy y SciPi, y se integra con Pandas para el manejo de datos. Las funciones gráficas se basan en la librería MatplotlibStatsmodels también ofrece conjuntos de datos (y metadatos) para su uso en ejemplos, tutoriales etc.

Conjuntos de datos que se pueden cargar desde Staatsmodels.
Figura 4: Conjuntos de datos que se pueden cargar desde Staatsmodels.

Cada uno de los datasets tiene unos atributos DESCRLONG, SOURCE y NOTE que describen detalladamente su contenido. Pedimos que los muestre con las siguientes sentencias:

Mostramos la descripción, características y origen de los datos.
Figura 5: Mostramos la descripción, características y origen de los datos.
Mostramos la descripción, características y origen de los datos.
Figura 6: Descripción, características y fuente.

El dataset “affairs” no es tan conocido como el de «iris», pero también es un clásico del aprendizaje en Data Science. Se basa en una encuesta realizada por la revista Redbook en 1974, en la que se preguntaba a mujeres casadas por sus aventuras extramaritales. Para más información, se puede consultar el trabajo original publicado en 1978 por el Journal of Political Economy. 

Como vemos, el dataset contiene 6366 observaciones con 9 variables. El objetivo es crear un modelo que permita predecir si un individuo (en este caso, mujer) va a ser “fiel” o “infiel”, basándose en el valor de esas 9 variables para el nuevo caso y en lo que el modelo haya «aprendido» a partir de los datos de entrenamiento (los datos de la encuesta).
La descripción de las variables es la siguiente:

  • rate_marriage:  valoración de la encuestada sobre su matrimonio (1 = muy mala, 5 = muy buena)
  • age: edad de la mujer
  • yrs_married: años de matrimonio
  • children: número de hijos
  • religious: valoración de la encuestada sobre su religiosidad (1 = nada religiosa, 4 = muy religiosa)
  • educ: nivel educativo (9 = primaria, 12 = secundaria, 14 = titulación universitaria media, 16 = titulación universitaria superior, 17 = master, 20 = doctorado)
  • occupation: ocupación (1 = estudiante, 2 = agricultura / semicualificado / no cualificado, 3 = «oficinista», 4 = profesora / enfermera / escritora / técnica / cualificada), 5 = gestión/ negocios, 6 = profesional de alta especialización)
  • occupation_husb: ocupación del marido (con la misma codificación)
  • affairs: tiempo dedicado a aventuras extramaritales

1.2 Exploración de los datos

Vamos a echarle un vistazo a los datos para ver si hay algo que nos llame la atención, o nos de una pista de posibles correlaciones entre las variables que analizaríamos con mayor detalle después.

1.2.1 ¿Faltan valores?

Podemos comprobar si hay campos vacíos con la función isnull(). Esta función es booleana y devuelve dos resultados posibles: «true», cuando falta el dato o  «false», cuando no falta.Como el resultado es «false», sabemos que no es necesaria ninguna operación de eliminación de registros, o sustitución por valores medios etc. Hemos puesto “.head(10)” para que sólo saque los 10 primeros registros, porque sabemos que en este caso no faltan datos y no queremos que imprima todo el dataset, pero habría que revisarlos todos.

Esta comprobación también se suele hacer de forma más visual usando mapas de calor de seaborn, pero, como hemos mencionado antes, este dataset no tiene campos vacíos. Así que, por esta parte, no hay problemas.

Comprobamos que no falten valores.
Figura 7: Comprobamos que no falten valores.

1.2.2 ¿Se observa algún tipo de correlación?

Para ver si existe correlación entre las variables lo más práctico es calcular la matriz de correlación.  Es un paso importante porque puede afectar negativamente al rendimiento del algoritmo. Las variables que presentan un índice de correlación muy alto ( >0,9)  deben excluirse del análisis (por ejemplo, la función “drop”). Como podemos ver, en este caso no es necesario eliminar ninguna.

Calculamos la matriz de correlación.
Figura 8: Calculamos la matriz de correlación.
Figura 9: Matriz de correlación.
Figura 9: Matriz de correlación.

El signo del índice de correlación también nos da información.  Si el índice de correlación entre dos variables es positivo, significa que, si una de ellas aumenta, la otra también lo hace. Por el contrario,  cuando el signo es negativo, si una variable aumenta, la otra, disminuye.  Por ejemplo, para affairs y rate_marriage es negativo. Esto indica que las personas que valoran más su matrimonio (rate_marriage creciente), tienen menos aventuras extramaritales (affairs decreciente).

1.3 Visualización de los datos

El histograma sobre la influencia del nivel educativo también arroja resultados interesantes. El menor número de infidelidades se produce en los niveles extremos: mujeres con nivel básico de educación o profesionales con una muy alta cualificación-

Mostramos histograma Influencia del nivel educativo.
Figura 10: Mostramos histograma Influencia del nivel educativo.
Histograma Nivel Educativo.
Figura 11: Histograma Nivel Educativo.

También podemos observar la influencia de los años de matrimonio:

Mostrar histrograma Influencia años de matrimonio.
Figura 12:Mostrar histrograma Influencia años de matrimonio.

Curiosamente, en promedio, es en los primeros años de matrimonio cuando se aprecia un mayor número de infidelidades.

Mostrar histrograma Influencia años de matrimonio.
Figura 13: Histograma Años de matrimonio.

Debe quedar algo así (ahora ya puedes copiar directamente el código en tu notebook):

Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Aquí puedes encontrar todos los post de este experimento:

  1. Especial San Valentín: ¿Podemos predecir la infidelidad con IA? 
  2. Predictor de infidelidad (II): ¿Qué es la regresión logística? 
  3. Predictor de infidelidad (III): Un ejemplo de regresión logística sobre el dataset “Affairs”