Objetos de datos

En R, toda la información se almacena en objetos. Dependiendo de cómo estén organizados los datos, estos objetos pueden adoptar distintas estructuras. Existen cuatro estructuras principales en R:

I. Vectores

II. Matrices

III. Data frames

IV. Listas

Continuamos con nuestro estudio de las matrices.


Matrices

Una matriz en R es una estructura de datos bidimensional para almacenar objetos del mismo tipo.

Para crear una matriz se utiliza la función matrix() cuyos argumentos son:

  1. data: Datos a incluir en la matriz
  2. nrow: Número de filas
  3. ncol: Número de columnas
  4. byrow: Llenado por filas o columnas TRUE o FALSE respectivamente. Por defecto es FALSE.
  5. dimnames: Nombres de las filas y columnas.
A <- matrix(1:10, nrow= 5)
A
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10
B <- matrix(21:40, nrow=2)
length(21:40)
## [1] 20
B
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]   21   23   25   27   29   31   33   35   37    39
## [2,]   22   24   26   28   30   32   34   36   38    40
C <- matrix(14:25, nrow= 5)
## Warning in matrix(14:25, nrow = 5): data length [12] is not a sub-multiple or
## multiple of the number of rows [5]
C
##      [,1] [,2] [,3]
## [1,]   14   19   24
## [2,]   15   20   25
## [3,]   16   21   14
## [4,]   17   22   15
## [5,]   18   23   16
nrow(A)
## [1] 5
nrow(B)
## [1] 2
nrow(C)
## [1] 5
ncol(A)
## [1] 2
ncol(B)
## [1] 10
ncol(C)
## [1] 3
dim(A)
## [1] 5 2
dim(B)
## [1]  2 10
dim(C)
## [1] 5 3
is.vector(dim(C))
## [1] TRUE


secuencia <- seq(1,12,2)
secuencia
## [1]  1  3  5  7  9 11
length(secuencia)
## [1] 6
matriz1 <- matrix(secuencia, ncol= 2)
matriz1
##      [,1] [,2]
## [1,]    1    7
## [2,]    3    9
## [3,]    5   11
matriz2 <- matrix(secuencia, ncol = 3)
matriz1; matriz2
##      [,1] [,2]
## [1,]    1    7
## [2,]    3    9
## [3,]    5   11
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    3    7   11
matriz3 <- matrix(secuencia, ncol = 3, byrow = TRUE)
matriz2; matriz3
##      [,1] [,2] [,3]
## [1,]    1    5    9
## [2,]    3    7   11
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    7    9   11


matriz4 <- matrix(secuencia, 
                  ncol = 3,
                  byrow = T,
                  dimnames = list(c("F1","F2"),c("C1","C2","C3"))
                  )
                  
matriz4
##    C1 C2 C3
## F1  1  3  5
## F2  7  9 11


Operaciones con matrices

Operación Código en R
Sumar dos matrices matriz_a + matriz_b
Restar dos matrices matriz_a - matriz_b
Multiplicar una matriz por un escalar matriz_a * 2
Multiplicar dos matrices matriz_a %*% matriz_b
Transponer una matriz t(matriz_a)
Determinante de una matriz cuadrada det(matriz_a)
Inversa de una matriz solve(matriz_a)
Diagonal principal de una matriz diag(matriz_a)
Operación t(matriz_a) % matriz_b crossprod(matriz_a, matriz_b)
Media de filas o columnas rowMeans(matriz_a) / colMeans(matriz_a)
Extraer fila o columna matriz_a[1, ] / matriz_a[, 2]
Calcular los eigenvalores de una matriz simétrica eigen(matriz_a)

Nota: Los eigenvalores indican cuánto escala la matriz en determinadas direcciones privilegiadas (sus eigenvectores). Por ejemplo, en PCA, los eigenvalores de la matriz de covarianzas representan la cantidad de varianza explicada por cada componente principal.


