Facultad de Derecho y Ciencia Politica

Escuela de Ciencia Política

Guia de Clase de ESTADISTICA


Sesión 2: Exploración Categórica

Estos datos los trajimos de Google. Para convertir un archivo en Excel a uno de Google, sigue estos pasos. Verás que al final consigo el link a ser usado en esta sesion:

El link que usaré tiene datos de 2019 de las acciones del Serenazgo de la Municipalidad de San Isidro, lo uso en este código y traigo los datos para el análisis.

Puedes ver la data aqui:

Luego de generar un enlace, la descargo:

# comentario: enlace está entre comillas

link="https://docs.google.com/spreadsheets/d/e/2PACX-1vRcJpnJqH9VzTXl4NMv0zX45yRkXeMNST3fkSfGFCpUTh0S-dSzRtUj7CJqAzqMUE5r6tKQRZzdKq9V/pub?gid=1802780199&single=true&output=csv"

# comentario: funcion read.csv le entrega datos al objeto 'sere19':
sere19=read.csv(link, stringsAsFactors = F,na.strings = '')
names(sere19) # nombres columna en el objeto
## [1] "FECHA"     "DÍA"       "MES"       "MODALIDAD" "MEDIO"     "DIRECCIÓN"
str(sere19) # sera numero? texto? o factor?
## 'data.frame':    3414 obs. of  6 variables:
##  $ FECHA    : chr  "01/01/2019 0:01" "01/01/2019 0:07" "01/01/2019 0:17" "01/01/2019 0:25" ...
##  $ DÍA      : int  3 3 3 3 3 3 3 3 3 3 ...
##  $ MES      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ MODALIDAD: chr  NA "Patrullaje Disuasivo" NA NA ...
##  $ MEDIO    : chr  "TELÉFONO" "TELÉFONO" "TELÉFONO" "TELÉFONO" ...
##  $ DIRECCIÓN: chr  "AV. DOS DE MAYO N° 0864, SAN ISIDRO" "CA. GARCIA, GODOFREDO N° 0490, SAN ISIDRO" "CA. LOS ROBLES N° 210234, SAN ISIDRO" "CA. BURGOS N° 0179, SAN ISIDRO" ...

Explorar la categorica, sobre todo como variable dependiente, significa querer saber:

Y si además la variable fuese ordinal, podriamos querer saber:

Parte 1. Explorando Variables NOMINALES

  1. Tabla
# simple exploración con función table:

table(sere19$MODALIDAD)
## 
##        Conminar / Retirar       Exceso de velocidad 
##                       151                        33 
##            Falla mecánica Imprudencia del conductor 
##                         5                        66 
##      Patrullaje Disuasivo 
##                       103

Ahora sí, la tabla de frecuencias:

# tabla de frecuencias avanzada
library(questionr)
library(magrittr)
NomDf=freq(sere19$MODALIDAD,total = F,sort = 'dec',exclude = c(NA)) %>% data.frame()
NomDf=data.frame(variable=row.names(NomDf),NomDf,row.names = NULL)

# viendo a NomDf
NomDf
##                    variable   n   X.
## 1        Conminar / Retirar 151 42.2
## 2      Patrullaje Disuasivo 103 28.8
## 3 Imprudencia del conductor  66 18.4
## 4       Exceso de velocidad  33  9.2
## 5            Falla mecánica   5  1.4
  1. Gráfico

El gráfico para las categóricas es el de barras:

library(ggplot2) # instalar previamente

# en base solo se pone: en data como se llama la tabla de frecuencias
# y en aes la variable 'x' para los nombres y la 'y' para los conteos.
base = ggplot(data=NomDf,aes(x=variable,y=n)) 

# luego a la base se le pide añadir la 'geometria' deseada:
bar1 = base + geom_bar(stat='identity') 

# aqui resultado:
bar1

Las barras salen orden alfabetico, para que respeten el orden de la tabla ‘NomDf’ hay que ser explicitos:

bar1 = bar1 + scale_x_discrete(limits = NomDf$variable)
bar1

En los gráficos de barra, sólo las variables de tipo NOMINAL, como ésta, se pueden reordenar a gusto.

Podemos poner titulos así:

text1="¿Qué acción es mas común?"
text2="Acción"
text3="Conteo"
text4="Fuente: Municipalidad de San Isidro"

bar2= bar1 + labs(title=text1,
                      x =text2, 
                      y = text3,
                      caption = text4) 
bar2

Si quieres más cambios detallados:

bar2 + theme_classic() + 
            theme(plot.title = element_text(hjust = 0.5,size=15), # centrar y agrandar
                  plot.caption = element_text(hjust = 0), # a la derecha
                  axis.text.x = element_text(angle=45,hjust = 1)) # angulo

El gráfico de Pareto muestra dos medidas, los conteos y los porcentajes acumulados. Por tradición se trata de detectar que valores representan el 80%.

library(qcc) # instalar antes
## Package 'qcc' version 2.7
## Type 'citation("qcc")' for citing this R package in publications.
pareto.chart(table(sere19$MODALIDAD),cumperc = c(0,50,80,100))

