ecuervog@gmail.com

RPubs

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
Nota importante
El material contenido en este documento utiliza datos abiertos, disponibles para su descarga libremente. Sin embargo, lo más apropiado es que el alumno cuente con un conjunto de datos escogido según sus intereses para trabajarlo y que este documento y los ejemplos que aquí se mencionan se usen meramente como guía en la elaboración del AED.

INTRODUCCIÓN

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.

EL PROCESO DEL AED

  1. Establecer el contexto de los datos.
  1. Contexto general

  2. Contexto específico (diccionario de datos)

  3. Preparación de datos

  1. Generar preguntas sobre los datos.

  2. Dar respuesta a las preguntas.

  3. 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.

ESTABLECER EL CONTEXTO

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.


Actividad
¿Cuentas ya con los datos con los que vas a trabajar a lo largo del diplomado?

OBTENCIÓN DE LOS 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 GENERAL

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.

Ejemplo
Contexto general: incidencia delictiva.

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:

  • Incidencia delictiva federal
  • Incidencia delictiva estatal
  • Incidencia delictiva municipal
  • Víctimas del fuero común

En este documento nos enfocaremos en el AED de las cifras de incidencia delictiva estatal.

CONTEXTO ESPECÍFICO

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?

    • Tipo de dato
    • Formato
    • Unidades de medición

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.

TIPOS DE DATOS

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:

  • De intervalos: es una escala cuantitativa en la que, cuando comparamos dos mediciones, lo relevante es la diferencia entre esas dos mediciones (son escalas aditivas). Por este motivo, las escalas de intervalos pueden incluir entre sus valores al 0 y valores negativos, sin embargo el significado del cero es arbitrario. Dado que el cero es un valor arbitrario, las comparaciones proporcionales entre mediciones no son generalmente apropiadas o significativas.

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).

  • De razones: en las escalas de razones, el 0 tiene un significado específico: la total ausencia de lo que queremos medir. Por este motivo, las escalas de razones no permiten la presencia de valores negativos y, también por este motivo, es posible caracterizarlas como escalas multiplicativas, por lo que las comparaciones en términos de proporciones aquí sí hacen sentido. Por ejemplo: el peso de una persona.

¿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?

Ejemplo
Incidencia delictiva: diccionario de datos.

En nuestro caso (y así sucede frecuentemente con datos públicos), el SESNSP pone a disposición un diccionario de datos:

/incidencia/DD_SESNSP.xlsx
/incidencia/DD_SESNSP.xlsx

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:

  • En R, la función str nos proporciona un primer conjunto de descripciones básicas de nuestros datos:
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 ...
  • Otra opción es utilizar summary:
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
## --------------------------------------------------------------------------------
  • Otra alternativa más es usando el paquete skimr:
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?

PREPARACIÓN DE LOS DATOS

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.

    • Re-estructura de los datos: en el caso de nuestro ejemplo, la presentación de los meses en columnas es un poco desafortunada, así que transformaremos esas columnas en un atributo más (aquí uso otro paquete al que recurro con frecuencia: reshape2):
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)
    • Fechas: me conviene crear una columna con un atributo que represente mejor la fecha a la que corresponde cada dato (observen también que las fechas son “especiales” en R, por lo que me aseguro de que venga en el formato apropiado):
# 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.

    • Potencias: quizá las más empleadas sean \(\lambda = \frac{1}{2}\) o \(\lambda = 2\)

\[x_i' = x_i^{\lambda}\]

    • Estandarizaciones:

\[z_i = \frac{x_i - \bar{x}}{s}\]

    • Otras transformaciones relevantes, por ejemplo:

\[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),]

Datos faltantes
Aprovechemos para hablar brevemente sobre los datos faltantes.

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:

  • “Filtrar” nuestros datos:
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
  • Agruparlos para que no tengamos duplicados (por las diferentes modalidades). Ojo, en las agrupaciones es muy importante reflexionar sobre cuál es la función de agrupación relevante (en este caso voy a sumar los delitos):
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).

