En esta parte se llaman todas las librerias que se ocuparan, algunas son para el tratamiento de datos y otras de ellas son para realizar análisis gráfico y análisis espacial de los datos.
#setwd("C:/Users/arosas/datalab")
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(plyr)
## -------------------------------------------------------------------------
## You have loaded plyr after dplyr - this is likely to cause problems.
## If you need functions from both plyr and dplyr, please load plyr first, then dplyr:
## library(plyr); library(dplyr)
## -------------------------------------------------------------------------
##
## Attaching package: 'plyr'
## The following objects are masked from 'package:dplyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
library(tidyr)
library(stringr)
library(leaflet)
library(sp)
library(geosphere)
library(RColorBrewer)
library(ggplot2)
Es muy importante conocer la estructura de los datos previo a cargarlos aqui usamos la función excel_sheets para conocer la cantidad de libros que contiene el archivo en excel y length para saber cuantoslibros son.
n_hojas<-excel_sheets("refugios_nayarit.xlsx")
length(n_hojas)
## [1] 22
Importamos algunas hojas de manera aleatoria para poder ver su estructura.
#Importamos una hoja para explorar la estructura de los datos
data1 <- read_excel("refugios_nayarit.xlsx", sheet = n_hojas[1])
data8 <- read_excel("refugios_nayarit.xlsx", sheet = n_hojas[8])
data19 <- read_excel("refugios_nayarit.xlsx", sheet = n_hojas[19])
data1 <- read_excel("refugios_nayarit.xlsx",
sheet = n_hojas[1],
skip=4,
col_names=FALSE)
Ahora que sabemos que la información de las bases no se encuentra en la primera fila y que los nombres de las variables estan distribuidos en 2 filas procederemos a realizar los siguientes pasos:
libtrabajo <- lapply(excel_sheets("refugios_nayarit.xlsx"),
read_excel,
path = "refugios_nayarit.xlsx",
#skip=4,
col_names=FALSE)
ss<-ldply(libtrabajo, cbind)
headers <- data.frame(t(head(ss,4)),stringsAsFactors = FALSE)
headers$nombres <- with(headers, ifelse(grepl("\\w", X4), X4, X3))
headers <- headers[ c("nombres") ]
colnames(ss) <- headers$nombres
str(ss)
## 'data.frame': 593 obs. of 12 variables:
## $ No. : chr "RELACION DE REFUGIOS TEMPORALES" NA "No." NA ...
## $ REFUGIO : chr NA NA "REFUGIO" NA ...
## $ MUNICIPIO : chr NA NA "MUNICIPIO" NA ...
## $ DIRECCIÓN : chr NA NA "DIRECCIÓN " NA ...
## $ USO DEL INMUEBLE : chr NA NA "USO DEL INMUEBLE" NA ...
## $ SERVICIOS : chr NA NA "SERVICIOS" "SERVICIOS" ...
## $ CAPACIDAD DE PERSONAS: chr NA NA "CAPACIDAD DE PERSONAS" NA ...
## $ LATITUD : chr NA NA " COORDENADAS GEOGRAFICAS " "LATITUD" ...
## $ LONGITUD : chr NA NA NA "LONGITUD" ...
## $ ALTITUD : chr NA NA NA "ALTITUD" ...
## $ RESPONSABLE : chr NA NA "RESPONSABLE" NA ...
## $ TELÉFONO : chr NA NA "TELÉFONO" NA ...
ss$No. = as.numeric(ss$No.)
## Warning: NAs introducidos por coerción
ss2<-subset(ss, !is.na(No.))
Buscamos si existen dupicados en la base.
table(duplicated(ss2))
##
## FALSE
## 437
Limpiamos las variables latitud y longitud primero las exploraremos para saber que caraceteres no epropios de la estructura en grados son los que contiene.
LIMPIAR_LAT<-gsub(0,"",ss2$LATITUD)
LIMPIAR_LON<-gsub(0,"",ss2$LONGITUD)
for (j in 1:10) {
LIMPIAR_LAT<-gsub(j,"",LIMPIAR_LAT)
LIMPIAR_LON<-gsub(j,"",LIMPIAR_LON)
}
Hacemos una tabla con los caracteres encontrados en las coordenadas.
table(LIMPIAR_LAT)
## LIMPIAR_LAT
## '. "'." |'." °''." °'-" °'." ° ' ." ª'. ª'." º'.
## 1 1 1 1 2 69 1 1 40 7
## º'."
## 306
table(LIMPIAR_LON)
## LIMPIAR_LON
## '." |'." °'. °'." ª'"" ª'. ª'." º'. º'." º.." º`."
## 1 4 2 68 1 3 38 1 307 4 1
Como observamos que existen muchos caraceteres no esperados tenemos que cambiarlos y despues transofrmamos estas variables en su forma decimal.
ss2$latitud2 <- gsub("°'", ",", ss2$LATITUD)
ss2$latitud2 <- gsub("º", ",", ss2$latitud2)
ss2$latitud2 <- gsub("°", ",", ss2$latitud2)
ss2$latitud2 <- gsub("ª", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\']", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\`]", ",", ss2$latitud2)
ss2$latitud2 <- gsub("\\|", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\"]", "", ss2$latitud2)
ss2$latitud2 <- gsub("-", ".", ss2$latitud2)
ss2$longitud2 <- gsub("°'", ",", ss2$LONGITUD)
ss2$longitud2 <- gsub("º", ",", ss2$longitud2)
ss2$longitud2 <- gsub("°", ",", ss2$longitud2)
ss2$longitud2 <- gsub("ª", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\']", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\`]", ",", ss2$longitud2)
ss2$longitud2 <- gsub("\\|", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\"]", "", ss2$longitud2)
ss2_decimal<- separate(ss2, col = latitud2, into = c("GRADOS_LAT", "MIN_LAT","SEG_LAT"), sep = ",")
## Warning: Too few values at 2 locations: 213, 388
ss3_decimal<- separate(ss2_decimal, col = longitud2, into = c("GRADOS_LON", "MIN_LON","SEG_LON"), sep = ",")
## Warning: Too few values at 5 locations: 169, 170, 171, 172, 281
Al correr las ultimas dos lineas de codigo en el log nos dice que existen problmeas con las observaciones 213,388,169,170,171,172,281 entonces las revisamos puntualmente ara ver que suede con ellas.
x<-subset(ss3_decimal,ss3_decimal$No. %in% c(213,388,169,170,171,172,281))
Observamos lo siguiente al inspeccionar x: ## las observaciones 169, 170, 171, 172 estan separados por un punto y no por apostrofe en longitud y sus coordenadas son las mismas ## Para la observación 213 parece que faltan los grados de la latitud podrian ser 20, 21 o 22 ## la observación 281 tiene el mismo problema pero con los grados de la longitud podrian ser 103, 104 0 105 ## la observación 388 tiene doble comilla en lugar del caracter para grados
Corregimos
ss2$LONGITUD[ss2$No. %in% c(169,170,171,172)] <- "104º43'52.56" #corrección de 169 a 172
ss2$LATITUD[ss2$No. %in% c(213)] <- "21,48'39.95" #corrección particular de 213 verificado en wikipedia
ss2$LONGITUD[ss2$No. %in% c(281)] <- "105,13'24.41" #corrección particular de 281 verificado en wikipedia
ss2$LATITUD[ss2$No. %in% c(388)] <- "20,48'21.57" #corrección particular de 281
Ahora corremos nuevamente las lineas para asignar comas antes de convertir a decimal
ss2$latitud2 <- gsub("°'", ",", ss2$LATITUD)
ss2$latitud2 <- gsub("º", ",", ss2$latitud2)
ss2$latitud2 <- gsub("°", ",", ss2$latitud2)
ss2$latitud2 <- gsub("ª", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\']", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\`]", ",", ss2$latitud2)
ss2$latitud2 <- gsub("\\|", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\"]", "", ss2$latitud2)
ss2$latitud2 <- gsub("-", ".", ss2$latitud2)
ss2$longitud2 <- gsub("°'", ",", ss2$LONGITUD)
ss2$longitud2 <- gsub("º", ",", ss2$longitud2)
ss2$longitud2 <- gsub("°", ",", ss2$longitud2)
ss2$longitud2 <- gsub("ª", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\']", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\`]", ",", ss2$longitud2)
ss2$longitud2 <- gsub("\\|", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\"]", "", ss2$longitud2)
## separamos para poder convertir en decimales
ss2_decimal<- separate(ss2, col = latitud2, into = c("GRADOS_LAT", "MIN_LAT","SEG_LAT"), sep = ",")
ss3_decimal<- separate(ss2_decimal, col = longitud2, into = c("GRADOS_LON", "MIN_LON","SEG_LON"), sep = ",")
Inspeccionamos las variables
table(ss3_decimal$GRADOS_LAT) #aqui observamso que existe una observacion con latitud de 105 grados
##
## 105 20 21 22
## 1 77 279 73
table(ss3_decimal$GRADOS_LON) #aqui observamso que existe una observacion con longitud de 20 grados
##
## 103 104 105 20
## 4 173 252 1
Se debe inspeccionar la base ya que no son grados logicos si tomamos en cuenta el cuadrante donde se ubica el estado
x1<-subset(ss3_decimal,ss3_decimal$GRADOS_LAT == 105 | ss3_decimal$GRADOS_LON == 20) #aqui observamos
#que el registro 434 tiene invertidas sus coordenadas
Lon434<-ss2$LONGITUD[ss2$No. %in% c(434)]
Lat434<-ss2$LATITUD[ss2$No. %in% c(434)]
ss2$LONGITUD[ss2$No. %in% c(434)]<-Lat434
ss2$LATITUD[ss2$No. %in% c(434)]<-Lon434
#corremos nuevamente el proceso de limpieza y separamos
ss2$latitud2 <- gsub("°'", ",", ss2$LATITUD)
ss2$latitud2 <- gsub("º", ",", ss2$latitud2)
ss2$latitud2 <- gsub("°", ",", ss2$latitud2)
ss2$latitud2 <- gsub("ª", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\']", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\`]", ",", ss2$latitud2)
ss2$latitud2 <- gsub("\\|", ",", ss2$latitud2)
ss2$latitud2 <- gsub("[\"]", "", ss2$latitud2)
ss2$latitud2 <- gsub("-", ".", ss2$latitud2)
ss2$longitud2 <- gsub("°'", ",", ss2$LONGITUD)
ss2$longitud2 <- gsub("º", ",", ss2$longitud2)
ss2$longitud2 <- gsub("°", ",", ss2$longitud2)
ss2$longitud2 <- gsub("ª", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\']", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\`]", ",", ss2$longitud2)
ss2$longitud2 <- gsub("\\|", ",", ss2$longitud2)
ss2$longitud2 <- gsub("[\"]", "", ss2$longitud2)
ss2_decimal<- separate(ss2, col = latitud2, into = c("GRADOS_LAT", "MIN_LAT","SEG_LAT"), sep = ",")
ss3_decimal<- separate(ss2_decimal, col = longitud2, into = c("GRADOS_LON", "MIN_LON","SEG_LON"), sep = ",")
#creamos las latitudes y las longitudes decimales
ss3_decimal$lat_10<-as.numeric(ss3_decimal$GRADOS_LAT)+
(as.numeric(ss3_decimal$MIN_LAT)/60)+
(as.numeric(ss3_decimal$SEG_LAT))/3600
ss3_decimal$lon_10<-(as.numeric(ss3_decimal$GRADOS_LON)+
(as.numeric(ss3_decimal$MIN_LON)/60)+
(as.numeric(ss3_decimal$SEG_LON))/3600)*(-1)
ss3_decimal$coordenadas<-paste(ss3_decimal$lat_10,ss3_decimal$lon_10,sep = ",")
Exploramos las coordenadas
a<-as.data.frame(table(ss3_decimal$coordenadas))
table(a$Freq)
##
## 1 2 3 4 5 7
## 247 40 22 5 2 2
Al correr la linea anterior observamos lo siguiente ## 247 coordenadas con observaciones unicas ## 40 coordenadas compartidas con 2 observaciones distintas ## 22 coordenadas compartidas con 3 observaciones distintas ## 5 coordenadas compartidas con 4 observaciones distintas ## 2 coordenadas compartidas con 5 observaciones distintas ## 2 coordenadas compartidas con 7 observaciones distintas, una de ellas es una coordenada con datos faltantes
#exploraremos graficamente los datos
#display.brewer.all()
pal <- colorNumeric("Set2", NULL, n = 3) #n numero de variables a colorear
zonas_de_riesgo <-leaflet(ss3_decimal[ss3_decimal$GRADOS_LON %in% c(103,104,105),]) %>%
addProviderTiles("CartoDB.DarkMatter")%>%
addCircleMarkers(lng = ~lon_10,
lat = ~lat_10,
weight = 1,
radius= 3,
color = ~pal( as.numeric(GRADOS_LON)),
popup = ~paste(REFUGIO,`DIRECCIÓN `,TELÉFONO,RESPONSABLE,sep=","),
group = ~GRADOS_LON,
stroke = FALSE,
fillOpacity = 0.45
)%>%
# controles
addLayersControl(
overlayGroups = ~GRADOS_LON,
options = layersControlOptions(collapsed = FALSE)
)
Aqui reamos una segmentación natural dados los grados, posiblmente los refugios cercanos a la costa estan mas expuestos, este mapa sera creado con leaflet y tiene una base en html5 y puede ser usado en una aplicación para telefonia celular incluso sin datos para una emergencia donde se tengan que ubicar refugios cercanos.
Aca creamos una funcion que nos da la distancia en kilometros pra los 3 refugios mas cercanos y su ubicación, este mapa tambien puede ser incluido en una aplicación de telefonia celular.
#deteccion de los 3 refugios mas cercanos dada una ubicación
tres_lugares <- function(lat_U, lon_U){
DSNAYARIT<-ss3_decimal[ss3_decimal$GRADOS_LON %in% c(103,104,105),]
DSNAYARIT<-DSNAYARIT[,c("lat_10","lon_10","coordenadas")]
DSNAYARIT<-unique(DSNAYARIT)
DSNAYARIT$Distancia_km <-spDistsN1(matrix(c(DSNAYARIT$lat_10, DSNAYARIT$lon_10), ncol=2),
c(lat_U, lon_U),
longlat=TRUE)
DSNAYARIT<-DSNAYARIT[order(DSNAYARIT$Distancia_km),]
DSNAYARIT<-DSNAYARIT[1:3,]
return(DSNAYARIT)
}
#centro de tepic
lon_UDado<-21.508333
lat_UDado<-(-104.893056)
LUGARESCERCANOS <- tres_lugares(lon_UDado, lat_UDado)
LUGARESCERCANOS2 <- ss3_decimal[ss3_decimal$coordenadas %in% LUGARESCERCANOS$coordenadas,]
####
adli<-c(lat_UDado,lon_UDado) #INVERTIR COORDENADAS
estabs_inv<- cbind(LUGARESCERCANOS$lon_10,LUGARESCERCANOS$lat_10) # invertimos las otras coordenadas
inter1 <- as.data.frame(gcIntermediate(adli, estabs_inv[1,], n=100, addStartEnd=TRUE))
inter2 <- as.data.frame(gcIntermediate(adli, estabs_inv[2,], n=100, addStartEnd=TRUE))
inter3 <- as.data.frame(gcIntermediate(adli, estabs_inv[3,], n=100, addStartEnd=TRUE))
## write.csv(ss3_decimal, file = "data_nayarit.csv")
#creamos el mapa
CONEXIONES<-leaflet(LUGARESCERCANOS2) %>%
addProviderTiles("CartoDB.DarkMatter")%>%
addCircleMarkers(lng = ~lon_10,
lat = ~lat_10,
weight = 1,
radius= 3,
color = ~pal( as.numeric(GRADOS_LON)),
popup = ~paste(REFUGIO,`DIRECCIÓN `,TELÉFONO,RESPONSABLE,sep=","),
group = ~GRADOS_LON,
stroke = FALSE,
fillOpacity = 0.45) %>%
addMarkers(lng = ~lon_10,
lat = ~lat_10,
popup = ~paste(REFUGIO,`DIRECCIÓN `,TELÉFONO,RESPONSABLE,sep=","))%>%
addPolylines(data = inter1, lng = ~lon, lat = ~lat,
fill = F,
weight = 2,
color = "#FFFFCC")%>%
addPolylines(data = inter2, lng = ~lon, lat = ~lat,
fill = F,
weight = 2,
color = "#FFFFCC")%>%
addPolylines(data = inter3, lng = ~lon, lat = ~lat,
fill = F,
weight = 2,
color = "#FFFFCC")
En ste ejemplose dan los 3 refugios mas cercanos considerando que una persona esta en el centro de Tepic.