Está en la página 1de 63

Tópicos en Economía y Negocios utilizando R

Guía de Ejercicios 1
Profesor: Víctor Macías E.

En esta guía trabajaremos con vectores, matrices, listas y dataframes/tibbles


Nota: Todo lo que está en un fondo gris es código que ustedes pueden escribir en un R Script
(.R)

Pregunta 1
(a) Genere un vector que contenga la siguiente secuencia de números de 1 al 10: 1, 2, 3, ..., 10
A continuación se presentan tres formas para generar dicho vector:
seq(1,10,1) #forma 1. Esto es lo que ustedes escriben en el R Script

## [1] 1 2 3 4 5 6 7 8 9 10
1:10 #forma 2. Esto es lo que ustedes escriben en el R Script

## [1] 1 2 3 4 5 6 7 8 9 10
seq(10) #forma 3. Esto es lo que ustedes escriben en el R Script

## [1] 1 2 3 4 5 6 7 8 9 10
Notas:
• Lo que escribas después de # se entiende como texto. ¡No es código!
• La sintaxis de la forma 1 contiene 3 argumentos:

seq(f rom = 1, to = 10, by = 1)

(b) Genere un vector que contenga la siguiente secuencia de números 1, 3, 5, 7, 9


seq(1,9,2)

## [1] 1 3 5 7 9

(c) Genere un vector del 1 al 5 que contenga 10 elementos


seq(1,5, length=10)

1
## [1] 1.000000 1.444444 1.888889 2.333333 2.777778 3.222222 3.666667
## [8] 4.111111 4.555556 5.000000

(d) Genere un vector cuyos elementos sean cinco ceros y cada uno tenga como nombre las letras A, B, C, D, E.
ceros1 <- numeric(5) #define vector de ceros # forma 1
names(ceros1) <- c("A", "B", "C", "D", "E") #asigna nombre a elementos
ceros1

## A B C D E
## 0 0 0 0 0
ceros2 <- rep(0, 5) #forma 2
names(ceros2) <- c("A", "B", "C", "D", "E") #asigna nombre a elementos
ceros2

## A B C D E
## 0 0 0 0 0

(e) Genere un vector z que repita la letra A cinco veces y la letra B dos veces.
z = rep(c("A", "B"), c(5,2)) #forma 1
z

## [1] "A" "A" "A" "A" "A" "B" "B"


z = c(rep("A", 5), rep("B",2)) #forma 2
z

## [1] "A" "A" "A" "A" "A" "B" "B"

(f) Genere un vector de los pagos de un bono que tiene 9 pagos de $100 y un último pago de $1100.
flujo <- c(rep(100,9), 1100)
flujo

## [1] 100 100 100 100 100 100 100 100 100 1100

(g) Genere el siguiente vector: “year_2015”, “year_2016”, “year_2017”, “year_2018”


year <- 2015:2018
paste0("year_", year)

## [1] "year_2015" "year_2016" "year_2017" "year_2018"


paste("year_", year)

## [1] "year_ 2015" "year_ 2016" "year_ 2017" "year_ 2018"

Pregunta: ¿Cuál es la diferencia entre paste0 y paste?

Pregunta 2
El vector x contiene las edades de 5 estudiantes:

2
x = c("Pedro"=17, "Ana"=NA, "Maya"=23, "Max"=NA, "Paula"=20)

(a) Defina un vector y que excluya los missing values (NA).


y=x[-c(2,4)] #forma 1
y

## Pedro Maya Paula


## 17 23 20
y=x[c(-2,-4)] # forma 2
y

## Pedro Maya Paula


## 17 23 20
y=x[!is.na(x)] # forma 3
y

## Pedro Maya Paula


## 17 23 20
y = na.omit(x) # forma 4
y

## Pedro Maya Paula


## 17 23 20
## attr(,"na.action")
## Ana Max
## 2 4
## attr(,"class")
## [1] "omit"

