INSTRUCCIONES:

Resuelve los siguientes ejercicios prácticos utilizando R. Los ejercicios propuestos tienen distintas ponderaciones, y la calificación final de dicha actividad será dada a conocer en el espacio correspondiente de la plataforma Moodle. La ponderación se muestra al inicio o al final del respectivo enunciado del ejercicio.

IMPORTANTE:

El link de Rpubs https://rpubs.com/ o shinnyapp.io https://www.shinyapps.io/ correspondiente al reporte debe ser ser compartido en el respectivo espacio del curso dentro de la plataforma Moodle (https://conocer.cide.edu/). Favor de verificar que se haya compilado correctamente y que se pueda visualizar de manera pública. La fecha límite de envío es el 08-octubre-2021 a las 23:55 hrs, tiempo del centro de México. Al momento de compilar el archivo Markdown, se deben de mostrar las instrucciones, las salidas y una breve explicación del resultado.

Observaciones:

La base de datos descargada tiene descripción en los primeros renglones y notas al pie de la base, por lo que al importar la base de datos nos saltamos los primeros 4 renglones y le dimos un límite máximo de lectura de renglones para que se importara de manera correcta el archivo como se muestra a continuación:

sismos<- read.csv("C:/Users/Gerardo Ramos/OneDrive - Comisión Federal de Competencia Económica/Documents/CIDE METPOL/Manejo de bases de datos R/examen 1/SSNMX_catalogo_19800101_20210924.csv", skip = 4, nrows = 226764)
library(DT)
library(tidyverse)

EJERCICIO 1

Utilizando la información correspondiente a los sismos registrados por el Sistema Sismológico Nacional (SSN) en el periodo 01-01-1980 al 24-09-2021, disponible en

http://www2.ssn.unam.mx:8080/catalogo/

calcular:

1. El total de sismos detectados por mes. (10%)

Solución

En esta tabla se resume la cantidad de sismos que hubo en el periodo analizado por cada mes del año. Ocupamos la librería lubridate para poder extraer el mes de la variable fecha y tabulamos los resultados. Posteriormente, presentamos una tabla dinámica que permite filtrar, ya sea por mes o por cantidad de sismos. Lo que añade un valor adicional porque podemos observar que en el mes que hubo más sismos fue en el mes 9 que corresponde a Septiembre.

library(lubridate)
a<-as.data.frame(table(month(sismos$Fecha)))
colnames(a)<-c("Mes","Sismos")
datatable(a ,class = 'cell-border stripe', )

\[Fuente:\ Elaboración\ propia\ con\ información\ del\ Sistema\ Sismológico\ Nacional.\]

2. El total de sismos detectados por cada estado de la república. (15%)

Solución

En este ejercicio extraje el Esatdo y el municipio de la variable referencia de localización, lo que al realizar un análisis de cuántos Estados únicos había en la base noté que había uno demás, por lo que procedí a identificar el error de origen y realicé una limpieza e imputación de los Nombres de los Estados tomando como referencia al INEGI.

Una vez realizada la limpieza procedí a crear una tabla dinámica para ver los resultados de cuántos sismos ha habido por Estado.

sis2<-as.data.frame(str_split_fixed(sismos$Referencia.de.localizacion, "de ", n = 2))
sis2<-sis2[-1]
sis2<-as.data.frame(str_split_fixed(sis2$V2, ",", 2))
colnames(sis2)<-c("Municipio","Estado")

sis2[2]<- as.data.frame(gsub("(^ +| +$)", "",sis2[[2]]))

unique(sis2$Estado)
##  [1] "MICH" "CHIS" "OAX"  "GRO"  "TAB"  "MEX"  "COL"  "NAY"  "BC"   "PUE" 
## [11] "MOR"  "QR"   "BCS"  "VER"  "CDMX" "JAL"  "SIN"  "SON"  "CAMP" "HGO" 
## [21] "SLP"  "TLAX" "GTO"  "COAH" "TAMS" "NL"   "QRO"  "CHIH" "ZAC"  "YUC" 
## [31] "DGO"  "AGS"  "N"
sis2$Estado[which(sis2$Estado=="N")]<- "NL"

