1 Contexto del proyecto


Nuestro cliente está desarrollando un sistema que va a ser implementando en grandes superficies.Mientras que el GPS funciona de manera concreta en el exterior, falla en gran medida dentro de superficies (edificios.etc).

Nuestra labor es evaluar con multiples modelos de machine learning cual produce los mejores resultados


2 Objetivos

2.1 Objetivos de la tarea


Investigar la viabilidad del uso de “wifi fingerprinting” para determinar la localización de una persona en espacios indoor


2.2 Contexto del database


El contexto del database de “UJIIndoorLoc” es el siguiente:

Está formado por 3 edificios de la Universitat Jaume I, con más de 4 plantas y casi 110.000 metros cuadrados La database tienen un total de 19937 training/data guardadas (trainingData.csv file) y 1111 validation/test data(validationData.csv file)


2.3 Constitucion del dataset


Nos han provisto con un amplio database de de “wifi fingerprints” que consta de los siguientes atributos:

Atributo 001 (WAP001) - (WAP520) Atributo 521 (Longitude) Atributo 522 (Latitude) Atributo 523 (Floor) Atributo 524 (BuildingID) Atributo 525 (SpaceID) Atributo 526 (RelativePosition) Atributo 527 (UserID) Atributo 528 (PhoneID) Atributo 529 (Timestamp)


3 Proceso de trabajo


1.Exploración del dataset 2.Pre-procesado de la información 3.División de la información 4.Predicción de las variables 5.Conclusiones


4 Preprocesado de los datos


Cargamos las librerias.

library("caret")
library("tidyr")
library("dplyr")
library("lubridate")
library("TTR")
library("ggplot2")
library("caTools")
#library("unfactor") 
library("gbm")

Leemos las tabla de datos.

Trainingdata_RAW<-read.table("C:/Users/mikel/Desktop/Data Analysis/Módulo 4/UJIndoorLoc/trainingDataTXT.txt", header = TRUE, sep = ";",stringsAsFactors = FALSE)

Trainingdata<-Trainingdata_RAW

Validationdata_RAW<-read.table("C:/Users/mikel/Desktop/Data Analysis/Módulo 4/UJIndoorLoc/validationDataTXT.txt", header = TRUE, sep = ";",stringsAsFactors = FALSE)

Validationdata<-Validationdata_RAW

Creamos un unico dataset para facilitar tu gestion. A partir de ahi realizamos un split de train/test. A su vez,a todos los WAPS cuyo valor sea 100 le asignamos un valor de -105. Esto nos ayudará a escalar y visualizar correctamente nuestros datos.

# We have build a big data set with both of them


data <- rbind(Trainingdata, Validationdata)

datawaps<-data[,c(1:520,524)]

sample <- sample.split(datawaps, SplitRatio = .70)


# We divide the data into training and testing

training <- subset(datawaps, sample ==TRUE)

training[training==100] <- -105

testing <- subset(datawaps, sample == FALSE)
 
testing[testing==100] <- -105


#We changue the value of all de WAPS 100

testing_All <- subset(data, sample == FALSE)

testing_All[testing_All==100] <- -105


training_All <- subset(data, sample ==TRUE)

training_All[training_All==100] <- -105

Durante los siguientes pasos procedemos a crear el modelo para establecer una predicción en cuanto al Building ID donde se encontraría la persona que se conectara al WAP. Para ello, utilizamos el modelo KNN, después de aplicar otros modelos como Randorm Forest o SVM, es el algoritmo que mayor efectividad nos proporciona.

training$BUILDINGID<-as.factor(training$BUILDINGID)

ctrl<-trainControl(method = "cv", number = 3,repeats=2)

KNN_build0<-train(BUILDINGID~.,
                  data = training,
                  method="knn",
                  trControl=ctrl,
                  tuneLength=10)


#We make the prediction with the validation data
KNN_pred_build0<-predict(KNN_build0,testing)

#Plot predicted verses actual
plot(KNN_pred_build0)

summary(KNN_pred_build0)
##    0    1    2 
## 1742 1619 2984
postResample(testing$BUILDINGID,KNN_pred_build0)
##  Accuracy     Kappa 
## 0.9974783 0.9960530

A continuación filtrando la predicción en base al Building ID, prepararemos el dataset para calcular la predicción de la variable Floor.

#Filtering the buildings



#training_building0 <- training[which(training$BUILDINGID == 0), ]


training_building0 <- training[which(training_All$BUILDINGID == 0), ]

training_building1<- training[which(training_All$BUILDINGID == 1), ]

training_building2<- training[which(training_All$BUILDINGID == 2), ]


#Añadimos al testing la preddciones generadas anteriormente en su Building ID, posteriormente los separaremos en sus building correspondientes

testing$BUILDINGID <- KNN_pred_build0

#testing_building0 <- testing [which(testing$BUILDINGID == 0), ]

testing_building0 <- testing[ which(testing_All$BUILDINGID == 0) , ]

testing_building1 <- testing[which(testing_All$BUILDINGID == 1), ]
 
testing_building2 <- testing[which(testing_All$BUILDINGID == 2), ]


