miércoles, 8 de abril de 2020

Cómo crear mapas coropléticos utilizando los datos COVID-19 de la Universidad Johns Hopkins.


Chuck Huber, Director Asociado de Alcance Estadístico.

En mi última publicación, aprendimos cómo importar los datos sin procesar de COVID-19 del repositorio GitHub de Johns Hopkins y convertir los datos sin procesar en datos de series temporales. Esta publicación demostrará cómo descargar datos en bruto y crear mapas coropléticos como la figura 1.

Figura 1: Casos confirmados de COVID-19 en los Estados Unidos, ajustados por tamaño de población.




Un mapa coroplético muestra información estadística sobre áreas geográficas utilizando diferentes colores o intensidad de sombreado. La Figura 1 muestra el número ajustado por la población de casos confirmados de COVID-19 para cada condado en los Estados Unidos a partir del 2 de abril de 2020. Cada tono de azul en el mapa representa el rango del número de casos que se muestran en la leyenda inferior izquierda del mapa. Utilicé el comando grmap contribuido por la comunidad para crear la figura 1, y necesitamos tres datos sobre cada condado para crear este mapa. Necesitamos la información geográfica de cada condado, el número de casos confirmados en cada condado y la población de cada condado.

Comencemos por el final y avancemos hacia atrás para aprender cómo construir un conjunto de datos que contenga esta información. Los datos enlistados a continuación se utilizaron para crear el mapa en la figura 1. Cada observación contiene información sobre un condado individual en los Estados Unidos.





Las primeras cuatro variables contienen información geográfica sobre cada condado. La variable _ID contiene un número de identificación único para cada condado que se utiliza para vincular con un archivo especial llamado "shapefile". Los shapefiles contienen la información que se utiliza para representar el mapa y se explicarán a continuación. La variable GEOID es un código de condado del Estándar Federal de Procesamiento de Información (FIPS). Podemos usar el código FIPS como una variable clave para fusionar datos de otros archivos. Las variables _CX y _CY contienen coordenadas geográficas. Podemos descargar estos datos de la Oficina del Censo de los Estados Unidos.


La variable confirmed contiene el número de casos confirmados de COVID-19 en cada condado. Estos datos se descargaron del repositorio GitHub Johns Hopkins. Este no es el mismo archivo que utilizamos en mis publicaciones anteriores.

La variable popestimate2019 contiene la población de cada condado. Estos datos fueron descargados de la Oficina del Censo de los Estados Unidos.
La variable confirmed_adj contiene el número de casos confirmados por 100,000 habitantes. Esta variable se calcula dividiendo el número de casos para cada condado en confirmed entre la población total para cada condado en popestimate2019. El resultado se multiplica por 100,000 para convertirlo en "casos por 100,000 habitantes".

Tendremos que descargar datos de tres fuentes diferentes y fusionar estos archivos en un solo conjunto de datos para construir el conjunto de datos para nuestro mapa. Comencemos descargando y procesando cada uno de estos conjuntos de datos.

Lista de temas

Descargue y prepare los datos geográficos
Descargue y prepare los datos del caso
Descargar y preparar los datos de la población
Cómo fusionar los archivos y calcular recuentos ajustados
Cómo crear el mapa coroplético con grmap

Descargue y prepare los datos geográficos

Comencemos con los datos geográficos. Los shapefiles contienen la información geográfica que grmap usa para crear mapas. Muchos shapefiles están disponibles gratuitamente en internet, y puede localizarlos utilizando un motor de búsqueda. Por ejemplo, busqué los términos "united states shapefile", y el primer resultado me llevó a la Oficina del Censo de los Estados Unidos. Este sitio web contiene shapefiles para los Estados Unidos que muestran los límites de los estados, distritos del Congreso, áreas estadísticas metropolitanas, micropolitanas y muchos otros. Me gustaría subdividir mi mapa de los Estados Unidos por condado, así que me desplacé hacia abajo hasta que encontré el título "County". Me gustaria usar el archivo cb_2018_us_county_500k.zip.



Podemos copiar el archivo desde el sitio web a nuestra unidad local y usar unzipfile para extraer el contenido del archivo. Puede hacer clic con el botón derecho en el archivo en la página web, seleccionar "Copiar dirección de enlace" y pegar la ruta y el nombre de archivo en su comando copy.




Los archivos cb_2018_us_county_500k.shp y cb_2018_us_county_500k.dbf contienen la información geográfica que necesitamos. Podemos usar spshape2dta para procesar la información en estos archivos y crear dos conjuntos de datos Stata llamados usacounties_shp.dta y usacounties.dta.