sismos2<- cbind(sismos,sis2)
unique(sis2$Estado)
##  [1] "MICH" "CHIS" "OAX"  "GRO"  "TAB"  "MEX"  "COL"  "NAY"  "BC"   "PUE" 
## [11] "MOR"  "QR"   "BCS"  "VER"  "CDMX" "JAL"  "SIN"  "SON"  "CAMP" "HGO" 
## [21] "SLP"  "TLAX" "GTO"  "COAH" "TAMS" "NL"   "QRO"  "CHIH" "ZAC"  "YUC" 
## [31] "DGO"  "AGS"
nom_est<-c("Aguascalientes","Baja California","Baja California Sur","Campeche","Ciudad de México","Chihuahua","Chiapas","Coahuila de Zaragoza","Colima","Durango","Guerrero","Guanajuato","Hidalgo","Jalisco","México","Michoacán de Ocampo","Morelos","Nayarit","Nuevo León","Oaxaca","Puebla","Quintana Roo","Querétaro","Sinaloa","San Luis Potosí","Sonora","Tabasco","Tamaulipas","Tlaxcala","Veracruz de Ignacio de la Llave","Yucatán","Zacatecas")

est<-c("MICH","CHIS","OAX" ,"GRO","TAB","MEX","COL","NAY","BC" ,"PUE","MOR","QR","BCS","VER","CDMX","JAL","SIN","SON","CAMP","HGO",
"SLP","TLAX","GTO","COAH","TAMS","NL","QRO","CHIH","ZAC","YUC","DGO","AGS")

est<-sort(est)

catalogo<-as.data.frame(cbind(est,nom_est))
as.data.frame(catalogo)
##     est                         nom_est
## 1   AGS                  Aguascalientes
## 2    BC                 Baja California
## 3   BCS             Baja California Sur
## 4  CAMP                        Campeche
## 5  CDMX                Ciudad de México
## 6  CHIH                       Chihuahua
## 7  CHIS                         Chiapas
## 8  COAH            Coahuila de Zaragoza
## 9   COL                          Colima
## 10  DGO                         Durango
## 11  GRO                        Guerrero
## 12  GTO                      Guanajuato
## 13  HGO                         Hidalgo
## 14  JAL                         Jalisco
## 15  MEX                          México
## 16 MICH             Michoacán de Ocampo
## 17  MOR                         Morelos
## 18  NAY                         Nayarit
## 19   NL                      Nuevo León
## 20  OAX                          Oaxaca
## 21  PUE                          Puebla
## 22   QR                    Quintana Roo
## 23  QRO                       Querétaro
## 24  SIN                         Sinaloa
## 25  SLP                 San Luis Potosí
## 26  SON                          Sonora
## 27  TAB                         Tabasco
## 28 TAMS                      Tamaulipas
## 29 TLAX                        Tlaxcala
## 30  VER Veracruz de Ignacio de la Llave
## 31  YUC                         Yucatán
## 32  ZAC                       Zacatecas
colnames(catalogo)<-c("Estado","Nombre_Estado")

sis3<-left_join(x= sis2,y= catalogo )

sismos2<-cbind(sismos,sis3)

c<-as.data.frame(table(sismos2$Nombre_Estado))

datatable(c, class = 'cell-border stripe')

\[Fuente:\ Elaboración\ propia\ con\ información\ del\ Sistema\ Sismológico\ Nacional.\]

3. Gráfico circular de frecuencia de los sismos de acuerdo a la hora del día (0-23 ó 1-24) cuando aconteció. (15%). Ver figura 1.

Solución

Para este ejercicio identifiqué la cantidad de sismos que ha ocurrido en determinada hora, posteriormente, utilicé esa información como insumo para la gráfica de circulo que se muestra a continuación.

En la gráfica se observa que los sismos ocurren con mayor frecuencia entre las 11 de la noche y las 5 de la mañana. Además, destaco que he utilizado otros argumentos para que sea más presentable.

