Ejercicio 1

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

  1. El total de sismos detectados por mes.
  2. El total de sismos detectados por cada estado de la república.
  3. Gráfico circular de frecuencia de los sismos de acuerdo a la hora del día (0-23 o 1-24) cuando acontenció
  4. Considerando solamente aquellos sismos cuya magnitud fue mayor o igual a 5 ¿cuáles son los 5 estados con mayor cantidad de sismos?
  5. Realizar un histograma de la magnitud de los sismo detectados en el estado de Chiapas.

Para la lectura de la tabla debido a que en los primeros renglones contiene información de fuente, se tiene que especificar que los datos empiezan después de 4 renglones. Así mismo, en los últimos renglones quedan valores sin información (NA) por lo se usa la función na.omit

SSN<- read.csv(file = "SSNMX_catalogo_19800101_20210924.csv",skip =4, header = TRUE)
SSN <- na.omit(SSN)

Revisamos las dimensiones resultantes y los encabezados y el primer renglón con información para conocer más de la estructura de la base de datos

dim(SSN)
## [1] 226764     10
SSN[1,]
##        Fecha     Hora      Magnitud Latitud Longitud Profundidad
## 1 1980-01-01 04:12:00 no calculable   16.98  -102.33        33.0
##                  Referencia.de.localizacion  Fecha.UTC Hora.UTC  Estatus
## 1 109 km al SUR de CD LAZARO CARDENAS, MICH 1980-01-01 10:12:00 revisado

1. Total de sismos mensualmente.

Para saber la cantidad de sismos ocurridos cada mes primero se necesita transformar la columna que contiene la información necesaria a un formato de fecha, así mismo con la paquetería lubridate se crea una nueva columna con únicamente el mes

SSN$Fecha<-as.Date(SSN$Fecha, format="%Y-%m-%d")
SSN$Mes<-lubridate::month(SSN$Fecha, label=TRUE)

Con la función summarise del paquete dplyr se crea un nuevo data frame con la información agrupada por mes.

sismos_mens<- summarise(group_by(SSN, Mes),"Total de sismos" = n())
kbl(sismos_mens) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Mes Total de sismos
ene 21195
feb 20644
mar 19155
abr 17959
may 17807
jun 18129
jul 17633
ago 17827
sep 21497
oct 18254
nov 18094
dic 18570

2. Total de sismos por entidad.

Si se observa la columna de localización contiene más información además de la entidad. La estructura de la información es número de kilometros y dirección hacia algún centro de población y el nombre de la entidad abreviada, separado por una coma. Ejemplo: (109 km al SUR de CD LAZARO CARDENAS, MICH) Con la función str_match y el uso de expresiones regulares se puede indicar que lo que este después de la coma en la columna de Referencia.de.localizacion, sea almacenado en una nueva columna llamada Entidad

SSN$Entidad<-str_match(SSN$Referencia.de.localizacion, ',\\s(\\w+)')[,2]
SSN[1,]
##        Fecha     Hora      Magnitud Latitud Longitud Profundidad
## 1 1980-01-01 04:12:00 no calculable   16.98  -102.33        33.0
##                  Referencia.de.localizacion  Fecha.UTC Hora.UTC  Estatus Mes
## 1 109 km al SUR de CD LAZARO CARDENAS, MICH 1980-01-01 10:12:00 revisado ene
##   Entidad
## 1    MICH

Tal como se realizo en el inciso pasado, se crea un nuevo data frame con la información agrupada

sismos_ent<- summarise(group_by(SSN, Entidad),num = n())
sismos_ent<- sismos_ent[order(sismos_ent$num,decreasing = TRUE),]

Si se observa, resultan 33 renglones pues hay 3 sismos clasificados en N. Si filtramos la base de datos original para identificar los tres registros con entidad N se observa que corresponden a sismos ocurridos en el municipio de San Nicolas de los Garza, es decir en la Entidad de Nuevlo León(NL) por lo que se modificarán estos registros y se harpa nuevamente la base de datos