El archivo usacounties_shp.dta es el shapefile que contiene la información que grmap usará para representar el mapa. No necesitamos hacer nada con este archivo, pero describamos y enlistemos su contenido para ver qué contiene.



El shapefile, usacounties_shp.dta, contiene 1,047,409 coordenadas que definen los límites de cada condado en nuestro mapa. Este archivo también incluye la variable _ID, que se utiliza para vincular estos datos con los datos en usacounties.dta. Necesitaremos este archivo más tarde.


A continuación, usemos y describamos el contenido de usacounties.dta.




Las primeras tres variables contienen información geográfica sobre cada estado. La variable _ID es el identificador de unidad espacial para cada condado que se utiliza para vincular este archivo con el shapefile, usacounties_shp.dta. Las variables _CX y _CY son las coordenadas x e y del centroide del área para cada condado. La variable NAME contiene el nombre del condado para cada observación. La variable GEOID es el código FIPS almacenado como una cadena. Necesitaremos un código FIPS numérico para fusionar este conjunto de datos con otros conjuntos de datos a nivel de condado. Entonces, generemos una variable llamada fips que sea igual al valor numérico de GEOID.



Guardemos nuestros datos geográficos y pasemos a los datos COVID-19.



Descargue y prepare los datos del caso


En mis publicaciones anteriores, aprendimos cómo descargar los datos en bruto de COVID-19 del repositorio GitHub Johns Hopkins. Utilizaremos un conjunto de datos diferente de otra rama del repositorio de GitHub ubicado aquí.



El archivo time_series_covid19_confirmed_US.csv contiene datos de series de tiempo para el número de casos confirmados de COVID-19 para cada condado en los Estados Unidos. Hagamos clic en el nombre del archivo para ver su contenido.

 Cada observación en este archivo contiene los datos de un condado o territorio en los Estados Unidos. Los recuentos confirmados para cada fecha se almacenan en variables separadas. Veamos los datos delimitados por comas haciendo clic en el botón "Raw" junto a la flecha roja. 




Para importar los datos de caso sin procesar, copie la URL y el nombre de archivo de la barra de direcciones en su navegador web, y pegue la dirección web en  import delimited.


Tenga en cuenta que la URL del archivo de datos es larga y se ajusta a una segunda y tercera línea en nuestro comando import delimited. Esta URL debe ser una línea en su comando import delimited. Describamos este conjunto de datos.



Este conjunto de datos contiene 3,253 observaciones que contienen información sobre condados en los Estados Unidos. Hagamos una lista de las primeras 10 observaciones para fips, combine_key, v80, v81, v82 y v83.


La variable fips contiene el código de condado FIPS que usaremos para fusionar este conjunto de datos con la información geográfica en usacounties_shp.dta. La variable combine_key contiene el nombre de cada condado y estado en los Estados Unidos. Y las variables v80, v81, v82 y v83 contienen el número de casos confirmados de COVID-19 desde el 30 de marzo de 2020 hasta el 2 de abril de 2020. Los datos de casos más recientes se almacenan en v83, así que cambiemos su nombre a confirmed.


Encontraremos problemas más adelante cuando fusionamos conjuntos de datos si fips contiene valores faltantes. Así que borremos cualquier observación que falte para fips.


Nuestra base de datos COVID-19 está completa. Guardemos los datos y movámonos a los datos de población.


Descargar y preparar los datos de la población


Podríamos detenernos aquí, fusionar los datos geográficos con la cantidad de casos confirmados y crear un mapa coroplético de la cantidad de casos para cada condado. Pero esto sería engañoso porque las poblaciones de los condados son diferentes. Podríamos preferir informar la cantidad de casos por cada 100,000 personas, y eso requeriría conocer la cantidad de personas en cada condado. Afortunadamente, esos datos están disponibles en el sitio web de la Oficina del Censo de los Estados Unidos.


Podemos seguir los mismos pasos que utilizamos para descargar e importar los datos del caso. Primero, haga clic con el botón derecho en el nombre del archivo en el sitio web, luego seleccione “Copiar dirección de enlace” y use  import delimited para importar los datos.



Normalmente describiría el conjunto de datos en este punto, pero hay 164 variables en este conjunto de datos. Entonces, describiré solo las variables relevantes a continuación.


La variable census2010pop contiene la población de cada condado según el censo de 2010. Pero esa información tiene 10 años. La variable popestimate2019 es una estimación de la población de cada condado en 2019. Usemos esos datos pues son más recientes.


A continuación, enlistamos los datos.


Este conjunto de datos no incluye una variable con un código de condado FIPS. Pero podemos crear una variable que contenga el código FIPS usando las variables state y county. La inspección visual de los datos geográficos en usacounties.dta indica que el código FIPS de condado es el código de estado seguido del código de estado de tres dígitos. Así que creemos nuestra variable de código fips multiplicando el código state por 1000 y luego agregando el código county.