Pregunta: ¿Por qué se usa []? (Ayuda: Si escribe x[2], ¿qué obtiene?. Y si escribe x[c(1,3)],
¿qué obtiene?

(b) Asigne las edades de Pedro y Ana a un vector z


z <- x[c("Pedro","Ana")] #forma 1
z

## Pedro Ana
## 17 NA
z <- x[1:2] #forma 2
z

## Pedro Ana
## 17 NA

(c) Calcule el promedio aritmético de las edades de los 5 estudiantes


# Si escribe lo siguiente, ¿qué obtiene?

mean(x)

## [1] NA

3
mean(x, na.rm = TRUE) #forma 1

## [1] 20

Recuerde que la media muestral se define como:


Pn
xi
x= i=1
n
sum(x[!is.na(x)])/length(x[!is.na(x)]) #forma 2

## [1] 20

Pregunta: ¿Cómo escribiría la fórmula para la desviación estándar muestral usando R? Re-
cuerde que la desviación estándar muestral se define como:
sP
n
i=1 (xi − x)
2
σ=
n−1

(d) Calcule la proporción de estudiantes que tienen 20 años o menos


mean(x<=20, na.rm = TRUE)

## [1] 0.6666667

(e) Calcule el promedio de edad de los estudiantes cuyas edades son 20 años o menos
mean(x[x<=20], na.rm = TRUE)

## [1] 18.5

Para entender esta sintaxis, les recomiendo deconstruir el código de la siguiente manera:
x<=20

## Pedro Ana Maya Max Paula


## TRUE NA FALSE NA TRUE
x[x<=20]

## Pedro <NA> <NA> Paula


## 17 NA NA 20
mean(x[x<=20], na.rm = TRUE)

## [1] 18.5

(f) ¿Cuántos estudiantes tienen edades menores o iguales a 20 años?


sum(x<=20, na.rm = TRUE)

## [1] 2

(g) Calcule la suma de las edades de los alumnos con edades menores o iguales a 20 años

4
sum(x[x<=20], na.rm = TRUE)

## [1] 37

(h) Calcule la suma de las edades cuyos valores son distintos a NAs
sum(x[!is.na(x)])

## [1] 60

Pregunta 3
Para un vector x definido como una secuencia de números de 1 a 10,
(a) Calcule la suma de los cuadrados del inverso de cada uno de sus elementos
x = 1:10 #crea vector del 1 al 10. Otra forma para crearlo es: x = seq(1,10,1)

sum((1/x)^2) #forma 1

## [1] 1.549768
sum((1/x)**2) #forma 2

## [1] 1.549768

(b) Calcule la suma acumulada de sus elementos


x= 1:10
cumsum(x)

## [1] 1 3 6 10 15 21 28 36 45 55

Pregunta: ¿Cuál es la diferencia entre cumsum(x) y sum(x)?

Pregunta 4
Calcule el retorno de un portafolio que contiene dos acciones, A y B, usando los vectores ret y pond que
contienen los retornos y ponderaciones, respectivamente.
ret <- c(5, 7) # retorno
pond <- c(0.4, 0.6) # ponderaciones

retorno_portafolio <- sum(ret * pond)


retorno_portafolio

## [1] 6.2
paste0("Retorno Portafolio ","= ", retorno_portafolio,"%")

## [1] "Retorno Portafolio = 6.2%"

5
#Otra forma de calcular el retorno del portafolio es usando una media ponderada:

paste0("Retorno Portafolio ","= ", weighted.mean(ret, pond),"%")

## [1] "Retorno Portafolio = 6.2%"

Pregunta 5
(a) Calcule el valor presente de un flujo de efectivo de $1000 por un total de diez períodos. Asuma una
tasa de descuento de 10%.

10
X 1000 1000
VP = = (1 − (1 + 0.1)−10 ) ≈ 6145
t=1
(1 + 0.1) t 0.1

r = 0.1 #tasa de descuento


flujo_efectivo = 1000 #flujo por período
n=10
periodo = 1:n #períodos

valor_presente <- sum(flujo_efectivo * (1 + r) ^ -periodo)


valor_presente

## [1] 6144.567
paste0("Valor Presente", "=","$", round(valor_presente,0)) #forma 1

## [1] "Valor Presente=$6145"


paste0("Valor Presente", "=","$", round((flujo_efectivo/r)*(1 - (1 + r) ^-n),0)) #forma 2

## [1] "Valor Presente=$6145"

(b) Calcule el valor presente neto de un flujo de efectivo de $300, $1200, $1000 y una inversión inicial de $900.
Asuma que las tasas de descuento para cada uno de los períodos son 10%, 20%, 15%, respectivamente.
En este caso, el valor presente neto se calcula como:

300 1200 1000


V P N = −900 + + + ≈ 940.58
1.1 1.1 × 1.2 1.1 × 1.2 × 1.15

# Tasa de interés
r <- c(0.1, 0.2, 0.15)

# Factores de descuento
yearly_discount_factors <- (1 + r) ^ - 1

discount_factors <- c(1 , cumprod(yearly_discount_factors))


discount_factors

## [1] 1.0000000 0.9090909 0.7575758 0.6587615

6
# Definir vector de flujos
cash_flow <- c(-900, 300, 1200, 1000)

# Calcular valor presente


VPN <- sum(cash_flow * discount_factors)

paste0("Valor Presente Neto", "=","$", round(VPN,0))

## [1] "Valor Presente Neto=$941"

Pregunta 6
Los flujos de efectivo de un proyecto se detallan en la siguiente tabla:

Período Flujo
0 -10000
1 -2000
2 500
3 1500
4 2500
5 5000
6 6500
7 9000
8 8500
9 9500
10 10000

(a) Calcule el número de períodos en que se recupera la inversión (payback period)


flujo <- c(-10000, -2000, 500, 1500, 2500, 5000, 6500, 9000, 8500, 9500, 10000) #flujo de efectivo

cumsum(flujo)

## [1] -10000 -12000 -11500 -10000 -7500 -2500 4000 13000 21500 31000
## [11] 41000
paste0("Payback period = ", min(which(cumsum(flujo) >= 0)) - 1)

## [1] "Payback period = 6"

(b) Calcule el payback period usando los flujos descontados a una tasa de descuento de 10%
r = 0.1 #tasa de descuento
n= length(flujo) - 1
periodo = 0:n #períodos

paste0("Payback period", " = ", min(which(cumsum(flujo * (1 + r) ^ -periodo)>=0))-1 )

## [1] "Payback period = 7"

7
Pregunta 7
Para los siguientes vectores a, b y c:
a <- c(0,10,-5)
b <- c(5,8,-4)
c <- c(0,1,-1)

(a) Defina un vector d que identifique los elementos del vector a que son menores a los correspondientes en
el vector b
d <- a<b
d

## [1] TRUE FALSE TRUE

(b) Asigne el segundo elemento del vector b a x


x <- b[2]
x

## [1] 8

(c) Defina un nuevo vector e que incluya el segundo y tercer elementos del vector a
e <- a[c(2,3)]
e

## [1] 10 -5

(d) Nombre L1, L2 y L3 el primero, segundo y tercer elementos del vector a


names(a) <- c("L1", "L2", "L3")
a

## L1 L2 L3
## 0 10 -5

A continuación comenzaremos a trabajar con matrices.

(e) Defina una matriz A cuyas filas son los vectores a, b y c


A <- rbind(a,b,c)
A

## L1 L2 L3
## a 0 10 -5
## b 5 8 -4
## c 0 1 -1
B <- cbind(a,b,c)
B

## a b c
## L1 0 5 0
## L2 10 8 1
## L3 -5 -4 -1

8
Pregunta 8
A partir de los siguientes vectores x e y,
x = c(3,2)
y = c(1,0)

(a) Defina una matriz W de 2x2 donde ambos vectores sean las filas de la matriz y una matriz Z donde
ambos vectores sean las columnas de la matriz.
W <- rbind(x,y) #vectores x e y son filas de la matriz
W

## [,1] [,2]
## x 3 2
## y 1 0
Z <- cbind(x,y) #vectores x e y son columnas de la matriz
Z

## x y
## [1,] 3 1
## [2,] 2 0

(b) Asigne a la matriz Z nombres a sus filas y columnas


rownames(Z) <- c("fila1", "fila2")
colnames(Z) <- c("columna1", "columna2")
Z

## columna1 columna2
## fila1 3 1
## fila2 2 0

Pregunta 9
A partir del vector e = c(-1, 0, 2, 4, -2, 3), cree una matriz K de 3x2 y una matriz L de 2x3
e = c(-1, 0, 2, 4, -2, 3)
K = matrix(e, nrow=3, ncol=2, byrow = TRUE)
K

## [,1] [,2]
## [1,] -1 0
## [2,] 2 4
## [3,] -2 3
L = matrix(e, nrow=2, ncol=3)
L

## [,1] [,2] [,3]


## [1,] -1 2 -2
## [2,] 0 4 3

9
Pregunta: ¿Qué obtiene si escribe K = matrix(e, nrow=3, ncol=2), o bien, K = matrix(e,
nrow=3, ncol=2, byrow = FALSE)?

Pregunta 10
(a) Construya una matriz identidad de 4x4
Z = diag(4)
Z

## [,1] [,2] [,3] [,4]


## [1,] 1 0 0 0
## [2,] 0 1 0 0
## [3,] 0 0 1 0
## [4,] 0 0 0 1

(b) Construya una matriz de 10x2 cuyos elementos sean N A


matrix(NA, nrow = 10, ncol = 2)

## [,1] [,2]
## [1,] NA NA
## [2,] NA NA
## [3,] NA NA
## [4,] NA NA
## [5,] NA NA
## [6,] NA NA
## [7,] NA NA
## [8,] NA NA
## [9,] NA NA
## [10,] NA NA

Pregunta 11
A partir del vector z=(1,4,-1,3,-2), construya una matriz cuyos elementos de la diagonal principal correspondan
al vector z
z=c(1,4,-1,3,-2)
G=diag(z)
G

## [,1] [,2] [,3] [,4] [,5]


## [1,] 1 0 0 0 0
## [2,] 0 4 0 0 0
## [3,] 0 0 -1 0 0
## [4,] 0 0 0 3 0
## [5,] 0 0 0 0 -2

10
Pregunta 12
Para la siguiente matriz:
1 1 1
 

X= 3 −2 1 
2 1 −1
(a) Calcule la traspuesta e inversa
fila1=c(1,1,1)
fila2=c(3,-2,1)
fila3=c(2,1,-1)
X=rbind(fila1, fila2, fila3)
X

## [,1] [,2] [,3]


## fila1 1 1 1
## fila2 3 -2 1
## fila3 2 1 -1
t(X) #traspuesta de $X$

## fila1 fila2 fila3


## [1,] 1 3 2
## [2,] 1 -2 1
## [3,] 1 1 -1
solve(X) #inversa de $X$

## fila1 fila2 fila3


## [1,] 0.07692308 0.15384615 0.2307692
## [2,] 0.38461538 -0.23076923 0.1538462
## [3,] 0.53846154 0.07692308 -0.3846154

(b) Almacene el elemento (3, 1) de la matriz X en a


a <- X[3,1]
a

## fila3
## 2

(c) Almacene la segunda fila en el vector b


b <- X[2,]
b

## [1] 3 -2 1

(d) Almacene los elementos (2, 3) y (3, 3) en el vector c


c <- X[c(2,3),3]
c

## fila2 fila3
## 1 -1

11
Pregunta 13
Use matrices para resolver los siguientes sistemas de ecuaciones:
(a)

a+b+c=6
3a − 2b + c = 2
2a + b − c = 1

Antes de resolver este sistema de ecuaciones, formula el problema en forma matricial en una
hoja de papel.
fila1=c(1,1,1)
fila2=c(3,-2,1)
fila3=c(2,1,-1)
k=c(6,2,1)
A=rbind(fila1,fila2,fila3)
solve(A)%*%k

## [,1]
## [1,] 1
## [2,] 2
## [3,] 3

(b)

3a + 4b − 5c + d = 10
2a + 2b + 2c − d = 5
a − b + 5c − 5d = 7
5a + d = 4
fila1=c(3,4,-5,1)
fila2=c(2,2,2,-1)
fila3=c(1,-1,5,-5)
fila4=c(5,0,0,1)
k=c(10,5,7,4)
X=rbind(fila1,fila2,fila3,fila4)
solve(X)%*%k

## [,1]
## [1,] 1.2477876
## [2,] 1.0176991
## [3,] -0.8849558
## [4,] -2.2389381

En la siguiente pregunta trabajaremos con listas.

12
Pregunta 14
(a) Genere una lista que consista del vector A igual a {8, 12, 16,. . . , 36}, un vector B que contenga las
palabras hola y ¿Cómo estás? y una matriz identidad de 3x3 denominada C
lista_elem = list(A=seq(8, 36, 4), B=c("hola","¿Cómo estás?"), C=diag(3))
lista_elem

## $A
## [1] 8 12 16 20 24 28 32 36
##
## $B
## [1] "hola" "¿Cómo estás?"
##
## $C
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1

(b) Asigne ¿Cómo estás? a s


s = lista_elem[["B"]][2]
s

## [1] "¿Cómo estás?"

Pregunta 15
Genere un vector denominado fecha que contenga las fechas de los primeros cinco días del mes de marzo del
2020, definidas con el formato yyyy-mm-dd (ISO 8601 ¿A qué se refieren estas normas ISO?). A continuación
construya un tibble con las siguientes columnas a partir del vector fecha:
• Día de la columna fecha
• Mes de la columna fecha
• Año de la columna fecha
Nota: En esta pregunta deberá instalar los paquetes tibble y lubridate ¿Cómo debe instalarlo?
(Ver documento introductorio)
library(tibble)
library(lubridate) #trabaja con fechas
fecha <- seq(as.Date("2020-03-01"), as.Date("2020-03-05"), by="days")

tibble(fecha, dia = day(fecha), mes = month(fecha), agno = year(fecha))

## # A tibble: 5 x 4
## fecha dia mes agno
## <date> <int> <dbl> <dbl>
## 1 2020-03-01 1 3 2020
## 2 2020-03-02 2 3 2020
## 3 2020-03-03 3 3 2020
## 4 2020-03-04 4 3 2020
## 5 2020-03-05 5 3 2020

13
A continuación escriba lo siguiente:

fecha

## [1] "2020-03-01" "2020-03-02" "2020-03-03" "2020-03-04" "2020-03-05"


class(fecha) # ¿Qué tipo de vector es fecha?

## [1] "Date"
as.numeric(fecha) #¿Qué significan los números que obtiene?

## [1] 18322 18323 18324 18325 18326


#¿Qué fecha se representa con el número cero?

En la siguiente pregunta trabajaremos con dataframes/tibbles.

Pregunta 16
La siguiente tabla presenta las ventas mensuales de 3 productos:

mes producto1 producto2


Ene $1,000 $1,000
Feb $3,000 $2,000
Mar $6,000 $3,000
Abr $9,000 $5,000

(a) Construya dicha tabla como un data frame


mes <- c("Ene", "Feb", "Mar", "Abr")
producto1 <- c("$1,000","$3,000","$6,000","$9,000")
producto2 <- c("$1,000","$2,000","$3,000","$5,000")
ventas <- data.frame(mes,producto1,producto2)
ventas

## mes producto1 producto2


## 1 Ene $1,000 $1,000
## 2 Feb $3,000 $2,000
## 3 Mar $6,000 $3,000
## 4 Abr $9,000 $5,000
(b) Transforme las variables relacionadas a ventas a formato numérico
Acá necesitaremos eliminar el signo $ y ,. Para lograr este objetivo empezaremos a trabajar con varios
paquetes incluidos tidyverse https://www.tidyverse.org/
• tibble
• dplyr
• readr
• tidyr
• ggplot2
• stringr
• forcats

14
• purrr
A continuación se presentan 4 verbos del paquete dplyr (https://cran.r-project.org/web/packages/dplyr/
dplyr.pdf) que se usarán mucho en manipulación de datos:
• filter
• select
• arrange
• mutate
library(dplyr) #manipulación de datos
library(stringr) #manipulación de strings

ventas <- ventas %>% mutate(


producto1=str_replace_all(producto1,"[\\$\\,]", ""), #elimina $ y ,
producto2=str_replace_all(producto2,"[\\$\\,]", ""),
)

ventas$producto1 = as.numeric(ventas$producto1) #formato numérico


ventas$producto2 = as.numeric(ventas$producto2)
ventas

## mes producto1 producto2


## 1 Ene 1000 1000
## 2 Feb 3000 2000
## 3 Mar 6000 3000
## 4 Abr 9000 5000
(c) Calcule estadística descriptiva básica de las ventas de cada uno de los productos
summary(ventas)

## mes producto1 producto2


## Abr:1 Min. :1000 Min. :1000
## Ene:1 1st Qu.:2500 1st Qu.:1750
## Feb:1 Median :4500 Median :2500
## Mar:1 Mean :4750 Mean :2750
## 3rd Qu.:6750 3rd Qu.:3500
## Max. :9000 Max. :5000
(d) Describa la estructura del dataframe definido en (a)
str(ventas) #forma 1

## 'data.frame': 4 obs. of 3 variables:


## $ mes : Factor w/ 4 levels "Abr","Ene","Feb",..: 2 3 4 1
## $ producto1: num 1000 3000 6000 9000
## $ producto2: num 1000 2000 3000 5000
glimpse(ventas) #forma 2 - parte de dplyr

## Observations: 4
## Variables: 3
## $ mes <fct> Ene, Feb, Mar, Abr
## $ producto1 <dbl> 1000, 3000, 6000, 9000
## $ producto2 <dbl> 1000, 2000, 3000, 5000
(e) Presente las primeras tres y últimas dos observaciones del dataframe ventas

15
head(ventas, n=3)

## mes producto1 producto2


## 1 Ene 1000 1000
## 2 Feb 3000 2000
## 3 Mar 6000 3000
tail(ventas, n=2)

## mes producto1 producto2


## 3 Mar 6000 3000
## 4 Abr 9000 5000
(f) Defina la tabla definida al comienzo de esta pregunta como tibble llamado sales
sales <- as_tibble(ventas)
class(sales)

## [1] "tbl_df" "tbl" "data.frame"


sales

## # A tibble: 4 x 3
## mes producto1 producto2
## <fct> <dbl> <dbl>
## 1 Ene 1000 1000
## 2 Feb 3000 2000
## 3 Mar 6000 3000
## 4 Abr 9000 5000
(g) Construya una tabla con las observaciones de las variables mes y producto2
producto2 <- sales %>% select(mes, producto2)
producto2

## # A tibble: 4 x 2
## mes producto2
## <fct> <dbl>
## 1 Ene 1000
## 2 Feb 2000
## 3 Mar 3000
## 4 Abr 5000
(h) Construya una tabla con las ventas de los meses de Enero y Marzo
sales %>% filter(mes=="Ene" | mes=="Mar")

## # A tibble: 2 x 3
## mes producto1 producto2
## <fct> <dbl> <dbl>
## 1 Ene 1000 1000
## 2 Mar 6000 3000
(i) Construya una variable ventastot que sea igual a las ventas mensuales totales de los 3 productos
sales <- sales %>% mutate(ventastot = producto1 + producto2)
sales

## # A tibble: 4 x 4
## mes producto1 producto2 ventastot
## <fct> <dbl> <dbl> <dbl>

16
## 1 Ene 1000 1000 2000
## 2 Feb 3000 2000 5000
## 3 Mar 6000 3000 9000
## 4 Abr 9000 5000 14000
(j) Genere una variable que toma el valor “alto” si las ventas mensuales son mayores al promedio de ventas
del período Enero-Abril, e igual a “bajo”, si no son mayores.
promedio_ventas <- mean(sales$ventastot, na.rm = TRUE)
sales <- sales %>% mutate(mayor = ifelse(ventastot > promedio_ventas, "alto", "bajo"))
sales

## # A tibble: 4 x 5
## mes producto1 producto2 ventastot mayor
## <fct> <dbl> <dbl> <dbl> <chr>
## 1 Ene 1000 1000 2000 bajo
## 2 Feb 3000 2000 5000 bajo
## 3 Mar 6000 3000 9000 alto
## 4 Abr 9000 5000 14000 alto
(k) ¿Cuántos meses tienen ventas totales mayores a $15000?
nrow(subset(sales, ventastot > 15000)) #forma 1

## [1] 0
sales %>% filter(ventastot > 15000) %>% count() #forma2

## # A tibble: 1 x 1
## n
## <int>
## 1 0
(l) Guarde sales con extensión .csv
library(readr)
write_csv(sales, path = "/cloud/project/solución/sales.csv")

17
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 2
Profesor: Víctor Macías E.

Paquete “jsonlite”
JSON (JavaScript Object Notation) y XML (eXtensible Markup Language) son formatos de archivo que
son usados ampliamente para transferir datos en la web. Para trabajar con archivos json se usa el paquete
jsonlite, el cual se describe en el siguiente link: https://cran.r-project.org/web/packages/jsonlite/jsonlite.pdf
A continuación se presentan dos ejemplos de creación de un archivo json, lectura del archivo y transformación
a un data frame.

Ejemplo 1:

library(jsonlite)
ventas <- '{"Mes": ["Enero", "Febrero", "Marzo"],
"Producto_1": [1000, 2000, 1300],
"Producto_2": [3000, 2800, 2000]}'
ventas_json <- fromJSON(ventas)
ventas_df <- as.data.frame(ventas_json)
ventas_df

