1 Vectores y Matrices

1.1 Introduccion

Hoy en día, en la estadística es muy fundamental usar las matrices y los vectores, según denominado por la “programación”, en inglés se le denomia el nombre array, a esto se le denomina una una zona de almacenamiento continuo que contiene series de elementos del mismo tipo, los elementos de la matriz. Para aterrizar bien, los vectores son una colección de datos que esta ordenada de datos.

1.1.1 Como crear vectores

# Crear un vector numérico
vector_numerico <- c(1, 2, 3, 4, 5, 100, 200, 300)
vector_numerico
## [1]   1   2   3   4   5 100 200 300
# Crear un vector de caracteres
vector_caracter <- c("a", "b", "c", "d", "e")
vector_caracter
## [1] "a" "b" "c" "d" "e"
# Secuencias y repeticiones
vector_seq <- seq(1, 10, by = 2)  # Secuencia del 1 al 10 con secuencia de 2 en 2
vector_seq
## [1] 1 3 5 7 9
vector_rep <- rep(3, times = 5)    # Repetir el número 3 cinco veces
vector_rep
## [1] 3 3 3 3 3
# Acceder a elementos de un vector
vector_numerico[2]  # Segundo elemento
## [1] 2
vector_numerico[c(1, 3)]  # Primer y tercer elemento
## [1] 1 3
# En este caso nos referimos al primer ejercicio.

1.1.2 Como crear matrices

library(knitr)
## Warning: package 'knitr' was built under R version 4.4.2
# Crear una matriz de 3x3
matriz <- matrix(1:9, nrow = 3, ncol = 3)
matriz
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
# Observar que clase tiene nuestros datos
class(matriz)
## [1] "matrix" "array"
#  Observar la dimension que tiene nuestra matriz
dim(matriz)
## [1] 3 3
# Acceder a elementos de la matriz
matriz[1, 2]  # Fila 1, columna 2
## [1] 4
matriz[ ,2]   # Segunda columna completa
## [1] 4 5 6
matriz[2, ]   # Segunda fila completa
## [1] 2 5 8
# Operaciones con matrices
matriz_transpuesta <- t(matriz)  # Transponer la matriz
matriz_transpuesta
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6
## [3,]    7    8    9
matriz_suma <- matriz + 2        # Sumar 2 a todos los elementos
matriz_suma
##      [,1] [,2] [,3]
## [1,]    3    6    9
## [2,]    4    7   10
## [3,]    5    8   11
matriz_producto <- matriz %*% matriz_transpuesta  # Producto
matriz_producto
##      [,1] [,2] [,3]
## [1,]   66   78   90
## [2,]   78   93  108
## [3,]   90  108  126
matriz_determinante <- det(matriz) #Determinante
matriz_determinante
## [1] 0

1.2 Operaciones de Álgebra Lineal en R

1.2.1 Tabla de Operaciones

# Crear la tabla de operaciones
operaciones <- data.frame(
  OPERACIÓN = c("Transpuesta", "Diagonal", "Traza", "Determinante", "Inversa",
                "Descomposición QR", "Rango", "Descomposición de Cholesky", "Varianza"),
  SINTAXIS = c("t(A)", "diag(A)", "sum(diag(A))", "det(A)", "solve(A)",
               "qr(A)", "qr(A)$rank", "chol(A)", "var(A)")
)

# Mostrar tabla en formato bonito con knitr
kable(operaciones, caption = "Tabla de Operaciones de Álgebra Lineal en R o en RStudio")
Tabla de Operaciones de Álgebra Lineal en R o en RStudio
OPERACIÓN SINTAXIS
Transpuesta t(A)
Diagonal diag(A)
Traza sum(diag(A))
Determinante det(A)
Inversa solve(A)
Descomposición QR qr(A)
Rango qr(A)$rank
Descomposición de Cholesky chol(A)
Varianza var(A)

1.3 Ejemplos

1.3.1 Ejercicio 1: Producción de una fábrica

Tres tipos de productos (A, B y C) estres plantas diferentes.

Donde cada fila representa una planta y cada columna representa un producto.

La empresa quiere aumentar la producción en 10 unidades por producto en cada planta. ¿Cuál será la nueva matriz de producción?

# Matriz de producción original
M <- matrix(c(50, 30, 20, 40, 25, 35, 30, 45, 50), nrow = 3, byrow = TRUE)

# Matriz con incremento de producción
incremento <- matrix(10, nrow = 3, ncol = 3)

# Nueva matriz de producción
M_nueva <- M + incremento

# Mostrar resultado
M_nueva
##      [,1] [,2] [,3]
## [1,]   60   40   30
## [2,]   50   35   45
## [3,]   40   55   60

1.3.2 Ejercicio 2: Costo total de insumos

Una empresa necesita calcular el costo total de los insumos utilizados en su producción. Tiene la siguiente matriz que muestra la cantidad de tres tipos de insumos usados en dos líneas de producción.

Cada columna representa un insumo, y cada fila representa una línea de producción.

Los costos unitarios de los insumos.

¿Cuál es el costo total de insumos por línea de producción ?

# Matriz de cantidades de insumos
C <- matrix(c(2, 3, 5, 4, 2, 3), nrow = 2, byrow = TRUE)

# Vector de precios unitarios
P <- c(10, 15, 20)

# Cálculo del costo total por línea de producción
costo_total <- C %*% P

# Mostrar resultado
costo_total
##      [,1]
## [1,]  165
## [2,]  130

2 Visualización de datos

Libreria a utilizar son: ggplot2.

2.1 Introducción

La visualización de datos es el proceso de representar información de manera gráfica para que sea más fácil de entender y analizar. En lugar de ver solo números en una tabla, los datos se convierten en gráficos, diagramas o mapas, lo que ayuda a identificar patrones, tendencias y relaciones de forma más rápida e intuitiva.

Librería Descripción
ggplot2 Gráficos personalizados basados en la gramática de gráficos.
graphics Gráficos base de R (plot, hist, boxplot).
lattice Gráficos multivariados de alto nivel.
ggthemes Temas adicionales para ggplot2.
scales Personalización de escalas en ggplot2.
Librería Descripción
plotly Gráficos interactivos en 3D y web.
ggiraph Gráficos interactivos con ggplot2.
highcharter Gráficos tipo Highcharts en R.
Librería Descripción
leaflet Mapas interactivos.
sf Análisis espacial en R.
tmap Mapas temáticos.