Hagamos una lista de los datos del condado para verificar nuestro trabajo.


Este conjunto de datos contiene la población estimada de cada estado junto con la variable fips que usaremos como una variable clave para fusionar este archivo de datos con los otros archivos de datos. Guardemos nuestros datos.


Cómo fusionar los archivos y calcular recuentos ajustados


Hemos creado tres archivos de datos que contienen la información que necesitamos para crear nuestro mapa coroplético. El archivo de datos usacounties.dta contiene la información geográfica que necesitamos en las variables _ID, _CX y _CY. Recuerde que estos datos están vinculados al archivo shape, usacounties_shp.dta, utilizando la variable _ID. El archivo de datos covid19_county.dta contiene la información sobre el número de casos confirmados de COVID-19 en la variable confirmed. Y el archivo de datos census_popn.dta contiene la información sobre la población de cada condado en la variable popestimate2019.

Necesitamos todas estas variables en el mismo conjunto de datos para crear nuestro mapa. Podemos fusionar estos archivos usando la variable clave fips.


Comencemos usando solo las variables que necesitamos de usacounties.dta.


A continuación, combinemos el número de casos confirmados de covid19_county.dta. La opción keepusing (province_state combined_key_confirmed) especifica que fusionaremos solo las variables province_state, combined_key y confirmed a partir del archivo de datos covid19_state.dta.


La salida nos dice que 3,142 observaciones tenían valores coincidentes de fips en los dos conjuntos de datos. merge también creó una nueva variable en nuestro conjunto de datos llamada _merge, que equivale a 3 para observaciones con valores coincidentes de fips.


La salida también nos dice que 91 observaciones tenían un código fips en los datos geográficos, pero no en los datos del caso. _merge es igual a 1 para estas observaciones. Hagamos una lista de algunas de estas observaciones.


Las primeras siete observaciones tienen información geográfica pero no hay datos para confirmed. Vamos a contar el número de observaciones donde _merge es igual a 1 y done falten los datos de confirmed.



Borremos estas observaciones de nuestro conjunto de datos pues no contienen datos para confirmed.


La salida de merge también nos dice que 109 observaciones tenían un código fips en los datos del caso, pero no en los datos geográficos. _merge es igual a 2 para estas observaciones. Hagamos una lista de algunas de estas observaciones.


Las primeras siete observaciones tienen información de casos pero no datos para _ID o GEOID.


Algunas de las observaciones son de territorios estadounidenses que no son estados. Otras observaciones tienen un valor de combined_key que sugiere que la información del condado no está clara. La inspección visual de estas observaciones sugiere que la mayoría de los casos confirmados para estas observaciones son cero. Podemos verificar esto contando el número de observaciones donde _merge es igual a 2 y confirmed es igual a cero.


El resultado indica que 78 de las 109 observaciones no contienen casos confirmados. Podríamos investigar más estas observaciones si estuviéramos utilizando nuestros resultados para tomar decisiones políticas. Pero estas observaciones son una pequeña proporción de nuestro conjunto de datos, y nuestro objetivo actual es solo aprender a hacer mapas coropléticos. Así que eliminemos estas observaciones y la variable _merge y sigamos adelante.


Describamos el conjunto de datos para verificar que la fusión se realizó correctamente.


A continuación, combinemos la variable popestimate2019 del archivo de datos census_popn.dta.



La salida nos dice que 3,142 observaciones tenían valores coincidentes de fips en los dos conjuntos de datos. merge nuevamente creó una nueva variable en nuestro conjunto de datos llamada _merge, que es igual a 3 para observaciones con un valor coincidente de fips.

El resultado también nos dice que 51 observaciones tenían un código fips en los datos geográficos, pero no en los datos de la población. _merge es igual a 2 para estas observaciones. Hagamos una lista de algunas de estas observaciones.


No tenemos información geográfica o de caso para estas observaciones, por lo tanto, elimínelas de nuestro conjunto de datos y eliminemos la variable _merge.


Ahora, generemos, etiquetemos y formateemos una nueva variable llamada confirmed_adj que contenga el número ajustado por la población de casos confirmados de COVID-19.




Describamos nuestro conjunto de datos para verificar que contiene todas las variables que necesitaremos para crear nuestro mapa.






Nuestro conjunto de datos está completo! Guardemos el conjunto de datos y aprendamos cómo crear un mapa coroplético.


Cómo crear el mapa coroplético con grmap