##                            
## Pareto chart analysis for table(sere19$MODALIDAD)
##                              Frequency  Cum.Freq. Percentage Cum.Percent.
##   Conminar / Retirar        151.000000 151.000000  42.178771    42.178771
##   Patrullaje Disuasivo      103.000000 254.000000  28.770950    70.949721
##   Imprudencia del conductor  66.000000 320.000000  18.435754    89.385475
##   Exceso de velocidad        33.000000 353.000000   9.217877    98.603352
##   Falla mecánica              5.000000 358.000000   1.396648   100.000000

Las acciones de conminar y de patrullaje son casi el 80% de las actividades de serenazgo de San Isidro.

  1. Estadísticos:
  • Centrales:
    • La Moda: indica cual es el más común.
library(DescTools)
Mode(sere19$MODALIDAD)
## [1] "Conminar / Retirar"

Del grafico ya la sabíamos.

  • Concentracion: Herfindahl- Hirschman
dataTable=table(sere19$MODALIDAD)

# * < 0.01 : indica que la moda no es significativa, las categorias tienen pesos similares.
# * < 0.15 : indica que la moda no es significativa, varias categorias tienen pesos similares.
# * entre 0.15 - 0.3: hay una moda.
# * > 0.3: La moda se diferencia de los demas

Herfindahl(dataTable)
## [1] 0.3033613
  • Representatividad Efectiva : Laakso - Taagepera
1/sum(prop.table(dataTable)**2)
## [1] 3.296399

Hay 3 grupos representativos.

Parte 2. Explorando Variables ORDINAL

La variable DIA toma siete valores, de domingo a sabado:

table(sere19$DÍA)
## 
##   1   2   3   4   5   6   7 
## 352 443 513 583 597 492 434

Esta es una variable con ORDEN. Hagamos la tabla que usaremos en ggplot:

OrdDf=freq(sere19$DÍA,total = F,exclude = c(NA)) %>% data.frame()
OrdDf=data.frame(variable=row.names(OrdDf),OrdDf,row.names = NULL)

# listo
OrdDf
##   variable   n   X.
## 1        1 352 10.3
## 2        2 443 13.0
## 3        3 513 15.0
## 4        4 583 17.1
## 5        5 597 17.5
## 6        6 492 14.4
## 7        7 434 12.7

Barras:

base=ggplot(data = OrdDf, aes(x=variable, y=n))

bar= base + geom_bar(stat = 'identity')

bar

Note que no alteré el orden.

Veamos el Paretto:

pareto.chart(table(sere19$DÍA),cumperc = c(0,50,80,100))

##    
## Pareto chart analysis for table(sere19$DÍA)
##      Frequency  Cum.Freq. Percentage Cum.Percent.
##   5  597.00000  597.00000   17.48682     17.48682
##   4  583.00000 1180.00000   17.07674     34.56356
##   3  513.00000 1693.00000   15.02636     49.58992
##   6  492.00000 2185.00000   14.41125     64.00117
##   2  443.00000 2628.00000   12.97598     76.97715
##   7  434.00000 3062.00000   12.71236     89.68951
##   1  352.00000 3414.00000   10.31049    100.00000

Como no hay mucha diferencia, 5 dias de 7 suman el 80%.

  1. Estadísticos:
  • Centrales:
    • La Moda
library(DescTools)
Mode(sere19$DÍA)
## [1] 5
  • Concentracion: Herfindahl- Hirschman
dataTable=table(sere19$DÍA)

# * < 0.01 : indica que la moda no es significativa, las categorias tienen pesos similares.
# * < 0.15 : indica que la moda no es significativa, varias categorias tienen pesos similares.
# * entre 0.15 - 0.3: hay una moda.
# * > 0.3: La moda se diferencia de los demas

Herfindahl(dataTable)
## [1] 0.1467166
  • Representatividad Efectiva : Laakso - Taagepera
1/sum(prop.table(dataTable)**2)
## [1] 6.815862

Hay casi 7 grupos representativos (nada destaca)

  • Mediana
Median(sere19$DÍA)
## [1] 4

En la ordinal ya se puede pedir mediana. La mediana indica hasta qué valor llega el 50% de los valores que han tomado los datos. Aquí dice que el 50% de los incidentes ocurren de domingo a miercoles.

Un gráfico que muestra ello es:

ggplot(sere19,aes(y=DÍA)) + geom_boxplot() + scale_y_discrete(limits=OrdDf$variable) 

Note los valores 3, 4 y 6.

  • El 3 es el primer cuartil: 25% de las acciones de los serenos se dan de domingo a miercoles.
  • El 4 es la mediana o cuartil 2.
  • El 6 es el cuartil 3: Otro 25% de las acciones de los serenos se dan de viernes a sábado.

  • EJERCICIO:

Has el mismo analisis con la data enviada a Uds via email. La explicacion de las variables está aqui.

Volver al indice