ANÁLISIS EXPLORATORIO DE DATOS: Medidas de Resumen
UNIDAD 3
Fundamentos de Ciencia de Datos 2025
VARIABLE
Una variable es una característica, cualidad o propiedad observada que puede asumir diferentes valores y es susceptible de ser cuantificada o medida en una investigación.
Las observaciones registradas de una o más variables conforman un conjunto o set de datos.
En el formato largo, cada fila del dataset constituye un registro y cada columna contiene la información correspondiente a una variable.
VARIABLES CUANTITATIVAS Y CUALITATIVAS
Cualitativas o categóricas: son aquellas variables que no son medibles numéricamente.
Cuantitativas: son aquellas que toman valores numéricos para los cuales tiene sentido pensar en operaciones aritméticas. Pueden ser:
Continuas: pueden asumir teóricamente cualquier valor dentro de un intervalo.
Discretas: sólo pueden tomar valores aislados en dicho intervalo.
VARIABLES CUANTITATIVAS Y CUALITATIVAS
Supongamos que contamos con un dataset que contiene información acerca de las calorías quemadas por un conjunto de 685 adolescentes y hombres sanos de entre 14 y 34 años en función del tipo de actividad física realizada (correr, trotar o caminar), el tiempo dedicado a la actividad (en min) y la distancia recorrida durante la misma (en km), junto con la edad (en años) y el peso (en kg) de cada uno de los individuos.
ID
Tiempo
Distancia
Actividad
Calorías
Peso
Edad
1
10.18
4.2
correr
241.3
70.1
32
2
5.36
3.4
caminar
201.5
54.4
28
3
22.08
2.4
trotar
258.7
76.0
27
VARIABLES CUANTITATIVAS Y CUALITATIVAS
ID
Tiempo
Distancia
Actividad
Calorías
Peso
Edad
1
10.18
4.2
correr
241.3
70.1
32
2
5.36
3.4
caminar
201.5
54.4
28
3
22.08
2.4
trotar
258.7
76.0
27
¿Cómo clasificaríamos a cada una de las variables de este dataset?
MEDIDAS DE POSICIÓN
Las medidas de posición brindan información acerca de la localización del conjunto de observaciones de una variable
Las más comunes son:
Media aritmética
Fractilas o cuantilos
Modo
MEDIA ARITMÉTICA/PROMEDIO (\(\bar X\))
Es la suma de los valores observados de la variable \(X\) dividida por el número total de datos de dicha variable.
\[\bar X = \frac{1}{n}\sum_{i=1}^{n} X_i\] Para calcularla, contamos con el método mean() de Pandas, que ya empleamos anteriormente.
MEDIANA (Q2)
La mediana, segundo cuartil o percentil del 50% se define como el valor de la variable que se encuentra en la posición central del conjunto de datos ordenado de menor a mayor. La mitad de las observaciones son menores o iguales que él y la otra mitad son mayores.
¿Cómo se calcula?
MEDIA VS. MEDIANA
Como la media depende de todos los valores registrados de la variable, la presencia de alguna observación anormalmente grande o pequeña influye sensiblemente en ella.
En estas situaciones nos conviene buscar una medida de tendencia central que resulte más representativa del conjunto. La mediana es una buena alternativa.
MEDIA TRUNCADA (TRIMMED MEAN)
De manera general, es un promedio calculado sobre los datos una vez que se ha eliminado un cierto porcentaje de las observaciones más pequeñas y más grandes del conjunto (α ⋅ 100%). Es una medida intermedia entre la media y la mediana.
MEDIA TRUNCADA (TRIMMED MEAN)
De manera general, es un promedio calculado sobre los datos una vez que se ha eliminado un cierto porcentaje de las observaciones más pequeñas y más grandes del conjunto (α ⋅ 100%). Es una medida intermedia entre la media y la mediana.
Es el método oficial utilizado en la evaluación de pruebas olímpicas de patinaje sobre hielo y varias otras actividades deportivas y artísticas.
FRACTILAS O CUANTILOS
La mediana es un tipo particular de medida que pertenece a una clase mucho más general de estadísticas descriptivas de centralidad: las fractilas o cuantilos.
En términos generales, la fractila de orden r es aquel valor de la variable tal que el r% de las observaciones del conjunto ordenado de datos son menores o iguales a él.
CUARTILOS (Q1, Q2, Q3)
Los cuartilos son un tipo de fractila que divide al conjunto de datos ordenados de la variable en 4 partes con aproximadamente el mismo número de datos:
Cuartil 1 (Q1): es el valor tal que el 25% de los datos son menores o iguales a él.
Cuartil 2 (Q2): es el valor tal que el 50% de los datos son menores o iguales a él. Coincide con la mediana, definida anteriormente.
Cuartil 3 (Q3): es el valor tal que el 75% de los datos son menores o iguales a él.
CÁLCULO DE LOS CUARTILOS
Pandas cuenta con el método quantile(), que permite calcular cualquier fractila que se desee. La misma puede especificarse en el parámetro q, que por default es igual a 0.5.
Otro parámetro importante es interpolation, que permite definir el método a utilizar para estimar la fractila. Las distintas posibilidades pueden consultarse en la documentación de la función y difieren en la forma en que se calcula la posición y en cómo se interpola entre valores adyacentes cuando la posición no es un entero.
Por default, Pandas utiliza interpolation = 'linear', también conocido como Método R-7.
MÉTODO R-7
Según este método, la posición \(Pos\) de la fractila \(Q\) (0 \(\leq Q \leq\) 1) se calcula de la siguiente manera:
\[Pos = 1 + Q (n - 1)\] Luego, la fractila se calcula teniendo en cuenta la parte fraccional de \(Pos\) (\(f\)) y las observaciones que, en el conjunto ordenado, se encuentran en las posiciones enteras alrededor de \(Pos\) (\(x_i\) y \(x_j\), con \(x_i \leq x_j\)):
\[x_Q = x_i + f (x_j - x_i)\]
MÉTODO R-7 (versión “a mano”)
Por ejemplo, si contamos con los siguientes datos para la variable \(X\): [2, 2, 4, 5, 5, 6, 7, 8] y queremos calcular el primer cuartil (\(Q_1\)), primero obtenemos la posición:
\[Pos = 1 + 0.25(8-1) = 2.75\]
Luego, como es un valor que se encuentra entre las observaciones ubicadas en las posiciones 2 y 3 del conjunto, el valor de \(Q_1\) resulta:
\[Q_1 = 2 + 0.75(4-2) = 3.5\]
MÉTODO R-7 (versión pandas)
import pandas as pd# Definimos una Serie con los valores de Xserie = pd.Series([2, 2, 4, 5, 5, 6, 7, 8])# Calculamos el primer cuartilq1 = serie.quantile(q =0.25, interpolation ='linear')# Imprimimos el resultadoprint('Primer cuartil:', q1)
Primer cuartil: 3.5
OTROS MÉTODOS
Otras opciones para interpolation son:
interpolation = 'lower': toma \(x_i\)
interpolation = 'higher': toma \(x_j\)
interpolation = 'nearest': toma el más cercano entre \(x_i\) y \(x_j\)
interpolation = 'midpoint': toma el punto medio entre \(x_i\) y \(x_j\)
CÁLCULO DE LOS CUARTILOS
Calculemos los cuartilos del conjunto de datos de peso_kg:
# Calculamos los tres cuartilos cuartiles = df['peso_kg'].quantile(q = [0.25, 0.5, 0.75])# Imprimimos los resultadosprint('Primer cuartil:','\t', cuartiles[0.25], 'kg')print('Segundo cuartil:','\t', cuartiles[0.5], 'kg')print('Tercer cuartil:', '\t', cuartiles[0.75], 'kg')
Primer cuartil: 62.8 kg
Segundo cuartil: 68.5 kg
Tercer cuartil: 74.1 kg
¿Cómo podríamos interpretar estos valores?
DECILOS Y PERCENTILOS
Otras fractilas que pueden definirse:
Decilos: son valores de la variable que dividen al conjunto de observaciones en diez partes con aproximadamente el mismo número de datos.
Percentilos: dividen al conjunto de observaciones de la variable en cien partes con aproximadamente el mismo número de datos.
CÁLCULO DE FRACTILAS (versión numpy)
numpy cuenta con diversas funciones para calcular fractilas. Un ejemplo es percentile(), en la que la fractila a calcular se debe indicar como un número entre 0 y 100 (el correspondiente %) en el parámetro q.
import numpy as np# Calculamos la mediana del 'peso_kg'np.percentile(df['peso_kg'], q =50)
68.5
También permite seleccionar el método de estimación a utilizar en el parámetro method (por default se utiliza una interpolación lineal).
MODA
La moda es es el valor de la variable que se presenta mayor número de veces, es decir, el que tiene la mayor frecuencia.
Podemos calcular la moda de las observaciones de peso_kg utilizando el método mode() de Pandas:
df['peso_kg'].mode()
0 72.8
Name: peso_kg, dtype: float64
¿Cuál es el resultado?
MODA
Tenemos que tener presente que podemos tener conjuntos de observaciones que presenten más de una moda. En estos casos, la Serie de pandas que siempre devuelve el método mode() como output estará formada por tantos elementos como modas haya en el conjunto:
La moda es la única medida de posición que puede usarse para datos provenientes de una variable cualitativa.
Por ejemplo, podemos calcular la moda de las observaciones de actividad para ver cuál fue el tipo de actividad física que las personas de la muestra realizaron con mayor frecuencia:
df['actividad'].mode()
0 caminar
Name: actividad, dtype: object
MEDIDAS DE DISPERSIÓN
Las medidas de posición son útiles pero resumen sólo parte de la información contenida en el conjunto de datos. Dos conjuntos de observaciones pueden tener aprox. la misma media y mediana pero diferir en cuánto se “alejan” del valor central.
Surge la necesidad de definir medidas de dispersión que describan la variabilidad de los datos.
En esta Unidad trabajaremos con: desvío estándar/variancia, rango, rango intercuartil, coeficiente de variación y desviación mediana absoluta.
RANGO
El rango es la diferencia entre el mayor y el menor valor observado de la variable.
\[Rango = X_{max} - X_{min}\]
Para peso_kg, es igual a:
# Calculamos el rangorango =round(df['peso_kg'].max() - df['peso_kg'].min(),1)# Imprimimos el resultadoprint('Rango:', rango, 'kg')
Rango: 49.5 kg
VARIANCIA (\(S^2\))
Es una medida de cuánto se desvían, en promedio, las observaciones de una variable respecto a la media aritmética.
Se define como la raíz cuadrada positiva de la variancia.
\[S = + \sqrt{\frac{1}{n-1}\sum_{i=1}^{n} (X_i - \bar X)^2}\] En comparación con la variancia, posee la ventaja de que está expresada en las unidades de la variable, por lo que su interpretación es más sencilla y directa.
Pdemos interpretarla como una “distancia promedio de las observaciones con respecto a la media”.
CÁLCULO DE VAR. Y DESVÍO ESTÁNDAR
Pandas cuenta con los métodos var() y std() que permiten calcular variancia y desvío estándar, respectivamente.
# Calculamos el desvío estándar del pesodesv_est =round(df['peso_kg'].std(),1)# Calculamos la variancia del pesovariancia =round(df['peso_kg'].var(),1)# Imprimimos los resultadosprint('Desvío estándar:', desv_est, 'kg')print('Variancia:', variancia, 'kg\u00B2')
Desvío estándar: 8.1 kg
Variancia: 64.9 kg²
COEFICIENTE DE VARIACIÓN (CV)
Es el desvío estándar dividido por la media aritmética.
\[CV = \frac{S}{|\bar X|}\] Es una medida adimensional que indica qué proporción representa el desvío estándar de la media aritmética.
Se suele utilizar cuando se desea comparar la variabilidad de dos o más conjuntos de datos que difieren en unidades de medida y/o magnitudes.
RANGO INTERCUARTIL (RI)
Es la diferencia entre el tercer y el primer cuartil y, como tal, mide la dispersión del 50% de los datos centrales.
\[RI = Q_3 - Q_1\] Es una medida de dispersión que no está influenciada por valores extremos. Por este motivo, cuando se usa la mediana como medida de centralidad, el RI es la medida de dispersión adecuada para acompañarla.
RANGO INTERCUARTIL (RI)
Calculamos el RI para las observaciones de la variable peso_kg:
# Calculamos los cuartiles para la variable pesocuartiles = df['peso_kg'].quantile([0.25, 0.5, 0.75])# Calculamos el rango intercuartil para pesoiqr =round(cuartiles[0.75] - cuartiles[0.25],1)# Imprimimos el resultadoprint('Rango intercuartil:', iqr, 'kg')
Rango intercuartil: 11.3 kg
¿Cómo podemos interpretar el valor obtenido?
DESVIACIÓN MEDIANA ABSOLUTA (MAD)
Es una versión robusta del desvío estándar basada en la mediana, que se define como la mediana de los valores absolutos de las diferencias entre cada observación y la mediana.
DESVIACIÓN MEDIANA ABSOLUTA (MAD)
DESVIACIÓN MEDIANA ABSOLUTA (MAD)
Es una versión robusta del desvío estándar basada en la mediana, que se define como la mediana de los valores absolutos de las diferencias entre cada observación y la mediana.
\[MAD = Mediana(|X_i - Q_2|)\]
DESVIACIÓN MEDIANA ABSOLUTA (MAD)
Podemos obtenerla de la siguiente manera:
# Calculamos las diferencias absolutas entre cada observación y la medianadf['peso_dif_abs'] =abs(df['peso_kg'] - cuartiles[0.5])# La MAD es la mediana de las observaciones de 'peso_dif_abs'mad =round(df['peso_dif_abs'].quantile(0.5),2)# Imprimimos el resultadoprint('Desviación mediana absoluta:',mad,'kg')
Desviación mediana absoluta: 5.6 kg
EL MÉTODO describe()
Una forma fácil y rápida de obtener gran parte de las métricas vistas hasta acá es utilizar el método describe() sobre la columna del DataFrame de interés.
df['peso_kg'].describe()
count 685.000000
mean 67.849197
std 8.057056
min 31.400000
25% 62.800000
50% 68.500000
75% 74.100000
max 80.900000
Name: peso_kg, dtype: float64
EL MÉTODO describe()
¿Qué información obtenemos al aplicarlo sobre una columna que contiene datos de una variable cualitativa?
Los cuartilos y los valores mínimo y máximo conforman un conjunto de cinco números que brindan un buen resumen de nuestros datos y con los cuales podemos construir un gráfico llamado boxplot.
EL BOXPLOT MODIFICADO
Una versión modificada del boxplot permite detectar potenciales outliers, es decir, observaciones que no son típicas del conjunto.
Se consideran potenciales outliers aquellas observaciones que caigan por fuera de \((Q_1 − 1.5 RI)\) y \((Q_3 + 1.5 RI)\).
La modificación del gráfico consiste en extender los whiskers hasta las observaciones mínima y máxima que no sean puntos atípicos. Los outliers se marcan en el gráfico como puntos separados de los whiskers.
EL BOXPLOT MODIFICADO
import matplotlib.pyplot as pltimport seaborn as snssns.boxplot(x ='peso_kg', data = df)plt.show()
EL BOXPLOT MODIFICADO
¿Hay potenciales outliers entre las observaciones de la variable peso_kg?
EL BOXPLOT MODIFICADO
Registros que contienen potenciales outliers para peso_kg:
# Calculamos los "límites"lim_inf = cuartiles[0.25] -1.5*iqrlim_sup = cuartiles[0.75] +1.5*iqr# Registros que contienen un valor de `peso_kg` por fuera de los límitesdf.loc[(df['peso_kg'] < lim_inf) | (df['peso_kg'] > lim_sup)]
id
duracion_min
distancia_km
actividad
calorias_quemadas
peso_kg
edad_anios
peso_dif_abs
270
271
5.04
7.0
caminar
269.0
44.7
29
23.8
392
393
17.51
4.7
caminar
276.7
31.4
28
37.1
612
613
1.02
6.2
trotar
266.9
43.8
21
24.7
615
616
7.64
4.4
caminar
241.6
44.0
32
24.5
659
660
4.26
3.6
trotar
237.5
44.2
33
24.3
EL BOXPLOT MODIFICADO
¿Qué puede decirse acerca de la simetría de la distribución de peso_kg?
EL BOXPLOT MODIFICADO
En base a las respuestas a las preguntas anteriores, ¿qué medidas de centralidad y de dispersión serían las más adecuadas para describir a estos datos?
BOXPLOT SIN OUTLIERS
Si seteamos el parámetro showfliers = False, los potenciales outliers ya no se muestran en el gráfico resultante (¡pero es como si esos datos no existieran!):
sns.boxplot(x ='peso_kg', data = df, showfliers =False)plt.show()
BOXPLOT SIN OUTLIERS
Una forma de construir el boxplot clásico (el que no muestra potenciales outliers) sin borrar datos, es modificar el parámetro whis, extendiendo los whiskers hasta el menor y el mayor valor observado:
sns.boxplot(x ='peso_kg', data = df, whis = [0,100])plt.show()
TABLA DE FRECUENCIAS
Una tabla de frecuencias constituye una forma sencilla y efectiva para resumir la información de las observaciones de una variable de un dataset.
En el caso de que la variable en cuestión sea cualitativa, la tabla contiene las diferentes categorías de la misma junto con el número de veces que se presentó cada una de ellas (frecuencia absoluta) en el dataset.
También suele utilizarse la frecuencia relativa, que se define como el cociente entre la correspondiente frecuencia absoluta y el número total de datos.
TABLA DE FRECUENCIAS
Puede construirse fácilmente utilizando el método value_counts() de Pandas.
La versión “más simple” de una tabla de frecuencias para la variable actividad se vería así:
A la tabla anterior, podemos agregarle una columna que contenga la frecuencia relativa de cada una de las actividades físicas:
# La frecuencia relativa siempre es un número entre 0 y 1tabla_actividad['Frec_relativa'] =round(tabla_actividad['Frec_absoluta']/sum(tabla_actividad['Frec_absoluta']),2)tabla_actividad
Frec_absoluta
Frec_relativa
Actividad
caminar
288
0.42
trotar
253
0.37
correr
144
0.21
TABLA DE FRECUENCIAS
Otra alternativa hubiera sido expresar las frecuencias anteriores como porcentajes sobre el total de registros:
Podríamos utilizar el objeto DataFrame que generamos para representar gráficamente la información extraída.
¿Qué gráfico podríamos construir?
UN ADELANTO DE LA UNIDAD 4
# Construimos un gráfico de barras horizontalessns.barplot(x ='Porcentaje', y ='Actividad', data = tabla_actividad)plt.xlabel('Porcentaje (%)', fontsize =20, fontweight ='bold')plt.ylabel('Actividad', fontsize =20, fontweight ='bold')plt.show()
TABLA DE FRECUENCIAS
En el caso de que variables cuantitativas discretas, cuando el número de observaciones es grande pero hay pocos valores diferentes, podemos construir una tabla de características similares para resumir la información correspondiente.
Por ejemplo, en nuestro dataset tenemos la variable edad_anios.
TABLA DE FRECUENCIAS
# Tabla de frecuencias para la variable Edadtabla_edad = df['edad_anios'].value_counts().sort_index().to_frame()tabla_edad.index.name ='Edad'tabla_edad.rename(columns = {'count':'Frec_absoluta'}, inplace =True)tabla_edad.head()
Frec_absoluta
Edad
14
1
15
2
17
4
18
4
19
4
TABLA DE FRECUENCIAS
Podemos usar el DataFrame anterior para representar gráficamente esta información (Gráfico de bastones):
sns.barplot(x ='Edad', y ='Frec_absoluta', data = tabla_edad, width =0.15)plt.show()
TABLA DE FRECUENCIAS
Cuando trabajamos con variables que toman muchos valores diferentes, lo que ocurre generalmente en el caso de variables cuantitativas continuas, en lugar de construir la tabla considerando los valores individuales que las mismas pueden asumir, se hace un agrupamiento previo en subintervalos (segmentación).
TABLA DE FRECUENCIAS
Por ejemplo, para la distancia recorrida (distancia_km), cuyas estadísticas descriptivas son:
df['distancia_km'].describe()
count 685.000000
mean 5.220000
std 2.141649
min 0.300000
25% 3.600000
50% 5.400000
75% 6.900000
max 9.800000
Name: distancia_km, dtype: float64
TABLA DE FRECUENCIAS
…podríamos realizar un agrupamiento de los valores observados en los siguientes subintervalos:
De 0 a 2 km: [0,2)
De 2 a 4 km: [2,4)
De 4 a 6 km: [4,6)
De 6 a 8 km [6,8)
De 8 a 10 km: [8,10)
TABLA DE FRECUENCIAS
Para eso, podemos utilizar el método pd.cut():
# Generamos los subintervalos con pd.cut()df['distancia_seg'] = pd.cut(df['distancia_km'], bins = [0,2,4,6,8,10], right =False)# ¿Cómo luce esta serie?df['distancia_seg'].head()
A la tabla anterior podemos agregarle las frecuencias absoluta y relativa acumuladas correspondiente a cada subintervalo de distancias, utilizando el método cumsum().
La frecuencia absoluta acumulada es el número de observaciones de la variable menores al límite superior del subintervalo correspondiente.
La frecuencia relativa acumulada es el cociente entre la correspondiente frecuencia absoluta acumulada y el número total de datos.
¿Cómo podemos interpretar el valor 0.59 de la frecuencia relativa acumulada, en la tercera fila?
HISTOGRAMA DE FRECUENCIAS
La información anterior es la base para la construcción de un gráfico muy utilizado para representar datos de una variable continua (especialmente cuando el número de observaciones es grande): el histograma de frecuencias.
En el eje de las abscisas se representan los intervalos en que se agruparon los valores de la variable y en el eje de las ordenadas la frecuencia absoluta o relativa. Luego, sobre cada uno de los subintervalos se grafica un rectángulo cuya área representa la frecuencia (absoluta o relativa) del mismo.
HISTOGRAMA DE FRECUENCIAS
Así luciría el histograma de frecuencias de los datos de distancia_km con la subdivisión que realizamos en subintervalos:
HISTOGRAMA DE FRECUENCIAS
Quizás, para el número de datos con el que contamos (n = 685), sería más óptimo realizar una subdivisión en un mayor número de intervalos, o bins (acá los elige Seaborn):
sns.histplot(x ='distancia_km', data = df, binrange = [0, df['distancia_km'].max()])plt.show()