filter(SSN, Entidad%in%"N")[,7:12]
##                        Referencia.de.localizacion  Fecha.UTC Hora.UTC  Estatus
## 1 2 km al NORESTE de CD S NICOLAS DE LOS GARZA, N 2021-02-06 00:36:19 revisado
## 2 2 km al NORESTE de CD S NICOLAS DE LOS GARZA, N 2021-02-06 03:24:13 revisado
## 3 2 km al NORESTE de CD S NICOLAS DE LOS GARZA, N 2021-02-06 23:33:52 revisado
##   Mes Entidad
## 1 feb       N
## 2 feb       N
## 3 feb       N
SSN$Entidad[SSN$Entidad%in%"N"] <- "NL"
sismos_ent2<- summarise(group_by(SSN, Entidad),"Total de sismos" = n())
sismos_ent2<- sismos_ent2[order(sismos_ent2$`Total de sismos`,decreasing = TRUE),]
kbl(sismos_ent2) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Entidad Total de sismos
OAX 94592
CHIS 42913
GRO 39249
MICH 13979
BC 8170
JAL 6832
COL 5288
VER 5159
BCS 2846
SON 1309
PUE 1130
SIN 920
MEX 583
HGO 548
TAB 530
NL 423
CHIH 400
CDMX 285
NAY 263
MOR 233
ZAC 228
SLP 189
TLAX 120
TAMS 115
COAH 109
QR 86
GTO 82
CAMP 62
DGO 61
AGS 42
QRO 15
YUC 3

3. Frecuencia de sismos de acuerdo a la hora del día

Para este inciso primero se crea una columna en formato de tiempo para después con lubridate extraer unicamente la hora y almacernarla en otra columna

SSN$Hr24<-strptime(SSN$Hora,format = "%X" )
SSN$Hr24num<-lubridate::hour(SSN$Hr24)

Ahora se resume la tabla por hora

sismos_hora<- summarise(group_by(SSN, Hr24num),Frecuencia = n())
sismos_hora
## # A tibble: 24 x 2
##    Hr24num Frecuencia
##      <int>      <int>
##  1       0      10814
##  2       1      10322
##  3       2      10548
##  4       3      10310
##  5       4      10687
##  6       5      10551
##  7       6       9903
##  8       7       8882
##  9       8       8650
## 10       9       8622
## # ... with 14 more rows

Y con la librería ggplot2 se realiza un histograma de frecuencia pero con coordenadas polares

  ggplot(sismos_hora, aes(x=Hr24num, y=Frecuencia,yend=max(Frecuencia))) +
  geom_bar(stat = "identity", fill="#104e8b90", col="gray") +
  labs(x="", y="") +
  scale_y_continuous(limits = c(0,11000), 
                     breaks = seq(0,11000,1000)) +
  scale_x_continuous(breaks = c(0:23))+
  coord_polar() +
  theme_minimal() +
    labs(title = "Frecuencia de ocurrencia de sismos según hora del día", subtitle = "desde 01-01-1980 a 24-09-2021")

4. Estado con mayor cantidad de sismos de magnitud mayor o igual a 5

Primero se crea una nueva columna que contenga los valores de magnitud de cada sismo en formato númerico para poder hacer el filtro de mayores de 5 grados y solamente extraer las 5 entidades con más sismos registrados

SSN$magnnum<-as.numeric(SSN$Magnitud)
## Warning: NAs introducidos por coerción
magnmas5<-filter(SSN,magnnum>= 5)

sismos_ent_mas5<- summarise(group_by(magnmas5, Entidad),"Total de sismos" = n())
sismos_ent_mas5<- sismos_ent_mas5[order(sismos_ent_mas5$`Total de sismos`,decreasing = TRUE),]
topsismos_ent_mas5<- sismos_ent_mas5[1:5,]  
kbl(topsismos_ent_mas5) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Entidad Total de sismos
CHIS 499
OAX 272
GRO 185
BCS 115
JAL 105

5. Sismos en Chiapas

Se realiza el filtro de los sismos ocurridos en Chiapas y con la columna previamente creada se crea un histograma de frecuencias de magnitud

