in

Limpieza, análisis y visualización de datos de encuestas en Python

1D8l4SQvv4 hNWIU2Hedgnw

Limpieza, análisis y visualización de datos de encuestas en Python

Un tutorial usando pandas, matplotlib, y seaborn para producir información digerible a partir de datos sucios

Charlene Chambliss

30 de marzo de 2019·10 min de lectura

Si trabaja con datos en una startup de D2C, es muy probable que se le pida que mire los datos de la encuesta al menos una vez. Y dado que SurveyMonkey es una de las plataformas de encuestas más populares que existen, es muy probable que sean datos de SurveyMonkey.

La forma en que SurveyMonkey exporta datos no es necesariamente rmiady para el análisis de inmediato, pero está bastante cerca. A continuación, mostraré algunos ejemplos de preguntas que podría querer hacer sobre los datos de su encuesta y cómo extraer esas respuestas rápidamente. Incluso escribiremos algunas funciones para hacernos la vida más fácil al trazar preguntas futuras.

Estaremos usando pandas, matplotlib, y seaborn para dar sentido a nuestros datos. Usé Mockaroo para generar estos datos; específicamente, para los campos de preguntas de la encuesta, utilicé «Lista personalizada» e ingresé en los campos correspondientes. Podrías lograr el mismo efecto usando random.choice en el random módulo, pero me resultó más fácil dejar que Mockaroo lo creara todo por mí. Luego modifiqué los datos en Excel para que reflejaran la estructura de una exportación de SurveyMonkey.

Oh chico … aquí vamos

Tu primera reacción a esto podría ser “Ugh. Es horrible.» Quiero decir, los nombres de las columnas no se leyeron correctamente, hay un montón de NaN, en lugar de representaciones numéricas como 0/1 o 1/2/3/4/5, tenemos las respuestas de texto reales en cada celda … Y deberíamos en realidad estamos leyendo esto con un MultiIndex?

Pero no se preocupe, no es tan malo como podría pensar. Y vamos a ignorar MultiIndexes en esta publicación. (De todos modos, a nadie le gusta trabajar con ellos). El equipo necesita esos conocimientos lo antes posible, por lo que encontraremos algunas soluciones hacky.

Primera orden del día: se nos ha pedido que averigüemos cómo varían las respuestas a estas preguntas según el grupo de edad. Pero age es solo una edad, ¡no tenemos una columna para grupos de edad! Bueno, afortunadamente para nosotros, podemos definir fácilmente una función para crear una.

Pero si intentamos ejecutarlo así, ¡obtendremos un error! Eso es porque tenemos la primera fila y su valor para la edad es la palabra «edad» en lugar de un número. Dado que el primer paso es convertir cada edad en una int, esto fallará.

Necesitamos eliminar esa fila del DataFrame, pero nos será útil más adelante cuando cambiemos el nombre de las columnas, por lo que la guardaremos como una variable separada.

Notarás que, desde que quitaste headers, ahora hemos perdido algo de información al mirar los datos de la encuesta por sí mismos. Idealmente, tendrá una lista de las preguntas y sus opciones que se hicieron en la encuesta, proporcionada por quien quiera el análisis. De lo contrario, debe tener una forma separada de hacer referencia a esta información en un documento o nota que pueda ver mientras trabaja.

OK, ahora apliquemos el age_group función para obtener nuestro age_group columna.

1*1yI2XYR1zaMfe3Q6JeIUUQ

Excelente. A continuación, subconjinemos los datos para centrarnos solo en la primera pregunta. ¿Cómo varían las respuestas a esta primera pregunta según el grupo de edad?

Excelente. Ahora tenemos las respuestas en una variable. Pero cuando vayamos a graficar estos datos, no se verá muy bien, debido a las columnas con nombres incorrectos. Escribamos una función rápida para simplificar el cambio de nombre de las columnas:

Recordar headers de antes? Podemos usarlo para crear nuestro new_names_list para cambiar el nombre.

1*d8F7nzrdWUwZ 8WNAIQo8Q

Ya es una matriz, por lo que podemos pasarla directamente, o podemos cambiarle el nombre primero para facilitar la lectura.

¿No es mucho más agradable de ver? No se preocupe, estamos casi en la parte en la que obtenemos algunas ideas.

1*CtWlz50ispEV5VMRAT RFQ

Date cuenta cómo groupby y otras funciones de agregación ignoran los NaN automáticamente. Eso hace que nuestras vidas sean significativamente más fáciles.

