PRIMER PARCIAL

Manejo de Bases de Datos

Nancy Rojo

8 de octubre de 2021

Música para amenizar la lectura del documento

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 la página del SSN, calcular:
Primero cargué la base de datos a mi ambiente. Le quité las advertencias, porque me salieron varias, porque visualmente no se veía bien en el html.

library(readxl)
BaseSismos<- read_excel("sismos.xlsx")

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

Utilicé la función “as.date” para darle formato a la fecha. Después, cargué la paquetería “lubridate” para tener más funciones asociadas a fechas y poder usar la función “month” para que en una tabla me separara los sismos de acuerdo a los meses. Finalmente, le di formato a la tabla; poniéndole nombre a las filas, a las columnas y usando la paquetería “kableExtra”.

FechasSismos<-as.Date(BaseSismos$Fecha,format="%Y-%m-%d")
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
## 
##     date, intersect, setdiff, union
SismosMes<-table(month(FechasSismos))
library(kableExtra)
row.names(SismosMes)<- c("Enero", "Febrero","Marzo", "Abril","Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")
kable(SismosMes,col.names = c("Mes","Cantidad de Sismos"))
Mes Cantidad de Sismos
Enero 21195
Febrero 20644
Marzo 19155
Abril 17959
Mayo 17807
Junio 18129
Julio 17633
Agosto 17827
Septiembre 21497
Octubre 18254
Noviembre 18094
Diciembre 18570

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

Primero, hice una nueva tabla únicamente con la columna de “Referencia de localizacion” de la base de datos “BaseSismos”.
Después, usé la función de “separate” para que me dividiera la información en dos columnas. Lo que estaba antes de la coma y lo que estaba después de la coma que es el estado.
A esa nueva tabla le llamé “SismosEdos”. Al ver la nueva tabla me di cuenta que viene un estado llamado “N”, al ver la descripción de la localización se debe asociar a Nuevo León. Por lo tanto, con la paquetería “dplyr” usé la función “group_by” y “summarize” para unir los datos de las filas en la de “Nuevo León”.
Finalmente, le volví a dar formato a la tabla con la función de “kable”.

library(tidyr)
Estados<- data.frame(BaseSismos$"Referencia de localizacion")
Edos<-separate(Estados,BaseSismos..Referencia.de.localizacion., into = c("Localización", "Estados"),sep = ",")
SismosEdos<-table(Edos$Estados)
row.names(SismosEdos)<-c("Aguascalientes", "Baja California", "Baja California Sur", "Campeche", "Ciudad de México", "Chihuahua", "Chiapas", "Coahuila", "Colima", "Durango", "Guerrero", "Guanajuato", "Hidalgo", "Jalisco", "Estado de México", "Michoacán", "Morelia", "Nuevo León", "Nayarit", "Nuevo León", "Oaxaca", "Puebla", "Querétaro", "Quintana Roo", "Sinaloa", "San Luis Potosí", "Sonora", "Tabasco", "Tamaulipas", "Tlaxcala", "Veracruz", "Yucatán", "Zacatecas")
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:kableExtra':
## 
##     group_rows
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(kableExtra)
SismosEdosDF<-data.frame(SismosEdos)
Unidos<-SismosEdosDF %>% group_by(Var1) %>% summarise_each(funs(sum))
kable(Unidos, col.names = c("Estado","Cantidad de Sismos"))
Estado Cantidad de Sismos
Aguascalientes 42
Baja California 8170
Baja California Sur 2846
Campeche 62
Ciudad de México 285
Chihuahua 400
Chiapas 42913
Coahuila 109
Colima 5288
Durango 61
Guerrero 39249
Guanajuato 82
Hidalgo 548
Jalisco 6832
Estado de México 583
Michoacán 13979
Morelia 233
Nuevo León 423
Nayarit 263
Oaxaca 94592
Puebla 1130
Querétaro 86
Quintana Roo 15
Sinaloa 920
San Luis Potosí 189
Sonora 1309
Tabasco 530
Tamaulipas 115
Tlaxcala 120
Veracruz 5159
Yucatán 3
Zacatecas 228

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

Primero, usé la función de “strptime” para darle el formato de fecha y hora a la columna de “Hora” en mi base de datos. Después, llamé a la paquetería “circular” para poder hacer el gráfico circular con la función “rose.diag”, usando el tema de “clock24” para darle ese estilo.

FechaHora<-strptime(BaseSismos$Hora, format = "%Y-%m-%d  %H:%M:%S")
library(lubridate)
Horas<-hour(FechaHora)
SismosHoras<-table(hour(FechaHora))
library(circular)
## 
## Attaching package: 'circular'
## The following objects are masked from 'package:stats':
## 
##     sd, var
horasparagraf<- circular(SismosHoras, units="hours", template="clock24")
rose.diag(horasparagraf, bin=24, col = "blue", main = "Sismos por Horas", prop = 5)

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%).

