Queremos generar unos datos que simulen un sistema de lecturas RFID. Estos sistemas están formados por dos componentes principalmente: 1. Etiqueta o tag: almacen un número de identificación único. 2. Lectores: son los encargados de leer las etiquetas cuando están en su radio de alcance.
Cuando se realiza una lectura los datos que se generan
tienen la siguiente estructura.
a. Identificador único de etiqueta: serie de 6 dígitos. Max: 999.999)
b. Identificador del lector: serie de tres dígitos. 999
c. Timestamp: indica el tiempo en el que se ha producido la lectura.
d. Tipo de evento: booleano. El 0 indica que ha entrado en el rango del lector
y 1 que ha salido del rango del lector.
Para hacer mas sencilla la generación de datos vamos a suponer que las personas ven una media de 50 animales en su visita y que se definen unos intervalos de tiempo para ver cada animal que posteriormente se describen.
Vamos a definir unas constantes para facilitar el cambio de patrones y comportamientos.
Primero definimos el número total de animales de los que obtenemos lecturas. numero_total_animales
Como no todos los asistentes van a ver el mismo número de animales vamos a definir el número de animales que ven en su visita y almacenarlo en numero_animales_vistos
library(dplyr)
library(lattice)
set.seed(21) # Siempre utilizamos el mismo para poder repetir los resultados.
numero_total_animales <- 90
numero_animales_vistos <- 70
Generamos el primer identificador del visitante número 1.
id_visitante1 <- rep(1, numero_animales_vistos)
De los 70 posibles animales que puede ver vamos a coger 50 al azar y vamos a guardarlo en id_animales_vistos (Dar mas probabilidad a los animales más típicos como leon, tigre,…)
id_animales_vistos <- sample(1:numero_total_animales, numero_animales_vistos,
replace = FALSE)
unique(id_animales_vistos)
## [1] 71 23 62 17 83 79 9 15 81 69 54 74 5 48 14 3 39 21 36 46 1 42 53
## [24] 88 20 52 37 50 45 41 57 30 44 77 49 11 12 35 18 26 33 60 25 75 7 29
## [47] 78 34 65 72 31 51 24 40 58 64 84 22 8 47 70 27 10 85 76 4 66 63 73
## [70] 80
length(id_animales_vistos)
## [1] 70
Ahora vamos a crear otra parte del patrón. Vamos a definir los posibles intervalos de tiempo para ver un animal.
1. No interesa: menos de 60 segundos.
2. Me llama la atención. Entre 60 segundos y 180segundos
3. Me gusta, voy a leerme la descripción. Entre 180sg y 300sg
4. Me encanta, quiero una foto. 300sg y 420
5. Me lo llevo al salón de mi casa como sea. Más de 420sg
intervalo1 <- 1:59
intervalo2 <- 60:179
intervalo3 <- 180:299
intervalo4 <- 300:419
intervalo5 <- 420:740
Una vez definidos los intervalos, vamos a definir la probabilidad de estar en cada intervalo.
Probabilidad del intervalo1: 12/70= 17% Probabilidad del intervalo2: 25/70 = 35% Probabilidad del intervalo3: 18/70 = 26% Probabilidad del intervalo4: 12/70 = 17% Probabilidad del intervalo5: 3/70 = 5%
probabilidades <- c(0.17, 0.35, 0.26, 0.17, 0.05)
Cada intervalo se va a definir por un número del 1 al 5. Como vamos a suponer un total de 50 animales vistos, vamos a generar 50 intervalos con las probabilidades anteriores.
intervalos_generados_persona <- sample(1:5, numero_animales_vistos,
replace = TRUE, prob = probabilidades )
intervalos_generados_persona
## [1] 3 3 5 3 3 4 1 2 1 1 3 5 2 1 3 3 3 2 5 4 3 2 4 4 5 2 4 4 2 2 2 4 5 1 3
## [36] 3 3 2 4 1 1 2 3 4 2 2 1 1 1 1 2 2 1 2 2 2 2 5 5 4 1 4 2 3 5 3 3 5 2 2
summary(intervalos_generados_persona)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 2.000 3.000 2.743 4.000 5.000
En el siguiente bucle vamos a generar un vector con el tiempo de visualización de cada intervalo. Los limites inferior y superior estan definidos en intervaloX
tiempo_sg_intervalos <- numeric()
for(i in 1:length(intervalos_generados_persona)) {
if (intervalos_generados_persona[i] == 1)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo1, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 2)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo2, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 3)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo3, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 4)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo4, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 5)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo5, 1, replace = TRUE))
}
tiempo_sg_intervalos
## [1] 250 201 460 240 262 392 3 161 41 44 244 491 129 32 275 206 209
## [18] 160 617 335 284 102 376 403 546 103 350 363 123 100 83 396 535 58
## [35] 195 274 204 89 408 8 24 147 267 307 134 125 31 55 52 33 94
## [52] 144 56 64 117 65 121 425 425 347 13 359 60 225 578 210 223 555
## [69] 121 135
Vamos a utilizar las variables anteriores para crear una tabla con toda la información que hemos generado.
df_visitantes <- data.frame(id_visitante = id_visitante1,
id_animal = id_animales_vistos,
intervalo = intervalos_generados_persona,
tiempo_sg = tiempo_sg_intervalos)
df_visitantes
## id_visitante id_animal intervalo tiempo_sg
## 1 1 71 3 250
## 2 1 23 3 201
## 3 1 62 5 460
## 4 1 17 3 240
## 5 1 83 3 262
## 6 1 79 4 392
## 7 1 9 1 3
## 8 1 15 2 161
## 9 1 81 1 41
## 10 1 69 1 44
## 11 1 54 3 244
## 12 1 74 5 491
## 13 1 5 2 129
## 14 1 48 1 32
## 15 1 14 3 275
## 16 1 3 3 206
## 17 1 39 3 209
## 18 1 21 2 160
## 19 1 36 5 617
## 20 1 46 4 335
## 21 1 1 3 284
## 22 1 42 2 102
## 23 1 53 4 376
## 24 1 88 4 403
## 25 1 20 5 546
## 26 1 52 2 103
## 27 1 37 4 350
## 28 1 50 4 363
## 29 1 45 2 123
## 30 1 41 2 100
## 31 1 57 2 83
## 32 1 30 4 396
## 33 1 44 5 535
## 34 1 77 1 58
## 35 1 49 3 195
## 36 1 11 3 274
## 37 1 12 3 204
## 38 1 35 2 89
## 39 1 18 4 408
## 40 1 26 1 8
## 41 1 33 1 24
## 42 1 60 2 147
## 43 1 25 3 267
## 44 1 75 4 307
## 45 1 7 2 134
## 46 1 29 2 125
## 47 1 78 1 31
## 48 1 34 1 55
## 49 1 65 1 52
## 50 1 72 1 33
## 51 1 31 2 94
## 52 1 51 2 144
## 53 1 24 1 56
## 54 1 40 2 64
## 55 1 58 2 117
## 56 1 64 2 65
## 57 1 84 2 121
## 58 1 22 5 425
## 59 1 8 5 425
## 60 1 47 4 347
## 61 1 70 1 13
## 62 1 27 4 359
## 63 1 10 2 60
## 64 1 85 3 225
## 65 1 76 5 578
## 66 1 4 3 210
## 67 1 66 3 223
## 68 1 63 5 555
## 69 1 73 2 121
## 70 1 80 2 135
Con las acciones anteriores hemos generado las interacciones de nuestro primer visitante. Vamos a representarla gráficamente para ver primero que nos dicen de nuestro patrón y si se cumplen nuestros requesitos.
Grafico 1: Cuánto tiempo ha empleado en ver cada animal?
df_visitantes %>%
with(xyplot(tiempo_sg ~ id_animal, type = "h",
main = "Tiempo invertido en cada animal por el visitante1",
xlab = "ID Animal",
ylab = "Tiempo(sg)"))
Cuanto tiempo ha empleado en cada intervalo?
df_visitantes %>%
group_by(intervalo) %>%
summarise(tiempo_intervalo_min = sum(tiempo_sg/60))
## Source: local data frame [5 x 2]
##
## intervalo tiempo_intervalo_min
## 1 1 7.50000
## 2 2 39.61667
## 3 3 62.81667
## 4 4 67.26667
## 5 5 77.20000
Cuanto tiempo ha empleado en total?
df_visitantes %>%
summarise(tiempo_total_horas = sum(tiempo_sg/60/60),
total_animales = n())
## tiempo_total_horas total_animales
## 1 4.24 70
Cuáles son los animales del intervalo 5?
df_visitantes %>%
filter(intervalo == 5)
## id_visitante id_animal intervalo tiempo_sg
## 1 1 62 5 460
## 2 1 74 5 491
## 3 1 36 5 617
## 4 1 20 5 546
## 5 1 44 5 535
## 6 1 22 5 425
## 7 1 8 5 425
## 8 1 76 5 578
## 9 1 63 5 555
set.seed(21) # Siempre utilizamos el mismo para poder repetir los resultados.
#Constantes
numero_total_animales <- 90
numero_animales_vistos <- 70
df_visitantes <- data.frame()
for(id in 1:1000) {
id_visitante <- rep(id, numero_animales_vistos)
# Generar los identificadores de los animales
id_animales_vistos <- sample(1:numero_total_animales, numero_animales_vistos,
replace = FALSE)
# Intervalos
intervalo1 <- 1:59
intervalo2 <- 60:179
intervalo3 <- 180:299
intervalo4 <- 300:419
intervalo5 <- 420:740
#Probabilidades de intervalo
probabilidades <- c(0.17, 0.35, 0.26, 0.17, 0.05)
#Generación aleatorio de intervalos con la probabilidad anterior
intervalos_generados_persona <- sample(1:5, numero_animales_vistos,
replace = TRUE, prob = probabilidades )
# Generacion aleatoria del tiempo para cada observación dependiendo de su
# intervalo
tiempo_sg_intervalos <- numeric()
for(i in 1:length(intervalos_generados_persona)) {
if (intervalos_generados_persona[i] == 1)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo1, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 2)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo2, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 3)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo3, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 4)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo4, 1, replace = TRUE))
else if (intervalos_generados_persona[i] == 5)
tiempo_sg_intervalos <- c(tiempo_sg_intervalos, sample(intervalo5, 1, replace = TRUE))
}
# Generacion de tabla para un visitante
df_visitante <- data.frame(id_visitante = id_visitante,
id_animal = id_animales_vistos,
intervalo = intervalos_generados_persona,
tiempo_sg = tiempo_sg_intervalos)
# Unir la tabla anterior con la tabla de todos los visitantes.
df_visitantes <- rbind(df_visitantes, df_visitante)
}
Cual es el tiempo medio que se invierte en ver a cada animal?
df_visitantes %>%
group_by(id_animal) %>%
summarise(tiempo_medio_animal = mean(tiempo_sg)) %>%
with(xyplot(tiempo_medio_animal ~ id_animal, type = "h",
main = "Tiempo invertido en cada animal",
xlab = "ID Animal",
ylab = "Tiempo(sg)"))
Cuanto tiempo han empleado en total en cada intervalo? Cuanto tiempo de media han estado en cada intervalo?
df_visitantes %>%
group_by(intervalo) %>%
summarise(tiempo_total_h = sum(tiempo_sg)/60/60,
tiempo_medio_m = mean(tiempo_sg))
## Source: local data frame [5 x 3]
##
## intervalo tiempo_total_h tiempo_medio_m
## 1 1 99.12139 29.95358
## 2 2 807.47278 119.53705
## 3 3 1216.30639 239.62694
## 4 4 1193.72389 359.67576
## 5 5 572.63194 581.02452
Cuanto tiempo ha empleado de media cada visitante en su visita?
df_visitantes %>%
group_by(id_visitante) %>%
summarise(tiempo_media_visitante = mean(tiempo_sg))
## Source: local data frame [1,000 x 2]
##
## id_visitante tiempo_media_visitante
## 1 1 218.0571
## 2 2 179.7857
## 3 3 200.8714
## 4 4 220.0429
## 5 5 229.0857
## 6 6 200.2571
## 7 7 182.1429
## 8 8 192.1286
## 9 9 231.9714
## 10 10 203.1571
## .. ... ...
Cuál es el tiempo medio por intervalo?
df_visitantes %>%
group_by(id_visitante) %>%
summarise(tiempo_visitante_min = sum(tiempo_sg)/60,
tiempo_medio_intervalo = sum(tiempo_visitante_min)/n())
## Source: local data frame [1,000 x 3]
##
## id_visitante tiempo_visitante_min tiempo_medio_intervalo
## 1 1 254.4000 3.634286
## 2 2 209.7500 2.996429
## 3 3 234.3500 3.347857
## 4 4 256.7167 3.667381
## 5 5 267.2667 3.818095
## 6 6 233.6333 3.337619
## 7 7 212.5000 3.035714
## 8 8 224.1500 3.202143
## 9 9 270.6333 3.866190
## 10 10 237.0167 3.385952
## .. ... ... ...
Cuánto tiempo han empleado en total todos los visitantes?
df_visitantes %>%
summarise(tiempo_total_horas = sum(tiempo_sg/60/60),
total_animales = n())
## tiempo_total_horas total_animales
## 1 3889.256 70000
Cuáles son los animales del intervalo 5?
#df_visitantes %>%
#filter(intervalo == 5)
Para que fuera mas representativo habría que añadir una columna con el nombre que le corresponde a cada identificador del animal.
Añadir a la clase de animal que pertenece.