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:
# 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
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.
library(DescTools)
Mode(sere19$MODALIDAD)
## [1] "Conminar / Retirar"
Del grafico ya la sabíamos.
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
1/sum(prop.table(dataTable)**2)
## [1] 3.296399
Hay 3 grupos representativos.
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%.
library(DescTools)
Mode(sere19$DÍA)
## [1] 5
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
1/sum(prop.table(dataTable)**2)
## [1] 6.815862
Hay casi 7 grupos representativos (nada destaca)
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.
Has el mismo analisis con la data enviada a Uds via email. La explicacion de las variables está aqui.
Volver al indice