## Mes Producto_1 Producto_2


## 1 Enero 1000 3000
## 2 Febrero 2000 2800
## 3 Marzo 1300 2000

Ejemplo 2:

library(jsonlite)
ventas <- '[{"Mes": "Enero", "Producto_1": 1000, "Producto_2": 3000},
{"Mes": "Febrero", "Producto_1": 2000, "Producto_2": 2800},
{"Mes": "Marzo", "Producto_1": 1300, "Producto_2": 2000}]'
ventas_df <- fromJSON(ventas)
ventas_df

## Mes Producto_1 Producto_2


## 1 Enero 1000 3000
## 2 Febrero 2000 2800
## 3 Marzo 1300 2000

1
Paquete “tidyverse”
El paquete tidyverse consiste de un conjunto de paquetes. Para una descripción detallada se recomienda
revisar la siguiente página: https://www.tidyverse.org/.
Entre los paquetes que son parte de tidyverse y que permiten la importación de datos en varios formatos, se
encuentran:
• readr (https://readr.tidyverse.org/)
• readxl (https://readxl.tidyverse.org/)
• haven (https://haven.tidyverse.org/)

readr

Comando Formato
read_csv valores separados por coma (csv)
read_csv2 valores separados por punto y coma (csv)
read_tsv valores delimitados por tab (tsv)
read_delim formato de archivo de texto general

readxl

Comando Formato
read_excel autodetecta el formato (xls, xlsx)
read_xls formato antiguo (xls)
read_xlsx formato nuevo (xlsx)

Notas:
1. Si un archivo excel contiene más de una hoja puede usarse la función excel_sheets para identificar la
hoja que nos interesa y luego agregar como argumento el nombre de la hoja a importar.
2. Para chequear cómo están separados los valores y si el archivo contiene un header se puede usar
read_lines.

haven

Comando en R Formato
read_dta Stata
read_sav SPSS
read_sas SAS

Paquete “tidyquant”:
Este es uno de los paquetes más usados en el modelamiento de series de tiempo financieras. Para una
descripción detallada se recomienda revisar la siguiente página: https://cran.r-project.org/web/packages/
tidyquant/tidyquant.pdf

2
Paquete “data.table”:
Este paquete se utiliza para manipulación de datos, pero también para importar datos, especialmente archivos
muy grandes. Uno de sus atractivos más importantes es su gran rapidez. Para una descripción detallada, se
recomienda ir al siguiente link https://cran.r-project.org/web/packages/data.table/data.table.pdf

Paquete “WDI”:
“World Development Indicators” (WDI) constituye el principal conjunto de indicadores de desarrollo del
Banco Mundial que se extiende desde 1960 a la actualidad. Los datos se recolectan de diferentes fuentes
internacionales reconocidas oficialmente y se pueden obtener de la siguiente página:
https://data.worldbank.org/products/wdi
Cada indicador tiene su propio código. Por ejemplo, las primeras 10 variables que incluyen en su nombre
“gdp per cápita”, se pueden obtener con el siguiente comando:
WDIsearch(‘gdp per capita’)[1:10,]
Estos datos pueden ser importados a R, usando varios paquetes, según se detalla a continuación:
"The WDI module and wbstats module offer excellent options for reading World Bank data
directly into R, and both packages integrate with ggplot2 for graphing. Other option is to use the
Quandl package, which also provides access to data sources from many other organizations.
The rWBclimate package provides access to the climate data api".
Para bajar estos datos usaremos el paquete WDI.

3
Pregunta 1
Importe a R los datos de ventas de los productos 1 y 2, usados en el ejercicio 16 de la guía 1 que se encuentran
grabados como sales.csv
rm(list = ls())
library(readr)
sales <- read_csv("/cloud/project/datos/sales.csv")
sales

Pregunta 2
Importe a R los datos de mortalidad para menores de 5 años en Argentina, Brazil, Chile, China y Estados
Unidos en el período 1970-2016 en el archivo mortality_under_five.xls.
rm(list = ls())
library(tidyr)
library(readxl) # leer excel file
library(dplyr)
excel_sheets("/cloud/project/datos/mortality_under_five.xls")

mortalidad_orig <- read_excel("/cloud/project/datos/mortality_under_five.xls",


sheet = "Data")
mortalidad_orig

mortalidad_1 <- mortalidad_orig %>% gather(key = year, value = mortalidad, -country)


mortalidad_1

Pregunta 3
Importe los datos del archivo Guns.dta que son usados en el libro “Introduction to Econometrics” de James
Stock y Mark Watson. A continuación se describen los datos:
Guns is a balanced panel of data on 50 US states, plus the District of Columbia (for a total of 51
“states”), by year for 1977 – 1999. Each observation is a given state in a given year. There are a
total of 51 states × 23 years = 1173 observations. These data were provided by Professor John
Donohue of Stanford University and were used in his paper with Ian Ayres: “Shooting Down the
‘More Guns Less Crime’ Hypothesis” Stanford Law Review, 2003, Vol. 55, 1193-1312.

4
rm(list = ls())
library(dplyr)
library(haven)
guns <- read_dta("/cloud/project/datos/Guns.dta")
glimpse(guns)

Pregunta 4
Obtenga datos del precio de la acción de Facebook para el período 01/01/2015 hasta el 02/04/2020 desde
Yahoo! Finance.
rm(list = ls())
library(tidyquant)
fb <- tq_get("FB", get = "stock.prices", from = "2015-01-01", to = "2020-04-02")

Pregunta 5
Usando el paquete WDI, obtenga datos de población, expectativa de vida al nacer y PIB per cápita ajustado
por paridad de poder de compra para todos los países incluidos en la base de datos en el período 1960-2019.
rm(list = ls())
library(dplyr)
library(WDI)
#Población - SP.POP.TOTL
#Expectativa de vida al nacer (Años) - SP.DYN.LE00.IN
#PIB per cápita - NY.GDP.PCAP.PP.CD

wbData = WDI(
indicator=c("SP.POP.TOTL", "SI.POV.GINI", "SP.DYN.LE00.IN", "NY.GDP.PCAP.PP.CD"),
country="all", extra = TRUE, start=1960, end=2019)

saveRDS(wbData, "/cloud/project/datos/wbData2019.rds" )

5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 3
Profesor: Víctor Macías E.

“Exploratory data analysis can never be the whole story, but nothing else can serve as the
foundation stone”.

John Tukey

En esta guía usaremos los datos de población, expectativa de vida al nacer y PIB per cápita obtenidos de
“World Development Indicators” (WDI) en la Guía de Ejercicios 2.
library(dplyr)

wbData1 <- readRDS("/cloud/project/datos/wbData2019.rds")

Pregunta 1
Nombre a las variables SP.POP.TOTL,SP.DYN.LE00.IN y NY.GDP.PCAP.PP.CD como population, lifeEx-
pectancy y gdppc, respectivamente.
wbData2 <- wbData1 %>% rename(population= SP.POP.TOTL,
lifeExpectancy = SP.DYN.LE00.IN,
gdppc = NY.GDP.PCAP.PP.CD,
gini = SI.POV.GINI)

Pregunta 2
Ordene los datos en orden ascendente primero por country y luego por year
wbData2 <- wbData2 %>% arrange(country, year)

Pregunta 3
Cambie los nombres de las regiones a español. Por ejemplo, cambie la región “Middle East & North Africa” a
“Medio Oriente y Norte de Africa”.

1
wbData2 <- wbData2 %>%
mutate(region = recode(region,
"East Asia & Pacific" = "Este Asiático y Pacífico",
"Europe & Central Asia" = "Europa y Asia Central" ,
"Latin America & Caribbean " = "América Latina y el Caribe",
"Middle East & North Africa" = "Medio Oriente y Norte de Africa",
"North America" = "Norteamérica",
"South Asia" = "Asia del Sur",
"Sub-Saharan Africa " = "Africa Subsahariana"))

Pregunta 4
¿Cuántos países tiene la base de datos?
wbData3 <- wbData2 %>% filter(region != "Aggregates") %>% droplevels()

wbData3 %>% distinct(country) %>% count()

Pregunta 5
Identifique los 5 países con mayor población el año 2015
wbData3 %>% filter(year == 2015) %>%
select(country, population) %>%
arrange(desc(population)) %>% head(5)

Pregunta 6
Identifique los 10 países con menor PIB per cápita el año 2015
wbData3 %>% filter(year == 2015) %>% select(country, gdppc) %>%
arrange(gdppc) %>% head(10)

Pregunta 7
Para cada una de las regiones del mundo, determine los valores mínimos y máximos del PIB per cápita el
año 2015. Además, identifique los países con los mínimos y máximos del PIB per cápita en cada una de las
regiones.
wbData3 %>% filter(year==2015) %>% group_by(region) %>%
summarise(
gdppc_min=round(min(gdppc, na.rm = TRUE),0),
gdppc_max=round(max(gdppc, na.rm = TRUE),0))

wbData3 %>% filter(year ==2015) %>% group_by(region) %>%


summarise(gdppc_min=min(gdppc, na.rm = TRUE),
min_country = country[which(gdppc == gdppc_min)],

2
gdppc_max=max(gdppc, na.rm = TRUE),
max_country = country[which(gdppc == gdppc_max)])

Pregunta 8
Compare el PIB per cápita de Chile y Estados Unidos en 1990 y 2015
wbData3 %>% filter(year %in% c(1990,2015) & country %in% c("Chile","United States")) %>%
select(country, year, gdppc)

Pregunta 9
Calcule la media aritmética y desviación estándar del PIB per cápita del año 2015 para los países de América
Latina y el Caribe.
wbData3 %>% filter(region=="América Latina y el Caribe" & year==2015) %>%
summarise(gdppc_prom=mean(gdppc, na.rm = TRUE),
gdppc_sd=sd(gdppc, na.rm = TRUE))

Pregunta 10
Genere una variable que sea igual a la población en miles de personas
wbData4 <- wbData3 %>% mutate(pop1000=population/1000)

Pregunta 11
¿Cuántos missing values existen para las variables population, gdppc y lif eExpectancy?
wb <- wbData3 %>% select(population, gdppc, lifeExpectancy)
summary(wb)

wbData3 %>%
summarise_at(c("population", "gdppc", "lifeExpectancy"), funs(sum(is.na(.))))

saveRDS(wbData3, "/cloud/project/datos/wbData3.rds")

3
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 4
Profesor: Víctor Macías E.

Bibliografía obligatoria
Wickham, H. 2019. ggplot2: elegant graphics for data analysis.
https://ggplot2-book.org/

Tipos de gráficos
Trabajaremos con tres tipos de gráficos:
• Estáticos
• Interactivos
• Dinámicos

Paquetes
En esta guía usaremos varios paquetes para realizar gráficos. Sin embargo, el paquete ggplot2 constituirá la
base. Una descripción de este paquete se encuentra en los siguientes links:
https://cran.r-project.org/web/packages/ggplot2/ggplot2.pdf
https://ggplot2.tidyverse.org/
https://www.ggplot2-exts.org/
Otros paquetes que usaremos son: gridExtra, ggstance, ggthemes y ggrepel. Para una descripción de
estos paquetes ver:
https://cran.r-project.org/web/packages/gridExtra/gridExtra.pdf
https://cran.r-project.org/web/packages/ggstance/ggstance.pdf
https://cran.r-project.org/web/packages/ggthemes/ggthemes.pdf
https://cran.r-project.org/web/packages/ggrepel/ggrepel.pdf
Dado que en las últimas dos preguntas de esta Guía trabajaremos con gráficos interactivos, se recomienda
revisar una descripción del paquete plotly:
https://plot.ly/r/

1
ColorBrewer

Se recomienda revisar http://colorbrewer2.org

Tipo palette
Diverging BrBG, PiYG, PRGn, PuOr, RdBu, RdGy,
RdYlBu, RdYlGn, Spectral
Qualitative Accent, Dark2, Paired, Pastel1, Pastel2, Set1, Set2,
Set3
Sequential Blues, BuGn, BuPu, GnBu, Greens, Greys,
Oranges, OrRd, PuBu, PuBuGn, PuRd, Purples,
RdPu, Reds, YlGn, YlGnBu, YlOrBr, YlOrRd

2
Para responder las siguientes preguntas use los datos de población, expectativa de vida al nacer y PIB per
cápita obtenidos de “World Development Indicators” (WDI) en la Guía de Ejercicios 2 y que fue explorado
en la Guía 3.
library(dplyr)
library(ggplot2)
library(ggthemes)
#library(RColorBrewer)

wbData3 <- readRDS("/cloud/project/datos/wbData3.rds")

Pregunta 1
Grafique la expectativa de vida al nacer para Chile, Japón y Estados Unidos

wbData3 %>% filter(country %in% c("Chile", "Japan", "United States")) %>%


ggplot(aes(x = year, y = lifeExpectancy, color = country)) + geom_line()
85

80

75
lifeExpectancy

country
Chile
70 Japan
United States

65

60

1960 1980 2000 2020


year

Ejercicio 1: Incluya el layer theme_classic() ¿Qué obtiene?


Ejercicio 2: Reemplace color = country por linetype = country ¿Qué obtiene?
wbData3 %>% filter(country %in% c("Chile", "Japan", "United States")) %>%
ggplot(aes(x = year, y = lifeExpectancy, color = country)) +
geom_line(size=1.3) +
scale_x_continuous(breaks = seq(1960, 2016,10)) +
labs(title = "Expectativa de vida al nacer",
subtitle = "1960-2016",
caption = "Fuente: Elaboración propia en base a WDI",
x = "Año",
y = "Expectativa de vida al nacer (años)") +
scale_color_discrete(name = NULL, labels = c("Chile", "Japón", "Estados Unidos"))+
theme_economist()

3
Expectativa de vida al nacer
1960−2016

Chile Japón Estados Unidos


Expectativa de vida al nacer (años)

85

80

75

70

65

60

1960 1970 1980 1990 2000 2010


Año
Fuente: Elaboración propia en base a WDI

Ejercicio 3: Use otros themes que incluye el paquete ggthemes


Ejercicio 4: ¿Cómo incluir tus propios colores para la línea que representa cada país? (Ayuda: ver
scale_color_manual())
Ejercicio 5: ¿Cómo definir tus propias líneas para representar a cada país? (Ayuda: ver scale_linetype_manual())

wbData3 %>% filter(country %in% c("Chile", "Japan", "United States")) %>%


ggplot(aes(x = year, y = lifeExpectancy, color = country)) +
geom_line(size=1.3) +
scale_x_continuous(breaks = seq(1960, 2016,10)) +
labs(title = "Expectativa de vida al nacer",
subtitle = "1960-2016",
caption = "Fuente: Elaboración propia en base a WDI",
x = "Año",
y = "Expectativa de vida al nacer (años)") +
scale_color_discrete(name = NULL, labels = c("Chile", "Japón", "Estados Unidos"))+
theme(
rect = element_blank(),
axis.line.x = element_line(size = 1.2),
plot.title = element_text(family = "serif"),
plot.subtitle = element_text(family = "serif"),
plot.caption = element_text(family = "serif"),
legend.position = c(0.9, 0.3)
)

4
Expectativa de vida al nacer
1960−2016
85
Expectativa de vida al nacer (años)

80

75

70

Chile
65 Japón
Estados Unidos
60

1960 1970 1980 1990 2000 2010


Año
Fuente: Elaboración propia en base a WDI

Pregunta 2
Usando un diagrama de caja, compare la expectativa de vida al nacer entre las diferentes regiones del mundo
para el año 2015

wbData3 %>% filter(year == 2015) %>%


ggplot(aes(x = region, y = lifeExpectancy, fill = region)) +
geom_boxplot(show.legend = FALSE) +
labs(title = "Expectativa de vida al nacer por regiones del mundo",
subtitle ="2015",
x = NULL,
y = "Expectativa de vida al nacer (años)") +
coord_flip() +
theme_classic()

Pregunta 3
Usando un gráfico de dumbbell, muestre el cambio en la expectativa de vida al nacer entre los años 1970
y 2015 para los siguientes países: Chile, Argentina, Brazil, Bolivia, Perú, México, Colombia, Costa Rica y
Uruguay.

library(ggalt)
library(tidyr)

s <- wbData3 %>%


filter(country %in% c("Chile", "Argentina", "Brazil", "Bolivia",

5
"Peru", "Mexico", "Colombia", "Costa Rica", "Uruguay"),
year %in% c(1970, 2015)) %>%
select(country, year, lifeExpectancy) %>%
spread(year, lifeExpectancy) %>%
mutate(gap = `2015` - `1970`) %>%
arrange(desc(gap))

ggplot(s, aes(x = `1970`, xend = `2015`, y = reorder(country, gap))) +


geom_dumbbell(colour = "#d0d0e1",
size = 3,
colour_x = "#339933",
colour_xend = "#800000") +
labs(title = "Expectativa de vida al nacer (años)",
subtitle = "1970 vs 2015",
caption = "Fuente: Elaboración propia en base a WDI",
x = NULL,
y = NULL) +
geom_text(color="black", size=4, hjust= 1.6, family = "Bookman",
aes(x = `1970`, label = round(`1970`,0)))+
geom_text(aes(x = `2015`, label = round(`2015`,0)), family = "Bookman",
color="black", size=4, hjust= -0.6) +
theme(plot.title = element_text(size = 16, family = "Bookman"),
plot.subtitle = element_text(size = 14, family = "Bookman"),
axis.text.x = element_blank(),
axis.text.y = element_text(size = 12, family = "Bookman"),
axis.ticks = element_blank(),
panel.background = element_blank()
)

Pregunta 4
Construya un histograma que represente la distribución del PIB per cápita el año 2015

wbData3 %>% filter(year == 2015) %>%


ggplot(aes(x = gdppc)) +
geom_histogram(bins = 50, col = "#000000", fill = "#800000") +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
labs(title = "PIB per cápita alrededor del mundo",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Frecuencia") +
theme_classic()

Pregunta 5
Construya la función de distribución acumulada del PIB per cápita para el año 2015

6
wbData3 %>% filter(year==2015) %>%
ggplot(aes(x = gdppc)) +
stat_ecdf() +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000),
expand = c(0,0)) +
scale_y_continuous(expand = c(0,0)) +
labs(title = "PIB per cápita mundial 2015",
subtitle = "Distribución acumulada",
x = "PIB per cápita (miles de dólares)",
y = "Proporción") +
theme_classic()

Pregunta 6
Construya un gráfico de la región en el eje X y el PIB per cápita del año 2015 en el eje Y , representando
cada país por un punto.
wbData3 %>% filter(year==2015) %>%
ggplot(aes(x = region, y=gdppc, col = region))+
geom_point(alpha = 0.3, position = position_jitter(width = 0.2)) +
scale_colour_brewer(palette = "Dark2") +
labs(title = "PIB per cápita por región",
subtitle = "2015",
x = "",
y = "PIB per cápita") +
coord_flip() +
theme_classic() +
theme(legend.position = 'none')

Pregunta 7
Use un gráfico de dispersión de la expectativa de vida al nacer y PIB per cápita para el año 2015. Presente
también un gráfico en que el eje X sea logarítmica en base 10.
wbData3 %>% filter(year==2015) %>%
ggplot(aes(x=gdppc, y=lifeExpectancy, col=region))+
geom_point(alpha = 0.6) +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
scale_colour_brewer(name = NULL, palette = "Set1") +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic()

wbData3 %>% filter(year==2015) %>%


ggplot(aes(x = gdppc,y=lifeExpectancy, col=region))+
geom_point(alpha = 0.5) +
scale_x_log10() +

7
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares - escala logarítmica)",
y = "Expectativa de vida al nacer (años)") +
scale_colour_brewer(name ="", palette = "Set1") +
theme_classic()