#Tenemos que cambiar la columna de Building por la de floor para poder hacer la predicción


#Hemos añadido la variable de floor al testing

training_building0_floor <- training_building0

#Hemos asignado el floor del building real

training_building0_floor$FLOOR <- training_All$FLOOR[which(training_All$BUILDINGID == 0)]

testing_building0_floor <- testing_building0

#Hemos asignado el floor del building predicho

testing_building0_floor$FLOOR <- testing_All$FLOOR[which(testing_All$BUILDINGID == 0)]

#Eliminamos la variable de Building

training_building0_floor$BUILDINGID<-NULL

testing_building0_floor$BUILDINGID<-NULL 




#Repetimos el proceso con el building 1

training_building1_floor <- training_building1

training_building1_floor$FLOOR <- training_All$FLOOR[which(training_All$BUILDINGID == 1)]

testing_building1_floor <- testing_building1

testing_building1_floor$FLOOR <- testing_All$FLOOR[which(testing_All$BUILDINGID == 1)]

training_building1_floor$BUILDINGID<-NULL

testing_building1_floor$BUILDINGID<-NULL 




#Repetimos el proceso con el building 2

training_building2_floor <- training_building2

training_building2_floor$FLOOR <- training_All$FLOOR[which(training_All$BUILDINGID == 2)]

testing_building2_floor <- testing_building2

testing_building2_floor$FLOOR <- testing_All$FLOOR[which(testing_All$BUILDINGID == 2)]

training_building2_floor$BUILDINGID<-NULL

testing_building2_floor$BUILDINGID<-NULL 

calculamos la predicción de la variable Floor

#KNN aplicado en el building 0

training_building0_floor$FLOOR<-as.factor(training_building0_floor$FLOOR)

KNN_building0_floor<-train(FLOOR~.,
                 data = training_building0_floor,
                 method="knn",
                 trControl=ctrl,
                 tuneLength=10)


#We make the prediction with the validation data
KNN_pred_floor_build0<-predict(KNN_building0_floor,testing_building0_floor)

#Plot predicted verses actual
plot(KNN_pred_floor_build0)

summary(KNN_pred_floor_build0)
##   0   1   2   3 
## 341 468 488 445
postResample(testing_building0_floor$FLOOR,KNN_pred_floor_build0)
##  Accuracy     Kappa 
## 0.9931114 0.9907614
#KNN aplicado en el building 1

training_building1_floor$FLOOR<-as.factor(training_building1_floor$FLOOR)

KNN_building1_floor<-train(FLOOR~.,
                           data = training_building1_floor,
                           method="knn",
                           trControl=ctrl,
                           tuneLength=10)

KNN_pred_floor_build1<-predict(KNN_building1_floor,testing_building1_floor)

plot(KNN_pred_floor_build1)

summary(KNN_pred_floor_build1)
##   0   1   2   3 
## 416 479 445 295
postResample(testing_building1_floor$FLOOR,KNN_pred_floor_build1)
##  Accuracy     Kappa 
## 0.9944954 0.9925885
#KNN aplicado en el building 2

training_building2_floor$FLOOR<-as.factor(training_building2_floor$FLOOR)

KNN_building2_floor<-train(FLOOR~.,
                           data = training_building2_floor,
                           method="knn",
                           trControl=ctrl,
                           tuneLength=10)

KNN_pred_floor_build2<-predict(KNN_building2_floor,testing_building2_floor)

plot(KNN_pred_floor_build2)

summary(KNN_pred_floor_build2)
##   0   1   2   3   4 
## 603 685 504 837 339
postResample(testing_building2_floor$FLOOR,KNN_pred_floor_build2)
##  Accuracy     Kappa 
## 0.9949461 0.9935556

5 Visualizaciones y plots


Figura 1:

ggplot(Trainingdata, aes(x=LONGITUDE)) + geom_point(aes(y=LATITUDE, color=factor(FLOOR)))

Figura 2:

ggplot() + geom_histogram(aes(x = c(as.matrix(datawaps)))) + xlim(-104,0) + xlab("WAPS Intensity")


6 Conclusiones


La predicción de las variables Building ID y Floor se han conseguido llevar a cabo con un acierto superior al 99% a través del algoritmo KNN. Por lo tanto, a través de esta técnica podríamos situar el edificio y el piso en el que se encuentra el usuario al WAP.

A nivel de negocio, es un proyecto viable y con potencial de negocio si se determina un contexto técnico específico a abordar (detalle de las variables) y un modelo de negocio

Algunos aspectos prácticos de implementación de esta tecnología son:

Grandes multinacionales como Starbucks, podrían aplicar este sistema en su estructura de establecimientos para conocer la experiencia de cada usuario y generar una con mayor valor y personalizable a cada uno (tiempos de espera, movimientos.etc)

Por otro lado, almacenes con tránsito logístico podrían ser un nicho a abordar. Independientemente de que hayamos hablado de personas, un punto WAP que sea activado por cada mercancía, podría servirnos para conocer tiempos de gestión o localización, aumentando su efectividad