Describir la fuente de datos con la función describe()
Contents
Describir la fuente de datos con la función describe()
#
Previamente vimos cómo identificar los tipos de datos de pandas con el método dtypes
. Ahora veremos un método muy sencillo para ‘describir’ de manera muy preliminar lo que podemos hacer con nuestra fuente de datos.
La función describe()#
De acuerdo con la documentación de pandas, la función describe()
realiza una descripción estadística de nuestros datos. Incluye aquellos “que resumen las medidas de tendenca central, dispersión y forma de una fuente de datos, descartando los valores nulos (NaN
)”.
Esta es una función muy sencilla de utilizar y a la vez muy poderosa, puesto que puede realizar sus análisis tanto en valores numéricos como de objeto, incluso de datos mixtos.
Veámos qué sucede cuando utilizamos nuestra fuente de datos de ejemplo.
import pandas as pd
ejemplo1 = pd.DataFrame(
{"Nombre": ["Andrea", "Berenice", "Carlos"], # tipo de datos string
"Edad": [34, 51, 26], # tipo de datos int
"Registro": [True, False, True], # tipo de datos bool
"Promedio": [9.5, 8.5, 10], # tipo de datos float
"Origen": [
{"Ciudad": "Ciudad de México", "Estado": "CDMX"},
{"Ciudad": "Guadalajara", "Estado": "Jalisco"},
{"Ciudad": "Toluca", "Estado": "Estado de México"}
], # tipo de datos dict
"Calificaciones": [(9, 8, 10), (8, 7, 9), (7, 6, 8)] # tipo de datos tuple
})
ejemplo1.describe()
Edad | Promedio | |
---|---|---|
count | 3.000000 | 3.000000 |
mean | 37.000000 | 9.333333 |
std | 12.767145 | 0.763763 |
min | 26.000000 | 8.500000 |
25% | 30.000000 | 9.000000 |
50% | 34.000000 | 9.500000 |
75% | 42.500000 | 9.750000 |
max | 51.000000 | 10.000000 |
Vemos cómo pandas
selecciona las dos columnas numéricas (‘Edad’ y ‘Promedio’) para hacer la descripción del dataframe. Las operaciones resultantes son el conteo de los valores, la media, la desviación estándar, el valor mínim y el valor máximo, sí como el percentil bajo (25) y el percentil alto (75). El percentil 50 es igual que la mediana.
Si queremos obtener una descripción más amplia, que incluya todas las columnas sin importar su tipo de datos, simplemente añadimos el argumento include='all'
:
ejemplo1.describe(include='all')
Nombre | Edad | Registro | Promedio | Origen | Calificaciones | |
---|---|---|---|---|---|---|
count | 3 | 3.000000 | 3 | 3.000000 | 3 | 3 |
unique | 3 | NaN | 2 | NaN | 3 | 3 |
top | Andrea | NaN | True | NaN | {'Ciudad': 'Ciudad de México', 'Estado': 'CDMX'} | (9, 8, 10) |
freq | 1 | NaN | 2 | NaN | 1 | 1 |
mean | NaN | 37.000000 | NaN | 9.333333 | NaN | NaN |
std | NaN | 12.767145 | NaN | 0.763763 | NaN | NaN |
min | NaN | 26.000000 | NaN | 8.500000 | NaN | NaN |
25% | NaN | 30.000000 | NaN | 9.000000 | NaN | NaN |
50% | NaN | 34.000000 | NaN | 9.500000 | NaN | NaN |
75% | NaN | 42.500000 | NaN | 9.750000 | NaN | NaN |
max | NaN | 51.000000 | NaN | 10.000000 | NaN | NaN |
Vemos que en este caso incluye otros valores como top
, que corresponde al valor más común; unique
que representa la cantidad de valores únicos, y freq
que representa la fecuencia del valor más común. Para los valores de timestamp también serán mostrados el primer y último valor.
Ahora realicemos el ejercicio con nuestra fuente de datos de ejemplo.
import pandas as pd
covid_nacional.describe()
Unnamed: 0 | edad | |
---|---|---|
count | 1.323501e+06 | 1.323501e+06 |
mean | 6.617510e+05 | 3.774596e+01 |
std | 3.820620e+05 | 1.728453e+01 |
min | 1.000000e+00 | 0.000000e+00 |
25% | 3.308760e+05 | 2.500000e+01 |
50% | 6.617510e+05 | 3.600000e+01 |
75% | 9.926260e+05 | 5.000000e+01 |
max | 1.323501e+06 | 1.220000e+02 |
Al igual que en nuestro dataframe de ejemplo, pandas
solamente selecciona los valores numéricos: Unnamed: 0
(que corresponde al índice de los datos) y edad
. Veámos ahora qué información nos muestra cuando incluímos el parámetro include='all'
.
covid_nacional.describe(include='all')
Unnamed: 0 | fecha_actualizacion | id_registro | origen | sector | entidad_um | sexo | entidad_nac | entidad_res | municipio_res | ... | otro_caso | toma_muestra_lab | resultado_lab | toma_muestra_antigeno | resultado_antigeno | clasificacion_final | migrante | pais_nacionalidad | pais_origen | uci | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 1.323501e+06 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 149707 | 149707 | ... | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1320040 | 1323501 |
unique | NaN | 1 | 1323501 | 2 | 12 | 32 | 2 | 33 | 23 | 1190 | ... | 3 | 2 | 5 | 2 | 3 | 7 | 3 | 122 | 1 | 4 |
top | NaN | 2022-06-26 | 0793b8 | FUERA DE USMER | SSA | CIUDAD DE MÉXICO | MUJER | CIUDAD DE MÉXICO | MÉXICO | NEZAHUALCÓYOTL | ... | NO | NO | NO APLICA (CASO SIN MUESTRA) | SI | NEGATIVO A SARS-COV-2 | NEGATIVO A SARS-COV-2 | NO ESPECIFICADO | MÉXICO | NO APLICA | NO APLICA |
freq | NaN | 1323501 | 1 | 1170267 | 793606 | 1314661 | 733991 | 1052272 | 133374 | 26282 | ... | 848434 | 1152385 | 1152385 | 1204565 | 771647 | 792364 | 1305180 | 1304673 | 1320040 | 1297093 |
mean | 6.617510e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
std | 3.820620e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
min | 1.000000e+00 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
25% | 3.308760e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
50% | 6.617510e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
75% | 9.926260e+05 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
max | 1.323501e+06 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | ... | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
11 rows × 41 columns
Como vemos es una tabla con todas las columnas de nuestro dataframe. Reliza una revisión rápida del resultado para que puedas observar algunos detalles del conjunto de datos que podrían ser útiles. Por ejemplo, es claro que en la columna sexo
es mayor la frecuencia de casos en mujeres (733,991 casos sobre 1’323,501). También, si vemos la columna entidad_nac
vemos que de las 33 entidades nacionales incluidas, la mayor frecuencia (por mucho) está representada por casos de la Ciudad de México (1’052,272 del total de los casos).
Para mejorar la legibilidad, podemos segmentar la descripción por unas cuantas columnas, por ejemplo:
covid_nacional[['origen', 'sector', 'sexo', 'entidad_nac',
'tipo_paciente', 'fecha_ingreso', 'fecha_sintomas', 'fecha_def']].describe(include='all')
origen | sector | sexo | entidad_nac | tipo_paciente | fecha_ingreso | fecha_sintomas | fecha_def | |
---|---|---|---|---|---|---|---|---|
count | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 1323501 | 3589 |
unique | 2 | 12 | 2 | 33 | 2 | 177 | 223 | 166 |
top | FUERA DE USMER | SSA | MUJER | CIUDAD DE MÉXICO | AMBULATORIO | 2022-01-12 | 2022-01-10 | 2022-01-29 |
freq | 1170267 | 793606 | 733991 | 1052272 | 1297093 | 40197 | 46175 | 101 |
En este caso, podemos incluso narrar un poco nuestros datos, ya que encontramos que la mayoría de pacientes fueron ambulatorios, mujeres, de la Ciudad de México, que la mayor parte de reportes provienen de unidades por fuera de las USMER (Unidades de Salud Monitoras de Enfermedad Respiratoria Viral). También podemos afirmar que la mayoría de los reportes de síntomas se dieron el 10 de enero, la mayoría de ingresos el 12 de enero y la mayor cantidad de defunciones el 29 de enero.
Como habrás notado, todavía estamos en una fase muy descriptiva. Esto nos permite tener una perspectiva de lo que podemos obtener de nuestro conjunto de datos, lo que nos facilitará la tarea de planear qué transformaciones requeriremos en nuestros datos para poderlos visualizar correctamente.
Actividad#
Usando el método describe()
analiza los datos que seleccionaste y responde en el foro lo siguiente:
¿Qué columnas brindan información significativa para analizar?
¿Qué te gustaría descubrir de tu fuente de datos?
¿Es suficiente con tu fuente de datos? ¿Necesitas una fuente de datos adicional?
Responder estas preguntas te ayudará a entender tu fuente de datos y qué puedes lograr con ella.