Bloque 2. Análisis Descriptivo

Formación PDI - Universidad de Málaga

Antonio Elías

Agenda:

  1. Análisis descriptivo numérico

  2. Análisis descriptivo gráfico

Análisis Descriptivo Numérico

Tabla de frecuencias:

Variable Cualitativa o Cuantitativa discreta

Frecuencias absolutas:

# Generamos datos
data <- c(2, 5, 2, 3, 3, 4, 3, 2, 2, 3)

frequency_table <- table(data)

frequency_table
data
2 3 4 5 
4 4 1 1 

Frecuencias relativas:

relative_frequencies <- prop.table(frequency_table)
relative_frequencies
data
  2   3   4   5 
0.4 0.4 0.1 0.1 

Tabla de frecuencias:

Variable continua

data <- c(-0.0266, 0.6195, 0.2362, -0.2401, -0.0056, -1.7052, 1.381, 
0.1593, 0.5652, 0.4983)

# Define los intervalos
breaks <- c(-10, -5, 0, 5, 10)

# Crea la tabla de frecuencia usando cut() y table()
frequency_table <- table(cut(data, breaks=breaks, right=FALSE))

frequency_table

[-10,-5)   [-5,0)    [0,5)   [5,10) 
       0        4        6        0 

Para las frecuencias relativas:

relative_frequencies <- prop.table(frequency_table)
relative_frequencies

[-10,-5)   [-5,0)    [0,5)   [5,10) 
     0.0      0.4      0.6      0.0 

Resumen Tablas de Frecuencias

Función Descripción
table(x) Tabla de frecuencias absolutas v.a. discreta.
prop.table(table(x)) Tabla de frecuencias relativas v.a. discreta.
table(cut(data, breaks = breaks, right=FALSE)) Tabla de frecuencias absolutas v.a. continua
prop.table(table(cut(data, breaks = breaks, right=FALSE))) Tabla de frecuencias relativas v.a. continua

Medidas de posición

Medida Función Descripción
Media mean(x) Calcula la media de x.
Mediana median(x) Devuelve la mediana de x.
Moda table(x)[which.max(table(x))] Encuentra el valor más frecuente.
quantiles quantile(x, probs = c(0.25, 0.5, 0.75)) Cuantiles específicos.
  • Ejercicio: programamos la media, mediana (sort, rank, order).

Medidas de Dispersión

Medida Función Descripción
Varianza var(x) Calcula la varianza muestral.
Desviación estándar sd(x) Raíz cuadrada de la varianza.
Rango intercuartil IQR(x) Diferencia entre el tercer y primer cuartil.
Mínimo y Máximo min(x), max(x) Valores mínimo y máximo.
Rango range(x) Devuelve [min, max].

Resumen Estadístico Completo

Función Descripción
summary(x) Resumen completo (mínimo, Q1, mediana, media, Q3, máximo).
fivenum(x) Cinco estadísticos de Tukey (mínimo, Q1, mediana, Q3, máximo).

Estadísticas Bivariadas

Función Descripción
table(x, y) Tablas bivariadas.
cor(x, y) Correlación de Pearson.
cov(x, y) Covarianza.

Ejercicio: Implementamos la covarianza y la correlación. Aplicamos a Newscombe data set y dinousaur.

data(anscombe)

💻 Tu turno 1

Resumen numérico:

📝 Carga la base de datos Anscombe. Utiliza el comando data(anscombe) para cargarlos.

Code
data(anscombe)

📝 Calcula un resumen estadístico completo de las variables incluidas en la base de datos Anscombe. ¿Cómo son sus medias?

Code
summary(anscombe)

📝 Calcule las covarianzas y correlaciones. ¿cómo son las relaciones entre los pares \((x_i, y_i)\) para \(i = 1, 2, 3, 4\).

Code
cov(anscombe)
cor(anscombe)

Análisis Descriptivo Gráfico

Introducción a los gráficos base en R

R incluye un sistema de gráficos nativo, conocido como R Base Graphics, que permite crear, personalizar y combinar visualizaciones sin paquetes externos.

Importante

