El análisis exploratorio de datos (EDA) es un primer paso esencial en la mayoría de los proyectos de ciencia de datos y, a menudo, implica seguir los mismos pasos para caracterizar un conjunto de datos (por ejemplo, encontrar tipos de datos, información faltante, distribución de valores, correlaciones, etc.). Una de las últimas es una nueva biblioteca Python de código abierto llamada Sweetviz.
Contenido
PalancaInstalación y lanzamiento de Sweetviz
Después de instalar Sweetviz (usando pip install sweetviz), simplemente cargue los marcos de datos de pandas como lo haría normalmente, luego llame a Analyze(), Compare() o Compare_intra().
importar dulce a saber
importar pandas como pd
tren = pd.read_csv("tren.csv")
prueba = pd.read_csv("prueba.csv")
Ahora tenemos 2 marcos de datos (entrenar y probar) y nos gustaría analizar el valor objetivo "Sobrevivido". Quiero señalar que, en este caso, sabemos el nombre de la columna de destino de antemano, pero especificar una columna de destino sigue siendo opcional. Podemos generar un informe con esta línea de código:
my_report = sweetviz.compare([tren, "Tren"], [prueba, "Prueba"], "Sobrevivió")
Ejecutar este comando realizará el análisis y creará el objeto de informe. Para obtener el resultado, simplemente use el comando show_html():
my_report.show_html("Report.html") # Si no proporciona un nombre de archivo, el valor predeterminado será SWEETVIZ_REPORT.html
Resumen total
El resumen nos muestra las características de los dos marcos de datos uno al lado del otro. Podemos identificar de inmediato que el conjunto de prueba tiene aproximadamente la mitad del tamaño del conjunto de entrenamiento, pero contiene la misma funcionalidad. Esta leyenda en la parte inferior nos muestra que el conjunto de entrenamiento contiene la variable objetivo "Sobrevivió", pero el conjunto de prueba no.
Tenga en cuenta que Sweetviz hará una mejor estimación para determinar el tipo de datos de cada columna, entre numérico, categoría/booleano y texto.
Asociaciones
Este gráfico es una combinación de imágenes de Drazen Zaric: mejores mapas de calor y tramas de matriz de correlación en Python y conceptos de Shaked Zychlinski: la búsqueda de correlación categórica.
Básicamente, además de mostrar las tradicionales correlaciones numéricas, unifica en un único gráfico tanto las correlación numérico sino también el coeficiente de incertidumbre (para categórico-categórico) y la relación de correlación (para categórico-numérico). Los cuadrados representan las variables vinculadas a las características categóricas y los círculos representan las correlaciones numérico-numéricas. Tenga en cuenta que la diagonal trivial se deja en blanco, para mayor claridad.
Las asociaciones categóricas-categóricas (proporcionadas por el coeficiente de incertidumbre) son ASIMÉTRICAS, lo que significa que cada fila representa la cantidad de información que el título de la fila (izquierda) brinda sobre cada columna. Por ejemplo, "Sexo", "Pclase" y "Tarifa" son los elementos que dan más información sobre "Sobrevivido". Para el conjunto de datos del Titanic, esta información es bastante simétrica, pero no siempre es así.
Finalmente, vale la pena señalar estos métodos de correlación/asociación
no debe tomarse como un evangelio ya que hacen suposiciones sobre la distribución subyacente de datos y relaciones. Sin embargo, pueden ser un punto de partida muy útil.
Seleccionando una variable
Cuando se especifica una variable de destino, aparecerá primero, en un cuadro negro especial. Actualmente, solo las entidades numéricas y booleanas pueden ser objetivos.
Podemos deducir de este resumen que "Sobrevivió" no tiene datos faltantes en el conjunto de entrenamiento (891, 100%), que hay 2 valores posibles distintos (que representan menos de 1% de todos los valores), y del gráfico se puede estimó que alrededor de 60 % no sobrevivieron.
Datos cualitativos y booleanos
Cuando mueve el mouse sobre una de las variables, un cuadro a la derecha mostrará los detalles. El contenido de los detalles depende del tipo de variable analizada. En el caso de una variable categórica (o booleana), como es el caso del target, el análisis es el siguiente:
Aquí podemos ver las estadísticas exactas para cada clase, donde 62% no sobrevivió y 38% sobrevivió. También obtiene el detalle de las asociaciones para cada una de las otras funciones.
Datos cuantitativos
Los datos numéricos muestran más información sobre su resumen. Aquí podemos ver que en este caso faltan alrededor de 20 % de los datos (21 % en los datos de prueba, lo cual es muy consistente).
Tenga en cuenta que el valor objetivo ("Sobrevivido" en este caso) se traza como una línea, justo encima del gráfico de distribución. Esto permite un análisis instantáneo de la distribución objetivo en relación con otras variables.
Curiosamente, podemos ver en el gráfico de la derecha que la tasa de supervivencia es bastante constante en todas las edades, excepto en los más jóvenes que tienen una tasa de supervivencia más alta. Parecería que "las mujeres y los niños primero" no son solo palabras.
Detalles de una variable cuantitativa
Al igual que con el tipo de datos categóricos, el tipo de datos numérico muestra información adicional en su área de detalles. Vale la pena señalar aquí los botones en la parte superior del gráfico.
Estos botones cambian el número de "contenedores" que se muestran en el gráfico. Puede seleccionar entre los siguientes: Automático, 5, 15, 30.
Para acceder a estos botones, debe "bloquear en su lugar" la funcionalidad actual haciendo clic en ellos. Luego, la función tiene un CONTORNO ROJO para mostrar que está bloqueada en su lugar y que puede acceder al área de detalles.
datos de texto
Por ahora, todo lo que el sistema no considere numérico o categórico será considerado "texto". Las funciones de texto actualmente solo muestran el número (porcentaje) como estadísticas.
Comparación de subpoblaciones
Incluso si está viendo un solo conjunto de datos, puede ser muy útil estudiar las características de diferentes subpoblaciones dentro de ese conjunto de datos.
Para ello, Sweetviz ofrece la función compare_intra(). Para usarlo, proporciona una prueba booleana que divide la población (aquí intentamos entrenar ["Sexo"] == 'masculino', para tener una idea de las diferentes poblaciones de género) y dar a cada subpoblación. Por ejemplo:
my_report = sweetviz.compare_intra(tren, tren["Sexo"] == 'masculino', ["Masculino", "Femenino"], 'Sobrevivió')my_report.show_html() # Si no proporciona un nombre de archivo, el valor predeterminado será SWEETVIZ_REPORT.html
Esto da el siguiente análisis:
Tenga en cuenta que el valor objetivo ("Sobrevivió" en este caso) ahora se traza como líneas separadas, una para cada conjunto de datos que se comparan (por ejemplo, hombre en azul, mujer en naranja).
Ejemplo en el conjunto de datos del Titanic
PasajeroId
- La distribución de ID y supervivencia es uniforme y ordenada.
- Sin datos faltantes
Sexo
- El doble de hombres que de mujeres
- Las mujeres sobreviven 30% mejor que los hombres
- Mismas distribuciones en conjuntos de entrenamiento y prueba.
- Sin datos faltantes
edad
- 20 % de datos faltantes, datos faltantes consistentes y distribución entre Train y Test
- Población centrada en adultos jóvenes, pero las edades de 0 a 70 años están bien representadas
- Supervivencia sorprendentemente distribuida uniformemente, excepto por un pico en edades más jóvenes
- La edad parece ligada a Hermanos, Pclase y Tarifa, y un poco más sorprendente a Embarcado
Nombre
- Sin datos faltantes
- Todos los nombres son distintos.
Pclase
- La capacidad de supervivencia sigue de cerca a la clase (la primera clase tiene más probabilidades de sobrevivir, la tercera clase tiene menos probabilidades)
- Distribución similar entre Train y Test
- Sin datos faltantes
SibEsp
- Parece haber un pico de capacidad de supervivencia en 1 y, hasta cierto punto, en 2, pero (mirando el panel de detalles que no se muestra aquí) hay una fuerte caída en 3 y más. ¿Las familias numerosas no podían hacerlo o eran quizás más pobres?
Parque
- Reparto Similar
- Sin datos faltantes
Boleto
- ~80 % de valores distintos, es decir, aproximadamente 1 de cada 5 tickets compartidos en promedio
- El boleto de mayor frecuencia fue 7, que generalmente es consistente con el número máximo de hermanos (8)
- No faltan datos, los datos se ven bastante limpios
Tarifa
- Como se esperaba, y similar a la clase P, las tarifas más altas sobrevivieron mejor (aunque el tamaño de la muestra se reduce bastante en los niveles más altos)
- Una relación de correlación de 0,26 para "Sobrevivió" es relativamente alta, por lo que tendería a respaldar esta teoría.
- Aproximadamente 30 % de valores distintos parece un poco alto, ya que esperaría precios menos fijos, pero parece haber mucha granularidad, así que está bien
- Solo falta 1 registro en el conjunto de prueba, datos bastante consistentes entre Train y Test
Cabina
- 78% faltan datos
- La frecuencia máxima es de 4, lo que tendría sentido para tener 4 personas como máximo en una cabina.
Incrustado
- 3 valores distintos (S, C, Q)
- Capacidad de supervivencia ligeramente mayor en C; ¿Podría ser este un lugar con gente más rica?
- De todos modos, "Embedded" muestra un coeficiente de incertidumbre de solo 0,03 para "Survived", por lo que puede no ser muy significativo
Análisis general
- En general, la mayoría de los datos están ahí y parecen coherentes y lógicos; sin grandes valores atípicos ni grandes sorpresas
Datos de prueba versus datos de entrenamiento
La prueba contiene alrededor de 50 líneas % menos.
Train y Test están muy cerca en la distribución de datos faltantes.
Los valores de datos de entrenamiento y prueba son muy consistentes en todos los ámbitos
Análisis de asociación/correlación
- El género, la tarifa y la clase brindan la mayor cantidad de información sobre los sobrevivientes
- Como era de esperar, la tarifa y la clase P están altamente correlacionadas
- La edad parece decirnos mucho sobre la clase P, los hermanos y, hasta cierto punto, la tarifa, lo que sería algo esperado. Parece decirnos mucho sobre "Embedded", que es un poco más sorprendente.
datos perdidos
- No faltan datos significativos excepto la edad (~20 %) y la cabina (~77 %)