Primero, hice una nueva base de datos usando solo las columnas de “Referencia de localizacion” y la de “Magnitud”. Después, copié los mismos comandos de la pregunta dos para separar la columna de “Referencia de localizacion” en dos nuevas columnas y poder tener el nombre del estado en una columna aparte. A esa nueva base de datos tuve que quitarle las filas que tenían la leyenda de “no calculable” en la columna de “BaseSismos.Magnitud” y después dejé solo los valores que fueran mayores o iguales a 5.
Finalmente, convertí esa nueva tabla en un data.frame para poder usar las paqueterías de “dplyr” y de “DT” para obtener los 5 estados con mayor cantidad de sismos de magnitud igual o mayor a 5 y ordenarlos de manera descendiente.

library(tidyr)
EstadosMag<- data.frame(BaseSismos$"Referencia de localizacion", BaseSismos$Magnitud)
EdosMag<-separate(EstadosMag,BaseSismos..Referencia.de.localizacion., into = c("Localización", "Estados"),sep = ",")
EdosMagDF<-data.frame(EdosMag)
EdosMagDF2<-subset(EdosMagDF,BaseSismos.Magnitud!="no calculable")
EdosMagDF3<-subset(EdosMagDF2,BaseSismos.Magnitud>=5)

library(dplyr)
TablaMag<-table(EdosMagDF3$Estados)
TablaMagDF<-data.frame(TablaMag)
TOPEdosMAG<-top_n(TablaMagDF,5,Freq)%>%arrange(desc(Freq))
library(DT)
row.names(TOPEdosMAG)<-c("Chiapas", "Oaxaca", "Guerrero","Baja California Sur", "Jalisco")
colnames(TOPEdosMAG)<-c("Estado", "Cantidad de Sismos")
datatable(TOPEdosMAG)

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

Tuve varios problemas para poder filtrar la información directo en R, así que después de varios días y horas de errores opté por ponerme creativa y usar el recurso de excel a mi favor. Filtré la información de Chiapas en nueva hoja de excel y cargué esos datos al ambiente en R.
A esa base de datos le quité todas las filas que contuvieran el valor “no calculable” en la columna de “Magnitud” por medio de la función “subset”. Después usé la función “as.numeric” para la columna de “Magnitud” en el nuevo subconjunto de datos (ya sin el valor de “no calculable”) y usé esos datos para hacer el histograma.
Finalmente, instalé el paquete “ggplot2” y lo cargué a la consola para poder hacer el histograma y darle un formato más bonito.

library(readxl)
Chiapas<- read_excel("SSNMX_catalogo_19800101_20210924.xlsx", sheet = "CHIS")
ChiapasDF<-data.frame(Chiapas)
ChiapasDF2<-subset(ChiapasDF,Magnitud!="no calculable")
ChiapasNum<-as.numeric(ChiapasDF2$Magnitud)
library(ggplot2)
qplot(ChiapasNum, geom="histogram", main="Magnitud de sismos en Chiapas", xlab="Magnitud", ylab="Cantidad", fill=I("lightblue"), col=I("purple")) 
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

EJERCICIO 2

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 = b_0 + b_1X\] 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: \[f(b)=e^Te\\ =(y-Xb)^T(y-Xb)\\ =y^Ty-2y^TXb+bX^TXb\]

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\]

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 = hear.disease (498 x 1).
Primero, cargué la base de datos.

library(readxl)
corazon <- read_excel("corazon.xlsx")

Después, creé las dos matrices. X = biking x smoking (498x2) y la y = heart.disease (498x1).
Usé la función de “t” para sacar la transpuesta de X.
Después, multipliqué la matriz X por su transpuesta.
A ese producto de las matrices le saqué su inversa.
Multipliqué después la transpuesta por la y.
Y, finalmente, para completar la fórmula, multipliqué los últimos dos resultados. Para obtener el valor de b.
Simplemente, seguí la fórmula:

\[b=(X^TX)^{-1}X^Ty\] Para obtener el vector de estimaciones puntuales de los parámetros β.

X<-matrix(c(corazon$one, corazon$biking,corazon$smoking),ncol=3)
y<-matrix(corazon$heart.disease, ncol=1, byrow=TRUE)
transX<-t(X)
Prod<-transX%*%X
Inversa <-solve(Prod)
TransXy<-transX%*%y

b<-Inversa%*%TransXy

library(kableExtra)
data.frame(b)
##            b
## 1 14.9846580
## 2 -0.2001331
## 3  0.1783339
row.names(b)<-c("intercept", "biking", "smoking")
kable(b, col.names = "coeficientes")
coeficientes
intercept 14.9846580
biking -0.2001331
smoking 0.1783339