Nuestros aventureros clientes a menudo llevan a cabo arriesgadas misiones para recopilar datos en ubicaciones remotas, armados con dispositivos GPS para obtener coordenadas de latitud y longitud, precisando los lugares exactos donde se llevan a cabo las entrevistas cara a cara. Impresionante, ¿verdad? Sin embargo, el peligro acecha en las sombras: ¡el riesgo de reidentificación! Pero no temáis, compañeros exploradores, porque tenemos la solución… ¡¡¡Menéalo!!!
En esta publicación, mostraremos cómo minimizar este riesgo mediante el desplazamiento de coordenadas utilizando los procedimientos de desplazamiento geográfico desarrollados por nuestros amigos de ICF International para el proyecto DHS. Este procedimiento tiene como objetivo equilibrar la necesidad de proteger la confidencialidad de los encuestados con la necesidad de poner a disposición del público datos analíticamente útiles.
El procedimiento implica desplazar aleatoriamente las posiciones de latitud y longitud del GPS para todas las encuestas de manera aleatoria, de modo que la ubicación de las encuestas:
- Urbanas tengan un error mínimo de 0 y un error máximo de 2 kilómetros..
- Rurales tengan un error mínimo de 0 y un error máximo de 5 kilómetros, con un 1% adicional de los conglomerados rurales desplazados entre 0 y 10 kilómetros.
- Configurar el entorno:
El código comienza cargando los paquetes de R necesarios utilizando la herramienta de gestión de paquetes pacman. Importa varios paquetes como dplyr, maps, ggplot2, spatstat y otros que se requieren para la manipulación de datos, la visualización y las operaciones espaciales.
if (!require("pacman")) install.packages("pacman") library ("pacman") pacman::p_load(dplyr, maps, ggplot2, maptools, raster, rgdal, mapproj, spatstat, rgeos, splancs, fields, geosphere, tibble, labelled, rmarkdown)
- Generar datos aleatorios en Ghana:
A continuación, generamos un conjunto de datos aleatorios de GPS con coordenadas de longitud y latitud para demostrar el procedimiento. Para esta demostración, seleccionamos Ghana. El siguiente código crea un marco de datos llamado «mydata» con columnas para latitud y longitud. La función runif() se utiliza para generar valores aleatorios para latitud y longitud dentro de los rangos especificados.
n <- 100 set.seed(123) lat <- runif(n, min = 6, max = 8) lon <- runif(n, min = -2, max = 0) mydata <- as.data.frame(cbind(lat, lon))
- Combinar los GPS desplazados en el conjunto de datos:
Ahora estamos listos para crear nuestra primera función para combinar las coordenadas de GPS desplazadas en el conjunto de datos original. La función «displace.merger()» toma como entrada el objeto de GPS desplazado y los nombres de columna para latitud y longitud. La función crea un nuevo marco de datos llamado «mydata.displaced» que combina el conjunto de datos original con las coordenadas de GPS desplazadas. Reemplaza las columnas originales de latitud y longitud con los valores desplazados.
displace.merger <- function (displacedGPS, gps.vars) { displaced.df <- data.frame(coordinates(displacedGPS)) row.names(displaced.df) <- which(complete.cases(mydata[,gps.vars])) mostattributes(displaced.df$coords.x1) <- attributes(mydata[,gps.vars[1], drop=T]) mostattributes(displaced.df$coords.x2) <- attributes(mydata[,gps.vars[1], drop=T]) mydata.displaced <- left_join(rownames_to_column(mydata), rownames_to_column(displaced.df), by = ("rowname")) mydata.displaced[,gps.vars] <- mydata.displaced[,c("coords.x1", "coords.x2")] mydata.displaced <- mydata.displaced[!names(mydata.displaced) %in% c("rowname", "coords.x1", "coords.x2")] return (mydata.displaced) }
- Procedimiento de desplazamiento geográfico basado en la política DHS
Procedimiento de desplazamiento geográfico basado en la política DHS: A continuación, creamos nuestra función principal de desplazamiento de GPS. La función «displace()» se define para realizar el procedimiento de desplazamiento geográfico. Toma como argumentos los nombres de columna para latitud y longitud, los datos de límites administrativos (admin), el número de muestras a generar (samp_num) y el número de puntos a generar aleatoriamente alrededor de cada coordenada de GPS (other_num). La función comienza trazando los puntos de GPS originales en un mapa. Luego, procede a realizar el procedimiento de desplazamiento utilizando una serie de pasos que incluyen el búfer, la intersección con los límites administrativos y la generación de puntos aleatorios. Los puntos de GPS desplazados resultantes se combinan con el conjunto de datos original utilizando la función «displace.merger()». La función también incluye gráficos adicionales para visualizar los puntos de GPS desplazados. Finalmente, devuelve el conjunto de datos desplazado. Esta función es una adaptación en R del código original en Python de Brendan Collis (Blue Raster) y publicado por DHS: https://dhsprogram.com/pubs/pdf/SAR7/SAR7.pdf.
La función es un poco extensa, por lo que no la vamos a incluir aquí, pero puedes encontrarla en nuestro Github.
- Cargar archivos de datos geoespaciales
Cargamos los datos del mapa necesarios utilizando la función map_data(). Específicamente filtramos los datos para centrarnos en Ghana, especificando la región como «Ghana». A continuación, obtenemos los datos de los límites administrativos de Ghana. En la línea de código comentada, hay un método alternativo que utiliza la función raster::getData(), la cual te permite obtener el mapa del país basado en los códigos de país de 2 letras estándar directamente desde el servidor de UC Davis. Sin embargo, ten en cuenta que este servidor a menudo está fuera de servicio, por lo que preferimos descargar el archivo .rds y luego cargarlo localmente utilizando la función readRDS() para leer los datos de los límites administrativos directamente desde un archivo llamado «gadm36_GHA_0_sp.rds». Este archivo contiene información espacial sobre los límites nacionales de Ghana y es utilizado por la función displace() para asegurar que los puntos desplazados no se encuentren más allá de los límites nacionales. Este procedimiento puede especificarse en niveles administrativos inferiores si es necesario, descargando el archivo .rds correspondiente.
countrymap <- map_data("world") %>% filter(region=="Ghana") #!!! Select correct country #admin <- raster::getData("GADM", country="GH", level=0) #!!! Select correct country map using standard 2-letter country codes: https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2 admin <- readRDS(file="gadm36_GHA_0_sp.rds")
- Ejecutar el proceso de desplazamiento
Finalmente, especificamos las variables relevantes creando un vector llamado gps.vars con los nombres de columna «lon» y «lat». Es importante tener en cuenta que la longitud siempre debe ir primero, seguida de la latitud. Luego llamamos a la función displace(), pasando el vector gps.vars junto con otros argumentos. La función displace() realiza un procedimiento de desplazamiento geográfico en los datos de GPS. Toma los datos de los límites administrativos, almacenados en la variable admin, así como el número de muestras a generar (samp_num) y el número de puntos a generar aleatoriamente alrededor de cada coordenada de GPS (other_num).
Ejecutar este código puede llevar algunos minutos en completarse, ya que el procedimiento de desplazamiento implica múltiples pasos. Procesa los datos de GPS y genera un nuevo conjunto de datos llamado mydata con los puntos de GPS desplazados.
gps.vars <- c("lon", "lat") # !!!Include relevant variables, always longitude first, latitude second. mydata <- displace(gps.vars, admin=admin, samp_num=1, other_num=100000) # May take a few minutes to process.
[1] «Summary Long/Lat statistics before displacement»
lon lat
Min. :-1.97907 Min. :6.001
1st Qu.:-1.38781 1st Qu.:6.491
Median :-1.00017 Median :6.933
Mean :-0.97155 Mean :6.997
3rd Qu.:-0.57727 3rd Qu.:7.511
Max. :-0.02872 Max. :7.989
Los puntos de GPS desplazados se muestran a continuación en rojo, con su ubicación original en negro.
A continuación mostramos un detalle más cercano. Como puedes ver, el desplazamiento es relativamente menor, preservando la mayoría de las ventajas analíticas de los datos de GPS, al tiempo que introduce suficiente incertidumbre en la ubicación original de la entrevista para minimizar el riesgo de reidentificación.
«Summary Long/Lat statistics after displacement»
lon lat
Min. :-1.98104 Min. :5.995
1st Qu.:-1.40776 1st Qu.:6.506
Median :-1.01086 Median :6.926
Mean :-0.97139 Mean :6.996
3rd Qu.:-0.56935 3rd Qu.:7.524
Max. : 0.01255 Max. :8.003
«Processing time = 59 seconds»
Este procedimiento puede ser útil en diversas aplicaciones donde sea necesario preservar la confidencialidad de los datos geoespaciales. Así que recuerda, al tratar con datos de GPS junto con otra información confidencial siempre te queda una opción… ¡¡¡Menéalo!!!
Ten en cuenta que el código proporcionado en la publicación del blog podría requerir modificaciones o refinamientos adicionales según los casos de uso específicos y los requisitos de los datos. Siempre se recomienda revisar y adaptar cuidadosamente el código para que se ajuste a tus necesidades específicas.
Sobre Rosan International
ROSAN es una empresa tecnológica especializada en el desarrollo de soluciones de Data Science e Inteligencia Artificial con el objetivo de ayudar a resolver algunos de los más desafiantes retos globales. Contáctanos para descubrir cómo podemos ayudarte a extraer la información más valiosa de tus datos y optimizar tus procesos.