2.1.1 Histograma

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.2
data("mtcars")

ggplot(mtcars, aes(x = hp)) +
  geom_histogram(binwidth = 20, fill = "steelblue", color = "black") +
  labs(title = "Distribución de Caballos de Fuerza", x = "HP", y = "Frecuencia")

2.1.2 Diagrama de dispersión

data("iris")

ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color = Species)) +
  geom_point(size = 3) +
  labs(title = "Relación entre Largo y Ancho del Pétalo", x = "Largo del Pétalo", y = "Ancho del Pétalo") +
  theme_minimal()

2.1.3 Gráfico de cajas y alambres (Boxplot)

data("airquality")

ggplot(airquality, aes(x = factor(Month), y = Ozone)) +
  geom_boxplot(fill = "orange", color = "black") +
  labs(title = "Concentración de Ozono por Mes", x = "Mes", y = "Ozono (ppb)") +
  theme_minimal()
## Warning: Removed 37 rows containing non-finite outside the scale range
## (`stat_boxplot()`).

2.1.4 Gráfico de lineas

data("economics")

ggplot(economics, aes(x = date, y = unemploy)) +
  geom_line(color = "blue", size = 1) +
  labs(title = "Evolución del Desempleo en EE.UU.", x = "Año", y = "Desempleados") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

2.2 Conclusión

Se tiene que existen más variedad de gráficos estadisticos, como los que son gráficos de barras, gráficos de estrellas, etc. En este capitulo se muestran gráfico en el cual se utilizan más en la estadística hacia empresas, en la salud, en la economia, etc.

3 Regresión lineal y múltiple

3.1 Introducción

La regresión lineal es un método estadístico que se usa para analizar la relación entre dos variables: una dependiente (la que queremos predecir o explicar) y una independiente (la que usamos para hacer la predicción). En términos simples, busca encontrar una línea recta que mejor represente cómo cambia una variable con respecto a la otra.

Por otro lado, la regresión múltiple es una extensión de la regresión lineal, pero con más de una variable independiente. Es decir, en lugar de usar solo un factor para predecir la variable dependiente, se usan varios factores al mismo tiempo. Esto permite modelos más complejos y precisos.

Las áreas o campos se tuilizan en: Economía, Ciencias de la salud, Marketing, Ingeniería, Ciencias sociales.

3.1.1 Regresión lineal

# Cargar los datos
data(mtcars)

# Inspeccionar los datos
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Ajustar el modelo de regresión lineal
modelo <- lm(mpg ~ wt, data = mtcars)

# Resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = mpg ~ wt, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.5432 -2.3647 -0.1252  1.4096  6.8727 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  37.2851     1.8776  19.858  < 2e-16 ***
## wt           -5.3445     0.5591  -9.559 1.29e-10 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 3.046 on 30 degrees of freedom
## Multiple R-squared:  0.7528, Adjusted R-squared:  0.7446 
## F-statistic: 91.38 on 1 and 30 DF,  p-value: 1.294e-10

El modelo ajustado es:

mpg =37.2851−5.344 * wt \ Esto significa que: Intersección (𝛽0) = 37.2851: Cuando el peso del vehículo (wt) es 0, el consumo de combustible estimado es de 37.29 millas por galón. (Ojo: en la realidad, no existen autos con peso 0, así que este valor es más bien teórico). Pendiente (β1) = -5.3445: Por cada aumento de 1,000 lbs en el peso del vehículo, el consumo de combustible disminuye en 5.34 millas por galón.

p-valor para el intercepto (< 2e-16) y para wt (1.29e-10): Ambos coeficientes son altamente significativos ( 𝑝< 0.001 p<0.001), lo que significa que hay una relación fuerte entre el peso y el consumo de combustible. Valor t para wt (-9.559): Un valor tan grande en valor absoluto indica que la variable wt es un predictor importante de mpg.

R 2 = 0.7528: El 75.28% de la variabilidad en mpg es explicada por wt. Este es un buen nivel de ajuste.

𝑅2 ajustado = 0.7446: Como es muy similar al 𝑅2, esto confirma que wt es un predictor fuerte.

Error estándar de los residuos = 3.046: En promedio, los valores reales de mpg se desvían en aproximadamente 3.05 unidades del valor predicho por el modelo.

# Instalar ggplot2 si no está instalado
if (!require(ggplot2)) install.packages("ggplot2", dependencies=TRUE)

# Cargar ggplot2
library(ggplot2)

# Gráfico de dispersión con línea de regresión
ggplot(mtcars, aes(x = wt, y = mpg)) +
  geom_point(color = "blue") +
  geom_smooth(method = "lm", col = "red") +
  ggtitle("Regresión Lineal: mpg vs. wt") +
  xlab("Peso del vehículo (1000 lbs)") +
  ylab("Millas por galón")
## `geom_smooth()` using formula = 'y ~ x'

3.2 Conclusión

El modelo sugiere una fuerte relación entre el peso del auto y su eficiencia en el consumo de combustible: a mayor peso, menor rendimiento en millas por galón. Además, el modelo es altamente significativo y explica una gran parte de la variabilidad en mpg.

3.2.1 Regresión lineal múltiple

# Cargar datos mtcars
data(mtcars)

# Mostrar las primeras filas
head(mtcars)
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
# Modelo de regresión lineal múltiple
modelo <- lm(mpg ~ cyl + disp + hp + wt, data = mtcars)

# Mostrar resumen del modelo
summary(modelo)
## 
## Call:
## lm(formula = mpg ~ cyl + disp + hp + wt, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -4.0562 -1.4636 -0.4281  1.2854  5.8269 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 40.82854    2.75747  14.807 1.76e-14 ***
## cyl         -1.29332    0.65588  -1.972 0.058947 .  
## disp         0.01160    0.01173   0.989 0.331386    
## hp          -0.02054    0.01215  -1.691 0.102379    
## wt          -3.85390    1.01547  -3.795 0.000759 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.513 on 27 degrees of freedom
## Multiple R-squared:  0.8486, Adjusted R-squared:  0.8262 
## F-statistic: 37.84 on 4 and 27 DF,  p-value: 1.061e-10

Intercept: Valor del consumo de combustible cuando todas las variables son 0.

cyl (cilindros): Cada cilindro adicional disminuye el consumo de combustible en -1.2260 mpg.

disp (desplazamiento del motor): No es tan significativo en este modelo.

