Librerias

library(tidytext)
## Warning: package 'tidytext' was built under R version 4.3.3
library(textdata)
## Warning: package 'textdata' was built under R version 4.3.3
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyft)
## Warning: package 'tidyft' was built under R version 4.3.3
## 
## Life's short, use R.
## 
## Attaching package: 'tidyft'
## The following objects are masked from 'package:dplyr':
## 
##     add_count, anti_join, arrange, count, cummean, distinct, filter,
##     full_join, group_by, groups, inner_join, lag, lead, left_join,
##     mutate, nth, pull, relocate, rename, right_join, select,
##     select_vars, semi_join, slice, slice_head, slice_max, slice_min,
##     slice_sample, slice_tail, summarise, transmute, ungroup
## The following objects are masked from 'package:stats':
## 
##     filter, lag
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3

Lectura de los datos

Se importa el csv creado de los diferentes datos captados por el sensor y que fueron extraidos de la API con python con otro codigo como ademas se eliminan los campos con valores en cero.

dat <- read.csv("C:/Users/User/OneDrive/Escritorio/datos_apipy.csv")
datos = head(dat, 2000)

View(dat)

dat <- subset(dat, Latitud != "0")
dat <- subset(dat, Altitud != "0.00 Mts")
View(dat)

Recorte de las cadenas de texto

Cortamos el texto de algunos de los datos del csv que podria causar conflicto al momento de convertirlos a valores numericos

dat$Pitch <- substr(dat$Pitch, 21, 27)
dat$Roll <- substr(dat$Roll, 19, 25)
dat$Velocidad <- substr(dat$Velocidad, 1, 4)
dat$Altitud <- substr(dat$Altitud, 1, 7)

Conversion a numerico

Convertimos a valores numericos los diversos campos y despues verificamos que estos lo esten.

dat$Altitud <- as.numeric(as.character(dat$Altitud))
dat$Latitud <- as.numeric(as.character(dat$Latitud))
dat$Longitud <- as.numeric(as.character(dat$Longitud))
dat$Pitch<- as.numeric(as.character(dat$Pitch))
## Warning: NAs introducidos por coerción
dat$Roll<- as.numeric(as.character(dat$Roll))
## Warning: NAs introducidos por coerción
dat$Velocidad<- as.numeric(as.character(dat$Velocidad))
dat$Vibracion<- as.numeric(as.character(dat$Vibracion))
typeof(dat$Altitud)
## [1] "double"
typeof(dat$Latitud)
## [1] "double"
typeof(dat$Longitud)
## [1] "double"
typeof(dat$Pitch)
## [1] "double"
typeof(dat$Roll)
## [1] "double"
typeof(dat$Velocidad)
## [1] "double"
typeof(dat$Vibracion)
## [1] "double"

Campos NA

Buscamos saber si algunos de los campos contienen datos con valores NA’s y eliminamos los que fueron encontrados

sum(is.na(dat$Longitud))
## [1] 0
sum(is.na(dat$Latitud))
## [1] 0
sum(is.na(dat$Altitud))
## [1] 0
sum(is.na(dat$Pitch))
## [1] 2
sum(is.na(dat$Roll))
## [1] 6108
sum(is.na(dat$Velocidad))
## [1] 0
sum(is.na(dat$Vibracion))
## [1] 0
dat <- subset(dat, !is.na(Roll))
dat <- subset(dat, !is.na(Pitch))

View(dat)

Generacion del nuevo csv

ahora que hemos hecho una limpieza de datos guardaremos en un nuevo csv para usarlo mas delante para la generacion de plots

write.csv(dat, file = "datos_apipy_modificado.csv", row.names = FALSE)

Librerias de graficacion e importacion del archivo csv nuevo

usaremos las siguientes librerias para la generacion de plots que nos ayuden a contemplar de forma gracia los diferentes valores captados del dispositivo.

library(ggplot2)
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following objects are masked from 'package:tidyft':
## 
##     arrange, distinct, filter, group_by, groups, mutate, rename,
##     select, slice, summarise, transmute, ungroup
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
sensores <- read.csv("C:/Users/User/OneDrive/Documentos/datos_apipy_modificado.csv")
View(sensores)

Convertir la columna Fecha a tipo datetime

Es importante tambien confirmar que el campo de dato sea de tipo datatime

sensores$Fecha <- as.POSIXct(sensores$Fecha, format="%Y-%m-%dT%H:%M:%OSZ")

Crear gráfico de dispersión con mapeo de color y tamaño basado en Altitud

Los valores de la altitud es representada en metros la mayoria se centra entre los 2000 y 2030 metros, los valores mas altos son debido a que el dispositivo se llego a colocar en la parte mas alta de unas puertas de acero

plot_ly(sensores, x = ~Fecha, y = ~Altitud, type = 'scatter', mode = 'markers+lines',
        marker = list(size = ~Altitud/100, color = ~Altitud, colorscale = 'Viridis', showscale = TRUE)) %>%
  layout(title = 'Altitud a lo largo del tiempo con mapeo de color y tamaño',
         xaxis = list(title = 'Fecha', tickformat = "%d-%m-%Y %H:%M:%S", tickangle = 45),
         yaxis = list(title = 'Altitud'),
         margin = list(b = 150),
         colorbar = list(title = 'Altitud'))
## Warning: 'layout' objects don't have these attributes: 'colorbar'
## Valid attributes include:
## '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'

Grafico de burbujas de la vibracion a lo largo del tiempo.