Suma y Resta de Matrices:

matrizA <- matrix(1:4, 2, 2)
matrizB <- matrix(5:8, 2, 2)

matrizA; matrizB
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8
# Suma de matrices
matriz_suma <- matrizA + matrizB
matriz_suma
##      [,1] [,2]
## [1,]    6   10
## [2,]    8   12
# Resta de matrices 
matriz_resta <- matrizB - matrizA
matriz_resta
##      [,1] [,2]
## [1,]    4    4
## [2,]    4    4


Producto de matrices: Diferencia entre multiplicación elemento a elemento y multiplicación matricial.

matrizA; matrizB
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
##      [,1] [,2]
## [1,]    5    7
## [2,]    6    8
multiplicacion_elemento <- matrizA * matrizB
multiplicacion_elemento
##      [,1] [,2]
## [1,]    5   21
## [2,]   12   32
multiplicacion_matricial <- matrizA %*% matrizB
multiplicacion_matricial
##      [,1] [,2]
## [1,]   23   31
## [2,]   34   46


Transpuesta, Determinante e Inversa de una Matriz

matrizA
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
# Transpuesta
# La transpuesta de una matriz se obtiene intercambiando sus filas por columnas.
matriz_transpuesta <- t(matrizA)
matriz_transpuesta
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
# Determinante de la matriz
# Solo para matrices cuadradas (mismo num de rows y col)
# Indica si una matriz tiene inversa
# Más adelante, servirá para medir la dispersión conjunta de variables aleatorias.
det_A <- det(matrizA)
det_A
## [1] -2
# Inversa de la matriz
# Si det(A) ≠ 0, la inversa es la matriz que, al multiplicarse 
# por la matriz original resulta en la identidad
inversa_A <- solve(matrizA)
inversa_A
##      [,1] [,2]
## [1,]   -2  1.5
## [2,]    1 -0.5


Funciones aplicadas a matrices

Uso de las funciones rowSums(), colSums(), rowMeans() y colMeans() para obtener estadísticas de filas y columnas.

matrizA
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
suma_filas <- rowSums(matrizA)
matrizA; suma_filas
##      [,1] [,2]
## [1,]    1    3
## [2,]    2    4
## [1] 4 6
suma_columnas <- colSums(matrizA)
suma_columnas
## [1] 3 7
promedio_filas <- rowMeans(matrizA)
promedio_filas
## [1] 2 3
promedio_columnas <- colMeans(matrizA)
promedio_columnas
## [1] 1.5 3.5

Actividad 1

Eres un analista en una compañía de seguros y debes evaluar la rentabilidad de dos productos de inversión.

Productos:

Producto A: Tasa de interés anual del 1.5%, 2% y 2.5% para los años 1, 3 y 5 respectivamente. Producto B: Tasa de interés anual fija del 3%, 3.5% y 4% para los años 1, 3 y 5 respectivamente.

Plazos de Inversión:

1 año, 3 años y 5 años.

Objetivo:

  1. Calcular el valor futuro de una inversión inicial de $10,000 para ambos productos en cada plazo.
tasas_interes <- matrix(c(1.5,2,2.5,3,3.5,4),
                        nrow = 3,
                        ncol = 2,
                        byrow = FALSE,
                        dimnames = list(c("1 año","3 años","5 años"),c("Producto A","Producto B"))
                        )

tasas_interes
##        Producto A Producto B
## 1 año         1.5        3.0
## 3 años        2.0        3.5
## 5 años        2.5        4.0
capital_inicial <- 10000

valor_futuro <- capital_inicial * (1 + tasas_interes/100)^c(1,3,5)
tasas_interes; valor_futuro
##        Producto A Producto B
## 1 año         1.5        3.0
## 3 años        2.0        3.5
## 5 años        2.5        4.0
##        Producto A Producto B
## 1 año    10150.00   10300.00
## 3 años   10612.08   11087.18
## 5 años   11314.08   12166.53