hp (caballos de fuerza): Tiene un impacto negativo, pero no es significativo.

wt (peso del vehículo): Es significativo y reduce el rendimiento del combustible.

# Diagnóstico del modelo
par(mfrow=c(2,2))
plot(modelo)

# Crear un nuevo conjunto de datos
nuevos_datos <- data.frame(cyl = c(4, 6), disp = c(150, 250), hp = c(100, 180), wt = c(2.5, 3.2))

# Hacer predicciones
predict(modelo, newdata = nuevos_datos)
##        1        2 
## 25.70655 19.93903

3.3 Conclusión

El modelo muestra que wt (peso) y cyl (cilindros) son las variables más influyentes.

El R² ajustado es 0.7995, lo que indica que el modelo explica el 79.95% de la variabilidad en el consumo de combustible.

Se recomienda revisar los supuestos para validar la calidad del modelo.

4 Regresión logística

4.1 Introducción

“Es un tipo de modelo estadístico (también conocido como modelo logit) se utiliza a menudo para la clasificación y el análisis predictivo. La regresión logística estima la probabilidad de que ocurra un evento, como votar o no votar, en función de un conjunto de datos determinado de variables independientes” (IBM, s/f).

4.1.1 Ejemplo

# Cargar las librerías necesarias
library(ggplot2)
library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(openxlsx)
## Warning: package 'openxlsx' was built under R version 4.4.2
df <- read.xlsx("C:\\Users\\Becario SAIS\\Downloads\\Triage (1).xlsx", sheet = 2)

# 1. Imputar valores faltantes 
df$diastolica[is.na(df$diastolica)] <- mean(df$diastolica, na.rm = TRUE)
df$saturacion[is.na(df$saturacion)] <- mean(df$saturacion, na.rm = TRUE)
df$temperatura[is.na(df$temperatura)] <- mean(df$temperatura, na.rm = TRUE)
df$frec_resp[is.na(df$frec_resp)] <- mean(df$frec_resp, na.rm = TRUE)
df$frec_card[is.na(df$frec_card)] <- mean(df$frec_card, na.rm = TRUE)
df$tension_art[is.na(df$tension_art)] <- mean(df$tension_art, na.rm = TRUE)



# 2. Convertir las variables cualitativas a factores
df$sexo <- factor(df$sexo)

# 3. Crear el modelo de regresión logística
modelo_logistico <- glm(nivel_urgencias ~ sexo + edad + temperatura + frec_resp + frec_card + tension_art + diastolica + saturacion, 
                        data = df, 
                        family = binomial)
modelo_logistico
## 
## Call:  glm(formula = nivel_urgencias ~ sexo + edad + temperatura + frec_resp + 
##     frec_card + tension_art + diastolica + saturacion, family = binomial, 
##     data = df)
## 
## Coefficients:
## (Intercept)    sexoMujer         edad  temperatura    frec_resp    frec_card  
##   12.907527    -0.092190     0.017933    -0.096154     0.084651     0.013569  
## tension_art   diastolica   saturacion  
##    0.006053    -0.003885    -0.146500  
## 
## Degrees of Freedom: 3681 Total (i.e. Null);  3673 Residual
## Null Deviance:       4808 
## Residual Deviance: 4465  AIC: 4483

Se realizó un análisis de regresión logística con el objetivo de identificar los factores que influyen en el nivel de urgencia en un sistema de Triage . La variable dependiente es el nivel de urgencias, modelada como una variable dicotómica (0 = no urgente, 1 = urgente), y se incluyen como variables predictoras del sexo, edad, temperatura, frecuencia respiratoria, frecuencia cardíaca, presión arterial (sistólica y diastólica) y saturación de oxígeno Los resultados del modelo indican lo siguiente:

Sexo : Ser mujer (comparado con ser hombre) se asocia con un nivel de reducción en la probabilidad de presentar una urgencia (𝛽= −0,092). Edad : Existe una relación positiva con el nivel de urgencias (𝛽= 0,0179), lo que sugiere que a mayor edad, mayor probabilidad de clasificar como urgencia.

Temperatura : Un aumento en la temperatura corporal se asocia con una ligera disminución en la probabilidad de urgencia (𝛽= −0,0961). Frecuencia respiratoria : Se observa una asociación positiva (𝛽= 0,0846), indicando que un aumento en la frecuencia respiratoria está relacionado con una mayor probabilidad de urgencia. Frecuencia cardiaca : Presenta un coeficiente positivo (𝛽= 0,0135), lo que implica que valores más altos de frecuencia cardíaca pueden estar asociados con un mayor nivel de urgencia. Presión arterial sistólica : Aunque su efecto es pequeño (𝛽= 0,0060), sugiere que valores más altos pueden incrementar ligeramente la probabilidad de urgencia. Presión arterial diastólica : Presenta una relación negativa (𝛽= −0,0039), aunque con un efecto muy bajo. Saturación de oxígeno : Se observa un coeficiente negativo (𝛽= −0,1465), lo que indica que valores más altos de saturación de oxígeno reducen la probabilidad de clasificar como urgencia, lo cual es clínicamente esperado. El modelo ajustado tiene un AIC de 4483 , lo que da una medida de su calidad en comparación con otros modelos potenciales. La deviance residual (4465) muestra que el modelo ha logrado reducir la incertidumbre respecto a la deviance nula (4808), lo que indica un ajuste aceptable, aunque con posibilidad de mejorarse.

En conclusión, la edad, la frecuencia respiratoria y la frecuencia cardíaca se identifican como factores que incrementan la probabilidad de urgencia, mientras que la temperatura y la saturación de oxígeno tienen un efecto reductor en esta probabilidad. Estos resultados pueden ser útiles para optimizar los protocolos de clasificación en Triage y mejorar la priorización de los pacientes.

install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)
# Gráfico de los coeficientes del modelo
coeficientes <- coef(modelo_logistico)
coef_data <- data.frame(
  Variable = names(coeficientes),
  Coeficiente = coeficientes
)

ggplot(coef_data, aes(x = reorder(Variable, Coeficiente), y = Coeficiente)) +
  geom_bar(stat = "identity", fill = "coral") +
  coord_flip() +
  labs(title = "Coeficientes del Modelo de Regresión Logística", x = "Variable", y = "Coeficiente")