Digamos que tampoco nos importa analizar a los clientes menores de 30 en este momento, por lo que trazaremos solo los otros grupos de edad.

De acuerdo, todo esto está muy bien, pero el grupo de más de 60 tiene más personas que los otros grupos, por lo que es difícil hacer una comparación justa. qué hacemos? Podemos graficar cada grupo de edad en una gráfica separada y luego comparar las distribuciones.

«Pero espera», podrías pensar. «Realmente no quiero escribir el código para 4 parcelas diferentes».

¡Pues claro que no! ¿Quién tiene tiempo para eso? Escribamos otra función para que lo haga por nosotros.

Creo que fue Jenny Bryan, en su maravillosa charla «Code Smells and Feels», quien me informó por primera vez de lo siguiente:

Si se encuentra copiando y pegando código y simplemente cambiando algunos valores, realmente debería escribir una función.

Esta ha sido una gran guía para mí para decidir cuándo vale la pena escribir una función para algo y cuándo no. Una regla general que me gusta usar es que si voy a copiar y pegar más de 3 veces, escribo una función.

También hay beneficios distintos a la conveniencia de este enfoque, como que:

  • reduce la posibilidad de error (al copiar y pegar, es fácil olvidarse accidentalmente de cambiar un valor)
  • hace que el código sea más legible
  • construye su caja de herramientas personal de funciones
  • te obliga a pensar en un nivel superior de abstracción

(¡Todo lo cual mejora sus habilidades de programación y hace que las personas que necesitan leer su código sean más felices!)

1*vNU1mjnnkdInT9Lgdz81uQ

¡Hurra, pereza!

Por supuesto, estos son datos generados a partir de una distribución uniforme y, por lo tanto, no esperaríamos ver diferencias significativas entre los grupos. Con suerte, los datos de su propia encuesta serán más interesantes.

A continuación, abordemos otro formato de pregunta. En este, necesitamos ver qué tan interesado está cada grupo de edad en un beneficio determinado. Afortunadamente, estas preguntas son más fáciles de abordar que las anteriores. Vamos a ver:

Y mira, dado que se trata de un DataFrame pequeño, age_group ya está agregado y no tendremos que agregarlo.

Frio. Ahora tenemos los datos subconjuntos, pero no podemos simplemente agregarlos por conteo esta vez como podríamos con la otra pregunta: la última pregunta tenía NaN que se excluirían para dar el conteo verdadero para esa respuesta, pero con esta, solo obtendríamos el número de respuestas para cada grupo de edad en general:

1*lkh8mIPZk9pjCJdk4uApWg

¡Definitivamente esto no es lo que queremos! El punto de la pregunta es comprender cuán interesados ​​están los diferentes grupos de edad, y debemos preservar esa información. Todo esto nos dice cuántas personas de cada grupo de edad respondieron a la pregunta.

¿Asi que que hacemos? Una forma de hacerlo sería volver a codificar estas respuestas numéricamente. Pero, ¿qué pasa si queremos preservar la relación en un nivel aún más granular? Si codificamos numéricamente, podemos tomar la mediana y el promedio del nivel de interés de cada grupo de edad. Pero, ¿y si lo que realmente nos interesa es el porcentaje específico de personas por grupo de edad que eligieron cada nivel de interés? Sería más fácil transmitir esa información en una gráfica de barras, con el texto preservado.

Eso es lo que haremos a continuación. Y, lo adivinaste, es hora de escribir otra función.

Nota rápida para los nuevos alumnos: La mayoría de la gente no dirá esto explícitamente, pero permítanme aclarar cómo se hacen a menudo las visualizaciones. En términos generales, es un proceso muy iterativo. Incluso los científicos de datos más experimentados no solo escriben un diagrama con todas estas especificaciones de la cabeza.

Generalmente, comienzas con .plot(kind='bar'), o similar dependiendo de la trama que desee, y luego cambia el tamaño, los mapas de color, ordena los grupos correctamente usando order=, especifique si las etiquetas deben rotarse, y establezca las etiquetas de los ejes xo y invisibles, y más, dependiendo de lo que crea que es mejor para quienes usarán las visualizaciones.

Así que no se deje intimidar por los largos bloques de código que ve cuando la gente está haciendo tramas. Por lo general, se crean en un lapso de minutos mientras se prueban diferentes especificaciones, no escribiendo código perfecto desde cero de una sola vez.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

logo 1

¿Cómo descargo películas y series de Disney Plus desde mi PC?

1633145657 L10S4 PlayerWins

Introducción a Java con Greenfoot