Pregunta 8
Construya un gráfico de dispersión de la expectativa de vida al nacer y PIB per cápita para cada uno de los
años 1990, 2000 y 2015, incluyendo sólo a los países de América Latina y el Caribe. Use la misma escala para
representar los valores del eje Y.
wbData3 %>%
filter(year %in% c(1990, 2000, 2015) & region == "América Latina y el Caribe") %>%
ggplot(aes(x=gdppc, y=lifeExpectancy))+
geom_point(alpha = 0.6, col = "#800000") +
scale_x_continuous(limits = c(0, 50000),
labels = function(x) x/1000,
breaks = c(0,10000,20000, 30000, 40000)) +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic() +
facet_grid(cols = vars(year))

Pregunta 9
Genere un gráfico de dispersión interactivo de la expectativa de vida al nacer y PIB per cápita para el año
2015. Además, considere que el tamaño de cada punto sea proporcional a la población del país.
library(plotly)
p1 <- wbData3 %>% filter(year==2015) %>%
ggplot(aes(x= gdppc,y=lifeExpectancy, col=region, group = country))+
geom_point(aes(size = population), alpha = 0.6) +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
scale_size_area(name="", guide = FALSE, max_size = 12) +
scale_colour_brewer(name ="", palette = "Set1") +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "2015",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic()

ggplotly(p1)

8
Pregunta 10
Genere un gráfico de dispersión interactivo de la expectativa de vida al nacer y PIB per cápita para el período
1990-2016. Además, considere que el tamaño de cada punto sea proporcional a la población del país.
library(plotly)
p2 <- wbData3 %>% filter(year>=1990) %>%
ggplot(aes(x= gdppc,y=lifeExpectancy, col=region))+
geom_point(aes(size = population, frame=year, ids = country), alpha = 0.7) +
scale_x_continuous(labels = function(x) x/1000,
breaks = c(0,25000,50000,75000,100000, 125000)) +
scale_size_area(name="", guide = FALSE, max_size = 12) +
scale_color_brewer(name ="", palette = "Set2") +
labs(title = "Expectativa de vida al nacer versus PIB per cápita",
subtitle = "1990-2016",
x = "PIB per cápita (miles de dólares)",
y = "Expectativa de vida al nacer (años)") +
theme_classic()

ggplotly(p2) %>%
animation_opts(frame = 1000,
easing = "linear",
redraw = TRUE) %>%
animation_slider(
currentvalue = list(
prefix = "Año ",
font = list(color = "red", size = 20)
))

9
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 5
Profesor: Víctor Macías E.

En esta guía usaremos datos de la Encuesta Nacional de Empleo del Instituto Nacional de Estadísticas para
el trimestre Diciembre-Febrero 2020. Las bases de datos se encuentran disponibles en la siguiente página:
https://www.ine.cl/estadisticas/sociales/mercado-laboral/ocupacion-y-desocupacion
Además se recomienda revisar los siguientes documentos:
• Libro de Códigos Base de Datos de la Encuesta Nacional de Empleo (ENE) https://www.
ine.cl/docs/default-source/ocupacion-y-desocupacion/metodologia/espanol/libro-de-c%C3%
B3digos-base-ene-2020.pdf?sfvrsn=833eaacc_6
• Boletín Complementario Empleo Trimestral https://www.ine.cl/docs/default-source/ocupacion-y-desocupacion/
boletines/2020/pa%C3%ADs/bolet%C3%ADn-complementario-nacional-trimestre-m%C3%
B3vil-diciembre-2019---febrero-2020.pdf
• Metodología de la Encuesta Nacional de Empleo 2020

1
library(dplyr)
library(ggplot2)
library(treemapify)

ene <- readRDS("/cloud/project/datos/dic_feb2020.rds")

Pregunta 1
¿Cuántas observaciones tiene la base de datos? ¿Cuál es la unidad de observación? ¿Cuántas variables y de
qué tipo son? ¿Cuál variable identifica el factor de expansión?
glimpse(ene)

Pregunta 2
Construya un histograma que muestre la distribución por edades de la muestra.
ene %>% ggplot(aes(x = edad, y = ..density..)) + geom_histogram()

Pregunta 3
Construya una base que incluya sólo observaciones que pertenezcan a la población en edad de trabajar ¿Cuál
es el tamaño muestral de ocupados, desocupados e inactivos? Usando el factor de expansión trimestral
¿Cuántos ocupados, desocupados e inactivos se estima hay en el país?
# Población en edad de trabajar
pea <- ene %>% filter(!is.na(activ))

# Status ocupacional
pea <- pea %>% mutate(status_ocup = recode(activ,
"1" = "Ocupados",
"2" = "Desocupados",
"3" = "Inactivos"))
# Tamaño muestral por status ocupacional
pea %>% group_by(status_ocup) %>% tally() %>% mutate(prop_pea = n/sum(n)) %>% knitr::kable()

# Población estimada por status ocupacional


pea %>% group_by(status_ocup) %>% tally(wt = fact_cal) %>%
mutate(prop_pea = n/sum(n)) %>%
knitr::kable()

2
Pregunta 4
Represente la distribución porcentual de la población en edad de trabajar por status ocupacional (ocupados,
desocupados e inactivos) usando tres tipos de gráficos: torta, waffle y treemap
# Pie chart

pea %>% group_by(status_ocup) %>% tally(wt= fact_cal) %>% arrange(desc(n)) %>%


mutate(prop_pea = n*100/sum(n), lab.ypos = cumsum(prop_pea)-0.5*prop_pea) %>%
ggplot(aes(x = "", y = prop_pea, fill = status_ocup)) +
geom_bar(width = 1, stat = "identity", color = "white") +
coord_polar("y", start = 0) +
geom_text(aes(x= 1.2, y = lab.ypos, label = paste0(round(prop_pea,1), "%")),
color = "black", size = 3) +
scale_fill_manual(name = NULL, values = c("#FF8066", "#B0A8B9", "#D5CABD")) +
labs(title = "Distribución de la población en edad de trabajar",
subtitle = "2020",
caption =
"Fuente: Elaboración propia en base a la ENE para el trimestre Diciembre-Febrero.") +
theme_void()

# Waffle

library(waffle)

vals = c(`Ocupados`=58, `Inactivos`=37, `Desocupados`=5)


waffle(vals, rows = 10, size = 1,
colors = c("#D5CABD", "#B0A8B9", "#FF8066"),
title="Distribución de la fuerza de trabajo")

# Treemap

pea %>% group_by(status_ocup) %>% tally(wt= fact_cal) %>%


ggplot(aes(area = n, fill = status_ocup, label = status_ocup)) +
geom_treemap(show.legend = FALSE) +
geom_treemap_text(place = "topleft", min.size = 2, padding.y = grid::unit(1, "mm"), grow = FALSE) +
labs(title = "Distribución de la fuerza de trabajo",
subtitle = "2020",
caption = "Fuente: Elaboración propia en base a la ENE para el trimestre Diciembre-Febrero.") +
annotate(geom = "text", x = 0.51, y = 0.01, label = "58.2%", size = 7, color = "#6b6361") +
annotate(geom = "text", x = 0.97, y = 0.01, label = "36.9%", size = 7, color = "#6b6361") +
annotate(geom = "text", x = 0.98, y = 0.97, label = "4.9%", size = 7, color = "#6b6361") +
scale_x_continuous(limits = c(0, 1)) +
scale_y_continuous(limits = c(0, 1)) +
scale_fill_manual(values = c("#FF8066", "#B0A8B9", "#D5CABD")) +
theme(
axis.title = element_blank(),
axis.text = element_blank(),
axis.ticks = element_blank()
)

3
Pregunta 5
Usando un gráfico de barras compare las tasas de participación en la fuerza de trabajo de hombres y mujeres
# Creando variable ft = 1 si individuo pertenece a la fuerza de trabajo, =0 en otro caso
pea <- pea %>% mutate(ft = ifelse(status_ocup == "Ocupados" | status_ocup == "Desocupados", 1, 0))

# Reemplazando los valore numéricos de la variable sexo por Hombre o Mujer


pea <- pea %>% mutate(sexo = recode(sexo, "1" = "Hombre", "2" = "Mujer"))

pea %>% group_by(sexo) %>% summarise(tasa_particip = 100 * weighted.mean(ft, fact_cal)) %>%


ggplot(aes(x = sexo, y = tasa_particip)) +
geom_bar(position="dodge", stat="identity", fill = "#B0A8B9") +
scale_y_continuous(expand = c(0,0), limits = c(0,90)) +
geom_text(position = position_dodge(width= 0.8), aes(label= paste0(round(tasa_particip,1), "%"),
vjust = -0.4), size = 5) +
labs(title = "Tasa de participación por sexo",
subtitle = "2020",
caption = "Fuente: Elaboración propia en base a la ENE para el trimestre Diciembre-Febrero.") +
theme(
panel.background = element_blank(),
plot.title = element_text(size = 15),
plot.caption = element_text(size = 12),
axis.title = element_blank(),
axis.text.x = element_text(size = 15),
axis.text.y = element_blank(),
axis.line.x = element_line(size = 1, color = "#5e5a59"),
axis.ticks = element_blank(),
)

Pregunta 6
Use un gráfico de doughnut para mostrar la fracción del total de ocupados que son extranjeros.
pea <- pea %>% mutate(nacionalidad = ifelse(nacionalidad == 0, "Nacional", "Extranjero"))

data1 <- pea %>% filter(status_ocup == "Ocupados") %>% group_by(nacionalidad) %>%


tally(wt= fact_cal) %>%
arrange(desc(nacionalidad)) %>%
mutate(prop_extr = n*100/sum(n),
labelPosicion = cumsum(prop_extr) - 0.5*prop_extr,
label = paste0(nacionalidad, "\n", round(prop_extr,1), "%"))

ggplot(data1, aes(x = 2, y = prop_extr, fill= nacionalidad)) +


geom_bar(stat = "identity") +
geom_text(aes(x = 1, y=labelPosicion, label=label, color = nacionalidad), size=4) +
scale_fill_manual(values = c("#FF8066", "gray90")) +
scale_color_manual(values = c("#FF8066", "gray90")) +
coord_polar(theta="y", direction = -1) +
theme_void() +
xlim(0, 2.5) +
theme(legend.position = "none") +
annotate(geom = 'text', x = 0, y = 0, label = "2020", size = 8)

4
Pregunta 7
Use un gráfico de barras para mostrar la proporción de ocupados formales versus informales tanto para los
nacionales como los extranjeros.
pea <- pea %>% mutate(informalidad = ifelse(ocup_form == 1, "Formal", "Informal"))

data2 <- pea %>% filter(status_ocup == "Ocupados") %>%


group_by(nacionalidad, informalidad) %>%
tally(wt= fact_cal) %>%
group_by(nacionalidad) %>%
mutate(prop = n*100/sum(n))

data2 %>% ggplot(aes(x = nacionalidad, y = prop, fill = informalidad)) +


geom_bar(stat = "identity") +
geom_text(position = position_stack(vjust = 0.5), aes(label= paste0(round(prop,1), "%")
), size = 5) +
labs(title = "Proporción de ocupados informales para nacionales y extranjeros",
subtitle = "2020",
caption = "Fuente: Elaboración propia en base a la ENE para el trimestre Diciembre-Febrero.") +
scale_fill_manual(name = NULL, values = c("#FF8066", "#B0A8B9")) +
theme(
panel.background = element_blank(),
plot.title = element_text(size = 15),
plot.caption = element_text(size = 10),
axis.title = element_blank(),
axis.text.x = element_text(size = 15),
axis.text.y = element_blank(),
axis.line = element_blank(),
axis.ticks = element_blank(),
)

5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 6
Profesor: Víctor Macías E.

Libro: Geocomputation with R

Lovelace, R., Nowosad, J. y J. Muenchow. 2019. “Geocomputation with R”. CRC Press.
https://geocompr.robinlovelace.net/index.html

Entre los paquetes que existen para leer datos geográficos y construir mapas, se encuentran: rgdal, sp,
ggmap, tmap, rworldmap, chilemapas y leaflet. A continuación se presentan algunos recursos para el
aprendizaje:

rgdal

• https://cran.r-project.org/web/packages/rgdal/rgdal.pdf

sp

• https://cran.r-project.org/web/packages/sp/sp.pdf

1
ggmap

• https://cran.r-project.org/web/packages/ggmap/ggmap.pdf

tmap

• https://cran.r-project.org/web/packages/tmap/tmap.pdf
• https://cran.r-project.org/web/packages/tmap/vignettes/tmap-nutshell.html
• Para visualizar la paleta de colores: tmaptools::palette_explorer()
• Tennekes, M. 2018.“tmap: Thematic maps in R”. Journal of the Statistical Software, vol.84(6)
https://www.jstatsoft.org/article/view/v084i06/v84i06.pdf

rworldmap

• https://cran.r-project.org/web/packages/rworldmap/rworldmap.pdf
• Artículo: “rworldmap: a new R package for mapping global data” (South, A. (2011), The R Journal
Vol. 3/1, June)
https://journal.r-project.org/archive/2011-1/RJournal_2011-1_South.pdf

leaflet

• https://cran.r-project.org/web/packages/leaflet/leaflet.pdf
• https://rstudio.github.io/leaflet/
El paquete leaflet permite acceso a más de 100 fuentes de mapas. Por defecto, se usa OpenStreetMap. Si se
quiere acceder a otros tipos de mapas, revisarlos escribiendo names(providers).
library(leaflet)
library(dplyr)

# Ejercicio 1: Creando mapa mundial

leaflet() %>% addTiles()


# Ejercicio 2: Creando mapa mundial (provider = "CartoDB")

leaflet() %>% addProviderTiles(provider = "CartoDB")

# Ejercicio 3: Mapeando Casas Centrales de la universidades de Chile y Católica

data <- tibble(


loc = c("Universidad de Chile", "Universidad Católica"),
lon = c(-70.6509, -70.64),
lat = c(-33.4445, -33.4418))

leaflet() %>% addTiles() %>%


setView(lng = -70.6509, lat = -33.4445, zoom = 15) %>%
addMarkers(lng = data$lon, lat = data$lat, popup = data$loc)

2
Pregunta 1
Use el paquete leaflet para representar en un mapa de la comuna de Santiago los establecimientos educacionales
existentes el año 2018.
La lista de establecimientos se puede obtener del Directorio de Establecimientos Educacionales del Ministerio
de Educación, el cual se encuentra disponible en la siguiente página:
http://datos.mineduc.cl/dataviews/247363/vista-directorio-de-establecimientos-2018/
rm(list = ls())
library(readr)
library(dplyr)
library(stringr)
library(leaflet)

colegios <- read_csv("/cloud/project/datos/colegios2018.csv",


col_types = c(
LATITUD = "c",
LONGITUD = "c"
)
)

colegios$LATITUD <- as.numeric(str_replace_all(colegios$LATITUD, ",", "."))


colegios$LONGITUD <- as.numeric(str_replace_all(colegios$LONGITUD, ",", "."))

colegios$dependencia <- as.factor(colegios$COD_DEPE2)

colegios <- colegios %>%


mutate(dependencia = recode_factor(dependencia,
"1" = "Municipal",
"2" = "Part. Subvencionado",
"3" = "Part. Pagado",
"4" = "Corp. Admin. Delegada",
"5" = "Serv. Local Educación"))
pal <- colorFactor(palette = c("red", "blue", "black", "green", "orange"),
levels = c("Municipal", "Part. Subvencionado", "Part. Pagado",
"Corp. Admin. Delegada", "Serv. Local Educación"))

colegios %>% leaflet() %>% addTiles() %>%


addCircleMarkers(lng = ~LONGITUD, lat = ~LATITUD,
radius = 2, label = ~as.character(NOM_RBD), color = ~pal(dependencia)) %>%
addLegend(pal = pal,
values = c("Municipal", "Part. Subvencionado", "Part. Pagado",
"Corp. Admin. Delegada", "Serv. Local Educación"),
opacity = 0.5,
title = "Dependencia", position = "topright") %>%
setView(lng = -70.64, lat = -33.43, zoom = 14)

3
Pregunta 2
Usando los paquetes ggplot2 y chilemapas represente en un mapa el porcentaje de la población que tiene 65 y
más años en cada una de las comunas de las Región Metropolitana, según el Censo 2017.
rm(list = ls())
library(readxl)
library(chilemapas)
library(ggplot2)
library(dplyr)

# Datos censo 2017


RM65 <- read_excel("/cloud/project/datos/RM_mas65.xlsx",
col_types = c(
codigo_comuna = "text",
comuna = "text",
mas60 = "numeric"
))
RM <- mapa_comunas %>% left_join(codigos_territoriales,
by = c("codigo_comuna" = "codigo_comuna")) %>%
filter(nombre_region == "Metropolitana de Santiago")

# Merge entre datos censales y polígonos de chilemapas

rm <- RM %>% left_join(RM65, by = c("codigo_comuna" = "codigo_comuna"))

# Graficando polígonos
rm %>%
ggplot() +
geom_sf(aes(geometry = geometry, fill = mas65)) +
scale_fill_gradient(name = "% personas edades 60 y más", low = "white", high = "black") +
labs(title = "% personas 65 y más en comunas de la Región Metropolitana",
caption = "Fuente: Elaboración propia en base a Censo 2017") +
theme_void()

4
Pregunta 3
Usando el paquete leaflet represente en un mapa interactivo el porcentaje de la población que tiene 65 y más
años en cada una de las comunas de las Región Metropolitana, según el Censo 2017.
Para resolver este ejercicio deberá usar los polígonos de las comunas de la Región Metropolitana, los cuales
fueron obtenidos de la siguiente página:
http://geoine-ine-chile.opendata.arcgis.com/datasets/589bb9676dc04a18b2dced0d4b9043bf_6
En este caso, se usará un SpatialPolygonsDataFrame con la extensión shp que contiene la siguiente información:
• data: datos asociados con cada polígono
• polygons: coordenadas para representar los polígonos
• plotOrder: orden en el cual los polígonos son representados en el mapa
• bbox: bounding box para los datos geográficos (por ejemplo, un rectángulo)
• proj4string: sistema de referencia de coordenadas
rm(list = ls())
library(dplyr)
library(rgdal)
library(leaflet)

# Polígonos comunales
comunas_RM <- readOGR("/cloud/project/datos/limites_comunales/", "RM")

# Datos censo 2017


RM65 <- read_excel("/cloud/project/datos/RM_mas65.xlsx",
col_types = c(
codigo_comuna = "text",
comuna = "text",
mas60 = "numeric"
))
# Merge entre datos censales y polígonos

comunas_RM@data <- comunas_RM@data %>%


left_join(RM65, by = c("COMUNA" = "codigo_comuna"))

# Graficando polígonos

nc_pal <- colorNumeric(palette = "Oranges", domain = comunas_RM@data$mas65)

comunas_RM %>% leaflet() %>% addTiles() %>%


addPolygons(weight = 1, fillColor = ~nc_pal(mas65), fillOpacity = 1,
label = ~paste0(comuna,": ", round(mas65,1),"%"),
highlight = highlightOptions(weight = 5,
color = "black",
bringToFront = TRUE))

5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 7
Profesor: Víctor Macías E.

Pregunta 1
El archivo anscombe.dta contiene datos de 8 variables.
(a) Grafique la relación entre x e y
rm(list = ls())
library(ggplot2)
library(dplyr)
library(stargazer)
library(gridExtra)
library(haven)

anscombe <- read_dta("/cloud/project/datos/anscombe.dta")

g1 <- anscombe %>% ggplot(aes(x=x1, y=y1)) +


geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
geom_point(color="red") + theme_bw()
g2 <- anscombe %>% ggplot(aes(x=x2, y=y2)) +
geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
geom_point(color="red") + theme_bw()
g3 <- anscombe %>% ggplot(aes(x=x3, y=y3)) +
geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
geom_point(color="red") + theme_bw()
g4 <- anscombe %>% ggplot(aes(x=x4, y=y4)) +
geom_smooth(method = "lm", se=FALSE, color="black", formula = y ~ x) +
geom_point(color="red") + theme_bw()
grid.arrange(g1, g2, g3, g4, nrow=2, ncol=2)

(b) Use MCO para estimar el modelo y = β0 + β1 x + u para y1 y x1 , y2 y x2 , y3 y x3 y y4 y x4 .


m1 <- lm(y1 ~ x1, data = anscombe)
m2 <- lm(y2 ~ x2, data = anscombe)
m3 <- lm(y3 ~ x3, data = anscombe)
m4 <- lm(y4 ~ x4, data = anscombe)

stargazer(list(m1, m2, m3, m4),


type="latex", header = FALSE, float = FALSE)

1
Pregunta 2
La base de datos ceosal1 contiene información, correspondiente al año 1990, sobre 209 CEO. Los datos son
usados en el libro “Introducción a la econometría” de Jeffrey Wooldridge. La siguiente tabla presenta las
variables y su descripción contenida en esta base de datos.

Variable Descripción
salary salario de 1990 (miles de dólares)
pcsalary % cambio en salarios 1989-1990
sales ventas de la empresa en 1990 (millones de dólares)
roe ROE, promedio 1988-1990
pcroe % cambio en ROE, 1988-1990
ros retorno accionario, 1988-1990
indus =1 si firma pertenece al sector industrial
finance =1 si firma pertenece al sector financiero
consprod =1 si firma pertenece al retail
utility =1 si firma pertenece al sector transporte o
servicios de útilidad pública
lsalary logaritmo natural del salario
lsales logaritmo natural de las ventas

Usando estos datos se estimará el siguiente modelo que muestra la relación entre el rendimiento sobre el
capital (roe)1 y el sueldo anual que reciben los CEO (salary):

salary = β0 + β1 roe + u

donde el parámetro de interés es β1 que mide la variación del sueldo anual, en miles de dólares, que corresponde
a un incremento de un punto porcentual en el rendimiento sobre capital.
rm(list = ls())
library(ggplot2)
library(dplyr)
library(wooldridge)
library(stargazer)

(a) Esevatime el modelo especificado arriba usando Mínimos Cuadrados Ordinarios, considerando una
especificación con constante y otra sin constante
modelA <- lm(salary ~ roe, data = ceosal1) # modelo con constante
modelB <- lm(salary ~ 0 + roe, data = ceosal1) # modelo sin constante
summary(modelA)

stargazer(list(modelA, modelB), type = "latex", header = FALSE)

(b) Muestre la relación entre rendimiento sobre el capital y sueldos de los CEO, usando un gráfico de
dispersión, incluyendo la función de regresión muestral estimada en (a).
ggplot(ceosal1, aes(x = roe, y = salary)) + geom_point() +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(x = "Rendimiento sobre el capital (%)", y = "Salario CEO (miles de dólares)") +
theme(
panel.background = element_blank(),
1 El rendimiento sobre el capital se define en términos de utilidad neta como porcentaje de acciones comunes.

2
axis.line = element_line()
)

(c) Calcule los sueldos predichos por el modelo estimado y los residuos
ceosal1$PredSalary <- predict(modelA) # sueldo estimado
ceosal1$Residuo <- residuals(modelA) # residuos

(d) Muestre las primeras 7 observaciones de las variables salary, roe, salario predicho y residuos.
head(ceosal1[, c("salary","roe","PredSalary","Residuo")], n= 7)

(e) Calcule el intervalo de confianza para β1 usando un nivel de confianza de 90%, 95% y 99%
confint(modelA, "roe", level = 0.90)
confint(modelA, "roe", level = 0.95)
confint(modelA, "roe", level = 0.99)

(f) Estime el modelo por MCO usando la forma matricial del modelo de regresión lineal múltiple
y = ceosal1$salary
x = cbind(1, ceosal1$roe)

bhat = round(solve(t(x) %*% x) %*% t(x) %*% y, 3)


bhat

(g) Obtenga los errores estándar de β̂’s, usando la matriz de varianzas y covarianzas de β̂
round(diag(sqrt(vcov(modelA))),3)

(h) Calcule los errores estándar robustos a heterocedasticidad


library(sandwich)
round(diag(sqrt(vcovHC(modelA, type = "HC1"))),3)

Pregunta 3
En este ejemplo se usarán 526 observaciones sobre trabajadores en la base de datos wage1.dta 2 para estimar
los retornos a la educación. A continuación se presentan las variables incluidas en la base de datos:

Variable Descripción
wage Salario por hora (en dólares)
educ Años de educación
exper Años de experiencia potencial
tenure Años de trabajo con empleador actual
nonwhite =1 si la persona no es blanca
female =1 si persona es mujer
married =1 si persona es casada
numdep Número de dependientes
smsa =1 si persona reside en SMSA
northcen =1 si persona reside en zona Central Norte
south =1 si persona reside en zona Sur
west =1 si persona reside en zona Oeste

2 Estos datos también son usados en el libro “Introducción a la econometría” de Jeffrey Wooldridge

3
Variable Descripción
construc =1 si persona trabaja en construcción
ndurman =1 si persona trabaja en manufactura de no
durable
trcommpu =1 si persona trabaja en transporte,
comunicaciones y servicios públicos
trade =1 si persona trabaja en retail o comercio
mayorista
services =1 si persona trabaja en industria de servicios
profserv =1 si persona trabaja en industria de servicios
profesionales
profocc =1 si persona tiene ocupación profesional
clerocc =1 si persona tiene ocupación de tareas de oficina
servocc =1 si persona tiene ocupación de servicios
lwage logaritmo del salario
expersq cuadrado de la experiencia potencial
tenuresq cuadrado de años de trabajo con empleador actual

En este ejemplo se busca estimar el efecto de la variable educación sobre el salario para lo cual se incluyen 3
especificaciones. La especificación más simple sólo incluye la variable educ como regresor.

log(wage) = β0 + β1 educ + u

donde el parámetro de interés es β1 que mide el efecto de la variable educación (educ) sobre el salario (wage),
manteniendo constantes todos los otros factores que afectan a wage. En este caso, β1 mide los retornos a la
educación.
rm(list = ls())
library(wooldridge)

data(wage1)

(a) Replique los resultados de las estimaciones por Mínimos Cuadrados Ordinarios de distintas especifica-
ciones del modelo que se presentan en la siguiente tabla3 .
modelw_1 <- lm(log(wage) ~ educ, data = wage1)

modelw_2 <- lm(log(wage) ~ educ * female, data = wage1)


modelw_3 <- lm(log(wage) ~ educ * female + exper + I(exper^2) +
tenure + I(tenure^2), data = wage1)

stargazer(list(modelw_1, modelw_2, modelw_3), type = "latex", float =FALSE, header = FALSE)

(b) Calcule el R2 de la especificación (3) a partir del cuadrado del coeficiente de correlación entre los valores
observados del logaritmo de los salarios y los valores estimados a partir del modelo.
wage1$PredSalary <- predict(modelw_3) # sueldo estimado
paste0("R2 = ", round(cor(log(wage1$wage), wage1$PredSalary)^2,3))

(c) Realice un test de significancia global de la especificación (3) donde:

H0 : β 1 = β 2 = β 3 = β 4 = β 5 = β 6 = β 7 = 0
3 Se usará el paquete stargazer que produce tablas bien formateadas con los resultados de una regresión. Una descripción de

este paquete se encuentra en el siguiente link: https://cran.r-project.org/web/packages/stargazer/stargazer.pdf

4
y la hipótesis alternativa es que por lo menos uno de los βj es distinto de cero. Nota: Use el siguiente
estadígrafo de prueba:
R2 /k
2
∼ Fk,n−k−1
(1 − R )/(n − k − 1)
paste0("F Statistic = ", round(
(summary(modelw_3)$r.squared/7)/((1-summary(modelw_3)$r.squared)/(526-7-1)),2)
)
paste0("p-value = ", round(1-pf(58.37,7,518),3))

Por lo tanto, se rechaza H0 .


(d) Usando los resultados de la estimación de la especificación (3), ¿Existe evidencia contra la hipótesis de
que el retorno de la educación sea el mismo para hombres y mujeres?
No existe evidencia para rechazar la hipótesis que el retorno de la educación es el mismo para hombres y
mujeres.

5
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 9
Profesor: Víctor Macías E.

Pregunta 1
Construya un loop que itere sobre el vector (1, 2, 3, 4, 5, . . . , 10)
# Forma 1

for (i in seq(1,10,1)) {
cat("Iteración ", i, "\n")
#print(paste("Iteración", i))
}
# Forma 2

i=1
while (i<=10) {
print(paste("Iteración", i))
i=i+1
}

Pregunta 2
Genere un loop que itere sobre el vector que contiene a las letras A, B, C, D y E.
# Forma 1

#x=LETTERS[1:5]
x = c("A", "B", "C", "D", "E")
for (i in x) {
#print(i)
cat(i, "\n")
}
# Forma 2
i=1
while (i<=length(x)) {
cat(x[i], "")

1
i=i+1
}

Pregunta 3
Genere un loop que entregue el siguiente resultado:
0+1=1
1+2=3
2+3=5
3+4=7
4+5=9
# Forma 1

for (i in 0:4) {
cat(i,"+",i+1,"=", 2*i+1, "\n")
}

# Forma 2

#for (i in 1:5) {
# cat(i-1,"+",i,"=", 2*i-1, "\n")
#}

# Forma 3

#for (i in 0:4) {
# print(paste(i,"+",i+1,"=", 2*i+1))
#}

# Forma 4

#i=0
#while (i<=4) {
# cat(i,"+",i+1,"=", 2*i+1, "\n")
# i=i+1
#}

Pregunta 4
Construya un loop que itere sobre cada uno de los números que constituyen la secuencia {1, 2, 3, 4, 5, 6, 7, 8,
9, 10} y calcule el cuadrado del número si es menor o igual a 6, si es 7 o 9, que entregue el número 0 y, en
cualquier otro caso que entregue el número 2.
for (i in 1:10) {
if (i<=6) {
cat("El cuadrado del número", i, "es", i^2, "\n")
}
else if (i==7 | i==9) {

2
cat(0, "\n")
}
else {
cat(2, "\n")
}
}

Pregunta 5
Construya un loop que itere sobre cada uno de los números que constituyen la secuencia {1, 2, 3, . . . , 15} y
entregue un output que señale si el número es o no divisible por 6.
for (n in 1:15) {
if (n %% 6 == 0) {
print(paste(n, "es divisible por 6"))
#cat(n, "es divisible por 6", "\n")
}
else {
print(paste(n, "no es divisible por 6"))
#cat(n, "no es divisible por 6", "\n")
}
}

Pregunta 6
Construya un loop que genere la secuencia de Fibonacci la que se caracteriza porque cada número es la suma
de los dos números previos. Por ejemplo, 0,1,1,2,3,5,8,13,21,34,55,89,144,233
fib <- 0 #almacena secuencia de Fibonacci

fib[2] <- 1

i <- 1
while (i <= 12){
fib[i + 2] <- fib[i] + fib[i+1]
i <- i + 1
}
fib

Pregunta 7
Genere un tibble con las variables x e y y calcule la media aritmética de cada una de ellas.

x y
1 2
2 0
3 1
4 4
5 NA

3
# Forma 1
library(tibble)
df <- tibble(
x = 1:5,
y = c(2,0,1,4,NA)
)

for (i in 1:length(df)) {
promedio = mean(df[[i]], na.rm = TRUE)
cat(promedio, "es el promedio de la columna", i, "\n")
}
# Forma 2

library(dplyr)
df %>% summarise_all(list(mean), na.rm = TRUE)

Pregunta 8
Construya la siguiente matriz y genere un loop que imprima el mensaje de abajo.
 
2 4 0
X =  −1 9 6 
0 0 1

A = rbind(c(2,4,0), c(-1, 9,6), c(0,0,1))

for (i in 1:nrow(A)) {

for (j in 1:ncol(A)) {
print(paste("El elemento de la fila", i, " y columna ", j, "de la matriz A es", A[i,j]))
}
}

## [1] "El elemento de la fila 1 y columna 1 de la matriz A es 2"


## [1] "El elemento de la fila 1 y columna 2 de la matriz A es 4"
## [1] "El elemento de la fila 1 y columna 3 de la matriz A es 0"
## [1] "El elemento de la fila 2 y columna 1 de la matriz A es -1"
## [1] "El elemento de la fila 2 y columna 2 de la matriz A es 9"
## [1] "El elemento de la fila 2 y columna 3 de la matriz A es 6"
## [1] "El elemento de la fila 3 y columna 1 de la matriz A es 0"
## [1] "El elemento de la fila 3 y columna 2 de la matriz A es 0"
## [1] "El elemento de la fila 3 y columna 3 de la matriz A es 1"

4
Tópicos en Economía y Negocios utilizando R
Guía de Ejercicios 10
Profesor: Víctor Macías E.

En esta guía trabajaremos con funciones, lo que permitirá:


• Reducir la carga de trabajo de tareas repetitivas
• Disminuye la probabilidad de cometer errores en tareas repetitivas
• Se puede reusar el código en diferentes proyectos
Para ver los argumentos de una función se debe usar args() y entre paréntesis escribir el nombre de la función.
Por ejemplo,
args(median)

## function (x, na.rm = FALSE, ...)


## NULL
Para construir una función se deben especificar los argumentos, el nombre y un cuerpo que describa lo que
realiza la función.
nombre_funcion <- function(argumento1, argumento2,. . . ) {
# cuerpo
}

Pregunta 1
Contruya una función que entregue como output si un número es o no divisible por 6
div6 <- function(x) {
if (x %% 6 == 0) {
print(paste(x, "es divisible por 6"))
}
else {
print(paste(x, "no es divisible por 6"))
}
}

1
Pregunta 2
Construya una función denominada moneda que permita simular el lanzamiento de una moneda. Dicha
función debe tener dos argumentos: num que representa el número de lanzamientos y pcara es la probabilidad
de obtener una cara.
moneda <- function(num, pcara = 0.5) {
lado <- c("cara", "sello")
p <- c(pcara, 1-pcara)
sample(lado, num, replace = TRUE, prob = p)
}

Pregunta 3
Construya una función que para una tasa de crecimiento dada entregue el número de períodos que se necesitan
para que una variable doble su valor.
dos_a <- function(x) {
n <- log10(2)/log10(1+(x/100))
return(n)
}