El modelo sugiere que la frecuencia respiratoria, la saturación de oxígeno y la edad son los predictores más relevantes en la clasificación del nivel de urgencias. Sin embargo, debido al alto valor del intercepto, sería recomendable analizar la razón de momios (exp(coef)) para obtener una interpretación más clara de los efectos en términos de probabilidades.

library(vcd)
## Warning: package 'vcd' was built under R version 4.4.2
## Cargando paquete requerido: grid
predicciones <- ifelse(test = modelo_logistico$fitted.values > 0.5, yes = 1, no = 0)
matriz_confusion <- table(modelo_logistico$model$nivel_urgencias, predicciones,
                          dnn = c("observaciones", "predicciones"))
matriz_confusion
##              predicciones
## observaciones    0    1
##             0 2171  189
##             1  926  396

Precisión global:

a = 2171 + 396
b = 2171+189+926+396

Precision = a/b
Precision
## [1] 0.6971754

Sensibilidad:

c = 396
d = 396+926

Sensibilidad = c/d
Sensibilidad
## [1] 0.2995461

Especificidad

e = 2171
f = 2171+189

Especificidad = e/f
Especificidad
## [1] 0.9199153
mosaic(matriz_confusion, shade = T, colorize = T,
       gp = gpar(fill = matrix(c("green3", "red2", "red2", "green3"), 2, 2)))

Interpretación: El modelo de regresión logística muestra un desempeño moderado en la clasificación del nivel de urgencias en el triage ya que su precisión general es del 69 por ciento Sin embargo al analizar los errores se observa que el modelo tiene una sensibilidad baja del 29 por ciento lo que significa que no detecta bien los casos urgentes clasificando incorrectamente a muchos pacientes como no urgentes Esto representa un problema en el contexto clínico porque podría llevar a una subestimación de la gravedad de algunos pacientes que realmente necesitan atención urgente Por otro lado la especificidad del modelo es alta lo que indica que identifica correctamente la mayoría de los casos no urgentes aunque a costa de dejar pasar muchos casos que sí son urgentes Esta tendencia sugiere que el modelo está más inclinado a clasificar pacientes como no urgentes reduciendo los falsos positivos pero aumentando los falsos negativos lo que implica que muchos pacientes en situación de urgencia podrían no recibir la atención adecuada a tiempo En términos prácticos esto podría traducirse en la necesidad de ajustar el umbral de decisión del modelo para priorizar la detección de pacientes urgentes aunque eso implica aceptar un mayor número de falsos positivos.

5 Series de tiempo

5.1 Introducción

Las series de tiempo son conjuntos de datos que registran la evolución de una variable a lo largo del tiempo. Se utilizan para analizar patrones, tendencias y estacionalidades en fenómenos como el clima, las ventas, la economía o cualquier otra medición que dependa del tiempo. Estas series pueden estudiarse con herramientas estadísticas y modelos matemáticos para hacer pronósticos o entender el comportamiento pasado de la variable analizada.

5.1.1 Ejemplo

La siguiente base es de la tasa de desempleo en el periodo desde el 1948 a 2024.

# Cargar librerías necesarias
library(ggplot2)
library(lubridate)
## Warning: package 'lubridate' was built under R version 4.4.2
## 
## Adjuntando el paquete: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
library(openxlsx)
datos = read.xlsx("C:\\Users\\Becario SAIS\\Downloads\\Tasadedesempleo.xlsx", sheet = 2)
head(datos) #Observar los datos con la función "head"
##   observation_date UNRATE
## 1            17533    3.4
## 2            17564    3.8
## 3            17593    4.0
## 4            17624    3.9
## 5            17654    3.5
## 6            17685    3.6
# Convertir la columna 'fecha' a formato Date si no lo está
datos$observation_date <- as.Date(datos$observation_date)

# Crear la serie de tiempo usando los datos mensuales, con frecuencia de 12 (mensual)
serie_ts <- ts(datos$UNRATE, start = c(1949, 1), frequency = 12)

# Graficar la serie de tiempo
plot(serie_ts, main = "Tasa de desempleo (1949-2024)", xlab = "Año", ylab = "Tasa de desempleo", col = "blue")

# Descomposición de la serie de tiempo
descomposicion <- decompose(serie_ts)
plot(descomposicion)

# Instalar y cargar el paquete forecast si no está instalado
if (!require(forecast)) install.packages("forecast")
## Cargando paquete requerido: forecast
## Warning: package 'forecast' was built under R version 4.4.2
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(forecast)

# Ajustar un modelo ARIMA para pronóstico
modelo_arima <- auto.arima(serie_ts)
pronostico <- forecast(modelo_arima, h = 24)  # Pronóstico para los próximos 24 meses (2 años)

# Graficar el pronóstico
plot(pronostico, main = "Pronóstico para los Próximos 2 Años", xlab = "Año", ylab = "Tasa de desempleo")

Como se observa en la imagen, se puede observar que el comportamiento de la gráfica se va a seguir a dos años se va a mantener en un comportamiento normal, esto quiere decir que no va aumentar y ni bajar en la tasa de desempleo se va a conseguir de la misma forma. Pero, también se llega a notar que entre en 2020 a 2022 obtuvo mucha tasa de desempleo pero después con el tiempo inicio a disminuir esa tasa de desempleo.

6 Estadística bayesiana

6.1 Introducción

La estadística bayesiana es un enfoque para analizar datos que se basan en el teorema de Bayes. A diferencia de la estadística tradicional (frecuentista), que trata de hacer inferencias basadas en los datos que tenemos de manera directa, la estadística bayesiana utiliza un enfoque probabilístico para actualizar nuestras creencias sobre un parámetro a medida que obtenemos nueva información.

En términos simples, imagina que tienes una suposición inicial (llamada “previa”) sobre algo que estás investigando, como la probabilidad de que un medicamento sea efectivo. A medida que obtienes más datos, como los resultados de un experimento, la estadística bayesiana ajusta esa suposición (actualiza el “prior”) para reflejar lo que los datos sugieren, generando una nueva distribución de probabilidad llam.

Este enfoque te permite integrar conocimiento previo (experiencia pasada, estudios previos) con la evidencia nueva (los datos que obtienes) de manera más flexible y dinámica. Además, proporciona una manera

6.1.1 Ejemplos

6.1.1.1 Modelo de regresión

# Establecer el repositorio CRAN
options(repos = c(CRAN = "https://cloud.r-project.org/"))