Utilizaremos el comando grmap, contribuido por la comunidad, para crear nuestro mapa coroplético. Debe activar grmap antes de usarlo por primera vez.


La creación de un mapa que incluya Alaska y Hawái requerirá el uso de opciones que se ajusten a su gran diferencia de tamaño y a que no sean físicamente adyacentes a los otros 48 estados. Me gustaría mantener nuestro mapa lo más simple posible por ahora, así que voy a borrar las observaciones de Alaska y Hawai.



A continuación, debemos decirle a Stata que estos son datos espaciales mediante el uso de spset. La opción modify shpfile(usastates_shp) vinculará nuestros datos con el shapefile, usastates_shp.dta

Recuerde que el shapefile contiene la información que grmap usará para representar el mapa.



Ahora, podemos usar grmap para crear un mapa de coropletas para el número de casos confirmados de COVID-19 ajustado por la población.


Figura 2: Mapa de coropletas usando sectiles.




Por defecto, grmap divide los datos en cuatro grupos basados en cuartiles de confirmed_adj. He usado la opción clnumber(7) para dividir los datos en 7 grupos o sectiles. Puede cambiar el número de grupos utilizando la opción clnumber(#), donde # es el número de categorías de colores.


También puede especificar puntos de corte personalizados utilizando las opciones clmethod(custom) y clbreaks(numlist). El siguiente mapa utiliza puntos de corte personalizados en 0, 5, 10, 15, 20, 25, 50, 100 y 5000. También he agregado un título y un subtítulo.






Figura 2: Mapa coroplético utilizando puntos de corte personalizados.





Conclusiones y código recopilado


¡Lo hicimos! ¡Creamos un mapa coroplético del número ajustado por la población de casos confirmados de COVID-19 en cada condado de los Estados Unidos! Repasemos los pasos básicos. Primero, descargamos los datos geográficos de la Oficina del Censo de los Estados Unidos y los convertimos en archivos de datos Stata usando spshape2dta. En segundo lugar, descargamos, importamos y procesamos los datos COVID-19 del repositorio GitHub Johns Hopkins y los guardamos en un archivo de datos Stata. 

En tercer lugar, descargamos, importamos y procesamos los datos de población de cada condado de la Oficina del Censo de los Estados Unidos y los guardamos en un archivo de datos de Stata. Cuarto, fusionamos los archivos de datos de Stata y calculamos el número de casos COVID-19 ajustados por la población para cada condado. Y quinto, usamos spset para decirle a Stata que estos son datos espaciales, y usamos grmap para crear nuestro mapa coroplético. Puede seguir estos pasos para crear un mapa coroplético para muchos tipos de datos, para otras subdivisiones de los Estados Unidos o para otros países.

He recopilado el siguiente código que reproducirá las figuras 2 y 3.

// Create the geographic datasets
clear
copy https://www2.census.gov/geo/tiger/GENZ2018/shp/cb_2018_us_county_500k.zip ///
     cb_2018_us_county_500k.zip
unzipfile cb_2018_us_county_500k.zip
spshape2dta cb_2018_us_county_500k.shp, saving(usacounties) replace
use usacounties.dta, clear
generate fips = real(GEOID)
save usacounties.dta, replace
// Create the COVID-19 case dataset
clear
import delimited https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_US.csv
rename v83 confirmed
drop if missing(fips)
save covid19_county, replace
// Create the population dataset
clear
import delimited https://www2.census.gov/programs-surveys/popest/datasets/2010-2019/counties/totals/co-est2019-alldata.csv
generate fips = state*1000 + county
save census_popn, replace
// Merge the datasets
clear
use _ID _CX _CY GEOID fips using usacounties.dta
merge 1:1 fips using covid19_county  ///
     , keepusing(province_state combined_key confirmed)
keep if _merge==3
drop _merge
merge 1:1 fips using census_popn  ///
     , keepusing(census2010pop popestimate2019)
keep if _merge==3
drop _merge
drop if inlist(province_state, "Alaska", "Hawaii")
generate confirmed_adj = 100000*(confirmed/popestimate2019)
label var confirmed_adj "Cases per 100,000"
format %16.0fc confirmed_adj
format %16.0fc confirmed popestimate2019
save covid19_adj, replace

// Create the maps
grmap, activate
spset, modify shpfile(usacounties_shp)
grmap confirmed_adj, clnumber(7)
grmap confirmed_adj,                                           ///
     clnumber(8)                                               ///
     clmethod(custom)                                          ///
     clbreaks(0 5 10 15 20 25 50 100 5000)                     ///
     title("Confirmed Cases of COVID-19 in the United States") ///
     subtitle("cases per 100,000 population")





Eso es todo por hoy. ¡Gracias por leernos!