DESCRIPCIÓN ESTADÍSTICA DE LOS DATOS

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.

DESCRIPCIÓN UNIVARIADA DE LOS DATOS

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.

DISTRIBUCIONES DE FRECUENCIA

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.

Variables cualitativas
La manera de representar la distribución de frecuencia de una variable cualitativa es utilizando una tabla de frecuencias. En una tabla de frecuencias se registra, para cada uno de los posibles valores de una variable cualitativa (su dominio) el número de veces que cada uno de esos valores se observa en los datos (\(f_i\)). Usualmente, se registra en la tabla de frecuencias también la frecuencia relativa (\(p_i\)) de cada posible valor de la variable, esto es, la frecuencia del valor correspondiente divida entre el número total de observaciones.

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
Para la descripción de este tipo de variables mediante una distribución de frecuencias es necesario considerar, en primer lugar, el tipo de variable cuantitativa:
  • 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?

Ejemplo
¿Cuántos delitos se registran al mes?
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'
    )

ESTADÍSTICAS RESUMEN

Para variables categóricas:

  • Número de categorías:

    • Veamos un ejemplo que debería ser muy obvio: la entidad federativa: en nuestros datos hay 32 diferentes valores para la variable \(Entidad\). Lo cual es de esperarse.
  • 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.

    • No siempre se puede pero, si el número de valores únicos no es muy grande, podemos revisar la lista completa:
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"
  • Frecuencia de cada categoría:
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%
  • Moda: la categoría más frecuentemente observada:
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.

MEDIDAS DE CENTRALIDAD

Estas medidas describe en dónde se encuentran los valores “medios” de nuestros datos.

Media
el valor promedio; se ve afectada por valores extremos (no es “robusta”).