Una librería relevante para la visualización es la conocida como ggplot2 que implementa lo que es conocido como “the Grammar of Graphics”. Este paquete nos da más flexibilidad y gráficos más estéticos. En este curso nos centraremos en los gráficos dados por Rbase.

La función principal: plot()

plot(x, y, type = "p", main = "Título", xlab = "Eje X", ylab = "Eje Y")
  • Crea un gráfico de dispersión (por defecto).
  • Argumentos comunes:
    • type: tipo de gráfico ("p", "l", "b", "h", etc.)
    • col, pch, lty, lwd: color, símbolo, tipo y grosor de línea.
    • xlim, ylim: límites de los ejes
    • main, xlab, ylab: títulos.

Ejemplo:

x <- 1:10
y <- x^2
plot(x, y, type = "b", col = "blue", pch = 19, main = "Ejemplo plot base")

Tipos de gráficos en R base

Tipo de gráfico Función base Descripción
Dispersión plot() Dos variables numéricas
Líneas lines() o plot(..., type="l") Series temporales
Barras barplot() Comparación de categorías
Histograma hist() Distribución de una variable
Caja boxplot() Comparación de distribuciones
Tarta pie() Porciones de un total
Densidad plot(density(x)) Curva de densidad
Matriz de dispersión pairs() Relaciones múltiples

Añadir elementos al gráfico

Función Qué añade Ejemplo
points() Puntos adicionales points(x, y, col="red")
lines() Líneas adicionales lines(x, y, lty=2)
abline() Rectas horizontales o verticales abline(h=0, col="gray")
text() Texto dentro del gráfico text(5, 20, "Centro")
legend() Leyenda legend("topleft", legend="x²", col="blue", lty=1)
title() Añadir título title(main="Nuevo título")

Parámetros globales par()

Permite modificar la apariencia del área de dibujo.

Parámetro Descripción Ejemplo
mfrow / mfcol Gráficos múltiples par(mfrow=c(2,2))
mar Márgenes par(mar=c(5,4,2,1))
bg Color de fondo par(bg="lightgray")
cex Tamaño de texto/puntos par(cex=1.2)

Gráfico de Barras

  • Dada una v.a. discreta \(X\) cuantitativa discreta o cualitativa, representa su función de probabilidad \(P(X=x)\) para todo \(x \in \Omega\).

  • Construcción:

    • Cuenta cuantos elementos de la muestra pertenecen a cada clase o valor discreto.
    • Para aproximar la función de probabilidad, normaliza el area total de las barras del histograma a uno.

Gráfico de Barras

x <- rbinom(1000, 5, prob = 0.6)

barplot(prop.table(table(x)))

Histograma

  • Dada una v.a. discreta \(X\) continua, representa una aproximación gráfica elemental a su función de densidad \(f_X(x)\).

  • Construcción:

    • Agregar (bin) el rango de los valores observados, es decir, divide el domino de valores en una serie de intervalos.
    • El número de intervalos o bins se deben predefinir y deben ser adjacentes.
    • Cuenta cuantos datos caen en cada uno de los intervalos. Estas son las alturas de las barras
    • Para aproximar la densidad, normaliza el area total de las barras del histograma a uno.

Histograma

x <- rnorm(1000)

hist(x) # hist(x, freq = FALSE)

Histograma

x <- rnorm(1000)
y <- rnorm(1000, mean = 5)
  
hist(y, xlim = c(-10, 10), main  = "Histogramas")
hist(x, col = "red", add = TRUE)

Histograma

par(mfrow = c(1,2))
hist(y, main  = "Histograma 1")
hist(x, col = "red", main  = "Histograma 2")
par(mfrow = c(1,1))

Función de distribución muestral

  • Dada una v.a. discreta \(X\) continua, representa una aproximación gráfica elemental a su función de distribución o acumulada de probabilidad \(F_X(x)\).

\[ F(X) = P(X \leq x) \]

  • La función de distribución muestral es:

\[ F_n^*(x) = \frac{ \# \{x_i \leq x \} }{n}.\]

💻 Tu turno 2

Función de distribución muestral:

📝 Programa tu propia función distribución muestral que tenga como argumentos un valor dado de \(x_i\) y un vector de \(n = 10\) realizaciones de la variable aleatoria. Usa el siguiente vector \(x\) como ejemplo.

x <- c(0.0035, -1.4331, 1.125, 0.7939, 0.3521, 0.7317, 0.2029, 0.0389, 1.7975, -1.4797)
Code
mi_Fn <- function(x_i, x) mean(x<=x_i)

📝 Utilizala para obtener la evaluar el valor \(x_i = 0\).

Code
mi_Fn(x_i = 0, x)

Función de distribución muestral

Fn <- ecdf(x)

plot(Fn)

💻 Tu turno 3

Función de distribución muestral en base R:

📝 ¿Qué clase tiene el objeto creado por la función ecdf?.

Code
class(Fn)

📝 ¿Cuál es la estructura del objeto Fn? ¿Cómo aparece en nuestro entorno el objeto Fn?

Code
str(Fn)

📝 Evalúe la función para un \(x_i = 0\)

Code
Fn(0)

Estimadores Kernel de Densidad

  • La estimación de densidad por kernel es un método no paramétrico para estimar la función de densidad de probabilidad de una variable continua a partir de una muestra.

  • Dada una v.a. discreta \(X\) continua, representa una aproximación gráfica más elaborada que un histograma a su función de densidad \(f_X(x)\).

  • Los estimadores de núcleo de la densidad se definen como:

\[\hat{f}(x) = \frac{1}{nh} \sum_{i=1}^n K\left(\frac{x-X_i}{h}\right),\]

donde

  • \(K\)kernel o función nucleo. Cualquier función que verifica \(K > 0\) y \(\int K = 1\).

  • \(h > 0\)bandwidth o ancho de banda. Parámetro de suavizado.

Estimadores Kernel de Densidad

  • El Kernel Gaussiano se define como \[K(x)=\frac{1}{\sqrt{2\pi}}e^{-x^2/2}\].

  • Los valores

\[\frac{1}{h}K\left(\frac{x-X_i}{h}\right)\]

son funciones de densidad de v.a. con distribución normal y media \(X_i\) y desviación típica \(h\).

  • La estimación de la densidad en el valor \(x\) es el promedio de las \(n\) densidades normales.
datos <- c(5.8397, 3.5431, 4.7352, 4.5979, 4.4255)

Estimadores Kernel de Densidad

Comparación de anchos de banda:

# Estimación de densidad
dens <- density(datos, kernel="gaussian")
plot(dens, main="Estimación de densidad por kernel",
xlab="Valores", ylab="Densidad")

# Comparar anchos de banda
dens_suave <- density(datos, bw=1.5)
dens_detalle <- density(datos, bw=0.3)
lines(dens_suave, col="red", lwd=2)
lines(dens_detalle, col="blue", lwd=2)
legend("topright", legend=c("bw=1.5", "bw=0.3"), col=c("red","blue"), lwd=2)

Estimadores Kernel de Densidad

# Histograma con densidad en el eje y
hist(x,
     freq = FALSE,
     col = "lightgray",
     border = "white",
     main = "Histograma + Curva de densidad",
     xlab = "Valor")

# Añadir curva de densidad
lines(density(x), col = "blue", lwd = 2)

legend("topright",
       legend = c("Histograma", "Densidad"),
       fill = c("lightgray", NA),
       border = c("white", NA),
       lty = c(NA, 1),
       col = c(NA, "blue"),
       lwd = c(NA, 2))

Gráficos de Caja y Bigotes

  • El “range-bar method” por Mary Eleanor Spear, “Charting Statistics” in 1952 and “Practical Charting Techniques” in 1969.

  • El “box-and-whisker plot” (1970) by John Tukey, “Exploratory Data Analysis” in 1977.

Gráficos de Caja y Bigotes

boxplot(x)

Gráficos de Caja y Bigotes: Multiple

XY <- cbind(x, x*2)
boxplot(XY, main = "Multiples Boxplots")

Gráfico de dispersión

x <- c(-0.6797, -2.0139, -2.7081, 0.7595, 0.7622, 1.4497, 0.1795, 0.7912, -0.3615, -0.0076)
y <- c(0.03, -6.6928, -11.4489, 4.9252, 7.2147, 9.4953, 3.6065, 5.1121, 1.0818, 2.9047)

xy <- cbind(x,y)

plot(xy)

💻 Tu turno 4

Resumen gráfico bivariado:

📝 Representa el par \((x_1, y_1)\) usando la función plot.

Code
plot(anscombe$x1, anscombe$y1)

📝 Añade la recta \(Y_1 = 0.5 + 10X_1\), usando la función abline.

Code
plot(anscombe$x1, anscombe$y1)
abline(a = 0.5, b = 1)

📝 Representa los pares \((x_i, y_i)\) para \(i = 1, 2, 3, 4\). Usando la función plot y par(mfrow = ¿?).

Code
par(mfrow = c(2,2))
plot(anscombe$x1, anscombe$y1)
plot(anscombe$x2, anscombe$y2)
plot(anscombe$x3, anscombe$y3)
plot(anscombe$x4, anscombe$y4)
par(mfrow = c(1,1))

📝 Representa los pares \((x_i, y_i)\) para \(i = 1, 2, 3, 4\). Usando la función pairs.

Code
pairs(anscombe)

Quantile-Quantile Plot

Un Q-Q Plot compara los cuantiles de una muestra con los cuantiles teóricos de una distribución (usualmente la normal) o los cuantiles de otra muestra.

Sirve para evaluar visualmente si los datos se ajustan a esa distribución de referencia.

  • Si los puntos siguen la línea diagonal → los datos son aproximadamente de la misma distribución.

  • Si se desvían → los datos no parecen seguir la misma distribución.

Quantile-Quantile Plot: dos distribuciones empíricas

x <- c(-0.6797, -2.0139, -2.7081, 0.7595, 0.7622, 1.4497, 0.1795, 0.7912, -0.3615, -0.0076)
y <- c(-1.0884, -1.5767, -2.2562, 0.5243, 0.8914, 1.1794, -0.0435, 0.0202, -1.0216, -0.2525)

qqplot(x, y, xlab = "Quantiles Empíricos de X", ylab = "Quantiles Empíricos de Y")
abline(a = 0, b = 1)

Quantile-Quantile Plot: distribucion empírica con Normal

qqnorm(x)
abline(a = 0, b = 1)

💻 Tu turno 5

Quantile-Quantile Plot:

📝 Consulta la ayuda de la función qqplot

Code
help(qqplot)

📝 Lea el ejemplo con la cabecera ## "QQ-Chisquare" :. ¿Qué hace la line que llama a qqplot?

Code
qqplot(qchisq(ppoints(500), df = 3), y,
       main = expression("Q-Q plot for" ~~ {chi^2}[nu == 3]))
qqline(y, distribution = function(p) qchisq(p, df = 3),
       probs = c(0.1, 0.6), col = 2)
mtext("qqline(*, dist = qchisq(., df=3), prob = c(0.1, 0.6))")

Descomposición Clásica de Series de Tiempo

Se considera que una serie temporal \(Y_t\) con \(t = 1, 2, \dots, T\) es una función de tres componentes:

  • \(Y_t\): Tendencia. Evolución a largo plazo.
  • \(S_t\): Estacionalidad. Fluctuaciones regulares y repetitivas.
  • \(E_t\): Error o ruido o parte estocástica. Variaciones aleatorias.

Modelo Aditivo: \[ Y_t = T_t + S_t + E_t \]

Modelo Multiplicativo: \[Y_t = T_t \times S_t \times E_t \]

Descomposición Clásica de Series de Tiempo

Datos CO2

data(co2)

decomp_co2 <- decompose(co2)

plot(decomp_co2)

Datos Pasajeros Avión

data(AirPassengers)

decomp_air <- decompose(AirPassengers, type = "multiplicative")

plot(decomp_air)

Función de autocorrelación

Datos CO2

acf(co2)

Datos Pasajeros Avión

acf(AirPassengers)

Función autocorrelacion parcial

Datos CO2

pacf(co2)

Datos Pasajeros Avión

pacf(AirPassengers)