sismos_CHIS<-filter(SSN, Entidad %in% "CHIS")
magn_sism_CHIS<- summarise(group_by(sismos_CHIS, magnnum),"Total de sismos" = n())
ggplot(magn_sism_CHIS, aes(x=magnnum, y=`Total de sismos`,yend=max(magn_sism_CHIS$`Total de sismos`))) +
  geom_bar(stat = "identity", fill="#104e8b90", col="gray") +
  labs(x="Magnitud", y="Número de sismos")+
  scale_x_continuous(breaks = c(0:10))+
  theme_minimal()+
  labs(title = "Histograma de magnitud de sismos detectados en Chiapas", subtitle = "desde 01-01-1980 a 24-09-2021")
## Warning: Use of `magn_sism_CHIS$`Total de sismos`` is discouraged. Use `Total de
## sismos` instead.
## Warning: Removed 1 rows containing missing values (position_stack).


Ejercicio 2

El método más común para la determinaciómn 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 = b_0 +b_1X)\), se busca minimizar la suma de cuadrados en el vector de residuales \(e\).
En ese sentido el vector de estimaciones puntuales de los parámetros $$ (ó b) es: \[\beta =(X^TX)^{-1}X^Ty\] Utilizando los datos de la base de datos llamada 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 = hear.disease (498 x 1).

Se carga la base de datos tal y como está para partir de ella crear las otras dos matrices que en este momento serán almacenadas como data frames para facilitar su manipulación

corazon<- read.csv(file = "corazon.csv", header = TRUE)
equis<-corazon[,1:2]
ye<-as.data.frame(corazon[,3])
names(ye)=("hear.disease")

Se revisa que ambas matrices tengan las dimensiones especificadas

dim(equis)
## [1] 498   2
dim(ye)
## [1] 498   1

Para la matriz equis se debe generar una nueva columna con unos (1) que con la función subset será desplazada al inicio del data frame

equis$unos<-1
equis <- subset(equis, select=c("unos","biking","smoking"))
equis[1:5,]
##   unos    biking   smoking
## 1    1 30.801246 10.896608
## 2    1 65.129215  2.219563
## 3    1  1.959665 17.588331
## 4    1 44.800196  2.802559
## 5    1 69.428454 15.974505

Como siguiente paso se transforma la “matriz” equis, que hasta ahora había sido un data frame, a un objeto matrix para así posteriormente transponerla, en este caso se hace con la función t y se almacenarla en una nueva variable

equis<-as.matrix(equis)
equis_t<-t(equis)

Ahora se debe multiplicar la matriz transpuesta por la matriz original

equis_t_equis<-(equis_t%*%equis)
equis_t_equis
##              unos    biking    smoking
## unos      498.000  18818.63   7686.647
## biking  18818.629 940469.53 291805.827
## smoking  7686.647 291805.83 152799.206

Para calcular la inversa se esta matriz se usa la función solve

inv_equis_t_equis<-solve(a=equis_t_equis)

Ya que, segun la formula, esto se debe multiplicar por el producto de equis transpuesta y la matriz ye, se realizará esta operación

ye<-as.matrix(ye)
equis_t_ye<-equis_t%*%ye

Finalmente, para obtener la estimación de Beta se multiplican la matriz inversa de equis transpuesta por equis \((X^TX)^{-1}\) por la matriz equis transpuesta por ye \(X^Ty\)

est_beta<-inv_equis_t_equis%*%equis_t_ye
est_beta
##         hear.disease
## unos      14.9846580
## biking    -0.2001331
## smoking    0.1783339

Para comprobar el reusltadoi, se usará la función Fitting Linear Models lm que tiene R.

est_r<-lm(data = corazon, heart.disease ~ biking + smoking)
est_r
## 
## Call:
## lm(formula = heart.disease ~ biking + smoking, data = corazon)
## 
## Coefficients:
## (Intercept)       biking      smoking  
##     14.9847      -0.2001       0.1783

Mostrando que ambos resultados coinciden


Ejercicio 3

Mejoramiento del formato del reporte Markdown * Logo
* Dos tipografías y dos colores diferentes
* Índice
* Background
* Nota al pie de página
* Tablas con librería Kabble
* Gráficas con librería ggplot


  1. México. Universidad Nacional Autónoma de México, I. d. G., Servicio Sismológico Nacional. (2021). Catálogo de sismos. Extraído de http://www2.ssn.unam.mx:8080/catalogo/↩︎