\[\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.

Mediana
es una estadística de orden, correspondiente al valor que se encuentra “a la mitad” de los valores; es una medición de centralidad “robusta”, en el sentido de que no se ve afectada por valores extremos.

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

Moda
en datos cuantitativos la moda corresponde al valor de la variable que concentra la mayor densidad de probabilidad. Para obtener es necesario entonces estimar su función de densidad:
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.

MEDIDAS DE DISPERSIÓN

Las medidas de dispersión nos dicen qué tan “alejados” o “cercanos” se encuentran nuestros datos entre sí.

Rango
la diferencia entre el mayor y el menor de los valores de una variable. Tiene el problema de no decirnos mucho sobre la distribución de los datos.
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.

Rango intercuartil
el 50% de los datos más centrales, esto es, la diferencia entre el valor correspondiente al 3er. cuartil y el 1er. cuartil.
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
Varianza
corresponde a la diferencia cuadrática media de los datos respecto de su media:

\[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
Desviación mediana absoluta respecto de la mediana (MAD)
es la desviación de los datos en valor absoluto respecto de su mediana:

\[MAD = med(|x_i - med(x)|)\]

La MAD es una medición robusta.

mad(x = datos.3$DELITOS.PC)
## [1] 0.6765847

OTRAS MEDIDAS DE FORMA

Asimetría
El coeficiente de asimetría nos describe a la distribución de los datos en términos de si esta se inclina a la izquierda (asimetría positiva, cola a la derecha), o bien, a la derecha (asimetría negativa, cola a la izquierda).

\[\ = \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')

Curtosis
Es una estadística que describe la forma de la distribución de los datos en términos de qué tanta densidad se acumula en la moda de la distribución (o, recíprocamente, en las colas de la distribución). Por ello, es una medida muy relevante si deseamos buscar evidencia de la posible existencia de valores atípicos.

\[\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')

VISUALIZACIONES

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:

  • Podemos poner los estados uno junto al otro …
ggplot(
  data = datos.4
  , mapping = aes(y = Entidad)
  ) +
  geom_boxplot(mapping = aes(`Homicidio doloso`)) +
  theme_minimal()

  • … y ordenarlos …
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'
    )

TRANSFORMACIONES

Retomemos ahora el tema de las transformaciones. ¿Por qué quisiéramos (o podríamos necesitar) transformar los datos originalmente recabados?

  1. Mejorar la interpretabilidad / facilitar la comunicación
    En ocasiones es necesario convertir los datos de manera que se vuelvan más fáciles de entender para el público objetivo, ya sea porque las unidades de medición les son poco familiares o porque la manera en la que fueron recabados dificulta su entendimiento. Por ejemplo: en México, registros de temperaturas en escala Farenheit haría, con mucha probabilidad, más difícil comunicar eficazmente los resultados de su análisis. Para el analista es también fundamental, resulta lógico pensar que para el analista/investigador sea más fácil encontrar preguntas o detectar rasgos relevantes en los datos si los analiza en una forma que le sea más cercana o familiar.

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

  • Strong assymetry,
  • Many outliers in one tail,
  • Batches at different levels with widely differing spreads,
  • Large and systematic residuals from fitting a simple model to the data.

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)):

  • Preservan el ordenamiento de los datos originales (aún cuando alteren la forma de su distribución).
  • Son funciones continuas.
  • Son funciones diferenciables .
  • Son especificadas mediante funciones elementales, de manera que su re-expresión sea ágil y sencilla.
  1. Transformaciones para promover la simetría en los datos: si por cualquier motivo nos interesa trabajar con datos simétricos, es posible proponer algunas transformaciones a los datos que promuevan la simetría en los datos transformados. En este sentido, Emerson and Stoto (1983) señalan lo siguiente:
  • 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
Estandarización
la estandarización busca que obtengamos una variable cuya media se encuentre en el 0 y cuya desviación estándar sea igual a 1. Muy utilizada sobre todo en datos multivariados. Sobre todo, si para nuestro análisis es relevante el uso de variables estandarizadas (p.e., k-medias), es recomendable que se haga un análisis exploratorio sobre las variables transformadas también.
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.

EL PROCESO DEL AED

  1. Establecer el contexto de los datos.
  1. Contexto general

  2. Contexto específico (diccionario de datos)

  3. Preparación de datos (limpieza, transformaciones prácticas, transformaciones estadísticas, etc.)

  1. Generar preguntas sobre los datos.

  2. Dar respuesta a las preguntas.

  3. Iterar refinando las preguntas y/o generar nuevas.

DESCRIPCIÓN DE DATOS MULTIVARIADA

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.

VISUALIZACIONES BI-VARIADAS

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()
      )
    
  }
  
}

CORRELACIÓN

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

ANÁLISIS DE REGRESIÓN

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.

ANÁLISIS DE COMPONENTES PRINCIPALES (ACP)

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:

  1. Las nuevas variables sintéticas o rotaciones deben ser transformaciones lineales de las originales.

  2. 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).

ACP PARA DESCRIBIR LA “COMPOSICIÓN” DE LOS DATOS ORIGINALES

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

CONGLOMERADOS

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).

ANÁLISIS DE SERIES DE TIEMPO

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:

  1. Se calculan los promedios móviles de tamaño igual a la frecuencia de la serie (por ejemplo, si el intervalo de la serie es anual y tenemos 12 observaciones al año, calcularemos el promedio móvil de longitud 12). Es importante señalar que el promedio móvil se calcula al rededor del punto de referencia en el tiempo \(t\), esto es:

\[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.

  1. Se vuelven a calcular promedios móviles ahora sobre la serie de promedios móviles obtenida en el paso 1. Los promedios móviles ahora serán únicamente de longitud 2:

\[T_t^2 = \frac{1}{2} [T_{t-1}^1 + T_{t}^1]\].

  1. [Aditivo] Se calcula la serie sin la tendencia: \(R_t = X_t - T_t^2\)

  2. [Multiplicativo] Se calcula la serie sin la tendencia: \(R_t = \frac{X_t}{T_t^2}\)

  3. 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.

  1. [Aditivo] Se calcula el error aleatorio: \(E_t = X_t - T_t^2 - S_t\)

  2. [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?

CONCLUSIONES SOBRE NUESTROS DATOS

  • ¿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?

ADVERTENCIA: USO DE LOS DATOS

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?

    • ¿Cómo hago esto en series de tiempo?
  • ¿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.

EL PROCESO DEL AED

  1. Establecer el contexto de los datos.
  1. Contexto general

  2. Contexto específico (diccionario de datos)

  3. Preparación de datos (limpieza, transformaciones prácticas, transformaciones estadísticas, etc.)

  1. Generar preguntas sobre los datos.

  2. Dar respuesta a las preguntas.

  3. Iterar refinando las preguntas y/o generar nuevas.

ANEXO 1. ESTIMADOR SESGADO DE LA VARIANZA

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.

ANEXO 2. INTERPRETACIÓN FINANCIERA DE LA TRANSFORMACIÓN LOGÍSTICA

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.

REFERENCIAS

Aguirre, Víctor, Alejandro Alegría Hernández, Begoña Artaloitia, Beatriz Balmaseda, Juan José Fernández Durán, Graciela Garza Ruiz Esparza, Víctor Manuel Guerrero, et al. 2006. Fundamentos de Probabilidad y Estadística. Jit Press.
Emerson, John D., and Michael A. Stoto. 1983. “Transforming Data.” In Understanding Robust and Exploratory Data Analysis, edited by David Caster Hoaglin, Frederick Mosteller, and John Wilder Tukey. Wiley.
Harrell Jr, Frank E, with contributions from Charles Dupont, and many others. 2020. Hmisc: Harrell Miscellaneous. https://CRAN.R-project.org/package=Hmisc.
Lehman, Ann, Norm O’Rourke, Larry Hatcher, and Edward J. Stepanski. 2005. JMP for Basic Univariate and Multivariate Statistics: A Step-by-Step Guide. SAS Institute Inc.
Neuwirth, Erich. 2014. RColorBrewer: ColorBrewer Palettes. https://CRAN.R-project.org/package=RColorBrewer.
R Core Team. 2020. R: A Language and Environment for Statistical Computing. Vienna, Austria: R Foundation for Statistical Computing. https://www.R-project.org/.
Tukey, John W. 2020. Exploratory Data Analysis. Pearson.
Wickham, Hadley. 2007. “Reshaping Data with the reshape Package.” Journal of Statistical Software 21 (12): 1–20. http://www.jstatsoft.org/v21/i12/.
———. 2016. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. https://ggplot2.tidyverse.org.
Wickham, Hadley, Romain François, Lionel Henry, and Kirill Müller. 2020. Dplyr: A Grammar of Data Manipulation. https://CRAN.R-project.org/package=dplyr.
Wickham, Hadley, and Dana Seidel. 2020. Scales: Scale Functions for Visualization. https://CRAN.R-project.org/package=scales.
Wikipedia contributors. 2022. “Data Science.” Wikipedia, The Free Encyclopedia. 2022. https://en.wikipedia.org/w/index.php?title=Data_science&oldid=1115263251.
Xie, Yihui. 2014. “Knitr: A Comprehensive Tool for Reproducible Research in R.” In Implementing Reproducible Computational Research, edited by Victoria Stodden, Friedrich Leisch, and Roger D. Peng. Chapman; Hall/CRC. http://www.crcpress.com/product/isbn/9781466561595.
Xie, Yihui, Joe Cheng, and Xianying Tan. 2020. DT: A Wrapper of the JavaScript Library ’DataTables’. https://CRAN.R-project.org/package=DT.
Zhu, Hao. 2021. kableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax. https://CRAN.R-project.org/package=kableExtra.

  1. Ver Anexo 1, para la prueba de que el estimador de la varianza es un estimador sesgado.↩︎

  2. véase Emerson and Stoto (1983) para una discusión más amplia sobre la conveniencia de usar la transformación de Box-Cox sobre expresiones más directas de la familia de potencias.↩︎

  3. Ver Anexo 2.↩︎