Diego Valle-Jones's Bloghttps://blog.diegovalle.net/2022-11-14T00:00:00+01:00Shapefiles from the 2020 INEGI Census2022-11-14T00:00:00+01:00Diego Valle-Jonestag:blog.diegovalle.net,2022-11-14:2022/11/inegi-mexico-2020-census-shapefiles.html<p><a href="/images/posts/inegi-census-shapefiles/mexico.jpg">
<img alt="Streets of Mexico City" class="image-process-article-image" src="/images/posts/inegi-census-shapefiles/derivatives/article-image/mexico.jpg"/>
</a></p>
<p>You can now download shapefiles of selected geographic areas from the
latest <span class="caps">INEGI</span> <a href="https://gaia.inegi.org.mx/scince2020/"><span class="caps">SCINCE</span></a>
database. In addition to geospatial information on state and
municipios, the files include <a href="https://www.inegi.org.mx/app/scitel/Default?ev=10"><span class="caps">AGEB</span> and
manzana</a>
boundaries. The files are available in shapefile format and include
demographic data</p>
<p>If you don’t know how to run the script or prefer to simply download
the data, you can subscribe to my newsletter (one email per post) and
you’ll get the shapefile download links directly in your inbox as a bonus.</p>
<p><br/>
</p><div id="envelope" style="border-color:#023F50;width:87%;margin:0;background-color:rgba(61, 121, 138, 1);padding:1em;font-family: 'PT Sans', sans-serif;">
<div class="mc_embed_signup" style="overflow: hidden;
text-align: left;">
<div class="form-top-left" style="float: left;
width: 75%;
padding-top: 25px;">
<h3 style="color:white;margin:0;font-family: 'PT Sans', sans-serif;">Subscribe to my <span class="free" style="color: #C7B720;">free</span> newsletter</h3>
<br/>
<p style="opacity:1;color:white;font-family: 'PT Sans', sans-serif;font-size:80%"><b>My email list is pretty simple: one email for each new post or project. If you join over 5,000 subscribers to my newsletter from Harvard, Stanford, Google, McKinsey, and many more, you’ll receive as a welcome gift the 100+ shapefiles described in this post (It’s more than <span class="caps"><span class="caps">7GB</span></span> of data and totally free)</b></p>
<p></p><ul style="opacity:1;color:white;font-family: 'PT Sans', sans-serif;font-size:80%">
<li>Shapefiles of Manzanas, AGEBs, Municipios, Estados, and more
</li>
<li>
The latest shapefiles from the 2020 Census
</li>
<li>Includes historical shapefiles from 2010 census</li>
<li><a href="https://www.diegovalle.net/privacy/">Privacy policy</a></li>
<li>Unsubscribe at any time</li>
<p></p></ul><p></p>
<!-- <p>Enter your email below to get instant access:</p> -->
</div>
<div class="form-top-right" style=" float: left;
width: 25%;
padding-top: 5px;
font-size: 66px;
color: #fff;
line-height: 100px;
text-align: right;
opacity: 0.3;">
<i class="fa fa-pencil"></i>
</div>
</div>
<div class="form-bottom">
<form action="https://www.diegovalle.net/api/newsletter" class="registration-form" id="Newsletter" method="post" novalidate="novalidate" role="form">
<!-- <div class="form-group">
<label class="sr-only" for="form-first-name">First name</label>
<input type="text" name="form-first-name" placeholder="First name..." class="form-first-name form-control" id="form-first-name">
</div>
<div class="form-group">
<label class="sr-only" for="form-last-name">Last name</label>
<input type="text" name="form-last-name" placeholder="Last name..." class="form-last-name form-control" id="form-last-name">
</div> -->
<div class="form-group">
<label for="email"><strong style="color:white;font-family: 'PT Sans', sans-serif;font-weight: 100;
font-size: 90%;">Where should I send the newsletter and shapefiles?</strong></label>
</div>
<div class="form-group">
<label class="sr-only" for="form-email" style=" position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;">Email</label>
<input aria-required="true" class="form-email form-control" id="email" name="email" placeholder="Email..." required="" type="email"/>
</div>
<div style="position: absolute; left: -5000px;"><input name="website" style="height: 50px;margin: 0;padding: 0 20px;vertical-align: middle;background: #fff;border: 3px solid #fff;font-size: 16px;font-weight: 300;line-height: 50px;color: #888;-moz-border-radius: 4px;-webkit-border-radius: 4px;border-radius: 4px;-moz-box-shadow: none;-webkit-box-shadow: none;box-shadow: none;-o-transition: all .3s;-moz-transition: all .3s;-webkit-transition: all .3s;-ms-transition: all .3s;transition: all .3s;" tabindex="-1" type="text" value="fatcatseat2much"/>
<input name="referrer" tabindex="-1" type="text" value="2015shapefiles"/>
</div>
<input class="hiddenRecaptcha_post required" id="hiddenRecaptcha_post" name="hiddenRecaptcha_post" type="hidden"/>
<div class="g-recaptcha" data-sitekey="6LdhprAZAAAAAONu3rfxTPNGCIjjHbH06dqVerDd" id="recaptcha_post"></div><br/>
<button class="btn" style="height: 50px;margin: 0;padding: 0 20px;vertical-align: middle;border: 0;font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 16px;font-weight: 900;line-height: 50px;color: #fff;-moz-border-radius: 4px;-webkit-border-radius: 4px;border-radius: 4px;text-shadow: none;-moz-box-shadow: none;-webkit-box-shadow: none;box-shadow: none;-o-transition: all .3s;-moz-transition: all .3s;-webkit-transition: all .3s;-ms-transition: all .3s;transition: all .3s;" type="submit">Get your free newsletter</button>
</form>
</div>
</div>
<br/>
<p>If you use linux you can use the following script or if you’re unable to run the script you can always use the <a href="https://github.com/diegovalle/docker_scince_2020">docker</a> <a href="https://hub.docker.com/r/diegovalle/scince_2020">image</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>docker run -v <span class="s2">"</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">/scince_2020"</span>:/scince_2020 diegovalle/scince_2020
</pre></div>
</td></tr></table>
<p><br/>
<style>
/<em> https://github.com/lonekorean/gist-syntax-themes </em>/
@import url('https://cdn.rawgit.com/lonekorean/gist-syntax-themes/d49b91b3/stylesheets/idle-fingers.css');</p>
<p>@import url('https://fonts.googleapis.com/css?family=Open+Sans');
body {
font: 16px 'Open Sans', sans-serif;
}
body .gist .gist-file {
border-color: #555 #555 #444
}
body .gist .gist-data {
border-color: #555
}
body .gist .gist-meta {
color: #ffffff;
background: #373737;
}
body .gist .gist-meta a {
color: #ffffff
}
body .gist .gist-data .pl-s .pl-s1 {
color: #a5c261
}
</style></p>
<script src="https://gist.github.com/diegovalle/af936552e0998174313154a2ea9e92a9.js"></script>
<p><a href="/images/posts/inegi-census-shapefiles/cdmx.jpg">
<img alt="Streets of Mexico City" class="image-process-article-image" src="/images/posts/inegi-census-shapefiles/derivatives/article-image/cdmx.jpg"/>
</a></p>The most polluted cities in Mexico2018-05-27T00:00:00+02:00Diego Valle-Jonestag:blog.diegovalle.net,2018-05-27:2018/05/most-polluted-cities-in-mexico.html<p><a href="/images/posts/most-polluted-cities-in-mexico/most-polluted-cities-in-mexico.png">
<img alt="PM10 pollution in Guadalajara, Jalisco" class="image-process-article-image" src="/images/posts/most-polluted-cities-in-mexico/derivatives/article-image/most-polluted-cities-in-mexico.png"/>
</a></p>
<p>I’ve created an R package to download air quality data from the
website of the
<em><a href="http://sinaica.inecc.gob.mx/">Sistema Nacional de Información de la Calidad del Aire</a></em>
and published it to <span class="caps">CRAN</span>. To install it you have to type the following:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>install.packages<span class="p">(</span><span class="s">"rsinaica"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p>you can also install the development version by typing:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="highlight"><pre><span class="kr">if</span> <span class="p">(</span><span class="o">!</span><span class="kn">require</span><span class="p">(</span>devtools<span class="p">))</span> <span class="p">{</span>
install.packages<span class="p">(</span><span class="s">"devtools"</span><span class="p">)</span>
<span class="p">}</span>
devtools<span class="o">::</span>install_github<span class="p">(</span><span class="s">"diegovalle/rsinaica"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>Website</td>
<td><a href="https://hoyodesmog.diegovalle.net/rsinaica/">https://hoyodesmog.diegovalle.net/rsinaica/</a></td>
</tr>
<tr>
<td>Download from <span class="caps">CRAN</span></td>
<td><a href="https://cran.r-project.org/package=rsinaica">https://cran.r-project.org/package=rsinaica</a></td>
</tr>
<tr>
<td>Browse source code</td>
<td><a href="https://github.com/diegovalle/rsinaica">https://github.com/diegovalle/rsinaica</a></td>
</tr>
<tr>
<td>Report bugs</td>
<td><a href="https://github.com/diegovalle/rsinaica/issues">https://github.com/diegovalle/rsinaica/issues</a></td>
</tr>
</tbody>
</table>
<p>The <em>Instituto Nacional de Ecología y Cambio Climático</em> (<span class="caps">INECC</span>)
created the <a href="http://sinaica.inecc.gob.mx"><span class="caps">SINAICA</span> website</a> to gather
the information generated by the more than a hundred air quality
monitoring stations located throughout Mexico. The pollution and
meteorological information is generated by the monitoring stations run
by the state and local authorities, who then transmit it to <span class="caps">SINAICA</span>.</p>
<p>The <code>rsinaica</code> package provides tools for downloading that information; for example, you
can easily create <a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/rsinaica.html">pollution maps</a>:</p>
<p><a href="/images/posts/most-polluted-cities-in-mexico/guadalajara.png">
<img alt="Map of PM10 pollution in Guadalajara during 2017" class="image-process-article-image" src="/images/posts/most-polluted-cities-in-mexico/derivatives/article-image/guadalajara.png"/>
</a></p>
<p>And rank cities by how polluted they are (be sure to click the links):</p>
<h5><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/ozone_awards.html">Ozone</a></h5>
<p><a href="/images/posts/most-polluted-cities-in-mexico/ozone-vm.png">
<img alt="Valle de México is the most ozone-polluted city in Mexico" class="image-process-large-image" src="/images/posts/most-polluted-cities-in-mexico/derivatives/large-image/ozone-vm.png"/>
</a></p>
<h5><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/pm10_awards.html"><span class="caps">PM</span><sub>10</sub></a></h5>
<p><a href="/images/posts/most-polluted-cities-in-mexico/pm10-monterrey.png">
<img alt="Monterrey is the most PM10-polluted city in Mexico" class="image-process-large-image" src="/images/posts/most-polluted-cities-in-mexico/derivatives/large-image/pm10-monterrey.png"/>
</a></p>
<h5><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/pm25_awards.html"><span class="caps">PM</span><sub>2.5</sub></a></h5>
<p><a href="/images/posts/most-polluted-cities-in-mexico/pm25-toluca.png">
<img alt="Toluca is the most PM2.5-polluted city in Mexico" class="image-process-large-image" src="/images/posts/most-polluted-cities-in-mexico/derivatives/large-image/pm25-toluca.png"/>
</a></p>
<p>Guadalajara gets a special mention since they managed to take second
place in all categories. Congratulations and better luck next year!</p>
<p><a href="/images/posts/most-polluted-cities-in-mexico/top3.png">
<img alt="Toluca is the most PM2.5-polluted city in Mexico" class="image-process-large-image" src="/images/posts/most-polluted-cities-in-mexico/derivatives/large-image/top3.png"/>
</a></p>
<p>The package also has
an <a href="https://hoyodesmog.diegovalle.net/rsinaica/">official website</a>
with several examples:</p>
<ul>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/rsinaica.html">Map of pollution levels</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/airezmvm_vs_rsinaica.html">Comparing rsinaica to aire.zmvm</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/errors.html">Errors in the <span class="caps">SINAICA</span> data</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/ozone_awards.html">Most Ozone-Polluted City in Mexico - 2017</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/pm10_awards.html">Most <span class="caps">PM10</span> Polluted City in Mexico - 2017</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/pm25_awards.html">Most <span class="caps">PM2</span>.5 Polluted City in Mexico - 2017</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/pollution_cdmx_vs_guadalajara.html">Ozone Pollution in <span class="caps">CDMX</span> and Guadalajara</a></li>
<li><a href="https://hoyodesmog.diegovalle.net/rsinaica/articles/articles/trends.html">Long-term pollution trends</a></li>
</ul>How to create crime maps of Mexico City2016-10-31T00:00:00+01:00Diego Valle-Jonestag:blog.diegovalle.net,2016-10-31:2016/10/crime-maps-of-mexico-city.html<p>Thanks to an information request to the <span class="caps">SSP</span>‑<span class="caps">CDMX</span> <a href="https://hoyodecrimen.com">hoyodecrimen.com</a> now has crime data at the
<a href="https://hoyodecrimen.com/mapa#/19.36753/-99.14754/11">latitude and longitude level</a>. You
can access the data systematically using the
<a href="https://hoyodecrimen.com/api"><span class="caps">API</span></a> or
<a href="https://hoyodecrimen.com/acerca">download</a> it in full. In this post
I’ll provide many examples of how to manipulate the <span class="caps">API</span> to create maps.</p>
<p><a href="https://hoyodecrimen.com"><img alt="" src="/images/posts/crime-maps-of-mexico-city/crime-cdmx.jpg"/></a></p>
<h2>I.</h2>
<p>First, we’ll load the R packages we need:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22</pre></div></td><td class="code"><div class="highlight"><pre><span class="kn">library</span><span class="p">(</span><span class="s">"DCluster"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"jsonlite"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"RCurl"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"jsonlite"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"rgdal"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"rgeos"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"ggplot2"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"ggmap"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"RColorBrewer"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"stringr"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"scales"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"geojsonio"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"downloader"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"spdep"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"viridis"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"maptools"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"rvest"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"dplyr"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"stringr"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"stringi"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"geojsonio"</span><span class="p">)</span>
<span class="kn">library</span><span class="p">(</span><span class="s">"knitr"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p>Then, we’ll download a list of all crimes available from hoyodecrimen
(since the data comes from
<a href="https://hoyodecrimen.com/acerca"><span class="caps">FOIA</span> request</a> the specific crimes
available may vary depending on when you access the <span class="caps">API</span>). To do this,
we can use the jsonlite package to convert the <span class="caps">JSON</span> data the <span class="caps">API</span>
endpoints return into data.frames.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2</pre></div></td><td class="code"><div class="highlight"><pre>crimes <span class="o"><-</span> fromJSON<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/crimes"</span><span class="p">)</span><span class="o">$</span>rows
kable<span class="p">(</span>crimes<span class="p">,</span> caption <span class="o">=</span> <span class="s">'List of crimes available from hoyodecrimen.com'</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<table>
<thead>
<tr>
<th align="left">crime</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
</tr>
<tr>
<td align="left"><span class="caps">LESIONES</span> <span class="caps">POR</span> <span class="caps">ARMA</span> <span class="caps">DE</span> <span class="caps">FUEGO</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">METRO</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">METRO</span> <span class="caps">S.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">MICROBUS</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">MICROBUS</span> <span class="caps">S.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">TAXI</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">CASA</span> <span class="caps">HABITACION</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">CUENTAHABIENTE</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">NEGOCIO</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">REPARTIDOR</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">REPARTIDOR</span> <span class="caps">S.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">TRANSEUNTE</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">TRANSEUNTE</span> <span class="caps">S.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">TRANSPORTISTA</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> A <span class="caps">TRANSPORTISTA</span> <span class="caps">S.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> <span class="caps">DE</span> <span class="caps">VEHICULO</span> <span class="caps">AUTOMOTOR</span> <span class="caps">C.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">ROBO</span> <span class="caps">DE</span> <span class="caps">VEHICULO</span> <span class="caps">AUTOMOTOR</span> <span class="caps">S.V.</span></td>
</tr>
<tr>
<td align="left"><span class="caps">VIOLACION</span></td>
</tr>
</tbody>
</table>
<p>All requests to the <span class="caps">API</span> start with the address
<code>https://hoyodecrimen.com/api/v1/</code> followed by the specific path of
the data you want, sometimes with query parameters (the part of the url
followed by ?) specifying the start and end dates of the data you need.</p>
<p>If you wanted to download the sum of all murders commited in <span class="caps">CDMX</span>
since 2014 you’d look up the appropriate method in the
<a href="https://hoyodecrimen.com/api/#get--api-v1-df-crimes-(string-crime)-series">documentation</a>. And
then use the following code to create a chart:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6</pre></div></td><td class="code"><div class="highlight"><pre><span class="c1"># Note that since the crime we want to graph, 'Homicidio Doloso',</span>
<span class="c1"># contains a space we need to encode the URL</span>
homicidio_series <span class="o"><-</span> fromJSON<span class="p">(</span>str_c<span class="p">(</span><span class="s">"https://hoyodecrimen.com"</span><span class="p">,</span>
URLencode<span class="p">(</span><span class="s">"/api/v1/df/crimes/HOMICIDIO DOLOSO/series?start_date=2014-01&end_date=2016-09"</span><span class="p">)))</span><span class="o">$</span>rows
kable<span class="p">(</span><span class="kp">head</span><span class="p">(</span>homicidio_series<span class="p">),</span> caption <span class="o">=</span> <span class="s">'Homicides in CDMX since 2014'</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<table>
<thead>
<tr>
<th align="right">count</th>
<th align="left">crime</th>
<th align="left">date</th>
<th align="right">population</th>
</tr>
</thead>
<tbody>
<tr>
<td align="right">71</td>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
<td align="left">2014-01</td>
<td align="right">8785911</td>
</tr>
<tr>
<td align="right">55</td>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
<td align="left">2014-02</td>
<td align="right">8785911</td>
</tr>
<tr>
<td align="right">91</td>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
<td align="left">2014-03</td>
<td align="right">8785911</td>
</tr>
<tr>
<td align="right">76</td>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
<td align="left">2014-04</td>
<td align="right">8785911</td>
</tr>
<tr>
<td align="right">64</td>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
<td align="left">2014-05</td>
<td align="right">8785911</td>
</tr>
<tr>
<td align="right">78</td>
<td align="left"><span class="caps">HOMICIDIO</span> <span class="caps">DOLOSO</span></td>
<td align="left">2014-06</td>
<td align="right">8785911</td>
</tr>
</tbody>
</table>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5</pre></div></td><td class="code"><div class="highlight"><pre>ggplot<span class="p">(</span>homicidio_series<span class="p">,</span> aes<span class="p">(</span><span class="kp">as.Date</span><span class="p">(</span>str_c<span class="p">(</span><span class="kp">date</span><span class="p">,</span> <span class="s">"-01"</span><span class="p">)),</span> count<span class="p">))</span> <span class="o">+</span>
geom_line<span class="p">()</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"CDMX - HOMICIDIO DOLOSO"</span><span class="p">)</span> <span class="o">+</span>
xlab<span class="p">(</span><span class="s">"date"</span><span class="p">)</span> <span class="o">+</span>
scale_y_continuous<span class="p">(</span>expand <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">),</span> limits <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="m">0</span><span class="p">,</span> <span class="kp">max</span><span class="p">(</span>homicidio_series<span class="o">$</span>count<span class="p">)))</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-2-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-2-1.png"/>
</a></p>
<p>We can also download geojson maps of
<a href="https://hoyodecrimen.com/api/#get--api-v1-cuadrantes-geojson">cuadrantes</a>
and
<a href="https://hoyodecrimen.com/api/#get--api-v1-sectores-geojson">sectores</a>
which we can convert to SpatialPolygonsDataFrame to work with in R.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12</pre></div></td><td class="code"><div class="highlight"><pre><span class="c1"># create a tempory to save the geojson from the API</span>
tmp_cuadrantes <span class="o">=</span> <span class="kp">tempfile</span><span class="p">(</span><span class="s">"cuads"</span><span class="p">,</span> fileext <span class="o">=</span> <span class="s">".json"</span><span class="p">)</span>
download<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/cuadrantes/geojson"</span><span class="p">,</span> tmp_cuadrantes<span class="p">)</span>
<span class="c1"># read the geojson into a spatial object</span>
cuadrantes <span class="o">=</span> readOGR<span class="p">(</span>tmp_cuadrantes<span class="p">,</span> <span class="s">"OGRGeoJSON"</span><span class="p">,</span> verbose <span class="o">=</span> <span class="kc">FALSE</span><span class="p">)</span>
tmp_sectores <span class="o">=</span> <span class="kp">tempfile</span><span class="p">(</span><span class="s">"secs"</span><span class="p">,</span> fileext <span class="o">=</span> <span class="s">".json"</span><span class="p">)</span>
download<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/sectores/geojson"</span><span class="p">,</span> tmp_sectores<span class="p">)</span>
sectores <span class="o">=</span> readOGR<span class="p">(</span>tmp_sectores<span class="p">,</span> <span class="s">"OGRGeoJSON"</span><span class="p">,</span> verbose <span class="o">=</span> <span class="kc">FALSE</span><span class="p">)</span>
plot<span class="p">(</span>cuadrantes<span class="p">,</span> main <span class="o">=</span> <span class="s">"cuadrantes"</span><span class="p">)</span>
plot<span class="p">(</span>sectores<span class="p">,</span> main <span class="o">=</span> <span class="s">"sectores"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/cuadrantes.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/cuadrantes.png"/>
</a></p>
<p><a href="/images/posts/crime-maps-of-mexico-city/sectores.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/sectores.png"/>
</a></p>
<h2><span class="caps">II</span>.</h2>
<p>Now that we have the maps, we can download
<a href="https://hoyodecrimen.com/api/#get--api-v1-sectores-(string-sector)-crimes-(string-crime)-period">period data</a>
(by default the last twelve months) for all crimes and merge
them. Then use the ggmap package to create choropleths on top of a
Google Maps image.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29</pre></div></td><td class="code"><div class="highlight"><pre>crime.sectors <span class="o"><-</span> fromJSON<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/sectores/all/crimes/all/period"</span><span class="p">)</span><span class="o">$</span>rows
<span class="c1">#fortify the data for ggplot2</span>
fsectors <span class="o"><-</span> fortify<span class="p">(</span>sectores<span class="p">,</span> region <span class="o">=</span> <span class="s">"sector"</span><span class="p">)</span>
sector.map <span class="o"><-</span> left_join<span class="p">(</span>fsectors<span class="p">,</span> crime.sectors<span class="p">,</span> by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"id"</span> <span class="o">=</span> <span class="s">"sector"</span><span class="p">))</span>
sector.map<span class="o">$</span>rate <span class="o"><-</span> sector.map<span class="o">$</span>count <span class="o">/</span> sector.map<span class="o">$</span>population <span class="o">*</span> <span class="m">10</span><span class="o">^</span><span class="m">5</span>
crime.cuadrantes <span class="o"><-</span> fromJSON<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/cuadrantes/all/crimes/all/period"</span><span class="p">)</span><span class="o">$</span>rows
fcuadrantes <span class="o"><-</span> fortify<span class="p">(</span>cuadrantes<span class="p">,</span> region <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
cuadrante.map <span class="o"><-</span> left_join<span class="p">(</span>fcuadrantes<span class="p">,</span> crime.cuadrantes<span class="p">,</span> by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"id"</span> <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">))</span>
cuadrante.map<span class="o">$</span>rate <span class="o"><-</span> cuadrante.map<span class="o">$</span>count <span class="o">/</span> cuadrante.map<span class="o">$</span>population <span class="o">*</span> <span class="m">10</span><span class="o">^</span><span class="m">5</span>
draw_gmap <span class="o"><-</span> <span class="kr">function</span><span class="p">(</span>map<span class="p">,</span> crimeName<span class="p">,</span> bb<span class="p">,</span> pal<span class="p">,</span> fill <span class="o">=</span> <span class="s">"rate"</span><span class="p">,</span> alpha<span class="o">=</span><span class="m">.9</span><span class="p">)</span> <span class="p">{</span>
ggmap<span class="p">(</span>get_map<span class="p">(</span>location <span class="o">=</span> bb<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>data<span class="o">=</span> <span class="kp">subset</span><span class="p">(</span>map<span class="p">,</span> crime <span class="o">==</span> crimeName<span class="p">),</span>
aes_string<span class="p">(</span><span class="s">"long"</span><span class="p">,</span> <span class="s">"lat"</span><span class="p">,</span> group <span class="o">=</span> <span class="s">"group"</span><span class="p">,</span> fill <span class="o">=</span> fill<span class="p">),</span>
color <span class="o">=</span> <span class="s">"#666666"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">.1</span><span class="p">,</span>
alpha <span class="o">=</span> alpha<span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">()</span> <span class="o">+</span>
ggtitle<span class="p">(</span>crimeName<span class="p">)</span> <span class="o">+</span>
<span class="c1">#scale_fill_viridis(option="plasma") +</span>
scale_fill_continuous<span class="p">(</span>low <span class="o">=</span> brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span> pal<span class="p">)[</span><span class="m">1</span><span class="p">],</span>
high <span class="o">=</span> brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span> pal<span class="p">)[</span><span class="m">9</span><span class="p">],</span>
space <span class="o">=</span> <span class="s">"Lab"</span><span class="p">,</span> na.value <span class="o">=</span> <span class="s">"grey50"</span><span class="p">,</span>
guide <span class="o">=</span> <span class="s">"colourbar"</span><span class="p">)</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
<span class="p">}</span>
bb.sector <span class="o"><-</span> bbox<span class="p">(</span>sectores<span class="p">)</span>
draw_gmap<span class="p">(</span>sector.map<span class="p">,</span> <span class="s">"HOMICIDIO DOLOSO"</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"Reds"</span><span class="p">,</span> <span class="s">"rate"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-3-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-3-1.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>draw_gmap<span class="p">(</span>sector.map<span class="p">,</span> <span class="s">"LESIONES POR ARMA DE FUEGO"</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"Greys"</span><span class="p">,</span> <span class="s">"rate"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-3-2.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-3-2.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>draw_gmap<span class="p">(</span>sector.map<span class="p">,</span> <span class="s">"ROBO A TRANSEUNTE C.V."</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"Greys"</span><span class="p">,</span> <span class="s">"rate"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-3-3.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-3-3.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>draw_gmap<span class="p">(</span>cuadrante.map<span class="p">,</span> <span class="s">"ROBO DE VEHICULO AUTOMOTOR S.V."</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"YlGn"</span><span class="p">,</span> <span class="s">"count"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-3-4.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-3-4.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>draw_gmap<span class="p">(</span>cuadrante.map<span class="p">,</span> <span class="s">"ROBO DE VEHICULO AUTOMOTOR C.V."</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"Greens"</span><span class="p">,</span> <span class="s">"count"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-3-5.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-3-5.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>draw_gmap<span class="p">(</span>cuadrante.map<span class="p">,</span> <span class="s">"LESIONES POR ARMA DE FUEGO"</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"Greys"</span><span class="p">,</span> <span class="s">"count"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/lesiones-fuego.png">
<img alt="Firearm lesions counts by cuadrante" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/lesiones-fuego.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>draw_gmap<span class="p">(</span>cuadrante.map<span class="p">,</span> <span class="s">"HOMICIDIO DOLOSO"</span><span class="p">,</span> bb.sector<span class="p">,</span> <span class="s">"Reds"</span><span class="p">,</span> <span class="s">"count"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-3-6.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-3-6.png"/>
</a></p>
<h2><span class="caps">III</span>.</h2>
<p>One thing that you may have noticed from the ‘Homicidio Doloso’ and
‘Lesiones por Arma de Fuego’ cuadrante maps is that the cuadrantes
that contain hospitals tend to have very high homicides counts (dark
red and gray in the maps).</p>
<p>We can investigate the phenomena further by
<a href="https://hoyodecrimen.com/api/#get--api-v1-latlong-crimes-(string-crime)-coords-(string-long)-(string-lat)-distance-(int-distance)">downloading the coordinates</a>
of homicides and firearm lesions within 1,000 meters of hospitals.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39</pre></div></td><td class="code"><div class="highlight"><pre><span class="c1">#function to download a cuadrante given a latitude and longitude</span>
get_cuadrante <span class="o"><-</span> <span class="kr">function</span><span class="p">(</span>long<span class="p">,</span> lat<span class="p">){</span>
tmp_file <span class="o">=</span> <span class="kp">tempfile</span><span class="p">(</span>fileext <span class="o">=</span> <span class="s">".geojson"</span><span class="p">)</span>
<span class="kp">write</span><span class="p">(</span>fromJSON<span class="p">(</span>str_c<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/cuadrantes/pip/"</span><span class="p">,</span>long<span class="p">,</span><span class="s">"/"</span><span class="p">,</span>lat<span class="p">))</span><span class="o">$</span>pip<span class="o">$</span>geometry<span class="p">,</span>
file <span class="o">=</span> tmp_file<span class="p">)</span>
cuad <span class="o"><-</span> geojson_read<span class="p">(</span>tmp_file<span class="p">,</span> method <span class="o">=</span> <span class="s">"local"</span><span class="p">,</span> what <span class="o">=</span> <span class="s">"sp"</span><span class="p">)</span>
cuad.f <span class="o"><-</span> fortify<span class="p">(</span>cuad<span class="p">)</span>
<span class="p">}</span>
<span class="c1">#function to create a point map of crimes with their cuadrante</span>
latlong_map <span class="o"><-</span> <span class="kr">function</span><span class="p">(</span>title<span class="p">,</span> lat<span class="p">,</span> long<span class="p">,</span> distance<span class="p">,</span> crime <span class="o">=</span> <span class="s">"HOMICIDIO DOLOSO"</span><span class="p">,</span>
fill <span class="o">=</span> <span class="s">"red"</span><span class="p">)</span> <span class="p">{</span>
geocrimes <span class="o"><-</span> fromJSON<span class="p">(</span>str_c<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/latlong/crimes/"</span><span class="p">,</span>
URLencode<span class="p">(</span>crime<span class="p">),</span> <span class="s">"/coords/"</span><span class="p">,</span>
long<span class="p">,</span>
<span class="s">"/"</span><span class="p">,</span>
lat<span class="p">,</span>
<span class="s">"/distance/"</span><span class="p">,</span>
distance<span class="p">,</span>
<span class="s">"?start_date=2013-01&end_date=2016-09"</span><span class="p">))</span><span class="o">$</span>rows
cuadrante.f <span class="o"><-</span> get_cuadrante<span class="p">(</span>long<span class="p">,</span> lat<span class="p">)</span>
bb <span class="o"><-</span> bbox<span class="p">(</span>coordinates<span class="p">(</span>geocrimes<span class="p">[,</span><span class="kt">c</span><span class="p">(</span><span class="s">"long"</span><span class="p">,</span> <span class="s">"lat"</span><span class="p">)]))</span>
ggmap<span class="p">(</span>get_map<span class="p">(</span>location <span class="o">=</span> bb<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>data <span class="o">=</span> cuadrante.f<span class="p">,</span> aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">),</span>
color <span class="o">=</span> <span class="s">"black"</span><span class="p">,</span> fill <span class="o">=</span> <span class="s">"yellow"</span><span class="p">,</span> alpha <span class="o">=</span> <span class="m">.2</span><span class="p">)</span> <span class="o">+</span>
geom_point<span class="p">(</span>data<span class="o">=</span> <span class="kp">subset</span><span class="p">(</span>geocrimes<span class="p">,</span> crime <span class="o">==</span> crime<span class="p">),</span>
aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">),</span>
fill <span class="o">=</span> fill<span class="p">,</span>
color <span class="o">=</span> <span class="s">"black"</span><span class="p">,</span>
size <span class="o">=</span> <span class="m">3</span><span class="p">,</span>
shape <span class="o">=</span> <span class="m">21</span><span class="p">,</span>
alpha <span class="o">=</span> <span class="m">.8</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span>title<span class="p">)</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
<span class="p">}</span>
latlong_map<span class="p">(</span><span class="s">"Hospital Balbuena - Murder"</span><span class="p">,</span> <span class="m">19.42410</span><span class="p">,</span> <span class="m">-99.115520</span><span class="p">,</span> <span class="m">1000</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-4-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-4-1.png"/>
</a></p>
<p><a href="https://hoyodecrimen.com/mapa#/19.42399/-99.11504/19">Interactive Map</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>latlong_map<span class="p">(</span><span class="s">"Hospitales en Lindavista - Murder"</span><span class="p">,</span> <span class="m">19.482973</span><span class="p">,</span> <span class="m">-99.134091</span><span class="p">,</span> <span class="m">1000</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-4-2.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-4-2.png"/>
</a></p>
<p><a href="https://hoyodecrimen.com/mapa#/19.48244/-99.13414/18">Interactive Map</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>latlong_map<span class="p">(</span><span class="s">"Hospital General - Murder"</span><span class="p">,</span> <span class="m">19.411300</span><span class="p">,</span> <span class="m">-99.152405</span><span class="p">,</span> <span class="m">1000</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-4-3.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-4-3.png"/>
</a></p>
<p><a href="https://hoyodecrimen.com/mapa#/19.41124/-99.15215/17">Interactive Map</a> - Note that there is a second hospital in another cuadrante.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>latlong_map<span class="p">(</span><span class="s">"Hospital General Iztapalapa - Murder"</span><span class="p">,</span> <span class="m">19.343515</span><span class="p">,</span> <span class="m">-99.027382</span><span class="p">,</span> <span class="m">1000</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-4-4.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-4-4.png"/>
</a></p>
<p><a href="https://hoyodecrimen.com/mapa#/19.34311/-99.02699/19">Interactive Map</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="highlight"><pre>latlong_map<span class="p">(</span><span class="s">"Hospital General Iztapalapa - Firearm Lesions"</span><span class="p">,</span>
<span class="m">19.343515</span><span class="p">,</span> <span class="m">-99.027382</span><span class="p">,</span>
<span class="m">1000</span><span class="p">,</span>
<span class="s">"LESIONES POR ARMA DE FUEGO"</span><span class="p">,</span> fill <span class="o">=</span> <span class="s">"darkgray"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-4-5.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-4-5.png"/>
</a></p>
<p>While narcos sometimes
<a href="http://internacional.elpais.com/internacional/2016/10/25/mexico/1477415665_296723.html">kill the wounded receiving care in hospitals</a>,
this is the exception rather than the rule. It looks like some
homicides are recorded with the latitude and longitude of the place of
death, and in the case of firearm lesions I’m guessing it’s where the
crime was reported to the police. Also note that there is a certain
amount of error associated with the location of each crime, while the
cuadrante where the crime was recorded is usually correct, the latitude
and longitude sometimes is off by a 100 meters or so.</p>
<p>These are the cuadrantes codes with hospitals and an unusual number of victims:</p>
<ul>
<li>O-2.5.7</li>
<li>O-2.2.4</li>
<li>N-4.4.4</li>
<li>N-1.3.10</li>
<li>C-2.1.16</li>
<li>N-2.2.1</li>
<li>P-1.5.7</li>
<li>P-3.1.1</li>
</ul>
<p>Just for fun here are the cuadrantes with the highest counts of car robbery:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>latlong_map<span class="p">(</span><span class="s">"Mercado Xochimilo - Car Robbery wo/violence"</span><span class="p">,</span> <span class="m">19.251478</span><span class="p">,</span> <span class="m">-99.094207</span><span class="p">,</span> <span class="m">1000</span><span class="p">,</span> <span class="s">"ROBO DE VEHICULO AUTOMOTOR S.V."</span><span class="p">,</span> fill <span class="o">=</span> <span class="s">"green"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-5-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-5-1.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="highlight"><pre>latlong_map<span class="p">(</span><span class="s">"Lindavista - Car Robbery w/violence"</span><span class="p">,</span> <span class="m">19.506460</span><span class="p">,</span> <span class="m">-99.122815</span><span class="p">,</span> <span class="m">1000</span><span class="p">,</span> <span class="s">"ROBO DE VEHICULO AUTOMOTOR C.V."</span><span class="p">,</span> fill <span class="o">=</span> <span class="s">"darkgreen"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-5-2.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-5-2.png"/>
</a></p>
<h2><span class="caps">IV</span>.</h2>
<p>Ideally we’d like to be able to map the <em>rates</em> of crimes at the
cuadrante delictivo level, like we did with the sectores, but the
crime rates can be statistically unstable due to the small size of the
cuadrantes and the relative small number of people at risk. Plus, as I
mentioned, homicides and firearm lesions are sometimes recorded as
having happened inside a hospital. To get a better sense of the crime
risk in each cuadrante we are going to smooth the rate using empirical
bayes smoothing:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28</pre></div></td><td class="code"><div class="highlight"><pre><span class="c1"># Construct neighbours list from polygon list</span>
cuad.nb <span class="o"><-</span> poly2nb<span class="p">(</span>cuadrantes<span class="p">,</span> row.names <span class="o">=</span> <span class="kp">as.character</span><span class="p">(</span>cuadrantes<span class="o">$</span>cuadrante<span class="p">))</span>
hom <span class="o"><-</span> fromJSON<span class="p">(</span>str_c<span class="p">(</span><span class="s">"https://hoyodecrimen.com"</span><span class="p">,</span>
URLencode<span class="p">(</span><span class="s">"/api/v1/cuadrantes/ALL/crimes/HOMICIDIO DOLOSO/period"</span><span class="p">)))</span><span class="o">$</span>rows
hom <span class="o"><-</span> <span class="kp">subset</span><span class="p">(</span>hom<span class="p">,</span> cuadrante <span class="o">!=</span> <span class="s">"(NO ESPECIFICADO)"</span><span class="p">)</span>
<span class="c1"># match the order with the neighborhood file</span>
hom <span class="o"><-</span> hom<span class="p">[</span><span class="kp">match</span><span class="p">(</span>cuadrantes<span class="o">$</span>cuadrante<span class="p">,</span> hom<span class="o">$</span>cuadrante<span class="p">),]</span>
<span class="c1"># fill in the population of cuadrantes with zero residents</span>
<span class="c1"># with the mean of their neighboring cuadrantes</span>
<span class="kr">for</span><span class="p">(</span>zero_cuad <span class="kr">in</span> hom<span class="o">$</span>cuadrante<span class="p">[</span><span class="kp">which</span><span class="p">(</span>hom<span class="o">$</span>population <span class="o">==</span> <span class="m">0</span><span class="p">)])</span>
hom<span class="o">$</span>population <span class="o"><-</span> <span class="kp">mean</span><span class="p">(</span>hom<span class="o">$</span>population<span class="p">[</span>cuad.nb<span class="p">[[</span><span class="kp">which</span><span class="p">(</span>hom<span class="o">$</span>cuadrante <span class="o">==</span> zero_cuad<span class="p">)]]])</span>
hom<span class="o">$</span>rate <span class="o"><-</span> hom<span class="o">$</span>count <span class="o">/</span> hom<span class="o">$</span>population <span class="o">*</span> <span class="m">10</span><span class="o">^</span><span class="m">5</span>
smth<span class="o"><-</span>empbaysmooth<span class="p">(</span>hom<span class="o">$</span>count<span class="p">,</span> hom<span class="o">$</span>population <span class="o">*</span> <span class="kp">sum</span><span class="p">(</span>hom<span class="o">$</span>count<span class="p">)</span> <span class="o">/</span> <span class="kp">sum</span><span class="p">(</span>hom<span class="o">$</span>population<span class="p">))</span>
hom<span class="o">$</span>smooth <span class="o"><-</span> smth<span class="o">$</span>smthrr
cuadrantes.f <span class="o"><-</span> fortify<span class="p">(</span>cuadrantes<span class="p">,</span> region <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
cuadrantes.f <span class="o"><-</span> <span class="kp">merge</span><span class="p">(</span>cuadrantes.f<span class="p">,</span> hom<span class="p">,</span> by.x <span class="o">=</span> <span class="s">"id"</span><span class="p">,</span> by.y <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
ggplot<span class="p">(</span>cuadrantes.f<span class="p">,</span> aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>aes<span class="p">(</span>fill <span class="o">=</span> smooth<span class="p">),</span> color <span class="o">=</span> <span class="s">"#555555"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">.1</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">()</span><span class="o">+</span>
scale_fill_gradientn<span class="p">(</span>colours<span class="o">=</span><span class="kp">rev</span><span class="p">(</span>brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span><span class="s">"YlOrRd"</span><span class="p">)))</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"Smoothed homicide rates at the cuadrante level"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-6-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-6-1.png"/>
</a></p>
<p>The cuadrantes with hospitals still give the impression of being
extremely violent. One interesting thing about hospital with lots of
murders is that the cuadrantes surrounding them also tend to have a lot
of murders —there is a lot of violence near some hospitals.</p>
<p><a href="https://hoyodecrimen.com/cuadrantes-mapa#14/19.4048/-99.1344">
<img alt="Cuadrantes near hospitals" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/cuadrantes-hospitales.png"/>
</a></p>
<p>This makes it more likely that the people who died in a hospital were
injured in a nearby location and were then transported to the nearest
hospital. A solution to the problem of cuadrantes with
hospitals being incorrectly perceived as very violent would be to
average the rate of violence in each cuadrante with the nearest, say,
8 neighbors.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20</pre></div></td><td class="code"><div class="highlight"><pre>cuad.nb <span class="o"><-</span> knn2nb<span class="p">(</span>knearneigh<span class="p">(</span>coordinates<span class="p">(</span>cuadrantes<span class="p">),</span> k <span class="o">=</span> <span class="m">8</span><span class="p">),</span>
row.names <span class="o">=</span> <span class="kp">as.character</span><span class="p">(</span>cuadrantes<span class="o">$</span>cuadrante<span class="p">))</span>
<span class="c1">#cuad.nb <- poly2nb(cuadrantes, row.names = as.character(cuadrantes$cuadrante))</span>
plot<span class="p">(</span>cuad.nb<span class="p">,</span> coordinates<span class="p">(</span>cuadrantes<span class="p">))</span>
hom<span class="o">$</span>smooth <span class="o"><-</span> <span class="kp">sapply</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="kp">nrow</span><span class="p">(</span>hom<span class="p">),</span> <span class="kr">function</span><span class="p">(</span>x<span class="p">)</span> <span class="p">{</span>
w <span class="o"><-</span> <span class="kt">c</span><span class="p">(</span>hom<span class="o">$</span>population<span class="p">[</span>x<span class="p">],</span> hom<span class="o">$</span>population<span class="p">[</span>cuad.nb<span class="p">[[</span>x<span class="p">]]])</span>
r <span class="o"><-</span> <span class="kt">c</span><span class="p">(</span>hom<span class="o">$</span>rate<span class="p">[</span>x<span class="p">],</span> hom<span class="o">$</span>rate<span class="p">[</span>cuad.nb<span class="p">[[</span>x<span class="p">]]])</span>
<span class="kr">return</span><span class="p">(</span><span class="kp">sum</span><span class="p">(</span>w <span class="o">*</span> r<span class="p">)</span><span class="o">/</span><span class="kp">sum</span><span class="p">(</span>w<span class="p">))</span>
<span class="p">})</span>
cuadrantes.f <span class="o"><-</span> fortify<span class="p">(</span>cuadrantes<span class="p">,</span> region <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
cuadrantes.f <span class="o"><-</span> <span class="kp">merge</span><span class="p">(</span>cuadrantes.f<span class="p">,</span> hom<span class="p">,</span> by.x <span class="o">=</span> <span class="s">"id"</span><span class="p">,</span> by.y <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
ggplot<span class="p">(</span>cuadrantes.f<span class="p">,</span> aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>aes<span class="p">(</span>fill <span class="o">=</span> smooth<span class="p">),</span> color <span class="o">=</span> <span class="s">"#555555"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">.1</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">()</span><span class="o">+</span>
scale_fill_gradientn<span class="p">(</span>colours<span class="o">=</span><span class="kp">rev</span><span class="p">(</span>brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span><span class="s">"YlOrRd"</span><span class="p">)))</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"Smoothed homicide rates by nearest neighbors"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/neighbors8.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/neighbors8.png"/>
</a></p>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-7-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-7-1.png"/>
</a></p>
<p>Now it looks much better, and this is what the frontpage of
<a href="https://hoyodecrimen.com">hoyodecrimen</a> uses to compare crime rates
in your cuadrante (though we’re still missing uncertainty
estimates). We can use the same averaging method for other crimes:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34</pre></div></td><td class="code"><div class="highlight"><pre>smooth_cuads <span class="o"><-</span> <span class="kr">function</span><span class="p">(</span>df<span class="p">,</span> cuad.nb<span class="p">)</span> <span class="p">{</span>
df <span class="o"><-</span> <span class="kp">subset</span><span class="p">(</span>df<span class="p">,</span> cuadrante <span class="o">!=</span> <span class="s">"(NO ESPECIFICADO)"</span><span class="p">)</span>
<span class="c1"># match the order with the neighborhood file</span>
df <span class="o"><-</span> df<span class="p">[</span><span class="kp">match</span><span class="p">(</span>cuadrantes<span class="o">$</span>cuadrante<span class="p">,</span> df<span class="o">$</span>cuadrante<span class="p">),]</span>
<span class="c1"># fill in the population of cuadrantes with zero residents</span>
<span class="c1"># with the mean of their neighboring cuadrantes</span>
<span class="kr">for</span><span class="p">(</span>zero_cuad <span class="kr">in</span> df<span class="o">$</span>cuadrante<span class="p">[</span><span class="kp">which</span><span class="p">(</span>df<span class="o">$</span>population <span class="o">==</span> <span class="m">0</span><span class="p">)])</span>
df<span class="o">$</span>population <span class="o"><-</span> <span class="kp">mean</span><span class="p">(</span>df<span class="o">$</span>population<span class="p">[</span>cuad.nb<span class="p">[[</span><span class="kp">which</span><span class="p">(</span>df<span class="o">$</span>cuadrante <span class="o">==</span> zero_cuad<span class="p">)]]])</span>
df<span class="o">$</span>rate <span class="o"><-</span> df<span class="o">$</span>count <span class="o">/</span> df<span class="o">$</span>population <span class="o">*</span> <span class="m">10</span><span class="o">^</span><span class="m">5</span>
df<span class="o">$</span>smooth <span class="o"><-</span> <span class="kp">sapply</span><span class="p">(</span><span class="m">1</span><span class="o">:</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">),</span> <span class="kr">function</span><span class="p">(</span>x<span class="p">)</span> <span class="p">{</span>
w <span class="o"><-</span> <span class="kt">c</span><span class="p">(</span>df<span class="o">$</span>population<span class="p">[</span>x<span class="p">],</span> df<span class="o">$</span>population<span class="p">[</span>cuad.nb<span class="p">[[</span>x<span class="p">]]])</span>
r <span class="o"><-</span> <span class="kt">c</span><span class="p">(</span>df<span class="o">$</span>rate<span class="p">[</span>x<span class="p">],</span> df<span class="o">$</span>rate<span class="p">[</span>cuad.nb<span class="p">[[</span>x<span class="p">]]])</span>
<span class="kr">return</span><span class="p">(</span><span class="kp">sum</span><span class="p">(</span>w <span class="o">*</span> r<span class="p">)</span><span class="o">/</span><span class="kp">sum</span><span class="p">(</span>w<span class="p">))</span>
<span class="p">})</span>
cuadrantes.f <span class="o"><-</span> fortify<span class="p">(</span>cuadrantes<span class="p">,</span> region <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
cuadrantes.f <span class="o"><-</span> <span class="kp">merge</span><span class="p">(</span>cuadrantes.f<span class="p">,</span> df<span class="p">,</span> by.x <span class="o">=</span> <span class="s">"id"</span><span class="p">,</span> by.y <span class="o">=</span> <span class="s">"cuadrante"</span><span class="p">)</span>
cuadrantes.f
<span class="p">}</span>
<span class="c1">#cuad.nb <- poly2nb(cuadrantes, row.names = as.character(cuadrantes$cuadrante))</span>
cuad_smooth_rvsv <span class="o"><-</span> smooth_cuads<span class="p">(</span>fromJSON<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/cuadrantes/ALL/crimes/ROBO DE VEHICULO AUTOMOTOR S.V./period"</span><span class="p">)</span><span class="o">$</span>rows<span class="p">,</span>
cuad.nb<span class="p">)</span>
ggplot<span class="p">(</span>cuad_smooth_rvsv<span class="p">,</span> aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>aes<span class="p">(</span>fill <span class="o">=</span> smooth<span class="p">),</span> color <span class="o">=</span> <span class="s">"#555555"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">.1</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">()</span><span class="o">+</span>
scale_fill_gradientn<span class="p">(</span>colours<span class="o">=</span><span class="kp">rev</span><span class="p">(</span>brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span><span class="s">"YlGn"</span><span class="p">)))</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"Smoothed car robbery wo/v rates by nearest neighbors"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-8-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-8-1.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="highlight"><pre>cuad_smooth_rvcv <span class="o"><-</span> smooth_cuads<span class="p">(</span>fromJSON<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/cuadrantes/ALL/crimes/ROBO DE VEHICULO AUTOMOTOR C.V./period"</span><span class="p">)</span><span class="o">$</span>rows<span class="p">,</span>
cuad.nb<span class="p">)</span>
ggplot<span class="p">(</span>cuad_smooth_rvcv<span class="p">,</span> aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>aes<span class="p">(</span>fill <span class="o">=</span> smooth<span class="p">),</span> color <span class="o">=</span> <span class="s">"#555555"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">.1</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">()</span> <span class="o">+</span>
scale_fill_gradientn<span class="p">(</span>colours<span class="o">=</span><span class="kp">rev</span><span class="p">(</span>brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span><span class="s">"BuGn"</span><span class="p">)))</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"Smoothed car robbery w/v rates by nearest neighbors"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-8-2.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-8-2.png"/>
</a></p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="highlight"><pre>cuad_smooth_rt <span class="o"><-</span> smooth_cuads<span class="p">(</span>fromJSON<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/cuadrantes/ALL/crimes/ROBO A TRANSEUNTE C.V./period"</span><span class="p">)</span><span class="o">$</span>rows<span class="p">,</span>
cuad.nb<span class="p">)</span>
ggplot<span class="p">(</span>cuad_smooth_rt<span class="p">,</span> aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>aes<span class="p">(</span>fill <span class="o">=</span> smooth<span class="p">),</span> color <span class="o">=</span> <span class="s">"#555555"</span><span class="p">,</span> size <span class="o">=</span> <span class="m">.1</span><span class="p">)</span> <span class="o">+</span>
coord_map<span class="p">()</span> <span class="o">+</span>
scale_fill_gradientn<span class="p">(</span>colours<span class="o">=</span><span class="kp">rev</span><span class="p">(</span>brewer.pal<span class="p">(</span><span class="m">9</span><span class="p">,</span><span class="s">"Blues"</span><span class="p">)))</span><span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"Smoothed street robbery rates by nearest neighbors"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-8-3.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-8-3.png"/>
</a></p>
<p>There’s still a problem in that to calculate the rates we are using as
denominator the number of people living in the cuadrante, and people
move around the city all time.</p>
<h2>V.</h2>
<p>The Mexico City subway website publishes the number of
passangers using each metro station which we can use to estimate crime
rates by station. First, we download crime data from January to March
2016 since that matches the ridership data available from the
<a href="http://www.metro.cdmx.gob.mx/operacion/afluencia.html">Sistema Colectivo website</a>.
And we’ll only estimate rates for the sum of the following crimes:</p>
<ul>
<li><span class="caps">ROBO</span> A <span class="caps">TRANSEUNTE</span> <span class="caps">C.V.</span></li>
<li><span class="caps">ROBO</span> A <span class="caps">TRANSEUNTE</span> <span class="caps">S.V.</span></li>
<li><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">TAXI</span> C.V</li>
<li><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">MICROBUS</span> <span class="caps">S.V.</span></li>
<li><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">MICROBUS</span> <span class="caps">C.V.</span></li>
<li><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">METRO</span> <span class="caps">S.V.</span></li>
<li><span class="caps">ROBO</span> A <span class="caps">BORDO</span> <span class="caps">DE</span> <span class="caps">METRO</span> <span class="caps">C.V.</span></li>
</ul>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="highlight"><pre><span class="c1"># Set the distance to ridiculously large number of meters to download all CDMX data</span>
geocrimes <span class="o"><-</span> fromJSON<span class="p">(</span>str_c<span class="p">(</span><span class="s">"https://hoyodecrimen.com/api/v1/latlong/crimes/"</span><span class="p">,</span>
URLencode<span class="p">(</span><span class="s">"ROBO A TRANSEUNTE C.V.,ROBO A TRANSEUNTE S.V.,ROBO A BORDO DE TAXI C.V.,ROBO A BORDO DE MICROBUS S.V.,ROBO A BORDO DE MICROBUS C.V.,ROBO A BORDO DE METRO S.V.,ROBO A BORDO DE METRO C.V."</span><span class="p">),</span><span class="s">"/coords/-99.122815/19.506460/distance/50000000000?start_date=2016-01&end_date=2016-04"</span><span class="p">))</span><span class="o">$</span>rows
</pre></div>
</td></tr></table>
<p>Then we clean the ridership data from the
<a href="http://www.metro.cdmx.gob.mx/operacion/afluencia.html">metro website</a>. I
had to clean up the html by hand a bit since it’s so badly formed the
<a href="https://blog.rstudio.org/2014/11/24/rvest-easy-web-scraping-with-r/">rvest package</a>
was unable to parse it.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37</pre></div></td><td class="code"><div class="highlight"><pre>con <span class="o"><-</span> <span class="kp">file</span><span class="p">(</span><span class="s">"data/afluencia.html"</span><span class="p">,</span> <span class="s">"rb"</span><span class="p">)</span>
metro <span class="o"><-</span> read_html<span class="p">(</span>con<span class="p">)</span>
afluencia <span class="o"><-</span> <span class="kt">data.frame</span><span class="p">()</span>
<span class="kr">for</span><span class="p">(</span>i <span class="kr">in</span> <span class="m">1</span><span class="o">:</span><span class="m">4</span><span class="p">)</span> <span class="p">{</span>
df <span class="o"><-</span> metro <span class="o">%>%</span>
html_nodes<span class="p">(</span><span class="s">"table"</span><span class="p">)</span> <span class="o">%>%</span>
<span class="m">.</span><span class="p">[[</span>i<span class="p">]]</span> <span class="o">%>%</span>
html_table<span class="p">(</span>fill <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span>
afluencia <span class="o"><-</span> <span class="kp">rbind</span><span class="p">(</span>afluencia<span class="p">,</span>
<span class="kt">data.frame</span><span class="p">(</span>name<span class="o">=</span>df<span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">)</span><span class="m">-1</span><span class="p">),</span><span class="m">1</span><span class="p">],</span>
num<span class="o">=</span>df<span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">)</span><span class="m">-1</span><span class="p">),</span><span class="m">2</span><span class="p">],</span>
line<span class="o">=</span>df<span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="m">1</span><span class="p">]),</span>
<span class="kt">data.frame</span><span class="p">(</span>name<span class="o">=</span>df<span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">)</span><span class="m">-1</span><span class="p">),</span><span class="m">4</span><span class="p">],</span>
num<span class="o">=</span>df<span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">)</span><span class="m">-1</span><span class="p">),</span><span class="m">5</span><span class="p">],</span>
line<span class="o">=</span>df<span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="m">4</span><span class="p">]),</span>
<span class="kt">data.frame</span><span class="p">(</span>name<span class="o">=</span>df<span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">)</span><span class="m">-1</span><span class="p">),</span><span class="m">7</span><span class="p">],</span>
num<span class="o">=</span>df<span class="p">[</span><span class="m">2</span><span class="o">:</span><span class="p">(</span><span class="kp">nrow</span><span class="p">(</span>df<span class="p">)</span><span class="m">-1</span><span class="p">),</span><span class="m">8</span><span class="p">],</span>
line<span class="o">=</span>df<span class="p">[</span><span class="m">1</span><span class="p">,</span><span class="m">7</span><span class="p">]))</span>
<span class="p">}</span>
nbs <span class="o"><-</span> stri_escape_unicode<span class="p">(</span>afluencia<span class="o">$</span>name<span class="p">[</span><span class="m">21</span><span class="p">])</span>
<span class="c1"># \\u00a0 is actually the non-breaking space character</span>
<span class="c1"># which we have to remove from the html table</span>
afluencia <span class="o"><-</span> afluencia <span class="o">%>%</span>
mutate<span class="p">(</span>num <span class="o">=</span> <span class="kp">as.numeric</span><span class="p">(</span>str_replace_all<span class="p">(</span>num<span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="s">""</span><span class="p">)))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>name <span class="o">=</span> str_replace_all<span class="p">(</span>name<span class="p">,</span> <span class="s">"[\r\n]"</span> <span class="p">,</span> <span class="s">" "</span><span class="p">))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>name <span class="o">=</span> str_replace_all<span class="p">(</span>name<span class="p">,</span> <span class="s">" "</span> <span class="p">,</span> <span class="s">" "</span><span class="p">))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>name <span class="o">=</span> str_replace<span class="p">(</span>name<span class="p">,</span> <span class="s">"\\u00a0"</span><span class="p">,</span> <span class="s">""</span><span class="p">))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>name <span class="o">=</span> str_replace<span class="p">(</span>name<span class="p">,</span> <span class="s">" "</span><span class="p">,</span> <span class="s">" "</span><span class="p">))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>name <span class="o">=</span> <span class="kp">tolower</span><span class="p">(</span>name<span class="p">))</span> <span class="o">%>%</span>
filter<span class="p">(</span>name <span class="o">!=</span> <span class="s">""</span><span class="p">)</span> <span class="o">%>%</span>
mutate<span class="p">(</span>line <span class="o">=</span> str_replace_all<span class="p">(</span>line<span class="p">,</span> <span class="s">"[\r\n]"</span> <span class="p">,</span> <span class="s">" "</span><span class="p">))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>line <span class="o">=</span> str_replace_all<span class="p">(</span>line<span class="p">,</span> <span class="s">" "</span> <span class="p">,</span> <span class="s">" "</span><span class="p">))</span> <span class="o">%>%</span>
mutate<span class="p">(</span>line <span class="o">=</span> str_replace_all<span class="p">(</span>line<span class="p">,</span> <span class="s">" "</span> <span class="p">,</span> <span class="s">" "</span><span class="p">))</span>
</pre></div>
</td></tr></table>
<p>Then we merge the ridership numbers with a list of geocoded stations previously
download from <a href="http://www.mexicometro.org/Mexico-Metro.kmz">here</a> and converted to
a csv with the latitude and longitude of each metro station.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="highlight"><pre>stations <span class="o"><-</span> read.csv<span class="p">(</span><span class="s">"data/stations.csv"</span><span class="p">)</span> <span class="o">%>%</span>
mutate<span class="p">(</span>name <span class="o">=</span> <span class="kp">tolower</span><span class="p">(</span>name<span class="p">))</span> <span class="o">%>%</span>
rename<span class="p">(</span>line <span class="o">=</span> styleUrl<span class="p">)</span> <span class="o">%>%</span>
mutate<span class="p">(</span>line <span class="o">=</span> str_replace<span class="p">(</span>line<span class="p">,</span> <span class="s">"#Line"</span><span class="p">,</span> <span class="s">"LÍNEA "</span><span class="p">))</span>
df <span class="o"><-</span> full_join<span class="p">(</span>stations<span class="p">,</span> afluencia<span class="p">,</span> by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"line"</span><span class="p">))</span>
<span class="kp">nrow</span><span class="p">(</span>df<span class="p">[</span><span class="kp">is.na</span><span class="p">(</span>df<span class="o">$</span>X<span class="p">)</span> <span class="o">|</span> <span class="kp">is.na</span><span class="p">(</span>df<span class="o">$</span>num<span class="p">),])</span> <span class="o">==</span> <span class="m">0</span>
</pre></div>
</td></tr></table>
<p>To compute the rates by station we are going to draw a 200m buffer
around each station point. Sometimes stations are very close to each
other and we have to be sure to merge them and sum their ridership
numbers if their buffers intersect. This can be done by using Postgresql with the
following <span class="caps">SQL</span> code:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">SELECT</span> <span class="n">json_build_object</span><span class="p">(</span>
<span class="s1">'type'</span><span class="p">,</span> <span class="s1">'Feature'</span><span class="p">,</span>
<span class="s1">'id'</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span>
<span class="s1">'geometry'</span><span class="p">,</span> <span class="n">ST_Union</span><span class="p">(</span><span class="n">the_geom</span><span class="p">::</span><span class="n">geometry</span><span class="p">),</span>
<span class="s1">'properties'</span><span class="p">,</span> <span class="n">json_build_object</span><span class="p">(</span>
<span class="s1">'name'</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span>
<span class="s1">'num'</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<span class="p">)</span>
<span class="p">)</span>
<span class="k">FROM</span> <span class="p">(</span><span class="k">SELECT</span> <span class="n">ST_Buffer</span><span class="p">(</span><span class="n">the_geom_webmercator</span><span class="p">::</span><span class="n">geometry</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span> <span class="k">as</span> <span class="n">the_geom</span><span class="p">,</span><span class="n">name</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">num</span>
<span class="k">FROM</span> <span class="n">geocoded_stations</span><span class="p">)</span> <span class="k">as</span> <span class="n">buffers</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">name</span>
</pre></div>
</td></tr></table>
<p>I’ve also uploaded the station points to <a href="http://www.carto.com">carto</a> so you
don’t have to install Postgresql and can download the geojson file of the station
buffers by running the <span class="caps">SQL</span> in the cloud.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="highlight"><pre>url <span class="o"><-</span> str_c<span class="p">(</span><span class="s">"https://diegovalle.carto.com/api/v2/sql?format=GeoJSON&q="</span><span class="p">,</span>
URLencode<span class="p">(</span><span class="s">"SELECT ST_Transform(ST_Union(the_geom),4326) as the_geom, name, sum(num)</span>
<span class="s">from (SELECT ST_Buffer(the_geom_webmercator,200) as the_geom,name, line, num</span>
<span class="s"> from geocoded_stations) as buffers</span>
<span class="s">GROUP BY name"</span><span class="p">))</span>
stations_merged <span class="o"><-</span> geojson_read<span class="p">(</span><span class="kp">url</span><span class="p">,</span> method <span class="o">=</span> <span class="s">"local"</span><span class="p">,</span> what <span class="o">=</span> <span class="s">"sp"</span><span class="p">)</span>
plot<span class="p">(</span>stations_merged<span class="p">,</span> main <span class="o">=</span> <span class="s">"Metro stations with a 200m buffer"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-12-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-12-1.png"/>
</a></p>
<p>Note the merged stations. Now its just a matter of counting the number
of crimes inside each of the polygons taking into account the stations
that were merged.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7
8
9</pre></div></td><td class="code"><div class="highlight"><pre><span class="k">SELECT</span> <span class="k">count</span><span class="p">(</span><span class="n">crime_lat_long</span><span class="p">.</span><span class="n">the_geom</span><span class="p">),</span> <span class="n">stations</span><span class="p">.</span><span class="n">name</span> <span class="k">AS</span> <span class="n">name</span>
<span class="k">FROM</span>
<span class="p">(</span><span class="k">SELECT</span> <span class="n">ST_Transform</span><span class="p">(</span><span class="n">ST_Union</span><span class="p">(</span><span class="n">the_geom</span><span class="p">),</span><span class="mi">4326</span><span class="p">)</span> <span class="k">as</span> <span class="n">the_geom</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="k">sum</span><span class="p">(</span><span class="n">num</span><span class="p">)</span>
<span class="k">from</span> <span class="p">(</span><span class="k">SELECT</span> <span class="n">ST_Buffer</span><span class="p">(</span><span class="n">the_geom_webmercator</span><span class="p">,</span><span class="mi">200</span><span class="p">)</span> <span class="k">as</span> <span class="n">the_geom</span><span class="p">,</span><span class="n">name</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">num</span>
<span class="k">from</span> <span class="n">geocoded_stations</span><span class="p">)</span> <span class="k">as</span> <span class="n">buffers</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">name</span><span class="p">)</span> <span class="k">as</span> <span class="n">stations</span>
<span class="k">LEFT</span> <span class="k">JOIN</span> <span class="n">crime_lat_long</span>
<span class="k">ON</span> <span class="n">st_contains</span><span class="p">(</span><span class="n">stations</span><span class="p">.</span><span class="n">the_geom</span><span class="p">,</span> <span class="n">crime_lat_long</span><span class="p">.</span><span class="n">the_geom</span><span class="p">)</span>
<span class="k">GROUP</span> <span class="k">BY</span> <span class="n">stations</span><span class="p">.</span><span class="n">name</span>
</pre></div>
</td></tr></table>
<p>Using carto:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</pre></div></td><td class="code"><div class="highlight"><pre>url <span class="o"><-</span> str_c<span class="p">(</span><span class="s">"https://diegovalle.carto.com/api/v2/sql?q="</span><span class="p">,</span>
URLencode<span class="p">(</span><span class="s">"SELECT count(crime_lat_long.the_geom), stations.name AS name</span>
<span class="s">FROM</span>
<span class="s">(SELECT ST_Transform(ST_Union(the_geom),4326) as the_geom, name, sum(num)</span>
<span class="s">from (SELECT ST_Buffer(the_geom_webmercator,200) as the_geom,name, line, num</span>
<span class="s"> from geocoded_stations) as buffers</span>
<span class="s">GROUP BY name) as stations LEFT JOIN</span>
<span class="s">crime_lat_long</span>
<span class="s">ON st_contains(stations.the_geom, crime_lat_long.the_geom)</span>
<span class="s">GROUP BY stations.name"</span><span class="p">))</span>
numcrime <span class="o"><-</span>fromJSON<span class="p">(</span><span class="kp">url</span><span class="p">)</span><span class="o">$</span>rows
stations_merged<span class="o">@</span>data <span class="o"><-</span> left_join<span class="p">(</span>stations_merged<span class="o">@</span>data<span class="p">,</span>
numcrime<span class="p">,</span>
by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"name"</span> <span class="o">=</span> <span class="s">"name"</span><span class="p">))</span>
</pre></div>
</td></tr></table>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31</pre></div></td><td class="code"><div class="highlight"><pre>stations_merged<span class="o">@</span>data<span class="o">$</span>rate <span class="o"><-</span> stations_merged<span class="o">@</span>data<span class="o">$</span>count <span class="o">/</span> stations_merged<span class="o">@</span>data<span class="o">$</span>sum <span class="o">*</span> <span class="m">10</span><span class="o">^</span><span class="m">5</span>
<span class="c1"># Exclude stations not inside CDMX (crime data only available in CDMX)</span>
stations_merged <span class="o"><-</span> stations_merged<span class="p">[</span><span class="o">!</span>stations_merged<span class="o">@</span>data<span class="o">$</span>name <span class="o">%in%</span> <span class="kt">c</span><span class="p">(</span><span class="s">"los reyes"</span><span class="p">,</span>
<span class="s">"la paz"</span><span class="p">,</span>
<span class="s">"nezahualcóyotl"</span><span class="p">,</span>
<span class="s">"impulsora"</span><span class="p">,</span>
<span class="s">"río de los remedios"</span><span class="p">,</span>
<span class="s">"múzquiz"</span><span class="p">,</span>
<span class="s">"tecnológico"</span><span class="p">,</span>
<span class="s">"olímpica"</span><span class="p">,</span>
<span class="s">"plaza aragón"</span><span class="p">,</span>
<span class="s">"ciudad azteca"</span><span class="p">,</span>
<span class="s">"cuatro caminos"</span><span class="p">),</span> <span class="p">]</span>
<span class="c1"># Write a geojson file for the interactive html version</span>
writeOGR<span class="p">(</span>stations_merged<span class="p">,</span>
<span class="s">"html/stations.geojson"</span><span class="p">,</span>
driver <span class="o">=</span> <span class="s">"GeoJSON"</span><span class="p">,</span>
layer <span class="o">=</span> <span class="s">"stations.geojson"</span><span class="p">,</span>
verbose <span class="o">=</span> <span class="kc">FALSE</span><span class="p">)</span>
map <span class="o"><-</span> fortify<span class="p">(</span>stations_merged<span class="p">,</span> region <span class="o">=</span> <span class="s">"name"</span><span class="p">)</span>
map <span class="o"><-</span> left_join<span class="p">(</span>map<span class="p">,</span> stations_merged<span class="o">@</span>data<span class="p">,</span>by <span class="o">=</span> <span class="kt">c</span><span class="p">(</span><span class="s">"id"</span> <span class="o">=</span> <span class="s">"name"</span><span class="p">))</span>
bb <span class="o"><-</span> bbox<span class="p">(</span>stations_merged<span class="p">)</span>
ggmap<span class="p">(</span>get_map<span class="p">(</span>location <span class="o">=</span> bb<span class="p">))</span> <span class="o">+</span>
geom_polygon<span class="p">(</span>data<span class="o">=</span> <span class="kp">subset</span><span class="p">(</span>map<span class="p">,</span> rate <span class="o">!=</span> <span class="m">0</span><span class="p">),</span>
aes<span class="p">(</span>long<span class="p">,</span> lat<span class="p">,</span> group <span class="o">=</span> group<span class="p">,</span> fill <span class="o">=</span> rate<span class="p">))</span> <span class="o">+</span>
scale_fill_continuous<span class="p">(</span>low <span class="o">=</span> <span class="s">"#ffeda0"</span><span class="p">,</span> high <span class="o">=</span> <span class="s">"#f03b20"</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span>title<span class="p">)</span> <span class="o">+</span>
theme_nothing<span class="p">(</span>legend <span class="o">=</span> <span class="kc">TRUE</span><span class="p">)</span> <span class="o">+</span>
ggtitle<span class="p">(</span><span class="s">"Crime by Mexico City Metro Station"</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p><a href="/images/posts/crime-maps-of-mexico-city/unnamed-chunk-13-1.png">
<img alt="" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/unnamed-chunk-13-1.png"/>
</a></p>
<p>And there you have it, a chart with the crime rates by metro
station. There’s still a problem in that the crimes may be
systematically biased since the reporting rate is so low in Mexico
(93% according to the <span class="caps">ENVIPE</span> 2016).</p>
<p>You can also view an interactive version <a href="https://www.diegovalle.net/maps/metro/">here</a></p>
<p><a href="https://www.diegovalle.net/maps/metro/">
<img alt="Interactive crime map by metro station" class="image-process-article-image" src="/images/posts/crime-maps-of-mexico-city/derivatives/article-image/metro.png"/>
</a></p>
<p><span class="caps">P.S.</span> You can download the code from <a href="https://github.com/diegovalle/mxc.crime.maps">GitHub</a></p>Real-time air pollution data for Mexico City2016-05-03T00:00:00+02:00Diego Valle-Jonestag:blog.diegovalle.net,2016-05-03:2016/05/hoyo-de-smog.html<p><a href="https://hoyodesmog.diegovalle.net">
<img alt="Missing stations" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/idw-smog.png"/>
</a></p>
<p>Aside from having the most ridiculous possible name the state of
Mexico City has battled with air pollution for
decades. Since the official
<a href="http://www.aire.df.gob.mx/default.php">air quality website</a> looks
pretty bad, I decided to create my very own website,
<a href="https://hoyodesmog.diegovalle.net">HoyoDeSmog</a>, that is updated in
real-time every hour. To power the site I’ve also created an
<a href="https://hoyodesmog.diegovalle.net/aire.zmvm/">R package</a>.</p>
<p>The pollutants with the highest reported values are usually ozone and
<span class="caps">PM10</span> (particulate matter). Because of the high temperatures and lack of
rain May is usually the worst month of the year for ozone air pollution:</p>
<p><a href="/images/posts/hoyodesmog/tufte_o3.png">
<img alt="Ozone pollution values" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/tufte_o3.png"/>
</a></p>
<p>The peak hours for ozone pollution are in the early afternoon and for
<span class="caps">PM10</span> coincide with commuting times. Though for <span class="caps">PM10</span>
pollution a 24 hour average is what is used to quantify air quality.</p>
<p><a href="/images/posts/hoyodesmog/peak_hours.png"> <img alt="Ozone pollution
values" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/peak_hours.png"/> </a></p>
<p>Mexico City has a no circulation rule, cars which do not meet emission
standards are forbidden from being driven one day a week. A 0-500
scale is used to inform residents of the Mexico City metro area about
pollution values. If pollution values reach 151 points (from April
until June, otherwise it’s 191) a double no ciruclation rule is put
into effect which should forbid about 40% of cars from the streets.</p>
<p>Ozone is usually the pollutant with the highest values and for which
environmental contingencies are declared, so there is a <a href="https://hoyodesmog.diegovalle.net/ozone.html">whole a page</a>
to view the latest values:</p>
<p><a href="https://hoyodesmog.diegovalle.net/ozone.html">
<img alt="Ozone" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/ozone.png"/>
</a></p>
<p>You can also view <a href="https://hoyodesmog.diegovalle.net/temperature.html">temparature</a> values (interpolated by inverse distance
weigthing from the measuring station):</p>
<p><a href="https://hoyodesmog.diegovalle.net/temperature.html">
<img alt="Temp" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/temp.png"/>
</a></p>
<p>And an animated map of <a href="https://hoyodesmog.diegovalle.net/wind.html">wind speed and direction</a>:</p>
<video controls="" height="546" width="528">
<source src="/images/posts/hoyodesmog/wind.mp4" type="video/mp4">
Your browser does not support the video tag.
</source></video>
<h3>Problems with the data</h3>
<p>Like I said, the official website sucks, and one of the problems with
it was that some of the stations, like <span class="caps">MPA</span>, were missing from the
<a href="http://www.aire.df.gob.mx/estadisticas-consultas/concentraciones/index.php">webpage</a>
where you could download data. In this old screenshot you can clearly see
that there was no station named <span class="caps">MPA</span>:</p>
<p><a href="/images/posts/hoyodesmog/estaciones_old.png">
<img alt="Missing stations" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/estaciones_old.png"/>
</a></p>
<p>I reported the problem and the website now includes the missing stations:</p>
<p><a href="/images/posts/hoyodesmog/estaciones_new.png">
<img alt="Including missing stations" class="image-process-article-image" src="/images/posts/hoyodesmog/derivatives/article-image/estaciones_new.png"/>
</a></p>
<p>Sadly, in fixing the problem they broke the querying system and now
you can’t download data from before 2015 (
<a href="http://www.aire.df.gob.mx/estadisticas-consultas/concentraciones/index.php">try it here</a>
). My R package doesn’t have this problem.</p>
<p>Some stations were also missing from the list available for
<a href="http://148.243.232.112:8080/opendata/catalogos/cat_estacion.csv">download</a>
from the website. I added them manually by using Google Maps.</p>
<p>In addition to all this, when you download pollution data there is a station
called <span class="caps">CHA</span>, but in the
<a href="http://www.aire.df.gob.mx/ultima-hora-reporte.php">hourly report</a> it
is instead called <span class="caps">MON</span> (Texcoco). In the R package I always use the station
code <span class="caps">MON</span>. Of course now I’m afraid to report all these problems in case the
state of Mexico City government screws up the website even more.</p>
<h3>Problems with conversions</h3>
<p>As I mentioned the government uses a 0-500 scale in <span class="caps">IMECAS</span> to
communicate to public how polluted the air currently is. To convert to
<span class="caps">IMECAS</span> from the original units in which the pollutants are measured
the government uses stepwise functions, but I’m unable to replicate
the values you are supposed to get using the official formulas and websites.</p>
<p>For example, when I try convert an <span class="caps">NO</span><sub>2</sub> value of .150 ppm to <span class="caps">IMECAS</span>
using the formula I get a value of 72</p>
<p>I[<span class="caps">NO2</span>]=1.587+C[<span class="caps">NO2</span>]*49/0.104</p>
<p>but 71 if I use the html form on this
<a href="http://rama.edomex.gob.mx/contaminacion-atmosferica/imeca">website</a></p>
<p>There is also an issue where you have to use the 24 hour average to
calculate <span class="caps">IMECA</span> values (as with <span class="caps">PM10</span>) and it is not document what
happens when there are missing values (it’s not listwise deletion).</p>
<p>All this means that except for the frontpage map all values are reported in the
original units (ppb, µg/m³, etc) in which pollutants are measured.</p>
<p><span class="caps">P.S.</span> The R package is available from <a href="https://github.com/diegovalle/aire.zmvm">GitHub</a></p>Shapefiles from the 2015 Population Survey2016-01-27T00:00:00+01:00Diego Valle-Jonestag:blog.diegovalle.net,2016-01-27:2016/01/encuesta-intercensal-2015-shapefiles.html<p><a href="/images/posts/population-survey-shapefiles/df-streets.jpg">
<img alt="Streets and Services in the DF" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/df-streets.jpg"/>
</a></p>
<p>The <span class="caps">INEGI</span> just published the results of the latest <a href="http://www.inegi.org.mx/est/contenidos/proyectos/encuestas/hogares/especiales/ei2015/default.aspx">population survey</a>
along with updated shapefiles to reflect the changes to the
Mexican population. At the end of this post you’ll find a script to
download the updated manzanas (blocks), urban AGEBs, rural AGEBs, municipios,
streets (ejes viales), states, services, and localities
(localidades). It’s <span class="caps">7GB</span> of the latest shapefiles available for free!</p>
<p>If you don’t know how to run the script or prefer to simply
download the data, you can subscribe to my newsletter (one email per post) and you’ll
get the shapefile download links directly in your inbox as a bonus.
<br/>
</p><div id="envelope" style="border-color:#023F50;width:87%;margin:0;background-color:rgba(61, 121, 138, 1);padding:1em;font-family: 'PT Sans', sans-serif;">
<div class="mc_embed_signup" style="overflow: hidden;
text-align: left;">
<div class="form-top-left" style="float: left;
width: 75%;
padding-top: 25px;">
<h3 style="color:white;margin:0;font-family: 'PT Sans', sans-serif;">Subscribe to my <span class="free" style="color: #C7B720;">free</span> newsletter</h3>
<br/>
<p style="opacity:1;color:white;font-family: 'PT Sans', sans-serif;font-size:80%"><b>My email list is pretty simple: one email for each new post or project. If you join over 5,000 subscribers to my newsletter from Harvard, Stanford, Google, McKinsey, and many more, you’ll receive as a welcome gift the 100+ shapefiles described in this post (It’s more than <span class="caps"><span class="caps">7GB</span></span> of data and totally free)</b></p>
<p></p><ul style="opacity:1;color:white;font-family: 'PT Sans', sans-serif;font-size:80%">
<li>Shapefiles of Manzanas, AGEBs, Municipios, Estados, and more
</li>
<li>
The latest shapefiles from the 2020 Census
</li>
<li>Includes historical shapefiles from 2010 census</li>
<li><a href="https://www.diegovalle.net/privacy/">Privacy policy</a></li>
<li>Unsubscribe at any time</li>
<p></p></ul><p></p>
<!-- <p>Enter your email below to get instant access:</p> -->
</div>
<div class="form-top-right" style=" float: left;
width: 25%;
padding-top: 5px;
font-size: 66px;
color: #fff;
line-height: 100px;
text-align: right;
opacity: 0.3;">
<i class="fa fa-pencil"></i>
</div>
</div>
<div class="form-bottom">
<form action="https://www.diegovalle.net/api/newsletter" class="registration-form" id="Newsletter" method="post" novalidate="novalidate" role="form">
<!-- <div class="form-group">
<label class="sr-only" for="form-first-name">First name</label>
<input type="text" name="form-first-name" placeholder="First name..." class="form-first-name form-control" id="form-first-name">
</div>
<div class="form-group">
<label class="sr-only" for="form-last-name">Last name</label>
<input type="text" name="form-last-name" placeholder="Last name..." class="form-last-name form-control" id="form-last-name">
</div> -->
<div class="form-group">
<label for="email"><strong style="color:white;font-family: 'PT Sans', sans-serif;font-weight: 100;
font-size: 90%;">Where should I send the newsletter and shapefiles?</strong></label>
</div>
<div class="form-group">
<label class="sr-only" for="form-email" style=" position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0,0,0,0);
border: 0;">Email</label>
<input aria-required="true" class="form-email form-control" id="email" name="email" placeholder="Email..." required="" type="email"/>
</div>
<div style="position: absolute; left: -5000px;"><input name="website" style="height: 50px;margin: 0;padding: 0 20px;vertical-align: middle;background: #fff;border: 3px solid #fff;font-size: 16px;font-weight: 300;line-height: 50px;color: #888;-moz-border-radius: 4px;-webkit-border-radius: 4px;border-radius: 4px;-moz-box-shadow: none;-webkit-box-shadow: none;box-shadow: none;-o-transition: all .3s;-moz-transition: all .3s;-webkit-transition: all .3s;-ms-transition: all .3s;transition: all .3s;" tabindex="-1" type="text" value="fatcatseat2much"/>
<input name="referrer" tabindex="-1" type="text" value="2015shapefiles"/>
</div>
<input class="hiddenRecaptcha_post required" id="hiddenRecaptcha_post" name="hiddenRecaptcha_post" type="hidden"/>
<div class="g-recaptcha" data-sitekey="6LdhprAZAAAAAONu3rfxTPNGCIjjHbH06dqVerDd" id="recaptcha_post"></div><br/>
<button class="btn" style="height: 50px;margin: 0;padding: 0 20px;vertical-align: middle;border: 0;font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 16px;font-weight: 900;line-height: 50px;color: #fff;-moz-border-radius: 4px;-webkit-border-radius: 4px;border-radius: 4px;text-shadow: none;-moz-box-shadow: none;-webkit-box-shadow: none;box-shadow: none;-o-transition: all .3s;-moz-transition: all .3s;-webkit-transition: all .3s;-ms-transition: all .3s;transition: all .3s;" type="submit">Get your free newsletter</button>
</form>
</div>
</div>
<br/>
<p><a href="/images/posts/population-survey-shapefiles/muns.png">
<img alt="States and municipios of Mexico" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/muns.png"/>
</a></p>
<p>The script creates a directory for each of the 32 states and
Federal District where you’ll find all the shapefiles.</p>
<table>
<thead>
<tr>
<th>File</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>entidad</td>
<td>Entidad (states)</td>
</tr>
<tr>
<td>municipio</td>
<td>Municipio (counties)</td>
</tr>
<tr>
<td>localidad_urbana_y_rural_amanzanada</td>
<td>Localidad Urbana y Rural Amanzanada</td>
</tr>
<tr>
<td>localidad_rural_no_amanzanada</td>
<td>Localidad Rural</td>
</tr>
<tr>
<td>ageb_urbana</td>
<td>Área Geoestadística Básica (<span class="caps">AGEB</span>) [census tracts]</td>
</tr>
<tr>
<td>ageb_rural</td>
<td>Área Geoestadística Básica Rural (<span class="caps">AGEB</span>) [census tracts]</td>
</tr>
<tr>
<td>manzana</td>
<td>Polígonos de Manzanas (census blocks)</td>
</tr>
<tr>
<td>frentes_de_manazana</td>
<td>Frentes de Manzana (census blocks)</td>
</tr>
<tr>
<td>eje_vial</td>
<td>Ejes de vialidad (streets)</td>
</tr>
<tr>
<td>servicios_area</td>
<td>Servicios con Información complementaria de tipo Área (Áreas Verdes, Camellones, glorietas)</td>
</tr>
<tr>
<td>servicios_linea</td>
<td>Servicios con Información complementaria de tipo Línea (Ríos, Ferrocarriles)</td>
</tr>
<tr>
<td>servicios_puntual</td>
<td>Servicios con Información complementaria de tipo Puntual (Palacios Municipales o Ayudantías, Parques o Jardines)</td>
</tr>
<tr>
<td>territorio_insular</td>
<td>Territorio Insular (insular territory)</td>
</tr>
</tbody>
</table>
<p>The shapefiles didn’t change much from 2010 to 2015, but there were a few changes. Here’s and example of new services in Cancún (new ones are yellow):</p>
<p><a href="/images/posts/population-survey-shapefiles/cancun.jpg">
<img alt="Cancún" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/cancun.jpg"/>
</a></p>
<p><small></small></p>
<p>Like I said, there weren’t that many changes. Urban and rural AGEBs in Jalisco:</p>
<p><a href="/images/posts/population-survey-shapefiles/jal.jpg">
<img alt="Jalisco" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/jal.jpg"/>
</a></p>
<p>Urban AGEBs and roads in Baja California:</p>
<p><a href="/images/posts/population-survey-shapefiles/bc.jpg">
<img alt="Baja California AGEB" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/bc.jpg"/>
</a></p>
<p>Manzanas (blocks) in Morelos:</p>
<p><a href="/images/posts/population-survey-shapefiles/mor.jpg">
<img alt="Morelos" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/mor.jpg"/>
</a></p>
<p>Roads, localidades, rural and urban AGEBs in Acapulco:</p>
<p><a href="/images/posts/population-survey-shapefiles/gro.jpg">
<img alt="Acapulco" class="image-process-article-image" src="/images/posts/population-survey-shapefiles/derivatives/article-image/gro.jpg"/>
</a></p>
<p>Since the shapefiles are divided by state, you can use the bash code
below to merge all the individual state shapefiles into one big
national file.</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#! /bin/bash</span>
<span class="c"># The filename of the merged file</span>
<span class="nv">FILEOUT</span><span class="o">=</span><span class="s2">"municipio.shp"</span>
<span class="c"># The names of the files to merge, you can change this to</span>
<span class="c"># "*entidad.shp" or "*eje_vial.shp", etc</span>
<span class="nv">TYPE</span><span class="o">=</span><span class="s2">"*municipio.shp"</span>
<span class="k">for</span> i in <span class="k">$(</span>find . -maxdepth <span class="m">3</span> -name <span class="nv">$TYPE</span><span class="k">)</span>
<span class="k">do</span>
<span class="k">if</span> <span class="o">[</span> -f <span class="s2">"</span><span class="nv">$FILEOUT</span><span class="s2">"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"adding state </span><span class="nv">$i</span><span class="s2"> to </span><span class="nv">$FILEOUT</span><span class="s2">"</span>
ogr2ogr -f <span class="s1">'ESRI Shapefile'</span> -update -append <span class="nv">$FILEOUT</span> <span class="nv">$i</span> -nln <span class="k">$(</span>basename -s .shp <span class="nv">$FILEOUT</span><span class="k">)</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"startin merge..."</span>
<span class="nb">echo</span> <span class="s2">"adding state </span><span class="nv">$i</span><span class="s2"> to </span><span class="nv">$FILEOUT</span><span class="s2">"</span>
ogr2ogr -f <span class="s1">'ESRI Shapefile'</span> <span class="nv">$FILEOUT</span> <span class="nv">$i</span>
<span class="k">fi</span>
<span class="k">done</span>
</pre></div>
</td></tr></table>
<p>All shapefiles come from the <span class="caps">INEGI</span>’s “Cartografía Geoestadística
Urbana y Rural Amanzanada. Cierre de la Encuesta Intercensal 2015.”
Here’s the code to download them:</p>
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111</pre></div></td><td class="code"><div class="highlight"><pre><span class="c">#! /bin/bash</span>
<span class="c"># Author: Diego Valle-Jones</span>
<span class="c"># Web: https://www.diegovalle.net</span>
<span class="c"># LICENSE: Apache 2.0</span>
<span class="c"># Purpose: Download shapefiles of manzanas (blocks), agebs (census areas), ejes</span>
<span class="c"># viales (streets), interesting areas and a whole bunch of other stuff from</span>
<span class="c"># the Encuesta Intercensal 2015</span>
<span class="c"># As of now, this script has not been tested on Windows,</span>
<span class="c"># only on Ubuntu and Macs. The script will create a directory</span>
<span class="c"># called 'shps' where all the shapefiles are located, if something</span>
<span class="c"># goes wrong when dowloading be sure to delete it and try again</span>
<span class="c">#Exit on error</span>
<span class="nb">set</span> -e
<span class="c"># Projection compatible with Google Maps</span>
<span class="nv">PROJECTION</span><span class="o">=</span><span class="s2">"+proj=longlat +ellps=WGS84 +no_defs +towgs84=0,0,0"</span>
<span class="c"># wget command</span>
<span class="nv">CURL</span><span class="o">=</span><span class="s2">"curl"</span>
<span class="c">#The way the INEGI download url starts</span>
<span class="nv">URL</span><span class="o">=</span><span class="s2">"http://internet.contenidos.inegi.org.mx/contenidos/productos//prod_serv/contenidos/espanol/bvinegi/productos/geografia/Cinter_2015/"</span>
<span class="c">#File ends in</span>
<span class="nv">SUFFIX</span><span class="o">=</span><span class="s2">"_s.zip"</span>
<span class="c">#States as numbers</span>
<span class="c">#I have no idea why the INEGI used these numbers to represent the states</span>
<span class="nb">declare</span> -a <span class="nv">states_numbers</span><span class="o">=(</span><span class="s2">"702825209025"</span> <span class="s2">"702825209032"</span> <span class="s2">"702825209049"</span> <span class="s2">"702825209056"</span> <span class="s2">"702825209087"</span> <span class="s2">"702825209094"</span> <span class="s2">"702825209063"</span> <span class="s2">"702825209070"</span> <span class="s2">"702825209100"</span> <span class="s2">"702825209117"</span> <span class="s2">"702825209124"</span> <span class="s2">"702825209131"</span> <span class="s2">"702825209148"</span> <span class="s2">"702825209155"</span> <span class="s2">"702825209162"</span> <span class="s2">"702825209179"</span> <span class="s2">"702825209186"</span> <span class="s2">"702825209193"</span> <span class="s2">"702825209209"</span> <span class="s2">"702825209216"</span> <span class="s2">"702825209223"</span> <span class="s2">"702825209230"</span> <span class="s2">"702825209247"</span> <span class="s2">"702825209254"</span> <span class="s2">"702825209261"</span> <span class="s2">"702825209278"</span> <span class="s2">"702825209285"</span> <span class="s2">"702825209292"</span> <span class="s2">"702825209308"</span> <span class="s2">"702825209315"</span> <span class="s2">"702825209322"</span> <span class="s2">"702825209339"</span><span class="o">)</span>
<span class="c">#State names in the URL</span>
<span class="nb">declare</span> -a <span class="nv">state_names</span><span class="o">=(</span><span class="s2">"Aguascalientes"</span> <span class="s2">"Baja_California"</span> <span class="s2">"Baja_California_Sur"</span> <span class="s2">"Campeche"</span> <span class="s2">"Coahuila_de_Zaragoza"</span> <span class="s2">"Colima"</span> <span class="s2">"Chiapas"</span> <span class="s2">"Chihuahua"</span> <span class="s2">"Distrito_Federal"</span> <span class="s2">"Durango"</span> <span class="s2">"Guanajuato"</span> <span class="s2">"Guerrero"</span> <span class="s2">"Hidalgo"</span> <span class="s2">"Jalisco"</span> <span class="s2">"Mexico"</span> <span class="s2">"Michoacan_de_Ocampo"</span> <span class="s2">"Morelos"</span> <span class="s2">"Nayarit"</span> <span class="s2">"Nuevo_Leon"</span> <span class="s2">"Oaxaca"</span> <span class="s2">"Puebla"</span> <span class="s2">"Queretaro"</span> <span class="s2">"Quintana_Roo"</span> <span class="s2">"San_Luis_Potosi"</span> <span class="s2">"Sinaloa"</span> <span class="s2">"Sonora"</span> <span class="s2">"Tabasco"</span> <span class="s2">"Tamaulipas"</span> <span class="s2">"Tlaxcala"</span> <span class="s2">"Veracruz_de_Ignacio_de_la_Llave"</span> <span class="s2">"Yucatan"</span> <span class="s2">"Zacatecas"</span> <span class="o">)</span>
<span class="c"># The list of shapefiles of manzanas, agebs, etc</span>
<span class="nb">declare</span> -a <span class="nv">files</span><span class="o">=(</span><span class="s2">"ar.shp"</span> <span class="s2">"ent.shp"</span> <span class="s2">"lpr.shp"</span> <span class="s2">"m.shp"</span> <span class="s2">"fm.shp"</span> <span class="s2">"sia.shp"</span> <span class="s2">"sip.shp"</span>
<span class="s2">"a.shp"</span> <span class="s2">"e.shp"</span> <span class="s2">"l.shp"</span> <span class="s2">"mun.shp"</span> <span class="s2">"sil.shp"</span> <span class="s2">"territorioinsular.shp"</span><span class="o">)</span><span class="p">;</span>
<span class="c">#The INEGI filenames are unreadable</span>
<span class="nb">declare</span> -a <span class="nv">files_nice</span><span class="o">=(</span><span class="s2">"ageb_rural.shp"</span> <span class="s2">"entidad.shp"</span> <span class="s2">"localidad_rural_no_amanzanada.shp"</span> <span class="s2">"manzana.shp"</span> <span class="s2">"frente_de_manzana.shp"</span> <span class="s2">"servicios_area.shp"</span> <span class="s2">"servicios_puntual.shp"</span>
<span class="s2">"ageb_urbana.shp"</span> <span class="s2">"eje_vial.shp"</span> <span class="s2">"localidad_urbana_y_rural_amanzanada.shp"</span> <span class="s2">"municipio.shp"</span> <span class="s2">"servicios_linea.shp"</span> <span class="s2">"territorio_insular.shp"</span><span class="o">)</span><span class="p">;</span>
<span class="c"># State abbreviations</span>
<span class="nb">declare</span> -a <span class="nv">states</span><span class="o">=(</span><span class="s2">"ags"</span> <span class="s2">"bc"</span> <span class="s2">"bcs"</span> <span class="s2">"camp"</span> <span class="s2">"coah"</span> <span class="s2">"col"</span> <span class="s2">"chis"</span> <span class="s2">"chih"</span>
<span class="s2">"df"</span> <span class="s2">"dgo"</span> <span class="s2">"gto"</span> <span class="s2">"gro"</span> <span class="s2">"hgo"</span> <span class="s2">"jal"</span> <span class="s2">"mex"</span> <span class="s2">"mich"</span> <span class="s2">"mor"</span> <span class="s2">"nay"</span> <span class="s2">"nl"</span> <span class="s2">"oax"</span>
<span class="s2">"pue"</span> <span class="s2">"qro"</span> <span class="s2">"qroo"</span> <span class="s2">"slp"</span> <span class="s2">"sin"</span> <span class="s2">"son"</span> <span class="s2">"tab"</span> <span class="s2">"tamps"</span> <span class="s2">"tlax"</span> <span class="s2">"ver"</span> <span class="s2">"yuc"</span>
<span class="s2">"zac"</span><span class="o">)</span><span class="p">;</span>
<span class="nb">declare</span> -a <span class="nv">state_num</span><span class="o">=(</span><span class="sb">`</span>seq -s <span class="s2">" "</span> -w <span class="m">1</span> 32<span class="sb">`</span><span class="o">)</span><span class="p">;</span>
<span class="c"># Use gdal to reproject, and then rename the shapefiles to include</span>
<span class="c"># a user friendly abbreviation instead of a number</span>
<span class="c"># First argument: directory of shapefiles shps/state_abbreviation</span>
<span class="c"># Second argument: the state abbreviation</span>
<span class="c"># Third argument: the shapefiles inside the zip file as an array</span>
<span class="c"># Fourth argument: the state number</span>
<span class="c"># TODO: convert the encoding from windows-1252 to utf-8</span>
<span class="k">function</span> reproject <span class="o">{</span>
<span class="nv">name</span><span class="o">=</span><span class="nv">$3</span><span class="o">[</span>@<span class="o">]</span>
<span class="nv">arr</span><span class="o">=(</span><span class="s2">"</span><span class="si">${</span><span class="p">!name</span><span class="si">}</span><span class="s2">"</span><span class="o">)</span>
<span class="nv">len</span><span class="o">=</span><span class="sb">`</span>expr <span class="si">${#</span><span class="nv">files</span><span class="p">[*]</span><span class="si">}</span> - 1<span class="sb">`</span>
<span class="c"># Has to match he number of files in the array</span>
<span class="k">for</span> i in <span class="sb">`</span>seq <span class="m">0</span> <span class="nv">$len</span><span class="sb">`</span>
<span class="k">do</span>
<span class="k">if</span> <span class="o">[</span> -f <span class="nv">$1</span>/conjunto_de_datos/<span class="nv">$4</span><span class="si">${</span><span class="nv">files</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="si">}</span> <span class="o">]</span><span class="p">;</span>
<span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"Creating... "</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>/<span class="nv">$2_</span><span class="si">${</span><span class="nv">files_nice</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="si">}</span>
ogr2ogr <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>/<span class="nv">$2_</span><span class="si">${</span><span class="nv">files_nice</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="si">}</span> <span class="nv">$1</span>/conjunto_de_datos/<span class="nv">$4</span><span class="si">${</span><span class="nv">files</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="si">}</span> -t_srs <span class="s2">"</span><span class="nv">$PROJECTION</span><span class="s2">"</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"No territorio insular in "</span> <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>/<span class="nv">$2_</span><span class="si">${</span><span class="nv">files_nice</span><span class="p">[</span><span class="nv">$i</span><span class="p">]</span><span class="si">}</span>
<span class="k">fi</span>
<span class="k">done</span>
rm -rf <span class="s2">"</span><span class="nv">$1</span><span class="s2">"</span>/conjunto_de_datos
<span class="o">}</span>
<span class="nv">counter</span><span class="o">=</span>0
<span class="k">for</span> state_number in <span class="s2">"</span><span class="si">${</span><span class="nv">states_numbers</span><span class="p">[@]</span><span class="si">}</span><span class="s2">"</span>
<span class="k">do</span>
<span class="nv">FILENAME</span><span class="o">=</span><span class="s2">"</span><span class="nv">$URL</span><span class="si">${</span><span class="nv">state_names</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span><span class="s2">/</span><span class="nv">$state_number$SUFFIX</span><span class="s2">"</span>
<span class="c"># download the files from the inegi server.</span>
<span class="nv">$CURL</span> <span class="nv">$FILENAME</span> -o <span class="si">${</span><span class="nv">states</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span>.zip
<span class="c"># Extract the shapefiles from the zip file</span>
mkdir -p shps/<span class="si">${</span><span class="nv">states</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span>
unzip -o -L <span class="si">${</span><span class="nv">states</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span>.zip -d shps/<span class="si">${</span><span class="nv">states</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span>
reproject shps/<span class="si">${</span><span class="nv">states</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span> <span class="si">${</span><span class="nv">states</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span> files <span class="si">${</span><span class="nv">state_num</span><span class="p">[</span><span class="nv">$counter</span><span class="p">]</span><span class="si">}</span>
<span class="nv">counter</span><span class="o">=</span><span class="sb">`</span>expr <span class="nv">$counter</span> + 1<span class="sb">`</span>
<span class="k">done</span>
<span class="c"># Delete the downloaded zip files</span>
rm -rf *.zip
<span class="c"># You could use the code below to merge all the states into one giant</span>
<span class="c"># shapefile of Mexico. Change "*localidad_urbana.shp" to</span>
<span class="c"># '*ageb_urbana.shp' or '*eje_vial.shp' or whatever</span>
<span class="c">#</span>
<span class="c"># FILEOUT="municipio.shp"</span>
<span class="c"># TYPE="*municipio.shp"</span>
<span class="c"># for i in $(find . -maxdepth 3 -name $TYPE)</span>
<span class="c"># do</span>
<span class="c"># if [ -f "$FILEOUT" ]</span>
<span class="c"># then</span>
<span class="c"># echo "adding state $i to $FILEOUT"</span>
<span class="c"># ogr2ogr -f 'ESRI Shapefile' -update -append $FILEOUT $i -nln $(basename -s .shp $FILEOUT)</span>
<span class="c"># else</span>
<span class="c"># echo "startin merge..."</span>
<span class="c"># echo "adding state $i to $FILEOUT"</span>
<span class="c"># ogr2ogr -f 'ESRI Shapefile' $FILEOUT $i</span>
<span class="c"># fi</span>
<span class="c"># done</span>
</pre></div>
</td></tr></table>
<p><strong><span class="caps">P.S.</span></strong> The frente de manzana shapefile for Sonora contains an error
in its attribute table, hopefully the <span class="caps">INEGI</span> will fix it in a future version.</p>
<p><strong><span class="caps">P.P.S.</span></strong> Unlike the
<a href="https://blog.diegovalle.net/2013/06/shapefiles-of-mexico-agebs-manzanas-etc.html">2010 census shapefiles</a>,
these ones don’t contain demographic variables. (the Encuesta
Intercensal is valid for all municipios and the localidades with more
than 50,000 people)</p>Mexico’s Black Population2016-01-05T00:00:00+01:00Diego Valle-Jonestag:blog.diegovalle.net,2016-01-05:2016/01/afro-mexicans.html<p>The 2015 population survey marked the first time since the 19<sup>th</sup>
century that the Mexican government included a distinct category for
people of Afro-Mexican descent. As of 2015, the <span class="caps">INEGI</span> found that
1,973,555 persons or 1.7% of the population self-identified as
Afro-Mexican or partially Afro-Mexican (1.2% of the population
excluding people who self-identified as only partially Afro-Mexican).</p>
<p><a href="https://www.diegovalle.net/maps/afromexicanos/afromexicanos.html"> <img alt="Afro-Mexican population in Mexico" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/afromexicanos.png"/> </a><br/>
<small><a href="https://www.diegovalle.net/maps/afromexicanos/afromexicanos.html">Click</a> to visit the interactive version</small></p>
<p>A map of the percentage of the population that self-identifies as
Afro-Mexican at the municipio level shows that they tend to live in
the Costa Chica of Guerrero and Oaxaca, and the state of
Veracruz. This is no surprise since the isolated mountainous
geography of the Costa Chica served to keep Afro-Mexican communities
separate from the rest of Mexico.</p>
<p><a href="https://www.diegovalle.net/maps/terrain/costa-chica.html">
<img alt="3D terrain of the Costa Chica de Guerrero and Oaxaca" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/costa_chica.html.png"/>
</a><br/>
<small><a href="https://www.diegovalle.net/maps/terrain/costa-chica.html">Click</a> to visit the interactive version</small></p>
<p>This 3D terrain map of the Costa Chica from Acapulco to Huatulco zooms
in on the area with the highest percentage of Afro-Mexicans and shows
how it is surrounded by mountains. The prevailing theory of how
Afro-Mexicans arrived in the Costa Chica is that escaped slaves
brought by Spanish galleons settled here, and found freedom and refuge
thanks to the area’s isolation.</p>
<p>One problem with using self-identification to determine ethnic origin
—as the population survey did— is that there have now been many
genetic studies of Mexican populations and a robust finding is that the
vast majority of Mexicans are part Black. Here’s an image of several
individuals from different Mexican states taken from
<em><a href="http://www.sciencemag.org/content/344/6189/1280.full">The genetics of Mexico recapitulates Native American substructure and affects biomedical traits</a></em></p>
<p><a href="/images/posts/afro-mexicans/admixture-states.png">
<img alt="Admixture in selected Mexican states" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/admixture-states.png"/> </a></p>
<p>The red bars represent European ancestry, the green bars Sub-Saharan
African (Yoruba), and the blue bars indigenous ancestry. Granted,
genetics is a fast changing field<sup id="fnref:1"><a class="footnote-ref" href="#fn:1" rel="footnote">1</a></sup>, but the results shouldn’t change
much, and you can clearly see how just about everyone in Mexico has
some very minor <span class="caps">SSA</span> ancestry, with a low variance, except for the
states of Guerrero, Veracruz and Oaxaca where there were individuals
with high African admixture. Also, note how those individuals have a
high percentage of indigenous ancestry.</p>
<p><a href="/images/posts/afro-mexicans/states_afro.png">
<img alt="Afro-Mexican and partially Afro-Mexican population by state" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/states_afro.png"/>
</a></p>
<p>More than 200,000 slaves were brought to Mexico, compared to 450,000
in the <span class="caps">US</span>, and 4.5 million in Brazil. In the 1742 and 1793 censuses,
the Black and Mulatto population of Mexico came in at about 10%, being
much less numerous than the indigenous and mestizo population, and
with no strictures against intermarriage, with time they were absorbed
into the general Mexican population.</p>
<style type="text/css">
.tg {border-collapse:collapse;border-spacing:0;}
.tg td{font-family:Arial, sans-serif;font-size:14px;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg th{font-family:Arial, sans-serif;font-size:14px;font-weight:normal;padding:10px 5px;border-style:solid;border-width:1px;overflow:hidden;word-break:normal;}
.tg .tg-0ord{text-align:right}
.tg .tg-e3zv{font-weight:bold}
.tg .tg-lqy6{text-align:right;vertical-align:top}
.tg .tg-hgcj{font-weight:bold;text-align:center}
.tg .tg-amwm{font-weight:bold;text-align:center;vertical-align:top}
</style>
<table>
<thead>
<tr>
<th class="tg-031e">Census Year</th>
<th class="tg-hgcj">1570</th>
<th class="tg-hgcj">1646</th>
<th class="tg-amwm">1742</th>
<th class="tg-amwm">1793</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tg-e3zv">Indians</td>
<td class="tg-0ord">3,336,860 (98.7%)</td>
<td class="tg-0ord">1,269,607 (74.1%)</td>
<td class="tg-lqy6">1,540,256 (62.2%)</td>
<td class="tg-lqy6">2,319,741 (61.1%)</td>
</tr>
<tr>
<td class="tg-e3zv">Europeans</td>
<td class="tg-0ord">6,644 (0.2%)</td>
<td class="tg-0ord">13,780 (0.8%)</td>
<td class="tg-lqy6">9,814 (0.4%)</td>
<td class="tg-lqy6">7,904 (0.2%)</td>
</tr>
<tr>
<td class="tg-e3zv">Mestizos</td>
<td class="tg-0ord">1,3504 (0.4%)</td>
<td class="tg-0ord">277,610 (16.2%)</td>
<td class="tg-lqy6">640,880 (25.9%)</td>
<td class="tg-lqy6">1,096,026 (28.8%)</td>
</tr>
<tr>
<td class="tg-e3zv">Blacks</td>
<td class="tg-0ord">20,569 (0.6%)</td>
<td class="tg-0ord">35,089 (2%)</td>
<td class="tg-lqy6">20,131 (0.8%)</td>
<td class="tg-lqy6">6,100 (0.2%)</td>
</tr>
<tr>
<td class="tg-e3zv">Mulattos</td>
<td class="tg-0ord">2,435 (0.1%)</td>
<td class="tg-0ord">116,529 (6.8%)</td>
<td class="tg-lqy6">266,196 (10.7%)</td>
<td class="tg-lqy6">369,790 (9.7%)</td>
</tr>
</tbody>
</table>
<p><small>Source: The History of Mexico From Pre-Conquest to Present</small></p>
<p>Looking at the table, a big part of the recovery of the Indian
population during the colonial period must have been due to Indian women
having children with Mestizos and Mulattos, and with the forging of Mexico’s mestizo
identity, the ‘afromestizos’ were simply forgotten.</p>
<p>The states with large populations of Afro-Mexicans are also states with
large indigenous populations as the following map shows:</p>
<p><a href="/images/posts/afro-mexicans/indigenous.png">
<img alt="Indigenous population in Mexico" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/indigenous.png"/>
</a></p>
<p>Some Native Mexicans also present <span class="caps">SSA</span> admixture. If you squint really
hard at the <span class="caps">SSA</span> admixture for the Mayan Native Mexicans in the chart
below you can see that they have some African ancestry. In the
<a href="https://books.google.com/books?id=l0L5_lzURQkC&pg=PA93&lpg=PA93&dq=1789+censo+yucatan&source=bl&ots=S2LlMNSAE2&sig=xRktUfdJcG31OUmeYiw5g6toY3A&hl=en&sa=X&redir_esc=y#v=onepage&q=1789%20censo%20yucatan&f=false">1789 census</a>,
12% of the population in Yucatán was Black or Mulatto. And today there
are several municipios in Yucatan that have a high Afro-Mexican or part Afro-Mexican
presence (wether you consider yourself Afro-Mexican or part Afro-Mexican seems to vary somewhat by state): Dzoncauich (17.5%), Mama (5.2%) and Chikindzonot (5.1%).</p>
<p><a href="/images/posts/afro-mexicans/F2.large.jpg">
<img alt="Admixture in Mayas and Cosmopolitan Hipsters" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/F2.large.jpg"/>
</a></p>
<p><small>Source: The genetics of Mexico recapitulates Native American substructure and affects biomedical traits</small></p>
<p>I tried to find a genetic study that focused specifically on
Afro-Mexicans, but I couldn’t find one. My best guess is that one
would find much higher <span class="caps">SSA</span> ancestry among self-identified
Afro-Mexicans, but with a large variance, unlike the rest of Mexico
which consistently shows low variance.</p>
<p>Indigenous and Afro-Mexican are not exclusive categories. People who
consider themselves both Afro-Mexican and indigenous outnumber those
who consider themselves to be solely Afro-Mexican.</p>
<p><a href="/images/posts/afro-mexicans/total_race.png">
<img alt="Total population by ethnic group and combinations" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/total_race.png"/>
</a></p>
<p>This tendency to belong to more than one group could bias some
measurements. If you want to predict literacy in Guerrero and Veracruz
it seems to be more important to be indigenous than to be Afro-Mexican.</p>
<p><a href="/images/posts/afro-mexicans/read_race.png">
<img alt="Literacy rates by ethnic group and combinations" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/read_race.png"/>
</a></p>
<p>In fact, people who consider themselves to be only Afro-Mexican have
the highest literacy rates in Veracruz and second highest in Guerrero,
while in Oaxaca, for some reason, they cluster with the indigenous
population. This certainly merits further research. When comparing
literacy rates to the Mexican average, keep in mind that the three
states with the highest proportion of Afro-Mexicans together with
Chiapas have the lowest rates of literacy in Mexico.</p>
<p>In Brazil and the United States the Black population suffers from
much higher rates of violence, but in Mexico the percentage of the
population that is Black is not correlated with the homicide rate in
Veracruz, is positively correlated in Oaxaca, and the correlation is
actually negative in Guerrero. Though, that is mostly because drug
trafficking routes don’t go through the areas Afro-Mexicans live in
and there has been some spillover of violence into Oaxaca from
Guerrero (Mexico’s <a href="https://elcri.men/en/">most violent</a> state). Even if less violent than the
rest of Guerrero, the Costa Chica region is still
<a href="http://www.excelsior.com.mx/nacional/2015/11/10/1056163">very violent</a>
by any standard.</p>
<p><a href="/images/posts/afro-mexicans/homicides_drugwar.png">
<img alt="Homicide correlations during the drug war" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/homicides_drugwar.png"/>
</a></p>
<p>Before the drug war, there was no correlation between the percentage of
the population that is Afro-Mexican and the homicide rate.</p>
<p><a href="/images/posts/afro-mexicans/homicides_before.png">
<img alt="Homicide correlations before the drug war" class="image-process-article-image" src="/images/posts/afro-mexicans/derivatives/article-image/homicides_before.png"/>
</a></p>
<p><strong>Municipios with the highest percentage of Afro-Mexicans</strong>
<br/>
</p><table class="gmisc_table" style="border-collapse: collapse;">
<thead>
<tr>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">State</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Municipio</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Total Population</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Afro-Mexicans
(totally or partially)</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Percent</th>
<p></p></tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">Oaxaca</td>
<td style="text-align: left;">Santiago Tapextla</td>
<td style="text-align: center;">3208</td>
<td style="border-right: 1px solid black; text-align: center;">2756</td>
<td style="text-align: center;">85.9%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">Oaxaca</td>
<td style="background-color: #f7f7f7; text-align: left;">Santo Domingo Armenta</td>
<td style="background-color: #f7f7f7; text-align: center;">3469</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">2678</td>
<td style="background-color: #f7f7f7; text-align: center;">77.2%</td>
</tr>
<tr>
<td style="text-align: left;">Oaxaca</td>
<td style="text-align: left;">San Juan Bautista Lo de Soto</td>
<td style="text-align: center;">2593</td>
<td style="border-right: 1px solid black; text-align: center;">1920</td>
<td style="text-align: center;">74%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">Guerrero</td>
<td style="background-color: #f7f7f7; text-align: left;">Cuajinicuilapa</td>
<td style="background-color: #f7f7f7; text-align: center;">27266</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">16907</td>
<td style="background-color: #f7f7f7; text-align: center;">62%</td>
</tr>
<tr>
<td style="text-align: left;">Oaxaca</td>
<td style="text-align: left;">Santa María Cortijo</td>
<td style="text-align: center;">1075</td>
<td style="border-right: 1px solid black; text-align: center;">660</td>
<td style="text-align: center;">61.4%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">Oaxaca</td>
<td style="background-color: #f7f7f7; text-align: left;">Santiago Llano Grande</td>
<td style="background-color: #f7f7f7; text-align: center;">3284</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">1934</td>
<td style="background-color: #f7f7f7; text-align: center;">58.9%</td>
</tr>
<tr>
<td style="text-align: left;">Oaxaca</td>
<td style="text-align: left;">Santa María Huazolotitlán</td>
<td style="text-align: center;">11400</td>
<td style="border-right: 1px solid black; text-align: center;">6201</td>
<td style="text-align: center;">54.4%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">Oaxaca</td>
<td style="background-color: #f7f7f7; text-align: left;">Magdalena Mixtepec</td>
<td style="background-color: #f7f7f7; text-align: center;">1375</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">742</td>
<td style="background-color: #f7f7f7; text-align: center;">54%</td>
</tr>
<tr>
<td style="text-align: left;">Oaxaca</td>
<td style="text-align: left;">Villa de Tututepec de Melchor Ocampo</td>
<td style="text-align: center;">46152</td>
<td style="border-right: 1px solid black; text-align: center;">20669</td>
<td style="text-align: center;">44.8%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: left;">Veracruz de Ignacio de la Llave</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: left;">Xoxocotla</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: center;">5446</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; border-right: 1px solid black; text-align: center;">2312</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: center;">42.5%</td>
</tr>
</tbody>
</table>
<p><strong>Municipios with the largest population of Afro-Mexicans</strong></p>
<table class="gmisc_table" style="border-collapse: collapse;">
<thead>
<tr>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">State</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Municipio</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Total Population</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Afro-Mexicans
(totally or partially)</th>
<th style="border-bottom: 1px solid grey; border-top: 2px solid grey; text-align: center;">Percent</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">Guerrero</td>
<td style="text-align: left;">Acapulco de Juárez</td>
<td style="border-right: 1px solid black; text-align: center;">810669</td>
<td style="text-align: center;">86157</td>
<td style="text-align: center;">10.6%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">México</td>
<td style="background-color: #f7f7f7; text-align: left;">Ecatepec de Morelos</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">1677678</td>
<td style="background-color: #f7f7f7; text-align: center;">37638</td>
<td style="background-color: #f7f7f7; text-align: center;">2.2%</td>
</tr>
<tr>
<td style="text-align: left;">Distrito Federal</td>
<td style="text-align: left;">Iztapalapa</td>
<td style="border-right: 1px solid black; text-align: center;">1827868</td>
<td style="text-align: center;">34239</td>
<td style="text-align: center;">1.9%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">Nuevo León</td>
<td style="background-color: #f7f7f7; text-align: left;">General Escobedo</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">425148</td>
<td style="background-color: #f7f7f7; text-align: center;">33849</td>
<td style="background-color: #f7f7f7; text-align: center;">8%</td>
</tr>
<tr>
<td style="text-align: left;">Veracruz de Ignacio de la Llave</td>
<td style="text-align: left;">Veracruz</td>
<td style="border-right: 1px solid black; text-align: center;">609964</td>
<td style="text-align: center;">30688</td>
<td style="text-align: center;">5%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">México</td>
<td style="background-color: #f7f7f7; text-align: left;">Chimalhuacán</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">679811</td>
<td style="background-color: #f7f7f7; text-align: center;">30190</td>
<td style="background-color: #f7f7f7; text-align: center;">4.4%</td>
</tr>
<tr>
<td style="text-align: left;">Jalisco</td>
<td style="text-align: left;">Guadalajara</td>
<td style="border-right: 1px solid black; text-align: center;">1460148</td>
<td style="text-align: center;">26018</td>
<td style="text-align: center;">1.8%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; text-align: left;">Jalisco</td>
<td style="background-color: #f7f7f7; text-align: left;">Zapopan</td>
<td style="background-color: #f7f7f7; border-right: 1px solid black; text-align: center;">1332272</td>
<td style="background-color: #f7f7f7; text-align: center;">22275</td>
<td style="background-color: #f7f7f7; text-align: center;">1.7%</td>
</tr>
<tr>
<td style="text-align: left;">Distrito Federal</td>
<td style="text-align: left;">Coyoacán</td>
<td style="border-right: 1px solid black; text-align: center;">608479</td>
<td style="text-align: center;">21101</td>
<td style="text-align: center;">3.5%</td>
</tr>
<tr style="background-color: #f7f7f7;">
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: left;">Distrito Federal</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: left;">Álvaro Obregón</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; border-right: 1px solid black; text-align: center;">749982</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: center;">20806</td>
<td style="background-color: #f7f7f7; border-bottom: 2px solid grey; text-align: center;">2.8%</td>
</tr>
</tbody>
</table>
<p><br/></p>
<p><br/>
<span class="caps">P.S.</span> <a href="https://github.com/diegovalle/afromexicans">Source Code</a></p>
<div class="footnote">
<hr/>
<ol>
<li id="fn:1">
<p><strong>Update</strong>: Removed the part about the back migration into Africa because it
<a href="https://dl.dropboxusercontent.com/u/26978112/Erratum%20with%20figures.pdf">was wrong</a> <a class="footnote-backref" href="#fnref:1" rev="footnote" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Up-to-date Crime Information2015-08-24T00:00:00+02:00Diego Valle-Jonestag:blog.diegovalle.net,2015-08-24:2015/08/up-to-date-crime-information.html<p><a href="https://elcri.men/en/">
<img alt="Hexbin of Mexico Crime Rates" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/homepage.png"/>
</a></p>
<p>Each month the Secretariado Ejecutivo del Sistema Nacional de Seguridad Pública publishes crime information on its website. The <a href="https://elcri.men/en/">crimenmexico</a> website downloads, processes the data, and presents it in an easy to interpret format. Even better, there’s also a Spanich version at <a href="https://elcri.men/">https://elcri.men/</a>
Besides the really cool interactive hexbin map on the homepage you can:</p>
<p><strong>View a time series of crimes by state</strong></p>
<p><a href="https://elcri.men/en/states.html">
<img alt="Crime by State" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/states.png"/>
</a></p>
<p><strong>View an interactive map that lets you filter by homicide rate</strong></p>
<p><a href="https://elcri.men/en/municipios-map.html">
<img alt="Municipio map" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/municipio-map.png"/>
</a></p>
<p><strong>View a time series of crimes in the most important municipios of Mexico</strong></p>
<p><a href="https://elcri.men/en/municipios.html">
<img alt="Crime by municipio" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/municipios.png"/>
</a></p>
<p><strong>Detect municipios with an unusual number of crimes</strong></p>
<p><a href="https://elcri.men/en/anomalies.html">
<img alt="Crime anomalies" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/anomalies.png"/>
</a></p>
<p><strong>View <a href="https://elcri.men/en/infographics.html">infographics</a></strong></p>
<p><a href="/images/posts/up-to-date-crime-information/infographic_jul_2015.png">
<img alt="Infographic" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/infographic_jul_2015.png"/>
</a></p>
<p><a href="/images/posts/up-to-date-crime-information/municipios_jul_2015.png">
<img alt="Infographic" class="image-process-article-image" src="/images/posts/up-to-date-crime-information/derivatives/article-image/municipios_jul_2015.png"/>
</a></p>
<p>I plan to update the data each month, hopefully the <span class="caps">SNSP</span> won’t change
the download format anymore.</p>Maps of the 2015 Mexican Election2015-06-15T00:00:00+02:00Diego Valle-Jonestag:blog.diegovalle.net,2015-06-15:2015/06/mexican-2015-election.html<p><a href="https://www.diegovalle.net/maps/election2015/election2015.html">
<img alt="Interactive Map of the 2015 Election" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/map-election-2015.png"/>
</a></p>
<p>According to official estimates (pending <span class="caps">TRIFE</span> approval) from the National Electoral Institute, the alliance led by President’s Peña Nieto party is set to retain its majority in the lower house of congress. However; a larger number of congressmen will belong to smaller parties. The Green Party, in alliance with the <span class="caps">PRI</span>, was projected to win 45 seats and a new leftist party, <span class="caps">MORENA</span>, founded by former Mexico City mayor and perennial presidential runner-up Andres Manuel Lopez Obrador, was projected to win 35 seats.</p>
<p>One thing that characterizes the smaller parties is their geographical clustering. My <a href="https://www.diegovalle.net/maps/election2015/election2015.html">interactive map</a> and charts should clarify the spatial patterns. All votes were computed using the coalition formula described in <em>Art. 12, inciso 2; Art. 311 inciso c) of the <span class="caps">LEGIPE</span></em></p>
<p><strong>The <span class="caps">PRI</span></strong> doesn’t have much support among residents of the Distrito Federal and some other urban areas.</p>
<p><a href="/images/posts/mexican-2015-election/PRI-estados.png">
<img alt="Map of the most evil party to have ever existed" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PRI-estados.png"/>
</a></p>
<p>And here is an equal area cartogram (where the area equals the population) of the <span class="caps">PRI</span> vote in the 300 electoral districts.</p>
<p><a href="/images/posts/mexican-2015-election/PRI-cartograma.png">
<img alt="Equal area cartogram of the most evil party to have ever existed" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PRI-cartograma.png"/>
</a></p>
<p><strong>The <span class="caps">PAN</span></strong> has always been very strong in the Bajio, though it has lost lots of votes since Calderón was elected president.</p>
<p><a href="/images/posts/mexican-2015-election/PAN-estados.png">
<img alt="Map of incompetents who don't know how to rule" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PAN-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/PAN-cartograma.png">
<img alt="Equal area cartogram of incompetents who don't know how to rule" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PAN-cartograma.png"/>
</a></p>
<p><strong>The <span class="caps">PRD</span></strong> has very little support in northern Mexico.</p>
<p><a href="/images/posts/mexican-2015-election/PRD-estados.png">
<img alt="Map of chairos" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PRD-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/PRD-cartograma.png">
<img alt="Equal area cartogram of chairos" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PRD-cartograma.png"/>
</a></p>
<p>Former <span class="caps">PRD</span> presidential candidate <span class="caps">AMLO</span> left to found his own party, <strong><span class="caps">MORENA</span></strong>, and split the left-wing vote. He has a lot of support in the Federal District where he used to be mayor and seems to have more support than the <span class="caps">PRD</span> in northern Mexico.</p>
<p><a href="/images/posts/mexican-2015-election/MORENA-estados.png">
<img alt="Map of the true chairos" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/MORENA-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/MORENA-cartograma.png">
<img alt="Equal area cartogram of the true chairos" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/MORENA-cartograma.png"/>
</a></p>
<p><strong><span class="caps">MORENA</span> vs <span class="caps">PRD</span></strong></p>
<p><a href="/images/posts/mexican-2015-election/morenavsprd-estados.png">
<img alt="Map of the cgairo vs chairos" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/morenavsprd-estados.png"/>
</a></p>
<p>Corrupt to its core, the <strong>Green Party</strong> is strong in Chiapas.</p>
<p><a href="/images/posts/mexican-2015-election/PVEM-estados.png">
<img alt="Map of the PRI satellite" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PVEM-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/PVEM-cartograma.png">
<img alt="Equal area cartogram of PRI satellite" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PVEM-cartograma.png"/>
</a></p>
<p><strong>Movimiento Ciudadano</strong> was the party with the most votes in the state of Jalisco.</p>
<p><a href="/images/posts/mexican-2015-election/MC-estados.png">
<img alt="Map of the Movimiento Ciudadano" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/MC-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/MC-cartograma.png">
<img alt="Equal area cartogram of Movimiento Ciudadano" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/MC-cartograma.png"/>
</a></p>
<p><strong>Nueva Alianza</strong> (<span class="caps">PANAL</span>)</p>
<p><a href="/images/posts/mexican-2015-election/PANAL-estados.png">
<img alt="Map of Nueva Alianza" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PANAL-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/PANAL-cartograma.png">
<img alt="Equal area cartogram of Nueva Alianza" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PANAL-cartograma.png"/>
</a></p>
<p><strong>Partido Encuentro Social</strong> (<span class="caps">PS</span>) - A sort of conservative party rumored to have ties with the
<em>Secretaría de Gobernación</em>, not surprisingly it captured its largest share of the vote in Hidalgo</p>
<p><a href="/images/posts/mexican-2015-election/ES-estados.png">
<img alt="Map of Partido Encuentro Social" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/ES-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/ES-cartograma.png">
<img alt="Equal area cartogram of Partido Encuentro Social" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/ES-cartograma.png"/>
</a></p>
<p>An <strong>Independent candidate</strong> won a federal electoral district for the first time ever</p>
<p><a href="/images/posts/mexican-2015-election/INDEP1-estados.png">
<img alt="Equal area hexbin of Independent votes" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/INDEP1-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/INDEP1-cartograma.png">
<img alt="Equal area cartogram of Independent votes" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/INDEP1-cartograma.png"/>
</a></p>
<p>With only 3132 more votes the <strong><span class="caps">PT</span></strong> would have reached the threshold of 3% of the effective vote to remain a registered party, but thanks to massive fraud it failed. This comes as no surprise in a country where imperialist lackey, western interloper, and former presidential candidate <a href="https://twitter.com/g_quadri/status/586214560945672192">Gabriel Quadri</a> advocates the bombing of the peaceful and happy people of Korea.</p>
<p><a href="/images/posts/mexican-2015-election/PT-estados.png">
<img alt="Map of the PT" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PT-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/PT-cartograma.png">
<img alt="Equal area cartogram of the PT" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PT-cartograma.png"/>
</a></p>
<p>The <strong>Partido Humanista</strong> also didn’t reach the threshold to maintain its registration.</p>
<p><a href="/images/posts/mexican-2015-election/PH-estados.png">
<img alt="Map of the PT" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PH-estados.png"/>
</a></p>
<p><a href="/images/posts/mexican-2015-election/PH-cartograma.png">
<img alt="Equal area cartogram of the PT" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/PH-cartograma.png"/>
</a></p>
<p>There was a campaign to promote the <strong>null vote</strong>, but it was actually lower than in other years.</p>
<p><a href="/images/posts/mexican-2015-election/nulo-estados.png">
<img alt="Map of Null Vote" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/nulo-estados.png"/>
</a></p>
<p>Winner by party or coalition.</p>
<p><a href="/images/posts/mexican-2015-election/winner.png">
<img alt="Equal area cartogram of the winning party or coalition in each district" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/winner.png"/>
</a></p>
<p>Winner by party (showing the party with the most votes where a coalition won)</p>
<p><a href="/images/posts/mexican-2015-election/winner-party.png">
<img alt="Equal area cartogram of winning party by district" class="image-process-article-image" src="/images/posts/mexican-2015-election/derivatives/article-image/winner-party.png"/>
</a></p>
<p><span class="caps">P.S.</span> The code is available from <a href="https://github.com/diegovalle/elections2015">GitHub</a><br/>
<span class="caps">P.P.S.</span> Seriously, check out the <a href="https://www.diegovalle.net/maps/election2015/election2015.html">interactive map</a></p>