El sensor quedo calibrado de forma muy sencible para poder captar cualquier vibracion, en este caso las mayores vibraciones fueron captadas cuando el dispositivo fue manipulado para diferentes propositos como reubicacion.

plot_ly(sensores, x = ~Fecha, y = ~Vibracion, type = 'scatter', mode = 'markers',
        marker = list(size = ~Vibracion / 50, color = ~Vibracion, colorscale = 'Cividis', showscale = TRUE)) %>%
  layout(title = 'Vibración a lo largo del tiempo con Bubble Chart',
         xaxis = list(title = 'Fecha', tickformat = "%d-%m-%Y %H:%M:%S", tickangle = 45),
         yaxis = list(title = 'Vibración'),
         margin = list(b = 150),
         colorbar = list(title = 'Vibración'))
## Warning: 'layout' objects don't have these attributes: 'colorbar'
## Valid attributes include:
## '_deprecated', 'activeshape', 'annotations', 'autosize', 'autotypenumbers', 'calendar', 'clickmode', 'coloraxis', 'colorscale', 'colorway', 'computed', 'datarevision', 'dragmode', 'editrevision', 'editType', 'font', 'geo', 'grid', 'height', 'hidesources', 'hoverdistance', 'hoverlabel', 'hovermode', 'images', 'legend', 'mapbox', 'margin', 'meta', 'metasrc', 'modebar', 'newshape', 'paper_bgcolor', 'plot_bgcolor', 'polar', 'scene', 'selectdirection', 'selectionrevision', 'separators', 'shapes', 'showlegend', 'sliders', 'smith', 'spikedistance', 'template', 'ternary', 'title', 'transition', 'uirevision', 'uniformtext', 'updatemenus', 'width', 'xaxis', 'yaxis', 'barmode', 'bargap', 'mapType'

Dispercion pitch-roll

El roll es la inclinacion lateral y el pitch la inclinacion de la nariz del dispositivo, la mayoria de los datos obtenidos se pueden localizar en un rango aprox de entre 0 a -8 lo cual da entender que el dispositivo estuvo en una posicion recta la mayoria de las ocaciones

plot_ly(sensores, x = ~Pitch, y = ~Roll, type = 'scatter', mode = 'markers') %>%
  layout(title = 'Pitch vs Roll', xaxis = list(title = 'Pitch'), yaxis = list(title = 'Roll'))

Mapa de dispercion de cordenadas

La dispercion de los valores de la localizacion nos da a entender que el dispositivo mantuvo una misma posicion por la mayoria de su funcionamiento y solo varia en valores muy menores

plot_ly(sensores, x = ~Longitud, y = ~Latitud, type = 'scatter', mode = 'markers') %>%
  layout(title = 'Mapa de dispersión de las coordenadas', xaxis = list(title = 'Longitud'), yaxis = list(title = 'Latitud'))

Grafico 3D de la localizacion.

Es igual que grafico que anterior pero mostrado en 3D

plot_ly(sensores, x = ~Longitud, y = ~Latitud, z = ~Altitud, type = 'scatter3d', mode = 'markers') %>%
  layout(title = 'Gráfico 3D de Altitud, Latitud y Longitud', scene = list(
    xaxis = list(title = 'Longitud'),
    yaxis = list(title = 'Latitud'),
    zaxis = list(title = 'Altitud')
  ))

Grafico 3D de la los grados de inclinacion

plot_ly(sensores, x = ~Pitch, y = ~Roll, z = ~Altitud, type = 'scatter3d', mode = 'markers') %>%
  layout(title = 'Gráfico 3D de Pitch, Roll y Altitud', scene = list(
    xaxis = list(title = 'Pitch'),
    yaxis = list(title = 'Roll'),
    zaxis = list(title = 'Altitud')
  ))

Conclusion

El dispositivo RouteRover implicó en un proceso de limpieza y análisis de datos recopilados por diversos sensores.Se logró transformar un conjunto de datos en información significativa y visualmente comprensible. Este proceso incluyó la eliminación de datos inválidos, la conversión de cadenas de texto a valores numéricos y la eliminación de valores faltantes.

Las visualizaciones generadas proporcionaron una comprensión profunda del comportamiento del dispositivo en diferentes aspectos:

1.-Variación de Altitud: Se observó cómo la altitud del dispositivo cambió a lo largo del tiempo, con picos que indicaban su colocación en posiciones elevadas.

2.-Vibraciones: Las mayores vibraciones registradas ocurrieron durante la manipulación del dispositivo, indicando una alta sensibilidad del sensor a los movimientos.

3.-Inclinación (Pitch y Roll): Los datos mostraron que el dispositivo mantuvo una inclinación estable, sugiriendo que estuvo en una posición recta la mayor parte del tiempo.

4.-Posición Geográfica: La dispersión mínima de las coordenadas geográficas indicó que el dispositivo permaneció en una ubicación constante.

5.-Visualizaciones 3D: Las representaciones tridimensionales de la localización y los ángulos de inclinación proporcionaron una visión más completa y detallada del comportamiento espacial del dispositivo.

En conclusión, el análisis realizado permitió obtener una visión mas clara del funcionamiento y la estabilidad del dispositivo. Las visualizaciones fueron importantes para interpretar correctamente los datos capturados.Este enfoque no solo mejora la comprensión de los datos, sino que también resalta la importancia de la limpieza y preparación adecuada de los datos para obtener resultados precisos y significativos.