# Instalar el paquete brms
install.packages("brms")
## package 'brms' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Becario SAIS\AppData\Local\Temp\RtmpKeF73B\downloaded_packages
# Cargar el paquete brms
library(brms)
## Warning: package 'brms' was built under R version 4.4.2
## Cargando paquete requerido: Rcpp
## Loading 'brms' package (version 2.22.0). Useful instructions
## can be found by typing help('brms'). A more detailed introduction
## to the package is available through vignette('brms_overview').
## 
## Adjuntando el paquete: 'brms'
## The following object is masked from 'package:forecast':
## 
##     ma
## The following object is masked from 'package:stats':
## 
##     ar
# Simulación de datos
set.seed(123)
data <- rnorm(100, mean = 5, sd = 2)

# Crear un data frame con los datos
df <- data.frame(y = data)

# Definir el modelo bayesiano con una distribución normal a priori
# Modelo de regresión simple (solo un intercepto)
model <- brm(
  y ~ 1,  # Modelo con solo un intercepto (sin predictores)
  data = df,
  prior = c(
    prior(normal(0, 10), class = "Intercept"),  # Prior para el intercepto (media)
    prior(cauchy(0, 2), class = "sigma")       # Prior para la desviación estándar
  ),
  chains = 4,     # Número de cadenas MCMC
  iter = 2000,    # Número de iteraciones
  warmup = 1000   # Número de iteraciones de quemado
)
## Compiling Stan program...
## Start sampling
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 1).
## Chain 1: 
## Chain 1: Gradient evaluation took 8.9e-05 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 0.89 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1: 
## Chain 1: 
## Chain 1: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 1: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 1: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 1: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 1: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 1: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 1: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 1: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 1: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 1: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 1: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 1: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 1: 
## Chain 1:  Elapsed Time: 0.042 seconds (Warm-up)
## Chain 1:                0.04 seconds (Sampling)
## Chain 1:                0.082 seconds (Total)
## Chain 1: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 2).
## Chain 2: 
## Chain 2: Gradient evaluation took 1.1e-05 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 0.11 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2: 
## Chain 2: 
## Chain 2: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 2: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 2: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 2: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 2: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 2: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 2: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 2: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 2: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 2: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 2: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 2: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 2: 
## Chain 2:  Elapsed Time: 0.046 seconds (Warm-up)
## Chain 2:                0.033 seconds (Sampling)
## Chain 2:                0.079 seconds (Total)
## Chain 2: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 3).
## Chain 3: 
## Chain 3: Gradient evaluation took 7e-06 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 0.07 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3: 
## Chain 3: 
## Chain 3: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 3: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 3: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 3: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 3: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 3: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 3: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 3: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 3: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 3: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 3: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 3: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 3: 
## Chain 3:  Elapsed Time: 0.031 seconds (Warm-up)
## Chain 3:                0.029 seconds (Sampling)
## Chain 3:                0.06 seconds (Total)
## Chain 3: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 4).
## Chain 4: 
## Chain 4: Gradient evaluation took 1e-05 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 0.1 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4: 
## Chain 4: 
## Chain 4: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 4: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 4: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 4: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 4: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 4: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 4: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 4: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 4: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 4: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 4: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 4: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 4: 
## Chain 4:  Elapsed Time: 0.03 seconds (Warm-up)
## Chain 4:                0.033 seconds (Sampling)
## Chain 4:                0.063 seconds (Total)
## Chain 4:
# Resumen de los resultados
summary(model)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: y ~ 1 
##    Data: df (Number of observations: 100) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Regression Coefficients:
##           Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## Intercept     5.18      0.18     4.83     5.54 1.00     3416     2604
## 
## Further Distributional Parameters:
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sigma     1.84      0.13     1.60     2.12 1.00     3198     2566
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
# Graficar la distribución posterior
plot(model)

Explicación:

Modelo : El modelo es una regresión simple donde solo se estima el intercepto, es decir, la media de y. No se incluyen predictores adicionales.

Distribuciones a priori :

Para el intercepto ( Intercept), se usa una distribución normal con media 0 y desviación estándar 10. Para la desviación estándar ( sigma), se usa una distribución Cauchy con media 0 y escala 2. Configuración de MCMC : chains = 4: Se utilizan 4 cadenas para la estimación MCMC. iter = 2000: Se realizan 2000 iteraciones en total. warmup = 1000: Las primeras 1000 iteraciones son para el proceso de “quemado”, donde se descartan las muestras iniciales.

6.1.1.2 distribución log-normal distribución gamma

# Cargar el paquete brms
library(brms)

# Simulación de datos
set.seed(123)
data <- rnorm(100, mean = 5, sd = 2)

# Crear un data frame con los datos
df <- data.frame(y = data)