Otra propuesta de solución es:

tasas_interes <- matrix(c(1.5,2,2.5,3,3.5,4),
                        nrow = 2,
                        ncol = 3,
                        byrow = TRUE,
                        dimnames = list(c("Producto A","Producto B"),c("1 año","3 años","5 años"))
                        )

tasas_interes
##            1 año 3 años 5 años
## Producto A   1.5    2.0    2.5
## Producto B   3.0    3.5    4.0
capital_inicial <- 10000

plazos <- matrix(rep(c(1,3,5),2), nrow = 2, byrow = TRUE)
tasas_interes; plazos
##            1 año 3 años 5 años
## Producto A   1.5    2.0    2.5
## Producto B   3.0    3.5    4.0
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    1    3    5
valor_futuro <- capital_inicial * (1 + tasas_interes/100) ^ plazos
tasas_interes; plazos; valor_futuro
##            1 año 3 años 5 años
## Producto A   1.5    2.0    2.5
## Producto B   3.0    3.5    4.0
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    1    3    5
##            1 año   3 años   5 años
## Producto A 10150 10612.08 11314.08
## Producto B 10300 11087.18 12166.53


Actividad 2

Eres un analista financiero de una concesionaria de autos y te han solicitado realizar un análisis detallado de los pagos mensuales de diferentes modelos de autos bajo diversos planes de financiamiento. La concesionaria ofrece financiamientos a plazos de 36, 48, 60 y 72 meses, con tasas de interés anuales que varían según el modelo de auto.

Se tiene tres modelos con los siguientes precios: * Modelo A $250,000 * Modelo B $350,000 * Modelo C $450,000

Tasas de interés anual nominal (capitalizables mensualmente) por modelo: * Modelo A 7.5% * Modelo B 6.5% * Modelo C 5.5%

Plazos de financiamiento * 36 meses * 48 meses * 60 meses * 72 meses

Objetivos:

  1. Utiliza la fórmula de anualidades para calcular los pagos mensuales.
  2. Crea una matriz que almacene los pagos mensuales calculados para cada modelo de auto y cada plazo.
  3. Grafica los distintos planes de financiamiento para los modelos.
Modelo A Modelo B Modelo C
36 m
48 m
60 m
72 m
tasas_nom <- c(7.5,6.5,5.5)
precios <- c(250000,350000,450000)
plazos <- c(36,48,60,72)

tasas_mensuales <- round(tasas_nom/100/12,6)

tasas_matriz <- matrix(rep(tasas_mensuales,4),nrow = 4, byrow = T)
tasas_matriz
##         [,1]     [,2]     [,3]
## [1,] 0.00625 0.005417 0.004583
## [2,] 0.00625 0.005417 0.004583
## [3,] 0.00625 0.005417 0.004583
## [4,] 0.00625 0.005417 0.004583
dim(tasas_matriz)
## [1] 4 3
precios_matriz <- matrix(rep(precios,4), nrow = 4, byrow = T)
precios_matriz
##        [,1]   [,2]   [,3]
## [1,] 250000 350000 450000
## [2,] 250000 350000 450000
## [3,] 250000 350000 450000
## [4,] 250000 350000 450000
dim(precios_matriz)
## [1] 4 3
plazos_matriz <- matrix(rep(plazos,3), nrow = 4, byrow = F)
plazos_matriz
##      [,1] [,2] [,3]
## [1,]   36   36   36
## [2,]   48   48   48
## [3,]   60   60   60
## [4,]   72   72   72
dim(plazos_matriz)
## [1] 4 3


Nota: La fórmula del valor presente de una anualidad vencida es:

\[ VP = R \cdot \frac{1 - (1+i)^{-n}}{i} \]

donde:
- \(VP\) : valor presente de la anualidad
- \(R\) : pago periódico
- \(i\) : tasa de interés por periodo
- \(n\) : número de periodos

