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:
- Introducción del experimento, carga, exploración y visualización de los datos (¡este post!)
- Explicación del modelo que vamos a utilizar: algoritmo de regresión logística
- 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
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.
1.1 Carga de datos
(Para ver paso a paso cómo cargar datasets en Python desde statsmodels, scikit-learn, y seaborn, puedes leer este post de Sergiy Kolesnikov ).
Si no tienes statsmodels instalado, puedes hacerlo usando pip:
pip install -U statsmodels
conda install -c conda-forge statsmodels
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.
- 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
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.
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.
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).
Debe quedar algo así (ahora ya puedes copiar directamente el código en tu notebook):
Aquí puedes encontrar todos los post de este experimento:
- Especial San Valentin: ¿Podemos predecir la infidelidad con IA? (este post)
- Predictor de infidelidad (II): ¿Qué es la regresión logística?
- Predictor de infidelidad (III): Un ejemplo de regresión logística sobre el dataset "Affairs"
Los post más interesantes de LUCA Data Speaks organizados por series y temáticas