# Definir el modelo bayesiano con distribuciones a priori diferentes
# Usamos distribuciones lognormales y gamma para los parámetros
model <- brm(
  y ~ 1,  # Modelo con solo un intercepto
  data = df,
  prior = c(
    prior(lognormal(0, 1), class = "Intercept"),  # Prior log-normal para el intercepto
    prior(gamma(2, 0.5), class = "sigma")         # Prior gamma para la desviación estándar
  ),
  chains = 4,     # Número de cadenas MCMC
  iter = 2000,    # Número de iteraciones
  warmup = 1000   # Número de iteraciones de quemado
)
## Warning: It appears as if you have specified a lower bounded prior on a parameter that has no natural lower bound.
## If this is really what you want, please specify argument 'lb' of 'set_prior' appropriately.
## Warning occurred for prior 
## Intercept ~ lognormal(0, 1)
## Compiling Stan program...
## Start sampling
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 1).
## Chain 1: 
## Chain 1: Gradient evaluation took 4.2e-05 seconds
## Chain 1: 1000 transitions using 10 leapfrog steps per transition would take 0.42 seconds.
## Chain 1: Adjust your expectations accordingly!
## Chain 1: 
## Chain 1: 
## Chain 1: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 1: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 1: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 1: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 1: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 1: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 1: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 1: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 1: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 1: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 1: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 1: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 1: 
## Chain 1:  Elapsed Time: 0.044 seconds (Warm-up)
## Chain 1:                0.035 seconds (Sampling)
## Chain 1:                0.079 seconds (Total)
## Chain 1: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 2).
## Chain 2: Rejecting initial value:
## Chain 2:   Error evaluating the log probability at the initial value.
## Chain 2: Exception: lognormal_lpdf: Random variable is -1.21938, but must be nonnegative! (in 'string', line 17, column 2 to column 45)
## Chain 2: Rejecting initial value:
## Chain 2:   Error evaluating the log probability at the initial value.
## Chain 2: Exception: lognormal_lpdf: Random variable is -1.55452, but must be nonnegative! (in 'string', line 17, column 2 to column 45)
## Chain 2: 
## Chain 2: Gradient evaluation took 7e-06 seconds
## Chain 2: 1000 transitions using 10 leapfrog steps per transition would take 0.07 seconds.
## Chain 2: Adjust your expectations accordingly!
## Chain 2: 
## Chain 2: 
## Chain 2: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 2: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 2: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 2: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 2: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 2: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 2: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 2: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 2: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 2: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 2: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 2: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 2: 
## Chain 2:  Elapsed Time: 0.042 seconds (Warm-up)
## Chain 2:                0.026 seconds (Sampling)
## Chain 2:                0.068 seconds (Total)
## Chain 2: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 3).
## Chain 3: 
## Chain 3: Gradient evaluation took 1.3e-05 seconds
## Chain 3: 1000 transitions using 10 leapfrog steps per transition would take 0.13 seconds.
## Chain 3: Adjust your expectations accordingly!
## Chain 3: 
## Chain 3: 
## Chain 3: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 3: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 3: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 3: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 3: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 3: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 3: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 3: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 3: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 3: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 3: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 3: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 3: 
## Chain 3:  Elapsed Time: 0.046 seconds (Warm-up)
## Chain 3:                0.031 seconds (Sampling)
## Chain 3:                0.077 seconds (Total)
## Chain 3: 
## 
## SAMPLING FOR MODEL 'anon_model' NOW (CHAIN 4).
## Chain 4: 
## Chain 4: Gradient evaluation took 1.2e-05 seconds
## Chain 4: 1000 transitions using 10 leapfrog steps per transition would take 0.12 seconds.
## Chain 4: Adjust your expectations accordingly!
## Chain 4: 
## Chain 4: 
## Chain 4: Iteration:    1 / 2000 [  0%]  (Warmup)
## Chain 4: Iteration:  200 / 2000 [ 10%]  (Warmup)
## Chain 4: Iteration:  400 / 2000 [ 20%]  (Warmup)
## Chain 4: Iteration:  600 / 2000 [ 30%]  (Warmup)
## Chain 4: Iteration:  800 / 2000 [ 40%]  (Warmup)
## Chain 4: Iteration: 1000 / 2000 [ 50%]  (Warmup)
## Chain 4: Iteration: 1001 / 2000 [ 50%]  (Sampling)
## Chain 4: Iteration: 1200 / 2000 [ 60%]  (Sampling)
## Chain 4: Iteration: 1400 / 2000 [ 70%]  (Sampling)
## Chain 4: Iteration: 1600 / 2000 [ 80%]  (Sampling)
## Chain 4: Iteration: 1800 / 2000 [ 90%]  (Sampling)
## Chain 4: Iteration: 2000 / 2000 [100%]  (Sampling)
## Chain 4: 
## Chain 4:  Elapsed Time: 0.044 seconds (Warm-up)
## Chain 4:                0.033 seconds (Sampling)
## Chain 4:                0.077 seconds (Total)
## Chain 4:
# Resumen de los resultados
summary(model)
##  Family: gaussian 
##   Links: mu = identity; sigma = identity 
## Formula: y ~ 1 
##    Data: df (Number of observations: 100) 
##   Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
##          total post-warmup draws = 4000
## 
## Regression Coefficients:
##           Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## Intercept     5.17      0.19     4.79     5.54 1.00     2792     2316
## 
## Further Distributional Parameters:
##       Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
## sigma     1.85      0.13     1.61     2.14 1.00     3244     2371
## 
## Draws were sampled using sampling(NUTS). For each parameter, Bulk_ESS
## and Tail_ESS are effective sample size measures, and Rhat is the potential
## scale reduction factor on split chains (at convergence, Rhat = 1).
# Graficar la distribución posterior
plot(model)

Explicación:

Distribuciones a priori :