En una anualidad vencida, los pagos se realizan al final de cada periodo.

pagos_mensuales <- precios_matriz * tasas_matriz / (1-(1+tasas_matriz)^(-plazos_matriz))

pagos_mensuales
##          [,1]      [,2]      [,3]
## [1,] 7776.555 10727.215 13588.075
## [2,] 6044.725  8300.298 10465.332
## [3,] 5009.487  6848.217  8595.440
## [4,] 4322.528  5883.542  7351.965
rownames(pagos_mensuales) <- c("36 m","48 m","60 m","72 m")
colnames(pagos_mensuales) <- c("Modelo A","Modelo B","Modelo C")

pagos_mensuales
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
dimnames(pagos_mensuales) <- list(1:4,1:3)
pagos_mensuales
##          1         2         3
## 1 7776.555 10727.215 13588.075
## 2 6044.725  8300.298 10465.332
## 3 5009.487  6848.217  8595.440
## 4 4322.528  5883.542  7351.965
dimnames(pagos_mensuales) <- list(c("36 m","48 m","60 m","72 m"),
                             c("Modelo A","Modelo B","Modelo C"))

pagos_mensuales; t(pagos_mensuales)
##      Modelo A  Modelo B  Modelo C
## 36 m 7776.555 10727.215 13588.075
## 48 m 6044.725  8300.298 10465.332
## 60 m 5009.487  6848.217  8595.440
## 72 m 4322.528  5883.542  7351.965
##               36 m      48 m     60 m     72 m
## Modelo A  7776.555  6044.725 5009.487 4322.528
## Modelo B 10727.215  8300.298 6848.217 5883.542
## Modelo C 13588.075 10465.332 8595.440 7351.965


Aprovechamos esta actividad para presentar un par de gráficos interesantes:

  • Gráfico de líneas

Emplearemos matplot(), función diseñada para graficar todas las columnas de una matriz al mismo tiempo. En R, cuando pasas una matriz a matplot() cada columna se convierte en una línea distinta. El eje X usa automáticamente los índices de fila: 1, 2, 3, 4. El eje Y usa los valores numéricos. Estos son los elementos que vamos a configurar:

matplot(pagos_mensuales,
        type = "b",    # líneas y puntos
        pch = 1:3,     # símbolo de los puntos para cada serie
        lty = 1:3,     # tipo de línea para cada serie
        col = 1:3,     # color de cada serie
        xaxt = "n",    # oculta el eje X por defecto
        xlab = "Plazo",# etiqueta del eje X
        ylab = "Monto de pago", # etiqueta del eje Y
        main = "Comparación de pagos por modelo" # título del gráfico
)

axis(1,
     at = 1:4,                      # posiciones de las marcas en el eje X
     labels = rownames(pagos_mensuales)) # etiquetas personalizadas

legend("topright",                  # ubicación de la leyenda
       legend = colnames(pagos_mensuales), # nombres de las series
       col = 1:3,                   # colores de la leyenda
       lty = 1:3,                   # tipos de línea de la leyenda
       pch = 1:3)                   # símbolos de puntos de la leyenda


La gráfica de líneas resulta más adecuada cuando se desea analizar la tendencia de los pagos en función del plazo, ya que permite observar con mayor claridad la evolución entre 36, 48, 60 y 72 meses.


* Gráfico de barras

Cuando le pasamos una matriz a barplot(), cada columna se convierte en un grupo en el eje X y cada fila se convierte en una barra dentro del grupo.

barplot(t(pagos_mensuales),
        beside = TRUE,
        col = c("skyblue", "salmon", "lightgreen" ),
        legend = colnames(pagos_mensuales),
        main = " Pagos por modelo y plazo",
        xlab = "Plazos",
        ylab = "Monto de pago")


La gráfica de barras facilita la comparación directa de los montos específicos entre los distintos modelos en cada plazo, permitiendo identificar diferencias puntuales de manera más visual.