Pregunta 4
Construya una función que entregue la media aritmética o media geométrica de un conjunto de datos.
avg <- function(x, arithmetic = TRUE) {
x = x[!is.na(x)]
n = length(x)
ifelse(arithmetic, sum(x)/n, prod(x)^(1/n))
}
v=c(4,5,6,NA,2)
avg(v, arithmetic = TRUE)
avg(v, arithmetic = FALSE)

Pregunta 5
Construya una función que entregue la media aritmética y desviación estándar de un conjunto de datos.
des <- function(x) {
x = x[!is.na(x)]
media = sum(x)/length(x)
sdesv = sqrt(sum((x-media)^2)/(length(x) - 1))
return(list(MEDIA= media, DESVIACION_ESTANDAR= sdesv))
}
v = c(1,10,6,4,3, NA, 19,2)
des(v)

2
Pregunta 6
Construya una función que permita graficar el valor de una máquina en el año t que es igual a:

At = A0 (1 − δ)t

donde At es el valor en el año t, A0 es el valor inicial y δ es la tasa de depreciación anual.


library(ggplot2)
library(dplyr)

depreciation <- function(precio, tasa, vida_util) {


t = seq(1,vida_util,1)
valor = precio*(1-tasa)^t

data=data.frame(t, valor)
data %>% ggplot() +
geom_line(aes(t,valor), size=1.2) +
labs(title =
paste0("Vida útil =", vida_util," años", "\n", "Tasa depreciación = ", tasa*100, "%"),
x = "Año",
y = "Valor de máquina ($)") +
theme(panel.background = element_blank(),
axis.line = element_line())
}

depreciation(400000, 0.2, 10)

Pregunta 7
Construya una función que permita calcular el valor presente neto (V P N ) de un flujo de efectivo.

T
X Ft
V PN =
t=0
(1 + r)t

donde Ft es el flujo en el período t, r es la tasa de descuento y T es el número total de períodos.

Ejemplo:

Considere los siguientes flujos de un proyecto:

Período Flujo ($)


0 -500000
1 100000
2 150000
3 180000
4 200000
5 300000

3
Si la tasa de descuento es 12% el valor presente neto es:
100000 150000 180000 200000 300000
V P N = −500000 + + + + + = 134317
(1 + 0, 12) (1 + 0, 12)2 (1 + 0, 12)3 (1 + 0, 12)4 (1 + 0, 12)5

vpn <- function(x,r) {


T <- length(x)
paste0("VPN = ", "$",round(sum(x*(1/(1+r))^(seq(0,T-1,1))),0))
}
flujo <- c(-500000,100000,150000,180000,200000,300000)
vpn(flujo, 0.12)

4
Tópicos en Economía y Negocios utilizando R

Guía de Ejercicios 11
Profesor: Víctor Macías E.

Distribuciones de variables aleatoria discretas

Distribución pmf cdf Cuantiles Número aleatorio


Bernoulli dbinom(x, 1, p) pbinom(x, 1, p) qbinom(q, 1, p) rbinom(R, 1, p)
Binomial dbinom(x, n, p) pbinom(x, n, p) qbinom(q, n, p) rbinom(R, n, p)
Poisson dpois(x, λ) ppois(x, λ) qpois(q, λ) rpois(R, λ)

Distribuciones de variables aleatorias continuas

Distribución pdf cdf Cuantiles Número aleatorio


Uniforme dunif (x, a, b) punif (x, a, b) qunif (q, a, b) runif (R, a, b)
Logística dlogis(x) plogis(x) qlogis(q) rlogis(R)
Exponencial dexp(x, λ) pexp(x, λ) qexp(q, λ) rexp(R, λ)
Normal dnorm(x, µ, σ) pnorm(x, µ, σ) qnorm(q, µ, σ) rnorm(R, µ, σ)
Normal dnorm(x) pnorm(x) qnorm(q) rnorm(R)
estándar
Log Normal dlnorm(x, m, s) plnorm(x, m, s) qlnorm(q, m, s) rlnorm(R, m, s)
χ2 dchisq(x, n) pchisq(x, n) qchisq(q, n) rchisq(R, n)
t dt(x, n) pt(x, n) qt(q, n) rt(R, n)
F df (x, m, n) pf (x, m, n) qf (q, m, n) rf (R, m, n)

1
rm(list = ls())
library(dplyr)
library(ggplot2)

Pregunta 1
Represente gráficamente la distribución normal para µ = 0 y σ = 1, 1.5, 2
data.frame(x=c(-6,6)) %>% ggplot(aes(x)) +
stat_function(fun=dnorm, args=list(mean=0, sd=1),
geom="line", colour="red", size=1.2) +
stat_function(fun=dnorm, args=list(mean=0, sd=1.5),
geom="line", colour="black", size=1.2) +
stat_function(fun=dnorm, args=list(mean=0, sd=2),
geom="line", colour="blue", size=1.2) +
ylab("Densidad") +
theme(
panel.background = element_blank(),
axis.line = element_line()
)

Pregunta 2
Sea z ∼ N (0, 1). Muestre gráficamente P r(1 ≤ z ≤ 2)

z=seq(-3,3,0.01)
densidad=dnorm(z)
dn = data.frame(z, densidad)

dn %>% ggplot(aes(z,densidad)) +
geom_line() +
geom_area(aes(x = ifelse(z>1 & z < 2, z, NA)), fill = "#8C446F") +
scale_x_continuous(expand = c(0,0)) +
scale_y_continuous(expand = c(0,0), limits = c(0, 0.5)) +
theme(
panel.background = element_blank(),
axis.line.x = element_line(),
axis.title.y = element_blank(),
axis.text.y = element_blank(),
axis.ticks.y = element_blank()
)

2
Pregunta 3
Grafique la siguiente función y = −x2 + 10x donde 0 ≤ x ≤ 10.
# Forma 1

x = seq(0,15,0.01)
y = -x^2 + 10*x
df <- data.frame(x,y)

df %>% ggplot(aes(x = x, y = y)) +


geom_line() +
scale_x_continuous(expand = c(0,0), limits = c(0,12)) +
scale_y_continuous(expand = c(0,0), limits = c(0,30),
breaks = c(10,20,30), labels = c(10,20,30)) +
theme(
panel.background = element_blank(),
axis.line = element_line()
)
# Forma 2

data.frame(x=c(0,10)) %>% ggplot(aes(x)) +


stat_function(fun=function(x){-x^2 + 10*x}, geom="line") +
scale_x_continuous(expand = c(0,0), limits = c(0,12)) +
scale_y_continuous(expand = c(0,0), limits = c(0,30),
breaks = c(10,20,30), labels = c(10,20,30)) +
theme(
panel.background = element_blank(),
axis.line = element_line()
)

Pregunta 4
La función de demanda es Qd = AP − , donde  es el valor absoluto de la elasticidad precio de la demanda.
Grafique la función de demanda para A = 5 y  = 1
A=5
eps=1

Q=seq(1,10,length=1000) # cantidad demandada


P=(A/Q)^(1/eps) # demanda inversa

data=data.frame(Q,P)
data %>% ggplot(aes(x = Q, y = P)) + geom_line(size=1.2) +
labs(x = "Cantidad demandada", y = "Precio") +
theme(
panel.background = element_blank(),
axis.line = element_line()
)

3
Pregunta 5
Las curvas de oferta y demanda de un mercado están representadas por:

P
Qs = −1
2

P
Qd = 15 −
2
Grafique estas curvas y determine el precio y cantidad de equilibrio usando uniroot()
demanda <- function(q) {30 - 2*q}
oferta <- function(q) {2*q + 2}
# Rango de cantidades
x <- 0:15
# Cantidad de equilibrio
q <- uniroot(function(x) demanda(x) - oferta(x), range(x))$root
# Precio de equilibrio
p <- oferta(q)
paste0("Precio de equilibrio es ", p, " y la cantidad de equilibrio es ", q)
ggplot(data.frame(x=c(0,15))) +
stat_function(fun = demanda, size = 1) +
stat_function(fun = oferta, size = 1) +
labs(x = "Cantidad", y = "Precio") +
scale_x_continuous(expand = c(0,0), breaks =c(5,10,15),
labels =c(5,10,15),
limits = c(0,18)) +
scale_y_continuous(expand = c(0,0), limits = c(0,32)) +
annotate("point", x = q, y = p, colour = "grey10", size = 2.5) +
annotate("segment", x = q, xend = q, y = 0, yend = p,
linetype = "dashed", color = "blue") +
annotate("segment", x = 0, xend = q, y = p, yend = p,
linetype = "dashed", color = "blue") +
annotate("text", x = 14.8, y = 3, label = "Demanda") +
annotate("text", x = 13, y = 30, label = "Oferta") +
theme(panel.background = element_blank(),
axis.line = element_line())

Pregunta 6
Represente gráficamente el camino aleatorio yt = yt−1 + t , donde t ∼ N (0, 1)
#set.seed(123)

y <- rep(NA,1000)
e <- rep(NA,1000)
y[1]=10

for (t in 2:1000) {
e[t] <- rnorm(1)
y[t] <- y[t-1]+e[t]
}

4
time <- 1:1000
data <-data.frame(time, y)
data %>% ggplot(aes(time, y)) + geom_line(size=0.8) +
theme(
panel.background = element_blank(),
axis.line = element_line()
)

Pregunta 7
Represente gráficamente los siguientes procesos ARIM A(p, d, q) (autoregressive integrated moving average)1 .
(a) Yt = t + 0.9t−1 (M A(1))
plot(arima.sim(list(order = c(0,0,1), ma = 0.9), n = 500))

(b) Yt = 1.3Yt−1 − 0.7Yt−2 + t (AR(2))


plot(arima.sim(list(order = c(2,0,0), ar = c(1.3,-0.7)), n = 500))

(c) Yt = 0.1Yt−1 − 0.9Yt−2 + t + 0.8t−1 (ARM A(2, 1) o ARIM A(2, 0, 1))


plot(arima.sim(model = list(order = c(2, 0, 1), ar = c(1, -.9), ma = .8), n = 500))

Pregunta 8
En un campus universitario de 1000 alumnos, dos alumnos fueron diagnosticados con una enfermedad
altamente contagiosa. Las autoridades universitarias se encuentran fuertemente preocupadas, ya que la
literatura científica evidencia una alta tasa de propagación.
Un especialista recomienda usar el siguiente modelo que describe la evolución del número de personas
contagiadas:

mt+1 = mt + k × mt × (1000 − mt )
donde mt es el número de personas contagiadas en el día t y k es un parámetro relacionado a la tasa de
contagio.
Si no se toman medidas, ¿Después de cuántos días se llega a aproximadamente 1000 contagiados? (Asuma
k = 0.001).
m <- rep(NA,15)
m[1] = 3 # contagiados en el periodo incicial
k = 0.001

for (t in 1:14) {
m[t+1] = m[t]+k*m[t]*(1000 - m[t])
}

time <- 1:15


data <-data.frame(time, m)
data %>% ggplot(aes(time, m)) + geom_line(size=1) +
1 Este tipo de modelos se usa comúnmente para realizar predicciones usando series de tiempo. La forma general para un

modelo ARIM A(p, d, q) es yt = c + φ1 yt−1 + · · · + φp yt−p + θ1 t−1 + · · · + θq t−q + t

5
scale_x_continuous(breaks = c(2,4,6,8,10,12,14,16), labels = c(2,4,6,8,10,12,14,16)) +
labs(x = "Número de días", y = "Número de personas contagiadas", title =
"Evolución número de contagiados") +
theme(
panel.background = element_blank(),
axis.line = element_line()
)

También podría gustarte