Para el intercepto(`InterceptarIntercept), hemocon pa log-normallognormal(0, 1), lo Para la desviación estándar(sisigma), hemosgamacon paragamma(2, 0.5), Configuración de MCMC :

chains = 4: Usamos 4 cadenas para la estimación MCMC. iter = 2000: Se realizan 2000 iteraciones. warmup = 1000: Las primeras 1000 iteraciones son para el proceso de quemado, que se descartan.

7 Mineria de datos

7.1 Introducción

La minería de datos es el proceso de explorar grandes volúmenes de datos para descubrir patrones, tendencias y relaciones que no son evidentes a simple vista. Este proceso utiliza técnicas de estadística, aprendizaje automático y bases de datos para transformar los datos en conocimiento útil que puede ser utilizado para tomar decisiones informadas.

7.1.1 Árbol de desición

# Instalar y cargar el paquete necesario
install.packages("rpart.plot")
## package 'rpart.plot' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\Becario SAIS\AppData\Local\Temp\RtmpKeF73B\downloaded_packages
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.4.2
## Cargando paquete requerido: rpart
library(rpart)

# Cargar los datos
data(iris)

# Crear un modelo de árbol de decisión con rpart
tree_model <- rpart(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, 
                    data = iris, method = "class")

# Graficar el árbol con rpart.plot
rpart.plot(tree_model)

7.1.2 Agrupamiento

# Cargar datos
data(iris)

# Realizar clustering con K-means
set.seed(123)
kmeans_model <- kmeans(iris[, -5], centers = 3)

# Ver los resultados del clustering
table(kmeans_model$cluster, iris$Species)
##    
##     setosa versicolor virginica
##   1     50          0         0
##   2      0         48        14
##   3      0          2        36
# Graficar
plot(iris$Sepal.Length, iris$Sepal.Width, col = kmeans_model$cluster, pch = 19)

7.1.3 Análisis de asociación

install.packages("arules")
## package 'arules' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'arules'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Becario
## SAIS\AppData\Local\Programs\R\R-4.4.1\library\00LOCK\arules\libs\x64\arules.dll
## a C:\Users\Becario
## SAIS\AppData\Local\Programs\R\R-4.4.1\library\arules\libs\x64\arules.dll:
## Permission denied
## Warning: restored 'arules'
## 
## The downloaded binary packages are in
##  C:\Users\Becario SAIS\AppData\Local\Temp\RtmpKeF73B\downloaded_packages
library(arules)
## Warning: package 'arules' was built under R version 4.4.2
## Cargando paquete requerido: Matrix
## 
## Adjuntando el paquete: 'arules'
## The following object is masked from 'package:dplyr':
## 
##     recode
## The following objects are masked from 'package:base':
## 
##     abbreviate, write
# Cargar los datos (usando un conjunto de ejemplo)
data("Groceries")

# Generar reglas de asociación
rules <- apriori(Groceries, parameter = list(supp = 0.01, conf = 0.5))
## Apriori
## 
## Parameter specification:
##  confidence minval smax arem  aval originalSupport maxtime support minlen
##         0.5    0.1    1 none FALSE            TRUE       5    0.01      1
##  maxlen target  ext
##      10  rules TRUE
## 
## Algorithmic control:
##  filter tree heap memopt load sort verbose
##     0.1 TRUE TRUE  FALSE TRUE    2    TRUE
## 
## Absolute minimum support count: 98 
## 
## set item appearances ...[0 item(s)] done [0.00s].
## set transactions ...[169 item(s), 9835 transaction(s)] done [0.00s].
## sorting and recoding items ... [88 item(s)] done [0.00s].
## creating transaction tree ... done [0.00s].
## checking subsets of size 1 2 3 4 done [0.00s].
## writing ... [15 rule(s)] done [0.00s].
## creating S4 object  ... done [0.00s].
# Ver las reglas
inspect(rules)
##      lhs                                       rhs                support   
## [1]  {curd, yogurt}                         => {whole milk}       0.01006609
## [2]  {other vegetables, butter}             => {whole milk}       0.01148958
## [3]  {other vegetables, domestic eggs}      => {whole milk}       0.01230300
## [4]  {yogurt, whipped/sour cream}           => {whole milk}       0.01087951
## [5]  {other vegetables, whipped/sour cream} => {whole milk}       0.01464159
## [6]  {pip fruit, other vegetables}          => {whole milk}       0.01352313
## [7]  {citrus fruit, root vegetables}        => {other vegetables} 0.01037112
## [8]  {tropical fruit, root vegetables}      => {other vegetables} 0.01230300
## [9]  {tropical fruit, root vegetables}      => {whole milk}       0.01199797
## [10] {tropical fruit, yogurt}               => {whole milk}       0.01514997
## [11] {root vegetables, yogurt}              => {other vegetables} 0.01291307
## [12] {root vegetables, yogurt}              => {whole milk}       0.01453991
## [13] {root vegetables, rolls/buns}          => {other vegetables} 0.01220132
## [14] {root vegetables, rolls/buns}          => {whole milk}       0.01270971
## [15] {other vegetables, yogurt}             => {whole milk}       0.02226741
##      confidence coverage   lift     count
## [1]  0.5823529  0.01728521 2.279125  99  
## [2]  0.5736041  0.02003050 2.244885 113  
## [3]  0.5525114  0.02226741 2.162336 121  
## [4]  0.5245098  0.02074225 2.052747 107  
## [5]  0.5070423  0.02887646 1.984385 144  
## [6]  0.5175097  0.02613116 2.025351 133  
## [7]  0.5862069  0.01769192 3.029608 102  
## [8]  0.5845411  0.02104728 3.020999 121  
## [9]  0.5700483  0.02104728 2.230969 118  
## [10] 0.5173611  0.02928317 2.024770 149  
## [11] 0.5000000  0.02582613 2.584078 127  
## [12] 0.5629921  0.02582613 2.203354 143  
## [13] 0.5020921  0.02430097 2.594890 120  
## [14] 0.5230126  0.02430097 2.046888 125  
## [15] 0.5128806  0.04341637 2.007235 219

7.1.4 Análisis series de tiempo

library(forecast)

# Usar el conjunto de datos AirPassengers (serie de tiempo de pasajeros mensuales)
data("AirPassengers")
ts_data <- AirPassengers

# Ajustar un modelo ARIMA
fit <- auto.arima(ts_data)

# Realizar predicciones
forecasted_values <- forecast(fit, h = 12)

# Graficar las predicciones
plot(forecasted_values)

8 Estadística multivariada

8.1 Introducción

La estadística multivariada es una rama de la estadística que se enfoca en el análisis de datos que contienen múltiples variables a la vez. A diferencia de la estadística univariada, que estudia una sola variable a la vez, la estadística multivariada permite comprender mejor las relaciones y patrones complejos que existen entre varias variables al mismo tiempo.

En un contexto multivariado, las variables no se analizan de manera independiente, sino que se estudian en conjunto para entender cómo interactúan entre sí. Esto es crucial en muchas áreas, como la investigación de mercados, la biología, la psicología, la economía, entre otras, donde los fenómenos que se estudian suelen estar influenciados por múltiples factores simultáneamente.

8.1.1 Análisis de componentes principales (PCA)

# Cargar el conjunto de datos iris
data(iris)

# Realizar PCA en las variables numéricas
pca_result <- prcomp(iris[, 1:4], center = TRUE, scale. = TRUE)

# Resumen de la PCA
summary(pca_result)
## Importance of components:
##                           PC1    PC2     PC3     PC4
## Standard deviation     1.7084 0.9560 0.38309 0.14393
## Proportion of Variance 0.7296 0.2285 0.03669 0.00518
## Cumulative Proportion  0.7296 0.9581 0.99482 1.00000
# Graficar los primeros dos componentes principales
plot(pca_result$x[, 1:2], col = iris$Species, pch = 19, 
     xlab = "Componente Principal 1", ylab = "Componente Principal 2")

8.1.2 Correlación canonica

# Instalar el paquete vegan si no lo tienes
install.packages("vegan")
## package 'vegan' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'vegan'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problema al copiar
## C:\Users\Becario
## SAIS\AppData\Local\Programs\R\R-4.4.1\library\00LOCK\vegan\libs\x64\vegan.dll a
## C:\Users\Becario
## SAIS\AppData\Local\Programs\R\R-4.4.1\library\vegan\libs\x64\vegan.dll:
## Permission denied
## Warning: restored 'vegan'
## 
## The downloaded binary packages are in
##  C:\Users\Becario SAIS\AppData\Local\Temp\RtmpKeF73B\downloaded_packages
library(vegan)
## Warning: package 'vegan' was built under R version 4.4.2
## Cargando paquete requerido: permute
## Warning: package 'permute' was built under R version 4.4.2
## Cargando paquete requerido: lattice
# Crear dos matrices de ejemplo con el mismo número de filas
set.seed(123)
X <- matrix(rnorm(50), ncol = 5)  # Conjunto de variables X
Y <- matrix(rnorm(50), ncol = 5)  # Conjunto de variables Y

# Verificar que ambas matrices tengan el mismo número de filas
nrow(X)  # Número de filas de X
## [1] 10
nrow(Y)  # Número de filas de Y
## [1] 10
# Realizar el análisis de correlación canónica
cca_result <- cancor(X, Y)

# Ver los resultados
cca_result
## $cor
## [1] 1.00000000 0.97996009 0.81621875 0.54896216 0.03285199
## 
## $xcoef
##             [,1]       [,2]        [,3]        [,4]        [,5]
## [1,]  0.03430428 0.30561470 -0.39131533 -0.12839631  0.40385571
## [2,] -0.16363157 0.04990686  0.01784659 -0.12204146 -0.41890214
## [3,] -0.35069202 0.25285724  0.15674673  0.02144605 -0.10658529
## [4,]  0.19949764 0.17395632  0.84784958  0.24224586 -0.46155005
## [5,] -0.01399219 0.14147250 -0.28221653  0.18280083 -0.04046779
## 
## $ycoef
##             [,1]       [,2]       [,3]         [,4]       [,5]
## [1,]  0.20340298 -0.3012591 0.21099050  0.007078762 0.43229726
## [2,] -0.17226193 -0.3839216 0.06049137 -0.218047373 0.07012702
## [3,]  0.14298712  0.2560778 0.14497032 -0.221565265 0.06116391
## [4,] -0.23454880  0.5115741 0.19688646  0.159223182 0.37575288
## [5,]  0.09357301 -0.2015918 0.44297831 -0.037499542 0.13701362
## 
## $xcenter
## [1]  0.074625644  0.208621961 -0.424558873  0.322044550 -0.008715537
## 
## $ycenter
## [1]  0.2216860  0.1230837 -0.3629178  0.3130953  0.4370942

8.1.3 Regresión multivariada

# Cargar el conjunto de datos mtcars
data(mtcars)

# Realizar una regresión multivariada con mpg y qsec como variables dependientes
# y las demás como independientes
multiv_regression <- lm(cbind(mpg, qsec) ~ wt + hp + drat + gear, data = mtcars)

# Resumen del modelo
summary(multiv_regression)
## Response mpg :
## 
## Call:
## lm(formula = mpg ~ wt + hp + drat + gear, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.1924 -1.8558 -0.3826  1.0345  5.8728 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 28.57774    6.38283   4.477 0.000124 ***
## wt          -3.01579    0.88303  -3.415 0.002030 ** 
## hp          -0.03503    0.01021  -3.432 0.001946 ** 
## drat         1.15633    1.46652   0.788 0.437282    
## gear         0.59509    1.01253   0.588 0.561599    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 2.592 on 27 degrees of freedom
## Multiple R-squared:  0.8389, Adjusted R-squared:  0.8151 
## F-statistic: 35.16 on 4 and 27 DF,  p-value: 2.428e-10
## 
## 
## Response qsec :
## 
## Call:
## lm(formula = qsec ~ wt + hp + drat + gear, data = mtcars)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.8137 -0.5457 -0.0545  0.3084  3.7931 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 19.530279   2.766300   7.060 1.37e-07 ***
## wt           0.826863   0.382703   2.161   0.0398 *  
## hp          -0.026199   0.004423  -5.923 2.59e-06 ***
## drat         0.098870   0.635587   0.156   0.8775    
## gear        -0.231669   0.438825  -0.528   0.6019    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.123 on 27 degrees of freedom
## Multiple R-squared:  0.6559, Adjusted R-squared:  0.6049 
## F-statistic: 12.86 on 4 and 27 DF,  p-value: 5.489e-06

8.1.4 Análisis de clúster jerárquico (HCA)

# Cargar el conjunto de datos iris
data(iris)

# Calcular la matriz de distancias
dist_matrix <- dist(iris[, 1:4])

# Realizar el clúster jerárquico
hca_result <- hclust(dist_matrix)

# Graficar el dendrograma
plot(hca_result)

8.1.5 Análisis de discriminante lineal (LDA)

# Cargar el conjunto de datos iris
data(iris)

# Realizar LDA para predecir la especie en función de las variables numéricas
library(MASS)
## 
## Adjuntando el paquete: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
lda_model <- lda(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris)

# Resumen del modelo
summary(lda_model)
##         Length Class  Mode     
## prior    3     -none- numeric  
## counts   3     -none- numeric  
## means   12     -none- numeric  
## scaling  8     -none- numeric  
## lev      3     -none- character
## svd      2     -none- numeric  
## N        1     -none- numeric  
## call     3     -none- call     
## terms    3     terms  call     
## xlevels  0     -none- list
# Predecir con el modelo
lda_pred <- predict(lda_model)

# Graficar los resultados
plot(lda_pred$x[, 1:2], col = iris$Species, pch = 19, 
     xlab = "LD1", ylab = "LD2")

8.1.6 Análisis de varianza multivariado (MANOVA)

# Cargar el conjunto de datos iris
data(iris)

# Realizar MANOVA para comparar las medias de las variables numéricas
manova_result <- manova(cbind(Sepal.Length, Sepal.Width, Petal.Length, Petal.Width) ~ Species, data = iris)

# Ver los resultados
summary(manova_result)
##            Df Pillai approx F num Df den Df    Pr(>F)    
## Species     2 1.1919   53.466      8    290 < 2.2e-16 ***
## Residuals 147                                            
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

9 Conclusión

En esta página se presentan ejemplos de código y técnicas estadísticas que pueden ser útiles para quienes estén interesados en aplicar métodos cuantitativos a diferentes problemas. Aunque no se abordan interpretaciones detalladas de los resultados, los códigos proporcionados pueden servir como base para realizar análisis más profundos. Si desean una interpretación más específica de los resultados o tienen alguna pregunta sobre cómo aplicar estos métodos en sus propios proyectos, no duden en enviarme un mensaje. Estoy disponible para ayudar y proporcionar más detalles sobre cómo interpretar los resultados obtenidos con estas técnicas.

Mas información para un análisis o interpretación al correo siguiente: