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
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)
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)
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"
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)
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)
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)
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")
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'
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'
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'))
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'))
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')
))
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')
))
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.