library(ggplot2)
hora<-as.data.frame(str_split_fixed(sismos2$Hora,":",n=3))
hora$hm<- paste(hora$V1,hora$V2,sep = ":")
tmp1<-as.data.frame(hora[c(1,4)])
sismos4<-cbind(sismos2,tmp1)
sismos4$hm<- hm(sismos4$hm)

sismos4$h<-hour(sismos4$hm)

g<-as.data.frame(table(sismos4$h))

g$Freq<- as.numeric(g$Freq)

colnames(g)<-c("Hora","Sismos")

t<- ggplot(g,aes(x=Hora, y= Sismos,fill= Hora))
t+ geom_bar(stat = "identity") +
  geom_text(aes(label = Sismos, x = Hora,y = Sismos),
            position = position_stack(vjust= 1.15)) +
  coord_polar(theta = "x") +
  theme_minimal()+ 
  ggtitle("Sismos por Hora") +
  labs(caption="Fuente: Elaboración propia con información del Sistema Sismológico Nacional")

\[Fuente:\ Elaboración\ propia\ con\ información\ del\ Sistema\ Sismológico\ Nacional.\]

4. Considerando solamente aquellos sismos cuya magnitud fue mayor o igual a 5 ¿cuáles son los 5 estados con mayor cantidad de sísmos? (5%)

Solución

Lo primero que hice fue identificar si existían Na o registros erroneos, de ahí observé que el único problema era los registros no calculables, por lo que convertí la variable Magnitud en numérica y en automático R cambió “no calculable” por NA, esto lo comprobé con el conteo de los registros.

Después, filtré la base para solo tener los sismos de magnitud mayor o igual a cinco y con esos resultados generé la tabla dinámica, en la que se observa que chiapas es el Estado que ha tenido la mayor cantidad de sismos con magnitud igual o superior a 5.

table(sismos2$Magnitud == "no calculable")
## 
##  FALSE   TRUE 
## 212938  13826
sismos2$Magnitud<- as.numeric(sismos2$Magnitud)
table(is.na(sismos2$Magnitud))
## 
##  FALSE   TRUE 
## 212938  13826
class(sismos2$Magnitud)
## [1] "numeric"
m5<- subset(sismos2, sismos2$Magnitud >= 5)

m<-as.data.frame(table(m5$Nombre_Estado))
colnames(m)<-c("Estado","Cantidad de sismos")
m$`Cantidad de sismos`<-as.numeric(m$`Cantidad de sismos`)
mf<-data.frame(m[order(m$`Cantidad de sismos`,decreasing = T),][1:5,],row.names = c(1:5))
datatable(mf)

5. Realizar un histograma de la magnitud de los sismos detectados en el estado de Chiapas. (10%)

Solución

Para este ejercicio, filtré la base para solo tener los registros del Estado de Chiapas. El histograma se hace de manera sencilla con la función hist(), sin embargo, destaco que he utilizado otros argumentos para que sea más presentable.

Chiapas<- subset(sismos2, sismos2$Nombre_Estado=="Chiapas")

hist(Chiapas$Magnitud, main = "Histograma de Magnitud Chiapas",ylab = "Sismos",xlab="Magnitud", col="Red")+theme_minimal()

## NULL

EJERCICIO 2 (30%)

El método más común para la determinación de la aproximación estadísticamente óptima con un conjunto de parámetros dado un grupo de datos, es el método conocido como Mínimos Cuadrados (por sus siglas en inglés, LS), y fue propuesto hace aproximadamente dos siglos por Carl Friedrich Gauss. Así, en el caso más simple de la regresión lineal (y = b0 + b1X), se busca minimizar la suma de cuadrados en el vector de residuales e. Esta función objetivo de mínimos cuadrados puede ser escrita en su forma compacta de la siguiente manera:

\[ \begin{equation}\label{eq1} \begin{split} f(b)& = e^Te\\ & =(y − Xb)^T(y-Xb).................(1)\\ & = y^Ty − 2y^TXb + bX^TXb \end{split} \end{equation} \]

Calculando las derivadas parciales respecto a los parámetros b, e igualando dicha derivada a 0, se obtiene el vector de estimaciones puntuales de los parámetros β(ó b): \[b = (X^TX)^{−1}X^Ty.................. (2)\]

Utilizando los datos disponibles en Moodle llamados corazon, obtener el vector de estimaciones puntuales para los parámetros b cuando X = matriz de variables biking y smoking (498 x 2) y, y = heart.disease (498 x 1).

**_Solución_1**

Para este problema, considero que pueden existir dos soluciones, la primera es mediante la estimación de los parámetros agregando el intercepto a la regresión y la segunda es sin considerar el intercepto. En ese sentido, acontinuación presnto los resultados de la estimación con intercepto.

corazon<- read.csv("C:/Users/Gerardo Ramos/OneDrive - Comisión Federal de Competencia Económica/Documents/CIDE METPOL/Manejo de bases de datos R/examen 1/corazon.csv")
colnames(corazon)
## [1] "biking"        "smoking"       "heart.disease"
ml<- lm(heart.disease~ biking+smoking, data = corazon)
summary(ml)
## 
## Call:
## lm(formula = heart.disease ~ biking + smoking, data = corazon)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -2.1789 -0.4463  0.0362  0.4422  1.9331 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 14.984658   0.080137  186.99   <2e-16 ***
## biking      -0.200133   0.001366 -146.53   <2e-16 ***
## smoking      0.178334   0.003539   50.39   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.654 on 495 degrees of freedom
## Multiple R-squared:  0.9796, Adjusted R-squared:  0.9795 
## F-statistic: 1.19e+04 on 2 and 495 DF,  p-value: < 2.2e-16
ml2<- lm(heart.disease~ 0 + biking+smoking, data = corazon)
summary(ml2)
## 
## Call:
## lm(formula = heart.disease ~ 0 + biking + smoking, data = corazon)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.589 -1.940  2.238  5.698 15.488 
## 
## Coefficients:
##          Estimate Std. Error t value Pr(>|t|)    
## biking  -0.038274   0.008933  -4.284  2.2e-05 ***
## smoking  0.623037   0.022163  28.112  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.53 on 496 degrees of freedom
## Multiple R-squared:  0.7551, Adjusted R-squared:  0.7541 
## F-statistic: 764.8 on 2 and 496 DF,  p-value: < 2.2e-16
help("lm")

Solución 2

A continuación, se presentan los resultados sin considerar el intercepto, para esto, basta con poner en la función lm() el elemento ~ “0 +”.

ml2<- lm(heart.disease~ 0 + biking+smoking, data = corazon)
summary(ml2)
## 
## Call:
## lm(formula = heart.disease ~ 0 + biking + smoking, data = corazon)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -9.589 -1.940  2.238  5.698 15.488 
## 
## Coefficients:
##          Estimate Std. Error t value Pr(>|t|)    
## biking  -0.038274   0.008933  -4.284  2.2e-05 ***
## smoking  0.623037   0.022163  28.112  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 5.53 on 496 degrees of freedom
## Multiple R-squared:  0.7551, Adjusted R-squared:  0.7541 
## F-statistic: 764.8 on 2 and 496 DF,  p-value: < 2.2e-16

EJERCICIO 3

Mejoramiento del formato del reporte Markdown mediante algunas de las siguiente opciones: agregar índice, utilizar archivos .css o la paquetería pander. (15%)

Comentario

Entre las mejoras, destaco que incluí un archivo Externo CSS para modificar el formato, agregué un índice interactivo con diferentes secciones, edité el formato del tema, el tipo de letra de los chunks, incluí imagen, utilicé la extensión de LateX para tener una mejor presentación, ocupé la librería DT para mejorar las tablas, la librería ggplot para mejorar las gráficas e hice una limpieza de la base de datos para poder presentar de mejor manera los resultados.