rm(list = ls())
library(dplyr) # wickham2020b
library(DT) # xie2020
library(ggplot2) # wickham2016
library(Hmisc) # harrell2020
library(kableExtra) # zhu2021
library(knitr) # xie2014
library(RColorBrewer) # neuwirth2014
library(reshape2) # wickham2007
library(scales) # wickham2020
El Análisis Exploratorio de Datos es trabajo de detective - trabajo de detective numérico - o trabajo de detective de conteo - o trabajo gráfico de detective. Tukey (2020)
Una de las formas de dividir a la Estadística para su estudio es a partir del uso que queremos hacer de las técnicas.
Frecuentemente, usamos las técnicas estadísticas cuando necesitamos confirmar alguna hipótesis que tenemos respecto de un problema que estamos analizando; buscamos confirmar aspectos de la realidad a partir de información observada \(\Rightarrow\) estamos usando estadística inferencial para establecer hasta qué punto la información (evidencia) recolectada respalda nuestras creencias.
En ocasiones, sin embargo, también nos enfrentamos al estudio de fenómenos completamente nuevos para nosotros; aspectos de la realidad de los que tenemos datos pero respecto de los cuales no tenemos ninguna postura en particular que queramos confirmar o descartar \(\Rightarrow\) usamos entonces estadística descriptiva o exploratoria para intentar entender lo que los datos nos dicen respecto del fenómeno de estudio.
De alguna manera, mediante el AED buscamos poder formular esas hipótesis que posteriormente intentaremos confirmar o negar mediante la estadística inferencial.
Lo que queremos, de manera muy informal, es conocer los datos con los que vamos a estar trabajando. Explorarlos para ver qué hay ahí.
Lo vamos a intentar hacer de manera sistemática y ordenada.
Contexto general
Contexto específico (diccionario de datos)
Preparación de datos
Generar preguntas sobre los datos.
Dar respuesta a las preguntas.
Iterar refinando las preguntas y/o generar nuevas.
Advertencia de carácter general
El proceso del AED es iterativo. Frecuentemente va a ser necesario regresar a alguno de los pasos y reiniciar el proceso.
Aunque en principio es posible imaginarnos situaciones en las que queramos realizar un análisis estadístico puro, en general, no resulta ser el caso. La práctica estadística surge históricamente como práctica aplicada. Generalmente buscamos hacer uso de la estadística ya inmersos en un contexto, en una realidad que queremos analizar.
Ahora bien, esto no necesariamente significa que ya contamos con datos para realizar este análisis. Nuestra primer tarea es, entonces, obtener dichos datos.
Antes de continuar, por lo tanto, vamos a cargar unos datos. A lo largo de este material, serán los datos con los que principalmente iré trabajando. En este momento, sería bueno que hagas una pausa y consideres tú también ir cargando los datos que te interesa explorar.
read.table.file <- './incidencia/IDEFC_NM_jul25.csv'
datos <-
read.table(
file = read.table.file
, header = TRUE
, sep = ','
, quote = "\""
, encoding = 'utf-8'
)
fecha.datos <- file.info(read.table.file)$ctime
En este caso se trata de datos obtenidos de una fuente de datos oficial (es decir, gubernamental).
Algunas fuentes de datos a las que puedes recurrir y que pueden ser interesantes si no cuentas todavía con datos que quieras explorar son el INEGI y Kaggle.
Establecer el contexto de los datos con los que vamos a trabajar consiste en obtener cierto dominio del tema al que pertenecen los datos (dominio). Llamemos a este un contexto general.
“Data science […] uses techniques and theories drawn from many fields within the context of mathematics, statistics, computer science, information science, and domain knowledge” (Wikipedia contributors 2022).
Establecer el contexto de nuestros datos resulta de mucha relevancia, mientras más conocimiento tengamos sobre el dominio, más relevantes serán (uno espera) nuestras preguntas. ¿Se puede realizar un análisis exploratorio sin ningún conocimiento del dominio? ¡Claro que se puede! Simplemente el enfoque de nuestro análisis será, muy probablemente, más básico que si tuviéramos un conocimiento más profundo del tema. Desde luego, algunas características de los datos pasarán inadvertidas sin el contexto apropiado. Como dijimos, el proceso es iterativo y el análisis que realicemos alimentará nuestro conocimiento del contexto y nos permitirá iniciar un nuevo ciclo de análisis.
Finalmente, el objetivo del AED, en parte, es precisamente el ir generando ese conocimiento a detalle del tema que estamos trabajando. Una gran parte del trabajo que tenemos que realizar es ir documentando ese conocimiento que vamos adquiriendo.
Una fuente de inspiración de esta fase del proceso del AED puede ser la documentación que ofrece el INEGI de cada uno de sus “proyectos”. Observa cómo en cada encuesta o censo, el INEGI ofrece un documento llamado “Marco Conceptual”, en el que expone los aspectos contextuales de la información que se recaba mediante cada instrumento.
¿Qué tan a profundidad debemos generar este conocimiento del contexto general? No es posible decirlo y dependerá, fundamentalmente, de las restricciones de tiempo de nuestro proyecto. Sin embargo, en la medida de lo posible, “presupuesta” dentro de cada proyecto un tiempo específico dedicado exclusivamente a estudiar el campo de dominio y documentar la información recabada durante esta fase.
Desde luego, aún en proyectos en los que consideres que conoces razonablemente bien el contexto, es también muy importante “presupuestar” o “programar” un cierto tiempo al análisis exploratorio de los datos.
Esta documentación podrás irla mejorando conforme vayas obteniendo un mayor conocimiento del tema, en especial en proyectos que se repiten en el tiempo. Sin embargo, una de las preguntas más básicas que debemos buscar contestar en esta fase del proyecto es: ¿qué buscamos con el uso de los datos? ¿Para qué los queremos? ¿Cuál es el objetivo en última instancia del análisis que estamos haciendo?
Veamos un ejemplo.
Para ejemplificar el uso de las técnicas con las que vamos a estar trabajando, voy a utilizar como argumento de partida el interés por conocer más sobre los niveles de criminalidad en el país. Para temas de criminalidad, quizás yo he leído en medios que la gente hace referencia a la incidencia delictiva. Entonces vamos a centrarnos en conocer o investigar más sobre la incidencia delictiva nacional.
Mi primar paso es, entonces, conseguir información / datos sobre la incidencia delictiva en México. Después de estar navegando diversas páginas, me entero que la incidencia delictiva en México se “mide” principalmente a partir de dos fuentes de información: una compilada por el INEGI y otra compilada y publicada por el Secretariado Ejecutivo del Sistema Nacional de Seguridad Pública (SESNSP). Decido explorar primero esta última opción.
El SESNSP es el órgano operativo, con autonomía técnica, de gestión y presupuestal, encargado de ejecutar y dar seguimiento a los acuerdos del Consejo Nacional de Seguridad Pública, que es, a su vez, la instancia superior de coordinación y de definición de las políticas públicas en materia de seguridad pública.
Como parte de sus obligaciones, el SESNSP publica, en forma mensual, datos sobre la incidencia delictiva y victimización a nivel federal, estatal y municipal. La incidencia delictiva se refiere al registro de delitos ocurridos, mientras que las cifras de victimización hacen referencia al número de víctimas de estos delitos (un delito puede tener una o más víctimas; una víctima puede ser víctima de diversos delitos).
Los datos publicados por el SESNSP, en particular, provienen del registro de delitos en averiguaciones previas iniciadas o carpetas de investigación, reportadas por las Procuradurías de Justicia y Fiscalías Generales de las entidades federativas, así como por la Fiscalía General de la República.
Es importante señalar que, el hecho de que estos datos provengan de averiguaciones previas o carpetas de investigación impacta directamente en las cifras del SESNSP en la construcción de indicadores de criminalidad ya que registran únicamente cifras de delitos denunciados y perseguidos las cuales permiten formar una idea muy parcial del fenómeno delictivo en el país. Estas cifras pueden estar expuestas, también, a las prácticas de registro de delitos imperantes en una determinada región, así como a los esfuerzos de persecución del delito (delitos poco perseguidos, aunque presentes en la población, pueden no aparecer o aparecer significativamente menos de lo que deberían, no por que no ocurran sino porque no se persiguen o no se denuncian).
Por otra parte, las cifras del SESNSP son cifras de mayor oportunidad que, por ejemplo, las cifras que se obtienen de la ENVIPE del INEGI y, adicionalmente, incluyen delitos que la propia ENVIPE no incluye. Más aún, no son datos derivados de la percepción poblacional sino de registros administrativos lo cual puede representar una ventaja en términos de comparabilidad temporal.
Los datos de incidencia delictiva del SESNSP pueden ser descargados en su página web, en la sección relativa a Datos Abiertos: (link). Los datos que usaremos aquí fueron consultados el 2025-08-11 12:12:03.701897 de la página y corresponden a datos hasta el mes de junio de 2025. Estos datos son actualizados (normalmente) el día 20 de cada mes.
Es importante señalar que el SESNSP publica cuatro estructuras de datos:
En este documento nos enfocaremos en el AED de las cifras de incidencia delictiva estatal.
Una vez generado y documentado cierto nivel de conocimiento sobre el dominio, pasaremos a conocer (y documentar) los datos con los que vamos a trabajar. Para ello, elaboraremos un documento al que llamaremos “Diccionario de Datos”. Es posible que existan ciertos estándares para la construcción de este tipo de documentos, en este curso lo trataremos de manera un poco más informal, pero el objetivo es el mismo, documentar todos los atributos relevantes de la (fuente de) información con la que vamos a trabajar.
Desde luego, una recomendación es seguir la ruta de lo más general a lo más particular. Así, comenzaremos quizá por documentar la fuente de los datos: ¿quién genera los datos? ¿Cómo obtenemos los datos? ¿Cuándo los obtuvimos? ¿Se refieren a algún periodo en particular? ¿Se generan periódicamente? Si sí, ¿cada cuánto? ¿En qué formato nos los entregan (y muy probablemente quieras documentar ciertas particularidades específicas del formato en el que nos entregan los datos)?
Una vez que ya documentamos estos aspectos generales, podemos pasar a documentar aspectos específicos de la información contenida en nuestro archivo de datos (me voy a referir de forma genérica a un archivo de datos, pero podría tratarse igualmente de una conexión a una tabla contenida en una base de datos). En particular, nos va a interesar documentar las características de las variables contenidas en el archivo.
Como regla general, vale mucho la pena invertir algo de tiempo en esta labor que, sin lugar a dudas es frecuentemente despreciada y (concedido) es significativamente menos atractiva que el análisis de los datos en sí. Sin embargo, esforzarnos en conocer y entender los datos con los que vamos a estar trabajando nos va a ahorrar muchos dolores de cabeza y re-trabajo futuros. Documentarlos nos protege a nosotros del olvido (sobre todo cuando se trata de proyectos que se repiten en el tiempo pero cuyos datos no usamos de manera cotidiana) y permite que el proceso pueda ser posteriormente repetido por un tercero (auditabilidad, delegación, memoria institucional, etc.).
¿Qué nos interesa entonces documentar o conocer de las variables? Nuevamente, partiendo de lo general a lo particular:
Conceptualmente, ¿qué se registra en la variable?
¿Cómo se registra?
El formato, desde luego, dependerá frecuentemente del tipo de dato. Por ejemplo, si una variable registra el monto de ciertas transacciones financieras realizadas, podríamos encontrarnos que la variable se registra con el formato “$###,###.##”, lo que nos estaría indicando que los montos incluyen el signo “$”, o bien, que se registran con el formato “#.####”. Obsérvese también que el formato puede ser más o menos importante dependiendo del formato del archivo (si la fuente es un archivo de Excel, por ejemplo, es probable que el formato no sea tan relevante pues el formato en Excel es una “máscara” que no afecta realmente al registro de los datos). No hay, tampoco, un estándar universal para referirse al formato bajo el que se encuentran registrados los datos por lo que debemos procurar ser lo más explícitos posibles para evitar confusiones.
Para poder “explorar” los datos de interés, primero tenemos que conocer con qué tipo de datos contamos. Algunas técnicas / herramientas serán apropiadas para un tipo de datos pero no para otros.
Primero, consideremos la naturaleza de los datos, pudiendo tratarse de datos provenientes de documentos textuales (datos no estructurados) o bien de datos con algún tipo de formato estructurado (muy frecuentemente en formato tabular).
Por brevedad, centraremos nuestro interés en datos estructurados y asumiremos, en general, que adoptan (o pueden ser llevados a) una estructura tabular.
Dentro de los datos estructurados, entonces, contamos con una estructura de datos cuyos atributos (columnas) representan variables para el análisis. Estas variables o atributos pueden ser de diferentes tipos:
Cualitativos o categóricos: un dato categórico es aquel que consiste en “etiquetas” que usamos para denotar pertenencia ciertos grupos, clases o categorías. Estas etiquetas pueden o no tener un significado literal, pueden o no tener una relación entre sí y, desde luego, pueden o no estar representadas por un número. Idealmente, las categorías deben ser exhaustivas y mutuamente excluyentes (aunque, en la práctica, con frecuencia estos requisitos suelen no presentarse).
Nominales: son datos categóricos cuyas etiquetas asignan “nombres” a los grupos a los que se encuentran asociadas. Pueden o no ser numéricas, pero no es posible establecer una relación entre las etiquetas más allá de la pertenencia o no al grupo. Por ejemplo, \(\{Rojo, Negro\}\) puede ser un conjunto de valores categóricos nominales, al igual que \(\{Grupo 1, Grupo2\}\) o bien \(\{1,2\}\), cuando el 1 y el 2 los usamos para representar al grupo y no necesariamente una relación numérica en los datos.
Ordinales: a diferencia de los datos categóricos nominales, los datos categóricos ordinales si nos permiten establecer un “orden” en los datos. Por ejemplo, si nuestra variable adopta los valores \(\{alto, bajo\}\), podemos en general asumir que \(bajo < alto\). Observa, sin embargo, que por lo general este tipo de valores no me permiten evaluar al distancia entre los valores, es decir, no me permite determinar cuál es exactamente la diferencia que existe entre \(alto\) y \(bajo\), simplemente que existe una relación de orden. En este mismo sentido, podríamos habernos encontrado con valores del tipo \(\{1,10\}\), donde \(1 = bajo; 10 = alto\). A pesar de haber usado valores numéricos para representar a las categorías, de todos modos no sería válido afirmar que existe una distancia de 9 entre el valor \(alto\) y el valor \(bajo\), ya que se trata de una variable cualitativa ordinal.
Cuantitativos: son variables cuya naturaleza es numérica y representan una medición de un atributo de una cosa.
Discretos: son variables que únicamente pueden tomar valores enteros. Generalmente registran el resultado de un conteo. Por ejemplo: el número de incidentes observados durante un intervalo de tiempo determinado.
Continuos: son variables que pueden tomar valores reales. Generalmente registran el resultado de una medición. Por ejemplo: la altura de las personas pertencientes a una población de interés. Con frecuencia damos tratamiento de variables continuas a datos que estrictamente quizá no lo son, pero que por cuestiones prácticas es conveniente darles dicho tratamiento (por ejemplo, el precio de algunos productos en la economía real).
Para las variables cuantitativas, además, podemos tener diferentes escalas de medición:
La temperatura en grados Celsius (o Farenheit) es un ejemplo de escala de medición de intervalos. Es una medida de la cantidad de calor presente en un ambiente, pero es posible hablar de grados Celsius negativos de temperatura porque el cero es un punto arbitrario de referencia (el punto de congelación del agua).
¿Qué ejemplos de escalas de medición de razones encuentras?
Cuando estudiamos el tipo de datos con los que contamos, también es importante considerar la manera en la que se nos presentan:
Univariados: observamos una única variable de interés.
Multivariados: observamos para cada registro (renglón) de nuestra tabla múltiples características (atributos) de manera simultánea.
Datos composicionales: los datos forman parte de un todo.
Series de tiempo: las observaciones están referidas (y pueden ser ordenadas) a una referencia de tiempo (segundos, minutos, horas, días, semanas, meses, años, …). Datos que no capturamos u observamos como series de tiempo son conocidos como datos de corte transversal (podría pensarse que, por lo tanto, serían datos acopiados en un único momento en el tiempo, pero puede ser también que simplemente la variable relativa a la temporalidad no se consideró relevante).
Datos en/de panel: son datos que combinan características temporales y transversales. Típicamente se recogen estos datos para dar seguimiento a una población determinada (p.e., un conjunto bien definido de pacientes de un hospital sobre los que quiere conocerse su evolución en el tiempo), aunque pueden existir conjuntos de datos en panel para los cuales la definición de la población puede ser más compleja.
Preguntas generales que nos podemos plantear a partir de este análisis:
¿Cuál es la población representada en los datos? ¿Cómo impacta esta definición de la población en las características de los datos?
Los datos, ¿representan muestras o son resultado de censos?
Si se trata de muestras, ¿cómo se construyeron las muestras?
¿Se observan características “inesperadas” en los datos? (en otras palabras, ¿se observar rasgos o datos atípicos o problemas de “calidad”?)
¿Es posible formular alguna hipótesis sobre el comportamiento de las variables?
¿Qué tipo de inferencia estadística es necesario/posible realizar? ¿Qué conjunto de técnicas se pueden contemplar?
¿Es necesario conseguir más datos?
En nuestro caso (y así sucede frecuentemente con datos públicos), el SESNSP pone a disposición un diccionario de datos:
Como podemos observar, este diccionario de datos es un comienzo, pero dista mucho de aportar información realmente útil.
A continuación se muestran algunos de los registros contenidos en el archivo relativo a la incidencia delictiva a nivel estatal:
datatable(data = head(datos), rownames = FALSE)
Podemos también documentar información adicional como:
Fecha de corte: 2023-07-31
Frecuencia de actualización: mensual.
Periodicidad de la información: mensual.
Oportunidad de la información: mensual (20 días).
Formato de difusión: archivo csv
Separador: coma.
Codificación: UTF-8.
Contenido:
Año: año de registro de las averiguaciones previas o carpetas de investigación [tipo fecha, formato “aaaa”].
Clave_ent
Entidad
Bien jurídico afectado:
Tipo de delito
Subtipo de delito
Modalidad
Enero
Febrero
Marzo
Abril
Mayo
Junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre
Algunas maneras de ayudarnos a realizar esta tarea:
str(object = datos)
## 'data.frame': 34496 obs. of 19 variables:
## $ Año : int 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
## $ Clave_Ent : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Entidad : chr "Aguascalientes" "Aguascalientes" "Aguascalientes" "Aguascalientes" ...
## $ Bien.jurídico.afectado: chr "La vida y la Integridad corporal" "La vida y la Integridad corporal" "La vida y la Integridad corporal" "La vida y la Integridad corporal" ...
## $ Tipo.de.delito : chr "Homicidio" "Homicidio" "Homicidio" "Homicidio" ...
## $ Subtipo.de.delito : chr "Homicidio doloso" "Homicidio doloso" "Homicidio doloso" "Homicidio doloso" ...
## $ Modalidad : chr "Con arma de fuego" "Con arma blanca" "Con otro elemento" "No especificado" ...
## $ Enero : int 3 1 0 2 0 0 14 0 2 2 ...
## $ Febrero : int 0 1 0 0 0 0 17 0 2 3 ...
## $ Marzo : int 2 0 2 0 0 0 10 0 0 4 ...
## $ Abril : int 1 0 2 1 0 0 14 0 3 1 ...
## $ Mayo : int 1 0 3 0 1 0 13 0 0 2 ...
## $ Junio : int 1 1 2 0 0 0 11 1 0 3 ...
## $ Julio : int 2 0 0 0 0 0 14 0 0 5 ...
## $ Agosto : int 1 1 1 0 0 0 11 0 0 2 ...
## $ Septiembre : int 2 0 2 0 0 0 23 0 0 1 ...
## $ Octubre : int 2 0 0 0 0 0 14 0 0 4 ...
## $ Noviembre : int 2 0 0 0 0 0 7 0 0 3 ...
## $ Diciembre : int 1 1 0 0 0 0 15 1 0 2 ...
summary(object = datos)
## Año Clave_Ent Entidad Bien.jurídico.afectado
## Min. :2015 Min. : 1.00 Length:34496 Length:34496
## 1st Qu.:2017 1st Qu.: 8.75 Class :character Class :character
## Median :2020 Median :16.50 Mode :character Mode :character
## Mean :2020 Mean :16.50
## 3rd Qu.:2023 3rd Qu.:24.25
## Max. :2025 Max. :32.00
##
## Tipo.de.delito Subtipo.de.delito Modalidad Enero
## Length:34496 Length:34496 Length:34496 Min. : 0.00
## Class :character Class :character Class :character 1st Qu.: 0.00
## Mode :character Mode :character Mode :character Median : 1.00
## Mean : 49.66
## 3rd Qu.: 25.00
## Max. :7565.00
##
## Febrero Marzo Abril Mayo
## Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00
## Median : 2.00 Median : 2.00 Median : 1.00 Median : 2.00
## Mean : 49.54 Mean : 54.98 Mean : 51.68 Mean : 54.44
## 3rd Qu.: 25.00 3rd Qu.: 28.00 3rd Qu.: 26.00 3rd Qu.: 27.00
## Max. :7888.00 Max. :8418.00 Max. :9555.00 Max. :7945.00
##
## Junio Julio Agosto Septiembre
## Min. : 0.00 Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00
## Median : 2.00 Median : 2.00 Median : 2.00 Median : 2.00
## Mean : 53.69 Mean : 52.96 Mean : 54.04 Mean : 52.87
## 3rd Qu.: 27.00 3rd Qu.: 27.00 3rd Qu.: 27.00 3rd Qu.: 27.00
## Max. :8738.00 Max. :9968.00 Max. :7955.00 Max. :7805.00
## NA's :3136 NA's :3136
## Octubre Noviembre Diciembre
## Min. : 0.00 Min. : 0.00 Min. : 0.00
## 1st Qu.: 0.00 1st Qu.: 0.00 1st Qu.: 0.00
## Median : 2.00 Median : 2.00 Median : 1.00
## Mean : 55.25 Mean : 51.53 Mean : 49.18
## 3rd Qu.: 28.00 3rd Qu.: 26.00 3rd Qu.: 24.00
## Max. :8421.00 Max. :7750.00 Max. :7851.00
## NA's :3136 NA's :3136 NA's :3136
Un paquete al que recurro con frecuencia para auxiliarme en el armado de estas primeras exploraciones de los datos es el paquete Hmisc:
Hmisc::describe(x = datos)
## datos
##
## 19 Variables 34496 Observations
## --------------------------------------------------------------------------------
## Año
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 11 0.992 2020 2020 3.636 2015
## .10 .25 .50 .75 .90 .95
## 2016 2017 2020 2023 2024 2025
##
## Value 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
## Frequency 3136 3136 3136 3136 3136 3136 3136 3136 3136 3136 3136
## Proportion 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## Clave_Ent
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 32 0.999 16.5 16.5 10.66 2.00
## .10 .25 .50 .75 .90 .95
## 4.00 8.75 16.50 24.25 29.00 31.00
##
## lowest : 1 2 3 4 5, highest: 28 29 30 31 32
## --------------------------------------------------------------------------------
## Entidad
## n missing distinct
## 34496 0 32
##
## lowest : Aguascalientes Baja California Baja California Sur Campeche Chiapas
## highest: Tamaulipas Tlaxcala Veracruz de Ignacio de la Llave Yucatán Zacatecas
## --------------------------------------------------------------------------------
## Bien.jurídico.afectado
## n missing distinct
## 34496 0 7
##
## lowest : El patrimonio La familia La libertad y la seguridad sexual La sociedad La vida y la Integridad corporal
## highest: La libertad y la seguridad sexual La sociedad La vida y la Integridad corporal Libertad personal Otros bienes jurídicos afectados (del fuero común)
## --------------------------------------------------------------------------------
## Tipo.de.delito
## n missing distinct
## 34496 0 40
##
## lowest : Aborto Abuso de confianza Abuso sexual Acoso sexual Allanamiento de morada
## highest: Trata de personas Violación equiparada Violación simple Violencia de género en todas sus modalidades distinta a la violencia familiar Violencia familiar
## --------------------------------------------------------------------------------
## Subtipo.de.delito
## n missing distinct
## 34496 0 55
##
## lowest : Aborto Abuso de confianza Abuso sexual Acoso sexual Allanamiento de morada
## highest: Trata de personas Violación equiparada Violación simple Violencia de género en todas sus modalidades distinta a la violencia familiar Violencia familiar
## --------------------------------------------------------------------------------
## Modalidad
## n missing distinct
## 34496 0 59
##
## lowest : Aborto Abuso de confianza Abuso sexual Acoso sexual Allanamiento de morada
## highest: Trata de personas Violación equiparada Violación simple Violencia de género en todas sus modalidades distinta a la violencia familiar Violencia familiar
## --------------------------------------------------------------------------------
## Enero
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 979 0.917 49.66 9 86.66 0.0
## .10 .25 .50 .75 .90 .95
## 0.0 0.0 1.0 25.0 114.0 242.2
##
## lowest : 0 1 2 3 4, highest: 5954 6293 6525 6945 7565
## --------------------------------------------------------------------------------
## Febrero
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 980 0.918 49.54 9.5 86.37 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 25 114 240
##
## lowest : 0 1 2 3 4, highest: 6114 6173 6739 7350 7888
## --------------------------------------------------------------------------------
## Marzo
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 1024 0.921 54.98 10.5 95.9 0.0
## .10 .25 .50 .75 .90 .95
## 0.0 0.0 2.0 28.0 126.0 264.2
##
## lowest : 0 1 2 3 4, highest: 6677 7155 7627 8383 8418
## --------------------------------------------------------------------------------
## Abril
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 1007 0.918 51.68 9.5 90.26 0
## .10 .25 .50 .75 .90 .95
## 0 0 1 26 118 248
##
## lowest : 0 1 2 3 4, highest: 5947 6500 7674 7916 9555
## --------------------------------------------------------------------------------
## Mayo
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 1031 0.921 54.44 10 95.07 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 27 123 262
##
## lowest : 0 1 2 3 4, highest: 6856 6978 7787 7899 7945
## --------------------------------------------------------------------------------
## Junio
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 1028 0.92 53.69 10 93.67 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 27 121 258
##
## lowest : 0 1 2 3 4, highest: 6427 6615 6822 7386 8738
## --------------------------------------------------------------------------------
## Julio
## n missing distinct Info Mean pMedian Gmd .05
## 34496 0 1009 0.918 52.96 9.5 92.55 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 27 120 254
##
## lowest : 0 1 2 3 4, highest: 5794 5879 5898 7619 9968
## --------------------------------------------------------------------------------
## Agosto
## n missing distinct Info Mean pMedian Gmd .05
## 31360 3136 989 0.919 54.04 10 94.36 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 27 123 261
##
## lowest : 0 1 2 3 4, highest: 6119 6250 6494 7255 7955
## --------------------------------------------------------------------------------
## Septiembre
## n missing distinct Info Mean pMedian Gmd .05
## 31360 3136 986 0.919 52.87 10 92.23 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 27 121 257
##
## lowest : 0 1 2 3 4, highest: 5917 6239 6398 6658 7805
## --------------------------------------------------------------------------------
## Octubre
## n missing distinct Info Mean pMedian Gmd .05
## 31360 3136 999 0.919 55.25 10 96.39 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 28 127 268
##
## lowest : 0 1 2 3 4, highest: 6427 6694 6750 7022 8421
## --------------------------------------------------------------------------------
## Noviembre
## n missing distinct Info Mean pMedian Gmd .05
## 31360 3136 953 0.92 51.53 9.5 89.76 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 26 120 251
##
## lowest : 0 1 2 3 4, highest: 6128 6229 6259 6618 7750
## --------------------------------------------------------------------------------
## Diciembre
## n missing distinct Info Mean pMedian Gmd .05
## 31360 3136 941 0.917 49.18 9 85.93 0
## .10 .25 .50 .75 .90 .95
## 0 0 1 24 112 237
##
## lowest : 0 1 2 3 4, highest: 6010 6190 6540 6734 7851
## --------------------------------------------------------------------------------
skimr::skim_tee(data = datos)
## ── Data Summary ────────────────────────
## Values
## Name data
## Number of rows 34496
## Number of columns 19
## _______________________
## Column type frequency:
## character 5
## numeric 14
## ________________________
## Group variables None
##
## ── Variable type: character ────────────────────────────────────────────────────
## skim_variable n_missing complete_rate min max empty n_unique
## 1 Entidad 0 1 6 31 0 32
## 2 Bien.jurídico.afectado 0 1 10 50 0 7
## 3 Tipo.de.delito 0 1 4 77 0 40
## 4 Subtipo.de.delito 0 1 5 77 0 55
## 5 Modalidad 0 1 5 83 0 59
## whitespace
## 1 0
## 2 0
## 3 0
## 4 0
## 5 0
##
## ── Variable type: numeric ──────────────────────────────────────────────────────
## skim_variable n_missing complete_rate mean sd p0 p25 p50
## 1 Año 0 1 2020 3.16 2015 2017 2020
## 2 Clave_Ent 0 1 16.5 9.23 1 8.75 16.5
## 3 Enero 0 1 49.7 191. 0 0 1
## 4 Febrero 0 1 49.5 193. 0 0 2
## 5 Marzo 0 1 55.0 215. 0 0 2
## 6 Abril 0 1 51.7 204. 0 0 1
## 7 Mayo 0 1 54.4 214. 0 0 2
## 8 Junio 0 1 53.7 209. 0 0 2
## 9 Julio 0 1 53.0 206. 0 0 2
## 10 Agosto 3136 0.909 54.0 208. 0 0 2
## 11 Septiembre 3136 0.909 52.9 202. 0 0 2
## 12 Octubre 3136 0.909 55.2 213. 0 0 2
## 13 Noviembre 3136 0.909 51.5 197. 0 0 2
## 14 Diciembre 3136 0.909 49.2 191. 0 0 1
## p75 p100 hist
## 1 2023 2025 ▇▅▅▅▅
## 2 24.2 32 ▇▇▇▇▇
## 3 25 7565 ▇▁▁▁▁
## 4 25 7888 ▇▁▁▁▁
## 5 28 8418 ▇▁▁▁▁
## 6 26 9555 ▇▁▁▁▁
## 7 27 7945 ▇▁▁▁▁
## 8 27 8738 ▇▁▁▁▁
## 9 27 9968 ▇▁▁▁▁
## 10 27 7955 ▇▁▁▁▁
## 11 27 7805 ▇▁▁▁▁
## 12 28 8421 ▇▁▁▁▁
## 13 26 7750 ▇▁▁▁▁
## 14 24 7851 ▇▁▁▁▁
En todos estos casos, desde luego, las funciones no generan propiamente un diccionario de datos, sin embargo pueden ser útiles al momento de comenzar uno.
¿Por qué crees que es importante conocer/registrar el tipo de datos y su escala de medición?
Ya tengo una primera impresión de mis datos. Ya conozco la estructura en la que me son presentados. Lo más probable es que ya tenga una(s) primera(s) idea(s) de qué quiero o puedo comenzar a hacer con mis datos. Pero es muy probable que antes de poder hacer eso, necesite yo realizar algunas tareas básicas con los datos. Los tengo que preparar para su uso.
Algo de limpieza: vacíos, formatos (p.e., fechas), números leídos como caracteres, ¿factores?
Codificaciones: ¿necesito asignar códigos a campos tipo texto?
Re-etiquetado: ¿necesito homologar / fusionar / separar categorías?
Transformaciones “prácticas”: me refiero aquí a transformaciones que usamos para afectar la “forma” en la que se presentan nuestros datos. Por ejemplo, en ocasiones tenemos los datos en columnas y el trabajo se nos facilita más si los pasamos a renglones (esto es muy frecuente, por ejemplo, cuando queremos graficar usando ggplot), o bien, cuando necesitamos concatenar columnas o separar valores en columnas que originalmente se presentan concatenados.
datos.2 <-
melt(
data = datos,
id.vars = 1:(ncol(datos)-12),
measure.vars = (ncol(datos)-11):ncol(datos),
variable.name = 'MES',
value.name = 'DELITOS')
str(datos.2)
## 'data.frame': 413952 obs. of 9 variables:
## $ Año : int 2015 2015 2015 2015 2015 2015 2015 2015 2015 2015 ...
## $ Clave_Ent : int 1 1 1 1 1 1 1 1 1 1 ...
## $ Entidad : chr "Aguascalientes" "Aguascalientes" "Aguascalientes" "Aguascalientes" ...
## $ Bien.jurídico.afectado: chr "La vida y la Integridad corporal" "La vida y la Integridad corporal" "La vida y la Integridad corporal" "La vida y la Integridad corporal" ...
## $ Tipo.de.delito : chr "Homicidio" "Homicidio" "Homicidio" "Homicidio" ...
## $ Subtipo.de.delito : chr "Homicidio doloso" "Homicidio doloso" "Homicidio doloso" "Homicidio doloso" ...
## $ Modalidad : chr "Con arma de fuego" "Con arma blanca" "Con otro elemento" "No especificado" ...
## $ MES : Factor w/ 12 levels "Enero","Febrero",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ DELITOS : int 3 1 0 2 0 0 14 0 2 2 ...
datatable(data = head(datos.2), rownames = FALSE)
# Convierto el mes a caracter porque se encontraba en formato de factor.
#
datos.2$MES <- as.character(datos.2$MES)
# Elimino los registros correspondientes al total del año.
#
datos.2 <- datos.2[datos.2$MES != 'Total',]
# Los siguientes "catálogos" me permitirán crear la columna de fechas.
#
mes <-
c(
'Enero',
'Febrero',
'Marzo',
'Abril',
'Mayo',
'Junio',
'Julio',
'Agosto',
'Septiembre',
'Octubre',
'Noviembre',
'Diciembre')
mes.indice <- c(1:12)
mes.dia <- c(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)
# Busca el mes en el catálogo de meses y le asigna el número de mes que le
# corresponde.
#
datos.2$MES.2 <-
sapply(datos.2$MES, FUN = function(x){mes.indice[mes == x]})
# Le asigna el día correspondiente al último día del mes.
#
datos.2$MES.DIA <- sapply(datos.2$MES.2, function(x){mes.dia[x]})
# Crea la fecha (como tipo de dato fecha).
#
datos.2$FECHA <-
as.Date(
x = paste(datos.2$Año, datos.2$MES.2, datos.2$MES.DIA, sep = '-'),
format = '%Y-%m-%d')
Transformaciones “numéricas”: cuando tratamos con variables cuantitativas, con frecuencia es conveniente aplicar algunas funciones a los datos, transformándolos de manera más significativa que simplemente en la forma en la que se presentan. Emerson and Stoto (1983), por ejemplo, cita como algunos de los motivos más comunes para transformar una variable: facilitar su interpretabilidad, promover la simetría en los datos, promover una dispersión más estable, promover una relación lineal entre variables. Algunos de estos objetivos pueden contraponerse (lo cual, en ocasiones, dificulta la elección de una transformación apropiada). Por ejemplo, una transformación que promueve una relación lineal (por ejemplo, una transformación logarítmica de datos que presentan una relación exponencial) puede incrementar significativamente nuestro entendimiento de la relación entre las variables a costa de dificultar la interpretabilidad (pues generalmente la escala logarítmica es más difícil de interpretar intuitivamente). La elección correcta puede representar un compromiso entre los objetivos que se buscan.
\[x_i' = x_i^{\lambda}\]
\[z_i = \frac{x_i - \bar{x}}{s}\]
\[g(y) = \left\{ \array{\frac{y^{\lambda} - 1}{\lambda} & \lambda \neq 0 \\ ln(y) & \lambda = 0} \right.\]
Por el momento no realizaremos ninguna transformación de este tipo a nuestros datos, dejaremos el tema de transformaciones para un poco más adelante, pero es importante tenerlo en mente.
Veamos entonces cómo quedaron nuestros datos después de transformarlos (paso muy importante siempre):
Hmisc::describe(x = datos.2)
## datos.2
##
## 12 Variables 413952 Observations
## --------------------------------------------------------------------------------
## Año
## n missing distinct Info Mean pMedian Gmd .05
## 413952 0 11 0.992 2020 2020 3.636 2015
## .10 .25 .50 .75 .90 .95
## 2016 2017 2020 2023 2024 2025
##
## Value 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
## Frequency 37632 37632 37632 37632 37632 37632 37632 37632 37632 37632 37632
## Proportion 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091 0.091
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## Clave_Ent
## n missing distinct Info Mean pMedian Gmd .05
## 413952 0 32 0.999 16.5 16.5 10.66 2.00
## .10 .25 .50 .75 .90 .95
## 4.00 8.75 16.50 24.25 29.00 31.00
##
## lowest : 1 2 3 4 5, highest: 28 29 30 31 32
## --------------------------------------------------------------------------------
## Entidad
## n missing distinct
## 413952 0 32
##
## lowest : Aguascalientes Baja California Baja California Sur Campeche Chiapas
## highest: Tamaulipas Tlaxcala Veracruz de Ignacio de la Llave Yucatán Zacatecas
## --------------------------------------------------------------------------------
## Bien.jurídico.afectado
## n missing distinct
## 413952 0 7
##
## lowest : El patrimonio La familia La libertad y la seguridad sexual La sociedad La vida y la Integridad corporal
## highest: La libertad y la seguridad sexual La sociedad La vida y la Integridad corporal Libertad personal Otros bienes jurídicos afectados (del fuero común)
## --------------------------------------------------------------------------------
## Tipo.de.delito
## n missing distinct
## 413952 0 40
##
## lowest : Aborto Abuso de confianza Abuso sexual Acoso sexual Allanamiento de morada
## highest: Trata de personas Violación equiparada Violación simple Violencia de género en todas sus modalidades distinta a la violencia familiar Violencia familiar
## --------------------------------------------------------------------------------
## Subtipo.de.delito
## n missing distinct
## 413952 0 55
##
## lowest : Aborto Abuso de confianza Abuso sexual Acoso sexual Allanamiento de morada
## highest: Trata de personas Violación equiparada Violación simple Violencia de género en todas sus modalidades distinta a la violencia familiar Violencia familiar
## --------------------------------------------------------------------------------
## Modalidad
## n missing distinct
## 413952 0 59
##
## lowest : Aborto Abuso de confianza Abuso sexual Acoso sexual Allanamiento de morada
## highest: Trata de personas Violación equiparada Violación simple Violencia de género en todas sus modalidades distinta a la violencia familiar Violencia familiar
## --------------------------------------------------------------------------------
## MES
## n missing distinct
## 413952 0 12
##
## Value Abril Agosto Diciembre Enero Febrero Julio
## Frequency 34496 34496 34496 34496 34496 34496
## Proportion 0.083 0.083 0.083 0.083 0.083 0.083
##
## Value Junio Marzo Mayo Noviembre Octubre Septiembre
## Frequency 34496 34496 34496 34496 34496 34496
## Proportion 0.083 0.083 0.083 0.083 0.083 0.083
## --------------------------------------------------------------------------------
## DELITOS
## n missing distinct Info Mean pMedian Gmd .05
## 398272 15680 2324 0.919 52.48 9.5 91.6 0
## .10 .25 .50 .75 .90 .95
## 0 0 2 26 120 253
##
## lowest : 0 1 2 3 4, highest: 8418 8421 8738 9555 9968
## --------------------------------------------------------------------------------
## MES.2
## n missing distinct Info Mean pMedian Gmd .05
## 413952 0 12 0.993 6.5 6.5 3.972 1.00
## .10 .25 .50 .75 .90 .95
## 2.00 3.75 6.50 9.25 11.00 12.00
##
## Value 1 2 3 4 5 6 7 8 9 10 11
## Frequency 34496 34496 34496 34496 34496 34496 34496 34496 34496 34496 34496
## Proportion 0.083 0.083 0.083 0.083 0.083 0.083 0.083 0.083 0.083 0.083 0.083
##
## Value 12
## Frequency 34496
## Proportion 0.083
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## MES.DIA
## n missing distinct Info Mean pMedian Gmd
## 413952 0 3 0.764 30.42 30.5 0.7917
##
## Value 28 30 31
## Frequency 34496 137984 241472
## Proportion 0.083 0.333 0.583
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## FECHA
## n missing distinct Info Mean pMedian Gmd
## 413952 0 132 1 2020-07-15 18459 1339
## .05 .10 .25 .50 .75 .90 .95
## 2015-07-31 2016-02-28 2017-10-23 2020-07-15 2023-04-07 2024-11-30 2025-06-30
##
## lowest : 2015-01-31 2015-02-28 2015-03-31 2015-04-30 2015-05-31
## highest: 2025-08-31 2025-09-30 2025-10-31 2025-11-30 2025-12-31
## --------------------------------------------------------------------------------
Observemos que cuando transformamos los datos creamos datos faltantes (les dije que era muy importante este paso), por lo que tenemos que quitarlos.
¿Cómo? ¿Podemos quitarlos así nada más? !!!
datos.2 <- datos.2[complete.cases(datos.2),]
Investigar / revisar los datos faltantes es muy importante:
En ocasiones el dato faltante es un valor permitido. Pero casi siempre son valores que nos pueden generar “problemas” en nuestro análisis por lo que es importante tener conciencia de qué variables / atributos los presentan.
Nos obliga a pensar en la mejor manera de “re-codificar” la variable.
Si esto es necesario, recomiendo siempre hacerlo en un “atributo” nuevo.
En otras ocasiones nos hablan o nos describen algunas características del proceso o fenómeno en sí mismo.
Pueden ser señales en el proceso de generación / acopio de nuestros datos.
¿Podemos resolver esos problemas? \(\Rightarrow\) Volver a la fase de acopio.
¿No podemos?
\(\Rightarrow\) ¿Podemos aplicar alguna metodología de imputación de datos faltantes?
En su defecto, ¿es válido quitar estas observaciones de los datos?
En nuestros datos no encontramos valores faltantes (salvo los que nosotros generamos al momento de transformar la estructura de los datos), por lo que seguimos adelante.
Supongamos ahora que nuestro interés se centra en los delitos de homicidio.
Observemos primero, que en nuestros datos, para cada tipo de delito, tenemos sub-tipos y modalidades. Para no complicar demasiado nuestro ejercicio, vamos a concentrarnos en los tipos y sub-tipos.
Tenemos entonces que hacer dos cosas:
datos.3 <- datos.2[which(datos.2$Tipo.de.delito == 'Homicidio'),]
head(datos.3)
## Año Clave_Ent Entidad Bien.jurídico.afectado Tipo.de.delito
## 1 2015 1 Aguascalientes La vida y la Integridad corporal Homicidio
## 2 2015 1 Aguascalientes La vida y la Integridad corporal Homicidio
## 3 2015 1 Aguascalientes La vida y la Integridad corporal Homicidio
## 4 2015 1 Aguascalientes La vida y la Integridad corporal Homicidio
## 5 2015 1 Aguascalientes La vida y la Integridad corporal Homicidio
## 6 2015 1 Aguascalientes La vida y la Integridad corporal Homicidio
## Subtipo.de.delito Modalidad MES DELITOS MES.2 MES.DIA FECHA
## 1 Homicidio doloso Con arma de fuego Enero 3 1 31 2015-01-31
## 2 Homicidio doloso Con arma blanca Enero 1 1 31 2015-01-31
## 3 Homicidio doloso Con otro elemento Enero 0 1 31 2015-01-31
## 4 Homicidio doloso No especificado Enero 2 1 31 2015-01-31
## 5 Homicidio culposo Con arma de fuego Enero 0 1 31 2015-01-31
## 6 Homicidio culposo Con arma blanca Enero 0 1 31 2015-01-31
datos.3 <-
aggregate(
x = list(DELITOS = datos.3$DELITOS)
, by =
list(
FECHA = datos.3$FECHA
, Entidad = datos.3$Entidad
, Subtipo.de.delito = datos.3$Subtipo.de.delito
)
, FUN = sum
)
Hmisc::describe(datos.3)
## datos.3
##
## 4 Variables 8128 Observations
## --------------------------------------------------------------------------------
## FECHA
## n missing distinct Info Mean pMedian Gmd
## 8128 0 127 1 2020-04-30 18383 1289
## .05 .10 .25 .50 .75 .90 .95
## 2015-07-31 2016-01-31 2017-08-31 2020-04-30 2022-12-31 2024-07-31 2025-01-31
##
## lowest : 2015-01-31 2015-02-28 2015-03-31 2015-04-30 2015-05-31
## highest: 2025-03-31 2025-04-30 2025-05-31 2025-06-30 2025-07-31
## --------------------------------------------------------------------------------
## Entidad
## n missing distinct
## 8128 0 32
##
## lowest : Aguascalientes Baja California Baja California Sur Campeche Chiapas
## highest: Tamaulipas Tlaxcala Veracruz de Ignacio de la Llave Yucatán Zacatecas
## --------------------------------------------------------------------------------
## Subtipo.de.delito
## n missing distinct
## 8128 0 2
##
## Value Homicidio culposo Homicidio doloso
## Frequency 4064 4064
## Proportion 0.5 0.5
## --------------------------------------------------------------------------------
## DELITOS
## n missing distinct Info Mean pMedian Gmd .05
## 8128 0 271 1 53.54 46 51.71 4.0
## .10 .25 .50 .75 .90 .95
## 7.0 15.0 39.0 74.0 120.3 165.0
##
## lowest : 0 1 2 3 4, highest: 287 288 289 307 308
## --------------------------------------------------------------------------------
Adicionalmente (esto es un poco “extra”) …
… pero nuevamente, ¿qué creen? …
… CONTEXTO
… queremos agregar la población estatal de cada año …
print(readLines(con = 'pob_mit_proyecciones.csv', n = 10, encoding = 'utf-8'))
## [1] "# Proyecciones poblacionales CONAPO por entidad federativa."
## [2] "# 1950 - 2050."
## [3] "# Descargado: ¿?"
## [4] "RENGLON,AÑO,ENTIDAD,CVE_GEO,EDAD,SEXO,POBLACION"
## [5] "1,1950,República Mexicana,0,0,Hombres,572103"
## [6] "2,1950,República Mexicana,0,0,Mujeres,559162"
## [7] "3,1950,República Mexicana,0,1,Hombres,514540"
## [8] "4,1950,República Mexicana,0,1,Mujeres,505269"
## [9] "5,1950,República Mexicana,0,2,Hombres,478546"
## [10] "6,1950,República Mexicana,0,2,Mujeres,469322"
poblacion <-
read.table(
file = 'pob_mit_proyecciones.csv'
, sep = ','
, header = TRUE
, encoding = 'utf-8'
)
# Lo agregamos para obtener la población total.
#
poblacion <-
aggregate(
x = list(POBLACION = poblacion$POBLACION)
, by = list(AÑO = poblacion$AÑO, ENTIDAD = poblacion$ENTIDAD)
, FUN = sum
)
# Agregamos la poblacion a nuestros datos.
#
datos.3$AÑO <- substr(datos.3$FECHA, start = 1, stop = 4)
# Limpiamos los nombres de algunos estados ...
#
datos.3$Entidad[which(datos.3$Entidad == 'Coahuila de Zaragoza')] <- 'Coahuila'
datos.3$Entidad[which(datos.3$Entidad == 'Michoacán de Ocampo')] <- 'Michoacán'
datos.3$Entidad[which(datos.3$Entidad == 'Veracruz de Ignacio de la Llave')] <-
'Veracruz'
# Agregamos la población haciendo un join por la derecha (para los que tienen
# cierto conocimiento de bases de datos):
#
datos.3 <-
merge(
x = datos.3
, y = poblacion
, by.x = c('AÑO', 'Entidad')
, by.y = c('AÑO', 'ENTIDAD')
, all.x = TRUE
)
summary(datos.3)
## AÑO Entidad FECHA Subtipo.de.delito
## Length:8128 Length:8128 Min. :2015-01-31 Length:8128
## Class :character Class :character 1st Qu.:2017-08-31 Class :character
## Mode :character Mode :character Median :2020-04-30 Mode :character
## Mean :2020-04-30
## 3rd Qu.:2022-12-31
## Max. :2025-07-31
## DELITOS POBLACION
## Min. : 0.00 Min. : 719846
## 1st Qu.: 15.00 1st Qu.: 1819494
## Median : 39.00 Median : 3131012
## Mean : 53.54 Mean : 3980967
## 3rd Qu.: 74.00 3rd Qu.: 5034179
## Max. :308.00 Max. :18240039
# Calculamos los delitos per capita ...
#
datos.3$DELITOS.PC <- datos.3$DELITOS / datos.3$POBLACION
# Multiplicamos por 100,000
#
datos.3$DELITOS.PC <- datos.3$DELITOS.PC*100000
Con esto lo que logramos es que el dato de los delitos sea comparable en el tiempo y entre estados (de otra manera estaríamos “contaminando” con la mera fluctuación de población).
Entonces, ya tengo unos datos que me interesa conocer más a detalle: datos históricos de los homicidios (per capita) en cada estado por tipo de homicidio (sub-tipo de delito).
Entonces, ahora podemos comenzar propiamente a explorar o describir nuestros datos, pero dijimos que lo queríamos hacer en forma sistemática y ordenada. Para ello echaremos mano de conceptos estadísticos.
Queremos describir el conjunto de datos con los que estamos trabajando, y comenzaremos describiendo las variables una a una.
La manera más apropiada de describir una variable en particular dependerá, desde luego, del tipo de datos que tenemos, pero en general buscamos caracterizar a la variable de interés describiendo, de alguna manera, la variabilidad observada en, o bien, mediante estadísticas, es decir, mediante un nuevo dato, “sintético”, creado a partir de nuestros datos, que describe en forma resumida algún rasgo relevante de la variable.
En términos generales, algunos de los elementos en los que con mayor frecuencia vamos a centrar nuestra atención son:
la forma de la distribución (¿Al rededor de qué valores se concentran más nuestros datos?¿En dónde menos?);
observaciones atípicas (¿Qué significa que algo sea atípico?¿Por qué es importante?);
huecos en los datos (¿Es esperado que haya huecos?¿Qué significa que haya huecos? ¿Qué implica para nuestro análisis?).
¿Por qué hacemos esto? Pues porque nos interesa conocer la forma en la que se “distribuyen” nuestros datos. Esto puede tener muchas implicaciones muy diversas:
Puede determinar los pasos a seguir en mi proyecto (p.e., identificar variables que necesitan ser transformadas)
Puede determinar el tipo de herramientas/modelos a utilizar (p.e., identificando si es razonable esperar que algunos de los supuestos se cumplan).
Permite identificar posibles relaciones entre las variables que determine o impacte en algunos de los puntos ya señalados.
Permite identificar posibles problemas en los datos.
Una primera forma básica de describir el comportamiento de una variable consiste simplemente en contar las veces en las que ocurre cada uno de los valores que puede tomar dicha variable. A esto le llamamos la distribución de frecuencia de la variable.
temp <-
aggregate(
x = list(f = datos.2$Subtipo.de.delito)
, by = list(Delito = datos.2$Subtipo.de.delito)
, FUN = length
)
temp$p <- temp$f / sum(temp$f)
kable(
x =
temp |>
transform(
f = comma(x = f, accuracy = 1)
, p = comma(x = p, accuracy = 0.0001)
)
, format = 'html'
, row.names = FALSE
, align = c('l', 'r', 'r')
) |> kable_classic()
| Delito | f | p |
|---|---|---|
| Aborto | 4,064 | 0.0102 |
| Abuso de confianza | 4,064 | 0.0102 |
| Abuso sexual | 4,064 | 0.0102 |
| Acoso sexual | 4,064 | 0.0102 |
| Allanamiento de morada | 4,064 | 0.0102 |
| Amenazas | 4,064 | 0.0102 |
| Contra el medio ambiente | 4,064 | 0.0102 |
| Corrupción de menores | 4,064 | 0.0102 |
| Daño a la propiedad | 4,064 | 0.0102 |
| Delitos cometidos por servidores públicos | 4,064 | 0.0102 |
| Despojo | 4,064 | 0.0102 |
| Electorales | 4,064 | 0.0102 |
| Evasión de presos | 4,064 | 0.0102 |
| Extorsión | 4,064 | 0.0102 |
| Falsedad | 4,064 | 0.0102 |
| Falsificación | 4,064 | 0.0102 |
| Feminicidio | 16,256 | 0.0408 |
| Fraude | 4,064 | 0.0102 |
| Homicidio culposo | 20,320 | 0.0510 |
| Homicidio doloso | 16,256 | 0.0408 |
| Hostigamiento sexual | 4,064 | 0.0102 |
| Incesto | 4,064 | 0.0102 |
| Incumplimiento de obligaciones de asistencia familiar | 4,064 | 0.0102 |
| Lesiones culposas | 20,320 | 0.0510 |
| Lesiones dolosas | 16,256 | 0.0408 |
| Narcomenudeo | 4,064 | 0.0102 |
| Otros delitos contra el patrimonio | 4,064 | 0.0102 |
| Otros delitos contra la familia | 4,064 | 0.0102 |
| Otros delitos contra la sociedad | 4,064 | 0.0102 |
| Otros delitos del Fuero Común | 4,064 | 0.0102 |
| Otros delitos que atentan contra la libertad personal | 4,064 | 0.0102 |
| Otros delitos que atentan contra la libertad y la seguridad sexual | 4,064 | 0.0102 |
| Otros delitos que atentan contra la vida y la integridad corporal | 4,064 | 0.0102 |
| Otros robos | 8,128 | 0.0204 |
| Rapto | 4,064 | 0.0102 |
| Robo a casa habitación | 8,128 | 0.0204 |
| Robo a institución bancaria | 8,128 | 0.0204 |
| Robo a negocio | 8,128 | 0.0204 |
| Robo a transeúnte en espacio abierto al público | 8,128 | 0.0204 |
| Robo a transeúnte en vía pública | 8,128 | 0.0204 |
| Robo a transportista | 8,128 | 0.0204 |
| Robo de autopartes | 8,128 | 0.0204 |
| Robo de ganado | 8,128 | 0.0204 |
| Robo de maquinaria | 24,384 | 0.0612 |
| Robo de vehículo automotor | 24,384 | 0.0612 |
| Robo en transporte individual | 8,128 | 0.0204 |
| Robo en transporte público colectivo | 8,128 | 0.0204 |
| Robo en transporte público individual | 8,128 | 0.0204 |
| Secuestro | 20,320 | 0.0510 |
| Tráfico de menores | 4,064 | 0.0102 |
| Trata de personas | 4,064 | 0.0102 |
| Violación equiparada | 4,064 | 0.0102 |
| Violación simple | 4,064 | 0.0102 |
| Violencia de género en todas sus modalidades distinta a la violencia familiar | 4,064 | 0.0102 |
| Violencia familiar | 4,064 | 0.0102 |
Desde luego, a las tablas de frecuencias para datos categóricos es posible representarlas gráficamente mediante gráficas de barras.
ggplot(data = datos.2) +
aes(x = Subtipo.de.delito) +
geom_bar() +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
scale_y_continuous(labels = comma) +
labs(title = 'Distribución de frecuencias del subtipo de delito', y = 'Frecuencia', x = 'Delito')
ggplot(data = temp) +
aes(x = Delito, y = p) +
geom_col() +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
scale_y_continuous(labels = percent) +
labs(
title = 'Distribución de frecuencias del subtipo de delito'
, subtitle = 'Frecuencias relativas'
, y = 'Frecuencia'
, x = 'Delito'
)
Observa que, para nuestros datos, la distribución de frecuencias así como la definimos describe muy mal a nuestros datos, ¿por qué?
temp <-
aggregate(
x = list(f = datos.2$DELITOS)
, by = list(Delito = datos.2$Subtipo.de.delito)
, FUN = sum
)
temp$p <- temp$f / sum(temp$f)
ggplot(data = temp) +
aes(x = Delito, y = f) +
geom_col() +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
scale_y_continuous(labels = comma) +
labs(
title = 'Distribución de frecuencias del subtipo de delito'
, subtitle = 'Frecuencias absolutas'
, y = 'Frecuencia'
, x = 'Delito'
)
ggplot(data = temp) +
aes(x = Delito, y = p) +
geom_col() +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
scale_y_continuous(labels = percent) +
labs(
title = 'Distribución de frecuencias del subtipo de delito'
, subtitle = 'Frecuencias relativas'
, y = 'Frecuencia'
, x = 'Delito'
)
Variables cuantitativas discretas: este caso es relativamente sencillo ya que podemos aplicar exactamente el mismo procedimiento que utilizamos para las variables cualitativas. Esto es, para este tipo de variables simplemente podemos registrar en forma tabular tanto la frecuencia como la frecuencia relativa observadas para cada valor posible de la variable.
Variables cuantitativas continuas: si bien para las variables continuas sería posible aplicar nuevamente el mismo procedimiento, la realidad es que muy probablemente registraríamos una sola observación para cada valor, lo cual no sería de mucha utilidad si nuestro objetivo es describir el comportamiento de la variable. Por ello, es necesario agrupar a las observaciones en rangos de valores. Surge entonces, necesariamente, la pregunta, ¿cuántos rangos tenemos que considerar para agrupar las observaciones?
Si bien no es posible dar una respuesta directa a esta pregunta, existen una multiplicidad de propuestas para poder determinar el número “ideal” de rangos a utilizar. Una de estas propuestas es la regla de Freedman-Diaconis que sugiere utilizar intervalos de longitud igual a \(h = \frac{2 \times IQR}{n^{1/3}}\) donde \(IQR\) es el rango intercuartil y \(n\) es el número de observaciones.
A su vez, \(IQR = Q3 - Q1\) y los valores \(Q3\) y \(Q1\) corresponden al tercer y primer cuartil de los datos, respectivamente (es decir, los valores que son mayores al 75% y 25% de las observaciones, respectivamente).
Una vez que hemos determinado la longitud de los rangos a utilizar obtener el número de rangos necesarios para la construcción de la distribución de frecuencias se sigue directamente de considerar el rango de los datos de nuestra variable. Habrá que tener solamente cuidado en considerar los límites inferior y superior apropiados para establecer el rango ya que en ocasiones estos límites estarán determinados por los valores observados y en ocasiones por los valores posibles.
Ahora bien, es importante recordar que esta es una de entre una multiplicidad de propuestas y que, sin importar la regla que se use, se recomienda no utilizar menos de cinco y no más de veinte rangos para la construcción de las tablas de frecuencias.
¿Los rangos son útiles únicamente para las variables continuas?
temp <-
aggregate(
x = list(f = datos.2$DELITOS)
, by = list(Fecha = datos.2$FECHA)
, FUN = sum
)
h <- 2*IQR(temp$f)/(nrow(temp)^(1/3))
inicio <- seq(from = min(temp$f), to = max(temp$f), by = h)
fin <- seq(from = min(temp$f) + h, to = max(temp$f) + h, by = h)
temp$inicio <- 0
temp$fin <- 0
for (i in 1:nrow(temp)){
temp$inicio[i] <- max(inicio[which(inicio <= temp$f[i])])
temp$fin[i] <- min(fin[which(fin > temp$f[i])])
}
temp$Rango <- paste(comma(temp$inicio), comma(temp$fin), sep = ' - ')
temp <-
aggregate(
x = list(f = temp$f)
, by = list(Rango = temp$Rango)
, FUN = sum
)
temp$p <- temp$f / sum(temp$f)
ggplot(data = temp) +
aes(x = Rango, y = f) +
geom_col() +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
scale_y_continuous(labels = comma) +
labs(
title = 'Distribución de frecuencias del subtipo de delito'
, subtitle = 'Frecuencias absolutas'
, y = 'Frecuencia'
, x = 'Delito'
)
ggplot(data = temp) +
aes(x = Rango, y = p) +
geom_col() +
theme_classic() +
theme(axis.text.x = element_text(angle = 45, hjust = 1, vjust = 1)) +
scale_y_continuous(labels = percent) +
labs(
title = 'Distribución de frecuencias del subtipo de delito'
, subtitle = 'Frecuencias relativas'
, y = 'Frecuencia'
, x = 'Delito'
)
Para variables categóricas:
Número de categorías:
Lista de las categorías: por experiencia, es importante revisar, porque con frecuencia los nombres de los estados son capturados con errores o con variaciones.
unique(datos.3$Entidad)
## [1] "Aguascalientes" "Baja California" "Baja California Sur"
## [4] "Campeche" "Chiapas" "Chihuahua"
## [7] "Ciudad de México" "Coahuila" "Colima"
## [10] "Durango" "Guanajuato" "Guerrero"
## [13] "Hidalgo" "Jalisco" "México"
## [16] "Michoacán" "Morelos" "Nayarit"
## [19] "Nuevo León" "Oaxaca" "Puebla"
## [22] "Querétaro" "Quintana Roo" "San Luis Potosí"
## [25] "Sinaloa" "Sonora" "Tabasco"
## [28] "Tamaulipas" "Tlaxcala" "Veracruz"
## [31] "Yucatán" "Zacatecas"
kable(
x =
table(datos.3$Entidad)
, row.names = FALSE
, format = 'pandoc'
, align = c('l', 'r')
, col.names = c('ENTIDAD', 'FRECUENCIA')
)
| ENTIDAD | FRECUENCIA |
|---|---|
| Aguascalientes | 254 |
| Baja California | 254 |
| Baja California Sur | 254 |
| Campeche | 254 |
| Chiapas | 254 |
| Chihuahua | 254 |
| Ciudad de México | 254 |
| Coahuila | 254 |
| Colima | 254 |
| Durango | 254 |
| Guanajuato | 254 |
| Guerrero | 254 |
| Hidalgo | 254 |
| Jalisco | 254 |
| México | 254 |
| Michoacán | 254 |
| Morelos | 254 |
| Nayarit | 254 |
| Nuevo León | 254 |
| Oaxaca | 254 |
| Puebla | 254 |
| Querétaro | 254 |
| Quintana Roo | 254 |
| San Luis Potosí | 254 |
| Sinaloa | 254 |
| Sonora | 254 |
| Tabasco | 254 |
| Tamaulipas | 254 |
| Tlaxcala | 254 |
| Veracruz | 254 |
| Yucatán | 254 |
| Zacatecas | 254 |
Observemos que aquí la estadística de referencia es meramente la aparición del estado en nuestros datos. Por la manera en la que se construye el conjunto de datos esto probablemente no se a lo más conveniente.
Nuevamente …
… CONTEXTO …
En nuestro caso quizá sea más relevante asociarlo al dato de delitos (pensemos que se registra el nombre del estado cada que ocurre un delito, de cualquier tipo) …
… adicionalmente, es útil presentar la frecuencia relativa …
… y ordenados, ¿quizá? …
estados <-
aggregate(
x = list(Delitos = datos.3$DELITOS)
, by = list(Entidad = datos.3$Entidad)
, FUN = sum
)
estados$Participación <- estados$Delitos / sum(estados$Delitos)
estados <- estados[order(estados$Participación, decreasing = TRUE),]
kable(
x =
estados %>%
mutate(Delitos = comma(Delitos, accuracy = 1)) %>%
mutate(Participación = percent(Participación, accuracy = 0.01))
, row.names = FALSE
, format = 'pandoc'
, align = c('l', 'r' ,'r')
)
| Entidad | Delitos | Participación |
|---|---|---|
| Guanajuato | 38,786 | 8.91% |
| México | 36,140 | 8.30% |
| Michoacán | 27,422 | 6.30% |
| Baja California | 27,011 | 6.21% |
| Jalisco | 25,515 | 5.86% |
| Guerrero | 22,330 | 5.13% |
| Chihuahua | 21,476 | 4.93% |
| Veracruz | 21,082 | 4.84% |
| Oaxaca | 17,877 | 4.11% |
| Ciudad de México | 17,703 | 4.07% |
| Nuevo León | 15,839 | 3.64% |
| Puebla | 15,552 | 3.57% |
| Sinaloa | 15,167 | 3.49% |
| Sonora | 14,748 | 3.39% |
| Tamaulipas | 13,921 | 3.20% |
| Chiapas | 13,576 | 3.12% |
| Morelos | 12,418 | 2.85% |
| Quintana Roo | 11,922 | 2.74% |
| Tabasco | 9,203 | 2.11% |
| Zacatecas | 8,933 | 2.05% |
| San Luis Potosí | 7,698 | 1.77% |
| Colima | 7,523 | 1.73% |
| Hidalgo | 6,058 | 1.39% |
| Querétaro | 5,201 | 1.20% |
| Coahuila | 4,526 | 1.04% |
| Durango | 3,927 | 0.90% |
| Nayarit | 3,260 | 0.75% |
| Aguascalientes | 2,549 | 0.59% |
| Baja California Sur | 2,309 | 0.53% |
| Tlaxcala | 2,211 | 0.51% |
| Campeche | 1,746 | 0.40% |
| Yucatán | 1,557 | 0.36% |
estados$Entidad[which(estados$Delitos == max(estados$Delitos))]
## [1] "Guanajuato"
Para variables cuantitativas, generalmente el interés se centra en describir las siguientes características de los datos:
Centralidad
Dispersión
Sesgo
Kurtosis
Aunque, realmente, casi todo el mundo se enfoca en la centralidad y la dispersión.
Nuevamente, familiarizarnos con las características de nuestros datos nos permite:
Descubrir rasgos inesperados, desconocidos o posiblemente erróneos en los datos.
Identificar patrones de distribución de nuestros datos familiares.
Para plantear opciones de modelado.
Para proponer transformaciones que faciliten el posterior modelado.
Desde luego, plantear las preguntas de investigación que vamos a intentar resolver mediante inferencia.
Estas medidas describe en dónde se encuentran los valores “medios” de nuestros datos.
\[\bar{X} = \frac{1}{n} \sum\limits_{i=1}^n x_i\]
En nuestros datos, el número de delitos per capita promedio es 1.4671156:
Total de delitos per capita capturados: 1.1924716^{4}
Total de observaciones: 8128
¿Qué nos dice este dato en nuestros datos?
Es el número de delitos per capita promedio histórico por mes por estado y por tipo/modalidad de delito.
En nuestros datos, la mediana de los delitos es 1.0466179.
Ahora, ¿qué nos dice este dato?
¿Por qué decimos que la mediana es “robusta”? Considera el siguiente ejemplo: tenemos cinco observaciones: \(x = \{1,2,3,4,5\}\):
Media: 3
Mediana: 3
Ahora, ¿qué pasaría si la última observación tuviera un valor extremo mayor? Digamos 50.
Media: 12
Mediana: 3
fd <- density(x = datos.3$DELITOS.PC)
#
# plot(fd)
#
moda <- fd$x[which(fd$y == max(fd$y))]
ggplot(data = datos.3) +
aes(x = DELITOS.PC) +
geom_density() +
geom_vline(xintercept = moda, colour = 'red') +
labs(
title = 'Gráfica de la función de densidad del número de delitos per cápita'
, x = 'DELITOS PER CÁPITA'
, y = 'DENSIDAD'
) +
annotate(geom = 'text', x = moda + 1.25, y = max(fd$y), label = paste0('Moda = ', comma(moda, accuracy = 0.01))) +
theme_minimal()
Vamos a dejar las visualizaciones para un poco más adelante.
Las medidas de dispersión nos dicen qué tan “alejados” o “cercanos” se encuentran nuestros datos entre sí.
max(datos.3$DELITOS.PC)
## [1] 13.92074
min(datos.3$DELITOS.PC)
## [1] 0
max(datos.3$DELITOS.PC)-min(datos.3$DELITOS.PC)
## [1] 13.92074
¿Es razonable que haya meses en los que en un estado completo no haya un solo homicidio doloso o culposo?
Podríamos explorar eso un poco más.
quantile(x=datos.3$DELITOS.PC, probs = c(0.25, 0.75))
## 25% 75%
## 0.6851908 1.7284972
as.numeric(quantile(x=datos.3$DELITOS.PC, probs = 0.75) -
quantile(x=datos.3$DELITOS.PC, probs = c(0.25)))
## [1] 1.043306
Recordemos que en nuestros datos la mediana se encontraba:
quantile(x = datos.3$DELITOS.PC, probs = c(0.5))
## 50%
## 1.046618
\[s^2 = \frac{1}{n} \sum\limits_{i=1}^{n} (x_i - \bar{x})^2\]
Con mayor frecuencia se utiliza la fórmula de la varianza muestral1:
\[s^2 = \frac{1}{n-1} \sum\limits_{i=1}^{n} (x_i - \bar{x})^2\]
var(x = datos.3$DELITOS.PC)
## [1] 1.75283
Ojo: la varianza está expresada en las unidades de medición al cuadrado. Por lo tanto, es frecuente presentar la desviación estándar:
\[s = \sqrt{s^2}\]
sd(x = datos.3$DELITOS.PC)
## [1] 1.323945
Un punto de referencia importante para valorar la dispersión de nuestros datos es la distribución normal. En particular, sabemos que si nuestros datos tienen una distribución normal con varianza unitaria, seguirán el siguiente patrón:
| \(\sigma\) | Prob. |
|---|---|
| \(\pm \sigma\) | 0.680 |
| \(\pm 2\sigma\) | 0.950 |
| \(\pm 3\sigma\) | 0.997 |
\[MAD = med(|x_i - med(x)|)\]
La MAD es una medición robusta.
mad(x = datos.3$DELITOS.PC)
## [1] 0.6765847
\[\ = \frac{E[(X - \mu)^3]}{\sigma^3}\]
Ojo: en inglés se usan los términos right-skewed y left-skewed. Quizá tengamos la tentación de traducirlos como sesgo a la derecha y sesgo a la izquierda, pero es al revés. Aunque en ocasiones se traduce skewness como sesgo, en español el sesgo hace referencia hacia a donde los datos se encuentran más concentrados, mientras que en inglés el skewness hace referencia hacia la cola más larga de la distribución.
Veamos un ejemplo con nuestros datos:
temp <-
datos.3[
which(
datos.3$Entidad == 'Ciudad de México' &
datos.3$Subtipo.de.delito == 'Homicidio doloso'
)
,
]
asimetria <-
mean((temp$DELITOS.PC - mean(temp$DELITOS.PC))^3) / (sd(temp$DELITOS.PC)^3)
print(asimetria)
## [1] 1.08011
Los datos presentan, entonces, una asimetría positiva.
fd <- density(x = temp$DELITOS.PC)
mode.temp <- fd$x[which(fd$y == max(fd$y))]
ggplot(data = temp, mapping = aes(x = DELITOS.PC)) +
geom_density() +
geom_vline(xintercept = mean(temp$DELITOS.PC), colour = 'blue') +
geom_vline(xintercept = median(temp$DELITOS.PC), colour = 'red') +
geom_vline(xintercept = mode.temp, colour = 'green') +
theme_minimal() +
labs(x = 'DELITOS PER CÁPITA', y = 'DENSIDAD')
\[\kappa = \frac{E[(X - \mu)^4]}{\sigma^4}\]
Aunque con mayor frecuencia se proporciona el coeficiente de exceso de curtosis:
\[\kappa = \frac{E[(X - \mu)^4]}{\sigma^4} - 3\]
Esto es, porque al tratarse de una estadística relativa a la “forma” de la distribución, generalmente se compara contra la forma de una distribución normal.
Comparemos la curtosis de dos diferentes estados:
# Ciudad de México:
#
kurtosis.cdmx <-
mean((temp$DELITOS.PC - mean(temp$DELITOS.PC)^4))/(sd(temp$DELITOS.PC)^4)
print(kurtosis.cdmx)
## [1] 63.24926
cdmx <- temp
# Baja California Sur:
#
temp <-
datos.3[
which(
datos.3$Entidad == 'Baja California Sur' &
datos.3$Subtipo.de.delito == 'Homicidio doloso'
)
,
]
kurtosis.bcs <-
mean((temp$DELITOS.PC - mean(temp$DELITOS.PC)^4))/(sd(temp$DELITOS.PC)^4)
print(kurtosis.bcs)
## [1] -0.1860021
bcs <- temp
ggplot(data = cdmx) +
aes(x = DELITOS.PC) +
geom_density() +
geom_density(data = bcs, mapping = aes(x = DELITOS.PC), colour = 'red') +
theme_minimal() +
labs(title = 'Densidad del número de homicidios dolosos', subtitle = 'CDMX (negro); BCS (rojo)', x = 'DELITOS PER CÁPITA', y = 'DENSIDAD')
Ahora vale la pena preguntarse, tenemos varias estadísticas resumen de nuestros datos, ¿cuál describe mejor a nuestros datos?
Vamos ahora a juntar varias de estas ideas en gráficos …
… porque una imagen vale más que mil palabras …
… a veces.
En primera instancia, podemos utilizar gráficos de barras para mostrar la frecuencia con la que aparecen datos categóricos:
ggplot(data = datos.3, mapping = aes(x = Subtipo.de.delito, y = DELITOS.PC)) +
geom_col() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_y_continuous(labels = comma)
O en forma relativa (sustituyendo a lo que sería una gráfica de pay).
¿Alguien usa gráficas de pay? Link
ggplot(
data = datos.3
, mapping = aes(x = Subtipo.de.delito, y = DELITOS.PC/sum(DELITOS.PC))
) +
geom_col() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_y_continuous(labels = percent) +
ylab('% DELITOS PC')
Podemos también revisarlos por entidad federativa:
ggplot(
data = datos.3
, mapping = aes(x = Subtipo.de.delito, y = DELITOS.PC/sum(DELITOS.PC))
) +
geom_col() +
facet_wrap(facets = . ~ Entidad, ncol = 6) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
ylab('%')
ggplot(
data = datos.3[which(datos.3$Entidad == 'Ciudad de México'),]
, mapping = aes(x = Subtipo.de.delito, y = DELITOS.PC/sum(DELITOS.PC))
) +
geom_col() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_y_continuous(labels = percent) +
ylab('%')
ggplot(
data = datos.3[which(datos.3$Entidad == 'Yucatán'),]
, mapping = aes(x = Subtipo.de.delito, y = DELITOS.PC/sum(DELITOS.PC))
) +
geom_col() +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_y_continuous(labels = percent) +
ylab('%')
datos.4 <-
dcast(
data = datos.3
, formula = FECHA + Entidad ~ Subtipo.de.delito
, value.var = 'DELITOS.PC'
)
Pasando a datos cuantitatitativos, una primera visualización útil puede ser un diagrama de puntos:
ggplot(data = datos.4) +
aes(x = `Homicidio doloso`) +
geom_dotplot(dotsize = 0.5, method = 'histodot', binwidth = 0.1) +
theme_minimal() +
scale_y_continuous(NULL, breaks = NULL, limits = c(0,NA))
Otra visualización muy útil es el diagrama de caja y brazos …
Permite mostrar en una sola imagen rasgos relevantes de la distribución de nuestros datos (típicamente, algunas configuraciones cambian): la mediana, el primer cuartil, el tercer cuartil, datos extremos (según la definición de Tukey) …
Veamos cómo se ve la “distribución” de los homicidios dolosos per capita:
ggplot(
data = datos.4
, mapping = aes(y = `Homicidio doloso`)
) +
geom_boxplot() +
theme_minimal()
¿Qué estamos viendo aquí? ¿Sería diferente si vieramos la distribución de los homicidios dolosos per capita a nivel nacional? ¿Necesito ajustar mis preguntas de investigación?
Si ahora vemos la distribución de los homicidios dolosos por entidad:
ggplot(
data = datos.4
, mapping = aes(x = `Homicidio doloso`)
) +
geom_boxplot() +
facet_wrap(facets = . ~ Entidad, ncol = 6) +
theme_minimal()
Desde luego, existen mejores maneras de presentar estos datos:
ggplot(
data = datos.4
, mapping = aes(y = Entidad)
) +
geom_boxplot(mapping = aes(`Homicidio doloso`)) +
theme_minimal()
temp <-
aggregate(
x = list(MEDIANA = datos.4$`Homicidio doloso`)
, by = list(ENTIDAD = datos.4$Entidad)
, FUN = median
)
temp <- temp[order(temp$MEDIANA),]
datos.4$Entidad.f <-
factor(datos.4$Entidad, levels = temp$ENTIDAD, ordered = TRUE)
ggplot(
data = datos.4
, mapping = aes(y = Entidad.f)
) +
geom_boxplot(mapping = aes(`Homicidio doloso`)) +
theme_minimal()
¿Recuerdan la diferencia de curtosis entre BCS y CDMX?
Podríamos agregar el dato nacional para mejorar la referencia de comparación.
Por el momento no lo vamos a hacer.
Otra manera de visualizar la manera en la que se “distribuyen” los datos es graficando su función de distribución, aunque generalmente somos (soy) mejores interpretando las funciones de densidad, que es lo que haremos.
ggplot(
data = datos.4
, mapping = aes(x = `Homicidio doloso`)
) +
geom_density() +
theme_minimal() +
labs(title = 'Densidad histórica del homicidio doloso per capita')
ggplot(
data = datos.4
, mapping = aes(x = `Homicidio doloso`)
) +
geom_density() +
facet_wrap(facets = 'Entidad.f', ncol = 4, scales = 'free') +
theme_minimal() +
labs(title = 'Densidad histórica del homicidio doloso per capita')
Y, si nos enfocamos en una de las entidades federativas en particular:
ggplot(
data = datos.4[which(datos.4$Entidad == 'Ciudad de México'),]
, mapping = aes(x = `Homicidio doloso`)
) +
geom_density() +
theme_minimal() +
labs(
title = 'Densidad histórica del homicidio doloso per capita'
, subtitle = 'Ciudad de México'
)
… o podemos “encimar” distribuciones …
ggplot(
data = datos.4[which(datos.4$Entidad == 'Ciudad de México'),]
, mapping = aes(x = `Homicidio doloso`)
) +
geom_density(fill = 'red', alpha = 0.1) +
geom_density(
data = datos.4[which(datos.4$Entidad == 'Yucatán'),]
, mapping = aes(x = `Homicidio doloso`)
, fill = 'blue'
, alpha = 0.1
) +
theme_minimal() +
labs(
title = 'Densidad histórica del homicidio doloso per capita'
, subtitle = 'Ciudad de México vs Yucatán'
, caption = 'Azul: Yucatán; Rojo: CDMX'
)
… y están también las gráficas de violín.
ggplot(
data = datos.4[which(datos.4$Entidad %in% c('Ciudad de México', 'Yucatán')),]
, mapping = aes(x = Entidad.f, y = `Homicidio doloso`)
) +
geom_violin() +
theme_minimal() +
labs(
title = 'Densidad histórica del homicidio doloso per capita'
)
Retomemos ahora el tema de las transformaciones. ¿Por qué quisiéramos (o podríamos necesitar) transformar los datos originalmente recabados?
Las transformaciones son útiles porque algunas nos ayudan a observar rasgos que en la escala original de las variables no son tan obvios. También es frecuente observar que la variable transformada se comporta de manera que es más fácil modelarla. En ocasiones, también, la variable transformada puede compararse más fácilmente contra otras variables.
Emerson and Stoto (1983) :Raw data may require a change of expression to produce an informative display, effective summaries, or an uncomplicated analysis. That is, we may need to change not only the units in which the data values are stated, but also the basic scale of measurement. Difficulties may arise because the raw data have
Desde luego, cuando hablamos de transformaciones, podemos imaginar una gama muy amplia de posibilidades. Sin embargo, para reducir las opciones, nos interesa encontrar transformaciones que cumplan con ciertas características ((Emerson and Stoto 1983)):
Si se desea promover simetría en el “cuerpo principal” de los datos pero los sesgos en las colas de la distribución son relativamente poco importantes, una buena opción es la transformación logarítmica.
Si la simetría en las colas de la distribución es importante, quizá sea mejor opción utilizar la raíz cuadrada.
Si queremos un balance entre simetría en el cuerpo principal de los datos y los datos en las colas, podemos usar la raíz cuarta.
En nuestros datos ya habíamos observado una asimetría positiva en los datos de homicidios dolosos en la CDMX. Veamos ahora cómo se presentan transformados:
Utilizando una transformación logarítmica:
temp <-
datos.3[
which(
datos.3$Entidad == 'Ciudad de México' &
datos.3$Subtipo.de.delito == 'Homicidio doloso'
)
,
]
fd <- density(x = log(temp$DELITOS.PC))
mode.temp <- fd$x[which(fd$y == max(fd$y))]
ggplot(data = temp, mapping = aes(x = log(DELITOS.PC))) +
geom_density() +
geom_vline(xintercept = mean(log(temp$DELITOS.PC)), colour = 'blue') +
geom_vline(xintercept = median(log(temp$DELITOS.PC)), colour = 'red') +
geom_vline(xintercept = mode.temp, colour = 'green') +
theme_minimal()
asimetria <-
sum(
(
(
log(temp$DELITOS.PC) - mean(log(temp$DELITOS.PC))
) / sd(log(temp$DELITOS.PC))
)^3
) /
nrow(temp)
print(asimetria)
## [1] 0.4691857
datos.4$HD.SD.1 <-
(datos.4$`Homicidio doloso` - mean(datos.4$`Homicidio doloso`)) /
sd(datos.4$`Homicidio doloso`)
Hmisc::describe(datos.4$HD.SD.1)
## datos.4$HD.SD.1
## n missing distinct Info Mean pMedian Gmd .05
## 4064 0 3298 1 4.115e-18 -0.1843 1.005 -0.9501
## .10 .25 .50 .75 .90 .95
## -0.8625 -0.6760 -0.3691 0.3757 1.4008 2.0815
##
## lowest : -1.0933 -1.06805 -1.0678 -1.06754 -1.06728
## highest: 5.17462 5.33156 5.49605 6.07498 7.2697
ggplot(
data = datos.4
, mapping = aes(y = HD.SD.1)
) +
geom_boxplot() +
theme_minimal()
ggplot(
data = datos.4
, mapping = aes(x = HD.SD.1)
) +
geom_density() +
theme_minimal()
ggplot(
data = datos.4
, mapping = aes(y = Entidad.f)
) +
geom_boxplot(mapping = aes(HD.SD.1)) +
theme_minimal()
Sin embargo, en nuestro ejemplo es poco probable que el “proceso” que genera los homicidios dolosos sea el mismo en todos los estados; es mucho más razonable pensar que los homicidios dolosos sean un “proceso” afectado mucho más por condiciones de naturaleza local. Por lo tanto, en este caso, hace mucho más sentido estandarizar al interior de cada estado (mucho ojo: esto hace que los datos ya no sean comparables entre estados, podemos comparar comportamientos quizá, pero ya no los datos puntuales):
datos.4$HD.SD.2 <- NA
for (i in unique(datos.4$Entidad)){
datos.4$HD.SD.2[which(datos.4$Entidad == i)] <-
(
datos.4$`Homicidio doloso`[which(datos.4$Entidad == i)] -
mean(datos.4$`Homicidio doloso`[which(datos.4$Entidad == i)])
) /
sd(datos.4$`Homicidio doloso`[which(datos.4$Entidad == i)])
}
ggplot(
data = datos.4
, mapping = aes(y = HD.SD.2)
) +
geom_boxplot() +
theme_minimal()
ggplot(
data = datos.4
, mapping = aes(x = HD.SD.2)
) +
geom_density() +
theme_minimal()
ggplot(
data = datos.4
, mapping = aes(y = Entidad.f)
) +
geom_boxplot(mapping = aes(HD.SD.2)) +
theme_minimal()
ggplot(
data = datos.4
, mapping = aes(x = HD.SD.2)
) +
geom_density(fill = 'blue', alpha = 0.3) +
facet_wrap(facets = 'Entidad.f', ncol = 4, scales = 'free') +
theme_minimal() +
labs(title = 'Densidad histórica del homicidio doloso per capita')
ggplot(
data = datos.4[which(datos.4$Entidad == 'Ciudad de México'),]
, mapping = aes(x = HD.SD.2)
) +
geom_density(fill = 'blue', alpha = 0.3) +
theme_minimal() +
labs(
title = 'Densidad histórica del homicidio doloso per capita (estandarizado)'
, subtitle = 'Ciudad de México'
)
En ocasiones, otro tipo de transformaciones nos permiten:
Observar características relevantes de los datos de manera más obvia
Obtener una versión “más manejable” de nuestros datos
Una de las familias de transformaciones más recurrida es la familia de potencias. Por ejemplo:
\[g(y) = y^n\]
Una potencia muy utilizada, por ejemplo, para reducir la asimetría de los datos es la raíz cuadrada:
ggplot(
data = datos.4[which(datos.4$Entidad == 'Ciudad de México'),]
, mapping = aes(x = `Homicidio doloso`)
) +
geom_density(fill = 'blue', alpha = 0.3) +
geom_density(
mapping = aes(x = sqrt(`Homicidio doloso`))
, fill = 'red'
, alpha = 0.3
) +
theme_minimal() +
labs(
title = 'Densidad histórica del homicidio doloso per capita (estandarizado)'
, subtitle = 'Ciudad de México'
)
asimetria.2 <-
with(
datos.4[which(datos.4$Entidad == 'Ciudad de México'),]
, sum(
((`Homicidio doloso` - mean(`Homicidio doloso`)) /
sd(`Homicidio doloso`))^3)
) / nrow(datos.4[which(datos.4$Entidad == 'Ciudad de México'),])
print(comma(asimetria.2, accuracy = 0.0001))
## [1] "1.0801"
Sin embargo, una manera más conveniente de representar a la familia de potencias para la transformación de datos es la conocida como transformación de Box-Cox2:
\[g(y) = \left\{ \array{\frac{y^{\lambda} - 1}{\lambda} & \lambda \neq 0 \\ ln(y) & \lambda = 0} \right.\]
datos.4$HD.3 <- log(datos.4$`Homicidio doloso`)
ggplot(
data = datos.4
, mapping = aes(y = HD.3)
) +
geom_boxplot() +
theme_minimal()
## Warning: Removed 21 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
ggplot(
data = datos.4
, mapping = aes(x = HD.3)
) +
geom_density() +
theme_minimal()
## Warning: Removed 21 rows containing non-finite outside the scale range
## (`stat_density()`).
ggplot(
data = datos.4
, mapping = aes(y = Entidad.f)
) +
geom_boxplot(mapping = aes(HD.3)) +
theme_minimal()
## Warning: Removed 21 rows containing non-finite outside the scale range
## (`stat_boxplot()`).
ggplot(
data = datos.4
, mapping = aes(x = HD.3)
) +
geom_density(fill = 'blue', alpha = 0.3) +
facet_wrap(facets = 'Entidad.f', ncol = 4, scales = 'free') +
theme_minimal() +
labs(title = 'Densidad histórica del homicidio doloso per capita')
## Warning: Removed 21 rows containing non-finite outside the scale range
## (`stat_density()`).
ggplot(
data = datos.4[which(datos.4$Entidad == 'Ciudad de México'),]
, mapping = aes(x = HD.3)
) +
geom_density(fill = 'blue', alpha = 0.3) +
facet_wrap(facets = 'Entidad.f', ncol = 4, scales = 'free') +
theme_minimal() +
labs(title = 'Densidad histórica del homicidio doloso per capita')
La transformación logarítmica es particularmente relevante para quienes trabajen con datos económico/financieros:
Las series de datos financieros con frecuencia contemplan algún efecto “multiplicativo” que bajo la transformación logarítimica se vuelve “aditivo” (y por lo tanto mucho más fácil de modelar).
Con frecuencia la transformación logarítmica tiene una interpretación fácil3 en términos financieros.
Contexto general
Contexto específico (diccionario de datos)
Preparación de datos (limpieza, transformaciones prácticas, transformaciones estadísticas, etc.)
Generar preguntas sobre los datos.
Dar respuesta a las preguntas.
Iterar refinando las preguntas y/o generar nuevas.
Utilizamos el término multivariado para referirnos a estructuras de datos con 2 o más variables de interés. Típicamente tenemos un número de variables significativamente mayor a 2.
Desde luego, lo que queremos (intentamos) es analizar las variables en forma “simultánea”, esto es, queremos explorar la relación que existe entre las variables.
Esto, claro está, representa un problema, sobre todo si queremos analizar simultáneamente más de 2 variables.
Un primer punto de partida para la exploración multivariada puede ser el uso de gráficos bi-variados.
Cuando tenemos más de dos variables en nuestros datos, esto se convierte en un análisis por pares. Por ejemplo, podemos hacer gráficas de dispersión por pares.
Consideremos los datos de delitos mensuales per capita en la Ciudad de México por subtipo de delito:
# Construye la estructura con los datos: filtra, agrega, relaciona población y calcula delitos per capita.
#
temp <- datos.2
temp <- temp[which(datos.2$Entidad == 'Ciudad de México'),]
temp <-
aggregate(
x = list(DELITOS = temp$DELITOS)
, by =
list(AÑO = temp$Año, FECHA = temp$FECHA, TIPO = temp$Subtipo.de.delito)
, FUN = sum
)
temp <-
merge(
x = temp
, y = poblacion[which(poblacion$ENTIDAD == 'Ciudad de México'),]
, by.x = c('AÑO')
, by.y = c('AÑO')
, all.x = TRUE
)
temp$DELITOS.PC <- 100000*temp$DELITOS/temp$POBLACION
temp.r <- temp
temp <-
dcast(data = temp, formula = FECHA ~ TIPO, fill = 0, value.var = 'DELITOS.PC')
datatable(data =temp, rownames = FALSE) %>% formatRound(columns = -1)
Dado que estamos utilizando la cifra de delitos per capita podemos argumentar que los datos son comparables en el tiempo (es decir, no hay un efecto “poblaciones”). Entonces, podría interesarnos explorar (preguntarnos) si existen delitos que estén relacionados entre sí.
Podemos, entonces, graficar los delitos por pares:
pairs(x = temp[, c(2:7)])
Claramente en este subconjunto de variables podemos observar algunas en las que se observa una relación.
¿Puedes observar cuáles? ¿Hacen sentido?
La función pairs marca un error cuando intentamos incluir muchas variables (un problema con los márgenes del documento), por lo que intentaremos con ggplot:
variables <- colnames(temp)[-1]
for (i in 1:(length(variables)-1)){
for (j in 1:(length(variables)-i)){
print(
ggplot(
data = temp
, mapping =
aes(x = temp[, variables[i]], y = temp[, variables[i + j]])
) +
geom_point() +
xlab(variables[i]) +
ylab(variables[i + j]) +
theme_minimal()
)
}
}
Explorar de manera visual (ya lo comentamos) no siempre es tan fácil. Para explorar la relación bi-variada entre las variables numéricamente necesitamos una estadística que describa en forma resumida la intensidad de la relación entre las variables. Una manera de hacer esto es mediante una medida del cambio simultáneo en las variables al rededor de sus respectivas medias, la “covarianza”:
\[Cov(X, Y) = \frac{\sum\limits_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{n}\]
De esta manera, estamos evaluando qué tanto las dos variables se “mueven” en conjunto:
Cuando ambas tienen valores por arriba o por abajo de su media de manera simultánea, el valor de la covarianza será positivo y alto;
Cuando ambas se alejan de su media pero en sentidos contrarios (en forma simultánea), el valor de la covarianza será negativo y alto (en valor absoluto);
Si no se mueven en forma coordinada, el valor de la covarianza será “pequeño”.
Un problema de la covarianza, como se puede observar, es que su “tamaño” depende de las unidades de medición, por lo que los términos “pequeña” o “grande” normalmente serán difíciles de valorar (o incluso carecerá de sentido). Por ello, es mucho más común utilizar como referencia a la “correlación”:
\[\rho_{X, Y} = Corr(X, Y) = \frac{Cov(X, Y)}{\sigma_X \sigma_Y}\]
datatable(cor(x = temp[, -1])) %>%
formatRound(columns = 1:ncol(temp[, -1]), digits = 4)
## Warning in cor(x = temp[, -1]): La desviación estándar es cero
temp.cor <- cor(x = temp[, -1])
## Warning in cor(x = temp[, -1]): La desviación estándar es cero
colnames(temp.cor) <- 1:ncol(temp.cor)
rownames(temp.cor) <- 1:nrow(temp.cor)
corrplot::corrplot(corr = temp.cor)
En ocasiones, nos interesa explorar en particular la relación que existe entre dos variables en particular. Por ejemplo, en el contexto de la incidencia delictiva, es particularmente relevante preguntarse sobre la correlación entre el homicidio doloso y el homicidio culposo:
En el agregado nacional:
temp <-
datos.2[
which(
datos.2$Subtipo.de.delito == 'Homicidio doloso' |
datos.2$Subtipo.de.delito == 'Homicidio culposo'
)
,
]
temp <-
aggregate(
x = list(DELITOS = temp$DELITOS)
, by =
list(AÑO = temp$Año, FECHA = temp$FECHA, DELITO = temp$Subtipo.de.delito)
, FUN = sum
)
temp <-
merge(
x = temp
, y =
poblacion[
which(poblacion$ENTIDAD == 'República Mexicana'), c('AÑO', 'POBLACION')
]
, by.x = 'AÑO'
, by.y = 'AÑO'
, all.x = TRUE
)
temp$DELITOS.PC <- 100000*temp$DELITOS/temp$POBLACION
temp <-
dcast(
data = temp
, formula = AÑO + FECHA ~ DELITO
, value.var = 'DELITOS.PC'
, fill = 0
, fun.aggregate = sum
)
cor(x = temp[, c('Homicidio culposo', 'Homicidio doloso')])
## Homicidio culposo Homicidio doloso
## Homicidio culposo 1.0000000 -0.1680071
## Homicidio doloso -0.1680071 1.0000000
ggplot(
data = temp, mapping=aes(x = `Homicidio culposo`, y = `Homicidio doloso`)
) +
geom_point() +
theme_minimal()
ggplot(data = temp, mapping=aes(x = FECHA)) +
geom_line(mapping = aes(y = `Homicidio culposo`)) +
geom_point(mapping = aes(y = `Homicidio culposo`), colour = 'red') +
geom_line(mapping = aes(y = `Homicidio doloso`)) +
geom_point(mapping = aes(y = `Homicidio doloso`), colour = 'blue') +
theme_minimal() +
ylab('Delitos')
Podríamos ahora preguntarnos si esto se ve igual para todos los estados:
temp <-
datos.2[
which(
datos.2$Subtipo.de.delito == 'Homicidio doloso' |
datos.2$Subtipo.de.delito == 'Homicidio culposo'
)
,
]
temp <-
aggregate(
x = list(DELITOS = temp$DELITOS)
, by =
list(
AÑO = temp$Año
, FECHA = temp$FECHA
, ENTIDAD = temp$Entidad
, DELITO = temp$Subtipo.de.delito
)
, FUN = sum
)
# Limpiamos los nombres de algunos estados ...
#
temp$ENTIDAD[which(temp$ENTIDAD == 'Coahuila de Zaragoza')] <- 'Coahuila'
temp$ENTIDAD[which(temp$ENTIDAD == 'Michoacán de Ocampo')] <- 'Michoacán'
temp$ENTIDAD[which(temp$ENTIDAD == 'Veracruz de Ignacio de la Llave')] <-
'Veracruz'
temp <-
merge(
x = temp
, y =
poblacion
, by.x = c('AÑO', 'ENTIDAD')
, by.y = c('AÑO', 'ENTIDAD')
, all.x = TRUE
)
temp$DELITOS.PC <- 100000*temp$DELITOS/temp$POBLACION
temp <-
dcast(
data = temp
, formula = AÑO + FECHA + ENTIDAD ~ DELITO
, value.var = 'DELITOS.PC'
, fill = 0
, fun.aggregate = sum
)
dolosoxculposo <- temp
correlaciones.edo <-
data.frame(ENTIDAD = unique(temp$ENTIDAD), Correlacion = NA)
for (estado in unique(temp$ENTIDAD)){
correlacion <-
cor(
x =
temp[
which(temp$ENTIDAD == estado)
, c('Homicidio doloso', 'Homicidio culposo')
]
)[1, 2]
correlaciones.edo[which(correlaciones.edo$ENTIDAD == estado), 2] <-
correlacion
grafica <-
ggplot(
data = temp[which(temp$ENTIDAD == estado),]
, mapping=aes(x = `Homicidio doloso`, y = `Homicidio culposo`)) +
geom_point() +
labs(title = paste0(estado, ' Correlación = ', correlacion)) +
theme_minimal()
print(grafica)
grafica.2 <-
ggplot(
data = datos.4[which(temp$ENTIDAD == estado),], mapping=aes(x = FECHA)
) +
geom_line(mapping = aes(y = `Homicidio doloso`)) +
geom_point(mapping = aes(y = `Homicidio doloso`), colour = 'red') +
geom_line(mapping = aes(y = `Homicidio culposo`)) +
geom_point(mapping = aes(y = `Homicidio culposo`), colour = 'blue') +
theme_minimal() +
ylab('DELITOS PC')
print(grafica.2)
}
kable(
x =
correlaciones.edo[
order(abs(correlaciones.edo$Correlacion), decreasing = TRUE),
]
, format = 'pandoc'
, row.names = FALSE
)
| ENTIDAD | Correlacion |
|---|---|
| Guerrero | 0.6079509 |
| Oaxaca | 0.5915140 |
| Guanajuato | -0.4133076 |
| Tlaxcala | -0.3358975 |
| Michoacán | -0.3196069 |
| Veracruz | 0.3074882 |
| Hidalgo | -0.2902259 |
| Sonora | -0.2879010 |
| Sinaloa | -0.2828052 |
| Tamaulipas | 0.2776727 |
| Ciudad de México | -0.2706307 |
| Colima | 0.2703573 |
| Quintana Roo | 0.2681828 |
| México | -0.2488043 |
| Baja California | 0.2384470 |
| Jalisco | -0.2148975 |
| Baja California Sur | 0.2041250 |
| Chihuahua | -0.1986439 |
| Durango | 0.1955882 |
| Aguascalientes | -0.1902375 |
| San Luis Potosí | 0.1788637 |
| Zacatecas | 0.1748238 |
| Yucatán | -0.1279814 |
| Puebla | 0.1110302 |
| Coahuila | 0.1077720 |
| Campeche | 0.1007248 |
| Nuevo León | 0.0965263 |
| Chiapas | 0.0944583 |
| Querétaro | 0.0940334 |
| Morelos | -0.0821957 |
| Nayarit | -0.0418621 |
| Tabasco | -0.0327904 |
Casi cualquier técnica de análisis la podemos emplear como técnica de AED.
¿Cuál es el peligro?
Veamos el caso del análisis de regresión lineal. Hacemos un análisis de regresión (digamos lineal y simple) para modelar la relación entre dos variables. Si utilizamos una relación lineal y simple estamos postulando que nuestras variables siguen una relación como la siguiente:
\[Y = \beta_0 + \beta_1 X + \epsilon.\]
Donde \(\epsilon\) representa un error o variación aleatoria.
Lo que estamos haciendo entonces es buscando la línea recta que mejor describa a la relación entre \(X\) y \(Y\). Si lo usáramos como herramienta de AED diríamos que buscamos una referencia para contrastar a nuestros datos y a partir de ahí comenzar a formular nuestras hipótesis.
Retomemos el análisis de la relación entre los homicidios dolosos y los homicidios culposos.
Los datos se ven algo así.
ggplot(data = dolosoxculposo) +
aes(x = `Homicidio doloso`, y = `Homicidio culposo`) +
geom_point() +
geom_smooth(method = 'lm', se = FALSE, formula =y ~ x) +
theme_minimal() +
labs(title = 'Relación entre el homicidio doloso y el homicidio culposo')
ggplot(
data = dolosoxculposo[which(dolosoxculposo$ENTIDAD == 'Ciudad de México'),]
) +
aes(x = `Homicidio doloso`, y = `Homicidio culposo`) +
geom_point() +
geom_smooth(method = 'lm', se = FALSE, formula =y ~ x) +
theme_minimal() +
labs(
title = 'Relación entre el homicidio doloso y el homicidio culposo'
, subtitle = 'CDMX'
)
Recordemos, se trata de un AED, la gráfica de la regresión debe ayudarnos únicamente a formularnos preguntas, no podemos afirmar nada por el momento, y sobre todo no podemos pronunciarnos sobre si la regresión describe apropiadamente la relación entre nuestras variables. Pero al referencia visual puede ayudarnos a formularnos nuevas preguntas sobre nuestros datos.
Otra opción interesante es explorar la relación entre los homicidios dolosos y la densidad poblacional, por ejemplo.
Una técnica extremadamente fértil para el análisis de datos multivariados es el ACP. Desde luego, aquí la usaremos únicamente con fines descriptivos/exploratorios, pero sus aplicaciones son muy extensas.
Con frecuencia el ACP es descrito (muy limitadamente) como una técnica de reducción de dimensionalidad. En realidad, el ACP es una técnica que busca “mapear” un conjunto de \(n\) vectores (variables) a otros \(n\) vectores, con la propiedad de que los nuevos \(n\) vectores transformados sean ortogonales entre sí. En este sentido, no hemos reducido la dimensionalidad del problema ya que como resultado seguimos obteniendo \(n\) nuevas variables o vectores.
La otra particularidad del ACP es que el mapeo o rotación de los vectores tienen dos condiciones o restricciones:
Las nuevas variables sintéticas o rotaciones deben ser transformaciones lineales de las originales.
Estas nuevas variables deben preservar la mayor cantidad de información posible contenida en los datos originales.
2.1. Por “información” se entiende la suma de la varianza de las variables originales.
De esta manera, el ACP proporciona una herramienta para construir índices sintéticos a partir de los datos originales y, si estamos dispuestos perder algo de información, podemos usar un menor número de estos que del número original de variables (reduciendo así al dimensionalidad del problema).
Utilizaremos un ejemplo para explicar la utilidad del ACP para describir a nuestros datos.
Tomemos los delitos ocurridos en la CDMX:
temp <- datos.2[which(datos.2$Entidad == 'Ciudad de México'),]
temp <-
aggregate(
x = list(DELITOS = temp$DELITOS)
, by =
list(AÑO = temp$Año, FECHA = temp$FECHA, DELITO = temp$Subtipo.de.delito)
, FUN = sum
)
temp <-
merge(
x = temp
, y =
poblacion[
which(poblacion$ENTIDAD == 'Ciudad de México'), c('AÑO', 'POBLACION')
]
, by.x = 'AÑO'
, by.y = 'AÑO'
, all.x = TRUE
)
temp$DELITOS.PC <- 100000*temp$DELITOS/temp$POBLACION
temp <-
dcast(
data = temp
, formula = AÑO + FECHA ~ DELITO
, value.var = 'DELITOS.PC'
, fill = 0
, fun.aggregate = sum
)
Hmisc::describe(temp)
## Warning in min(diff(uxinside)): ningún argumento finito para min; retornando
## Inf
## Warning in spikecomp(x, method = "grid", lumptails = lumptails, normalize =
## FALSE, : possible logic error 1 in spikecomp
## Warning in spikecomp(x, method = "grid", lumptails = lumptails, normalize =
## FALSE, : program logic error 2 in spikecomp
## Warning in xrange[freq != 0] <- xrnz: número de elementos para sustituir no es
## un múltiplo de la longitud del reemplazo
## Warning in spikecomp(x, method = "grid", lumptails = lumptails, normalize =
## FALSE, : program logic error in spikecomp; lengths: 2 1
## temp
##
## 57 Variables 127 Observations
## --------------------------------------------------------------------------------
## AÑO
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 11 0.991 2020 2020 3.547 2015
## .10 .25 .50 .75 .90 .95
## 2016 2017 2020 2022 2024 2025
##
## Value 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024 2025
## Frequency 12 12 12 12 12 12 12 12 12 12 7
## Proportion 0.094 0.094 0.094 0.094 0.094 0.094 0.094 0.094 0.094 0.094 0.055
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## FECHA
## n missing distinct Info Mean pMedian Gmd
## 127 0 127 1 2020-04-30 18383 1299
## .05 .10 .25 .50 .75 .90 .95
## 2015-08-09 2016-02-16 2017-09-15 2020-04-30 2022-12-15 2024-07-12 2025-01-21
##
## lowest : 2015-01-31 2015-02-28 2015-03-31 2015-04-30 2015-05-31
## highest: 2025-03-31 2025-04-30 2025-05-31 2025-06-30 2025-07-31
## --------------------------------------------------------------------------------
## Aborto
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 85 1 0.1275 0.1223 0.06481 0.04435
## .10 .25 .50 .75 .90 .95
## 0.06196 0.08834 0.12143 0.16140 0.21208 0.22415
##
## lowest : 0.0332644 0.0333192 0.0441794 0.0442034 0.0443526
## highest: 0.246563 0.255932 0.268978 0.278187 0.336222
## --------------------------------------------------------------------------------
## Abuso de confianza
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 124 1 3.7 3.641 0.9221 2.475
## .10 .25 .50 .75 .90 .95
## 2.776 3.112 3.670 4.020 4.809 5.253
##
## lowest : 1.93184 2.07535 2.13054 2.14158 2.26301
## highest: 5.43069 5.67501 6.10851 6.39728 6.54166
## --------------------------------------------------------------------------------
## Abuso sexual
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 122 1 3.036 3.015 1.415 1.137
## .10 .25 .50 .75 .90 .95
## 1.392 1.762 3.344 4.103 4.557 4.818
##
## lowest : 1.03878 1.04871 1.04926 1.04983 1.05975
## highest: 4.88476 5.085 5.14089 5.1854 5.68717
## --------------------------------------------------------------------------------
## Acoso sexual
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 108 1 0.8778 0.8636 0.7181 0.01104
## .10 .25 .50 .75 .90 .95
## 0.03974 0.26508 0.94118 1.40781 1.68393 1.84238
##
## lowest : 0 0.0110391 0.0110449 0.0220781 0.0331172
## highest: 1.89167 1.99492 2.01733 2.04022 2.30832
## --------------------------------------------------------------------------------
## Allanamiento de morada
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 106 1 0.7393 0.7413 0.1615 0.5014
## .10 .25 .50 .75 .90 .95
## 0.5546 0.6500 0.7404 0.8292 0.9306 0.9774
##
## lowest : 0.342211 0.399173 0.441563 0.443526 0.452839
## highest: 0.990344 0.994838 1.00902 1.044 1.10727
## --------------------------------------------------------------------------------
## Amenazas
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 125 1 13.59 13.57 4.89 7.925
## .10 .25 .50 .75 .90 .95
## 8.424 9.629 13.177 17.738 19.217 20.020
##
## lowest : 6.47993 7.40688 7.47737 7.56573 7.59193
## highest: 21.1487 21.2432 21.2767 21.4846 21.6182
## --------------------------------------------------------------------------------
## Contra el medio ambiente
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 118 1 0.8164 0.8084 0.2797 0.4757
## .10 .25 .50 .75 .90 .95
## 0.5313 0.6235 0.8234 0.9929 1.1159 1.2310
##
## lowest : 0.243939 0.320133 0.321556 0.397615 0.430524
## highest: 1.3047 1.31505 1.35498 1.38253 1.53559
## --------------------------------------------------------------------------------
## Corrupción de menores
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 100 1 0.2359 0.2286 0.1198 0.08843
## .10 .25 .50 .75 .90 .95
## 0.11111 0.15474 0.22145 0.29445 0.37157 0.41111
##
## lowest : 0.0552542 0.0662691 0.077314 0.0883588 0.0884067
## highest: 0.424762 0.445099 0.503008 0.537955 0.648321
## --------------------------------------------------------------------------------
## Daño a la propiedad
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 124 1 9.778 9.842 1.302 7.764
## .10 .25 .50 .75 .90 .95
## 8.634 9.165 9.892 10.451 10.943 11.606
##
## lowest : 4.7679 5.62169 6.2648 6.85526 6.94118
## highest: 11.7028 11.7283 11.7617 11.7902 15.1435
## --------------------------------------------------------------------------------
## Delitos cometidos por servidores públicos
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 124 1 4.168 4.155 1.265 2.358
## .10 .25 .50 .75 .90 .95
## 2.787 3.340 4.273 4.945 5.502 5.954
##
## lowest : 1.98703 2.07643 2.16479 2.18807 2.26301
## highest: 6.12321 6.27823 6.40895 6.75268 6.76887
## --------------------------------------------------------------------------------
## Despojo
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 123 1 3.485 3.502 0.6246 2.540
## .10 .25 .50 .75 .90 .95
## 2.807 3.171 3.510 3.885 4.193 4.257
##
## lowest : 1.90716 2.04223 2.10846 2.1427 2.32851
## highest: 4.36197 4.40924 4.54001 4.70911 4.93422
## --------------------------------------------------------------------------------
## Electorales
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 76 0.987 0.2483 0.04999 0.416 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.01105 0.03326 0.10507 0.60725 1.23866
##
## lowest : 0 0.0110449 0.0110508 0.0110602 0.0110727
## highest: 1.98915 2.11071 2.71624 3.18753 5.25364
## --------------------------------------------------------------------------------
## Evasión de presos
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 34 0.978 0.01433 0.01118 0.01363 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.00000 0.01113 0.02225 0.03322 0.03349
##
## lowest : 0 0.0110391 0.0110449 0.0110508 0.0110602
## highest: 0.0441563 0.0441794 0.0443526 0.0446052 0.0553012
## --------------------------------------------------------------------------------
## Extorsión
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 102 1 0.539 0.4876 0.2783 0.2255
## .10 .25 .50 .75 .90 .95
## 0.2924 0.3801 0.4807 0.5778 0.7994 1.2084
##
## lowest : 0.0997933 0.13353 0.188498 0.210675 0.221763
## highest: 1.42334 1.45696 1.4616 1.513 1.72594
## --------------------------------------------------------------------------------
## Falsedad
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 112 1 0.4953 0.4953 0.1661 0.2685
## .10 .25 .50 .75 .90 .95
## 0.3104 0.3909 0.4973 0.5924 0.6736 0.7372
##
## lowest : 0.0997933 0.12197 0.155489 0.210675 0.233234
## highest: 0.771279 0.793634 0.802894 0.828364 0.883058
## --------------------------------------------------------------------------------
## Falsificación
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 126 1 4.266 4.159 2.5 1.975
## .10 .25 .50 .75 .90 .95
## 2.032 2.327 3.260 5.922 8.002 8.418
##
## lowest : 1.68817 1.70615 1.81766 1.89572 1.91392
## highest: 8.67123 9.02516 9.02854 9.03959 9.11364
## --------------------------------------------------------------------------------
## Feminicidio
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 65 0.999 0.05472 0.05528 0.0305 0.01440
## .10 .25 .50 .75 .90 .95
## 0.02210 0.03342 0.05530 0.07762 0.08892 0.09960
##
## lowest : 0 0.0110391 0.0110449 0.0110508 0.0110602
## highest: 0.100602 0.110391 0.122402 0.155018 0.155489
## --------------------------------------------------------------------------------
## Fraude
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 125 1 15.48 15.5 5.095 9.785
## .10 .25 .50 .75 .90 .95
## 10.097 11.266 14.494 19.789 21.477 22.098
##
## lowest : 7.78387 8.65984 9.03469 9.34901 9.36006
## highest: 22.626 23.585 24.1426 24.4548 24.8563
## --------------------------------------------------------------------------------
## Homicidio culposo
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 106 1 0.6469 0.6423 0.1479 0.4568
## .10 .25 .50 .75 .90 .95
## 0.4946 0.5564 0.6442 0.7190 0.8260 0.8581
##
## lowest : 0.376048 0.376472 0.38657 0.39983 0.433149
## highest: 0.905414 0.916243 0.950126 0.971438 0.994037
## --------------------------------------------------------------------------------
## Homicidio doloso
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 106 1 0.8997 0.8743 0.2703 0.6071
## .10 .25 .50 .75 .90 .95
## 0.6477 0.7288 0.8173 1.0519 1.2661 1.3296
##
## lowest : 0.500736 0.581253 0.589756 0.602171 0.607149
## highest: 1.36041 1.44889 1.4616 1.62586 1.73842
## --------------------------------------------------------------------------------
## Hostigamiento sexual
## n missing distinct Info Mean
## 127 0 1 0 0
##
## Value 0
## Frequency 127
## Proportion 1
## --------------------------------------------------------------------------------
## Incesto
## n missing distinct Info Mean pMedian Gmd
## 127 0 3 0.047 0.0001751 0 0.0003475
##
## Value 0.00000000 0.01108814 0.01115131
## Frequency 125 1 1
## Proportion 0.984 0.008 0.008
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## Incumplimiento de obligaciones de asistencia familiar
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 113 1 0.7366 0.7353 0.3054 0.3578
## .10 .25 .50 .75 .90 .95
## 0.4100 0.5165 0.7404 0.9220 1.0668 1.1539
##
## lowest : 0.133058 0.155234 0.210675 0.309687 0.320747
## highest: 1.20389 1.21549 1.25911 1.34747 1.43583
## --------------------------------------------------------------------------------
## Lesiones culposas
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 126 1 4.408 4.444 0.7171 3.278
## .10 .25 .50 .75 .90 .95
## 3.685 4.068 4.465 4.782 5.211 5.364
##
## lowest : 1.95151 2.2398 2.47266 2.92098 2.97162
## highest: 5.51138 5.53347 5.5526 5.77343 5.86482
## --------------------------------------------------------------------------------
## Lesiones dolosas
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 123 1 5.192 5.209 1.07 3.671
## .10 .25 .50 .75 .90 .95
## 3.951 4.522 5.288 5.920 6.307 6.582
##
## lowest : 2.82748 3.09256 3.10979 3.24883 3.30241
## highest: 6.66577 6.88467 7.06149 7.15598 7.24446
## --------------------------------------------------------------------------------
## Narcomenudeo
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 123 1 3.976 3.954 2.109 1.243
## .10 .25 .50 .75 .90 .95
## 1.356 2.613 4.046 4.968 6.055 6.792
##
## lowest : 0.927768 0.982992 1.0824 1.13702 1.13762
## highest: 7.59588 7.62103 7.86162 9.96528 11.1266
## --------------------------------------------------------------------------------
## Otros delitos contra el patrimonio
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 88 0.977 2.56 2.649 1.899 0.000
## .10 .25 .50 .75 .90 .95
## 0.000 0.000 3.210 3.841 4.391 4.669
##
## lowest : 0 1.98371 2.01733 2.1182 2.19665
## highest: 4.71246 4.72805 4.78341 5.27061 5.57733
## --------------------------------------------------------------------------------
## Otros delitos contra la familia
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 61 0.989 0.2512 0.03357 0.3627 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.01107 0.02221 0.65735 0.88148 1.01260
##
## lowest : 0 0.0110602 0.0110727 0.0110881 0.0111064
## highest: 1.04926 1.06088 1.11495 1.1591 1.19284
## --------------------------------------------------------------------------------
## Otros delitos contra la sociedad
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 104 1 1.13 1.094 0.9674 0.01104
## .10 .25 .50 .75 .90 .95
## 0.02209 0.07733 1.25740 1.71808 2.10578 2.26958
##
## lowest : 0 0.0110391 0.0110449 0.0220781 0.0220897
## highest: 2.32527 2.47672 2.48783 2.51701 5.87674
## --------------------------------------------------------------------------------
## Otros delitos del Fuero Común
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 125 1 7.782 7.834 2.656 3.994
## .10 .25 .50 .75 .90 .95
## 4.448 5.972 8.171 9.316 10.750 11.245
##
## lowest : 2.28416 2.39504 3.07141 3.5061 3.63882
## highest: 11.5419 11.6034 11.7816 12.1438 12.558
## --------------------------------------------------------------------------------
## Otros delitos que atentan contra la libertad personal
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 113 1 1.35 1.351 0.5758 0.5696
## .10 .25 .50 .75 .90 .95
## 0.6406 0.8785 1.4121 1.7143 1.9690 2.0423
##
## lowest : 0.463641 0.496758 0.519108 0.540914 0.541198
## highest: 2.18132 2.1924 2.28098 2.40278 2.74603
## --------------------------------------------------------------------------------
## Otros delitos que atentan contra la libertad y la seguridad sexual
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 84 0.999 0.7816 0.8104 0.8557 0.00000
## .10 .25 .50 .75 .90 .95
## 0.01104 0.02208 0.56550 1.58774 1.74373 1.89843
##
## lowest : 0 0.0110391 0.0110449 0.0110508 0.0110602
## highest: 2.04745 2.05184 2.1076 2.13499 2.1476
## --------------------------------------------------------------------------------
## Otros delitos que atentan contra la vida y la integridad corporal
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 80 0.977 0.5609 0.542 0.5279 0.0000
## .10 .25 .50 .75 .90 .95
## 0.0000 0.0000 0.7079 0.9903 1.1074 1.1799
##
## lowest : 0 0.077509 0.0885817 0.110727 0.1218
## highest: 1.20693 1.2574 1.28834 1.28885 1.29551
## --------------------------------------------------------------------------------
## Otros robos
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 127 1 24.48 23.94 5.755 18.29
## .10 .25 .50 .75 .90 .95
## 18.94 20.66 24.10 26.90 29.57 32.54
##
## lowest : 11.6758 12.6959 15.1575 17.2818 17.5396
## highest: 40.0703 44.7117 44.8222 46.3914 48.4027
## --------------------------------------------------------------------------------
## Rapto
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 19 0.74 0.005419 0.00553 0.007714 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.00000 0.00000 0.01109 0.02208 0.02218
##
## 0 (81, 0.638), 0.0110390701393815 (3, 0.024), 0.0110448542576256 (2, 0.016),
## 0.0110508398306746 (2, 0.016), 0.0110602401509944 (3, 0.024), 0.011072709723489
## (3, 0.024), 0.0110881401807034 (2, 0.016), 0.0111063884279429 (4, 0.031),
## 0.0111274635369711 (2, 0.016), 0.0111513078588396 (6, 0.047),
## 0.0111779502858425 (5, 0.039), 0.022078140278763 (1, 0.008), 0.0220897085152513
## (1, 0.008), 0.0221454194469779 (1, 0.008), 0.0221762803614068 (5, 0.039),
## 0.0222127768558858 (2, 0.016), 0.0222549270739422 (2, 0.016),
## 0.0333191652838288 (1, 0.008), 0.0333823906109133 (1, 0.008)
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## Robo a casa habitación
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 120 1 4.556 4.554 1.817 2.439
## .10 .25 .50 .75 .90 .95
## 2.680 3.153 4.009 5.978 6.665 7.173
##
## lowest : 2.12941 2.20654 2.36177 2.40959 2.41444
## highest: 7.30799 7.31566 7.46566 7.53202 7.75323
## --------------------------------------------------------------------------------
## Robo a institución bancaria
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 43 0.988 0.01876 0.01663 0.01824 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.01104 0.01115 0.03312 0.04419 0.04440
##
## lowest : 0 0.0110391 0.0110449 0.0110508 0.0110602
## highest: 0.0553635 0.066305 0.0665288 0.077509 0.0885817
## --------------------------------------------------------------------------------
## Robo a negocio
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 123 1 13.68 13.44 4.326 8.741
## .10 .25 .50 .75 .90 .95
## 9.261 10.655 13.048 16.610 18.811 20.675
##
## lowest : 7.59862 7.62103 7.66807 8.05812 8.36072
## highest: 20.9717 21.7113 22.1676 23.5627 24.8582
## --------------------------------------------------------------------------------
## Robo a transeúnte en espacio abierto al público
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 115 1 1.664 1.662 1.358 0.2131
## .10 .25 .50 .75 .90 .95
## 0.2719 0.4258 1.6300 2.8787 3.1397 3.2737
##
## lowest : 0.132469 0.143583 0.187664 0.198703 0.198807
## highest: 3.55275 3.57626 3.59847 3.62166 3.76507
## --------------------------------------------------------------------------------
## Robo a transeúnte en vía pública
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 126 1 12.31 11.2 5.689 6.695
## .10 .25 .50 .75 .90 .95
## 7.002 8.658 10.622 13.653 21.305 25.457
##
## lowest : 5.65974 5.96234 6.04079 6.52792 6.57875
## highest: 26.7658 27.1308 27.4405 28.0377 29.5308
## --------------------------------------------------------------------------------
## Robo a transportista
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 87 1 0.1288 0.1273 0.09171 0.01118
## .10 .25 .50 .75 .90 .95
## 0.02239 0.06653 0.12166 0.18826 0.24772 0.27291
##
## lowest : 0 0.0111513 0.011178 0.0112074 0.0223559
## highest: 0.275977 0.276818 0.28789 0.29938 0.309687
## --------------------------------------------------------------------------------
## Robo de autopartes
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 125 1 7.134 7.463 2.661 2.501
## .10 .25 .50 .75 .90 .95
## 2.758 6.227 7.654 8.652 9.777 10.320
##
## lowest : 1.413 1.71106 2.28509 2.36236 2.40652
## highest: 10.5714 10.5826 10.6941 10.9394 12.2999
## --------------------------------------------------------------------------------
## Robo de ganado
## n missing distinct Info Mean
## 127 0 1 0 0
##
## Value 0
## Frequency 127
## Proportion 1
## --------------------------------------------------------------------------------
## Robo de maquinaria
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 31 0.963 0.01449 0.0111 0.01594 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.00000 0.01106 0.02215 0.03332 0.04433
##
## lowest : 0 0.0110391 0.0110449 0.0110508 0.0110602
## highest: 0.0444256 0.0553012 0.0665288 0.0666383 0.077617
## --------------------------------------------------------------------------------
## Robo de vehículo automotor
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 126 1 8.912 8.796 3.209 5.354
## .10 .25 .50 .75 .90 .95
## 5.596 6.193 9.227 11.260 12.468 13.244
##
## lowest : 4.19157 4.87312 5.07385 5.09715 5.15202
## highest: 13.5641 13.6041 14.4668 14.688 14.9534
## --------------------------------------------------------------------------------
## Robo en transporte individual
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 120 1 1.984 1.869 1.116 0.9224
## .10 .25 .50 .75 .90 .95
## 1.0187 1.1670 1.6854 2.5649 3.4855 3.9638
##
## lowest : 0.72896 0.735986 0.784518 0.869802 0.903256
## highest: 4.32943 4.47337 4.75019 5.02701 5.25954
## --------------------------------------------------------------------------------
## Robo en transporte público colectivo
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 123 1 4.005 3.631 1.955 1.962
## .10 .25 .50 .75 .90 .95
## 2.090 2.873 3.508 4.285 7.236 8.246
##
## lowest : 1.46897 1.65673 1.70091 1.74084 1.81136
## highest: 8.33942 8.88137 8.90246 9.03533 9.74407
## --------------------------------------------------------------------------------
## Robo en transporte público individual
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 109 1 0.455 0.4538 0.2362 0.1657
## .10 .25 .50 .75 .90 .95
## 0.2099 0.2761 0.4451 0.6397 0.7185 0.7444
##
## lowest : 0.0887051 0.121493 0.121663 0.12197 0.13261
## highest: 0.758289 0.827168 0.852599 0.914407 1.03955
## --------------------------------------------------------------------------------
## Secuestro
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 64 0.999 0.071 0.04971 0.07484 0.01105
## .10 .25 .50 .75 .90 .95
## 0.01118 0.02230 0.04418 0.06658 0.18802 0.27319
##
## lowest : 0 0.0110449 0.0110508 0.0111064 0.0111275
## highest: 0.287566 0.320747 0.332181 0.364988 0.387545
## --------------------------------------------------------------------------------
## Tráfico de menores
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 13 0.435 0.002096 0 0.003551 0.00000
## .10 .25 .50 .75 .90 .95
## 0.00000 0.00000 0.00000 0.00000 0.01105 0.01113
##
## 0 (105, 0.827), 0.0110390701393815 (4, 0.031), 0.0110448542576256 (3, 0.024),
## 0.0110508398306746 (2, 0.016), 0.0110602401509944 (2, 0.016),
## 0.0110881401807034 (1, 0.008), 0.0111063884279429 (2, 0.016),
## 0.0111274635369711 (2, 0.016), 0.0111513078588396 (2, 0.016),
## 0.0111779502858425 (1, 0.008), 0.0112074026239219 (1, 0.008),
## 0.0220897085152513 (1, 0.008), 0.0223559005716851 (1, 0.008)
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
## Trata de personas
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 82 1 0.08826 0.08356 0.0714 0.01104
## .10 .25 .50 .75 .90 .95
## 0.01105 0.03317 0.07825 0.13329 0.18203 0.20748
##
## lowest : 0 0.0110391 0.0110449 0.0110508 0.011178
## highest: 0.210675 0.221454 0.222549 0.232527 0.267059
## --------------------------------------------------------------------------------
## Violación equiparada
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 100 1 0.7141 0.7452 0.7737 0.02210
## .10 .25 .50 .75 .90 .95
## 0.04418 0.07739 0.36540 1.44421 1.74823 1.88438
##
## lowest : 0.0110391 0.0110449 0.0110508 0.0220781 0.0220897
## highest: 1.98493 2.09645 2.18566 2.21911 2.22549
## --------------------------------------------------------------------------------
## Violación simple
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 109 1 0.7886 0.7767 0.3888 0.2431
## .10 .25 .50 .75 .90 .95
## 0.2939 0.5603 0.7509 1.0043 1.2851 1.3964
##
## lowest : 0.176813 0.187864 0.198915 0.209966 0.243118
## highest: 1.43037 1.48207 1.53268 1.54379 1.57055
## --------------------------------------------------------------------------------
## Violencia de género en todas sus modalidades distinta a la violencia familiar
## n missing distinct Info Mean
## 127 0 1 0 0
##
## Value 0
## Frequency 127
## Proportion 1
## --------------------------------------------------------------------------------
## Violencia familiar
## n missing distinct Info Mean pMedian Gmd .05
## 127 0 127 1 25.57 25.59 9.45 14.86
## .10 .25 .50 .75 .90 .95
## 15.86 17.40 25.63 33.19 36.00 37.41
##
## lowest : 9.86893 11.1605 13.567 13.9755 13.9828
## highest: 38.318 38.8846 39.8141 40.903 41.0343
## --------------------------------------------------------------------------------
Si quisiéramos caracterizar o describir a la delincuencia observada en la CDMX en los años registrados seguramente nos costaría trabajo ya que tenemos 55 delitos (columnas) para describirla. Entonces podemos recurrir al ACP para ayudarnos a entender mejor los datos.
Para poder utilizar el ACP, sin embargo, tenemos que tener cuidado de no incluir variables sin variación (recordemos que el ACP maximiza varianza):
# temp <- temp.r
temp.r <- temp
temp <- temp[, 1:2]
for (i in 3:ncol(temp.r)){
if (var(temp.r[, i]) > 0){
temp <- cbind(temp, temp.r[,i])
colnames(temp)[ncol(temp)] <- colnames(temp.r)[i]
}
}
acp.delitos <- prcomp(x = as.matrix(temp[, 3:ncol(temp)]))
summary(acp.delitos)
## Importance of components:
## PC1 PC2 PC3 PC4 PC5 PC6 PC7
## Standard deviation 12.0297 6.4964 4.8489 2.65668 2.15241 1.67246 1.31716
## Proportion of Variance 0.6205 0.1810 0.1008 0.03026 0.01986 0.01199 0.00744
## Cumulative Proportion 0.6205 0.8015 0.9023 0.93255 0.95241 0.96440 0.97184
## PC8 PC9 PC10 PC11 PC12 PC13 PC14
## Standard deviation 1.14837 1.04960 0.7932 0.70471 0.69706 0.6118 0.55657
## Proportion of Variance 0.00565 0.00472 0.0027 0.00213 0.00208 0.0016 0.00133
## Cumulative Proportion 0.97750 0.98222 0.9849 0.98705 0.98913 0.9907 0.99206
## PC15 PC16 PC17 PC18 PC19 PC20 PC21
## Standard deviation 0.51898 0.50144 0.46195 0.40916 0.39237 0.3743 0.33592
## Proportion of Variance 0.00115 0.00108 0.00091 0.00072 0.00066 0.0006 0.00048
## Cumulative Proportion 0.99322 0.99430 0.99521 0.99593 0.99659 0.9972 0.99768
## PC22 PC23 PC24 PC25 PC26 PC27 PC28
## Standard deviation 0.29926 0.28824 0.2644 0.22309 0.21013 0.18078 0.16255
## Proportion of Variance 0.00038 0.00036 0.0003 0.00021 0.00019 0.00014 0.00011
## Cumulative Proportion 0.99806 0.99842 0.9987 0.99893 0.99912 0.99926 0.99937
## PC29 PC30 PC31 PC32 PC33 PC34 PC35
## Standard deviation 0.1513 0.14076 0.13071 0.12385 0.11742 0.09761 0.09545
## Proportion of Variance 0.0001 0.00008 0.00007 0.00007 0.00006 0.00004 0.00004
## Cumulative Proportion 0.9995 0.99955 0.99963 0.99969 0.99975 0.99979 0.99983
## PC36 PC37 PC38 PC39 PC40 PC41 PC42
## Standard deviation 0.09282 0.08719 0.08109 0.07022 0.05776 0.05565 0.03703
## Proportion of Variance 0.00004 0.00003 0.00003 0.00002 0.00001 0.00001 0.00001
## Cumulative Proportion 0.99987 0.99990 0.99993 0.99995 0.99997 0.99998 0.99998
## PC43 PC44 PC45 PC46 PC47 PC48 PC49
## Standard deviation 0.03218 0.03078 0.02876 0.01905 0.01216 0.01018 0.008933
## Proportion of Variance 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.000000
## Cumulative Proportion 0.99999 0.99999 1.00000 1.00000 1.00000 1.00000 1.000000
## PC50 PC51 PC52
## Standard deviation 0.005599 0.003685 0.0008729
## Proportion of Variance 0.000000 0.000000 0.0000000
## Cumulative Proportion 1.000000 1.000000 1.0000000
El summary del ACP nos muestra la “cantidad” de información que cada una de las componentes principales retiene respecto de los datos originales. Podemos ver, por ejemplo, que la primera componente está reteniendo un 45% de la varianza original de los datos.
Ahora, si recordamos la descripción que hicimos del ACP, recordemos que cada componente es una transformación lineal de los datos originales. Esto significa que existe un conjunto (vector) de coeficientes asociado a cada componente:
kable.x <-
data.frame(DELITO = colnames(temp[, 3:ncol(temp)]), COEFICIENTE = acp.delitos$rotation[, 1])
kable.x <- kable.x[order(abs(kable.x$COEFICIENTE), decreasing = TRUE),]
kable(x = kable.x, row.names = FALSE)
| DELITO | COEFICIENTE |
|---|---|
| Violencia familiar | -0.6584536 |
| Fraude | -0.3339660 |
| Amenazas | -0.3332137 |
| Robo a transeúnte en vía pública | 0.3171968 |
| Robo a negocio | 0.2281648 |
| Robo de vehículo automotor | 0.2112864 |
| Otros robos | 0.2080275 |
| Falsificación | 0.1539042 |
| Robo de autopartes | -0.1226887 |
| Robo a casa habitación | 0.1152372 |
| Robo a transeúnte en espacio abierto al público | -0.0943686 |
| Abuso sexual | -0.0841284 |
| Otros delitos contra el patrimonio | -0.0784431 |
| Otros delitos del Fuero Común | -0.0664691 |
| Otros delitos que atentan contra la libertad y la seguridad sexual | -0.0623366 |
| Violación equiparada | -0.0542527 |
| Narcomenudeo | -0.0536366 |
| Otros delitos contra la sociedad | -0.0516790 |
| Acoso sexual | -0.0466585 |
| Robo en transporte público colectivo | 0.0400960 |
| Robo en transporte individual | 0.0378907 |
| Abuso de confianza | -0.0360354 |
| Delitos cometidos por servidores públicos | -0.0342304 |
| Daño a la propiedad | -0.0326542 |
| Lesiones dolosas | 0.0319545 |
| Otros delitos que atentan contra la vida y la integridad corporal | -0.0262426 |
| Despojo | -0.0223656 |
| Otros delitos contra la familia | 0.0196036 |
| Otros delitos que atentan contra la libertad personal | -0.0158516 |
| Robo en transporte público individual | -0.0119960 |
| Incumplimiento de obligaciones de asistencia familiar | -0.0106367 |
| Homicidio doloso | 0.0101936 |
| Electorales | -0.0100363 |
| Lesiones culposas | -0.0096259 |
| Contra el medio ambiente | -0.0060057 |
| Corrupción de menores | -0.0057846 |
| Violación simple | -0.0057235 |
| Falsedad | -0.0047824 |
| Allanamiento de morada | -0.0038159 |
| Robo a transportista | 0.0037445 |
| Secuestro | 0.0033533 |
| Aborto | -0.0024616 |
| Trata de personas | -0.0020042 |
| Homicidio culposo | -0.0010717 |
| Feminicidio | -0.0006042 |
| Robo a institución bancaria | 0.0005008 |
| Extorsión | -0.0004352 |
| Robo de maquinaria | 0.0002305 |
| Rapto | -0.0001223 |
| Tráfico de menores | 0.0000156 |
| Incesto | -0.0000081 |
| Evasión de presos | -0.0000069 |
En este caso, lo que nos está diciendo el ACP, es que el delito de “Violencia Familiar” es el que más influye individualmente en la variabilidad de los datos de la CDMX.
ggplot(data = temp, mapping = aes(x = FECHA, y = `Violencia familiar`)) +
geom_point() +
geom_line() +
theme_minimal()
Y si lo comparamos contra el que menos aporta:
ggplot(data = temp, mapping = aes(x = FECHA, y = `Violencia familiar`)) +
geom_point() +
geom_line() +
geom_point(mapping = aes(y = Incesto)) +
geom_line(mapping = aes(y = Incesto)) +
theme_minimal()
ggplot(data = temp, mapping = aes(x = FECHA, y = Incesto)) +
geom_point() +
geom_line() +
theme_minimal()
Observemos también que entre el que más aporta y el segundo lugar, hay una diferencia de signo. Si bien los signos son asignados de manera arbitraria en el ACP, lo que sí podemos esperar es un comportamiento contrario en ambas variables:
ggplot(data = temp, mapping = aes(x = FECHA, y = `Violencia familiar`)) +
geom_point() +
geom_line() +
geom_point(mapping = aes(y = `Robo a transeúnte en vía pública`)) +
geom_line(mapping = aes(y = `Robo a transeúnte en vía pública`)) +
theme_minimal() +
ylab('DELITOS PC')
¿De qué otra manera podemos ver esto?
cor(x = temp$`Violencia familiar`, y = temp$`Robo a transeúnte en vía pública`)
## [1] -0.527491
Dado que las componentes explican sucesivamente menores proporciones de varianza la interpretación de los coeficientes también se hace un poquito más compleja (se convierten en aportaciones marginales). No vamos a profundizar.
Sin embargo, es relevante revisar dos aspectos adicionales del ACP. En primer lugar es importante observar que la manera en la que presentamos el ACP funciona maximizando la varianza de los datos originales. En ocasiones (probablemente no en el ejemplo que utilizamos) esto no es lo más apropiado. Veamos rápidamente otro conjunto de datos.
pinguinos <- palmerpenguins::penguins
Hmisc::describe(pinguinos)
## pinguinos
##
## 8 Variables 344 Observations
## --------------------------------------------------------------------------------
## species
## n missing distinct
## 344 0 3
##
## Value Adelie Chinstrap Gentoo
## Frequency 152 68 124
## Proportion 0.442 0.198 0.360
## --------------------------------------------------------------------------------
## island
## n missing distinct
## 344 0 3
##
## Value Biscoe Dream Torgersen
## Frequency 168 124 52
## Proportion 0.488 0.360 0.151
## --------------------------------------------------------------------------------
## bill_length_mm
## n missing distinct Info Mean pMedian Gmd .05
## 342 2 164 1 43.92 43.85 6.274 35.70
## .10 .25 .50 .75 .90 .95
## 36.60 39.23 44.45 48.50 50.80 51.99
##
## lowest : 32.1 33.1 33.5 34 34.1, highest: 55.1 55.8 55.9 58 59.6
## --------------------------------------------------------------------------------
## bill_depth_mm
## n missing distinct Info Mean pMedian Gmd .05
## 342 2 80 1 17.15 17.15 2.267 13.9
## .10 .25 .50 .75 .90 .95
## 14.3 15.6 17.3 18.7 19.5 20.0
##
## lowest : 13.1 13.2 13.3 13.4 13.5, highest: 20.7 20.8 21.1 21.2 21.5
## --------------------------------------------------------------------------------
## flipper_length_mm
## n missing distinct Info Mean pMedian Gmd .05
## 342 2 55 0.999 200.9 201 16.03 181.0
## .10 .25 .50 .75 .90 .95
## 185.0 190.0 197.0 213.0 220.9 225.0
##
## lowest : 172 174 176 178 179, highest: 226 228 229 230 231
## --------------------------------------------------------------------------------
## body_mass_g
## n missing distinct Info Mean pMedian Gmd .05
## 342 2 94 1 4202 4175 911.8 3150
## .10 .25 .50 .75 .90 .95
## 3300 3550 4050 4750 5400 5650
##
## lowest : 2700 2850 2900 2925 2975, highest: 5850 5950 6000 6050 6300
## --------------------------------------------------------------------------------
## sex
## n missing distinct
## 333 11 2
##
## Value female male
## Frequency 165 168
## Proportion 0.495 0.505
## --------------------------------------------------------------------------------
## year
## n missing distinct Info Mean pMedian Gmd
## 344 0 3 0.888 2008 2008 0.8919
##
## Value 2007 2008 2009
## Frequency 110 114 120
## Proportion 0.320 0.331 0.349
##
## For the frequency table, variable is rounded to the nearest 0
## --------------------------------------------------------------------------------
kable(x = head(pinguinos), format = 'pandoc')
| species | island | bill_length_mm | bill_depth_mm | flipper_length_mm | body_mass_g | sex | year |
|---|---|---|---|---|---|---|---|
| Adelie | Torgersen | 39.1 | 18.7 | 181 | 3750 | male | 2007 |
| Adelie | Torgersen | 39.5 | 17.4 | 186 | 3800 | female | 2007 |
| Adelie | Torgersen | 40.3 | 18.0 | 195 | 3250 | female | 2007 |
| Adelie | Torgersen | NA | NA | NA | NA | NA | 2007 |
| Adelie | Torgersen | 36.7 | 19.3 | 193 | 3450 | female | 2007 |
| Adelie | Torgersen | 39.3 | 20.6 | 190 | 3650 | male | 2007 |
Si consideramos únicamente las variables numéricas (3 a 6):
acp.pinguinos <- prcomp(x = pinguinos[complete.cases(pinguinos), 3:6])
acp.pinguinos
## Standard deviations (1, .., p=4):
## [1] 805.315753 7.122908 4.019326 1.536512
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## bill_length_mm 0.004003162 -0.31927773 -0.94126475 -0.1098470736
## bill_depth_mm -0.001154327 0.08684753 -0.14449479 0.9856862728
## flipper_length_mm 0.015194547 -0.94354238 0.30518986 0.1278908060
## body_mass_g 0.999875876 0.01571702 -0.00103611 -0.0003657482
summary(acp.pinguinos)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 805.3158 7.12291 4.01933 1.537
## Proportion of Variance 0.9999 0.00008 0.00002 0.000
## Cumulative Proportion 0.9999 0.99997 1.00000 1.000
kable(x = acp.pinguinos$rotation)
| PC1 | PC2 | PC3 | PC4 | |
|---|---|---|---|---|
| bill_length_mm | 0.0040032 | -0.3192777 | -0.9412647 | -0.1098471 |
| bill_depth_mm | -0.0011543 | 0.0868475 | -0.1444948 | 0.9856863 |
| flipper_length_mm | 0.0151945 | -0.9435424 | 0.3051899 | 0.1278908 |
| body_mass_g | 0.9998759 | 0.0157170 | -0.0010361 | -0.0003657 |
¿Qué error cometí en este “análisis”?
¿Qué podemos observar de la variable body_mass_g en comparación con las otras variables?
El ACP con base en la varianza es sensible (muy) a la escala de los datos.
Por eso, con frecuencia se observa que se utiliza el ACP re-escalado para considerar varianzas unitarias (ACP con base en correlaciones).
acp.pinguinos <-
prcomp(x = pinguinos[complete.cases(pinguinos), 3:6], scale. = TRUE)
acp.pinguinos
## Standard deviations (1, .., p=4):
## [1] 1.6569115 0.8821095 0.6071594 0.3284579
##
## Rotation (n x k) = (4 x 4):
## PC1 PC2 PC3 PC4
## bill_length_mm 0.4537532 -0.60019490 -0.6424951 0.1451695
## bill_depth_mm -0.3990472 -0.79616951 0.4258004 -0.1599044
## flipper_length_mm 0.5768250 -0.00578817 0.2360952 -0.7819837
## body_mass_g 0.5496747 -0.07646366 0.5917374 0.5846861
summary(acp.pinguinos)
## Importance of components:
## PC1 PC2 PC3 PC4
## Standard deviation 1.6569 0.8821 0.60716 0.32846
## Proportion of Variance 0.6863 0.1945 0.09216 0.02697
## Cumulative Proportion 0.6863 0.8809 0.97303 1.00000
kable(x = acp.pinguinos$rotation, format = 'pandoc')
| PC1 | PC2 | PC3 | PC4 | |
|---|---|---|---|---|
| bill_length_mm | 0.4537532 | -0.6001949 | -0.6424951 | 0.1451695 |
| bill_depth_mm | -0.3990472 | -0.7961695 | 0.4258004 | -0.1599044 |
| flipper_length_mm | 0.5768250 | -0.0057882 | 0.2360952 | -0.7819837 |
| body_mass_g | 0.5496747 | -0.0764637 | 0.5917374 | 0.5846861 |
Otra manera de “describir” o “explorar” conjuntos de datos multivariados consiste en intentar identificar “grupos” de observaciones en nuestros datos. Existe una gran diversidad de técnicas para hacer esto, aquí hablaremos solo de una: k-medias.
Supongamos que ahora tenemos el dato histórico de homicidios dolosos para todas las entidades y queremos ver si las podemos agrupar por similitud:
temp <- datos.3[which(datos.3$Subtipo.de.delito == 'Homicidio doloso'),]
temp <-
dcast(
data = temp
, formula = Entidad ~ FECHA
, value.var = 'DELITOS.PC'
, fill = 0
, fun.aggregate = sum
)
kable(
x =
temp %>% mutate_at(.vars = 2:ncol(temp), .funs = comma, accuracy = 0.0001)
, row.names = FALSE
, format = 'pandoc'
)
| Entidad | 2015-01-31 | 2015-02-28 | 2015-03-31 | 2015-04-30 | 2015-05-31 | 2015-06-30 | 2015-07-31 | 2015-08-31 | 2015-09-30 | 2015-10-31 | 2015-11-30 | 2015-12-31 | 2016-01-31 | 2016-02-28 | 2016-03-31 | 2016-04-30 | 2016-05-31 | 2016-06-30 | 2016-07-31 | 2016-08-31 | 2016-09-30 | 2016-10-31 | 2016-11-30 | 2016-12-31 | 2017-01-31 | 2017-02-28 | 2017-03-31 | 2017-04-30 | 2017-05-31 | 2017-06-30 | 2017-07-31 | 2017-08-31 | 2017-09-30 | 2017-10-31 | 2017-11-30 | 2017-12-31 | 2018-01-31 | 2018-02-28 | 2018-03-31 | 2018-04-30 | 2018-05-31 | 2018-06-30 | 2018-07-31 | 2018-08-31 | 2018-09-30 | 2018-10-31 | 2018-11-30 | 2018-12-31 | 2019-01-31 | 2019-02-28 | 2019-03-31 | 2019-04-30 | 2019-05-31 | 2019-06-30 | 2019-07-31 | 2019-08-31 | 2019-09-30 | 2019-10-31 | 2019-11-30 | 2019-12-31 | 2020-01-31 | 2020-02-28 | 2020-03-31 | 2020-04-30 | 2020-05-31 | 2020-06-30 | 2020-07-31 | 2020-08-31 | 2020-09-30 | 2020-10-31 | 2020-11-30 | 2020-12-31 | 2021-01-31 | 2021-02-28 | 2021-03-31 | 2021-04-30 | 2021-05-31 | 2021-06-30 | 2021-07-31 | 2021-08-31 | 2021-09-30 | 2021-10-31 | 2021-11-30 | 2021-12-31 | 2022-01-31 | 2022-02-28 | 2022-03-31 | 2022-04-30 | 2022-05-31 | 2022-06-30 | 2022-07-31 | 2022-08-31 | 2022-09-30 | 2022-10-31 | 2022-11-30 | 2022-12-31 | 2023-01-31 | 2023-02-28 | 2023-03-31 | 2023-04-30 | 2023-05-31 | 2023-06-30 | 2023-07-31 | 2023-08-31 | 2023-09-30 | 2023-10-31 | 2023-11-30 | 2023-12-31 | 2024-01-31 | 2024-02-28 | 2024-03-31 | 2024-04-30 | 2024-05-31 | 2024-06-30 | 2024-07-31 | 2024-08-31 | 2024-09-30 | 2024-10-31 | 2024-11-30 | 2024-12-31 | 2025-01-31 | 2025-02-28 | 2025-03-31 | 2025-04-30 | 2025-05-31 | 2025-06-30 | 2025-07-31 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Aguascalientes | 0.4505 | 0.0751 | 0.3003 | 0.3003 | 0.3003 | 0.3003 | 0.1502 | 0.2253 | 0.3003 | 0.1502 | 0.1502 | 0.1502 | 0.0000 | 0.2213 | 0.5165 | 0.3689 | 0.3689 | 0.2213 | 0.0738 | 0.1476 | 0.2951 | 0.2951 | 0.1476 | 0.2213 | 0.3634 | 0.1454 | 0.2907 | 0.4361 | 0.7269 | 0.8722 | 0.2181 | 0.7269 | 0.7269 | 0.6542 | 0.3634 | 0.4361 | 0.6448 | 0.5015 | 0.3582 | 0.5732 | 0.6448 | 0.4299 | 0.2866 | 0.3582 | 0.7164 | 0.2149 | 0.3582 | 0.2866 | 0.6359 | 0.4946 | 0.6359 | 0.4239 | 0.7065 | 0.4239 | 0.3533 | 0.1413 | 0.7772 | 0.7772 | 0.4946 | 0.5652 | 0.2788 | 0.6273 | 0.4879 | 0.2788 | 0.7667 | 0.5576 | 0.6970 | 0.4182 | 0.1394 | 0.2788 | 0.3485 | 0.1394 | 0.2064 | 0.3440 | 0.4128 | 0.3440 | 0.4816 | 0.4816 | 0.4128 | 0.6192 | 0.2752 | 0.8256 | 0.1376 | 0.6192 | 0.4076 | 0.2038 | 0.3397 | 0.1359 | 0.2718 | 0.5435 | 0.4756 | 0.6115 | 0.5435 | 0.5435 | 0.2718 | 0.4076 | 0.3356 | 0.4698 | 0.8054 | 0.4027 | 0.1342 | 0.6712 | 0.3356 | 0.6041 | 0.4698 | 0.2685 | 0.6041 | 0.6041 | 0.3980 | 0.1990 | 0.7960 | 0.5970 | 0.9287 | 0.8624 | 1.1941 | 0.6634 | 0.6634 | 0.5970 | 0.1990 | 0.3317 | 0.7871 | 0.7215 | 0.4591 | 0.3279 | 0.4591 | 0.4591 | 0.6559 |
| Baja California | 1.4593 | 1.6678 | 1.6678 | 1.7869 | 2.2336 | 2.2634 | 2.1443 | 2.2932 | 2.5612 | 2.0251 | 2.3230 | 2.0251 | 2.5563 | 2.0862 | 2.5857 | 2.2037 | 2.8795 | 2.3800 | 3.0558 | 2.3800 | 3.7023 | 2.9383 | 3.6435 | 3.9079 | 3.7252 | 3.6097 | 4.3605 | 4.2162 | 5.3424 | 5.3713 | 5.0247 | 5.6889 | 6.6419 | 5.9488 | 5.1402 | 5.1114 | 6.0206 | 5.1970 | 5.9070 | 6.8158 | 6.7874 | 6.2478 | 7.7245 | 6.8726 | 6.7874 | 7.2418 | 7.1850 | 6.6738 | 6.5389 | 5.1417 | 5.0579 | 5.4212 | 6.4551 | 6.7346 | 7.2655 | 6.9302 | 5.9521 | 6.0918 | 6.0639 | 5.1697 | 5.3097 | 4.6769 | 6.1900 | 6.0525 | 6.6027 | 5.4197 | 6.7403 | 6.8778 | 6.3001 | 5.6673 | 6.1900 | 6.3001 | 6.6122 | 5.8805 | 6.5038 | 6.4767 | 6.8290 | 6.5309 | 6.8290 | 6.3683 | 5.2843 | 4.7694 | 5.3114 | 4.9591 | 5.3413 | 4.0060 | 4.9941 | 5.1810 | 5.6885 | 6.1425 | 6.1158 | 5.4748 | 5.4214 | 5.9555 | 4.6736 | 5.0742 | 4.6082 | 3.7392 | 4.0025 | 4.3448 | 5.0821 | 4.8188 | 4.9241 | 5.2665 | 4.6345 | 4.8978 | 4.9768 | 4.4238 | 4.4939 | 4.8575 | 4.2860 | 5.0653 | 4.7536 | 4.5458 | 4.7276 | 4.6497 | 4.9874 | 4.2081 | 3.8704 | 3.8185 | 4.4351 | 3.4097 | 3.4609 | 2.7175 | 2.9995 | 3.5891 | 3.2815 |
| Baja California Sur | 2.3616 | 0.9724 | 1.1113 | 2.2227 | 2.2227 | 0.8335 | 1.5281 | 3.1951 | 4.0286 | 0.8335 | 0.9724 | 0.6946 | 1.2212 | 0.5427 | 0.8141 | 1.6282 | 1.3569 | 2.3067 | 1.6282 | 3.9349 | 4.2063 | 3.3922 | 4.3420 | 3.9349 | 6.2312 | 5.9660 | 8.2199 | 1.8561 | 3.4470 | 4.5077 | 5.3031 | 5.0380 | 6.3638 | 13.9207 | 11.9321 | 8.0873 | 4.5378 | 2.3337 | 3.1117 | 1.8151 | 1.5558 | 0.7779 | 0.7779 | 1.8151 | 2.5930 | 0.6483 | 0.5186 | 0.5186 | 1.6495 | 0.6344 | 1.6495 | 1.1420 | 0.7613 | 0.3807 | 0.6344 | 0.8882 | 0.7613 | 0.8882 | 0.6344 | 0.2538 | 0.7456 | 0.2485 | 0.2485 | 0.3728 | 0.8699 | 0.6213 | 0.7456 | 0.9941 | 0.3728 | 0.6213 | 0.6213 | 1.2427 | 0.7308 | 0.1218 | 0.8526 | 0.6090 | 0.7308 | 0.3654 | 0.3654 | 0.4872 | 0.4872 | 0.0000 | 0.0000 | 1.0961 | 0.4778 | 0.3584 | 0.3584 | 0.3584 | 0.5973 | 0.3584 | 0.2389 | 0.3584 | 0.7167 | 0.3584 | 0.0000 | 0.4778 | 0.3517 | 0.1172 | 0.5861 | 0.3517 | 0.3517 | 0.1172 | 0.1172 | 0.0000 | 0.1172 | 0.1172 | 0.0000 | 0.5861 | 0.0000 | 0.4605 | 0.6907 | 0.8059 | 0.9210 | 0.5756 | 0.4605 | 0.3454 | 0.9210 | 0.6907 | 0.4605 | 0.1151 | 0.1131 | 0.5656 | 0.4525 | 0.7919 | 1.1313 | 2.6020 | 1.8101 |
| Campeche | 0.2181 | 0.3272 | 0.9816 | 0.4363 | 0.7635 | 0.5454 | 0.0000 | 0.3272 | 0.3272 | 0.4363 | 0.3272 | 0.6544 | 1.2856 | 0.3214 | 0.4285 | 0.7499 | 0.7499 | 0.5357 | 0.8570 | 0.8570 | 0.6428 | 0.7499 | 0.7499 | 0.7499 | 0.7365 | 0.6313 | 0.8417 | 0.6313 | 0.5261 | 0.8417 | 0.3156 | 0.7365 | 0.5261 | 0.3156 | 0.4208 | 0.4208 | 0.4135 | 0.7236 | 0.2068 | 0.3101 | 0.4135 | 1.0338 | 0.6203 | 0.9304 | 0.5169 | 0.5169 | 0.7236 | 0.7236 | 0.3049 | 0.5081 | 0.2032 | 0.4065 | 0.9146 | 0.5081 | 0.7113 | 1.2195 | 0.6097 | 1.1178 | 0.3049 | 0.6097 | 0.3998 | 0.8994 | 0.7995 | 0.2998 | 0.5996 | 0.4997 | 0.6996 | 0.8994 | 0.6996 | 0.8994 | 0.1999 | 0.7995 | 0.4916 | 1.0816 | 0.5900 | 0.2950 | 1.1799 | 0.4916 | 0.6883 | 1.4749 | 0.8849 | 0.3933 | 0.0983 | 0.6883 | 0.4839 | 0.3871 | 0.2904 | 0.1936 | 1.0646 | 0.8711 | 0.8711 | 0.0968 | 0.6775 | 0.7743 | 1.4518 | 1.2582 | 0.9531 | 0.3812 | 0.8578 | 0.7625 | 1.1437 | 0.7625 | 0.5718 | 0.6671 | 0.6671 | 0.8578 | 0.9531 | 0.3812 | 1.0328 | 0.3756 | 0.7511 | 0.9389 | 0.5633 | 0.5633 | 0.4695 | 1.2206 | 0.3756 | 0.8450 | 1.0328 | 0.7511 | 0.5552 | 1.2955 | 1.1104 | 1.0179 | 0.6477 | 0.4627 | 1.0179 |
| Chiapas | 0.6971 | 0.7536 | 0.6029 | 0.9043 | 0.7536 | 0.7159 | 0.6406 | 1.0739 | 0.9985 | 0.8478 | 0.7536 | 0.7159 | 0.6674 | 0.6303 | 0.7416 | 0.6489 | 0.6303 | 0.7416 | 0.7230 | 0.7416 | 0.7045 | 0.9270 | 0.8157 | 0.7045 | 0.8395 | 0.8395 | 0.7665 | 0.7848 | 0.6935 | 0.8213 | 0.6205 | 0.7483 | 0.7118 | 0.6205 | 0.5658 | 0.6570 | 0.7369 | 0.8268 | 0.9166 | 0.8987 | 0.9346 | 0.7728 | 1.0245 | 0.8088 | 0.9526 | 0.7908 | 0.7369 | 0.7010 | 0.8676 | 0.8322 | 0.6197 | 0.7437 | 0.6729 | 0.7968 | 0.8145 | 0.6374 | 0.9739 | 0.5489 | 0.9208 | 0.8676 | 0.6631 | 0.6108 | 0.4712 | 0.5759 | 0.5584 | 0.6980 | 0.7329 | 0.8376 | 0.5061 | 0.6282 | 0.5759 | 0.4537 | 0.7054 | 0.4473 | 0.8946 | 0.6710 | 0.6538 | 0.8086 | 0.6538 | 0.4301 | 0.5505 | 0.6710 | 0.3785 | 0.5161 | 0.4751 | 0.6278 | 0.6448 | 0.6278 | 0.5090 | 0.4751 | 0.5939 | 0.4921 | 0.3903 | 0.3733 | 0.5939 | 0.5939 | 0.6863 | 0.3850 | 0.6361 | 0.7198 | 0.6026 | 0.5022 | 0.8035 | 0.8370 | 0.7031 | 1.0044 | 0.7700 | 0.7198 | 0.7434 | 0.8590 | 1.0903 | 1.2390 | 1.0903 | 0.8756 | 0.9582 | 1.0242 | 0.8095 | 0.8425 | 0.7104 | 0.6938 | 0.5219 | 0.3751 | 0.5545 | 0.4077 | 0.5545 | 0.4892 | 0.4729 |
| Chihuahua | 2.5992 | 2.4057 | 2.2950 | 1.7420 | 2.4057 | 2.7375 | 2.3227 | 2.6822 | 1.6314 | 1.9356 | 1.6591 | 1.7144 | 2.1099 | 1.7537 | 2.0551 | 2.4661 | 3.0142 | 2.6306 | 2.8498 | 3.2060 | 3.4526 | 4.3295 | 2.9046 | 2.9868 | 3.2797 | 3.9302 | 3.1984 | 2.7105 | 3.7676 | 4.6078 | 2.9002 | 3.2255 | 3.6049 | 3.6591 | 3.4965 | 4.0657 | 3.3262 | 2.9507 | 3.0311 | 3.1116 | 5.2307 | 5.5794 | 5.7135 | 5.9013 | 3.6213 | 2.7897 | 3.7286 | 3.5408 | 4.3024 | 4.0103 | 4.5946 | 4.6742 | 5.5506 | 5.4444 | 5.4710 | 4.9398 | 4.8070 | 4.9929 | 5.2585 | 3.8775 | 4.2615 | 4.5509 | 5.8924 | 5.8135 | 5.1033 | 5.9713 | 5.6031 | 6.4185 | 4.2615 | 4.8928 | 3.7091 | 3.9195 | 4.1705 | 3.9619 | 4.5875 | 4.4572 | 5.5259 | 4.7178 | 5.1609 | 5.0827 | 3.7273 | 3.8837 | 3.9619 | 4.4572 | 2.9454 | 2.8938 | 2.7904 | 2.8938 | 3.9789 | 4.2115 | 4.5474 | 4.7282 | 3.7981 | 4.0048 | 3.2297 | 2.8938 | 3.6125 | 3.8431 | 4.1505 | 2.9720 | 4.4323 | 3.4331 | 3.7662 | 4.1505 | 4.0993 | 3.3563 | 3.7662 | 3.5869 | 4.0917 | 3.1260 | 3.1260 | 3.4055 | 4.2188 | 4.0917 | 3.7359 | 3.3547 | 3.4309 | 3.7105 | 3.4055 | 3.2276 | 3.2532 | 2.7993 | 3.8081 | 2.9254 | 3.0767 | 3.2785 | 3.9594 |
| Ciudad de México | 0.6071 | 0.6623 | 0.6071 | 0.7838 | 0.8610 | 0.7507 | 0.7838 | 0.7396 | 0.7507 | 0.7286 | 0.7838 | 0.7507 | 0.7179 | 0.7290 | 0.7621 | 0.7731 | 0.7952 | 0.8063 | 0.8173 | 0.7511 | 0.9830 | 0.9057 | 0.8505 | 1.1155 | 1.0167 | 0.7625 | 0.7846 | 0.9835 | 1.1161 | 1.0388 | 0.8620 | 0.9614 | 1.0609 | 1.0498 | 0.8951 | 1.0498 | 0.8185 | 1.2719 | 1.3051 | 1.4489 | 1.2719 | 1.3604 | 1.3272 | 1.2056 | 1.1060 | 1.2166 | 1.1281 | 1.6259 | 1.4616 | 1.2512 | 1.7384 | 1.2623 | 1.7384 | 1.2955 | 1.2734 | 1.0519 | 1.0298 | 1.0519 | 1.1737 | 1.1294 | 1.1753 | 1.0534 | 1.3306 | 1.2308 | 1.0645 | 1.0645 | 0.9979 | 0.8094 | 0.8094 | 1.0534 | 0.9314 | 0.9868 | 0.9440 | 0.8885 | 0.8774 | 0.8219 | 1.1106 | 0.6997 | 0.9218 | 0.8663 | 0.7774 | 0.6553 | 0.8663 | 0.7997 | 0.5007 | 0.5007 | 0.6231 | 0.6454 | 0.7567 | 0.5898 | 0.7010 | 0.7344 | 0.5898 | 0.6676 | 0.8346 | 0.7455 | 0.6914 | 0.6022 | 0.9144 | 0.6579 | 0.7248 | 0.8252 | 0.6579 | 0.6802 | 0.6468 | 0.6802 | 0.7694 | 0.8363 | 0.5813 | 0.7825 | 0.8719 | 0.8160 | 0.9166 | 0.6707 | 0.6819 | 0.6483 | 0.8160 | 0.7713 | 0.7825 | 0.7489 | 0.6388 | 0.6724 | 0.8069 | 0.7845 | 0.6388 | 0.7061 | 0.6724 |
| Coahuila | 1.6997 | 0.6999 | 1.0665 | 0.7332 | 0.7999 | 0.4666 | 0.7665 | 0.6999 | 0.4999 | 0.3999 | 0.5666 | 0.8665 | 0.5586 | 0.4929 | 0.5586 | 0.7558 | 1.0516 | 0.5586 | 0.5586 | 0.4601 | 0.4929 | 0.4601 | 0.4601 | 0.5586 | 0.6153 | 0.6477 | 0.5182 | 0.7772 | 0.7449 | 0.6801 | 0.8096 | 0.2267 | 0.6153 | 0.4534 | 0.5505 | 0.5505 | 0.7344 | 0.4789 | 0.4470 | 0.6066 | 0.7024 | 0.7344 | 0.5428 | 0.5747 | 0.7024 | 0.4470 | 0.6386 | 0.6705 | 0.9132 | 0.5983 | 0.6298 | 0.5353 | 0.6928 | 0.5038 | 0.6298 | 0.4409 | 0.6613 | 0.4094 | 0.4409 | 0.5038 | 0.8078 | 0.3728 | 0.6524 | 0.3418 | 0.2796 | 0.6524 | 0.6835 | 0.4971 | 0.4350 | 0.4660 | 0.6214 | 0.2175 | 0.4599 | 0.2760 | 0.2760 | 0.4599 | 0.3066 | 0.4293 | 0.4293 | 0.2453 | 0.4293 | 0.2146 | 0.3986 | 0.2760 | 0.3330 | 0.2119 | 0.3330 | 0.4844 | 0.3633 | 0.2422 | 0.3936 | 0.1816 | 0.4238 | 0.3027 | 0.2422 | 0.3936 | 0.2691 | 0.2691 | 0.2392 | 0.2990 | 0.2392 | 0.2990 | 0.4784 | 0.3289 | 0.3588 | 0.2990 | 0.2990 | 0.0897 | 0.2068 | 0.1772 | 0.1477 | 0.1477 | 0.3545 | 0.2954 | 0.2068 | 0.2954 | 0.3545 | 0.2068 | 0.3249 | 0.3840 | 0.2335 | 0.1751 | 0.1460 | 0.2043 | 0.1460 | 0.2627 | 0.0584 |
| Colima | 1.1085 | 1.2471 | 1.5242 | 0.9699 | 1.6627 | 1.5242 | 1.1085 | 1.2471 | 2.7712 | 2.0784 | 3.1869 | 4.0183 | 3.8113 | 5.3086 | 6.2614 | 7.2142 | 5.0363 | 4.2196 | 5.8530 | 5.4447 | 5.4447 | 5.3086 | 6.5336 | 7.8948 | 9.2295 | 4.5479 | 6.4205 | 4.4141 | 6.9556 | 10.4333 | 10.9684 | 7.3568 | 6.4205 | 8.5607 | 7.8919 | 10.1658 | 7.3652 | 6.7076 | 6.8391 | 6.0500 | 6.4445 | 6.8391 | 5.3924 | 6.4445 | 6.7076 | 9.0750 | 6.9706 | 6.3130 | 7.6342 | 5.8227 | 6.2108 | 6.7284 | 7.6342 | 6.4696 | 7.8929 | 7.5048 | 7.7636 | 6.4696 | 8.0223 | 7.3754 | 7.3871 | 7.1324 | 6.2408 | 6.8776 | 6.3682 | 5.3493 | 4.3304 | 3.6935 | 4.9672 | 5.8587 | 5.8587 | 5.2219 | 6.1462 | 6.0207 | 4.8918 | 4.6410 | 4.6410 | 5.2681 | 5.0173 | 4.5156 | 4.8918 | 4.7664 | 3.7630 | 4.8918 | 3.9549 | 7.1683 | 10.1345 | 8.6514 | 9.1458 | 6.7976 | 5.8088 | 7.7863 | 8.2807 | 9.3930 | 6.7976 | 7.2919 | 7.6757 | 5.2390 | 7.6757 | 8.0412 | 9.5033 | 6.4573 | 8.5286 | 9.1377 | 9.5033 | 7.5539 | 8.5286 | 8.6504 | 7.0897 | 4.6864 | 6.0082 | 10.6946 | 9.0123 | 8.5316 | 7.6905 | 6.9695 | 7.2098 | 7.0897 | 9.3728 | 5.6477 | 6.1656 | 4.3871 | 6.4028 | 4.6242 | 5.4542 | 6.2842 | 6.1656 |
| Durango | 0.9542 | 1.1226 | 1.7400 | 1.5716 | 1.1787 | 1.0665 | 1.2349 | 0.8420 | 0.7297 | 0.7858 | 0.7858 | 1.2349 | 0.3885 | 0.8324 | 1.4984 | 0.6104 | 1.1099 | 1.5539 | 1.2764 | 1.1654 | 1.0544 | 1.1099 | 1.0544 | 1.4429 | 0.8244 | 0.9893 | 0.9893 | 1.1542 | 1.0442 | 0.9343 | 0.7145 | 1.3740 | 0.7694 | 0.8244 | 1.0442 | 1.2091 | 0.6534 | 0.9801 | 0.8712 | 0.3812 | 0.9801 | 1.1980 | 0.9257 | 0.7623 | 0.5990 | 0.7623 | 0.7079 | 0.9801 | 0.2698 | 0.8095 | 0.5936 | 0.6476 | 1.0254 | 0.4317 | 1.1333 | 0.7556 | 0.4857 | 0.6476 | 0.4857 | 0.8095 | 0.1605 | 0.7491 | 0.6421 | 0.8561 | 0.6956 | 0.3745 | 1.0166 | 1.0166 | 0.6421 | 0.6421 | 0.3210 | 0.5350 | 0.5306 | 0.5837 | 0.9020 | 0.5837 | 0.7429 | 0.5306 | 0.3714 | 0.3184 | 0.7959 | 0.5837 | 0.4775 | 0.3714 | 0.4737 | 0.4211 | 0.3684 | 0.5790 | 0.5790 | 0.5790 | 0.5790 | 0.5790 | 0.4737 | 0.6316 | 0.4211 | 0.3684 | 0.4700 | 0.4178 | 0.3656 | 0.3656 | 0.3656 | 0.3656 | 0.4700 | 0.4178 | 0.2611 | 0.1567 | 0.1045 | 0.3134 | 0.4147 | 0.1555 | 0.1037 | 0.3110 | 0.2592 | 0.4147 | 0.3629 | 0.3110 | 0.2592 | 0.2592 | 0.2592 | 0.2073 | 0.1544 | 0.2573 | 0.1544 | 0.3088 | 0.2573 | 0.2573 | 0.4117 |
| Guanajuato | 1.0454 | 1.0791 | 0.9948 | 1.1466 | 1.1129 | 1.3827 | 1.0117 | 1.5344 | 1.4838 | 1.4501 | 1.1466 | 1.1635 | 1.0004 | 0.9671 | 1.2005 | 1.1338 | 1.4506 | 1.5173 | 1.5006 | 1.4840 | 1.4673 | 1.4173 | 1.3506 | 1.3005 | 1.4525 | 1.4690 | 1.3369 | 1.4525 | 1.4855 | 1.4525 | 1.4360 | 1.4195 | 1.3369 | 1.9311 | 1.6010 | 1.5185 | 2.8117 | 2.5502 | 3.6618 | 3.5310 | 3.8743 | 3.2368 | 3.6618 | 3.9887 | 4.2993 | 3.7272 | 3.3512 | 3.9561 | 3.6445 | 4.1142 | 4.0170 | 3.8227 | 3.5311 | 3.2719 | 2.9966 | 3.5959 | 3.5311 | 4.0008 | 4.2924 | 4.1304 | 4.9453 | 4.1264 | 4.5278 | 4.4315 | 4.5278 | 4.5920 | 4.6402 | 4.3351 | 4.9292 | 4.6081 | 4.4475 | 3.8213 | 4.0442 | 3.4551 | 4.3308 | 4.4104 | 3.9805 | 3.1685 | 3.8531 | 3.4551 | 3.5187 | 3.8053 | 3.4391 | 3.4869 | 3.0642 | 2.8589 | 3.8382 | 2.9537 | 3.6486 | 3.5223 | 3.7592 | 3.1116 | 3.7592 | 3.8540 | 3.6328 | 3.6012 | 3.3544 | 3.5895 | 3.6365 | 3.4328 | 3.6679 | 4.0911 | 3.4014 | 2.8371 | 3.7149 | 3.0252 | 2.8685 | 2.8371 | 3.3612 | 2.8788 | 3.2523 | 3.5635 | 2.7543 | 3.2679 | 3.2056 | 3.0811 | 3.6258 | 3.9837 | 3.1900 | 3.5635 | 4.4507 | 4.3734 | 3.8480 | 2.4726 | 2.2717 | 2.0090 | 2.0090 |
| Guerrero | 3.8584 | 3.9143 | 4.3337 | 5.4242 | 4.8929 | 3.9423 | 5.0048 | 5.5640 | 4.5574 | 4.6692 | 4.8370 | 5.3682 | 4.6146 | 4.4478 | 5.2261 | 4.9481 | 4.5868 | 5.4207 | 5.9767 | 6.0323 | 4.7258 | 4.9481 | 5.8933 | 4.6980 | 4.5653 | 4.8143 | 5.7827 | 5.1740 | 5.9210 | 5.6720 | 5.2847 | 5.2016 | 5.1186 | 5.4507 | 5.3123 | 5.6167 | 5.6202 | 4.5182 | 5.6478 | 5.5376 | 5.4549 | 5.0141 | 5.2070 | 4.8488 | 5.1794 | 4.7111 | 4.7937 | 4.6835 | 3.8968 | 3.7047 | 3.1559 | 3.0461 | 4.0341 | 3.8145 | 4.2536 | 3.7047 | 2.5796 | 3.5675 | 3.7871 | 3.8145 | 2.7891 | 2.6524 | 3.5001 | 3.1720 | 2.9259 | 2.1329 | 2.3516 | 3.0352 | 2.5430 | 2.9805 | 2.6251 | 2.7071 | 2.3712 | 2.3712 | 2.6710 | 2.4257 | 3.2707 | 2.9981 | 2.5620 | 2.5620 | 2.6438 | 2.7801 | 2.9981 | 2.1259 | 2.2827 | 2.2555 | 2.2827 | 2.6632 | 2.4186 | 3.2610 | 3.1523 | 2.0653 | 3.0436 | 2.7719 | 2.2555 | 2.4458 | 3.3337 | 2.9543 | 3.1169 | 3.0085 | 3.0085 | 2.9814 | 3.3879 | 3.6047 | 3.6589 | 2.7645 | 3.2795 | 2.8729 | 2.9743 | 3.3799 | 2.4606 | 3.0825 | 2.9473 | 3.8125 | 3.4880 | 4.0559 | 2.6498 | 4.1099 | 2.5958 | 2.2442 | 2.6713 | 2.0507 | 2.5094 | 3.4807 | 2.7792 | 2.4284 | 2.9141 |
| Hidalgo | 0.1380 | 0.5518 | 0.4484 | 0.2414 | 0.2759 | 0.1724 | 0.3794 | 0.5173 | 0.7243 | 0.6898 | 0.4139 | 0.4828 | 0.4764 | 0.2382 | 0.4083 | 0.3403 | 0.3743 | 0.2382 | 0.5104 | 0.5104 | 0.3743 | 0.3063 | 0.5104 | 0.3063 | 1.0077 | 0.4367 | 0.5375 | 0.5039 | 0.4367 | 0.3359 | 0.3023 | 0.7726 | 0.5375 | 0.4031 | 0.3695 | 0.5375 | 0.6635 | 0.4645 | 0.6303 | 0.3981 | 0.6303 | 0.1659 | 0.7299 | 0.7299 | 0.6303 | 0.4313 | 0.6967 | 0.5640 | 0.8523 | 0.5245 | 0.8195 | 0.4589 | 0.6884 | 1.0162 | 0.9834 | 0.5900 | 0.9506 | 0.8523 | 0.5245 | 1.1473 | 0.9396 | 0.7128 | 0.9720 | 0.7128 | 0.7128 | 0.9720 | 1.0692 | 1.0692 | 0.4536 | 0.8424 | 0.4860 | 0.6480 | 0.5446 | 0.6087 | 0.8650 | 0.6407 | 0.5446 | 0.3844 | 0.4806 | 0.8009 | 0.9932 | 0.6407 | 0.6407 | 0.5767 | 0.7606 | 0.4753 | 0.8239 | 0.7606 | 1.1091 | 0.9507 | 0.7922 | 0.5070 | 0.5387 | 0.7606 | 0.7606 | 0.4437 | 0.6271 | 0.6898 | 0.4390 | 0.7212 | 0.3763 | 0.7526 | 0.5331 | 0.4390 | 0.5958 | 0.7526 | 0.5017 | 0.4390 | 0.5276 | 0.4345 | 0.8690 | 0.7139 | 0.9622 | 0.9001 | 0.7449 | 0.4966 | 0.7139 | 0.5276 | 0.4656 | 0.2793 | 0.7068 | 0.6146 | 0.6146 | 0.6454 | 0.4917 | 0.5224 | 1.3522 |
| Jalisco | 0.9920 | 0.8539 | 0.6530 | 0.9795 | 0.9167 | 0.9418 | 1.1051 | 1.0046 | 1.0297 | 1.1051 | 1.2055 | 1.2306 | 1.0055 | 1.0055 | 1.1296 | 0.9434 | 1.4648 | 0.9434 | 1.1172 | 1.2165 | 1.3903 | 1.0924 | 1.1917 | 1.2165 | 1.2517 | 1.1412 | 1.1903 | 1.2885 | 1.3866 | 1.3621 | 1.2394 | 1.5953 | 1.2639 | 1.5830 | 1.5216 | 1.6443 | 1.3958 | 1.6264 | 2.0269 | 1.8570 | 2.0148 | 1.7721 | 1.8934 | 2.1726 | 2.2333 | 2.3304 | 2.2940 | 2.1726 | 2.4262 | 2.4502 | 1.9938 | 2.0418 | 1.8617 | 2.1259 | 2.0298 | 1.8617 | 1.9938 | 1.9337 | 1.8857 | 1.6215 | 1.7718 | 1.5221 | 2.0096 | 1.8431 | 1.7123 | 1.7480 | 1.8074 | 1.5577 | 1.7123 | 1.7004 | 1.5815 | 1.8907 | 1.8373 | 2.0964 | 1.8726 | 1.9197 | 2.1199 | 1.6960 | 1.6842 | 1.4840 | 1.8019 | 1.6842 | 1.3544 | 1.8373 | 1.4354 | 1.3887 | 1.4120 | 1.3420 | 1.7271 | 1.7388 | 1.6571 | 1.4704 | 1.6338 | 1.9488 | 1.5404 | 1.3887 | 1.5038 | 1.1799 | 1.3418 | 1.4228 | 1.8045 | 1.5963 | 1.1915 | 1.1336 | 1.5500 | 1.4228 | 1.2146 | 1.3997 | 1.5485 | 1.2159 | 1.4682 | 1.3535 | 1.4568 | 1.5829 | 1.6862 | 1.2962 | 1.3306 | 1.1356 | 1.2044 | 1.2618 | 0.9899 | 0.9103 | 1.1720 | 1.0810 | 1.1151 | 0.7737 | 0.9786 |
| México | 1.0150 | 0.8873 | 1.0150 | 1.0879 | 1.1244 | 1.1061 | 0.8873 | 0.9360 | 1.1426 | 0.9785 | 1.0150 | 1.0879 | 1.0925 | 0.8944 | 1.0445 | 1.0325 | 1.2186 | 0.9305 | 1.0445 | 1.0265 | 1.0085 | 1.0805 | 0.9245 | 1.0325 | 0.9727 | 0.8303 | 0.9904 | 1.0735 | 1.1506 | 1.0082 | 0.8837 | 0.8778 | 1.0201 | 1.1506 | 1.0142 | 1.0735 | 1.1257 | 0.9439 | 1.0201 | 1.0260 | 1.0788 | 1.0788 | 1.2488 | 1.1022 | 1.2253 | 1.3191 | 1.2488 | 1.3543 | 1.3685 | 1.2003 | 1.4091 | 1.2757 | 1.2061 | 1.1655 | 1.2525 | 1.1945 | 1.1075 | 1.0206 | 1.2177 | 1.3047 | 1.0443 | 1.1648 | 1.4919 | 1.2222 | 1.1648 | 1.0615 | 1.1591 | 1.1648 | 1.1648 | 1.2337 | 1.0902 | 1.0443 | 0.8976 | 1.1645 | 1.1759 | 1.0225 | 1.1986 | 0.9884 | 1.0566 | 1.1134 | 1.1475 | 1.2498 | 1.1305 | 1.1816 | 1.0691 | 0.8327 | 1.2154 | 1.0015 | 1.1591 | 0.9453 | 1.0409 | 1.0128 | 1.3166 | 1.1366 | 0.9171 | 1.0522 | 1.2044 | 1.0371 | 1.0092 | 1.1430 | 0.9981 | 1.0705 | 1.1207 | 1.0148 | 1.1932 | 0.9423 | 0.9981 | 0.8364 | 1.0558 | 0.9618 | 1.0116 | 0.9176 | 0.9618 | 0.9618 | 0.8457 | 0.8402 | 0.9010 | 0.8789 | 0.7186 | 0.8015 | 0.7456 | 0.6853 | 0.7292 | 0.6579 | 0.6360 | 0.6140 | 0.5647 |
| Michoacán | 1.2272 | 0.9904 | 0.9473 | 1.1411 | 1.2918 | 1.4210 | 1.5932 | 1.7009 | 1.1841 | 1.5717 | 1.5717 | 1.8516 | 1.6009 | 1.7717 | 1.6436 | 1.9638 | 2.0492 | 2.0705 | 3.1378 | 2.7322 | 2.9243 | 2.3053 | 2.2626 | 2.4761 | 2.4143 | 2.2872 | 2.2237 | 2.1178 | 1.8001 | 1.7790 | 1.8213 | 2.0119 | 2.0331 | 2.5626 | 2.4990 | 2.9014 | 2.1650 | 2.2911 | 1.9969 | 2.0809 | 2.2070 | 1.8077 | 2.5434 | 2.6695 | 2.8376 | 3.0478 | 2.1650 | 2.3121 | 2.4416 | 2.5251 | 2.2120 | 2.0660 | 2.3164 | 3.0885 | 2.6920 | 3.4015 | 3.6937 | 3.4433 | 3.2554 | 3.9232 | 3.5023 | 3.6681 | 3.7717 | 3.6266 | 3.1707 | 2.7355 | 2.9635 | 3.3158 | 3.1293 | 3.7924 | 3.6681 | 3.6059 | 3.2937 | 3.4172 | 3.8701 | 3.9730 | 3.8289 | 3.4378 | 3.8701 | 4.0348 | 3.7672 | 4.2200 | 3.7877 | 4.4671 | 4.1521 | 4.2543 | 4.0907 | 3.9475 | 3.4157 | 3.2521 | 2.7408 | 2.8840 | 2.7817 | 3.1498 | 2.7408 | 2.8635 | 2.5206 | 2.4190 | 2.3173 | 2.5409 | 2.4596 | 2.2767 | 2.9068 | 2.3986 | 2.2767 | 2.4393 | 2.2767 | 2.3986 | 2.7280 | 2.2430 | 2.3844 | 2.5057 | 2.4451 | 2.2632 | 1.8590 | 1.7782 | 1.7580 | 1.8186 | 1.5762 | 1.8186 | 2.2101 | 1.8686 | 1.9891 | 1.8485 | 2.1097 | 2.0092 | 1.7279 |
| Morelos | 1.5022 | 1.9166 | 3.0562 | 1.7094 | 1.6576 | 2.2274 | 1.9684 | 2.1756 | 2.4864 | 1.6058 | 2.0720 | 2.4864 | 2.1486 | 1.9952 | 2.1998 | 1.8417 | 2.6091 | 2.8137 | 2.4044 | 2.8137 | 2.6602 | 2.7114 | 2.6091 | 3.1718 | 2.8312 | 2.5279 | 2.9829 | 2.9323 | 2.2751 | 2.1234 | 2.2245 | 2.3762 | 2.7301 | 1.7190 | 2.1234 | 2.2245 | 2.9492 | 3.1492 | 2.7493 | 2.2994 | 2.6493 | 2.0495 | 3.7990 | 2.1494 | 3.4991 | 3.2491 | 2.7493 | 3.3491 | 3.6093 | 4.0048 | 4.2026 | 3.8070 | 3.3621 | 3.8070 | 3.3621 | 3.9554 | 3.6587 | 3.8070 | 4.2520 | 3.2137 | 2.7886 | 3.4246 | 3.7670 | 3.8159 | 3.1310 | 3.2289 | 3.0821 | 3.0821 | 2.8375 | 3.9138 | 2.9353 | 3.2289 | 3.4382 | 2.7118 | 4.0678 | 4.7942 | 4.7457 | 4.3583 | 4.3583 | 3.6319 | 4.0193 | 4.8910 | 4.4552 | 4.6489 | 3.6443 | 3.2128 | 4.3636 | 5.0349 | 4.7472 | 3.1648 | 4.4595 | 3.6443 | 4.0759 | 5.1788 | 4.2677 | 4.1239 | 4.7024 | 3.8949 | 5.5099 | 4.6549 | 4.3224 | 3.9899 | 5.0349 | 6.8399 | 5.2249 | 5.7949 | 5.7474 | 6.1274 | 5.5069 | 6.1188 | 5.7893 | 7.5308 | 5.2245 | 5.0362 | 4.6126 | 4.1420 | 4.0949 | 4.8480 | 4.8950 | 4.4714 | 4.3390 | 3.6391 | 3.9657 | 3.7324 | 3.8258 | 3.3125 | 4.3390 |
| Nayarit | 0.4182 | 0.4182 | 0.5855 | 0.5855 | 0.3346 | 0.9201 | 0.7528 | 1.0038 | 0.5019 | 0.4182 | 0.6692 | 0.3346 | 0.3293 | 0.3293 | 0.2470 | 0.1647 | 0.1647 | 0.1647 | 0.0823 | 0.5763 | 0.2470 | 0.4940 | 0.4116 | 0.0823 | 0.3242 | 0.8106 | 0.6484 | 0.4053 | 0.8106 | 1.0537 | 1.0537 | 1.8643 | 2.9180 | 3.1612 | 3.6475 | 3.5665 | 3.2738 | 1.9164 | 3.3537 | 2.4753 | 2.7149 | 2.6350 | 2.0761 | 1.9164 | 1.9962 | 1.8365 | 1.1179 | 0.9582 | 1.0231 | 0.8657 | 0.8657 | 0.9444 | 1.4166 | 1.4953 | 1.1018 | 1.0231 | 1.1805 | 1.1805 | 1.0231 | 1.1018 | 1.3969 | 1.0865 | 0.7761 | 0.7761 | 1.3193 | 0.8537 | 0.7761 | 0.9313 | 1.0865 | 1.5521 | 0.9313 | 0.8537 | 1.6843 | 1.3781 | 1.3015 | 1.5312 | 1.0719 | 1.4547 | 0.9187 | 1.3781 | 1.3015 | 1.0719 | 1.5312 | 0.7656 | 0.6801 | 1.2846 | 1.0579 | 0.8312 | 1.6624 | 0.8312 | 0.7556 | 0.6801 | 0.7556 | 0.8312 | 0.5289 | 1.4357 | 0.9699 | 0.5969 | 0.6715 | 0.3730 | 0.8953 | 0.8207 | 0.8207 | 0.9699 | 0.5223 | 0.8953 | 0.5223 | 0.8953 | 0.8843 | 0.6632 | 0.7369 | 0.6632 | 0.8106 | 0.6632 | 0.5159 | 1.0317 | 1.1054 | 0.9580 | 1.5476 | 1.0317 | 1.1651 | 0.8010 | 0.8010 | 0.8738 | 1.0923 | 0.8738 | 0.8010 |
| Nuevo León | 0.6532 | 0.5955 | 0.6340 | 0.6147 | 0.7876 | 1.0566 | 0.6340 | 0.6916 | 0.9413 | 0.9605 | 0.4803 | 0.5955 | 0.9067 | 1.6811 | 0.7367 | 0.8689 | 1.1522 | 0.8500 | 1.2278 | 0.9633 | 1.2278 | 1.0766 | 0.7367 | 0.6800 | 0.8186 | 0.8558 | 1.1162 | 1.0046 | 1.3581 | 1.1720 | 0.7814 | 0.6883 | 0.8930 | 1.1348 | 0.9116 | 0.6697 | 0.8250 | 0.8066 | 0.7333 | 1.1183 | 1.0633 | 0.6233 | 1.2833 | 1.0999 | 1.3566 | 1.5216 | 1.5216 | 1.7232 | 1.6627 | 1.8977 | 1.1747 | 1.1024 | 1.4097 | 1.5362 | 1.3374 | 1.3374 | 1.2470 | 1.1567 | 0.9759 | 1.2290 | 1.1943 | 1.3012 | 1.4260 | 1.3547 | 1.3903 | 1.5508 | 1.0695 | 1.3190 | 1.2477 | 1.0517 | 1.2834 | 0.9091 | 1.3894 | 1.2135 | 1.4246 | 1.4246 | 1.5301 | 1.7236 | 1.8994 | 1.7587 | 1.5653 | 1.2311 | 0.7738 | 1.7060 | 1.5624 | 1.7881 | 1.4062 | 1.5971 | 2.2394 | 2.2047 | 2.0832 | 2.6561 | 2.0658 | 2.2047 | 1.5103 | 1.7360 | 1.8514 | 1.4571 | 1.6114 | 2.0742 | 1.8171 | 1.7999 | 1.9885 | 1.8342 | 2.3313 | 1.9371 | 2.1771 | 2.0571 | 1.8796 | 1.9135 | 1.6087 | 2.0828 | 2.8617 | 2.8787 | 2.6247 | 2.7432 | 2.5400 | 2.0320 | 1.7441 | 1.1515 | 1.3554 | 1.0709 | 1.3554 | 1.5227 | 0.9873 | 1.0207 | 0.7028 |
| Oaxaca | 0.0000 | 1.1694 | 0.0000 | 0.0000 | 1.3933 | 0.0000 | 0.0000 | 1.0201 | 0.0000 | 0.0000 | 1.4182 | 0.0000 | 1.1862 | 1.1615 | 1.6063 | 1.3098 | 1.3592 | 1.5569 | 1.8287 | 2.0017 | 1.9523 | 0.0000 | 2.2489 | 2.0264 | 1.6944 | 1.5225 | 1.6698 | 2.4802 | 1.5470 | 1.7189 | 1.8171 | 1.8417 | 1.5716 | 1.6453 | 1.8171 | 1.6698 | 1.5865 | 2.0259 | 2.2455 | 2.5140 | 2.2211 | 1.9526 | 1.6598 | 2.0015 | 1.9526 | 1.9038 | 2.1235 | 1.8062 | 1.8686 | 1.5289 | 1.7715 | 1.9899 | 2.0627 | 2.3782 | 2.2083 | 2.2811 | 1.7958 | 2.4025 | 1.9171 | 2.3297 | 2.1962 | 1.3515 | 2.0031 | 1.8100 | 1.8583 | 1.3756 | 1.5204 | 1.7135 | 1.2067 | 1.5928 | 1.2549 | 1.6411 | 1.6084 | 1.3924 | 1.7284 | 1.4164 | 1.2483 | 1.3443 | 1.3443 | 1.5604 | 1.4404 | 1.8005 | 1.2483 | 1.5364 | 1.2898 | 1.2420 | 1.4331 | 1.4092 | 2.0541 | 1.3614 | 1.5764 | 2.3168 | 1.5525 | 2.1974 | 1.4569 | 1.8391 | 1.8302 | 1.4974 | 1.4023 | 1.5687 | 1.8302 | 2.1154 | 1.4023 | 1.9015 | 1.6163 | 1.7351 | 1.8539 | 1.4974 | 1.5851 | 1.4195 | 1.4668 | 1.7270 | 1.7270 | 1.7034 | 1.7744 | 1.9873 | 2.0583 | 2.0583 | 1.7507 | 1.4905 | 1.6016 | 1.0128 | 1.5074 | 1.4367 | 1.5310 | 1.0834 | 1.6723 |
| Puebla | 0.6216 | 0.5578 | 0.5897 | 0.6056 | 0.6375 | 0.6216 | 0.6534 | 0.7491 | 0.6853 | 0.7650 | 0.8606 | 0.5100 | 0.6618 | 0.7406 | 0.8194 | 1.0873 | 0.8982 | 0.8194 | 0.8194 | 0.7721 | 0.9455 | 0.7091 | 0.5515 | 0.3309 | 0.7952 | 0.8576 | 1.1227 | 1.0603 | 1.2630 | 1.0135 | 1.4657 | 1.1227 | 1.3409 | 1.3098 | 1.5281 | 1.0603 | 1.2657 | 1.3274 | 1.4509 | 1.6052 | 1.5126 | 1.3274 | 1.4663 | 1.5126 | 1.4354 | 1.3583 | 1.4663 | 1.3274 | 1.1922 | 1.8189 | 1.5285 | 1.2533 | 1.7272 | 1.3298 | 1.5285 | 1.3145 | 1.3298 | 1.3298 | 1.1922 | 1.4062 | 1.1205 | 1.0750 | 1.2416 | 1.3930 | 1.1507 | 0.9842 | 1.1507 | 1.2416 | 0.9690 | 0.9388 | 0.9388 | 0.9993 | 0.9153 | 0.7052 | 1.1403 | 1.0653 | 0.9303 | 0.8552 | 1.1553 | 1.0353 | 1.0353 | 0.9603 | 1.1703 | 0.9903 | 0.8924 | 1.3089 | 1.1304 | 1.2940 | 1.3386 | 0.9221 | 1.0709 | 1.2047 | 1.1601 | 1.0560 | 0.9073 | 1.3089 | 1.0914 | 0.9439 | 1.0176 | 0.8849 | 1.1799 | 1.4306 | 0.9291 | 1.0324 | 1.1504 | 0.9291 | 1.0029 | 0.9734 | 0.8631 | 0.9362 | 1.1264 | 1.0972 | 1.3020 | 0.9655 | 0.9655 | 0.9801 | 1.4044 | 1.0094 | 1.0679 | 1.1557 | 0.9580 | 0.8273 | 1.0160 | 1.0450 | 1.0305 | 0.9289 | 0.6967 |
| Querétaro | 0.4349 | 0.4349 | 0.5798 | 0.5315 | 0.5315 | 0.4832 | 0.5798 | 0.6282 | 0.4832 | 0.6282 | 0.6282 | 0.3866 | 0.5677 | 0.4258 | 0.5677 | 0.3785 | 0.6623 | 0.3312 | 0.3312 | 0.2839 | 0.7096 | 0.3785 | 0.5677 | 0.3785 | 0.5565 | 0.5565 | 0.6493 | 0.9740 | 0.3710 | 0.9740 | 0.4638 | 0.9276 | 0.8812 | 0.6493 | 0.4174 | 0.6957 | 0.6370 | 0.4550 | 0.6825 | 0.5460 | 0.6370 | 0.7280 | 0.6370 | 0.8189 | 1.0009 | 0.3185 | 0.7280 | 1.0009 | 0.5806 | 0.7146 | 0.8039 | 0.5806 | 0.6699 | 0.4913 | 0.7592 | 0.7592 | 0.8932 | 0.4019 | 0.5359 | 0.6699 | 0.5264 | 0.4825 | 1.1405 | 0.4825 | 0.7896 | 0.3509 | 0.6580 | 1.0089 | 0.4825 | 0.9651 | 0.5703 | 0.5264 | 0.6467 | 0.6036 | 0.6898 | 0.9054 | 0.9485 | 0.3880 | 0.6036 | 0.4742 | 0.6898 | 0.6036 | 0.8191 | 0.6036 | 0.7207 | 0.5087 | 0.1272 | 0.6359 | 0.6359 | 0.4663 | 0.5511 | 0.3816 | 0.8479 | 0.6783 | 0.7207 | 0.7631 | 0.6257 | 0.3754 | 0.7091 | 0.7508 | 0.7508 | 0.9177 | 0.5840 | 0.6257 | 0.4589 | 0.5840 | 0.3337 | 0.7508 | 0.5339 | 0.4928 | 0.7803 | 0.4517 | 0.5749 | 0.5339 | 0.7803 | 0.6160 | 0.6160 | 0.6160 | 0.6571 | 0.4928 | 0.4045 | 0.4854 | 0.5663 | 0.4854 | 0.4854 | 0.5258 | 0.7685 |
| Quintana Roo | 0.9837 | 0.7870 | 0.7214 | 1.3116 | 0.7214 | 1.5083 | 1.3772 | 1.9018 | 1.5739 | 1.5083 | 1.7706 | 0.7870 | 0.5112 | 0.7668 | 0.5112 | 0.8946 | 0.7029 | 0.7668 | 0.8307 | 1.4697 | 1.1502 | 1.1502 | 1.1502 | 0.6390 | 0.8098 | 1.0590 | 1.2458 | 1.4950 | 1.6196 | 2.1179 | 2.1802 | 2.3671 | 1.9933 | 2.9900 | 2.1802 | 2.3048 | 2.4313 | 2.0058 | 2.6744 | 3.4645 | 4.0724 | 3.5861 | 5.7742 | 5.2880 | 4.9841 | 3.7077 | 3.8292 | 4.5586 | 3.3837 | 3.5618 | 3.2056 | 4.0961 | 1.8996 | 2.8494 | 4.0961 | 3.7993 | 3.3837 | 3.6805 | 3.0275 | 3.6805 | 3.4237 | 3.7719 | 3.7139 | 2.9015 | 2.3792 | 1.9150 | 2.9595 | 2.6113 | 3.1916 | 2.5533 | 2.5533 | 1.7409 | 1.6464 | 2.6116 | 2.8387 | 3.4632 | 3.0658 | 2.7251 | 2.2709 | 3.4064 | 3.0658 | 2.8954 | 3.0090 | 2.2142 | 1.6121 | 1.9456 | 2.6127 | 2.2792 | 2.8350 | 2.6127 | 2.5571 | 2.7239 | 3.3909 | 2.9462 | 2.8906 | 2.8350 | 2.5602 | 2.7236 | 2.7781 | 3.1594 | 3.4318 | 3.1049 | 2.3968 | 2.7236 | 2.2334 | 3.2683 | 2.9960 | 2.8870 | 2.7243 | 2.1901 | 2.8311 | 2.5640 | 3.2050 | 2.5640 | 3.3119 | 2.4572 | 2.6175 | 2.3504 | 1.5491 | 2.0299 | 1.8871 | 1.5202 | 1.4153 | 0.7863 | 1.2057 | 1.0484 | 1.0484 |
| San Luis Potosí | 0.6888 | 0.4713 | 0.5438 | 0.4713 | 0.9064 | 0.7614 | 0.7976 | 0.6888 | 0.6163 | 0.9426 | 0.8339 | 1.0151 | 0.7190 | 0.5393 | 0.4674 | 0.6471 | 1.2583 | 1.2224 | 0.7550 | 0.9707 | 0.8269 | 1.5460 | 1.0426 | 1.0067 | 1.3197 | 1.1414 | 0.9273 | 0.8203 | 1.5337 | 1.5337 | 1.6407 | 1.7120 | 1.5694 | 1.2840 | 0.9987 | 1.6050 | 1.0619 | 1.3097 | 1.5220 | 1.4512 | 1.7698 | 1.5220 | 1.4512 | 1.5574 | 1.1327 | 1.2389 | 1.0973 | 1.0619 | 1.1947 | 1.0190 | 1.6515 | 0.9839 | 1.2650 | 1.3704 | 1.1947 | 1.4055 | 1.5812 | 1.2650 | 1.6866 | 1.3001 | 1.3607 | 1.5003 | 1.5003 | 1.3956 | 1.8841 | 1.7445 | 2.4423 | 2.5121 | 1.8143 | 2.2679 | 1.6747 | 1.5701 | 2.0446 | 1.8020 | 2.3218 | 2.0446 | 2.1139 | 2.1485 | 1.4208 | 1.9406 | 1.3168 | 1.4901 | 1.3168 | 1.3168 | 1.3771 | 1.8247 | 1.7214 | 1.7558 | 2.2722 | 1.8591 | 1.3771 | 1.5837 | 1.2738 | 1.3771 | 1.1361 | 1.2738 | 1.3343 | 1.3685 | 1.1974 | 1.3343 | 1.5395 | 1.2658 | 1.3343 | 1.3343 | 1.1974 | 1.1974 | 0.7527 | 0.9579 | 0.6461 | 1.3262 | 1.1562 | 0.8161 | 1.2582 | 1.3942 | 0.9522 | 0.7141 | 0.9862 | 1.3262 | 1.3942 | 0.8502 | 0.9805 | 0.8452 | 0.8114 | 0.4057 | 0.5071 | 0.7100 | 0.5071 |
| Sinaloa | 1.7906 | 2.2216 | 1.8237 | 2.3874 | 2.8517 | 2.3543 | 2.3874 | 2.5532 | 2.1553 | 2.2548 | 2.6859 | 2.4206 | 2.3283 | 2.7219 | 1.4101 | 2.3283 | 2.5907 | 2.4267 | 2.1644 | 3.0498 | 3.1482 | 2.5907 | 2.9186 | 2.5579 | 3.2170 | 3.3469 | 3.8669 | 3.8994 | 4.6467 | 4.0618 | 3.7044 | 3.2820 | 2.6646 | 2.6321 | 2.5996 | 2.6971 | 2.4480 | 2.0615 | 2.7701 | 3.1244 | 2.7379 | 3.3821 | 2.4480 | 2.6090 | 2.3191 | 3.0278 | 1.9326 | 2.1581 | 2.2357 | 2.0121 | 1.6608 | 2.3315 | 2.2676 | 2.0760 | 2.2357 | 2.3954 | 2.5231 | 2.1079 | 2.2996 | 2.1079 | 1.7107 | 1.6790 | 2.1858 | 1.6156 | 1.7740 | 2.2175 | 2.1858 | 2.0591 | 2.1858 | 2.0275 | 1.5839 | 0.9504 | 1.6658 | 1.5087 | 1.3201 | 1.2572 | 1.9801 | 1.3515 | 1.4772 | 1.2887 | 1.6973 | 1.4458 | 1.2258 | 1.2572 | 0.9982 | 0.9046 | 1.2477 | 1.2477 | 1.5597 | 1.0918 | 1.0918 | 0.9670 | 1.4661 | 0.9358 | 0.9670 | 1.0918 | 1.3006 | 0.9599 | 1.6722 | 1.2386 | 1.3625 | 1.3315 | 1.4554 | 1.2696 | 1.3935 | 0.9909 | 0.8980 | 1.3625 | 1.5682 | 1.1685 | 0.9532 | 0.9840 | 1.2607 | 1.2915 | 1.1685 | 1.1992 | 3.1671 | 4.3356 | 3.9973 | 3.6591 | 3.2985 | 3.1153 | 3.3290 | 3.0542 | 4.2758 | 4.7645 | 4.0926 |
| Sonora | 1.2479 | 1.4906 | 1.8026 | 1.1093 | 1.9759 | 2.1492 | 2.3226 | 2.3919 | 1.6639 | 1.9412 | 1.4213 | 0.9013 | 1.8476 | 2.7372 | 1.9161 | 1.1975 | 1.5739 | 1.6766 | 1.9845 | 1.9503 | 1.7450 | 1.6081 | 1.5739 | 1.7450 | 2.1946 | 1.6206 | 1.6206 | 2.2621 | 2.0258 | 2.2284 | 1.8232 | 1.8907 | 2.1608 | 2.1946 | 2.7011 | 1.8232 | 1.4666 | 1.1999 | 1.8999 | 1.9333 | 1.8333 | 1.7999 | 2.5999 | 2.4666 | 3.0332 | 2.2666 | 1.9999 | 2.3332 | 2.3043 | 1.5801 | 2.1727 | 2.0410 | 2.1397 | 4.2136 | 3.2261 | 3.4894 | 2.9627 | 3.5882 | 3.6869 | 3.5553 | 3.3824 | 3.4149 | 2.7970 | 3.3824 | 4.0654 | 3.2848 | 3.8052 | 4.1955 | 3.5125 | 3.8702 | 3.5450 | 4.0003 | 4.0178 | 3.5357 | 4.5643 | 4.7250 | 4.6928 | 3.8250 | 5.0786 | 4.4357 | 3.9536 | 4.3714 | 3.8893 | 4.3393 | 4.1628 | 2.8917 | 3.5591 | 3.5908 | 4.2899 | 3.7815 | 3.8451 | 3.6226 | 3.8451 | 3.5591 | 3.4002 | 5.1797 | 3.8968 | 3.5511 | 3.7083 | 2.3884 | 2.6712 | 2.5455 | 2.6084 | 3.1112 | 2.3570 | 2.7341 | 2.9541 | 3.1112 | 2.6425 | 2.3627 | 2.7669 | 2.8290 | 2.8912 | 3.5130 | 3.7306 | 2.7979 | 3.3264 | 2.8601 | 3.1399 | 2.2384 | 3.1686 | 2.7379 | 3.2917 | 1.9689 | 2.7072 | 2.7995 | 2.4611 |
| Tabasco | 0.9480 | 0.4946 | 0.7419 | 0.7007 | 0.6594 | 0.9067 | 1.1540 | 0.9480 | 0.7419 | 0.8655 | 0.7007 | 0.7419 | 0.4476 | 0.7732 | 0.8953 | 0.7325 | 1.0173 | 0.6918 | 0.8953 | 0.8546 | 0.8953 | 1.1394 | 1.3836 | 1.5057 | 1.1259 | 1.3671 | 1.0455 | 1.0857 | 1.2867 | 1.0455 | 1.3671 | 1.4476 | 1.2867 | 1.4878 | 1.4074 | 1.6486 | 1.2719 | 1.3116 | 1.2719 | 1.4309 | 2.1066 | 2.1066 | 2.5835 | 1.7886 | 1.3911 | 1.5104 | 1.6694 | 1.7489 | 1.4149 | 2.0437 | 2.2402 | 2.5154 | 1.9651 | 1.9651 | 1.5328 | 1.5721 | 1.8079 | 2.1223 | 1.6507 | 1.3756 | 1.9049 | 1.8272 | 2.0993 | 1.1663 | 1.2052 | 1.3995 | 2.0993 | 1.7494 | 1.6328 | 1.5939 | 1.4384 | 1.6717 | 1.2309 | 1.5387 | 1.3079 | 1.7695 | 1.5002 | 1.2694 | 1.0771 | 1.5771 | 1.3079 | 0.8847 | 0.6539 | 0.8847 | 1.0661 | 0.8376 | 0.7615 | 0.8757 | 1.0661 | 0.9138 | 0.9899 | 0.8376 | 1.0280 | 0.9138 | 0.6853 | 1.1041 | 0.7916 | 0.6785 | 0.8293 | 0.9424 | 0.8293 | 0.3393 | 0.6031 | 0.8293 | 0.8293 | 0.5654 | 0.6785 | 0.9047 | 0.7467 | 1.4933 | 2.1280 | 3.0987 | 2.7627 | 2.0533 | 2.0160 | 2.4640 | 2.2400 | 2.0907 | 3.2107 | 2.0907 | 2.6999 | 2.3300 | 1.9972 | 1.8492 | 2.0711 | 1.7013 | 1.6273 |
| Tamaulipas | 1.0301 | 1.9172 | 1.4593 | 1.6310 | 1.2590 | 1.3449 | 1.2877 | 1.3163 | 1.0587 | 0.8012 | 1.2590 | 0.8871 | 0.8506 | 1.1341 | 1.7295 | 1.3325 | 1.3325 | 1.5026 | 1.7011 | 1.2758 | 1.7011 | 1.5594 | 1.4176 | 1.3042 | 1.2643 | 1.3767 | 1.1519 | 1.2643 | 1.9948 | 2.3319 | 1.6015 | 1.9386 | 2.1353 | 2.6129 | 2.6129 | 2.1634 | 1.9774 | 1.9217 | 2.7016 | 2.2560 | 2.6737 | 1.8103 | 2.1724 | 1.8660 | 1.7825 | 1.2812 | 1.4483 | 1.8103 | 1.4637 | 1.6294 | 1.6847 | 1.4637 | 1.2980 | 1.5190 | 1.8504 | 1.6847 | 1.3533 | 1.6847 | 1.3256 | 1.3533 | 1.5888 | 1.9997 | 1.2601 | 1.2875 | 1.3970 | 1.3422 | 1.5066 | 1.3970 | 1.1779 | 1.0957 | 0.8218 | 0.7944 | 0.9512 | 1.0599 | 1.0871 | 1.1414 | 1.2773 | 1.2773 | 0.9512 | 1.5219 | 1.3588 | 1.5762 | 1.0055 | 1.0599 | 0.9169 | 0.6203 | 0.7282 | 0.8091 | 1.0248 | 1.0787 | 0.9709 | 1.2406 | 0.7821 | 0.7012 | 0.7012 | 0.7282 | 0.6960 | 0.6157 | 0.8298 | 0.8298 | 1.1778 | 1.2581 | 0.5889 | 0.9637 | 0.6960 | 0.7495 | 0.7227 | 0.6424 | 0.7707 | 0.5049 | 0.7441 | 0.8504 | 1.0098 | 1.0896 | 0.7707 | 0.6644 | 0.6112 | 0.6112 | 0.7175 | 0.4518 | 0.6333 | 0.5278 | 0.3958 | 0.3694 | 0.3430 | 0.3958 | 0.5014 |
| Tlaxcala | 0.3860 | 0.2316 | 0.5405 | 0.6177 | 0.1544 | 0.4633 | 0.2316 | 0.3088 | 0.1544 | 0.4633 | 0.3088 | 0.6177 | 0.4565 | 0.3804 | 0.6847 | 0.2282 | 0.3043 | 0.3804 | 0.5326 | 0.8369 | 0.6086 | 0.3804 | 0.6086 | 0.3804 | 0.5258 | 0.7511 | 0.8262 | 0.7511 | 0.6760 | 0.7511 | 0.6009 | 0.8262 | 0.8262 | 0.6009 | 0.7511 | 1.1267 | 0.9644 | 1.1870 | 0.5193 | 0.5935 | 1.0386 | 0.4451 | 0.8903 | 0.7419 | 0.8161 | 0.8903 | 0.3709 | 0.5935 | 1.0996 | 0.5131 | 0.8797 | 1.0263 | 0.8797 | 1.6127 | 0.5131 | 0.8797 | 1.2462 | 0.5864 | 0.7331 | 0.9530 | 1.0145 | 0.6522 | 0.9420 | 0.3623 | 0.3623 | 0.5797 | 0.6522 | 0.6522 | 1.0869 | 0.3623 | 0.8696 | 0.3623 | 0.5733 | 0.4299 | 0.9315 | 0.7166 | 0.7882 | 0.7166 | 0.6449 | 0.5016 | 1.0032 | 0.9315 | 0.6449 | 0.5016 | 0.3544 | 0.7797 | 0.7088 | 1.2759 | 0.7088 | 0.9215 | 0.5671 | 0.8506 | 0.5671 | 1.2050 | 0.4962 | 0.7797 | 0.2806 | 0.7015 | 1.1925 | 0.4910 | 0.9820 | 0.9119 | 0.7015 | 0.4209 | 0.4209 | 0.3507 | 0.2104 | 0.7716 | 0.3472 | 0.7638 | 0.4861 | 0.9027 | 0.6944 | 0.4861 | 0.9027 | 0.9027 | 0.9027 | 0.6249 | 0.9721 | 0.9027 | 0.6189 | 0.6876 | 0.7564 | 0.5501 | 0.7564 | 0.5501 | 0.8251 |
| Veracruz | 0.3276 | 0.4126 | 0.4732 | 0.4247 | 0.4247 | 0.4247 | 0.6552 | 0.6188 | 0.5582 | 0.6552 | 0.7159 | 0.6795 | 0.9259 | 0.5772 | 0.6734 | 0.6012 | 0.8898 | 0.9138 | 1.5391 | 2.0922 | 1.5150 | 1.6954 | 1.4910 | 1.5150 | 1.3728 | 1.3489 | 1.8145 | 1.3489 | 1.6354 | 1.8861 | 1.8145 | 1.8264 | 1.9100 | 2.1010 | 1.6832 | 1.8145 | 1.5532 | 1.4702 | 1.7429 | 1.5888 | 1.6006 | 1.5888 | 1.2924 | 1.4109 | 1.4939 | 1.4702 | 1.3042 | 1.2331 | 1.3901 | 1.4608 | 1.6846 | 1.4608 | 1.4608 | 1.6729 | 1.4962 | 1.4962 | 1.2488 | 1.2134 | 1.1192 | 1.1545 | 1.1476 | 1.1944 | 1.1710 | 1.3583 | 1.0773 | 1.6862 | 1.2295 | 1.5223 | 1.0773 | 0.9602 | 1.2412 | 1.4754 | 1.2575 | 1.0828 | 1.2342 | 1.1178 | 1.1178 | 0.9315 | 0.9548 | 1.0828 | 0.9781 | 1.1760 | 0.9082 | 1.0479 | 0.9497 | 0.6486 | 0.9034 | 0.8918 | 0.8918 | 0.7181 | 0.8107 | 0.9960 | 0.8339 | 0.7991 | 0.6949 | 0.7644 | 0.8989 | 0.5416 | 0.7375 | 0.9104 | 0.9565 | 0.8528 | 0.8413 | 0.7491 | 0.8528 | 0.8758 | 0.7030 | 0.6223 | 0.6424 | 0.5735 | 0.7915 | 0.8374 | 0.7456 | 0.8603 | 0.9062 | 0.6653 | 0.9062 | 0.6538 | 0.5965 | 0.6653 | 0.6168 | 0.6967 | 0.8566 | 0.7424 | 0.7195 | 0.7310 | 0.9365 |
| Yucatán | 0.0470 | 0.0470 | 0.3758 | 0.1409 | 0.3758 | 0.1879 | 0.3288 | 0.0470 | 0.1879 | 0.0939 | 0.1879 | 0.4228 | 0.0928 | 0.4175 | 0.1392 | 0.0464 | 0.2319 | 0.1392 | 0.1392 | 0.2783 | 0.1855 | 0.2783 | 0.2783 | 0.0928 | 0.3208 | 0.2749 | 0.1375 | 0.1833 | 0.0916 | 0.0458 | 0.0916 | 0.2749 | 0.0916 | 0.0000 | 0.0916 | 0.0916 | 0.0906 | 0.1811 | 0.0453 | 0.3623 | 0.1359 | 0.0453 | 0.4981 | 0.2717 | 0.0906 | 0.2264 | 0.0906 | 0.1359 | 0.0895 | 0.2238 | 0.0895 | 0.1343 | 0.0895 | 0.0895 | 0.0895 | 0.0448 | 0.2238 | 0.0448 | 0.1343 | 0.2238 | 0.1328 | 0.2656 | 0.0885 | 0.1328 | 0.0885 | 0.2656 | 0.1771 | 0.1328 | 0.1771 | 0.2213 | 0.1328 | 0.4869 | 0.2627 | 0.1314 | 0.2627 | 0.1314 | 0.0000 | 0.1314 | 0.3065 | 0.1751 | 0.2189 | 0.0438 | 0.0000 | 0.1751 | 0.1733 | 0.2166 | 0.0866 | 0.0433 | 0.2599 | 0.0866 | 0.1733 | 0.1733 | 0.1300 | 0.1733 | 0.0866 | 0.0866 | 0.0857 | 0.0857 | 0.0857 | 0.2572 | 0.1715 | 0.1286 | 0.0857 | 0.1715 | 0.1286 | 0.0429 | 0.0857 | 0.1286 | 0.1698 | 0.1273 | 0.1698 | 0.1698 | 0.2122 | 0.0424 | 0.2122 | 0.0849 | 0.1273 | 0.2122 | 0.2122 | 0.1273 | 0.0841 | 0.0841 | 0.0420 | 0.0000 | 0.2522 | 0.0420 | 0.1261 |
| Zacatecas | 1.3735 | 1.1238 | 1.2487 | 1.0614 | 0.6868 | 1.2487 | 1.4360 | 0.9989 | 1.1862 | 1.4984 | 1.4984 | 1.1238 | 1.9175 | 2.2268 | 1.7319 | 1.6082 | 2.3505 | 2.3505 | 2.2886 | 3.5258 | 2.7835 | 2.2268 | 2.1031 | 2.6598 | 2.8838 | 2.0248 | 2.3316 | 2.5157 | 2.3316 | 2.0248 | 3.3133 | 3.9882 | 3.4974 | 4.2337 | 2.5770 | 2.0862 | 1.8875 | 2.4964 | 2.9226 | 2.1919 | 2.5573 | 2.6790 | 2.9226 | 2.8617 | 3.5923 | 3.3488 | 3.4706 | 3.2270 | 2.3571 | 2.1153 | 2.7801 | 2.1758 | 2.9615 | 2.5988 | 2.9615 | 2.1758 | 2.4175 | 2.7197 | 2.9010 | 2.6593 | 2.3403 | 3.1805 | 3.1205 | 3.3605 | 3.9606 | 4.5006 | 3.7805 | 4.2006 | 4.2006 | 3.7205 | 5.0407 | 5.9409 | 6.4962 | 5.6618 | 4.7678 | 4.8870 | 5.7214 | 4.4698 | 5.1850 | 6.0790 | 7.0922 | 6.3770 | 6.0790 | 4.7678 | 5.9204 | 3.3154 | 5.0323 | 4.9139 | 4.2627 | 4.5587 | 4.9731 | 4.2035 | 3.9667 | 5.8612 | 5.8020 | 5.2691 | 5.5886 | 4.0591 | 4.2944 | 4.2944 | 3.9414 | 3.8826 | 2.2943 | 3.1767 | 2.8825 | 2.4707 | 2.9414 | 1.8825 | 1.4032 | 1.9294 | 1.8709 | 1.8124 | 1.9294 | 2.2802 | 1.7540 | 2.1048 | 1.4616 | 1.3447 | 2.1048 | 1.5786 | 1.1042 | 0.9880 | 0.7555 | 0.7555 | 0.6393 | 0.5812 | 0.2906 |
Si pensamos entonces ahora en los meses como “variables”, podemos hacernos la pregunta de qué entidades son más similares entre sí. El algoritmo de k-medias lo que hace es agruparlas con base en un criterio de cercanía a un punto medio. Para ello, es necesario indicarle cuántos grupos queremos formar. Este es uno de los puntos medulares de este tipo de técnicas ya que decidir cuál es el número de conglomerados adecuado no es necesariamente trivial. Por el momento, vamos a abordarlo como un punto más de exploración.
Comenzaremos con 3 grupos o conglomerados:
conglomerados <- kmeans(x = temp[,2:ncol(temp)], centers = 3)
temp$conglomerados1 <- conglomerados$cluster
temp <-
melt(
data = temp
, id.vars = c('Entidad', 'conglomerados1')
, variable.name = 'FECHA'
, value.name = 'DELITOS.PC'
)
temp$FECHA <- as.Date(x = temp$FECHA, format = '%Y-%m-%d')
# ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC, color = conglomerados1)) +
# geom_point() +
# theme_minimal() +
# theme(legend.position = 'none')
# ggplot(data = temp, mapping = aes(x = factor(conglomerados1), y = DELITOS.PC, color = Entidad)) +
# geom_point() +
# theme_minimal() +
# theme(legend.position = 'none')
ggplot(data = temp) +
aes(x = DELITOS.PC) +
geom_dotplot(binwidth = 0.1, dotsize = 0.45) +
scale_y_continuous(NULL, breaks = NULL, limits = c(0,NA)) +
theme_minimal()
ggplot(data = temp) +
aes(x = DELITOS.PC, color = factor(conglomerados1)) +
geom_dotplot(
binwidth = 0.1, dotsize = 0.45, stackgroups = TRUE, binpositions = 'all'
) +
scale_y_continuous(name = NULL, breaks = NULL, limits = c(0,NA)) +
theme_minimal() +
theme(legend.position = 'none')
ggplot(data = temp) +
aes(
x =
factor(
Entidad
, levels = unique(Entidad[order(conglomerados1)])
, ordered = TRUE)
, y = DELITOS.PC, color = factor(conglomerados1)
) +
geom_jitter() +
theme_minimal() +
labs(x = 'Entidad') +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0)
, legend.position = 'none'
)
Ahora veamos con 4 grupos:
temp <-
dcast(
data = temp
, formula = Entidad + conglomerados1 ~ FECHA
, value.var = 'DELITOS.PC'
, fill = 0
, fun.aggregate = sum
)
conglomerados <- kmeans(x = temp[,2:ncol(temp)], centers = 4)
temp$conglomerados2 <- conglomerados$cluster
temp <-
melt(
data = temp
, id.vars = c('Entidad', 'conglomerados1', 'conglomerados2')
, variable.name = 'FECHA'
, value.name = 'DELITOS.PC'
)
temp$FECHA <- as.Date(x = temp$FECHA, format = '%Y-%m-%d')
ggplot(data = temp) +
aes(x = DELITOS.PC) +
geom_dotplot(binwidth = 0.1, dotsize = 0.45) +
scale_y_continuous(NULL, breaks = NULL, limits = c(0,NA)) +
theme_minimal()
ggplot(data = temp) +
aes(x = DELITOS.PC, color = factor(conglomerados2)) +
geom_dotplot(
binwidth = 0.1, dotsize = 0.45, stackgroups = TRUE, binpositions = 'all'
) +
scale_y_continuous(name = NULL, breaks = NULL, limits = c(0,NA)) +
theme_minimal() +
theme(legend.position = 'none')
ggplot(data = temp) +
aes(
x =
factor(
Entidad
, levels = unique(Entidad[order(conglomerados2)])
, ordered = TRUE)
, y = DELITOS.PC, color = factor(conglomerados2)
) +
geom_jitter() +
theme_minimal() +
labs(x = 'Entidad') +
theme(
axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0)
, legend.position = 'none'
)
¿Cuál es mejor? Tendríamos que comparar las estadísticas de similitud al interior de los grupos y diferencia entre grupos. Por el momento, aquí lo vamos a dejar (eso ya forma parte del proceso de inferencia).
Esencialmente, una serie de tiempo es un conjunto de datos bi-variado (como mínimo) en el que una de las variables se usa para registrar el momento en el tiempo en el que se observa(n) la(s) otra(s) variable(s). En otras palabras, una serie de tiempo es el registro de una variables (aleatoria) de interés, ordenado en el tiempo.
En los datos que ya hemos estado revisando, por ejemplo, podemos construir la serie de tiempo de los homicidios dolosos per capita en la CDMX:
temp <-
datos.3[
which(
datos.3$Entidad == 'Ciudad de México' &
datos.3$Subtipo.de.delito == 'Homicidio doloso')
, c('FECHA', 'DELITOS.PC')
]
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC)) +
geom_line() +
geom_point() +
theme_minimal()
Podemos, desde luego, considerar la serie de tiempo de los homicidios dolosos en todos los estados (32 series), lo cual puede complicar un poco la visualización:
temp <- datos.3[, c('FECHA', 'Entidad', 'DELITOS.PC')]
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC, group = Entidad)) +
geom_line(mapping = aes(colour = Entidad)) +
geom_point() +
theme_minimal()
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC, group = Entidad)) +
geom_line(mapping = aes(colour = Entidad)) +
theme_minimal()
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC, group = Entidad)) +
geom_line(mapping = aes(colour = Entidad)) +
theme_minimal() +
theme(legend.position = 'none')
Claramente, visualizar un número elevado de series de tiempo de manera simultánea es un reto. A veces, hasta un número reducido tiene sus complicaciones:
temp <-
datos.3[
which(
(datos.3$Entidad == 'Ciudad de México' | datos.3$Entidad == 'Yucatán') &
datos.3$Subtipo.de.delito == 'Homicidio doloso')
, c('FECHA', 'Entidad', 'DELITOS.PC')
]
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC, group = Entidad)) +
geom_line(mapping = aes(color = Entidad)) +
theme_minimal()
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC, group = Entidad)) +
facet_wrap(facets = as.factor(temp$Entidad), nrow = 2, scales = 'free') +
geom_line(mapping = aes(color = Entidad)) +
theme_minimal()
Habiendo visto esto, ¿cómo identifico a la serie de tiempo más interesante cuando las reviso todas en forma simultánea? … Se aceptan ideas/sugerencias.
Ahora bien, al graficar series de tiempo en forma simultánea la escala de los datos se vuelve sumamente relevante por lo que tenemos que tener cuidado de explorar nuestros datos exhaustivamente, pero también debemos tener cuidado con las comparaciones que hacemos.
También podemos analizar las series de tiempo de datos composicionales. Por ejemplo, consideremos los homicidios ocurridos en la CDMX. Podemos analizar las dos series de manera simultánea:
temp <-
datos.3[
which(
(datos.3$Entidad == 'Ciudad de México') &
(
datos.3$Subtipo.de.delito == 'Homicidio doloso' |
datos.3$Subtipo.de.delito == 'Homicidio culposo'
)
)
, c('FECHA', 'Subtipo.de.delito', 'DELITOS.PC')
]
ggplot(
data = temp
, mapping = aes(x = FECHA, y = DELITOS.PC, group = Subtipo.de.delito)
) +
geom_line(mapping = aes(color = Subtipo.de.delito)) +
theme_minimal()
Pero, si los consideramos como dos series que “componen” al total de homicidios en la CDMX, entonces tenemos las siguientes series:
total.homicidios.cdmx <-
aggregate(
x = list(TOTAL = temp$DELITOS.PC), by = list(FECHA = temp$FECHA), FUN = sum
)
temp <- merge(x = temp, y = total.homicidios.cdmx, all.x = TRUE)
temp$DELITOS.PC.100 <- 100 * temp$DELITOS.PC / temp$TOTAL
ggplot(
data = temp
, mapping = aes(x = FECHA, y = DELITOS.PC.100, group = Subtipo.de.delito)
) +
geom_line(mapping = aes(color = Subtipo.de.delito)) +
theme_minimal()
En este caso, dado que solo tenemos dos delitos que componen al total, estrictamente hablando uno de ellos sale sobrando en la gráfica. Lo incluyo aquí solamente para hacer explícita la diferencia entre las dos gráficas.
Ahora bien, en las series de tiempo, al analizarlas de forma descriptiva, es posible describirlas mediante su descomposición en tres aspectos básicos:
La tendencia: la “ruta” de largo plazo que ha seguido la serie.
El efecto estacional: comportamiento “repetido” que se observa en la serie de tiempo en momentos específicos en el tiempo dentro de un intervalo determinado.
El “ruido” residual: parte aleatoria del comportamiento de la serie de tiempo en una determinada observación.
Esto supone entonces que podemos describir a la serie de tiempo:
\[X_t = f(T_t, S_t, E_t)\]
El método más sencillo de descomposición asume que la manera en la que podemos descomponer a la serie de tiempo es, o bien aditiva
\[X_t = T_t + S_t + E_t\]
o bien multiplicativa
\[X_t = T_t \cdot S_t \cdot E_t\]
El procedimiento para la descomposición es el siguiente:
\[T_t^1 = \frac{1}{m} \sum\limits_{j = -k}^k X_{t+j}\]
Donde \(m = 2k + 1\) es el valor de la periodicidad de la serie. Observa que esto implica que para la serie \(T_t\) perderemos \(k-1\) observaciones en cada extremo de la serie.
\[T_t^2 = \frac{1}{2} [T_{t-1}^1 + T_{t}^1]\].
[Aditivo] Se calcula la serie sin la tendencia: \(R_t = X_t - T_t^2\)
[Multiplicativo] Se calcula la serie sin la tendencia: \(R_t = \frac{X_t}{T_t^2}\)
Se calcula el componente estacional de \(t\) como el promedio de las \(R_t\) correspondientes al mismo punto en el tiempo dentro del periodo de referencia (p.e., el promedio de los “marzos”):
\[S_t = \frac{1}{n} \sum\limits_{j=1}^{n*m} R_j \cdot I(j \bmod m = t \bmod m)\]
Donde \(n\) es el número de periodos observados.
[Aditivo] Se calcula el error aleatorio: \(E_t = X_t - T_t^2 - S_t\)
[Multiplicativo] Se calcula el error aleatorio: \(R_t = \frac{X_t}{T_t^2 * S_t}\)
Regresemos entonces a la serie del total de homicidios dolosos en la CDMX:
temp <-
datos.3[
which(
datos.3$Entidad == 'Ciudad de México' &
datos.3$Subtipo.de.delito == 'Homicidio doloso')
, c('FECHA', 'DELITOS.PC')
]
temp <- temp[order(temp$FECHA),]
Para poder hacer uso de algunas funciones pre-programadas en R de series de tiempo, es necesario declararle a R que usaremos un tipo de objeto serie de tiempo. Esto lo hacemos con la función ts.
ts.homicidios.cdmx <-
ts(data = temp$DELITOS.PC, start = c(2015, 01), frequency = 12)
plot(ts.homicidios.cdmx)
ts.homicidios.cdmx.dec <- decompose(x = ts.homicidios.cdmx, type = 'additive')
plot(ts.homicidios.cdmx.dec)
temp$trend <- ts.homicidios.cdmx.dec$trend
temp$seasonal <- ts.homicidios.cdmx.dec$seasonal
temp$random <- ts.homicidios.cdmx.dec$random
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC)) +
geom_line() +
geom_line(mapping = aes(y = trend), colour = 'blue') +
theme_minimal()
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC)) +
geom_line() +
geom_line(mapping = aes(y = trend), colour = 'blue') +
geom_line(mapping = aes(y = seasonal), colour = 'green') +
theme_minimal()
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC)) +
geom_line() +
geom_line(mapping = aes(y = trend), colour = 'blue') +
geom_line(mapping = aes(y = seasonal), colour = 'green') +
geom_line(mapping = aes(y = random), colour = 'red') +
theme_minimal()
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
## Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
ts.homicidios.cdmx.dec <-
decompose(x = ts.homicidios.cdmx, type = 'multiplicative')
plot(ts.homicidios.cdmx.dec)
temp$trend <- as.numeric(ts.homicidios.cdmx.dec$trend)
temp$seasonal <- as.numeric(ts.homicidios.cdmx.dec$seasonal)
temp$random <- as.numeric(ts.homicidios.cdmx.dec$random)
ggplot(data = temp, mapping = aes(x = FECHA, y = DELITOS.PC)) +
geom_line() +
geom_line(mapping = aes(y = trend), colour = 'blue') +
theme_minimal()
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
ggplot(data = temp, mapping = aes(x = FECHA, y = seasonal)) +
geom_line() +
theme_minimal()
ggplot(data = temp, mapping = aes(x = FECHA, y = seasonal)) +
geom_line() +
geom_line(mapping = aes(y = random), colour = 'red') +
theme_minimal()
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
ggplot(data = temp, mapping = aes(x = FECHA, y = random)) +
geom_line() +
theme_minimal()
## Warning: Removed 12 rows containing missing values or values outside the scale range
## (`geom_line()`).
Algunas advertencias al trabajar con series de tiempo:
Verificar si la serie de tiempo es regular o irregular.
¿Presenta datos faltantes? ¿Presenta “quiebres” (break in series)?
Cuidado con las definiciones de los intervalos de tiempo.
¿Cuántos días tiene un año?
¿Cuántas semanas?
¿Cuántos días tiene un mes?
- ¿Qué podemos entonces decir ahora de nuestros datos tras haber realizado el AED?
- Nuestros datos necesitan diversas transformaciones de “forma” para poder utilizarlos apropiadamente.
- Podemos realizar estudios de corte transversal
- Pero también series de tiempo
- Algunas de ella de carácter composicional
- Algunos de estos estudios pueden ser multivariados
- ¿Me interesa profundizar o enfocarme en un estado en particular? ¿En algún delito en específico?
- La participación de cada delito en estas entidades: ¿es la misma? ¿Existen diferencias estadísticamente significativas?
- Algunos estados parecen presentar indicios de “administración” de las cifras.
- Sería conveniente “enriquecer” nuestros datos, por ejemplo, con datos sobre cifra negra (INEGI).
- ¿Podemos hacer algún tipo de prueba adicional sobre este punto?
La principal advertencia que tenemos que considerar cuando realizamos un AED es la siguiente: estamos haciendo una EXPLORACIÓN de los datos; no estamos buscando qué datos se ajustan o parecen confirmar nuestras creencias.
Esto es un peligro muy real y difícil de evadir con frecuencia.
Para evitar caer en ello, en ocasiones puede ser recomendable realizar el AED sobre una partición (muestra) de los datos considerando diferentes necesidades:
AED
Ajuste / calibración del (eventual) modelo
Contraste / validación del modelo (generalmente se sugiere NO realizar AED sobre esta partición de los datos)
Algunas preguntas adicionales que debemos hacernos cuando nos planteamos estas particiones:
¿Cuántos datos debo tomar para cada propósito?
¿Cómo puedo asegurarme de que mis datos sirven para cada propósito?
¿Qué tipo de muestreo?
Algunas de las respuestas a estas preguntas hacen notar lo obvio: en ocasiones no podemos o no queremos realizar el AED sobre una partición de los datos. En estos casos es muy importante apegarnos principios éticos. En otras palabras, es importante no engañar(nos) y estar seguros de que nuestro análisis es realmente exploratorio y que no estamos buscando justificar una propuesta escogiendo datos a modo.
Contexto general
Contexto específico (diccionario de datos)
Preparación de datos (limpieza, transformaciones prácticas, transformaciones estadísticas, etc.)
Generar preguntas sobre los datos.
Dar respuesta a las preguntas.
Iterar refinando las preguntas y/o generar nuevas.
Supongamos que \(\{x_1,x_2,...,x_n\}\) representan una muestra de una variable aleatoria con \(E[x_i]=\mu\) y \(Var[x_i]=\sigma\). Definimos al estimador de la varianza como:
\[\hat{S}^2 = \frac{1}{n} \sum\limits_{i = 1}^n (x_i - \bar{x})^2\]
Entonces, buscamos conocer \(E[\hat{S}^2]\). Comenzamos por expandir los términos dentro de la sumatoria:
\[\hat{S}^2 = \frac{1}{n} \sum\limits_{i = 1}^n (x_i - \bar{x})^2 = \frac{1}{n} \left\{ \sum\limits_{i = 1}^n [x_i^2 - 2\bar{x}x_i + \bar{x}^2] \right\} =\]
\[\left[ \frac{1}{n} \sum\limits_{i = 1}^n x_i^2 \right] - 2\bar{x}\left[\frac{1}{n} \sum\limits_{i = 1}^n x_i \right] + \frac{1}{n}n\bar{x}^2 = \left[ \frac{1}{n} \sum\limits_{i = 1}^n x_i^2 \right] - 2 \bar{x}^2 + \bar{x}^2 = \left[ \frac{1}{n} \sum\limits_{i = 1}^n x_i^2 \right] - \bar{x}^2 =\]
Si ahora calculamos la esperanza de esta expresión tenemos que:
\[E\left[\hat{S}^2\right] = E\left[\left( \frac{1}{n} \sum\limits_{i = 1}^n x_i^2 \right) - \bar{x}^2\right] = \frac{1}{n} \left[ \sum\limits_{i = 1}^n E[x_i^2] \right] - E[\bar{x}^2] =\]
Ahora, recordaremos que para cualquier variable aleatoria \(Y\) se cumple que:
\[Var[Y] = E[Y^2] - E[Y]^2 \Rightarrow E[Y^2] = Var[Y] + E[Y]^2\]
Entonces:
\[E[\bar{x}^2] = Var[\bar{x}] + E[\bar{x}]^2\]
Desarrollando \(Var[\bar{x}]\):
\[Var[\bar{x}] = Var \left[ \frac{1}{n}\sum\limits_{i=1}^n x_i \right] = \frac{1}{n^2} Var \left[ \sum\limits_{i=1}^n x_i \right] =\]
\[\frac{1}{n^2} \sum\limits_{i=1}^n Var \left[ x_i \right] = \frac{n*\sigma^2}{n^2} = \frac{\sigma^2}{n}\]
Desarrollamos ahora el otro término:
\[E[\bar{x}]^2 = E \left[ \frac{1}{n} \sum\limits_{i=1}^n x_i \right]^2 = \left[ \frac{1}{n} \sum\limits_{i=1}^n E[x_i] \right]^2 = \left[ \frac{n\mu}{n} \right]^2 = \mu^2\]
Regresamos entonces a sustituir y tenemos que:
\[E\left[\hat{S}^2\right] = \frac{1}{n} \left[ \sum\limits_{i = 1}^n E[x_i^2] \right] - E[\bar{x}^2] = \frac{1}{n} \left[ \sum\limits_{i = 1}^n E[x_i^2] \right] - \frac{\sigma^2}{n} - \mu^2\]
Ahora veamos el otro término:
\[E[x_i^2] = Var(x_i) + E[x_i]^2 = \sigma + \mu^2\]
Entonces:
\[\frac{1}{n} \left[ \sum\limits_{i = 1}^n E[x_i^2] \right] = \frac{1}{n} \left[ \sum\limits_{i = 1}^n [\sigma + \mu^2] \right] = \sigma + \mu^2\]
Por lo tanto:
\[E\left[\hat{S}^2\right] = \sigma + \mu^2 - \frac{\sigma^2}{n} - \mu^2 = \sigma \left(1 - \frac{1}{n} \right) = \frac{n-1}{n} \sigma \neq \sigma\]
Por lo que hemos demostrado que el estimador propuesto para la varianza es un estimador sesgado.
Supongamos que se cuenta con una serie de tiempo \(X = {x_1, ..., x_n}\). Si podemos expresar cada valor de la serie de tiempo como \(x_i = a(i) = x_0 * e^{t * \delta}\) entonces:
\[ln(x_i) = ln(x_0 * e^{t * \delta}) = ln(x_0) + ln(e^{t * \delta}) =\]
\[ln(x_0) + t * \delta*ln(e) = ln(x_0) + t * \delta\]
A \(\delta\) se le conoce como la fuerza de interés. Entonces, la transformación logarítmica permite expresar a la serie de tiempo como una transformación lineal de la fuerza de interés.