inverso <- function(x) {
x <- 1 / x
return(x)
}
inverso(8)[1] 0.125
Manipulación de dataframe, manejo de datos, visualización de datos y manipulación de datos no estructurados de tipo texto
Una función permite escribir un fragmento de código parametrizado. De esta forma, es posible escribir un bloque de código y ejecutarlo para distintos datos. Una función puede considerarse un subprograma que resuelve una subtarea. Un motivo para utilizar funciones es que permiten estructurar u organizar el código de un programa. Cuando hay que resolver un problema complejo, en lugar de intentar solucionarlo mediante un programa muy extenso es mejor descomponerlo en subproblemas. Los subproblemas deben tener una complejidad moderada, de forma que sean resueltos por subprogramas (como las funciones) sencillos. Así, en lugar de utilizar un programa muy grande para resolver un problema complejo se emplean distintos subprogramas que resuelven tareas sencillas y que se combinan para producir una solución final más simple.
Definir una función
nombre_de_la_función <- function(Argumento1, Argumento2,…) {
… código del programa….
return(resultado) }
Los argumentos son los valores que se pasan a la función, son variables.
inverso <- function(x) {
x <- 1 / x
return(x)
}
inverso(8)[1] 0.125
inverso(1:4)[1] 1.0000000 0.5000000 0.3333333 0.2500000
Vamos a empezar a estudiar las funciones creando una función que calcula el máximo de sus dos argumentos:
maximo <- function(a, b) {
if (a > b) {
n <- a
} else {
n <- b
}
n
}
maximo(7, 3)[1] 7
y <- 19
maximo(21, y + 8)[1] 27
Para crear una función se usa la palabra reservada function. A continuación se enumeran los parámetros formales de la función separados por comas y encerrados entre paréntesis (en el ejemplo los parámetros formales son a y b). Después viene el código de la función. Puesto que el código del ejemplo tiene más de una instrucción, hay que encerrarlo entre llaves. Con esto se crea un objeto función que se asigna a la variable maximo.
Una vez creado el objeto función y haber sido asignado a maximo, en el ejemplo aparecen dos invocaciones a la función. En la primera se usan los parámetros reales 6 y 2, y en la segunda 20 y la expresión y + 7. Al invocar a una función se evalúan las expresiones que conforman los parámetros reales y se emparejan con los parámetros formales, es decir, a cada parámetro formal se le asigna el resultado de evaluar la expresión usada como parámetro real. Los parámetros formales son variables que reciben la información de entrada de la función (en el ejemplo, a y b). Una vez emparejados parámetros reales con formales se ejecutan las instrucciones de la función. Una función devuelve como salida el resultado de evaluar la última instrucción que ejecuta. En el ejemplo, la última instrucción ejecutada es m, que es una expresión que produce el máximo de los dos valores de entrada de la función (almacenados en a y b). Veamos otros ejemplos de invocación a la función maximo:
n <- maximo(3, 4) # se asigna la salida de la función a n
2 + maximo(5, 6.2) # la invocación a la función forma parte de una expresión[1] 8.2
Anteriormente hemos comentado que una función devuelve el resultado de evaluar la última instrucción que ejecuta. Esto es cierto si el código de la función no invoca a la función return. La función return tiene un parámetro y produce el siguiente efecto: termina la ejecución de la función en la que se ejecuta y el valor devuelto por la función es el parámetro con que es invocada return. Por ejemplo, la función maximo previa puede codificarse así:
maximo <- function(a, b) {
if (a > b) {
n <- a
} else {
n <- b
}
return(n)
}
maximo(7, 3)[1] 7
Otra posibilidad es:
maximo <- function(a, b) {
if (a > b) {
return(a)
} else {
return(b)
}
}
maximo(7, 10)[1] 10
Una función puede realizar cálculos complejos, por lo que a veces necesita usar variables para almacenar los resultados intermedios de sus cálculos. Por ejemplo, la siguiente función calcula la suma de los elementos de un vector:
# Función que suma los elementos de un vector (recibido en v)
suma <- function(v) {
r <- 0
for (x in v) {
r <- r + x
}
r
}
suma(c(2, 5, -3))[1] 4
Las variables creadas en una función se llaman variables locales. En el ejemplo, la variable r es una variable local que se usa para acumular los elementos del vector. Las variables locales, junto con los parámetros formales, se crean al ejecutarse la función y normalmente desaparecen al terminar su ejecución. Las variables locales y parámetros formales son independientes de otras variables que puedan existir fuera de la función con el mismo nombre. Por ejemplo:
v <- 5
r <- 10
suma <- function(v) {
r <- 0
for (x in v) {
r <- r + x
}
r
}
suma(c(2, 5, -3))[1] 4
v[1] 5
r[1] 10
Observa que el parámetro formal v y la variable local r coinciden en nombre con otras variables externas a la función. Al invocar a la función suma se crean las variables locales v y r y al terminar su ejecución desaparecen, siendo independientes de las variables v y r que conservan sus valores.
Una función también puede usar variables que se han creado fuera de la función. Por ejemplo:
w <- 10
f <- function(x) {
x + w
}
f(4)[1] 14
La función f usa el valor de la variable w que no es una variable local, sino que es global a la función (ha sido creada fuera). En general, el uso de variables globales no es considerada una buena práctica de programación, por lo que no las usaremos. No obstante, es conveniente saber de su existencia, pues hay muchos programas en R que las utilizan.
El operador de superasignación: <<-, permite modificar variables globales:
w <- 10
f <- function() {
w <<- w + 2
}
w[1] 10
f()
w[1] 12
Puesto que nosotros no usaremos variables globales, no usaremos este operador.
En el tema de variables y expresiones ya comentamos que las funciones pueden tener parámetros por defecto. Un parámetro por defecto es un parámetro formal que se define terminándolo con un igual y una expresión. Vamos a ver su utilidad con un ejemplo. La siguiente función sirve para calcular la distancia euclídea entre dos puntos en un espacio bidimensional y no usa parámetros por defecto:
# distancia entre los puntos (x1, y1) y (x2, y2)
distancia_eu <- function(x1, y1, x2, y2) {
sqrt((x1 - x2)^2 + (y1 - y2)^2)
}
distancia_eu(1, 1, 2, 2) # distancia entre (1, 1) y (2, 2)[1] 1.414214
Como es muy común calcular la distancia de un punto al origen, se decide que el segundo punto sea, por defecto, el origen:
# distancia entre los puntos (x1, y1) y (x2, y2)
distancia_eu2 <- function(x1, y1, x2 = 0, y2 = 0) {
sqrt((x1 - x2)^2 + (y1 - y2)^2)
}
distancia_eu2(1, 1, 2, 2) # distancia entre (1, 1) y (2, 2)[1] 1.414214
distancia_eu2(4, 4) # distancia entre (4, 4) y (0, 0)[1] 5.656854
En esta versión de la función con parámetros por defecto, cuando un punto sea el origen no es preciso especificarlo. El efecto de un parámetro por defecto es que, si no se especifica al ser invocada la función, el parámetro formal toma el valor por defecto, es decir, el especificado tras el operador igual en la definición de la función.
En todas las invocaciones a funciones realizadas hasta ahora en este tema se ha usado la invocación posicional, es decir, parámetros reales y formales se emparejan según su posición (el primer parámetro real se empareja con el primer parámetro formal, el segundo con el segundo, …). Recordemos que al invocar una función en R los parámetros también se pueden especificar por nombre:
# Invocación posicional: distancia entre (1, 1) y (2, 2)
distancia_eu2(1, 1, 2, 2)[1] 1.414214
# Invocación por nombre: distancia entre (1, 1) y (2, 2)
distancia_eu2(x1 = 1, x2 = 2, y1 = 1, y2 = 2)[1] 1.414214
En R una función es un objeto más, como un vector o un data frame. Esto implica que se puede operar con funciones como con otros tipos de objetos. En el siguiente ejemplo, se asigna una función:
f <- function(x) {
x^2
}
f(8)[1] 64
g <- f # se asigna a g la función asociada a f
g(3) # invocamos a la función a través de g[1] 9
Otro ejemplo es crear una lista cuyos elementos son funciones:
suma <- function(a, b) a + b
resta <- function(a, b) a - b
operaciones <- list(s = suma, r = resta)
operaciones[[1]](2, 4)[1] 6
operaciones[[2]](2, 4)[1] -2
operaciones$s(5, 6)[1] 11
Una función también puede ser el parámetro de otra función. Ya hemos visto ejemplos de esto en funciones como apply o lapply. Vamos a crear nuestra versión simplificada de lapply. Recordemos que esta función aplica una función, recibida como parámetro, a los elementos de una lista y devuelve una lista con el resultado.
# Aplica una función a los elementos de una lista
# Parámetros de entrada:
# - l, la lista
# - f, la función a aplicar a los elementos de l
# Parámetros de salida: una lista con el resultado de aplicar f
# a los elementos de l
mi_lapply <- function(l, f) {
salida <- list()
for (ind in seq_along(l)) {
salida[[ind]] <- f(l[[ind]])
}
return(salida)
}
l <- list(1, 2, 3)
f <- function(x) x^3
mi_lapply(l, f)[[1]]
[1] 1
[[2]]
[1] 8
[[3]]
[1] 27
lapply(l, f)[[1]]
[1] 1
[[2]]
[1] 8
[[3]]
[1] 27
Aunque todo esto es bastante útil, especialmente los parámetros de tipo función, en este curso no lo vamos a utilizar.
Un “módulo” se refiere a una técnica de programación que permite dividir y organizar el código en piezas más pequeñas y reutilizables. Los módulos son útiles cuando se trabaja en proyectos grandes o cuando se desea separar diferentes funcionalidades para mantener el código más legible y fácil de mantener.
En términos prácticos, un módulo es una función que encapsula un conjunto de operaciones relacionadas. Estos módulos pueden aceptar entradas (argumentos) y producir salidas, permitiendo su uso repetido en distintas partes de un proyecto. Esto promueve la reutilización del código y facilita la gestión de la lógica compleja al dividirla en componentes más pequeños y manejables.
Los módulos se implementan generalmente como funciones que pueden ser llamadas con argumentos específicos y devolver resultados que se integran en el flujo principal del código. Esto ayuda a evitar la repetición de código y a simplificar la estructura general del programa.
Al utilizar módulos, puedes estructurar tu código de una manera más modular, lo que facilita la comprensión, el mantenimiento y la colaboración en proyectos grandes o complejos.
A contianuación veremos un ejemplo de un módulo que calcula la media, la mediana y la desviación estándar de un vector numérico.
# Definir el módulo para calcular la media, mediana y desviación estándar
modulo_estadisticas <- function(datos) {
media <- mean(datos)
mediana <- median(datos)
desviacion <- sd(datos)
# Devolver los resultados como un listado
return(list(media = media, mediana = mediana, desviacion = desviacion))
}Este módulo llamado modulo_estadisticas toma un argumento datos, que debe ser un vector numérico. Calcula la media, la mediana y la desviación estándar de este vector y devuelve los resultados en un listado.
A continuación, puedes utilizar este módulo en otro script o en la consola de RStudio:
# Cargar el módulo
# source("ruta/del/archivo/modulo_estadisticas.R")
# Crear un vector de números aleatorios
vector_numerico <- rnorm(100)
# Usar el módulo para calcular las estadísticas
resultados_estadisticos <- modulo_estadisticas(vector_numerico)
# Mostrar los resultados
cat("La media es:", resultados_estadisticos$media, "\n")La media es: 0.01253475
cat("La mediana es:", resultados_estadisticos$mediana, "\n")La mediana es: -0.04904493
cat("La desviación estándar es:", resultados_estadisticos$desviacion, "\n")La desviación estándar es: 0.9091695
En este ejemplo, generamos un vector de números aleatorios vector_numerico y luego utilizamos el módulo modulo_estadisticas para calcular la media, la mediana y la desviación estándar de este vector. Los resultados se imprimen en la consola para su visualización.
Este módulo puede ser útil para calcular rápidamente estadísticas descriptivas básicas de un conjunto de datos numéricos en cualquier parte de tu código, lo que facilita el análisis estadístico.
El paquete dplyr fue desarrollado por Hadley Wickham de RStudio y es un versión optimizada de su paquete plyr. El paquete dplyr no proporciona ninguna nueva funcionalidad a R per se, en el sentido que todo aquello que podemos hacer con dplyr lo podríamos hacer con la sintaxis básica de R.
Una importante contribución del paquete dplyr es que proporciona una “gramática” (particularmente verbos) para la manipulación y operaciones con data frames. Con esta gramática podemos comunicar mediante nuestro código que es lo que estamos haciendo en los data frames a otras personas (asumiendo que conozcan la gramática). Esto es muy útil, ya que proporciona una abstracción que anteriormente no existía. Por último, cabe destacar que las funciones del paquete dplyr son muy rápidas, puesto que están implementadas con el lenguaje C++.
La grámatica de dplyr:
Algunas de los principales “verbos” del paquete dplyr son:
select: devuelve un conjunto de columnas.
filter: devuelve un conjunto de filas según una o varias condiciones lógicas.
arrange: reordena filas de un data frame.
rename: renombra variables en una data frame mutate: añade nuevas. variables/columnas o transforma variables existentes.
summarise/summarize: genera resúmenes estadísticos de diferentes variables en el data frame, posiblemente con strata.
_%>% : el operador “pipe” es usado para conectar múltiples acciones en una única “pipeline” (tubería).
Instalación del paquete dplyr
Podemos instalar el paquete desde CRAN o desde GitHub.
## Instalación desde CRAN
## install.packages("dplyr")## Instalación desde GitHub
## library(devtools)
## install_github("hadley/dplyr")Después de la instalación es importante que lo carguemos en nuestra sesión R:
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
Con sólo dos funciones: gather y spread. El paquete tidyr (Wickham and Henry 2018) tiene como finalidad el tomar bases de datos no tidy y transformalas en tidy (datos limpios y ordenados). Para esto, gather transforma tablas anchas en largas y spread transforma tablas anchas en larga.
tidyr se basa en el principio de datos ordenados y “tidy”. Los datos “tidy” se refieren a un formato en el que cada variable tiene su propia columna y cada observación se encuentra en una fila. Esto facilita el análisis y la manipulación de datos.
gather: Transforma datos de un formato “ancho” a “largo”, reuniendo columnas en una sola columna de datos y creando nuevas columnas para indicar el tipo de variable.
spread: Realiza la operación inversa de gather(), transformando datos de un formato “largo” a “ancho” al separar valores de una columna en múltiples columnas.
separate y unite: Se utilizan para separar una columna única en múltiples columnas o combinar múltiples columnas en una sola columna, respectivamente.
Limpieza de datos: tidyr es útil para limpiar datos desordenados, como cuando las variables están dispersas en múltiples columnas o cuando se necesita reorganizar datos para facilitar su análisis.
Compatibilidad con dplyr: tidyr se integra bien con dplyr, otra librería popular en R. Esto permite realizar manipulaciones y transformaciones de datos complejas y poderosas combinando las funcionalidades de ambas librerías.
Es una librería en R diseñada para crear gráficos y visualizaciones de datos de una manera altamente personalizable y basada en una gramática de gráficos. Fue creada por Hadley Wickham y se basa en la idea de “gramática de gráficos”, que proporciona un marco conceptual para construir gráficos de forma modular y estructurada.
Algunos conceptos clave sobre ggplot2:
Datos: Se refiere a los datos que se van a visualizar.
Aesthetics (estética): Define cómo se mapean las variables a atributos visuales (como color, forma, tamaño) en el gráfico.
Geometría: Representa el tipo de gráfico (puntos, líneas, barras, etc.) que se utilizará para visualizar los datos.
Escalas: Asocian los valores de los datos a propiedades visuales, como mapear valores numéricos a posiciones en el eje x o y.
Temas: Controlan el aspecto visual del gráfico, como colores, fuentes y estilos.
Capas: ggplot2 crea gráficos mediante la adición de capas. Cada función que agrega información al gráfico (como geom_point() para puntos o geom_line() para líneas) se añade como una capa adicional.
Mapeo de datos a estética: ggplot2 permite mapear variables de los datos a propiedades visuales del gráfico. Por ejemplo, se puede mapear una variable numérica a los colores o tamaños de los puntos en un gráfico de dispersión.
Facetas: Esta funcionalidad permite dividir el gráfico en múltiples paneles, cada uno mostrando una porción de los datos de acuerdo con una variable específica.
Flexibilidad y personalización: ggplot2 es altamente flexible y permite una gran personalización. Los usuarios pueden ajustar casi todos los aspectos del gráfico para adaptarse a sus necesidades y preferencias.
El paquete caret (classification and regression training, Kuhn (2016)) incluye una serie de funciones que facilitan el uso de decenas de métodos complejos de clasificación y regresión. Utilizar este paquete en lugar de las funciones originales de los métodos presenta dos ventajas:
Permite utilizar un código unificado para aplicar reglas de clasificación muy distintas, implementadas en diferentes paquetes.
Es más fácil poner en práctica algunos procedimientos usuales en problemas de clasificación. Por ejemplo, hay funciones específicas para dividir la muestra en datos de entrenamiento y datos de test o para ajustar parámetros mediante validación cruzada.
El paquete ofrece funciones y métodos de utilidad para el procesamiento, modelado y evaluación de modelos predictivos.
Caret ofrece varias funciones, como:
preProcess: Aplica el escalado de datos y la normalización para el aprendizaje automático.
train: Entrena un modelo predictivo.
predict: Realiza predicciones utilizando un modelo entrenado.
confusionMatrix: Genera una matriz de confusión para evaluar el rendimiento de un modelo predictivo.
tune: Realiza una optimización del modelo utilizando técnicas de optimización de parámetros.
varImp: Estima la importancia de las variables predictivas en el modelo.
Caret también admite modelos de regresión y clasificación de diversos paquetes de R, como randomForest, xgboost, rpart, nnet, svm, kknn, naiveBayes, pls, etc. Además, admite funciones de arremollo (cross-validation) para evitar el sobreajuste y evaluar el rendimiento de los modelos en conjuntos de datos independientes.
En resumen, caret es una herramienta poderosa para simplificar y agilizar el proceso de entrenamiento, evaluación y selección de modelos de aprendizaje automático en R. Facilita la construcción de modelos más precisos al proporcionar una interfaz unificada, preprocesamiento de datos y opciones avanzadas de ajuste de hiperparámetros y evaluación del modelo.
Los dataframes (marcos de datos) son el objeto más habitual para almacenar datos en R. En este tipo de objeto, cada individuo o fecha corresponde a una fila y cada columna corresponde a una variable. Dentro de este tipo de estructura puedes almacenar diferentes tipos de datos.
¿Cómo crear un dataframe en R?
En R es muy sencillo crear un nuevo dataframe. Puedes unir tus variables haciendo uso de la función data.frame para convertir tus datos a la estructura de datos de tipo data frame. Primero, necesitas tener algunas variables almacenadas para crear el marco de datos en R.
Para unir los datos puedes usar la función data.frame. En este ejemplo, vamos a almacenar el data frame en una variable llamada ventas:
# Crear un DataFrame de ventas mensuales por región
datos <- data.frame(
Mes = rep(1:12, times = 3), # Meses del año (repetidos 3 veces para cada región)
Region = rep(c('Norte', 'Sur', 'Este'), each = 12), # Regiones
Ventas = round(runif(36, min = 100, max = 5000)) # Ventas aleatorias entre 100 y 5000
)
# Mostrar el DataFrame
print(datos) Mes Region Ventas
1 1 Norte 2260
2 2 Norte 2230
3 3 Norte 4953
4 4 Norte 2173
5 5 Norte 3272
6 6 Norte 2914
7 7 Norte 695
8 8 Norte 3103
9 9 Norte 408
10 10 Norte 2819
11 11 Norte 4502
12 12 Norte 4584
13 1 Sur 2234
14 2 Sur 3722
15 3 Sur 1745
16 4 Sur 1697
17 5 Sur 2715
18 6 Sur 2459
19 7 Sur 4368
20 8 Sur 4043
21 9 Sur 4665
22 10 Sur 3322
23 11 Sur 4997
24 12 Sur 1570
25 1 Este 3783
26 2 Este 4743
27 3 Este 1560
28 4 Este 1131
29 5 Este 1390
30 6 Este 3302
31 7 Este 4619
32 8 Este 4283
33 9 Este 1008
34 10 Este 2413
35 11 Este 1464
36 12 Este 3409
Puedes utilizar la función summary que devolverá un resumen estadístico de las variables (columnas) del conjunto de datos.
# Mostrar el resumen estadístico del DataFrame
summary(datos) Mes Region Ventas
Min. : 1.00 Length:36 Min. : 408
1st Qu.: 3.75 Class :character 1st Qu.:1733
Median : 6.50 Mode :character Median :2866
Mean : 6.50 Mean :2904
3rd Qu.: 9.25 3rd Qu.:4103
Max. :12.00 Max. :4997
Accediendo a los datos del dataframe
Hay varias formas de acceder a las columnas almacenadas en los data frames:
Usando el signo del dollar ($) y el nombre de la columna.
Usando corchetes con el índice de la columna después de una coma.
Como ejemplo, si quieres seleccionar la columna mes del data frame que creamos antes, ejecuta lo siguiente:
datos$mesNULL
datos[, 1] # Equivalente [1] 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1
[26] 2 3 4 5 6 7 8 9 10 11 12
También puedes seleccionar varias variables a la vez. Para ello puedes:
Crear una secuencia de índices.
Crear un vector con la función c con los nombres de las variables o índices que quieras seleccionar.
# Seleccionando las columnas 1 a 3 con una secuencia
datos[, 1:3] Mes Region Ventas
1 1 Norte 2260
2 2 Norte 2230
3 3 Norte 4953
4 4 Norte 2173
5 5 Norte 3272
6 6 Norte 2914
7 7 Norte 695
8 8 Norte 3103
9 9 Norte 408
10 10 Norte 2819
11 11 Norte 4502
12 12 Norte 4584
13 1 Sur 2234
14 2 Sur 3722
15 3 Sur 1745
16 4 Sur 1697
17 5 Sur 2715
18 6 Sur 2459
19 7 Sur 4368
20 8 Sur 4043
21 9 Sur 4665
22 10 Sur 3322
23 11 Sur 4997
24 12 Sur 1570
25 1 Este 3783
26 2 Este 4743
27 3 Este 1560
28 4 Este 1131
29 5 Este 1390
30 6 Este 3302
31 7 Este 4619
32 8 Este 4283
33 9 Este 1008
34 10 Este 2413
35 11 Este 1464
36 12 Este 3409
# Seleccionando columnas con la función 'c'
datos[, c("Region", "Ventas")] Region Ventas
1 Norte 2260
2 Norte 2230
3 Norte 4953
4 Norte 2173
5 Norte 3272
6 Norte 2914
7 Norte 695
8 Norte 3103
9 Norte 408
10 Norte 2819
11 Norte 4502
12 Norte 4584
13 Sur 2234
14 Sur 3722
15 Sur 1745
16 Sur 1697
17 Sur 2715
18 Sur 2459
19 Sur 4368
20 Sur 4043
21 Sur 4665
22 Sur 3322
23 Sur 4997
24 Sur 1570
25 Este 3783
26 Este 4743
27 Este 1560
28 Este 1131
29 Este 1390
30 Este 3302
31 Este 4619
32 Este 4283
33 Este 1008
34 Este 2413
35 Este 1464
36 Este 3409
datos[, c(2, 3)] # Equivalente Region Ventas
1 Norte 2260
2 Norte 2230
3 Norte 4953
4 Norte 2173
5 Norte 3272
6 Norte 2914
7 Norte 695
8 Norte 3103
9 Norte 408
10 Norte 2819
11 Norte 4502
12 Norte 4584
13 Sur 2234
14 Sur 3722
15 Sur 1745
16 Sur 1697
17 Sur 2715
18 Sur 2459
19 Sur 4368
20 Sur 4043
21 Sur 4665
22 Sur 3322
23 Sur 4997
24 Sur 1570
25 Este 3783
26 Este 4743
27 Este 1560
28 Este 1131
29 Este 1390
30 Este 3302
31 Este 4619
32 Este 4283
33 Este 1008
34 Este 2413
35 Este 1464
36 Este 3409
Acceso directo utilizando la función attach
Si no quieres escribir el nombre del data frame una y otra vez, simplemente puedes hacer un uso directo de las variables si pasas el nombre del data frame a la función attach:
attach(datos)
Ventas # Ahora tenemos acceso directo a las variables [1] 2260 2230 4953 2173 3272 2914 695 3103 408 2819 4502 4584 2234 3722 1745
[16] 1697 2715 2459 4368 4043 4665 3322 4997 1570 3783 4743 1560 1131 1390 3302
[31] 4619 4283 1008 2413 1464 3409
Añadir columnas y filas a un dataframe
A veces necesitas modificar los datos para agregar nuevas filas o columnas, o eliminarlas. Para los siguientes ejemplos, utilizaremos el conjunto de datos cars, registrado en la década de 1920, que forma parte de los conjuntos de datos de ejemplo de R. Puedes cargarlo ejecutando data(cars). La base de datos contiene 50 filas y 2 variables:
Si ejecutas head(cars) obtendrás el siguiente resultado:
head(cars) speed dist
1 4 2
2 4 10
3 7 4
4 7 22
5 8 16
6 9 10
Supón que quieres crear una nueva variable para transformar la velocidad en kilómetros por hora (km/h) y la distancia en metros.
Entonces, ahora podrías agregar dos nuevas columnas llamadas kph (kilómetros por hora) y meters (metros) con el siguiente código:
cars$kph <- cars$speed / 0.62137
cars$meters <- cars$dist / 3.2808También puedes hacer uso de la función cbind. En caso de que quisieses agregar una nueva fila, podrías usar la función rbind.
kph <- cars$speed / 0.62137
meters <- cars$dist / 3.2808
cars <- cbind(cars[, c(1, 2)], kph, meters)head(cars) speed dist kph meters
1 4 2 6.437388 0.6096074
2 4 10 6.437388 3.0480371
3 7 4 11.265430 1.2192148
4 7 22 11.265430 6.7056815
5 8 16 12.874777 4.8768593
6 9 10 14.484124 3.0480371
Eliminar columnas y filas de un dataframe
Ahora, si quieres borrar variables o filas de un data frame, tienes varias opciones:
Usar el signo menos (-) e indicar las columnas o filas que quieras borrar.
Crear un subconjunto de los datos que quieras conservar.
Como ejemplo, borraremos las variables speed y disty para evitar sobrescribir el conjunto de datos original guardaremos nuestros resultados en un nuevo data frame llamado cars2.
# Borrando la primera y segunda columna con el signo -
cars2 <- cars[, -c(1, 2)]
# Seleccionar solo las columnas que queremos conservar
cars2 <- cars[, c("kph", "meters")] Si vuelves a utilizar la función head, podrás ver el nuevo data frame.
head(cars2) kph meters
1 6.437388 0.6096074
2 6.437388 3.0480371
3 11.265430 1.2192148
4 11.265430 6.7056815
5 12.874777 4.8768593
6 14.484124 3.0480371
Ordenando y filtrando datos de un dataframe en R
Es habitual ordenar o filtrar los datos dentro de los dataframes por los valores de alguna variable.
Ordenar data frames:
Considera, como ilustración, el conjunto de datos mtcars y cárgalos ejecutando data(mtcars). Podemos acceder al índice de ordenación de cualquier variable con la función order.
ii <- order(mtcars$hp) # Índice de ordenación en base a la variable 'hp'
# (caballos de fuerza)El vector de índices de ordenación establece el orden en que tienen que ser elegidas las filas del data frame para obtener la ordenación deseada.
# Ordenando por 'hp' (de más bajo a más alto)
# Solo mostramos las primeras 4 columnas
head(mtcars[ii, 1:4]) mpg cyl disp hp
Honda Civic 30.4 4 75.7 52
Merc 240D 24.4 4 146.7 62
Toyota Corolla 33.9 4 71.1 65
Fiat 128 32.4 4 78.7 66
Fiat X1-9 27.3 4 79.0 66
Porsche 914-2 26.0 4 120.3 91
También puedes ordenar de mayor a menor haciendo uso del signo menos.
ii <- order(mtcars$cyl, mtcars$hp)
head(mtcars[ii, 1:4]) mpg cyl disp hp
Honda Civic 30.4 4 75.7 52
Merc 240D 24.4 4 146.7 62
Toyota Corolla 33.9 4 71.1 65
Fiat 128 32.4 4 78.7 66
Fiat X1-9 27.3 4 79.0 66
Porsche 914-2 26.0 4 120.3 91
En el mundo laboral debido al incremento en el volumen de datos y la necesidad de automatización de tareas se ha generado la necesidad de implementar nuevos softwares y lenguajes de programación a las tareas del día a día. Adicionalmente, al ser R open source, muchos de los desarrollos de la frontera de conocimiento se han implementado en R, por lo que el aprendizaje de R es vital para los investigadores.
El proceso de análisis de datos siempre conlleva procedimientos de limpieza de los valores que implican realizar eliminación o generación de nuevos datos. Este proceso es relevante ya que sin datos eficientes y veraces todos los procesos posteriores serán erróneos o poco eficaces.
Además, R trabaja en forma preferente con datos tabulados (en forma de tablas) y su formato preferido es el dataframe. Los datos tabulados establecen:
Cada variable esta almacenada en su propia columna.
Cada observación esta almacenada en su propia fila.
Cada tabla corresponde a un tipo de observación.
El análisis de los datos tiene como objetivo extraer información de ello. Por ello se requiere entre otras operaciones: Extraer las variables existentes en el conjunto de datos, Extraer las observaciones preexistentes, Derivar nuevas variables sobre las ya existentes y Cambiar las unidades de las variables.
El análisis de datos es la ciencia que se encarga de examinar un conjunto de datos con el propósito de sacar conclusiones sobre la información para poder tomar decisiones, o simplemente ampliar los conocimientos sobre diversos temas.
El análisis de datos consiste en someter los datos a la realización de operaciones, esto se hace con la finalidad de obtener conclusiones precisas que nos ayudarán a alcanzar nuestros objetivos, dichas operaciones no pueden definirse previamente ya que la recolección de datos puede revelar ciertas dificultades.
Actualmente, muchas industrias usan el análisis de datos para sacar conclusiones y decidir acciones a implementar. Cabe mencionar que la ciencia también usa el análisis de datos para comprobar o descartar teorías o modelos existentes.
Daniel Burrus, asesor de negocios y orador de temas empresariales y de innovación dice en referencia al análisis de datos: “Mucho de esto ayudará a los humanos a trabajar más, de forma inteligente y rápido, porque tenemos datos sobre todo lo que ocurre”.
El análisis de datos se utiliza en muchas industrias, independientemente del ramo, nos da las bases para tomar o no una decisión o cerciorarnos si una hipótesis es cierta o no.
Mercadotecnia: el análisis de datos se ha usado principalmente para predecir el comportamiento de los consumidores, incluso para poder calificarlo. Conoce cómo hacer un análisis de datos para tu campaña de marketing.
Recursos Humanos: el análisis de datos también es muy útil dentro de las empresas para mantener un buen clima laboral , y fuera de ella, calificando empleados potenciales.
Académicos: Al igual que las empresas el análisis de datos también está presente en la educación, sirve para seleccionar a los alumnos de nuevo ingreso y para medir el rendimiento de los estudiantes.
Si queremos datos útiles, debemos analizarlos. Para ello debemos recurrir a diversas técnicas que dependen del tipo de información que se esté recopilando, por lo que es importante tener definida la técnica a utilizar antes de implementarla.
Análisis de datos cualitativo: Los datos cualitativos se presentan de manera verbal (en ocasiones en gráficas). Se basa en la interpretación. Las formas más comunes de obtener esta información es a través de entrevistas abiertas, grupos de discusión y grupos de observación, donde los investigadores generalmente analizan patrones en las observaciones durante toda la fase de recolección de datos.
Análisis de datos cuantitativos: Los datos cuantitativos se presentan en forma numérica. Se basa en resultados tangibles.
El análisis de datos se centra en llegar a una conclusión basada únicamente en lo que ya es conocido por el investigador. La forma en que recopila sus datos debe relacionarse con la forma en que está planeando analizarla y utilizarla, también hay que asegurarse de recopilar información precisa en la que puedas confiar, para ello existen muchas técnicas de recolección de datos.
La técnica más usada por los expertos son las encuestas online, ya que puede traer grandes beneficios como la reducción de tiempo y dinero.
Toma de decisiones informada: El análisis de datos permite tomar decisiones basadas en hechos y tendencias reales en lugar de depender únicamente de intuiciones o suposiciones.
Optimización de procesos: Identificar patrones y tendencias en los datos ayuda a mejorar la eficiencia operativa, reduciendo costos y tiempos en los procesos empresariales.
Identificación de oportunidades: El análisis de datos puede revelar oportunidades de crecimiento, nichos de mercado o áreas de mejora, permitiendo a las empresas adaptarse rápidamente a cambios y maximizar su potencial.
Mejora en la personalización: Al entender mejor el comportamiento del usuario a través de los datos, las empresas pueden personalizar sus productos o servicios para satisfacer las necesidades específicas de sus clientes, mejorando así la experiencia del usuario.
Prevención de fraudes: El análisis de datos puede ser utilizado para detectar patrones sospechosos o anomalías que podrían indicar actividades fraudulentas, lo que es crucial en sectores como las finanzas y la seguridad.
Conocer los principales tipos de análisis de datos ofrece beneficios concretos para las empresas. Les permite mejorar la eficiencia operativa, reducir costos, aumentar las ventas y mejorar la satisfacción del cliente. Por ejemplo, si una empresa utiliza el análisis de datos y detecta un problema recurrente en la satisfacción del cliente, puede tomar medidas para solucionarlo y mejorar la experiencia del cliente.
Análisis de datos descriptivo: El análisis descriptivo proporciona una descripción clara y concisa de los datos disponibles, permitiendo obtener una comprensión general de lo que ha ocurrido en el pasado.
En el análisis descriptivo, se utilizan diversas técnicas y herramientas para resumir y visualizar los datos de manera efectiva. Esto incluye la creación de tablas, gráficos, diagramas y medidas estadísticas relevantes. Estas representaciones visuales y estadísticas ayudan a condensar la información y a identificar patrones, tendencias y características significativas presentes en los datos.
Análisis de datos exploratorio: El análisis exploratorio de datos es uno de los principales tipos de análisis de datos, cuyo objetivo es descubrir patrones ocultos, relaciones y posibles hipótesis dentro de los datos. A diferencia del análisis descriptivo, que se enfoca en proporcionar una visión general retrospectiva, el análisis exploratorio busca profundizar y examinar los datos en detalle para obtener insights significativos.
Durante el análisis exploratorio, se emplean diversas herramientas estadísticas y técnicas de visualización avanzadas para explorar los datos de manera más profunda. Esto implica utilizar gráficos interactivos, diagramas de dispersión, mapas de calor, análisis de correlación y otras técnicas para identificar relaciones y tendencias que podrían no ser evidentes a simple vista.
Análisis de datos predictivo: De entre todos los principales tipos de análisis de datos, el análisis predictivo es una metodología que se apoya en modelos y algoritmos para realizar predicciones y estimaciones sobre eventos y comportamientos futuros. Este enfoque se basa en el uso de información histórica para identificar patrones y construir modelos que puedan predecir resultados futuros con cierto grado de precisión.
Análisis de datos prescriptivo: El análisis prescriptivo es una metodología avanzada que va más allá del análisis predictivo y se enfoca en proporcionar recomendaciones y acciones específicas para optimizar resultados futuros. Este tipo de análisis utiliza técnicas como la optimización y la simulación para identificar la mejor acción a tomar en función de los objetivos y restricciones establecidos.
R posee muchas herramientos y paquetes para el análisis de datos entre ellas
dplyr: Un paquete que facilita la manipulación y transformación de datos, proporcionando funciones intuitivas para filtrar, seleccionar, organizar y resumir datos.
ggplot2: Ideal para crear visualizaciones gráficas de alta calidad. Permite construir gráficos complejos de manera flexible y es altamente personalizable.
Shiny: Permite construir aplicaciones web interactivas directamente desde R. Es excelente para compartir análisis de datos de manera interactiva.
tidyr: Complementa a dplyr al proporcionar herramientas para dar formato a los datos, como la función gather() y spread() para convertir datos entre formatos “largos” y “anchos”.
caret: Facilita el entrenamiento y evaluación de modelos predictivos. Es útil para la selección de modelos y la optimización de parámetros.
RSQLite y DBI: Para trabajar con bases de datos SQLite directamente desde RStudio, facilitando el manejo de grandes conjuntos de datos almacenados en bases de datos.
knitr: Se utiliza para integrar de manera sencilla código R en documentos de texto, lo que facilita la creación de informes dinámicos.
Estas herramientas y paquetes pueden brindar una sólida base para el análisis de datos en RStudio, permitiéndote realizar desde manipulaciones simples hasta análisis más complejos y la creación de informes interactivos.
Es una colección de paquetes disponibles en R y orientados a la manipulación, importación, exploración y visualización de datos y que se utiliza exhaustivamente en ciencia de datos. El uso de Tidyverse permite facilitar el trabajo estadístico y la generación de trabajos reproducibles. Está compuesto de los siguientes paquetes:
Readr: readr ofrece funciones eficientes para la lectura de datos rectangulares, mejorando la velocidad en comparación con las funciones base de R.
Ejemplo:
library(readr)Warning: package 'readr' was built under R version 4.3.2
# Leer un archivo CSV
#data <- read_csv("ruta/del/archivo.csv")Dplyr: dplyr proporciona un conjunto de funciones para manipulación y transformación de datos. Las funciones son fáciles de leer y permiten crear flujos de trabajo claros.
Ejemplo:
library(dplyr)
# Filtrar autos con más de 20 mpg
filtered_data <- mtcars %>% filter(mpg > 20)
filtered_data mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
# Seleccionar columnas 'mpg' y 'disp'
selected_data <- mtcars %>% select(mpg, disp)
selected_data mpg disp
Mazda RX4 21.0 160.0
Mazda RX4 Wag 21.0 160.0
Datsun 710 22.8 108.0
Hornet 4 Drive 21.4 258.0
Hornet Sportabout 18.7 360.0
Valiant 18.1 225.0
Duster 360 14.3 360.0
Merc 240D 24.4 146.7
Merc 230 22.8 140.8
Merc 280 19.2 167.6
Merc 280C 17.8 167.6
Merc 450SE 16.4 275.8
Merc 450SL 17.3 275.8
Merc 450SLC 15.2 275.8
Cadillac Fleetwood 10.4 472.0
Lincoln Continental 10.4 460.0
Chrysler Imperial 14.7 440.0
Fiat 128 32.4 78.7
Honda Civic 30.4 75.7
Toyota Corolla 33.9 71.1
Toyota Corona 21.5 120.1
Dodge Challenger 15.5 318.0
AMC Javelin 15.2 304.0
Camaro Z28 13.3 350.0
Pontiac Firebird 19.2 400.0
Fiat X1-9 27.3 79.0
Porsche 914-2 26.0 120.3
Lotus Europa 30.4 95.1
Ford Pantera L 15.8 351.0
Ferrari Dino 19.7 145.0
Maserati Bora 15.0 301.0
Volvo 142E 21.4 121.0
# Crear una nueva variable 'hp_per_disp'
mutated_data <- mtcars %>% mutate(hp_per_disp = hp / disp)
mutated_data mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
hp_per_disp
Mazda RX4 0.6875000
Mazda RX4 Wag 0.6875000
Datsun 710 0.8611111
Hornet 4 Drive 0.4263566
Hornet Sportabout 0.4861111
Valiant 0.4666667
Duster 360 0.6805556
Merc 240D 0.4226312
Merc 230 0.6747159
Merc 280 0.7338902
Merc 280C 0.7338902
Merc 450SE 0.6526468
Merc 450SL 0.6526468
Merc 450SLC 0.6526468
Cadillac Fleetwood 0.4343220
Lincoln Continental 0.4673913
Chrysler Imperial 0.5227273
Fiat 128 0.8386277
Honda Civic 0.6869221
Toyota Corolla 0.9142053
Toyota Corona 0.8076603
Dodge Challenger 0.4716981
AMC Javelin 0.4934211
Camaro Z28 0.7000000
Pontiac Firebird 0.4375000
Fiat X1-9 0.8354430
Porsche 914-2 0.7564422
Lotus Europa 1.1882229
Ford Pantera L 0.7521368
Ferrari Dino 1.2068966
Maserati Bora 1.1129568
Volvo 142E 0.9008264
Ggplot2: ggplot2 es una potente librería para la creación de gráficos en R. Utiliza una gramática de gráficos que permite construir visualizaciones complejas a partir de componentes simples.
Ejemplo:
library(ggplot2)
# Crear un gráfico de dispersión con colores según la variable 'gear'
ggplot(mtcars, aes(x = mpg, y = disp, color = factor(gear))) +
geom_point() +
labs(title = "Relación entre mpg y disp", x = "Millas por galón", y = "Desplazamiento")Tibble: tibble proporciona una versión moderna de los data frames en R, con mejoras en la impresión y manipulación.
Ejemplo:
library(tibble)
# Crear un tibble
my_tibble <- tibble(x = c(1, 2, 3), y = c("a", "b", "c"))
my_tibble# A tibble: 3 × 2
x y
<dbl> <chr>
1 1 a
2 2 b
3 3 c
Tidyr: tidyr se centra en la manipulación de la estructura de los datos, permitiendo la conversión entre formatos ancho y largo.
Ejemplo:
library(tidyr)Purrr: purrr facilita la manipulación de funciones y listas, introduciendo conceptos como mapas y reducciones.
Ejemplo:
library(purrr)
# Aplicar una función a cada elemento de una lista
squared_values <- map_dbl(1:5, ~ .x^2)
squared_values[1] 1 4 9 16 25
Stringr: stringr simplifica la manipulación de cadenas de texto mediante funciones intuitivas.
Ejemplo:
library(stringr)
# Extraer números de una cadena
numbers <- str_extract("abc123def456", "\\d+")
numbers[1] "123"
Forcats: Se centra en la manipulación de factores, que son una forma de representar variables categóricas en R. Facilita la manipulación y visualización de variables categóricas.
Ejemplo:
library(forcats)
# Reordenar niveles de un factor según la mediana de mpg
# Asegúrate de que carb es un factor
mtcars$carb <- as.factor(mtcars$carb)
# Utiliza mutate con fct_reorder
ordered_data <- mtcars %>%
mutate(carb = fct_reorder(carb, mpg, .fun = median))
ordered_data mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
¿Qué es análisis de flujo de datos?
Los analistas desean conocer las respuestas a cuatros preguntas: ¿Qué procesos integran el sistema? ¿Qué datos emplea cada proceso? ¿Qué datos son almacenados? ¿Qué datos entran y salen del sistema?
Como vemos el elemento fundamental en una Organización (sistema de información), van a ser los datos. Los datos son las guías de las actividades de la Organización, inician eventos, son procesados para dar información útil al personal, etc.
Seguir el flujo de datos por todos los procesos de la organización, además de ser la finalidad del análisis de flujo de datos, proporciona a los analistas información de cómo se alcanzan los objetivos en la Organización.
El análisis de flujo de datos estudia el empleo de los datos en cada actividad. Se basa en los diagramas de flujo de datos que muestra de forma gráfica la relación entre procesos y datos, y en los diccionarios de datos que describen de manera formal los datos del sistema y los sitios donde son utilizados.
Herramientas para el análisis de flujo de datos
Las herramientas tienen el objetivo de ayudar a entender las características del sistema. Por lo tanto no deben de ser un fin, sino un medio para el estudio del sistema.
Las herramientas utilizadas en el análisis de flujo de datos son:
Diagrama de flujo de datos.
Una herramienta gráfica empleada para describir y analizar el movimiento de datos a través de un sistema, incluyendo procesos, almacenamiento de datos y retrasos del sistema. Los diagramas de flujo de datos es la herramienta más importante y la base sobre la cual se desarrollan otros componentes. La transformación de datos de entrada en salida por medio de procesos puede describirse en forma lógica e independiente de los componentes físicos. Estos diagramas reciben el nombre de diagramas lógicos de flujo de datos, en contraste de los diagramas físicos del flujo de datos que muestran la implantación y movimiento real de datos entre personas, departamentos y estaciones de trabajo.
Diccionario de datos
El diccionario de datos contiene las características lógicas de los sitios donde se almacenan los datos del sistema, incluyendo nombre, descripción, alias, contenidos y organización, así como los procesos donde se emplea los datos y los sitios donde se necesita el acceso inmediato a la información. Servirán para identificar los requerimientos de las bases de datos durante el diseño del sistema.
Diagrama entidad-relación
Este diagrama es una descripción de la relación entre entidades (personas, lugares, eventos y objetos) de un sistema y el conjunto de información relacionado con la entidad. No considera el almacenamiento físico de datos.
Gráfica de estructura (Especificación de procesos)
Herramienta de diseño que muestra con símbolos la relación entre módulos de procesamiento y el software de la computadora. Incluye el análisis de las transformaciones entrada transformación salida y el análisis de transacciones.
Ventajas del análisis de flujo de datos
Los analistas deben trabajar con los usuarios para hacerles comprender el funcionamiento del sistema actual y el sistema futuro, para ello se hace aconsejable utilizar un lenguaje común, sencillo y fiable, estas son las características de los diagramas de flujo de datos. Los usuarios pueden hacer sugerencias para modificar los diagramas con la finalidad de describir las actividades con mayor exactitud, y permitirá evitar los errores desde el inicio pudiendo prevenir una posible falla del sistema.
Diagramas de flujo de datos
Son una de las cuatro herramientas de análisis estructurado. Es una herramienta gráfica que se emplea para describir y analizar el movimiento de los datos a través de un sistema, ya sea este manual o automizado, incluyendo procesos, lugares para almacenar datos y retrasos en el sistema. Los DFD, como se les conoce popularmente son la herramienta más importante y la base sobre la cual se desarrollan otros componentes. La transformación de datos de entrada en salida por medio de procesos puede describirse en forma lógica e independiente de los componentes físicos asociadso con el sistema.
A los primeros diagramas obtenidos se les conoce como diagramas de alto nivel, mientras que a lo resultantes de estos se les conoce como diagramas de bajo nivel.
Primer nivel del DFD
En el primer nivel, es muy importante identificar los principales procesos, y flujos que dan en forma conjunta operacional al sistema que se está modelando.
Algunos analistas consideran ventajoso trababjar primero con todos los flujos de datos y asignar, como ya se dijo nombres que sean significativos y descriptivos. Se identifican todos los procesos, como va se mencionó pero no se les da nombre hasta que sean bien entendidos todos los flujos de datos. Después cuando se les ha asignado nombre a los procesos, si el analista tiene dificultas para ligar los flujos de datos con los nombres apropiados entonces esta situación indica que es necesario dividir aun más el proceso.
Diccionario de datos
Un diccionario de datos es un catálogo, un depósito de los elementos de un sistema. Estos elementos se centran alrededor de los datos y la forma en que están estructurados para satisfacer los requermientos y las necesidades de la organización. En él se encuentra la lista de todos los elementos que forman parte del flujo de datos en todo el sistema.
Importancia del diccionario:
Los analistas usan los diccionarios de datos por cinco razones principales:
Manejar los detalles en sistemas grandes.
Comunicar un signifcado común para todos los elementos del sistema Documentar las carácteristicas del sistema.
Facilitar el análisis de los detalles con la finalidad de evaluar las características y determinar donde efecturar cambios en el sistema.
Localizar errores y omisiones en el sistema.
Microsoft Excel es una de las aplicaciones más utilizadas para analizar datos y elaborar representaciones gráficas. Por ello es bastante habitual encontrarse con la necesidad de importar a R información alojada en una hoja de cálculo Excel. Para esta tarea podemos recurrir a múltiples paquetes disponibles en CRAN.
readlxl
readxl es un paquete diseñado para hacer una sola tarea: importar hojas de Excel a R. Esto hace que sea un paquete ligero y eficiente, a cambio de no contar con funciones avanzadas.
Este paquete funciona en Windows, Linux y OSX. A diferencia de otros paquetes diseñados para importar hojas de cálculo de Excel a R, readxl no necesita de la instalación de dependencias adicionales en el sistema operativo, tales como Java o Perl.
Preparación
# Instalamos y lo cargamos en la memoria
# install.packages("readxl")
library(readxl)Warning: package 'readxl' was built under R version 4.3.2
mis_datos <- read_excel("eBayAuctions.xls")
mis_datos# A tibble: 1,972 × 8
Category currency sellerRating Duration endDay ClosePrice OpenPrice
<chr> <chr> <dbl> <dbl> <chr> <dbl> <dbl>
1 Music/Movie/Game US 3249 5 Mon 0.01 0.01
2 Music/Movie/Game US 3249 5 Mon 0.01 0.01
3 Music/Movie/Game US 3249 5 Mon 0.01 0.01
4 Music/Movie/Game US 3249 5 Mon 0.01 0.01
5 Music/Movie/Game US 3249 5 Mon 0.01 0.01
6 Music/Movie/Game US 3249 5 Mon 0.01 0.01
7 Music/Movie/Game US 3249 5 Mon 0.01 0.01
8 Music/Movie/Game US 3249 5 Mon 0.01 0.01
9 Music/Movie/Game US 3249 5 Mon 0.01 0.01
10 Music/Movie/Game US 3249 5 Mon 0.01 0.01
# ℹ 1,962 more rows
# ℹ 1 more variable: `Competitive?` <dbl>
openxlsx
openxlsx es un paquete dentro de R, que nos permite leer, escribir y editar archivos de Excel (xlsx). Simplifica la creación de archivos .xlsx proporcionando una interfaz de alto nivel para escribir, diseñar y editar hojas de cálculo. Mediante el uso de ‘Rcpp’, los tiempos de lectura / escritura son comparables a los paquetes ‘xlsx’ y ‘XLConnect’ con el beneficio a?adido de eliminar la dependencia de Java.
Preparación:
# Instalamos y lo cargamos en la memoria
# install.packages ("openxlsx")
library (openxlsx)Warning: package 'openxlsx' was built under R version 4.3.2
mis_datos2 <- read.xlsx("Historicalinvesttemp.xlsx")
mis_datos2 X1 Annual.Returns.on.Investments.in X3
1 Year Stocks T.Bills
2 1928 0.43809999999999999 3.0800000000000001E-2
3 1929 -8.3000000000000004E-2 3.1600000000000003E-2
4 1930 -0.25119999999999998 4.5499999999999999E-2
5 1931 -0.43840000000000001 2.3099999999999999E-2
6 1932 -8.6400000000000005E-2 1.0699999999999999E-2
7 1933 0.49980000000000002 9.5999999999999992E-3
8 1934 -1.1900000000000001E-2 3.0000000000000001E-3
9 1935 0.46739999999999998 2.3E-3
10 1936 0.31940000000000002 1.5E-3
11 1937 -0.35339999999999999 1.1999999999999999E-3
12 1938 0.2928 1.1000000000000001E-3
13 1939 -1.0999999999999999E-2 2.9999999999999997E-4
14 1940 -0.1067 4.0000000000000002E-4
15 1941 -0.12770000000000001 2.0000000000000001E-4
16 1942 0.19170000000000001 3.3E-3
17 1943 0.25059999999999999 3.8E-3
18 1944 0.1903 3.8E-3
19 1945 0.35820000000000002 3.8E-3
20 1946 -8.43E-2 3.8E-3
21 1947 5.1999999999999998E-2 3.8E-3
22 1948 5.7000000000000002E-2 9.4999999999999998E-3
23 1949 0.183 1.1599999999999999E-2
24 1950 0.30809999999999998 1.0999999999999999E-2
25 <NA> stocks tbills
26 averages <NA> <NA>
X4
1 T.Bonds
2 8.3999999999999995E-3
3 4.2000000000000003E-2
4 4.5400000000000003E-2
5 -2.5600000000000001E-2
6 8.7900000000000006E-2
7 1.8599999999999998E-2
8 7.9600000000000004E-2
9 4.4699999999999997E-2
10 5.0200000000000002E-2
11 1.38E-2
12 4.2099999999999999E-2
13 4.41E-2
14 5.3999999999999999E-2
15 -2.0199999999999999E-2
16 2.29E-2
17 2.4899999999999999E-2
18 2.58E-2
19 3.7999999999999999E-2
20 3.1300000000000001E-2
21 9.1999999999999998E-3
22 1.95E-2
23 4.6600000000000003E-2
24 4.3E-3
25 bonds
26 <NA>
Hay tres formas comunes de importar este archivo CSV a R:
Método 1: usar read.csv
Si el archivo CSV es razonablemente pequeño, puede usar la función read.csv de base R para importarlo.
Cuando utilices este método hay que asegurarnos de especificar stringsAsFactors = FALSE para que R no convierta variables de carácter o categóricas en factores.
El siguiente código muestra cómo usar read.csv para importar este archivo CSV a R:
# Importamos la data
data1 <- read.csv("base_prueba.csv")
data1 X dias temperatura lluvia
1 1 lunes 22.2 TRUE
2 2 martes 21.0 TRUE
3 3 miércoles 23.0 FALSE
4 4 jueves 24.3 FALSE
5 5 viernes 25.0 TRUE
str(data1)'data.frame': 5 obs. of 4 variables:
$ X : int 1 2 3 4 5
$ dias : chr "lunes" "martes" "miércoles" "jueves" ...
$ temperatura: num 22.2 21 23 24.3 25
$ lluvia : logi TRUE TRUE FALSE FALSE TRUE
Método 2: usar read_csv
Si se trabaja con archivos más grandes, se puede utilizar el read_csv función del paquete readr:
# Instalamos y lo cargamos en la memoria
# install.packages("readr")
library(readr)
# importamos la data
data2 <- read_csv("base_prueba.csv")New names:
Rows: 5 Columns: 4
── Column specification
──────────────────────────────────────────────────────── Delimiter: "," chr
(1): dias dbl (2): ...1, temperatura lgl (1): lluvia
ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
Specify the column types or set `show_col_types = FALSE` to quiet this message.
• `` -> `...1`
data2# A tibble: 5 × 4
...1 dias temperatura lluvia
<dbl> <chr> <dbl> <lgl>
1 1 lunes 22.2 TRUE
2 2 martes 21 TRUE
3 3 miércoles 23 FALSE
4 4 jueves 24.3 FALSE
5 5 viernes 25 TRUE
# ver estructura de datos
str(data2)spc_tbl_ [5 × 4] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
$ ...1 : num [1:5] 1 2 3 4 5
$ dias : chr [1:5] "lunes" "martes" "miércoles" "jueves" ...
$ temperatura: num [1:5] 22.2 21 23 24.3 25
$ lluvia : logi [1:5] TRUE TRUE FALSE FALSE TRUE
- attr(*, "spec")=
.. cols(
.. ...1 = col_double(),
.. dias = col_character(),
.. temperatura = col_double(),
.. lluvia = col_logical()
.. )
- attr(*, "problems")=<externalptr>
Método 3: usar fread
Si su CSV es extremadamente grande, la manera más rapida para importar en R es con el fread función del paquete data.table:
# Instalamos y lo cargamos en la memoria
# install.packages("data.table")
library(data.table)Warning: package 'data.table' was built under R version 4.3.2
Attaching package: 'data.table'
The following object is masked from 'package:purrr':
transpose
The following objects are masked from 'package:dplyr':
between, first, last
# Importamos la data
data3 <- fread("base_prueba.csv")
data3 V1 dias temperatura lluvia
1: 1 lunes 22.2 TRUE
2: 2 martes 21.0 TRUE
3: 3 miércoles 23.0 FALSE
4: 4 jueves 24.3 FALSE
5: 5 viernes 25.0 TRUE
str(data3)Classes 'data.table' and 'data.frame': 5 obs. of 4 variables:
$ V1 : int 1 2 3 4 5
$ dias : chr "lunes" "martes" "miércoles" "jueves" ...
$ temperatura: num 22.2 21 23 24.3 25
$ lluvia : logi TRUE TRUE FALSE FALSE TRUE
- attr(*, ".internal.selfref")=<externalptr>
Puedes leer un archivo TXT en R con la función read.table.
Consideremos como ejemplo, que tenemos guardado una archivo llamado y que lo has guardado en tu directorio de trabajo. Puedes leerlo con el siguiente código.
data <- read.table(file = "3.6 Gasolina.txt", header = TRUE)
head(data) gasolina licencias impuestos ingreso carreteras
1 541 52.5 9.0 3.571 1.976
2 524 57.2 9.0 4.092 1.250
3 561 58.0 9.0 3.865 1.586
4 414 52.9 7.5 4.870 2.351
5 410 54.4 8.0 4.399 0.431
6 457 57.1 10.0 5.342 1.333
La salida de un archivo TXT leído con la función read.table será de la clase “data.frame”.
En caso de que tengas el archivo en otro directorio que no sea su directorio de trabajo, deberás especificar la ruta completa donde se encuentra el archivo de datos.
data <- read.table(file = "C:\\Users\\Erick\\Desktop\\TRABAJO FINAL\\3.6 Gasolina.txt", header = TRUE)
data gasolina licencias impuestos ingreso carreteras
1 541 52.5 9.00 3.571 1.976
2 524 57.2 9.00 4.092 1.250
3 561 58.0 9.00 3.865 1.586
4 414 52.9 7.50 4.870 2.351
5 410 54.4 8.00 4.399 0.431
6 457 57.1 10.00 5.342 1.333
7 344 45.1 8.00 5.319 11.868
8 467 55.3 8.00 5.126 2.138
9 464 52.9 8.00 4.447 8.577
10 498 55.2 7.00 4.512 8.507
11 580 53.0 8.00 4.391 5.939
12 471 52.5 7.50 5.126 14.186
13 525 57.4 7.00 4.817 6.930
14 508 54.5 7.00 4.207 6.580
15 566 60.8 7.00 4.332 8.159
16 635 58.6 7.00 4.318 10.340
17 603 57.2 7.00 4.206 8.508
18 714 54.0 7.00 3.718 4.725
19 865 72.4 7.00 4.716 5.915
20 640 67.7 8.50 4.341 6.010
21 649 66.3 7.00 4.593 7.834
22 540 60.2 8.00 4.983 0.602
23 464 51.1 9.00 4.897 2.449
24 547 51.7 9.00 4.258 4.686
25 460 55.1 8.50 4.574 2.619
26 566 54.4 9.00 3.721 4.746
27 577 54.8 8.00 3.448 5.399
28 631 57.9 7.50 3.846 9.061
29 574 56.3 8.00 4.188 5.975
30 534 49.3 9.00 3.601 4.650
31 571 51.8 7.00 3.640 6.905
32 554 51.3 7.00 3.333 6.594
33 577 57.8 8.00 3.063 6.524
34 628 54.7 7.50 3.357 4.121
35 487 48.7 8.00 3.528 3.495
36 644 62.9 6.58 3.802 7.834
37 640 56.6 5.00 4.045 17.782
38 704 58.6 7.00 3.897 6.385
39 648 66.3 8.50 3.635 3.274
40 968 67.2 7.00 4.345 3.905
41 587 62.6 7.00 4.449 4.639
42 699 56.3 7.00 3.656 3.985
43 632 60.3 7.00 4.300 3.635
44 591 50.8 7.00 3.745 2.611
45 782 67.2 6.00 5.215 2.302
46 510 57.1 9.00 4.476 3.942
47 610 62.3 7.00 4.296 4.083
48 524 59.3 7.00 5.002 9.794
También hay dos funciones (read.delim y read.delim2) para tratar con archivos delimitados de forma predeterminada. Estas funciones tienen los argumentos predeterminados siguientes:
## read.delim(file = "mi_archivo.txt" header = TRUE, sep = "\t", dec = ".")
## read.delim2(file = "mi_archivo.txt", header = TRUE, sep = "\t", dec = ",")datos2 <- read.delim("3.6 Gasolina.txt", header = TRUE) # Archivo delimitado por espacios
datos2 gasolina licencias impuestos ingreso carreteras
1 541 52.5 9.00 3.571 1.976
2 524 57.2 9.00 4.092 1.250
3 561 58.0 9.00 3.865 1.586
4 414 52.9 7.50 4.870 2.351
5 410 54.4 8.00 4.399 0.431
6 457 57.1 10.00 5.342 1.333
7 344 45.1 8.00 5.319 11.868
8 467 55.3 8.00 5.126 2.138
9 464 52.9 8.00 4.447 8.577
10 498 55.2 7.00 4.512 8.507
11 580 53.0 8.00 4.391 5.939
12 471 52.5 7.50 5.126 14.186
13 525 57.4 7.00 4.817 6.930
14 508 54.5 7.00 4.207 6.580
15 566 60.8 7.00 4.332 8.159
16 635 58.6 7.00 4.318 10.340
17 603 57.2 7.00 4.206 8.508
18 714 54.0 7.00 3.718 4.725
19 865 72.4 7.00 4.716 5.915
20 640 67.7 8.50 4.341 6.010
21 649 66.3 7.00 4.593 7.834
22 540 60.2 8.00 4.983 0.602
23 464 51.1 9.00 4.897 2.449
24 547 51.7 9.00 4.258 4.686
25 460 55.1 8.50 4.574 2.619
26 566 54.4 9.00 3.721 4.746
27 577 54.8 8.00 3.448 5.399
28 631 57.9 7.50 3.846 9.061
29 574 56.3 8.00 4.188 5.975
30 534 49.3 9.00 3.601 4.650
31 571 51.8 7.00 3.640 6.905
32 554 51.3 7.00 3.333 6.594
33 577 57.8 8.00 3.063 6.524
34 628 54.7 7.50 3.357 4.121
35 487 48.7 8.00 3.528 3.495
36 644 62.9 6.58 3.802 7.834
37 640 56.6 5.00 4.045 17.782
38 704 58.6 7.00 3.897 6.385
39 648 66.3 8.50 3.635 3.274
40 968 67.2 7.00 4.345 3.905
41 587 62.6 7.00 4.449 4.639
42 699 56.3 7.00 3.656 3.985
43 632 60.3 7.00 4.300 3.635
44 591 50.8 7.00 3.745 2.611
45 782 67.2 6.00 5.215 2.302
46 510 57.1 9.00 4.476 3.942
47 610 62.3 7.00 4.296 4.083
48 524 59.3 7.00 5.002 9.794
La existencia de datos ausentes, también conocidos como missing values y representados habitualmente como NA en R, es una casuística habitual en muchas bases de datos. La mayoría de las veces se deben a problemas durante la recopilación de datos, por ejemplo la incapacidad para obtener una cierta medida o respuesta, o fallos en la transcripcioón.
Observación: Al leer datos de una fuente externa, por ejemplo un archivo CSV, los datos ausentes pueden aparecer como comillas vacias, estar representadas por un cierto valor clave o, sencillamente, estar ausentes. Funciones como read.table() permiten indicar qué casos han de ser intepretados como valores ausentes y, en consecuencia aparecer como NA en el data frame
Problemática
La presencia de datos ausentes dificulta la mayoría de operaciones matemáticas y de análisis.
En el siguiente ejercicio genera un conjunto de valores que, hipoteticamente, se han obtenido de una encuesta. Cinco de los encuestados no han respondido, por lo que el valor asocidado es NA.
# Número de horas trabajadas en una encuesta
valores <- as.integer(runif(50, 1, 10))
indices <- as.integer(runif(5, 1, 50)) # Sin respuesta 5 casos
valores[indices] <- NA
valores [1] 7 7 9 NA 6 2 9 NA 8 7 1 4 4 8 3 NA 5 5 7 5 NA 3 NA 7 9
[26] 6 7 8 6 5 5 9 1 7 9 6 5 5 7 5 7 7 5 4 4 3 5 6 7 9
valores > 5 # Los valores NA no pueden ser comparados [1] TRUE TRUE TRUE NA TRUE FALSE TRUE NA TRUE TRUE FALSE FALSE
[13] FALSE TRUE FALSE NA FALSE FALSE TRUE FALSE NA FALSE NA TRUE
[25] TRUE TRUE TRUE TRUE TRUE FALSE FALSE TRUE FALSE TRUE TRUE TRUE
[37] FALSE FALSE TRUE FALSE TRUE TRUE FALSE FALSE FALSE FALSE FALSE TRUE
[49] TRUE TRUE
valores + 10 # Ni se puede operar con ellos [1] 17 17 19 NA 16 12 19 NA 18 17 11 14 14 18 13 NA 15 15 17 15 NA 13 NA 17 19
[26] 16 17 18 16 15 15 19 11 17 19 16 15 15 17 15 17 17 15 14 14 13 15 16 17 19
mean(valores)[1] NA
Detectar existencia de valores ausentes
Antes de operar con un conjunto de datos, por tanto, deberíamos verificar si existen valores asusnetes y, en caso afirmativo, planificar cómo se abordará su tratamiento. Con este fin podemos usar funciones como is.na() y na.fail(), entre otras
Sintáxis is.na(objeto)
Devuelve TRUE si el objeto es un valor ausente o FALSE en caso contrario. Si el objeto es compuesto, como un vector, una matriz o data frame, la comprobación se efectúa elemnto a elemento.
Sintáxis na.fail(objeto)
En caso de que el objeto facilitado como argumento contenga algún valor ausente, esta función genera un error y detiene la ejecución del guión o programa.
En caso de que solamente queramos saber si un objeto contine valores ausentes o no, sin obtener un vector lógico para cada elemento, podemos combinar la salida de is.na() mediante la función any(), tal y como se muestra en el siguiente ejemplo:
# Detectar la presencia de valores nulos antes de operar
is.na(valores) [1] FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
[13] FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE FALSE
[25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE
any(is.na(valores))[1] TRUE
## na.fail(valores)Operar en presencia de datos ausentes
Algunas funciones R están preparadas para trabajar en presencia de datos ausentes, aceptando un parámetro que determina cómo han de ser tratados. Un par de ejemplos de este caso son las funciones mena() y lm(), usadas para obtener el valor promedio (media arítmetica) y ajustar un modelo lineal. La primera acepta el parámetro na.rm, de tipo lógico, con el que se indica si los valores ausnetes deben ser ignorados durante el cálculo o no. La segunda tiene un parámetro llamado na.action que, entre otros, acepta el valor omit, con exactamente el mismo resultado.
En ocasiones, en lugar de eliminar filas completas de datos de una data frame lo que se hace es susituir los valores ausentes por el valor promedio de la columna en la que aparece, o bien con el valor más frecunete o bien algún valor especial.
Ejemplo:
# Operar en presencia de valores ausentes
promedio <- mean(valores, na.rm = TRUE)
promedio[1] 5.866667
valores[is.na(valores)] <- promedio
mean(valores)[1] 5.866667
lm(Solar.R ~ Temp, airquality, na.action=na.omit)
Call:
lm(formula = Solar.R ~ Temp, data = airquality, na.action = na.omit)
Coefficients:
(Intercept) Temp
-24.431 2.693
Los valores atípicos , como sugiere el nombre, son los puntos de datos que se encuentran alejados de los otros puntos del conjunto de datos. Son los valores de datos que aparecen alejados de otros valores de datos y, por lo tanto, perturban la distribución general del conjunto de datos.
Generalmente esto se supone como una distribución anormal de los valores de los datos.
Efecto de los outliers en el modelo:
Los datos resultan estar en un formato sesgado.
Cambia la distribución estadística general de los datos en términos de media, varianza, entre otros.
Conduce a obtener un sesgo en el nivel de precisión del modelo.
Identificacion
la identificación en la gestión de outliers es fundamental para reconocer y comprender la presencia de estos valores atípicos en un conjunto de datos. La identificación adecuada de outliers permite lo siguiente:
Visualización Clara de los Datos:
Gráficos Descriptivos: Métodos visuales como boxplots(diagrama de cajas), histogramas o gráficos de dispersión ayudan de manera significativa a identificar valores atípicos de manera intuitiva y muy rapida rápida.
# Asegúrate de tener la librería necesaria para manipulación de datos
# install.packages("readr")
library(readr)
# Cargar el conjunto de datos desde el archivo CSV descargado de Kaggle
data <- read.csv("Multiple_Gasolina.csv")
# Mostrar la estructura y los primeros datos del conjunto de datos
str(data)'data.frame': 48 obs. of 10 variables:
$ X : int 1 2 3 4 5 6 7 8 9 10 ...
$ gasolina : int 541 524 561 414 410 457 344 467 464 498 ...
$ y_pred_m1 : num 523 553 578 493 532 ...
$ y_pred_m2 : num 521 550 576 482 520 ...
$ y_pred_m3 : num 495 530 552 489 514 ...
$ licencias : num 52.5 57.2 58 52.9 54.4 57.1 45.1 55.3 52.9 55.2 ...
$ impuestos : num 9 9 9 7.5 8 10 8 8 8 7 ...
$ ingreso : num 3.57 4.09 3.87 4.87 4.4 ...
$ carreteras : num 1.976 1.25 1.586 2.351 0.431 ...
$ carreteras_factor: int 2 2 2 2 2 2 1 2 1 1 ...
head(data) X gasolina y_pred_m1 y_pred_m2 y_pred_m3 licencias impuestos ingreso
1 1 541 523.2337 520.8174 495.2084 52.5 9.0 3.571
2 2 524 553.1153 549.9916 529.9247 57.2 9.0 4.092
3 3 561 578.1074 576.4309 551.6147 58.0 9.0 3.865
4 4 414 493.3563 482.1805 488.6667 52.9 7.5 4.870
5 5 410 532.0289 520.0989 513.8625 54.4 8.0 4.399
6 6 457 433.5514 434.1044 430.6617 57.1 10.0 5.342
carreteras carreteras_factor
1 1.976 2
2 1.250 2
3 1.586 2
4 2.351 2
5 0.431 2
6 1.333 2
# Ahora, puedes utilizar gráficos para identificar outliers en tus datos específicos
# Por ejemplo, si tienes una columna llamada "columna_interes" en tu conjunto de datos:
# Boxplot
boxplot(data$ gasolina , ylab = "Etiqueta_Y", main = "Boxplot para Identificar Outliers")En este gráfico, los outliers se representan como puntos individuales que están por encima (outlier positivo) o por debajo (outlier negativo) de las “barras” que delimitan el rango intercuartílico (IQR) de la caja. Estos puntos están significativamente alejados de la mayoría de los datos, que están dentro de la caja del boxplot.
# Histograma
hist(data$impuestos , breaks = 20, col = "skyblue", xlab = "gasolina", ylab = "Frecuencia",
main = "Histograma para Identificar Outliers")En un histograma, los outliers pueden manifestarse como barras aisladas o como una barra que se encuentra muy separada de las demás. Estas barras representan rangos de valores que están considerablemente apartados de la distribución principal de los datos.
# Gráfico de Dispersión (requiere dos columnas numéricas)
plot(data$impuestos , data$gasolina, xlab = "impuestos", ylab = "gasolina",
main = "Gráfico de Dispersión para Identificar Outliers")En el grafico de dispersion, los outliers son puntos individuales en el gráfico que están notablemente lejos del patrón general de dispersión de los datos. Estos puntos se encuentran alejados de la agrupación principal de puntos y pueden estar tanto en los bordes del gráfico como en posiciones inesperadas en relación con los otros puntos.
# Utiliza la función read_csv de la librería readr para cargar el archivo CSV
data <- readr::read_csv("Multiple_Gasolina.csv")New names:
Rows: 48 Columns: 10
── Column specification
──────────────────────────────────────────────────────── Delimiter: "," dbl
(10): ...1, gasolina, y_pred_m1, y_pred_m2, y_pred_m3, licencias, impues...
ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
Specify the column types or set `show_col_types = FALSE` to quiet this message.
• `` -> `...1`
# Método del Rango Intercuartílico (IQR) para identificar outliers
Q1 <- quantile(data$gasolina, 0.25)
Q3 <- quantile(data$gasolina, 0.75)
IQR <- Q3 - Q1
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
outliers <- data[data$gasolina < lower_bound | data$gasolina > upper_bound, ]
# Método del Z-score para identificar outliers
z_scores <- (data$gasolina - mean(data$gasolina)) / sd(data$gasolina)
threshold <- 2 # Umbral típico para z-score
outliers_zscore <- data[abs(z_scores) > threshold, ]
# Imprimir los datos identificados como outliers por cada método
print("Outliers identificados por método IQR:")[1] "Outliers identificados por método IQR:"
print(outliers)# A tibble: 2 × 10
...1 gasolina y_pred_m1 y_pred_m2 y_pred_m3 licencias impuestos ingreso
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 19 865 773. 775. 797. 72.4 7 4.72
2 40 968 733. 729. 748. 67.2 7 4.34
# ℹ 2 more variables: carreteras <dbl>, carreteras_factor <dbl>
print("Ou identificados por método Z-score:")[1] "Ou identificados por método Z-score:"
print(outliers_zscore)# A tibble: 3 × 10
...1 gasolina y_pred_m1 y_pred_m2 y_pred_m3 licencias impuestos ingreso
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 7 344 319. 330. 324. 45.1 8 5.32
2 19 865 773. 775. 797. 72.4 7 4.72
3 40 968 733. 729. 748. 67.2 7 4.34
# ℹ 2 more variables: carreteras <dbl>, carreteras_factor <dbl>
Manejo
El manejo de los outliers implica la eliminación o corrección de los valores atípicos para mejorar la precisión de los análisis estadísticos. Existen varias técnicas para manejar los outliers, como la eliminación de los valores atípicos, la transformación de los datos, estos mencionados son los que veremos mas a fondo a continuacion.
Eliminación de Outliers:
La eliminación de outliers implica descartar los valores atípicos detectados del conjunto de datos.
Se puede aplicar cuando los outliers son errores evidentes o no representan la verdadera naturaleza de los datos.
# Cargar los datos desde el archivo CSV
data <- read.csv("Multiple_Gasolina.csv")
# Seleccionar la columna a analizar para identificar outliers
columna_a_analizar <- "gasolina" # Reemplaza 'Nombre_de_la_columna' con el nombre de la columna que deseas analizar
# Calcular el rango intercuartílico (IQR)
Q1 <- quantile(data[, columna_a_analizar], 0.25)
Q3 <- quantile(data[, columna_a_analizar], 0.75)
IQR <- Q3 - Q1
# Calcular los límites para identificar outliers
lower_bound <- Q1 - 1.5 * IQR
upper_bound <- Q3 + 1.5 * IQR
# Eliminar los outliers
data_clean <- data[!(data[, columna_a_analizar] < lower_bound | data[, columna_a_analizar] > upper_bound), ]
# Mostrar la cantidad de outliers eliminados
outliers_removed <- nrow(data) - nrow(data_clean)
print(paste("Número de outliers eliminados:", outliers_removed))[1] "Número de outliers eliminados: 2"
# Ahora 'data_clean' contiene los datos sin los outliers identificados en la columna seleccionadaTransformación de Outliers:
La transformación de outliers implica cambiar los valores atípicos para mitigar su efecto en el análisis.
Puede incluir métodos como la aplicación de logaritmos o la escala logarítmica a los datos.
# Cargar los datos desde el archivo CSV
data <- read.csv("Multiple_Gasolina.csv")
# Seleccionar la columna a transformar para manejar los outliers
columna_a_transformar <- "gasolina" # Reemplaza 'Nombre_de_la_columna' con el nombre de la columna que deseas transformar
# Aplicar transformación logarítmica a la columna con outliers
data$log_transformed <- log(data[, columna_a_transformar] + 1) # Se suma 1 para evitar log(0)
# Ahora 'data$log_transformed' contiene los datos transformados para manejar los outliers en la columna seleccionadaLos datos inconsistentes se refieren a información que viola reglas o expectativas establecidas en un conjunto de datos, la inconsistencia consiste en que no todas las copias redundantes contienen la misma información.
Identificacion
Exploración de Datos: Debemos obtener estadísticas descriptivas básicas asi como la media, desviación estándar, máximo, mínimo, varianza y entre otras para cada columna para detectar valores atípicos, valores faltantes o anomalías evidentes.
# Cargar los datos desde el archivo CSV
data <- read.csv("sets.csv")
# Obtener estadísticas descriptivas básicas
summary(data) Set_ID Name Year Theme
Length:14936 Length:14936 Min. :1975 Length:14936
Class :character Class :character 1st Qu.:2000 Class :character
Mode :character Mode :character Median :2009 Mode :character
Mean :2007
3rd Qu.:2016
Max. :2023
Theme_Group Subtheme Category Packaging
Length:14936 Length:14936 Length:14936 Length:14936
Class :character Class :character Class :character Class :character
Mode :character Mode :character Mode :character Mode :character
Num_Instructions Availability Pieces Minifigures
Min. : 0.000 Length:14936 Min. : 0.0 Min. : 1.00
1st Qu.: 0.000 Class :character 1st Qu.: 25.0 1st Qu.: 1.00
Median : 0.000 Mode :character Median : 81.0 Median : 2.00
Mean : 1.196 Mean : 237.9 Mean : 2.71
3rd Qu.: 2.000 3rd Qu.: 262.0 3rd Qu.: 3.00
Max. :48.000 Max. :11695.0 Max. :80.00
NA's :1803 NA's :7250
Owned Rating USD_MSRP Total_Quantity
Min. : 1 Min. :0.000 Min. : 1.49 Min. : 0.000
1st Qu.: 90 1st Qu.:0.000 1st Qu.: 9.99 1st Qu.: 0.000
Median : 744 Median :0.000 Median : 19.99 Median : 0.000
Mean : 2045 Mean :1.827 Mean : 39.97 Mean : 4.709
3rd Qu.: 2828 3rd Qu.:3.900 3rd Qu.: 49.99 3rd Qu.: 3.000
Max. :29429 Max. :4.900 Max. :849.99 Max. :1063.000
NA's :165 NA's :9099 NA's :2660
Current_Price
Min. : 0.05
1st Qu.: 15.00
Median : 36.00
Mean : 90.17
3rd Qu.: 92.00
Max. :5499.99
NA's :9494
Visualización
Utilizaremos los gráficos que pueden ser histogramas, boxplots, diagramas de dispersión para poder identificar patrones,distribuciones anómalas en los datos.
histograma
::: {.cell}
```{.r .cell-code}
# Cargar los datos desde el archivo CSV
data <- read.csv("urbania_data.csv")
# Instalar y cargar la librería ggplot2 si no está instalada
# install.packages("ggplot2")
library(ggplot2)
#ver datos
str(data)
```
::: {.cell-output .cell-output-stdout}
```
'data.frame': 7663 obs. of 96 variables:
$ X : int 0 1 2 5 6 8 10 11 12 13 ...
$ Unnamed..0 : int 3 4 5 8 9 11 13 14 15 16 ...
$ Antiguedad : num 5 5 3 1 4 1 3 5 6 1 ...
$ Anunciante : chr "Valentinoinmobiliaria " "No disponible" "No disponible" "No disponible" ...
$ Balneario : chr "Nulo" "Nulo" "Nulo" "Sol Y Mar" ...
$ NroBanios : num 4 5 5 5 4 5 5 5 5 2 ...
$ Nro_pisos : num 2 3 3 2 2 3 3 2 2 2 ...
$ Cocheras : num 3 1 4 3 2 2 1 1 3 0 ...
$ Descripcion : chr " excelente opcion para vivir en una de las mejores zonas de la molina casa amplia y nueva de 600m2 de terreno y"| __truncated__ " hermosa casa a espalda de futura avenida prolongacia\u0093n ramiro priala\u0089 ideal para alquiler de departa"| __truncated__ " casa de estreno acabados de primera. calle cerrada con vigilancia monitoreada las 24 horas del dia. imponentes"| __truncated__ " linda casa en condominio con piscina club house y piscina. canchas deportivas. linda vista al mar." ...
$ Direccion : chr "Malecon Monte Bello 5 La Molina, La Planicie, Lima, Lima" "Mz. O2 Lt. 03 Urb. San Antonio De Carapongo 2 Lurigancho, San Antonio De Carapongo, Lima, Lima" "El Pinar 120 , La Planicie 1era Etapa La Molina , 1 Cuadra Del Parque Laguna Seca La Molina, La Planicie, Lima, Lima" "Km 98.5 De La Panamericana Sur Asia, Sol Y Mar, Cañete, Lima" ...
$ Dormitorios : chr "3" "5+" "4" "4" ...
$ Estado.de.Inmueble : chr "Excelente" "Excelente" "Excelente" "Excelente" ...
$ Fecha_pub : chr "Publicado el 19.09.19" "Publicado el 28.08.19" "Publicado el 06.08.19" "Publicado el 25.08.19" ...
$ Luminosidad : chr "Muy luminoso" "Muy luminoso" "Muy luminoso" "Muy luminoso" ...
$ Mascotas : chr "Si" "Si" "Si" "Si" ...
$ Precio : num 885000 150000 1950000 380000 590000 380000 385000 75000 590000 64000 ...
$ Tipo : chr "Casa" "Casa" "Casa" "Casa de Playa" ...
$ TipoCochera : chr "Paralelas" "NoEspecifica" "Paralelas" "Paralelas" ...
$ Ubicacion : chr "LaMolina-Lima" "Lurigancho-Lima" "LaMolina-Lima" "Asia-Lima" ...
$ Uso_comercial : chr "No" "Si" "NoEspecifica" "NoEspecifica" ...
$ Uso_profesional : chr "NoEspecifica" "Si" "NoEspecifica" "NoEspecifica" ...
$ latitud : num -12.1 -12 -12.1 -12.8 -12.1 ...
$ longitud : num -76.9 -76.9 -76.9 -76.5 -77 ...
$ Area_constr : chr "450.00 m2" "350.00 m2" "625.00 m2" "150.00 m2" ...
$ Area_total : chr "600.00 m2" "183.00 m2" "1518.00 m2" "150.00 m2" ...
$ Area_constr_m2 : num 450 350 625 150 290 300 270 173 600 173 ...
$ Area_total_m2 : chr "600.0" "183.0" "1518.0" "150.0" ...
$ match : int 0 0 0 0 0 0 0 0 0 0 ...
$ X.Cuarto.de.servicio. : chr "1.0" "1.0" "1.0" "0.0" ...
$ X.Deposito. : chr "1.0" "1.0" "0.0" "1.0" ...
$ X.Terraza. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Kitchenette. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Sala.de.estar. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Sotano. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Patio. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.anx81tico. : chr "1.0" "0.0" "0.0" "0.0" ...
$ X.Comedor.diario. : chr "1.0" "1.0" "1.0" "0.0" ...
$ X.Comedor. : chr "1.0" "1.0" "1.0" "1.0" ...
$ X.Banio.de.servicio. : chr "1.0" "1.0" "1.0" "1.0" ...
$ X.Jardanxadn.Interno. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Walking.Closet. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Escritorio. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Cocina. : chr "1.0" "1.0" "1.0" "1.0" ...
$ X.Banio.independiente. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Lavanderanxada. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Balcon. : chr "0.0" "1.0" "1.0" "0.0" ...
$ X.Sala. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Closet. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Banio.de.visitas. : chr "1.0" "1.0" "1.0" "0.0" ...
$ X.Agua. : chr "1.0" "1.0" "1.0" "1.0" ...
$ X.Guardiananxada. : chr "0.0" "1.0" "1.0" "1.0" ...
$ X.Internet. : chr "0.0" "1.0" "1.0" "1.0" ...
$ X.Luz. : chr "1.0" "1.0" "1.0" "1.0" ...
$ X.Cable. : chr "0.0" "1.0" "1.0" "1.0" ...
$ X.Servicio.de.Limpieza. : chr "0.0" "1.0" "0.0" "0.0" ...
$ X.Conexion.a.gas. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Sistema.de.seguridad. : chr "0.0" "1.0" "1.0" "1.0" ...
$ X.Telefono. : chr "1.0" "1.0" "1.0" "0.0" ...
$ X.Areadeportiva. : chr "1.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Piscina. : chr "0.0" "NoEspecifica" "NoEspecifica" "1.0" ...
$ X.Solarium. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Sala.de.internet. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Sala.de.cine. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Jardanxadn. : chr "1.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Parque.interno. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Guarderanxada. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.anx81reas.verdes. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Club.House. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Hall.de.ingreso. : chr "1.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Areade.BBQ. : chr "1.0" "NoEspecifica" "NoEspecifica" "1.0" ...
$ X.Gimnasio. : chr "0.0" "NoEspecifica" "NoEspecifica" "1.0" ...
$ X.Areade.sauna. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Juegos.para.ninios. : chr "0.0" "NoEspecifica" "NoEspecifica" "0.0" ...
$ X.Ingreso.independiente. : chr "NoEspecifica" "0.0" "0.0" "0.0" ...
$ X.Colegios.cercanos. : chr "NoEspecifica" "1.0" "1.0" "0.0" ...
$ X.Cerca.al.mar. : chr "NoEspecifica" "0.0" "0.0" "1.0" ...
$ X.Centros.comerciales.cercanos.: chr "NoEspecifica" "1.0" "0.0" "1.0" ...
$ X.Parques.cercanos. : chr "NoEspecifica" "1.0" "1.0" "1.0" ...
$ X.Acceso.personas.discapacidad.: chr "NoEspecifica" "1.0" "0.0" "0.0" ...
$ X.Frente.al.mar. : chr "NoEspecifica" "0.0" "0.0" "0.0" ...
$ X.Desagaue. : chr "0.0" "1.0" "1.0" "0.0" ...
$ X.Jacuzzi. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Chimenea. : chr "0.0" "0.0" "1.0" "1.0" ...
$ X.Intercomunicador. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Cerco.Electrico. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Parrilla. : chr "1.0" "0.0" "1.0" "0.0" ...
$ X.Aire.acondicionado. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Amoblado. : chr "0.0" "0.0" "1.0" "1.0" ...
$ X.Sauna. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Calefaccion. : chr "0.0" "0.0" "0.0" "0.0" ...
$ X.Equipado. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Terma. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Portero.electrico. : chr "0.0" "0.0" "1.0" "0.0" ...
$ X.Cocina.con.reposteros. : chr "0.0" "0.0" "1.0" "1.0" ...
$ Distrito : chr "LaMolina" "Lurigancho" "LaMolina" "Asia" ...
$ Provincia : chr "Lima" "Lima" "Lima" "Lima" ...
```
:::
```{.r .cell-code}
# Visualización mediante histograma para una columna numérica específica
ggplot(data, aes(x = Area_constr_m2)) +
geom_histogram(binwidth = 1, fill = "skyblue", color = "green") +
labs(title = "Histograma de Area_constr_m2")
```
::: {.cell-output-display}
{width=672}
:::
:::
**boxplot**
::: {.cell}
```{.r .cell-code}
# Visualización mediante boxplot para una columna numérica específica
ggplot(data, aes(y = Area_constr_m2)) +
geom_boxplot(fill = "lightgreen", color = "black") +
labs(title = "Boxplot de Columna Numérica")
```
::: {.cell-output-display}
{width=672}
:::
:::
**Scatter plot**
::: {.cell}
```{.r .cell-code}
# Visualización mediante diagrama de dispersión para dos columnas numéricas específicas
ggplot(data, aes(x = Cocheras , y = Area_constr_m2)) +
geom_point(color = "orange") +
labs(title = "Diagrama de Dispersión entre Columna1 y Columna2")
```
::: {.cell-output-display}
{width=672}
:::
:::
Manejo de Datos Inconsistentes
El manejo de datos inconsistentes se refiere al proceso de corregir, eliminar o imputar valores para abordar problemas detectados en un conjunto de datos, asegurando que estos sean confiables y útiles para análisis posteriores.
Imputación de Valores Faltantes:
La imputación es el proceso de reemplazar los valores faltantes por otros valores considerados adecuados. Esto puede hacerse de varias maneras, como:
Media o Mediana: Reemplazar los valores faltantes con la media o mediana de la columna respectiva.
Valor más Frecuente: Usar el valor más común para los datos categóricos faltantes.
Imputación Predictiva: Utilizar modelos predictivos para estimar los valores faltantes en función de otras variables.
# Copia de seguridad del conjunto de datos mtcars
mtcars_backup <- mtcars
# Introducir valores faltantes en el conjunto de datos (simulación)
set.seed(123)
mtcars[sample(1:nrow(mtcars), 5), "mpg"] <- NA # Simulación de valores faltantes en la columna 'mpg'
# Verificar la cantidad de valores faltantes
sum(is.na(mtcars$mpg))[1] 5
# Imputar valores faltantes con la media de la columna 'mpg'
media_mpg <- mean(mtcars$mpg, na.rm = TRUE) # Calcula la media, ignorando valores NA
mtcars$mpg[is.na(mtcars$mpg)] <- media_mpg # Imputa los valores faltantes con la media
# Verificar que ya no hay valores faltantes
sum(is.na(mtcars$mpg))[1] 0
# Comparar los datos imputados con los datos originales
summary(mtcars_backup$mpg) Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 15.43 19.20 20.09 22.80 33.90
summary(mtcars$mpg) Min. 1st Qu. Median Mean 3rd Qu. Max.
10.40 17.07 20.34 20.34 21.43 33.90
Validación Manual:
La validación manual basicamente implica la inspección y corrección directa por parte de un usuario o experto en los datos para resolver inconsistencias que no pueden ser tratadas automáticamente.Esto puede involucrar lo siguiente:
Revisión Detallada: Examinar fila por fila o ya sea caso por caso para poder identificar y corregir manualmente errores evidentes.
Corrección basada en Reglas: Aplicar las reglas específicas para poder corregir errores conocidos o detectados durante la revisión.
ejemplo con una base de datos interna de r en este caso la conocida iris
# Cargar el conjunto de datos iris
data(iris)
# Visualizar la estructura y primeras filas de datos
head(iris) Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
str(iris)'data.frame': 150 obs. of 5 variables:
$ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
$ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
$ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
$ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
$ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
# Validación y corrección manual de valores inconsistentes en la columna 'Petal.Width'
columna <- "Petal.Width"
iris[[columna]] <- as.numeric(iris[[columna]])
# Aplicar validación y corrección
iris[[columna]][iris[[columna]] < 0.1 | iris[[columna]] > 2.5] <- NA
# Verificar los cambios
summary(iris[[columna]]) Min. 1st Qu. Median Mean 3rd Qu. Max.
0.100 0.300 1.300 1.199 1.800 2.500
como podemos observar ahi ya estan los cambios realizados.
Por ultimo realizaremos un cuadro comparativo entre estos 2 tipos de datos:
| Caracteristica | Outliers | Datos inconsistentes |
|---|---|---|
| Definición | Valores extremadamente alejados del resto de datos en un conjunto. | Datos que no siguen las reglas esperadas o lógicas, incluyendo valores faltantes, incorrectos o duplicados. |
| Identificación | Boxplots, histogramas, tests estadísticos como z-score, IQR. | Exploración de datos, validación de reglas de negocio, detección de patrones extraños. |
| Causas comunes | Errores de medición, entrada de datos incorrecta, eventos raros genuinos. | Valores faltantes, errores en la captura o transmisión de datos, registros duplicados. |
| Tratamiento | Pueden ser eliminados o transformados si se consideran errores o no representativos. | Rellenados o corregidos mediante imputación, validación manual o corrección. |
| Impacto en el analisis | Pueden distorsionar resultados si no se manejan adecuadamente. | Pueden afectar la precisión de análisis y modelos si no se abordan. |
Dependiendo de cómo vayamos a operar sobre los datos, es posible que antes de trabjar con ellos prefiramos eliminar los datos ausentes para evitar problemas como los antes expuestos. Con este fin recurrimos a la función na.omit():
intáxis na.omit(objeto)´
Eliminará del objeto entregado como argumento cualquier dato ausente como exista, devolviendo un objeto del mismo tipo sin dichos valores. Los indices que ocupaban los datos ausentes se facilitan en un atributo asociadao al objeto y llamado na.action.
Otra posibilidad consiste en utilizar la funciÓn complete.cases(). Esta resulta especialmente Útil al trabajar con data frames, ya que verifica que ninguna de las columnas de cada fila contenga valores ausentes. El valor devuelto es un vector de lÓgicos, con TRUE en las filas completas (sin valores ausentes) y FALSE en las demás. Dicho vector puede ser utiliza para seleccionar las filas que interesen.
Sintáxis complete.cases(objeto)
Devuelve un vector de valores lógicos indicando cuáles de las filas del objeto entregado como parámetro están completas, no conteniendo ningún valor ausente.
El dataset integrado airquality contiene 42 filas con valores ausentes de un total de 153 observaciones. En el siguiente ejercicio se muestra como obtener únicamente las filas sin valores nulos, ya sea utilizando na.omit() o complete.cases():
# Eliminación de valores ausentes
str(airquality)'data.frame': 153 obs. of 6 variables:
$ Ozone : int 41 36 12 18 NA 28 23 19 8 NA ...
$ Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
$ Wind : num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
$ Temp : int 67 72 74 62 56 66 65 59 61 69 ...
$ Month : int 5 5 5 5 5 5 5 5 5 5 ...
$ Day : int 1 2 3 4 5 6 7 8 9 10 ...
nrow(airquality)[1] 153
nrow(na.omit(airquality))[1] 111
nrow(airquality[complete.cases(airquality),])[1] 111
En esta parte nos centraremos en explorar cómo la representación gráfica de datos puede revelar información clave. Para lograrlo, se utilizará ggplot2, una poderosa librería de visualización en R. La elección de esta herramienta se basa en su capacidad para crear gráficos personalizables y visualmente atractivos. ggplot2 permite construir visualizaciones complejas con una sintaxis intuitiva, lo que facilita la exploración detallada de los datos y una comunicación efectiva de los hallazgos. Este enfoque resalta la importancia de la visualización de datos en el análisis y cómo la utilización de ggplot2 se convierte en un recurso invaluable para alcanzar este propósito.
# Usaremos el paquete ggplot2
# install.packages("ggplot2")
library(ggplot2)Los datos univariados son una recopilación de información que se caracteriza que depende de una sola variable aleatoria. Ahora los gráficos univariados son basicamente representaciones visuales de datos que exploran sola una variable a la vez. Permiten entender la forma, la distribución y las características de una variable sin llegar a considerar otras variables. Usaremos en este caso 4 tipos de graficos que son histogramas, grafico de barras, bloxplot y un grafico de densidad.
Un histograma es un gráfico de barras que muestra la frecuencia de valores en un conjunto de datos continuos. La variable se divide en intervalos y la frecuencia o densidad de los datos en cada intervalo está representada por barras adyacentes.
La base de datos que usaremos es un conjunto de datos en constante actualización para los cambios semanales de las acciones en la Bolsa de Valores de Guayaquil, en Ecuador.
# Cargamos el archivo CSV
datos <- read.csv("stats_BVG_latest.csv")# Crear un histograma
hist(datos$Último.Precio, col = "skyblue", main = "Histograma de Variable", xlab = "Último.Precio", ylab = "frecuencia")# Crear un boxplot
boxplot(datos$Último.Precio, col = "green", main = "Diagrama de Caja", ylab = "Último Precio")# Crear un gráfico de densidad
plot(density(datos$Último.Precio), col = "blue", main = "Gráfico de Densidad", xlab = "Último.Precio", ylab = "Densidad")# Crear un gráfico de barras
barplot(table(datos$Líquidez ), col = "gold", main = "Gráfico de Barras (para una varibale categorica)", xlab = "Líquidez ", ylab = "Frecuencia")# Cargar el archivo CSV
datos <- read.csv("SampleSuperstore.csv")
str(datos)'data.frame': 9994 obs. of 13 variables:
$ Ship.Mode : chr "Second Class" "Second Class" "Second Class" "Standard Class" ...
$ Segment : chr "Consumer" "Consumer" "Corporate" "Consumer" ...
$ Country : chr "United States" "United States" "United States" "United States" ...
$ City : chr "Henderson" "Henderson" "Los Angeles" "Fort Lauderdale" ...
$ State : chr "Kentucky" "Kentucky" "California" "Florida" ...
$ Postal.Code : int 42420 42420 90036 33311 33311 90032 90032 90032 90032 90032 ...
$ Region : chr "South" "South" "West" "South" ...
$ Category : chr "Furniture" "Furniture" "Office Supplies" "Furniture" ...
$ Sub.Category: chr "Bookcases" "Chairs" "Labels" "Tables" ...
$ Sales : num 262 731.9 14.6 957.6 22.4 ...
$ Quantity : int 2 3 2 5 2 7 4 6 3 5 ...
$ Discount : num 0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
$ Profit : num 41.91 219.58 6.87 -383.03 2.52 ...
Este diagrama de caja por grupos (boxplot) representa la distribución de la cantidad de productos en cada región. Cada caja (boxplot) corresponde a una región y muestra la distribución de la cantidad de productos en esa región específica.
La línea central de la caja representa la mediana.
El borde superior de la caja muestra el tercer cuartil (Q3) y el borde inferior muestra el primer cuartil (Q1).
Las líneas (“bigotes”) que se extienden desde la caja representan la dispersión de los datos, excluyendo valores extremos o atípicos.
Puntos individuales fuera de los bigotes indicarían valores atípicos en los datos.
# Crear un boxplot para visualizar la distribución de las Ventas según la Región
boxplot(Quantity ~ Region, data = datos, col = "yellow", xlab = "Región", ylab = "cantidad", main = "Diagrama de Caja por Grupos: Ventas por Región")Este gráfico de barras apiladas muestra la distribución de la cantidad de productos por región, donde cada barra representa una región y las diferentes secciones de cada barra representan la cantidad de productos en distintos niveles.
La altura total de cada barra indica la cantidad total de productos en una región específica. Las secciones de colores dentro de cada barra representan la cantidad de productos en diferentes niveles o rangos.
ggplot(datos, aes(x = Region, fill = factor(Quantity))) +
geom_bar(position = "stack") +
labs(x = "Región", y = "Cantidad", fill = "Cantidad") +
ggtitle("Gráfico de Barras Apiladas: Cantidad por Región")Este gráfico de líneas representa la cantidad de productos por región, utilizando líneas separadas por colores que representan diferentes categorías de productos. Cada línea muestra cómo varía la cantidad de productos en una categoría específica a lo largo de las diferentes regiones.
Observando este gráfico, puedes analizar cómo cambia la cantidad de productos en cada categoría a medida que te desplazas entre las distintas regiones. Las líneas te permiten identificar tendencias o patrones de comportamiento específicos de cada categoría en relación con las regiones. Si una línea tiene una pendiente pronunciada, indica un cambio significativo en la cantidad de productos de esa categoría a medida que cambia la región.
# Crear un gráfico de líneas para representar la cantidad en función de la región
ggplot(datos, aes(x = Region, y = Quantity, group = Category, color = Category)) +
geom_line() +
labs(x = "Región", y = "Cantidad", color = "Categoría") +
ggtitle("Gráfico de Líneas: Cantidad por Región (por Categoría)")Este gráfico de violín representa la distribución de la cantidad de productos por región utilizando una visualización tipo violín. Cada violín muestra la densidad de la distribución de la cantidad en cada región. La parte más ancha del violín indica donde se concentra la mayor densidad de datos, mientras que las partes más delgadas señalan regiones menos densas en términos de cantidad de productos.
Este tipo de gráfico permite comparar visualmente la distribución de la cantidad entre las diferentes regiones. Puedes identificar no solo la mediana y la dispersión de la cantidad por región, sino también la forma de la distribución en cada caso, lo que te ayuda a comprender mejor cómo varía la cantidad de productos entre las regiones.
ggplot(datos, aes(x = Region, y = Quantity, fill = Region)) +
geom_violin() +
labs(x = "Región", y = "Cantidad", fill = "Región") +
ggtitle("Gráfico de Violín: Distribución de Cantidad por Región")este gráfico es un gráfico de barras agrupadas que representa la cantidad de productos por región y categoría. Cada barra en el gráfico representa una región y está dividida en segmentos de colores diferentes, cada uno correspondiente a una categoría de productos. La altura de cada segmento de barra muestra la cantidad total de productos para una región específica en esa categoría.
# Crear un gráfico de barras agrupadas para visualizar la cantidad por región
library(ggplot2)
ggplot(datos, aes(x = Region, y = Quantity, fill = Category)) +
geom_bar(stat = "identity", position = "dodge") +
labs(x = "Región", y = "Cantidad", fill = "Categoría") +
ggtitle("Gráfico de Barras Agrupadas: Cantidad por Región y Categoría")Este gráfico permite comparar visualmente la cantidad de productos en diferentes categorías para cada región. Cada barra representa una región y está dividida en segmentos de colores que representan las diferentes categorías de productos. Se puede observar la distribución relativa de la cantidad de productos en cada categoría dentro de cada región.
ggplot(datos, aes(x = Category, y = Quantity, fill = Region)) +
geom_bar(stat = "identity", position = "stack") +
labs(x = "Categoría", y = "Cantidad", fill = "Región") +
ggtitle("Gráfico de Barras Apiladas: Cantidad por Categoría y Región")La visualización de datos multivariados se centra basicamente en representar y comprender a la par las relaciones complejas entre múltiples variables en un conjunto de datos. Su objetivo es revelar patrones, estructuras y posibles correlaciones o dependencias entre estas variables, todo ello de manera gráfica e intuitiva.
Este tipo de visualización es esencial en el análisis de datos complejos, ya que permite:
Identificar Patrones: Las representaciones visuales ayudan a detectar patrones que podrían no ser evidentes al analizar los datos de forma individual o en pares.
Explorar Relaciones: Facilita la comprensión de las relaciones entre múltiples variables, ya sean correlaciones, tendencias o agrupamientos.
Comunicar Información Compleja: Permite comunicar de manera efectiva y clara información compleja a audiencias no especializadas.
Facilitar la Toma de Decisiones: Proporciona una comprensión más profunda de los datos, lo que puede respaldar la toma de decisiones fundamentadas en análisis complejos.
En resumen, la visualización de datos multivariados es crucial en la exploración, interpretación y comunicación de conjuntos de datos complejos, permitiendo revelar información valiosa que puede estar oculta cuando se analizan variables de manera aislada.
# Cargar los datos
datos <- read.csv("SampleSuperstore.csv")
# Verificar la estructura de los datos
str(datos)'data.frame': 9994 obs. of 13 variables:
$ Ship.Mode : chr "Second Class" "Second Class" "Second Class" "Standard Class" ...
$ Segment : chr "Consumer" "Consumer" "Corporate" "Consumer" ...
$ Country : chr "United States" "United States" "United States" "United States" ...
$ City : chr "Henderson" "Henderson" "Los Angeles" "Fort Lauderdale" ...
$ State : chr "Kentucky" "Kentucky" "California" "Florida" ...
$ Postal.Code : int 42420 42420 90036 33311 33311 90032 90032 90032 90032 90032 ...
$ Region : chr "South" "South" "West" "South" ...
$ Category : chr "Furniture" "Furniture" "Office Supplies" "Furniture" ...
$ Sub.Category: chr "Bookcases" "Chairs" "Labels" "Tables" ...
$ Sales : num 262 731.9 14.6 957.6 22.4 ...
$ Quantity : int 2 3 2 5 2 7 4 6 3 5 ...
$ Discount : num 0 0 0 0.45 0.2 0 0 0.2 0.2 0 ...
$ Profit : num 41.91 219.58 6.87 -383.03 2.52 ...
# Crear el gráfico de dispersión multivariado
ggplot(datos, aes(x = Sales, y = Profit, color = Region, size = Quantity)) +
geom_point(alpha = 0.6) +
labs(x = "Ventas", y = "Beneficio", color = "Región", size = "Cantidad Vendida") +
ggtitle("Relación entre Ventas, Beneficio, Cantidad Vendida y Región")Con este gráfico, puedes identificar patrones visuales. Por ejemplo, podrías observar si hay una relación entre el tamaño de los puntos (cantidad vendida) y la posición en los ejes x e y (ventas y beneficio), lo cual indicaría si las transacciones con más productos vendidos tienen una influencia en las ventas o el beneficio.
Si los puntos tienden a agruparse en áreas específicas del gráfico, esto podría sugerir una relación entre ventas, beneficio y cantidad vendida. Además, los puntos más grandes (mayor cantidad vendida) podrían mostrar cómo impactan en las ventas y el beneficio en comparación con las transacciones de menor cantidad vendida.
ggplot(datos, aes(x = Sales, y = Profit, size = Quantity, color = Category)) +
geom_point(alpha = 0.6) +
scale_size_continuous(range = c(2, 10)) +
labs(x = "Ventas", y = "Beneficio", size = "Cantidad Vendida", color = "Categoría") +
ggtitle("Relación entre Ventas, Beneficio, Cantidad Vendida y Categoría")En la visualización de datos multivariados, los gráficos de líneas se pueden utilizar para comparar las tendencias de dos variables o para mostrar las tendencias de varias variables a lo largo del tiempo.
# Gráfico de líneas para ventas y beneficios utilizando el orden de las filas
ggplot(datos, aes(x = seq_along(Sales))) +
geom_line(aes(y = Sales, color = "Ventas")) +
geom_line(aes(y = Profit, color = "Beneficio")) +
labs(x = "Orden de las Filas", y = "Valor", color = "Variable") +
ggtitle("Evolución de Ventas y Beneficio")En la visualización de datos multivariados, al apilar o agrupar las barras, se pueden usar gráficos de barras para comparar los valores de varias variables de categoría.
# Gráfico de barras para ventas por categoría y segmento
ggplot(datos, aes(x = Category, fill = Segment)) +
geom_bar(aes(y = Sales), position = "dodge", stat = "summary", fun = "sum") +
labs(x = "Categoría", y = "Ventas", fill = "Segmento") +
ggtitle("Ventas por Categoría y Segmento")Los mapas de calor son un tipo de gráfico que se utiliza para mostrar la relación entre múltiples variables. Los mapas de calor utilizan colores para representar los valores de las variables, y las filas y columnas representan las diferentes variables.
# Seleccionar solo variables numéricas
num_vars <- datos[, sapply(datos, is.numeric)]
# Calcular la matriz de correlación
correlation_matrix <- cor(num_vars)
# Crear mapa de calor
library(reshape2)
Attaching package: 'reshape2'
The following objects are masked from 'package:data.table':
dcast, melt
The following object is masked from 'package:tidyr':
smiths
library(ggplot2)
melted_correlation <- melt(correlation_matrix)
ggplot(melted_correlation, aes(Var1, Var2, fill = value)) +
geom_tile() +
scale_fill_gradient(low = "white", high = "blue") +
labs(title = "Mapa de Calor - Matriz de Correlación")el mapa de calor de la matriz de correlación nos permite identificar visualmente qué variables tienen una correlación más fuerte o débil entre sí. Es una herramienta útil para comprender qué variables están relacionadas y cómo esa relación puede influir en nuestro análisis de datos.
EL gráfico de caja te permite comparar la distribución de las ventas entre las diferentes categorías. Puedes identificar la mediana, los cuartiles y los posibles valores atípicos para cada categoría, lo que facilita la comprensión de cómo se distribuyen las ventas en cada una de ellas.
# Diagrama de caja para visualizar distribución de ventas por categoría
ggplot(datos, aes(x = Category, y = Sales, fill = Category)) +
geom_boxplot() +
labs(x = "Categoría", y = "Ventas", fill = "Categoría") +
ggtitle("Distribución de Ventas por Categoría")En términos generales, el diagrama de caja te brinda una visión rápida y comparativa de cómo se distribuyen las ventas entre las diferentes categorías. Te permite identificar de manera visual cómo varían las ventas, dónde se concentran la mayoría de los datos, y si hay valores atípicos que podrían ser importantes para tu análisis.
Gráficos interactivos:
Visualizaciones que representan relaciones entre múltiples variables. Esto puede incluir gráficos 3D, gráficos de dispersión con colores o tamaños variables para representar más dimensiones de datos.
Ejemplo:
En este caso usamos una base de datos de pokemon la cual tiene las variables adecuadas para realizar este grafico.
# Cargamos la data
pokemon_data <- read.csv("pokemon.csv")
str(pokemon_data)'data.frame': 1118 obs. of 49 variables:
$ name : chr "Bulbasaur" "Ivysaur" "Venusaur" "Venusaur Gmax" ...
$ pokedex_number : int 1 2 3 3 3 4 5 6 6 6 ...
$ abilities : chr "Overgrow~Chlorophyll" "Overgrow~Chlorophyll" "Overgrow~Chlorophyll" "Overgrow~Chlorophyll" ...
$ typing : chr "Grass~Poison" "Grass~Poison" "Grass~Poison" "Grass~Poison" ...
$ hp : int 45 60 80 80 80 39 58 78 78 78 ...
$ attack : int 49 62 82 82 100 52 64 84 84 130 ...
$ defense : int 49 63 83 83 123 43 58 78 78 111 ...
$ special_attack : int 65 80 100 100 122 60 80 109 109 130 ...
$ special_defense : int 65 80 100 100 120 50 65 85 85 85 ...
$ speed : int 45 60 80 80 80 65 80 100 100 100 ...
$ height : int 7 10 20 240 24 6 11 17 280 17 ...
$ weight : int 69 130 1000 10000 1555 85 190 905 10000 1105 ...
$ genus : chr "Seed Pokémon" "Seed Pokémon" "Seed Pokémon" "Seed Pokémon" ...
$ gen_introduced : int 1 1 1 1 1 1 1 1 1 1 ...
$ female_rate : num 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 0.125 ...
$ genderless : chr "False" "False" "False" "False" ...
$ baby_pokemon : chr "False" "False" "False" "False" ...
$ legendary : chr "False" "False" "False" "False" ...
$ mythical : chr "False" "False" "False" "False" ...
$ is_default : chr "True" "True" "True" "False" ...
$ forms_switchable : chr "False" "False" "True" "True" ...
$ base_experience : int 64 142 236 236 281 62 142 240 240 285 ...
$ capture_rate : int 45 45 45 45 45 45 45 45 45 45 ...
$ egg_groups : chr "Monster~Grass" "Monster~Grass" "Monster~Grass" "Monster~Grass" ...
$ egg_cycles : int 20 20 20 20 20 20 20 20 20 20 ...
$ base_happiness : int 70 70 70 70 70 70 70 70 70 70 ...
$ can_evolve : chr "True" "True" "False" "False" ...
$ evolves_from : chr "" "Bulbasaur" "Ivysaur" "Ivysaur" ...
$ primary_color : chr "Green" "Green" "Green" "Green" ...
$ shape : chr "Quadruped" "Quadruped" "Quadruped" "Quadruped" ...
$ number_pokemon_with_typing : int 15 15 15 15 15 34 34 7 7 3 ...
$ normal_attack_effectiveness : num 1 1 1 1 1 1 1 1 1 1 ...
$ fire_attack_effectiveness : num 2 2 2 2 2 0.5 0.5 0.5 0.5 0.25 ...
$ water_attack_effectiveness : num 0.5 0.5 0.5 0.5 0.5 2 2 2 2 1 ...
$ electric_attack_effectiveness: num 0.5 0.5 0.5 0.5 0.5 1 1 2 2 0.5 ...
$ grass_attack_effectiveness : num 0.25 0.25 0.25 0.25 0.25 0.5 0.5 0.25 0.25 0.25 ...
$ ice_attack_effectiveness : num 2 2 2 2 2 0.5 0.5 1 1 1 ...
$ fighting_attack_effectiveness: num 0.5 0.5 0.5 0.5 0.5 1 1 0.5 0.5 1 ...
$ poison_attack_effectiveness : num 1 1 1 1 1 1 1 1 1 1 ...
$ ground_attack_effectiveness : num 1 1 1 1 1 2 2 0 0 2 ...
$ fly_attack_effectiveness : num 2 2 2 2 2 1 1 1 1 1 ...
$ psychic_attack_effectiveness : num 2 2 2 2 2 1 1 1 1 1 ...
$ bug_attack_effectiveness : num 1 1 1 1 1 0.5 0.5 0.25 0.25 0.5 ...
$ rock_attack_effectiveness : num 1 1 1 1 1 2 2 4 4 2 ...
$ ghost_attack_effectiveness : num 1 1 1 1 1 1 1 1 1 1 ...
$ dragon_attack_effectiveness : num 1 1 1 1 1 1 1 1 1 2 ...
$ dark_attack_effectiveness : num 1 1 1 1 1 1 1 1 1 1 ...
$ steel_attack_effectiveness : num 1 1 1 1 1 0.5 0.5 0.5 0.5 0.5 ...
$ fairy_attack_effectiveness : num 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1 ...
# install.packages("plotly")
library(plotly)
Attaching package: 'plotly'
The following object is masked from 'package:ggplot2':
last_plot
The following object is masked from 'package:stats':
filter
The following object is masked from 'package:graphics':
layout
# Gráfico 3D de Ataque, Defensa y Velocidad en Pokémon, usando 'legendary' para el color y 'hp' para el tamaño
plot_ly(pokemon_data, x = ~attack, y = ~defense, z = ~speed, color = ~legendary, size = ~hp, type = "scatter3d") %>%
layout(scene = list(title = "Gráfico 3D de Ataque, Defensa y Velocidad en Pokémon"))No scatter3d mode specifed:
Setting the mode to markers
Read more about this attribute -> https://plotly.com/r/reference/#scatter-mode
Warning: `line.width` does not currently support multiple values.
Warning: `line.width` does not currently support multiple values.
Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
Warning in RColorBrewer::brewer.pal(N, "Set2"): minimal value for n is 3, returning requested palette with 3 different levels
Ejemplo 02:
# Instalar plotly si no está instalada
# install.packages("plotly")
library(plotly)
# Cargar el archivo CSV
datos <- read.csv("games.csv")
# Seleccionar las columnas relevantes para la matriz de correlación
estadisticas_interes <- datos[, c("PTS", "TRB", "AST", "STL", "BLK")]
# Calcular la matriz de correlación
matriz_correlacion <- cor(estadisticas_interes)
# Crear el mapa de calor interactivo con plotly
plot_ly(z = matriz_correlacion, type = "heatmap") %>%
layout(title = "Mapa de Calor de Correlación entre Estadísticas")La manipulación de datos no estructurados es una práctica importante en el análisis de datos. Los datos no estructurados son aquellos que no tienen una estructura predefinida, como las imágenes, los gráficos, el texto, el audio y el video. En este caso, nos enfocaremos en los datos no estructurados de tipo texto.
Los pasos clave para la manipulación de datos no estructurados de tipo texto son:
Colección de datos: Este es el primer paso en el proceso de manipulación de datos. Involucra la recolección de datos de diversas fuentes como correos electrónicos, sitios web, redes sociales, etc.
Procesamiento de lenguaje natural (NLP): Este es un paso crítico en el proceso de manipulación de datos no estructurados. NLP se ocupa de convertir el texto crudo en una estructura comprensible para la computadora. Esto implica la eliminación de signos de puntuación, la tokenización del texto (conversión del texto en palabras o tokens), la eliminación de palabras vacías (stopwords) y la corrección gramatical.
Análisis de texto: Después de que los datos hayan sido procesados por NLP, se puede realizar análisis de texto para extraer información valiosa de los datos. Esto puede incluir el análisis de sentimiento, la extracción de temas, la detección de idiomas y la identificación de entidades mencionadas.
Visualización de datos: Una vez que se haya extraído la información relevante de los datos no estructurados, se puede visualizar utilizando herramientas de visualización de datos como gráficos, mapas y tablas. Esto permite a los usuarios comprender mejor la información y tomar decisiones informadas.
Modelado de datos: En el último paso del proceso de manipulación de datos no estructurados, se pueden utilizar modelos de aprendizaje automático para analizar los datos y realizar predicciones o clasificaciones.
Al final, la manipulación de datos no estructurados de tipo texto es una tarea esencial para el análisis de datos. Esto permite a las organizaciones extraer información valiosa de los datos no estructurados y utilizarla para tomar decisiones más informadas.
En R, existen varias herramientas y paquetes que facilitan este proceso. Algunas de las bibliotecas más populares para trabajar con texto en R incluyen:
tm (Text Mining): Es una poderosa biblioteca para preprocesamiento de texto, tokenización, eliminación de stopwords, stemming, entre otros procesos básicos de minería de texto.
stringr: Este paquete facilita la manipulación de cadenas de texto. Ofrece funciones simples y consistentes para operaciones como búsqueda, reemplazo, extracción y manipulación de texto.
qdap: Específicamente diseñado para análisis de texto, proporciona herramientas para tareas como análisis de sentimientos, tokenización y limpieza de texto.
tidytext: Esta biblioteca se integra con el ecosistema tidyverse y está diseñada para trabajar con texto en el formato de data frames, facilitando la integración del análisis de texto con otros métodos de análisis de datos.
Para manipular datos no estructurados en R, estos son algunos pasos comunes:
Lectura de datos:
Puedes leer archivos de texto, como documentos PDF, archivos CSV con texto, páginas web o bases de datos que contengan datos no estructurados. Por ejemplo:
# install.packages("readtext")
library(readtext)Warning: package 'readtext' was built under R version 4.3.2
# Leer archivos de texto
text_data <- readtext("3.6 Gasolina.txt")
text_datareadtext object consisting of 1 document and 0 docvars.
# A data frame: 1 × 2
doc_id text
<chr> <chr>
1 3.6 Gasolina.txt "\"gasolina\tl\"..."
# Leer páginas web
# web_data <- read_html("https://example.com")Preprocesamiento de texto:
La limpieza y el preprocesamiento son cruciales para el análisis de texto. Esto puede incluir tokenización, eliminación de signos de puntuación, conversión a minúsculas, eliminación de palabras vacías (stopwords) y lematización.
# install.packages(c("tm", "stringsr"))
library(tm)Warning: package 'tm' was built under R version 4.3.2
Loading required package: NLP
Attaching package: 'NLP'
The following object is masked from 'package:ggplot2':
annotate
library(stringr)
# Tokenización
text_corpus <- VCorpus(VectorSource(text_data$text))
text_corpus <- tm_map(text_corpus, content_transformer(tolower))
text_corpus <- tm_map(text_corpus, removePunctuation)
text_corpus <- tm_map(text_corpus, removeNumbers)
text_corpus <- tm_map(text_corpus, removeWords, stopwords("spanish"))Análisis de texto:
# Análisis de frecuencia de palabras:
library(tm)
# Crear un corpus
corpus <- Corpus(VectorSource(data$texto))
# Eliminar palabras vacías
corpus <- tm_map(corpus, removeWords, stopwords("spanish"))
# Crear matriz término-documento
dtm <- DocumentTermMatrix(corpus)
dtm<<DocumentTermMatrix (documents: 0, terms: 0)>>
Non-/sparse entries: 0/0
Sparsity : 100%
Maximal term length: 0
Weighting : term frequency (tf)
Estos ejemplos muestran cómo se puede trabajar con datos no estructurados en R utilizando diferentes paquetes y funciones para realizar tareas de preprocesamiento y análisis de texto.
La manipulación de DataFrames en R es un proceso fundamental para el análisis de datos, respaldado por una amplia gama de funciones, módulos y librerías como dplyr, tidyr y otras. Estas herramientas permiten la importación versátil de datos desde diversas fuentes y su transformación eficiente para su posterior análisis. Siguiendo un flujo estructurado, desde la importación y manipulación hasta la exploración y visualización de datos, se logra un proceso analítico ordenado y lógico. Esta metodología facilita la extracción de conclusiones significativas, brindando la base para la toma de decisiones fundamentadas en datos dentro de un entorno flexible y potente como R.
El manejo de datos missing, outlier e inconsistente así como la limpieza y preparación de los datos, son pasos importantes en el proceso de análisis de datos. Estos pasos garantizan que los datos utilizados sean confiables, consistentes y adecuados para sacar conclusiones válidas y confiables en cualquier investigación o análisis.
La visualización de datos es un pilar fundamental en la comprensión y comunicación de información compleja. Desde representaciones univariadas hasta técnicas avanzadas con imágenes, cada método ofrece una ventana única hacia la estructura y relaciones dentro de los datos. La selección cuidadosa de técnicas de visualización es clave para revelar patrones, tendencias y correlaciones, permitiendo así una comprensión más profunda y facilitando la toma de decisiones informadas. A medida que la tecnología avanza, las visualizaciones se vuelven más sofisticadas, brindando nuevas formas de interpretar y presentar datos de manera efectiva en una amplia gama de campos y disciplinas.
La manipulación de datos no estructurados de tipo texto es fundamental en la era de la información, presentando desafíos únicos y demandando herramientas y técnicas avanzadas. Sus aplicaciones abarcan diversos campos, ofreciendo beneficios como la detección de patrones y decisiones más informadas. Sin embargo, su uso plantea importantes consideraciones éticas y de privacidad que deben abordarse. Con avances continuos, se vislumbra un futuro prometedor con mejoras en análisis, automatización y una integración más amplia de fuentes de datos.