Integrantes:
R es un lenguaje de programación y entorno de desarrollo utilizado principalmente para análisis estadístico y visualización de datos. Es una herramienta poderosa y versátil que ha ganado popularidad en la comunidad de ciencia de datos y estadísticas debido a su flexibilidad y amplia variedad de paquetes y librerías.
R Studio es un entorno de desarrollo integrado (IDE) diseñado específicamente para trabajar con R. Proporciona una interfaz de usuario amigable que facilita la escritura de código, la gestión de proyectos y la generación de informes reproducibles.
En conjunto, R y RStudio son herramientas esenciales para cualquier persona que trabaje en análisis de datos, estadísticas, ciencia de datos o programación. Te permiten cargar datos, realizar análisis estadísticos complejos, crear gráficos impresionantes y compartir tus resultados de manera efectiva.
Una variable es un nombre que hace referencia a un valor. Una de las características más poderosas de un lenguaje de programación es la capacidad de manipular variables. Una variable es el nombre de una ubicación de memoria reservada que contiene algún valor.
Por ejemplo:
x <- 10
Aquí, ‘x’ es el nombre de la variable, <- es un operador de asignación y 10 es el valor o literal.
Entonces, al usar el operador de asignación <- en R, podemos reservar memoria para el valor sin declararlo explícitamente.
El nombre de una variable debe comenzar con una letra o un punto (.) seguido de una letra; no puede comenzar con un número.
Puede contener letras (AZ, az), números (0-9) y puntos (.) como caracteres válidos en un nombre de variable en R.
En R, los nombres de variables son sensibles a las mayúsculas y minúsculas. Esto significa que R distingue entre letras mayúsculas y minúsculas en los nombres de las variables.
Para nombres de variables de varias palabras, se suelen usar guiones bajos (nombre_variable) o puntos (nombre.variable). Sin embargo, algunos usuarios prefieren utilizar “CamelCase” o “PascalCase” (por ejemplo, nombreVariable) para nombres de variables en lugar de guiones bajos.
✋ Precaución: Es importante evitar usar los nombres de funciones integradas de R para nombrar tus variables, ya que esto podría causar conflictos en el código.
Los operadores aritméticos son esenciales para realizar operaciones matemáticas como suma, resta, multiplicación, división, entre otras. A continuación, se presenta una lista de los operadores aritméticos en R:
+ (suma): Se utiliza para sumar dos valores.- (resta): Resta el valor del lado derecho del valor
del lado izquierdo.* (multiplicación): Multiplica dos valores./ (división): Divide el valor del lado izquierdo por el
valor del lado derecho.^ (exponenciación): Eleva el valor del lado izquierdo a
la potencia del valor del lado derecho.%% (módulo): Devuelve el residuo de la división del
valor del lado izquierdo por el valor del lado derecho.%/% (división entera): Devuelve el cociente de la
división del valor del lado izquierdo por el valor del lado derecho,
eliminando cualquier parte decimal.\[ \begin{array}{|c|c|c|c|} \hline \text { Nombre del operador } & \text { Símbolo del operador } & \text { Descripción } & \text { Ejemplo } \\ \hline \text { suma } & + & \text { Suma los dos operandos } & a+b \\ \hline \text { resta } & - & \text { Resta los operandos derechos del operando izquierdo } & a b \\ \hline \text { multiplicación } & \text { * } & \text { Multiplica los dos operandos } & a^* b \\ \hline \text { división o división flotante } & \text { / } & \begin{array}{l} \text { El operando izquierdo se divide por el operando } \\ \text { derecho y da como resultado el valor flotante } \end{array} & a / b \\ \hline \text { división de piso } & / / & \begin{array}{l} \text { El operando izquierdo se divide por el operando } \\ \text { derecho y da como resultado el valor mínimo de } \\ \text { división } \end{array} & \mathrm{a} / / \mathrm{b} \\ \hline \text { exponente } & * * & \text { Elevó el operando izquierdo a la potencia del derecho. } & \begin{array}{l} a^{* *} b \quad\left(3^{* *} 2 \text { significa } 3\right. \\ \text { elevado a } 2) \end{array} \\ \hline \text { módulos } & \% & \begin{array}{l} \text { Da el resto de la división del operando izquierdo por el } \\ \text { operando derecho } \end{array} & a \% b \\ \hline \end{array} \]
Puedes realizar operaciones aritméticas en R utilizando nombres de variables abreviados para mayor concisión:
s <- 5 + 3
s
## [1] 8
r <- 8 - 2
r
## [1] 6
m <- 4 * 6
m
## [1] 24
d <- 12 / 3
d
## [1] 4
e <- 2^3
e
## [1] 8
mod <- 15 %% 4
mod
## [1] 3
div_entera <- 15 %/% 4
div_entera
## [1] 3
Los operadores relacionales se utilizan para evaluar la relación entre operandos y comparar los valores. Estos operadores devuelven como resultado “Verdadero” o “Falso” según la condición evaluada. A continuación, se presentan los operadores relacionales en R:
\[ \begin{array}{|c|c|c|c|} \hline \text { Nombre del operador } & \text { Símbolo del operador } & \text { Descripción } & \text { Ejemplo } \\ \hline \text { igual a } & == & \begin{array}{l} \text { comparar si el valor del operando izquierdo es igual al } \\ \text { valor del operando derecho } \end{array} & a==b \\ \hline \text { no igual a o diferente } & != & \begin{array}{l} \text { comparar si el valor del operando izquierdo no es igual } \\ \text { al valor del operando derecho } \end{array} & a !=b \\ \hline \text { menor que } & < & \begin{array}{l} \text { comparar si el valor del operando izquierdo es menor } \\ \text { que el valor del operando derecho } \end{array} & a<b \\ \hline \text { mayor que } & > & \begin{array}{l} \text { comparar si el valor del operando izquierdo es mayor } \\ \text { que el valor del operando derecho } \end{array} & a>b \\ \hline \text { Menor que o igual a } & <= & \begin{array}{l} \text { comparar el valor del operando izquierdo es menor o } \\ \text { igual que el valor del operando derecho } \end{array} & a<=b \\ \hline \text { Mayor qué o igual a } & >= & \begin{array}{l} \text { comparar el valor del operando izquierdo es mayor o } \\ \text { igual que el valor del operando derecho } \end{array} & a>=b \\ \hline \end{array} \]
Ejemplo de Operadores Relacionales en R
A continuación se presenta un ejemplo de cómo utilizar operadores relacionales en R:
# Tu código R aquí
# Declaramos dos variables
a <- 20
b <- 28
# No es igual a relación (!=)
a != b
## [1] TRUE
print("no es igual a la relación => (a != b) es:", a != b)
## [1] "no es igual a la relación => (a != b) es:"
# Relación menor que (<)
print("relación menor que => (a < b) es:", a < b)
## [1] "relación menor que => (a < b) es:"
# Menor o igual a relación (<=)
print("relación menor o igual que => (a <= b) es:", a <= b)
## [1] "relación menor o igual que => (a <= b) es:"
En R, para asignar un valor a una variable, utilizamos el operador de
asignación <-. A continuación, se muestra el operador de
asignación en R:
<- (asignación): Utilizado para asignar un valor a
una variable.Por ejemplo:
# Asignación de un valor a una variable
variable <- 42
\[ \begin{array}{|c|c|c|c|} \hline \text { Nombre del operador } & \text { Símbolo del operador } & \text { Descripción } & \text { Ejemplo } \\ \hline \text { Asignar } & = & \begin{array}{l} \text { Asignar el valor del operando derecho al operando } \\ \text { izquierdo } \end{array} & a=b \\ \hline \text { Sumar y asignar } & += & \begin{array}{l} \text { Suma el valor del operando derecho al izquierdo y } \\ \text { asigna el resultado al operando izquierdo } \end{array} & a+=10 \ (a=a+10) \\ \hline \text { Restar y asignar } & -= & \begin{array}{l} \text { Reste el valor del operando derecho al izquierdo y } \\ \text { asigne el resultado al operando izquierdo } \end{array} & a-=10 \ (a=a-10) \\ \hline \text { Multiplicar y asignar } & { }^*= & \begin{array}{l} \text { Multiplica el valor del operando derecho por el } \\ \text { izquierdo y asigna el resultado al operando izquierdo. } \end{array} & a^*=10 \left(a=a^* 5\right) \\ \hline \text { Dividir y asignar } & /= & \begin{array}{l} \text { Divida el valor del operando derecho a la izquierda y } \\ \text { asigne el resultado al operando izquierdo } \end{array} & a /=2 \ (a=a / 2) \\ \hline \begin{array}{l} \text { División y asignación del } \\ \text { piso } \end{array} & / /= & \begin{array}{l} \text { Piso divide el valor del operando derecho a la izquierda } \\ \text { y asigna el resultado al operando izquierdo } \end{array} & a / /=9 \ (a=a / / 9) \\ \hline \text { Módulo y asignación } & \%= & \begin{array}{l} \text { Realice el módulo por el valor del operando derecho a la } \\ \text { izquierda y asigne el resultado al operando izquierdo } \end{array} & a \%=3 \ (a=a \% 3) \\ \hline \text { Exponente y asignación } & * * & \begin{array}{l} \text { Realizar el exponente de operandos y asignar el } \\ \text { resultado al operando izquierdo. } \end{array} & a^{\star \star *}=2\left(a=a^{\star \star 2} 2\right) \\ \hline \end{array} \]
# Asignar (<- o =)
a <- 20
cat("Asignar (a <- 20) => ", a, "\n")
## Asignar (a <- 20) => 20
b <- 25
cat("Asignar (b <- 25) => ", b, "\n")
## Asignar (b <- 25) => 25
# Sumar y asignar (+=)
a <- a + 10
cat("Sumar y asignar (a <- a + 10) => ", a, "\n")
## Sumar y asignar (a <- a + 10) => 30
# Restar y asignar (-=)
a <- a - 10
cat("Restar y asignar (a <- a - 10) => ", a, "\n")
## Restar y asignar (a <- a - 10) => 20
# Multiplicar y asignar (*=)
a <- a * 10
cat("Multiplicar y asignar (a <- a * 10) => ", a, "\n")
## Multiplicar y asignar (a <- a * 10) => 200
# Dividir y asignar (/=)
a <- a / 10
cat("Dividir y asignar (a <- a / 10) => ", a, "\n")
## Dividir y asignar (a <- a / 10) => 20
# Piso-Dividir y asignar (%/%=)
b <- b %/% 3
cat("Piso-Dividir y asignar (b <- b %/% 3) => ", b, "\n")
## Piso-Dividir y asignar (b <- b %/% 3) => 8
# Módulo y asignar (%%=)
b <- b %% 3
cat("Módulo y asignar (b <- b %% 3) => ", b, "\n")
## Módulo y asignar (b <- b %% 3) => 2
# Exponenciación y asignar (^=)
b <- b^3
cat("Exponenciación y asignar (b <- b^3) => ", b, "\n")
## Exponenciación y asignar (b <- b^3) => 8
En R, al igual que en Python, se utilizan operadores lógicos para combinar expresiones condicionales. Los operadores lógicos se utilizan para realizar operaciones de lógica booleana y evaluar si las condiciones son verdaderas o falsas.
A continuación, se presenta una tabla con información sobre los operadores lógicos en R:
\[ \begin{array}{|l|c|l|} \hline {\text { Nombre del operador }} & \text { Símbolo del operador } & {\text { Descripción }} \\ \hline \text { AND (y) lógico } & \text{and} & \begin{array}{l} \text { Da como resultado 'True' si ambos operandos son 'Verdadero' y } \\ \text { 'False' en caso contrario. } \end{array} \\ \hline \text { OR (O) lógico } & \text{or} & \begin{array}{l} \text { Da "True" como resultado si alguno de los operandos es } \\ \text { "Verdadero" y "False" en caso contrario. } \end{array} \\ \hline \text { NOT (No) lógico } & \text{not} & \begin{array}{l} \text { Da como resultado 'True' si un operando es 'Falso' y 'True' si } \\ \text { un operando es 'Verdadero'. } \end{array} \\ \hline \end{array} \]
a <- FALSE
b <- TRUE
# Operador lógico AND (y)
cat("AND lógico => a y b es:", a & b, "\n")
## AND lógico => a y b es: FALSE
# Operador lógico OR (o)
cat("OR lógico => a o b es:", a | b, "\n")
## OR lógico => a o b es: TRUE
# Operador lógico NOT (no)
cat("NO lógico => no b es:", !b, "\n")
## NO lógico => no b es: FALSE
# Ejemplo de tipo de datos int
a <- 20 # valor entero positivo
a1 <- -20 # Valor entero negativo
# Imprimiendo el valor
cat("a = ", a, "\n")
## a = 20
cat("a1 = ", a1, "\n")
## a1 = -20
# Comprobar el tipo de variable a
cat("El tipo de variable a es:", class(a), "\n")
## El tipo de variable a es: numeric
cat("El tipo de variable a1 es:", class(a1), "\n")
## El tipo de variable a1 es: numeric
# Ejemplo para tipo de datos flotante
b <- 20.5 # valor flotante positivo
b1 <- -20.5 # Valor flotante negativo
# Imprimiendo el valor
cat("b = ", b, "\n")
## b = 20.5
cat("b1 = ", b1, "\n")
## b1 = -20.5
# Comprobar el tipo de variable b
cat("El tipo de variable b es:", class(b), "\n")
## El tipo de variable b es: numeric
cat("El tipo de variable b1 es:", class(b1), "\n")
## El tipo de variable b1 es: numeric
# Ejemplo de datos complejos
a <- 20 + 5i
b <- 5i
c <- 10 - 5i
d <- -5i
# Imprimiendo el valor de a
cat("a = ", a, "\n")
## a = 20+5i
# Comprobar el tipo de variable a
cat("El tipo de variable a es:", class(a), "\n")
## El tipo de variable a es: complex
cat("El tipo de variable b es:", class(b), "\n")
## El tipo de variable b es: complex
cat("El tipo de variable c es:", class(c), "\n")
## El tipo de variable c es: complex
cat("El tipo de variable d es:", class(d), "\n")
## El tipo de variable d es: complex
En R, puedes realizar la conversión de tipos de datos, como
convertir de integer a numeric o de numeric a
integer, utilizando las funciones as.integer() y
as.numeric() respectivamente.
Puedes verificar el tipo de cualquier variable en R usando la
función class().
También puedes convertir un numeric o integer a
character utilizando la función as.character(), o
convertir cualquier cadena numérica a numeric o
integer utilizando las funciones as.numeric() y
as.integer() respectivamente.
Las cadenas son secuencias de caracteres encerradas entre comillas simples o dobles. Se utilizan comillas simples (’’) o dobles (““) para escribir una cadena de una sola línea en R. Por ejemplo:
# Ejemplos de Codificación en R
# Definir las cadenas
cadena1 <- 'Esta es una cadena entre comillas simples'
cadena2 <- "Esta es una cadena entre comillas dobles"
cadena3 <- '
Línea uno
Línea dos
Línea tres' # cadena multilínea
# Mostrar resultados
cat("cadena1:\n", cadena1, "\n")
## cadena1:
## Esta es una cadena entre comillas simples
cat("cadena2:\n", cadena2, "\n")
## cadena2:
## Esta es una cadena entre comillas dobles
cat("cadena3 (cadena multilínea):\n", cadena3, "\n")
## cadena3 (cadena multilínea):
##
## Línea uno
## Línea dos
## Línea tres
En R, al igual que en Python, puedes acceder a componentes individuales de una cadena utilizando la indexación. La indexación en R comienza desde 1 (a diferencia de Python, que comienza desde 0).
Por ejemplo, si tienes una cadena en R:
# Cadena de texto
txt <- "Esto es un ejemplo de cómo usar substr en R."
txt
## [1] "Esto es un ejemplo de cómo usar substr en R."
# Obtener el primer carácter
pc <- substr(txt, 1, 1)
cat("Primer carácter:", pc, "\n")
## Primer carácter: E
# Obtener los primeros 10 caracteres
p10 <- substr(txt, 1, 10)
cat("Primeros 10 caracteres:", p10, "\n")
## Primeros 10 caracteres: Esto es un
# Obtener del carácter 6 al 15
c6_a_15 <- substr(txt, 6, 15)
cat("Caracteres del 6 al 15:", c6_a_15, "\n")
## Caracteres del 6 al 15: es un ejem
# Obtener los últimos 5 caracteres
u5 <- substr(txt, nchar(txt) - 4, nchar(txt))
cat("Últimos 5 caracteres:", u5, "\n")
## Últimos 5 caracteres: en R.
c1 <- "Hola, "
c2 <- "mundo!"
# Concatenación de cadenas
res <- paste(c1, c2)
# Imprimir el resultado
cat("Concatenación:", res, "\n")
## Concatenación: Hola, mundo!
En este ejemplo, las variables c1 y c2 contienen las cadenas que deseas concatenar. Luego, utilizamos la función paste() para concatenar estas cadenas y almacenamos el resultado en la variable res. Finalmente, imprimimos el resultado utilizando cat()
En Python para realizar diversas operaciones con cadenas. La sintaxis básica es str.String_method(). Algunos de los métodos de cadena más importantes se detallan a continuación:
upper(): En R, puedes usar toupper(cadena) para convertir una cadena a mayúsculas.
lower(): En R, puedes usar tolower(cadena) para convertir una cadena a minúsculas.
capitalize(): En R, puedes usar tools::toTitleCase(cadena) para capitalizar la primera letra de una cadena.
split(): En R, puedes usar strsplit(cadena, separador) para dividir una cadena según un separador y obtener una lista de elementos.
strip(): No hay un equivalente directo en R para eliminar espacios en blanco iniciales y finales de una cadena. Sin embargo, puedes usar trimws(cadena) para eliminar espacios en blanco iniciales y finales.
rstrip(): No hay un equivalente directo en R para eliminar caracteres del lado derecho de una cadena. Puedes usar stringr::str_trim(cadena, side = “right”) para eliminar espacios en blanco del lado derecho.
lstrip(): No hay un equivalente directo en R para eliminar caracteres del lado izquierdo de una cadena. Puedes usar stringr::str_trim(cadena, side = “left”) para eliminar espacios en blanco del lado izquierdo.
len(): En R, puedes usar nchar(cadena) para obtener la longitud de una cadena.
replace(): En R, puedes usar gsub(subcadena_a_reemplazar, nueva_subcadena, cadena) para reemplazar una subcadena en una cadena.
startswith(): No hay un equivalente directo en R. Puedes usar grepl(“^subcadena”, cadena) para verificar si una cadena comienza con una subcadena.
endswith(): No hay un equivalente directo en R. Puedes usar grepl(“subcadena$”, cadena) para verificar si una cadena termina con una subcadena.
isdigit(): No hay un equivalente directo en R. Puedes usar grepl(“1+$”, cadena) para verificar si todos los caracteres de la cadena son dígitos.
isdecimal(): No hay un equivalente directo en R. Puedes usar grepl(“2+$”, cadena) para verificar si todos los caracteres de la cadena son decimales.
isalpha(): No hay un equivalente directo en R. Puedes usar grepl(“3+$”, cadena) para verificar si todos los caracteres de la cadena son letras del alfabeto.
islower(): No hay un equivalente directo en R. Puedes usar grepl(“4+$”, cadena) para verificar si la cadena está en minúsculas.
isupper(): No hay un equivalente directo en R. Puedes usar grepl(“5+$”, cadena) para verificar si la cadena está en mayúsculas.
isalnum(): No hay un equivalente directo en R. Puedes usar grepl(“6+$”, cadena) para verificar si todos los caracteres de la cadena son alfanuméricos.
Estos son los equivalentes aproximados en R para las operaciones de cadena que mencionaste en Python. Puedes utilizar estas funciones en R según tus necesidades específicas.
Ejemplos :
# Convertir una cadena a mayúsculas en R.
cadena <- "hola mundo"
mayusculas <- toupper(cadena)
print(mayusculas)
## [1] "HOLA MUNDO"
# Convertir una cadena a minúsculas en R.
cadena <- "Hola Mundo"
minusculas <- tolower(cadena)
print(minusculas)
## [1] "hola mundo"
# Capitalizar la primera letra de una cadena en R.
cadena <- "esto es un ejemplo"
capitalizada <- tools::toTitleCase(cadena)
print(capitalizada)
## [1] "Esto Es Un Ejemplo"
# Dividir una cadena según un separador en R.
cadena <- "manzana,pera,naranja"
elementos <- unlist(strsplit(cadena, ","))
print(elementos)
## [1] "manzana" "pera" "naranja"
# cadena <- "manzana,pera,naranja"
elementos <- unlist(strsplit(cadena, ","))
print(elementos)
## [1] "manzana" "pera" "naranja"
cadena <- " hola mundo "
sin_espacios <- trimws(cadena)
print(sin_espacios)
## [1] "hola mundo"
# Eliminar espacios en blanco del lado derecho o izquierdo de una cadena en R.
cadena <- " hola mundo "
sin_espacios_derecha <- stringr::str_trim(cadena, side = "right")
sin_espacios_izquierda <- stringr::str_trim(cadena, side = "left")
print(sin_espacios_derecha)
## [1] " hola mundo"
print(sin_espacios_izquierda)
## [1] "hola mundo "
# Obtener la longitud de una cadena en R.
cadena <- "hola"
longitud <- nchar(cadena)
print(longitud)
## [1] 4
# Reemplazar una subcadena en una cadena en R.
cadena <- "hola mundo"
nueva_cadena <- gsub("mundo", "amigo", cadena)
print(nueva_cadena)
## [1] "hola amigo"
# Verificar si una cadena comienza con una subcadena en R.
cadena <- "Hola Mundo"
comienza_con_hola <- grepl("^Hola", cadena)
print(comienza_con_hola)
## [1] TRUE
# Verificar si una cadena termina con una subcadena en R.
cadena <- "Hola Mundo"
termina_con_mundo <- grepl("Mundo$", cadena)
print(termina_con_mundo)
## [1] TRUE
# Verificar si todos los caracteres de la cadena son dígitos en R.
cadena <- "12345"
son_digitos <- grepl("^[0-9]+$", cadena)
print(son_digitos)
## [1] TRUE
# Verificar si todos los caracteres de la cadena son decimales en R.
cadena <- "123.45"
son_decimales <- grepl("^[0-9.]+$", cadena)
print(son_decimales)
## [1] TRUE
# Verificar si todos los caracteres de la cadena son letras del alfabeto en R.
cadena <- "Hola"
son_letras <- grepl("^[A-Za-z]+$", cadena)
print(son_letras)
## [1] TRUE
# Verificar si la cadena está en minúsculas en R.
cadena <- "hola mundo"
es_minuscula <- grepl("^[a-z]+$", cadena)
print(es_minuscula)
## [1] FALSE
# Verificar si la cadena está en mayúsculas en R.
cadena <- "HOLA MUNDO"
es_mayuscula <- grepl("^[A-Z]+$", cadena)
print(es_mayuscula)
## [1] FALSE
# Verificar si todos los caracteres de la cadena son alfanuméricos en R
cadena <- "Hola123"
es_alfanumerico <- grepl("^[A-Za-z0-9]+$", cadena)
print(es_alfanumerico)
## [1] TRUE
texto <- "¡QUE RÁPIDO PASA EL TIEMPO!
De verdad no puedo creer que apenas unos instantes atrás estaba viajando en ese ya lejano 9 de enero de Guadalajara, México, a Lima, Perú.
Han pasado 5 mesesotes donde he tenido el gusto, orgullo y honor de formar parte del Tour 1 y 2 DPC SA, Lima Major, Dreamleague S19 y Berlin Major. Creo que no tenía un año tan activo desde el 2017 lol.
Muchísimas gracias a ESB - Electronic Sports Broadcasting y 4D Esports por permitirme seguir formando parte de esta hermosa escena en los distintos eventos que han transcurrido en el año; el poder trabajar en distintos momentos y proyectos para ambas productoras me llena de orgullo y alegría. Sigan siendo cracks, cada quien a su modo tan único de transmitir y traer el Dota 2 a los fans.
Quiero aclarar que mis comentarios sobre el pago pendiente de la Lima Major que hice en stream eran en total plan de joda, de meme y chacota. Pero en retrospectiva me salió muy bajita la broma y pido disculpas públicas por las molestias causadas de mi parte a los afectados.
Avo+ NO ME DEBE NADA A MI DE FORMA PERSONAL.
NO ME DEBE N A D A.
YA DEJEN DE JODERLO, POR FAVOOOOOR XD
Ya estoy en conversaciones para recibir la remuneración y de nuevo lo repito, Avo no tiene nada que ver con ese pago, solo quería molestarlo porque en su momento él fue mi contacto principal para trabajar en el stream en inglés de la Lima Major, pero obviamente ustedes no tenían ese contexto, así que mi pésimo chiste se salió de control. (ptm hasta dije GAH para hacer notar que no era enserio pero no fue suficiente :'u)
Vive y aprende, lol.
Eso sería todo por ahora, si aún no me despiden de ESB, entonces nos vemos muy muy pronto para cerrar el Tour 3 SA DPC y la Bali Major de cara al TI 2023.
Por último, quiero de verdad agradecer a todos y cada uno de los que siempre están apoyando y mandando la buena vibra en los streams. No saben lo mucho que significa para mí que a pesar de los años y mis pifias e inconsistencias todavía haya gente bella y hermosa que manda su apoyo y energía positiva a mi persona. GRACIAS GRACIAS GRACIAS 🙏
Todos los días intento darles la mejor versión posible de mí en stream. A veces se logra, a veces no JAJA, pero aprecio mucho a todos los que se toman un poco de su valioso tiempo para seguir apoyando el sueño de este viejo y loco mexicano que ama el Dota tanto como lo aman en este precioso país ❤️
¡Cuídense mucho locos, nos vemos pronto!
ATTE. CARLOS \"THE AZATHOTH\" RIOS, MEJOR CONOCIDO EN EL BAJO MUNDO COMO Sarcasmo Gamer KTMRE K BA PASAR
(por si no lo captaron, eso último es broma XDDD)"
# Aplicar funciones de cadena
mayusculas <- toupper(texto)
mayusculas
## [1] "¡QUE RÁPIDO PASA EL TIEMPO!\nDE VERDAD NO PUEDO CREER QUE APENAS UNOS INSTANTES ATRÁS ESTABA VIAJANDO EN ESE YA LEJANO 9 DE ENERO DE GUADALAJARA, MÉXICO, A LIMA, PERÚ.\nHAN PASADO 5 MESESOTES DONDE HE TENIDO EL GUSTO, ORGULLO Y HONOR DE FORMAR PARTE DEL TOUR 1 Y 2 DPC SA, LIMA MAJOR, DREAMLEAGUE S19 Y BERLIN MAJOR. CREO QUE NO TENÍA UN AÑO TAN ACTIVO DESDE EL 2017 LOL.\nMUCHÍSIMAS GRACIAS A ESB - ELECTRONIC SPORTS BROADCASTING Y 4D ESPORTS POR PERMITIRME SEGUIR FORMANDO PARTE DE ESTA HERMOSA ESCENA EN LOS DISTINTOS EVENTOS QUE HAN TRANSCURRIDO EN EL AÑO; EL PODER TRABAJAR EN DISTINTOS MOMENTOS Y PROYECTOS PARA AMBAS PRODUCTORAS ME LLENA DE ORGULLO Y ALEGRÍA. SIGAN SIENDO CRACKS, CADA QUIEN A SU MODO TAN ÚNICO DE TRANSMITIR Y TRAER EL DOTA 2 A LOS FANS. \nQUIERO ACLARAR QUE MIS COMENTARIOS SOBRE EL PAGO PENDIENTE DE LA LIMA MAJOR QUE HICE EN STREAM ERAN EN TOTAL PLAN DE JODA, DE MEME Y CHACOTA. PERO EN RETROSPECTIVA ME SALIÓ MUY BAJITA LA BROMA Y PIDO DISCULPAS PÚBLICAS POR LAS MOLESTIAS CAUSADAS DE MI PARTE A LOS AFECTADOS. \nAVO+ NO ME DEBE NADA A MI DE FORMA PERSONAL.\nNO ME DEBE N A D A.\nYA DEJEN DE JODERLO, POR FAVOOOOOR XD\nYA ESTOY EN CONVERSACIONES PARA RECIBIR LA REMUNERACIÓN Y DE NUEVO LO REPITO, AVO NO TIENE NADA QUE VER CON ESE PAGO, SOLO QUERÍA MOLESTARLO PORQUE EN SU MOMENTO ÉL FUE MI CONTACTO PRINCIPAL PARA TRABAJAR EN EL STREAM EN INGLÉS DE LA LIMA MAJOR, PERO OBVIAMENTE USTEDES NO TENÍAN ESE CONTEXTO, ASÍ QUE MI PÉSIMO CHISTE SE SALIÓ DE CONTROL. (PTM HASTA DIJE GAH PARA HACER NOTAR QUE NO ERA ENSERIO PERO NO FUE SUFICIENTE :'U)\nVIVE Y APRENDE, LOL.\nESO SERÍA TODO POR AHORA, SI AÚN NO ME DESPIDEN DE ESB, ENTONCES NOS VEMOS MUY MUY PRONTO PARA CERRAR EL TOUR 3 SA DPC Y LA BALI MAJOR DE CARA AL TI 2023.\nPOR ÚLTIMO, QUIERO DE VERDAD AGRADECER A TODOS Y CADA UNO DE LOS QUE SIEMPRE ESTÁN APOYANDO Y MANDANDO LA BUENA VIBRA EN LOS STREAMS. NO SABEN LO MUCHO QUE SIGNIFICA PARA MÍ QUE A PESAR DE LOS AÑOS Y MIS PIFIAS E INCONSISTENCIAS TODAVÍA HAYA GENTE BELLA Y HERMOSA QUE MANDA SU APOYO Y ENERGÍA POSITIVA A MI PERSONA. GRACIAS GRACIAS GRACIAS 👕\nTODOS LOS DÍAS INTENTO DARLES LA MEJOR VERSIÓN POSIBLE DE MÍ EN STREAM. A VECES SE LOGRA, A VECES NO JAJA, PERO APRECIO MUCHO A TODOS LOS QUE SE TOMAN UN POCO DE SU VALIOSO TIEMPO PARA SEGUIR APOYANDO EL SUEÑO DE ESTE VIEJO Y LOCO MEXICANO QUE AMA EL DOTA TANTO COMO LO AMAN EN ESTE PRECIOSO PAÍS ❤️\n¡CUÍDENSE MUCHO LOCOS, NOS VEMOS PRONTO!\nATTE. CARLOS \"THE AZATHOTH\" RIOS, MEJOR CONOCIDO EN EL BAJO MUNDO COMO SARCASMO GAMER KTMRE K BA PASAR\n(POR SI NO LO CAPTARON, ESO ÚLTIMO ES BROMA XDDD)"
minusculas <- tolower(texto)
minusculas
## [1] "¡que rápido pasa el tiempo!\nde verdad no puedo creer que apenas unos instantes atrás estaba viajando en ese ya lejano 9 de enero de guadalajara, méxico, a lima, perú.\nhan pasado 5 mesesotes donde he tenido el gusto, orgullo y honor de formar parte del tour 1 y 2 dpc sa, lima major, dreamleague s19 y berlin major. creo que no tenía un año tan activo desde el 2017 lol.\nmuchísimas gracias a esb - electronic sports broadcasting y 4d esports por permitirme seguir formando parte de esta hermosa escena en los distintos eventos que han transcurrido en el año; el poder trabajar en distintos momentos y proyectos para ambas productoras me llena de orgullo y alegría. sigan siendo cracks, cada quien a su modo tan único de transmitir y traer el dota 2 a los fans. \nquiero aclarar que mis comentarios sobre el pago pendiente de la lima major que hice en stream eran en total plan de joda, de meme y chacota. pero en retrospectiva me salió muy bajita la broma y pido disculpas públicas por las molestias causadas de mi parte a los afectados. \navo+ no me debe nada a mi de forma personal.\nno me debe n a d a.\nya dejen de joderlo, por favooooor xd\nya estoy en conversaciones para recibir la remuneración y de nuevo lo repito, avo no tiene nada que ver con ese pago, solo quería molestarlo porque en su momento él fue mi contacto principal para trabajar en el stream en inglés de la lima major, pero obviamente ustedes no tenían ese contexto, así que mi pésimo chiste se salió de control. (ptm hasta dije gah para hacer notar que no era enserio pero no fue suficiente :'u)\nvive y aprende, lol.\neso sería todo por ahora, si aún no me despiden de esb, entonces nos vemos muy muy pronto para cerrar el tour 3 sa dpc y la bali major de cara al ti 2023.\npor último, quiero de verdad agradecer a todos y cada uno de los que siempre están apoyando y mandando la buena vibra en los streams. no saben lo mucho que significa para mí que a pesar de los años y mis pifias e inconsistencias todavía haya gente bella y hermosa que manda su apoyo y energía positiva a mi persona. gracias gracias gracias 👕\ntodos los días intento darles la mejor versión posible de mí en stream. a veces se logra, a veces no jaja, pero aprecio mucho a todos los que se toman un poco de su valioso tiempo para seguir apoyando el sueño de este viejo y loco mexicano que ama el dota tanto como lo aman en este precioso país ❤️\n¡cuídense mucho locos, nos vemos pronto!\natte. carlos \"the azathoth\" rios, mejor conocido en el bajo mundo como sarcasmo gamer ktmre k ba pasar\n(por si no lo captaron, eso último es broma xddd)"
capitalizada <- tools::toTitleCase(texto)
capitalizada
## [1] "¡que RÁPIDO PASA EL TIEMPO!\nDe Verdad No Puedo Creer Que Apenas Unos Instantes Atrás Estaba Viajando en Ese Ya Lejano 9 De Enero De Guadalajara, México, a Lima, Perú.\nHan Pasado 5 Mesesotes Donde He Tenido El Gusto, Orgullo y Honor De Formar Parte Del Tour 1 y 2 DPC SA, Lima Major, Dreamleague S19 y Berlin Major. Creo Que No Tenía Un Año Tan Activo Desde El 2017 Lol.\nMuchísimas Gracias a ESB - Electronic Sports Broadcasting y 4d Esports Por Permitirme Seguir Formando Parte De Esta Hermosa Escena en Los Distintos Eventos Que Han Transcurrido en El Año; El Poder Trabajar en Distintos Momentos y Proyectos Para Ambas Productoras Me Llena De Orgullo y Alegría. Sigan Siendo Cracks, Cada Quien a Su Modo Tan Único De Transmitir y Traer El Dota 2 a Los Fans. \nQuiero Aclarar Que Mis Comentarios Sobre El Pago Pendiente De La Lima Major Que Hice en Stream Eran en Total Plan De Joda, De Meme y Chacota. Pero en Retrospectiva Me Salió Muy Bajita La Broma y Pido Disculpas Públicas Por Las Molestias Causadas De Mi Parte a Los Afectados. \nAvo+ NO ME DEBE NADA a MI DE FORMA PERSONAL.\nNO ME DEBE N a D A.\nYA DEJEN DE JODERLO, POR FAVOOOOOR XD\nYa Estoy en Conversaciones Para Recibir La Remuneración y De Nuevo Lo Repito, Avo No Tiene Nada Que Ver Con Ese Pago, Solo Quería Molestarlo Porque en Su Momento Él Fue Mi Contacto Principal Para Trabajar en El Stream en Inglés De La Lima Major, Pero Obviamente Ustedes No Tenían Ese Contexto, Así Que Mi Pésimo Chiste Se Salió De Control. (Ptm Hasta Dije GAH Para Hacer Notar Que No Era Enserio Pero No Fue Suficiente :'u)\nVive y Aprende, Lol.\nEso Sería Todo Por Ahora, Si Aún No Me Despiden De ESB, Entonces Nos Vemos Muy Muy Pronto Para Cerrar El Tour 3 SA DPC y La Bali Major De Cara Al TI 2023.\nPor Último, Quiero De Verdad Agradecer a Todos y Cada Uno De Los Que Siempre Están Apoyando y Mandando La Buena Vibra en Los Streams. No Saben Lo Mucho Que Significa Para Mí Que a Pesar De Los Años y Mis Pifias e Inconsistencias Todavía Haya Gente Bella y Hermosa Que Manda Su Apoyo y Energía Positiva a Mi Persona. GRACIAS GRACIAS GRACIAS 🙏\nTodos Los Días Intento Darles La Mejor Versión Posible De Mí en Stream. a Veces Se Logra, a Veces No JAJA, Pero Aprecio Mucho a Todos Los Que Se Toman Un Poco De Su Valioso Tiempo Para Seguir Apoyando El Sueño De Este Viejo y Loco Mexicano Que Ama El Dota Tanto Como Lo Aman en Este Precioso País ❤️\n¡cuídense Mucho Locos, Nos Vemos Pronto!\nATTE. CARLOS \"THE AZATHOTH\" RIOS, MEJOR CONOCIDO en EL BAJO MUNDO COMO Sarcasmo Gamer KTMRE K BA PASAR\n(Por Si No Lo Captaron, Eso Último Es Broma XDDD)"
elementos <- strsplit(texto, " ")
elementos
## [[1]]
## [1] "¡QUE" "RÁPIDO" "PASA"
## [4] "EL" "TIEMPO!\nDe" "verdad"
## [7] "no" "puedo" "creer"
## [10] "que" "apenas" "unos"
## [13] "instantes" "atrás" "estaba"
## [16] "viajando" "en" "ese"
## [19] "ya" "lejano" "9"
## [22] "de" "enero" "de"
## [25] "Guadalajara," "México," "a"
## [28] "Lima," "Perú.\nHan" "pasado"
## [31] "5" "mesesotes" "donde"
## [34] "he" "tenido" "el"
## [37] "gusto," "orgullo" "y"
## [40] "honor" "de" "formar"
## [43] "parte" "del" "Tour"
## [46] "1" "y" "2"
## [49] "DPC" "SA," "Lima"
## [52] "Major," "Dreamleague" "S19"
## [55] "y" "Berlin" "Major."
## [58] "Creo" "que" "no"
## [61] "tenía" "un" "año"
## [64] "tan" "activo" "desde"
## [67] "el" "2017" "lol.\nMuchísimas"
## [70] "gracias" "a" "ESB"
## [73] "-" "Electronic" "Sports"
## [76] "Broadcasting" "y" "4D"
## [79] "Esports" "por" "permitirme"
## [82] "seguir" "formando" "parte"
## [85] "de" "esta" "hermosa"
## [88] "escena" "en" "los"
## [91] "distintos" "eventos" "que"
## [94] "han" "transcurrido" "en"
## [97] "el" "año;" "el"
## [100] "poder" "trabajar" "en"
## [103] "distintos" "momentos" "y"
## [106] "proyectos" "para" "ambas"
## [109] "productoras" "me" "llena"
## [112] "de" "orgullo" "y"
## [115] "alegría." "Sigan" "siendo"
## [118] "cracks," "cada" "quien"
## [121] "a" "su" "modo"
## [124] "tan" "único" "de"
## [127] "transmitir" "y" "traer"
## [130] "el" "Dota" "2"
## [133] "a" "los" "fans."
## [136] "\nQuiero" "aclarar" "que"
## [139] "mis" "comentarios" "sobre"
## [142] "el" "pago" "pendiente"
## [145] "de" "la" "Lima"
## [148] "Major" "que" "hice"
## [151] "en" "stream" "eran"
## [154] "en" "total" "plan"
## [157] "de" "joda," "de"
## [160] "meme" "y" "chacota."
## [163] "Pero" "en" "retrospectiva"
## [166] "me" "salió" "muy"
## [169] "bajita" "la" "broma"
## [172] "y" "pido" "disculpas"
## [175] "públicas" "por" "las"
## [178] "molestias" "causadas" "de"
## [181] "mi" "parte" "a"
## [184] "los" "afectados." "\nAvo+"
## [187] "NO" "ME" "DEBE"
## [190] "NADA" "A" "MI"
## [193] "DE" "FORMA" "PERSONAL.\nNO"
## [196] "ME" "DEBE" "N"
## [199] "A" "D" "A.\nYA"
## [202] "DEJEN" "DE" "JODERLO,"
## [205] "POR" "FAVOOOOOR" "XD\nYa"
## [208] "estoy" "en" "conversaciones"
## [211] "para" "recibir" "la"
## [214] "remuneración" "y" "de"
## [217] "nuevo" "lo" "repito,"
## [220] "Avo" "no" "tiene"
## [223] "nada" "que" "ver"
## [226] "con" "ese" "pago,"
## [229] "solo" "quería" "molestarlo"
## [232] "porque" "en" "su"
## [235] "momento" "él" "fue"
## [238] "mi" "contacto" "principal"
## [241] "para" "trabajar" "en"
## [244] "el" "stream" "en"
## [247] "inglés" "de" "la"
## [250] "Lima" "Major," "pero"
## [253] "obviamente" "ustedes" "no"
## [256] "tenían" "ese" "contexto,"
## [259] "así" "que" "mi"
## [262] "pésimo" "chiste" "se"
## [265] "salió" "de" "control."
## [268] "(ptm" "hasta" "dije"
## [271] "GAH" "para" "hacer"
## [274] "notar" "que" "no"
## [277] "era" "enserio" "pero"
## [280] "no" "fue" "suficiente"
## [283] ":'u)\nVive" "y" "aprende,"
## [286] "lol.\nEso" "sería" "todo"
## [289] "por" "ahora," "si"
## [292] "aún" "no" "me"
## [295] "despiden" "de" "ESB,"
## [298] "entonces" "nos" "vemos"
## [301] "muy" "muy" "pronto"
## [304] "para" "cerrar" "el"
## [307] "Tour" "3" "SA"
## [310] "DPC" "y" "la"
## [313] "Bali" "Major" "de"
## [316] "cara" "al" "TI"
## [319] "2023.\nPor" "último," "quiero"
## [322] "de" "verdad" "agradecer"
## [325] "a" "todos" "y"
## [328] "cada" "uno" "de"
## [331] "los" "que" "siempre"
## [334] "están" "apoyando" "y"
## [337] "mandando" "la" "buena"
## [340] "vibra" "en" "los"
## [343] "streams." "No" "saben"
## [346] "lo" "mucho" "que"
## [349] "significa" "para" "mí"
## [352] "que" "a" "pesar"
## [355] "de" "los" "años"
## [358] "y" "mis" "pifias"
## [361] "e" "inconsistencias" "todavía"
## [364] "haya" "gente" "bella"
## [367] "y" "hermosa" "que"
## [370] "manda" "su" "apoyo"
## [373] "y" "energía" "positiva"
## [376] "a" "mi" "persona."
## [379] "GRACIAS" "GRACIAS" "GRACIAS"
## [382] "🙏\nTodos" "los" "días"
## [385] "intento" "darles" "la"
## [388] "mejor" "versión" "posible"
## [391] "de" "mí" "en"
## [394] "stream." "A" "veces"
## [397] "se" "logra," "a"
## [400] "veces" "no" "JAJA,"
## [403] "pero" "aprecio" "mucho"
## [406] "a" "todos" "los"
## [409] "que" "se" "toman"
## [412] "un" "poco" "de"
## [415] "su" "valioso" "tiempo"
## [418] "para" "seguir" "apoyando"
## [421] "el" "sueño" "de"
## [424] "este" "viejo" "y"
## [427] "loco" "mexicano" "que"
## [430] "ama" "el" "Dota"
## [433] "tanto" "como" "lo"
## [436] "aman" "en" "este"
## [439] "precioso" "país" "❤️\n¡Cuídense"
## [442] "mucho" "locos," "nos"
## [445] "vemos" "pronto!\nATTE." "CARLOS"
## [448] "\"THE" "AZATHOTH\"" "RIOS,"
## [451] "MEJOR" "CONOCIDO" "EN"
## [454] "EL" "BAJO" "MUNDO"
## [457] "COMO" "Sarcasmo" "Gamer"
## [460] "KTMRE" "K" "BA"
## [463] "PASAR\n(por" "si" "no"
## [466] "lo" "captaron," "eso"
## [469] "último" "es" "broma"
## [472] "XDDD)"
sin_espacios <- gsub(" ", "", texto)
sin_espacios
## [1] "¡QUERÁPIDOPASAELTIEMPO!\nDeverdadnopuedocreerqueapenasunosinstantesatrásestabaviajandoeneseyalejano9deenerodeGuadalajara,México,aLima,Perú.\nHanpasado5mesesotesdondehetenidoelgusto,orgulloyhonordeformarpartedelTour1y2DPCSA,LimaMajor,DreamleagueS19yBerlinMajor.Creoquenoteníaunañotanactivodesdeel2017lol.\nMuchísimasgraciasaESB-ElectronicSportsBroadcastingy4DEsportsporpermitirmeseguirformandopartedeestahermosaescenaenlosdistintoseventosquehantranscurridoenelaño;elpodertrabajarendistintosmomentosyproyectosparaambasproductorasmellenadeorgulloyalegría.Sigansiendocracks,cadaquienasumodotanúnicodetransmitirytraerelDota2alosfans.\nQuieroaclararquemiscomentariossobreelpagopendientedelaLimaMajorquehiceenstreameranentotalplandejoda,dememeychacota.Peroenretrospectivamesaliómuybajitalabromaypidodisculpaspúblicasporlasmolestiascausadasdemipartealosafectados.\nAvo+NOMEDEBENADAAMIDEFORMAPERSONAL.\nNOMEDEBENADA.\nYADEJENDEJODERLO,PORFAVOOOOORXD\nYaestoyenconversacionespararecibirlaremuneraciónydenuevolorepito,Avonotienenadaqueverconesepago,soloqueríamolestarloporqueensumomentoélfuemicontactoprincipalparatrabajarenelstreameninglésdelaLimaMajor,peroobviamenteustedesnoteníanesecontexto,asíquemipésimochistesesaliódecontrol.(ptmhastadijeGAHparahacernotarquenoeraenserioperonofuesuficiente:'u)\nViveyaprende,lol.\nEsoseríatodoporahora,siaúnnomedespidendeESB,entoncesnosvemosmuymuyprontoparacerrarelTour3SADPCylaBaliMajordecaraalTI2023.\nPorúltimo,quierodeverdadagradeceratodosycadaunodelosquesiempreestánapoyandoymandandolabuenavibraenlosstreams.Nosabenlomuchoquesignificaparamíqueapesardelosañosymispifiaseinconsistenciastodavíahayagentebellayhermosaquemandasuapoyoyenergíapositivaamipersona.GRACIASGRACIASGRACIAS🙏\nTodoslosdíasintentodarleslamejorversiónposibledemíenstream.Avecesselogra,avecesnoJAJA,peroapreciomuchoatodoslosquesetomanunpocodesuvaliosotiempoparaseguirapoyandoelsueñodeesteviejoylocomexicanoqueamaelDotatantocomoloamanenestepreciosopaís❤️\n¡Cuídensemucholocos,nosvemospronto!\nATTE.CARLOS\"THEAZATHOTH\"RIOS,MEJORCONOCIDOENELBAJOMUNDOCOMOSarcasmoGamerKTMREKBAPASAR\n(porsinolocaptaron,esoúltimoesbromaXDDD)"
longitud <- nchar(texto)
longitud
## [1] 2575
En R, al igual que en Python, las listas son una estructura de datos que admite la indexación, comenzando desde 1 en lugar de 0 como en Python. También se puede acceder a los elementos de una lista utilizando índices negativos, donde -1 se refiere al último elemento de la lista, -2 al penúltimo y así sucesivamente.
Para acceder a un elemento específico de una lista en R, simplemente proporciona el índice del elemento entre corchetes, como se muestra a continuación:
# Crear una lista
mi_lista <- list("manzana", "banana", "cereza", "dátiles")
# Acceder al primer elemento
primer_elemento <- mi_lista[1]
print(primer_elemento) # Imprime "manzana"
## [[1]]
## [1] "manzana"
# Acceder a varios elementos
elementos_seleccionados <- mi_lista[c(2, 4)]
print(elementos_seleccionados) # Imprime "banana" y "dátiles"
## [[1]]
## [1] "banana"
##
## [[2]]
## [1] "dátiles"
# Acceder al último elemento
ultimo_elemento <- mi_lista[-length(mi_lista)]
print(ultimo_elemento) # Imprime "dátiles"
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "banana"
##
## [[3]]
## [1] "cereza"
En R, puedes agregar elementos a una lista utilizando varias funciones y técnicas. A continuación, se muestran algunas de las formas más comunes de hacerlo.
c()La forma más sencilla de agregar elementos a una lista en R es
utilizando la función c(), que combina elementos en un
nuevo vector o lista. Puedes usar esta función para agregar uno o más
elementos al final de una lista existente. Aquí hay un ejemplo:
En R, puedes agregar elementos a una lista utilizando varias funciones y técnicas. A continuación, se muestran algunas de las formas más comunes de hacerlo.
c()La forma más sencilla de agregar elementos a una lista en R es
utilizando la función c(), que combina elementos en un
nuevo vector o lista. Puedes usar esta función para agregar uno o más
elementos al final de una lista existente. Aquí hay un ejemplo:
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Agregar un elemento al final de la lista
mi_lista <- c(mi_lista, "dátiles")
print(mi_lista) # Imprime la lista actualizada
Ejemplo:
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Agregar un elemento al final de la lista
mi_lista <- append(mi_lista, "dátiles")
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "banana"
##
## [[3]]
## [1] "cereza"
##
## [[4]]
## [1] "dátiles"
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Agregar un elemento en una posición específica
mi_lista[[4]] <- "dátiles"
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "banana"
##
## [[3]]
## [1] "cereza"
##
## [[4]]
## [1] "dátiles"
En R, puedes actualizar elementos específicos en una lista utilizando la indexación. A continuación, te mostraré cómo hacerlo.
Para actualizar un elemento en una lista, simplemente utiliza la indexación para acceder al elemento que deseas cambiar y asigna un nuevo valor a ese elemento. Aquí tienes un ejemplo:
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Actualizar el segundo elemento de la lista
mi_lista[2] <- "naranja"
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "naranja"
##
## [[3]]
## [1] "cereza"
Ejemplo:
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Actualizar el segundo elemento de la lista usando doble corchete
mi_lista[[2]] <- "naranja"
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "naranja"
##
## [[3]]
## [1] "cereza"
En R, puedes eliminar elementos específicos de una lista utilizando diferentes métodos. A continuación, te mostraré cómo hacerlo.
Una forma común de eliminar elementos de una lista es utilizando la indexación negativa. Esto significa que indicas qué elementos deseas conservar en lugar de los que deseas eliminar. Aquí tienes un ejemplo:
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Eliminar el segundo elemento de la lista usando indexación negativa
mi_lista <- mi_lista[-2]
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "cereza"
Ejemplo:
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Eliminar elementos que cumplan una condición
mi_lista <- subset(mi_lista, mi_lista != "banana")
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "cereza"
# Crear una lista inicial
mi_lista <- list("manzana", "banana", "cereza")
# Crear una nueva lista excluyendo elementos
mi_lista <- list(mi_lista[[1]], mi_lista[[3]])
print(mi_lista) # Imprime la lista actualizada
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "cereza"
En R, puedes verificar si un elemento está presente en una lista
utilizando la función %in% o el operador %in%.
Esto te permite comprobar si un valor específico existe en la lista o
no.
%in%La función %in% es útil para comprobar si un valor está
presente en una lista y devuelve un valor lógico (TRUE o
FALSE). Aquí tienes un ejemplo:
# Crear una lista
mi_lista <- list("manzana", "banana", "cereza")
# Verificar si "banana" está en la lista
esta_presente <- "banana" %in% mi_lista
print(esta_presente) # Imprime TRUE si está presente, FALSE si no lo está
## [1] TRUE
Ejemplo: Usar el operador %in%
# Crear una lista
mi_lista <- list("manzana", "banana", "cereza")
# Verificar si "banana" está en la lista
esta_presente <- "banana" %in% mi_lista
print(esta_presente) # Imprime TRUE si está presente, FALSE si no lo está
## [1] TRUE
En R, puedes obtener la longitud de una lista utilizando la función
length() y contar cuántas veces aparece un elemento en una
lista usando la función sum() en combinación con
sapply().
Para obtener la longitud de una lista en R, puedes utilizar la
función length(). Aquí tienes un ejemplo:
# Crear una lista
mi_lista <- list("manzana", "banana", "cereza")
# Obtener la longitud de la lista
longitud <- length(mi_lista)
print(longitud) # Imprime la longitud de la lista
## [1] 3
Contar la aparición de un elemento en una lista
# Crear una lista
mi_lista <- list("manzana", "banana", "cereza", "banana", "manzana")
# Contar cuántas veces aparece "banana" en la lista
conteo <- sum(sapply(mi_lista, function(x) x == "banana"))
print(conteo) # Imprime el número de veces que "banana" aparece en la lista
## [1] 2
En R, puedes realizar cortes o divisiones en una lista utilizando la
notación de corchetes []. Esto te permite obtener un
subconjunto de una lista o una porción de una lista basada en la
indexación.
# Crear una lista
mi_lista <- list("manzana", "banana", "cereza", "naranja", "uva")
# Obtener un subconjunto de la lista desde el índice 2 hasta el índice 4
sub_lista <- mi_lista[2:4]
print(sub_lista)
## [[1]]
## [1] "banana"
##
## [[2]]
## [1] "cereza"
##
## [[3]]
## [1] "naranja"
# Obtener los primeros 3 elementos de la lista
primeros_elementos <- mi_lista[1:3]
print(primeros_elementos)
## [[1]]
## [1] "manzana"
##
## [[2]]
## [1] "banana"
##
## [[3]]
## [1] "cereza"
# Obtener un solo elemento de la lista (índice 5)
elemento <- mi_lista[5]
print(elemento)
## [[1]]
## [1] "uva"
En R y RStudio, es posible gestionar tuplas mediante el uso de listas o vectores con nombres. A diferencia de varios otros lenguajes de programación, R no cuenta con un tipo de dato de tupla dedicado, pero se pueden crear estructuras de datos que se asemejen a tuplas mediante el empleo de listas o vectores con etiquetas descriptivas.
# Crear una "tupla" usando una lista
mi_tupla <- list(nombre = "Juan", edad = 30, ciudad = "Huaraz")
mi_tupla
## $nombre
## [1] "Juan"
##
## $edad
## [1] 30
##
## $ciudad
## [1] "Huaraz"
# Acceder a elementos de la "tupla"
nombre <- mi_tupla$nombre
nombre
## [1] "Juan"
edad <- mi_tupla$edad
edad
## [1] 30
ciudad <- mi_tupla$ciudad
ciudad
## [1] "Huaraz"
# Crear una "tupla" usando un vector con nombres
mi_tupla <- c(nombre = "Juan", edad = 30, ciudad = "Huaraz")
mi_tupla
## nombre edad ciudad
## "Juan" "30" "Huaraz"
# Acceder a elementos de la "tupla"
nombre <- mi_tupla["nombre"]
edad <- mi_tupla["edad"]
ciudad <- mi_tupla["ciudad"]
# Imprimir los valores
cat("Nombre:", nombre, "\n")
## Nombre: Juan
cat("Edad:", edad, "\n")
## Edad: 30
cat("Ciudad:", ciudad, "\n")
## Ciudad: Huaraz
En R, no existe un tipo de dato llamado “diccionario” como se encuentra en otros lenguajes de programación como Python. Sin embargo, puedes lograr estructuras de datos similares a los diccionarios utilizando listas o vectores con nombres. Estos objetos se pueden usar para almacenar pares clave-valor, lo que es una característica común de los diccionarios.
De esta manera, puedes simular la funcionalidad de un diccionario en R utilizando listas o vectores con nombres. Estos objetos son muy versátiles y te permiten almacenar y acceder a datos de manera eficiente.
Sin embargo, puedes lograr una funcionalidad similar a la de un diccionario utilizando listas o vectores con nombres, como se mencionó anteriormente.
Aunque las listas y vectores con nombres en R pueden usarse para almacenar pares clave-valor como lo harías en un diccionario, existen diferencias en la forma en que se accede a los elementos y se realizan operaciones en comparación con los diccionarios de otros lenguajes.
Si deseas una estructura de datos más cercana a un diccionario con
características específicas de diccionario, puedes considerar el paquete
listenv, que proporciona una implementación de diccionario
en R.
Para usar el paquete listenv, primero debes instalarlo
si aún no lo has hecho:
if (!requireNamespace("listenv", quietly = TRUE)) {
install.packages("listenv")
}
Luego, puedes crear un diccionario utilizando esta biblioteca:
library(listenv)
## Warning: package 'listenv' was built under R version 4.2.3
mi_diccionario <- listenv(
nombre = "Juan",
edad = 30,
ciudad = "Huaraz"
)
Con listenv, puedes acceder a los valores y realizar
operaciones similares a las que harías con un diccionario en otros
lenguajes de programación.
Por ejemplo:
nombre <- mi_diccionario$nombre
edad <- mi_diccionario$edad
ciudad <- mi_diccionario$ciudad
# Modificar un valor
mi_diccionario$edad <- 31
# Agregar un nuevo par clave-valor
mi_diccionario$telefono <- "123-456-7890"
# Eliminar una clave-valor
mi_diccionario$ciudad <- NULL
# Crear un diccionario usando listenv
mi_diccionario <- listenv(
nombre = "Juan",
edad = 30,
ciudad = "Ejemploville"
)
# Acceder a valores del diccionario
nombre <- mi_diccionario$nombre
edad <- mi_diccionario$edad
ciudad <- mi_diccionario$ciudad
# Modificar un valor en el diccionario
mi_diccionario$edad <- 31
# Agregar un nuevo par clave-valor al diccionario
mi_diccionario$telefono <- "123-456-7890"
# Eliminar una clave-valor del diccionario
mi_diccionario$ciudad <- NULL
# Imprimir valores
cat("Nombre:", nombre, "\n")
## Nombre: Juan
cat("Edad:", edad, "\n")
## Edad: 30
cat("Ciudad:", ciudad, "\n")
## Ciudad: Ejemploville
## Nube de palabras
#cargamos las librerias correspondientes
library(tm)
## Warning: package 'tm' was built under R version 4.2.3
## Loading required package: NLP
library(NLP)
library(SnowballC)
## Warning: package 'SnowballC' was built under R version 4.2.3
library(RColorBrewer)
library(wordcloud)
## Warning: package 'wordcloud' was built under R version 4.2.3
#DISCURSO DE NO VIOLENCIA DE GANDHI
#Que palabras hay con mayor frecuencia en el discurso de Gandhi?
#nuestro texto lo guardamos en bloc de notas en formato txt
texto <- readLines("C:/Users/wilde/Downloads/01.txt")
## Warning in readLines("C:/Users/wilde/Downloads/01.txt"): incomplete final line
## found on 'C:/Users/wilde/Downloads/01.txt'
texto = iconv(texto, to="ASCII//TRANSLIT")
texto = Corpus(VectorSource(texto))
########### LIMPIAMOS NUESTRO TEXTO CON EL COMANDO tm_map
#ponemos todos los datos a minuscula (A!=a)
discurso=tm_map(texto, tolower)
## Warning in tm_map.SimpleCorpus(texto, tolower): transformation drops documents
#quitamos los espacios en blanco
discurso =tm_map(discurso, stripWhitespace)
## Warning in tm_map.SimpleCorpus(discurso, stripWhitespace): transformation drops
## documents
#quitamos la puntuacion
discurso = tm_map(discurso, removePunctuation)
## Warning in tm_map.SimpleCorpus(discurso, removePunctuation): transformation
## drops documents
#quitamos los numeros
discurso = tm_map(discurso, removeNumbers)
## Warning in tm_map.SimpleCorpus(discurso, removeNumbers): transformation drops
## documents
#mostramos palabras vacias y genericas
stopwords("spanish")
## [1] "de" "la" "que" "el" "en"
## [6] "y" "a" "los" "del" "se"
## [11] "las" "por" "un" "para" "con"
## [16] "no" "una" "su" "al" "lo"
## [21] "como" "más" "pero" "sus" "le"
## [26] "ya" "o" "este" "sí" "porque"
## [31] "esta" "entre" "cuando" "muy" "sin"
## [36] "sobre" "también" "me" "hasta" "hay"
## [41] "donde" "quien" "desde" "todo" "nos"
## [46] "durante" "todos" "uno" "les" "ni"
## [51] "contra" "otros" "ese" "eso" "ante"
## [56] "ellos" "e" "esto" "mí" "antes"
## [61] "algunos" "qué" "unos" "yo" "otro"
## [66] "otras" "otra" "él" "tanto" "esa"
## [71] "estos" "mucho" "quienes" "nada" "muchos"
## [76] "cual" "poco" "ella" "estar" "estas"
## [81] "algunas" "algo" "nosotros" "mi" "mis"
## [86] "tú" "te" "ti" "tu" "tus"
## [91] "ellas" "nosotras" "vosotros" "vosotras" "os"
## [96] "mío" "mía" "míos" "mías" "tuyo"
## [101] "tuya" "tuyos" "tuyas" "suyo" "suya"
## [106] "suyos" "suyas" "nuestro" "nuestra" "nuestros"
## [111] "nuestras" "vuestro" "vuestra" "vuestros" "vuestras"
## [116] "esos" "esas" "estoy" "estás" "está"
## [121] "estamos" "estáis" "están" "esté" "estés"
## [126] "estemos" "estéis" "estén" "estaré" "estarás"
## [131] "estará" "estaremos" "estaréis" "estarán" "estaría"
## [136] "estarías" "estaríamos" "estaríais" "estarían" "estaba"
## [141] "estabas" "estábamos" "estabais" "estaban" "estuve"
## [146] "estuviste" "estuvo" "estuvimos" "estuvisteis" "estuvieron"
## [151] "estuviera" "estuvieras" "estuviéramos" "estuvierais" "estuvieran"
## [156] "estuviese" "estuvieses" "estuviésemos" "estuvieseis" "estuviesen"
## [161] "estando" "estado" "estada" "estados" "estadas"
## [166] "estad" "he" "has" "ha" "hemos"
## [171] "habéis" "han" "haya" "hayas" "hayamos"
## [176] "hayáis" "hayan" "habré" "habrás" "habrá"
## [181] "habremos" "habréis" "habrán" "habría" "habrías"
## [186] "habríamos" "habríais" "habrían" "había" "habías"
## [191] "habíamos" "habíais" "habían" "hube" "hubiste"
## [196] "hubo" "hubimos" "hubisteis" "hubieron" "hubiera"
## [201] "hubieras" "hubiéramos" "hubierais" "hubieran" "hubiese"
## [206] "hubieses" "hubiésemos" "hubieseis" "hubiesen" "habiendo"
## [211] "habido" "habida" "habidos" "habidas" "soy"
## [216] "eres" "es" "somos" "sois" "son"
## [221] "sea" "seas" "seamos" "seáis" "sean"
## [226] "seré" "serás" "será" "seremos" "seréis"
## [231] "serán" "sería" "serías" "seríamos" "seríais"
## [236] "serían" "era" "eras" "éramos" "erais"
## [241] "eran" "fui" "fuiste" "fue" "fuimos"
## [246] "fuisteis" "fueron" "fuera" "fueras" "fuéramos"
## [251] "fuerais" "fueran" "fuese" "fueses" "fuésemos"
## [256] "fueseis" "fuesen" "siendo" "sido" "tengo"
## [261] "tienes" "tiene" "tenemos" "tenéis" "tienen"
## [266] "tenga" "tengas" "tengamos" "tengáis" "tengan"
## [271] "tendré" "tendrás" "tendrá" "tendremos" "tendréis"
## [276] "tendrán" "tendría" "tendrías" "tendríamos" "tendríais"
## [281] "tendrían" "tenía" "tenías" "teníamos" "teníais"
## [286] "tenían" "tuve" "tuviste" "tuvo" "tuvimos"
## [291] "tuvisteis" "tuvieron" "tuviera" "tuvieras" "tuviéramos"
## [296] "tuvierais" "tuvieran" "tuviese" "tuvieses" "tuviésemos"
## [301] "tuvieseis" "tuviesen" "teniendo" "tenido" "tenida"
## [306] "tenidos" "tenidas" "tened"
#quitamos palabras genericas
discurso=tm_map(discurso, removeWords,stopwords("spanish"))
## Warning in tm_map.SimpleCorpus(discurso, removeWords, stopwords("spanish")):
## transformation drops documents
#tambien podemos tener nuestra propia lista de palabras a quitar
############### DATA FRAME DE PALABRAS CON SU FRECUENCIA
#Creamos matriz de letras
letras= TermDocumentMatrix(discurso)
findFreqTerms(letras, lowfreq=5)
## [1] "padrenuestro" "articulo" "noster" "pater"
## [5] "vease" "comun" "cristianismo" "escrito"
## [9] "escritos" "evangelio" "forma" "griego"
## [13] "jesus" "koine" "lengua" "llamada"
## [17] "mateo" "nazaret" "nuevo" "oracion"
## [21] "original" "segun" "tambien" "testamento"
## [25] "texto" "version" "aunque" "cristiana"
## [29] "latin" "lucas" "padre" "peticiones"
## [33] "catolica" "iglesias" "ortodoxa" "cielos"
## [37] "nombre" "santificado" "reino" "venga"
## [41] "asi" "cielo" "hagase" "tierra"
## [45] "voluntad" "cada" "danosle" "dia"
## [49] "pan" "deudas" "perdonanos" "deudores"
## [53] "perdonamos" "caer" "dejes" "tentacion"
## [57] "libranos" "mal" "mas" "biblia"
## [61] "san" "traduccion" "cotidiano" "danos"
## [65] "hoy" "gentiles" "siglo" "dioses"
## [69] "medio" "orar" "palabras" "pueblo"
## [73] "tenia" "bien" "caso" "gran"
## [77] "manera" "pues" "puesto" "requerida"
## [81] "verdadera" "consideran" "creyentes" "cristianos"
## [85] "debe" "dentro" "hecho" "judia"
## [89] "judio" "judios" "origen" "judaismo"
## [93] "necesita" "seccion" "abinu" "malkenu"
## [97] "contexto" "dios" "divino" "hombres"
## [101] "ser" "unico" "embargo" "israel"
## [105] "sino" "hijo" "relatos" "cristo"
## [109] "espiritual" "menos" "mismo" "oraciones"
## [113] "parte" "dominical" "eterno" "cita"
## [117] "contenido" "deben" "frase" "contiene"
## [121] "hebreo" "pide" "rey" "iglesia"
## [125] "primitiva" "avinu" "espanol" "evangelios"
## [129] "textos" "tora" "cristianas" "cualquier"
## [133] "diferentes" "hombre" "mundo" "nueva"
## [137] "puede" "senor" "solo" "dice"
## [141] "ejemplo" "jerusalen" "principal" "punto"
## [145] "bautismo" "catolicismo" "debian" "dos"
## [149] "decir" "liturgia" "misa" "relato"
## [153] "discipulos" "peticion" "dijo" "juan"
## [157] "lugar" "termino" "acuerdo" "persona"
## [161] "aparece" "ensenanzas" "vida" "maria"
## [165] "pecados" "despues" "diferencias" "siguientes"
## [169] "versiones" "invocacion" "cambio" "hipotesis"
## [173] "siguiente" "tres" "vez" "tercera"
## [177] "hemon" "sou" "kai" "danoslo"
## [181] "gloria" "poder" "amen" "doxologia"
## [185] "final" "siempre" "ultima" "antiguo"
## [189] "catecismo" "palabra" "siglos" "uso"
## [193] "traducciones" "interpretacion" "espanola" "wikisource"
## [197] "disponible" "latina" "lenguas" "vulgata"
## [201] "espana" "misma" "todas" "santo"
## [205] "pedir" "perdon" "catolicos" "eucaristia"
## [209] "estructura" "habla" "siete" "hijos"
## [213] "salmo" "primera" "segunda" "tiempos"
## [217] "cuarta" "cuerpo" "material" "sustento"
## [221] "refiere" "desierto" "alimento" "espiritu"
## [225] "come" "verdad" "ofensas" "perdona"
## [229] "cristiano" "anos" "verbo" "sustancial"
## [233] "glorificacion" "dara" "ano" "jubileo"
## [237] "monetarias" "referencia" "tradicional" "haz"
## [241] "manu" "ingles" "arabe" "lords"
## [245] "prayer" "manana" "edicion" "abril"
## [249] "consultado" "madrid" "isbn" "archivado"
## [253] "the" "machine" "wayback" "electronico"
matrix=as.matrix(letras)
#lo ordenamos y sumamos las letras de nuestra matriz
vector <- sort(rowSums(matrix),decreasing=TRUE)
#creamos la data con las palabras y su frecuencia
dataletras <- data.frame(word= names(vector),frequencia=vector)
# lo nombra y le da formato de data.frame
################ GRAFICAMOS FRECUENCIA DE LAS PALABRAS
barplot(dataletras[1:10,]$freq, las = 2, names.arg = dataletras[1:10,]$word,
col ="blue", main ="PALABRAS M?S FRECUENTES", ylab = "Frecuencia de palabras")
############ GRAFICAMOS LA NUBE DE PALABRAS
wordcloud(words = dataletras$word, freq = dataletras$freq, min.freq = 2,
max.words=70)
#en el centro la palabra mas importante,
wordcloud(words = dataletras$word, freq = dataletras$freq, min.freq = 2,
max.words=70, random.order=FALSE, rot.per=0.2,
colors=brewer.pal(8, "Dark2"))
Varios expertos en ciencia de datos y analistas poseen diferentes
enfoques para definir el análisis de datos. Sin embargo, en términos
generales, podemos afirmar que el análisis de datos se refiere al
procedimiento de extraer información valiosa a partir de datos en bruto
para enriquecer la toma de decisiones comerciales basadas en
datos.
De acuerdo con Wikipedia, el análisis de datos se configura como un
proceso que involucra la revisión, depuración, transformación y modelado
de datos con el propósito de desentrañar datos de interés, respaldar
conclusiones y fundamentar la toma de decisiones. (Fuente: https://en.wikipedia.org/wiki/Data_analysis)
Si observamos la ejecución o enfoque operativo del análisis de datos,
consta de una serie de pasos secuenciales. Al llevarlos a cabo,
lograremos destilar conocimientos a partir de los datos sin
procesar.
El análisis de datos es una disciplina fundamental en la era actual, impulsada por la abundancia de información generada constantemente en una variedad de campos. Su importancia radica en la capacidad de transformar montañas de datos sin procesar en conocimientos valiosos que pueden respaldar la toma de decisiones informadas en diversos sectores, desde negocios y finanzas hasta ciencias sociales y tecnología. Este proceso implica la aplicación de métodos estadísticos, técnicas de minería de datos y herramientas de visualización para descubrir patrones, tendencias y correlaciones ocultas en los datos, lo que permite a las organizaciones tomar medidas con base en evidencia en lugar de intuición.
El análisis de datos no se limita únicamente a la extracción de información; también abarca la limpieza y transformación de datos, ya que los datos en bruto a menudo contienen errores, valores atípicos y duplicados. Estas etapas son cruciales para garantizar que los resultados sean precisos y confiables. Además, el análisis de datos impulsa la toma de decisiones basada en datos, lo que significa que las organizaciones pueden aprovechar los conocimientos obtenidos para optimizar sus operaciones, mejorar la eficiencia, identificar oportunidades de crecimiento y resolver problemas complejos. En resumen, el análisis de datos se ha convertido en una herramienta esencial en la toma de decisiones empresariales y en la generación de conocimientos en un mundo impulsado por la información.
Análisis de datos descriptivos
Análisis de datos de diagnóstico
Análisis de datos predictivos
Análisis de datos prescriptivos
El análisis descriptivo se emplea comúnmente para examinar datos
pasados o actuales, ya que los datos en su estado original pueden ser
difíciles de comprender. En cambio, el análisis descriptivo proporciona
métricas más centradas en el objetivo del análisis. Un estudio
descriptivo es un método preciso para recopilar información y describir
las relaciones entre los datos. Existen dos tipos principales de
análisis descriptivo: el numérico, que incluye tablas de frecuencias
para variables cuantitativas o cualitativas, y el gráfico, que utiliza
diagramas de barras y diagramas de sectores.
¿Qué es un análisis descriptivo en estadística?
Un análisis descriptivo en estadística se utiliza para estudiar
características que pueden expresarse numéricamente, ya sea porque son
naturalmente mensurables o porque pueden ser cuantificadas de alguna
manera. La estadística descriptiva se enfoca en organizar, resumir y
analizar un conjunto de datos mediante diversas técnicas, sin pretender
ir más allá de los datos mismos. Su objetivo es resumir una muestra
estadística a través de medidas de tendencia, dispersión, localización y
forma, así como emplear métodos gráficos para representar los aspectos
importantes de la muestra y abordar problemas de probabilidad. La
estadística descriptiva se utiliza para recopilar, almacenar, y
presentar información sobre un tema y proporcionar resúmenes de grandes
conjuntos de datos.
Las ventajas del análisis descriptivo son:
Las desventajas del análisis descriptivo son:
El análisis de datos de diagnóstico se utiliza comúnmente para evaluar cualquier tipo de información pasada o presente en el contexto médico o de evaluación. Esto se debe a que los datos en su estado original pueden resultar complicados de comprender y analizar, mientras que las métricas ofrecidas por el análisis de diagnóstico se centran en aspectos específicos relacionados con la identificación de problemas o enfermedades. Un análisis de datos de diagnóstico se presenta como un método preciso para recopilar información y, posteriormente, describir las relaciones entre los datos en el ámbito de la salud o la evaluación. Existen diversos tipos de análisis de diagnóstico, como los basados en pruebas médicas, evaluaciones clínicas o de laboratorio.
El análisis de datos de diagnóstico ofrece una serie de beneficios, que incluyen:
Proporciona una evaluación objetiva y neutral de los datos.
Es un enfoque expansivo que puede ofrecer una visión completa de los problemas de salud o evaluación.
Ayuda a comprender a fondo un diagnóstico y a interpretar los resultados de evaluaciones más complejas.
Permite a los profesionales de la salud combinar datos cuantitativos y cualitativos para obtener una imagen completa de la situación.
Facilita la detección de patrones y anomalías, lo que es útil en el diagnóstico temprano.
No obstante, el análisis de datos de diagnóstico también presenta desafíos, como:
Posibles problemas de confidencialidad y veracidad en los datos recopilados.
La necesidad de diseñar cuidadosamente las pruebas y evaluaciones para evitar errores en el diagnóstico.
Riesgo de sesgo si se selecciona información que respalda una hipótesis preexistente y se ignoran datos contradictorios.
Limitaciones en la generalización de resultados basados en un único caso o un grupo reducido.
La influencia de prejuicios profesionales que pueden afectar la toma de decisiones en el diagnóstico o evaluación.
El análisis de datos predictivo, como su nombre sugiere, permite la construcción de modelos que anticipan eventos con antelación. En esencia, se dirige hacia el futuro y proporciona una comprensión de cómo podría evolucionar nuestro entorno y, en particular, nuestra empresa. Por ejemplo, a partir de los datos, podemos estimar con anticipación cuántas ventas se realizarán en nuestro negocio durante el próximo mes. El propósito fundamental del análisis de datos predictivo es realizar pronósticos, y se fundamenta en enfoques matemáticos avanzados, como la estadística y el aprendizaje automático, para predecir información faltante y describir lo que sucederá. Su principal objetivo es extraer conocimiento a través de la identificación de patrones, modelos y tendencias que mejoren la precisión en la toma de decisiones en situaciones futuras.
Ventajas del análisis predictivo:
Mejora de la competitividad empresarial: En lugar de depender únicamente de experiencias pasadas para comprender tendencias y obtener información, el análisis predictivo permite a las empresas mantener su competitividad al anticipar y adaptarse a los cambios del mercado.
Identificación de nuevas fuentes de ingresos: A través del análisis predictivo, las empresas pueden examinar los patrones históricos de compra de sus clientes y tomar decisiones basadas en estos patrones, lo que les permite lanzar ofertas promocionales, descuentos y cupones de manera más efectiva.
Mejora en el servicio al cliente: Las empresas pueden ofrecer experiencias de cliente excepcionales al analizar las necesidades futuras de los clientes, lo que es especialmente relevante en sectores como el desarrollo de aplicaciones. Un sistema de análisis predictivo confiable permite analizar tanto datos estructurados como no estructurados para anticipar las expectativas de los clientes.
Detección de tendencias ocultas en los datos de los clientes: El análisis predictivo facilita la personalización de la experiencia del cliente al identificar de manera precisa a aquellos con una alta propensión a realizar compras, lo que permite a las empresas detectar tendencias emergentes en los sentimientos de los clientes.
Identificación de áreas de abandono: El análisis predictivo brinda la oportunidad de recuperar a clientes perdidos al identificar las razones de su partida y evitar que otros clientes sigan su ejemplo. Con esta información anticipada, las empresas pueden planificar estrategias efectivas para retener a sus clientes.
Desventajas del análisis predictivo:
Dependencia de la metodología: El análisis predictivo implica el uso de probabilidades y correlaciones que no son absolutas, lo que requiere que los ejecutivos y gerentes entiendan y filtren adecuadamente la información para garantizar resultados precisos y reproducibles. Además, deben presentar estos resultados como percepciones procesables con parámetros de riesgo para cada opción.
Formulación de preguntas inadecuadas: Es esencial que las empresas planteen las preguntas correctas, dado el vasto volumen de información involucrado en el análisis predictivo. Los científicos de datos deben ser capaces de cuestionar las suposiciones y descartar datos incorrectos.
Calidad de los datos: No todos los datos son precisos, y pueden contener errores debido a diversas razones, como errores de autoinforme, archivos dañados, preguntas mal formuladas, datos incompletos y métodos deficientes. Reconocer y filtrar rápidamente los datos incorrectos es esencial, y es necesario evitar la creación de datos erróneos.
Complejidad e imprevisibilidad: El análisis predictivo, basado en técnicas estadísticas, requiere que los datos se estandaricen y cuantifiquen, lo que conlleva sus propios riesgos y genera incertidumbre. Los datos son inherentemente impredecibles, especialmente los datos dinámicos. Un modelo que pronostica con precisión eventos futuros puede verse desafiado por una cascada de eventos inesperados que no se habían previsto inicialmente.
Privacidad y seguridad: El uso de datos para predecir el comportamiento de las personas es considerado invasivo y preocupante por defensores de la privacidad. La recopilación de información sobre individuos con el propósito de predicción plantea cuestiones éticas y de privacidad. Los ejecutivos y los responsables de datos deben estar al tanto de los cambios constantes en las regulaciones de protección de datos.
El análisis prescriptivo se dedica a buscar soluciones dentro de un conjunto de posibilidades con el propósito de optimizar los recursos y mejorar la eficiencia operativa. Este enfoque emplea diversas técnicas de simulación y optimización para identificar la mejor ruta a seguir.
Por otro lado, la analítica predictiva anticipa qué sucederá, cuándo ocurrirá y por qué ocurrirá. Su labor radica en combinar de manera automática grandes volúmenes de datos, conceptos matemáticos, reglas empresariales y aprendizaje automático para realizar predicciones y ofrecer sugerencias que respalden la toma de decisiones. No se limita únicamente a prever los resultados futuros, sino que también propone acciones concretas para aprovechar esas predicciones y presenta a los responsables de la toma de decisiones las implicaciones de cada opción.
El análisis prescriptivo juega un papel fundamental al permitir que las empresas tomen decisiones futuras de manera informada y estratégica. A través de este enfoque, es posible realizar tareas como calcular las ventas futuras de un producto para determinar las necesidades de reposición, comprender las tendencias de compra de los clientes y, en consecuencia, lanzar campañas de marketing que se ajusten a esas necesidades. Además, el análisis prescriptivo posibilita la predicción de posibles fallos en el equipo, lo que facilita la realización de mantenimientos preventivos en el momento oportuno. También proporciona información valiosa sobre los hábitos de compra y la puntualidad de pago de los clientes, lo que ayuda a evaluar la conveniencia de otorgar crédito. Aunque algunas de estas decisiones pueden tomarse manualmente, la complejidad de la información y la urgencia de los procesos hacen que el análisis estadístico sea altamente beneficioso.
El análisis prescriptivo conlleva ventajas significativas, como la optimización de procesos, campañas y estrategias empresariales. Asimismo, contribuye a minimizar las necesidades de mantenimiento y a mejorar las condiciones de los equipos, lo que resulta en una reducción de costos sin afectar el rendimiento. Adicionalmente, este enfoque aumenta la probabilidad de que las empresas enfoquen y planifiquen adecuadamente su crecimiento interno, aprovechando al máximo su potencial y recursos disponibles.
Ventajas del análisis prescriptivo:
Optimización de decisiones: Permite tomar decisiones futuras de manera más informada y estratégica, optimizando recursos y procesos.
Mejor planificación de reposiciones: Facilita el cálculo de ventas futuras para determinar cuántos productos deben reponerse.
Personalización de campañas de marketing: Ayuda a comprender las tendencias de compra de los clientes y a lanzar campañas de marketing adaptadas a sus necesidades.
Mantenimiento preventivo: Permite predecir fallos en el equipo, lo que posibilita realizar mantenimientos en el momento oportuno.
Evaluación de riesgos crediticios: Proporciona información sobre los hábitos de compra y la puntualidad de pago de los clientes, ayudando a determinar si es adecuado otorgar crédito.
Enfoque estratégico: Es especialmente útil cuando la información es compleja y los procesos requieren decisiones rápidas y precisas.
Desventajas del análisis prescriptivo:
Dependencia de la calidad de los datos: La precisión de las predicciones depende en gran medida de la calidad de los datos utilizados en el análisis.
Complejidad del análisis: El análisis prescriptivo puede ser complejo y requiere conocimientos especializados en estadísticas y análisis de datos.
Costos asociados: La implementación de sistemas de análisis prescriptivo puede ser costosa en términos de recursos, herramientas y capacitación.
Posibilidad de decisiones incorrectas: Si no se plantean las preguntas adecuadas o se utilizan datos incorrectos, las decisiones basadas en el análisis prescriptivo pueden ser erróneas.
Necesidad de seguimiento y adaptación: El entorno empresarial es dinámico, y las predicciones pueden volverse obsoletas si no se actualizan y adaptan a los cambios en el mercado
El análisis de datos en R se basa en diversas metodologías teóricas, dependiendo de los objetivos del análisis y la naturaleza de los datos. Las metodologías teóricas más comunes incluyen:
El análisis descriptivo se utiliza para resumir y visualizar datos. Es especialmente útil para datos estructurados, como tablas, donde se pueden calcular estadísticas descriptivas. Además de summarytools, el paquete psych proporciona herramientas para realizar análisis descriptivos más avanzados:
library(psych)
## Warning: package 'psych' was built under R version 4.2.3
data <- data.frame(
Age = c(25, 30, 35, 40, 45),
Height = c(160, 170, 175, 180, 185)
)
describe(data)
## vars n mean sd median trimmed mad min max range skew kurtosis se
## Age 1 5 35 7.91 35 35 7.41 25 45 20 0.00 -1.91 3.54
## Height 2 5 174 9.62 175 174 7.41 160 185 25 -0.28 -1.72 4.30
El análisis inferencial se utiliza para hacer inferencias sobre una población a partir de una muestra. Se aplican pruebas estadísticas, como la prueba t de Student o análisis de varianza (ANOVA). A continuación, se muestra un ejemplo utilizando el paquete stats para realizar una prueba t de Student:
# Generación de datos de ejemplo
set.seed(123)
data <- rnorm(100, mean = 0, sd = 1)
# Prueba t de Student
t.test(data, mu = 0)
##
## One Sample t-test
##
## data: data
## t = 0.99041, df = 99, p-value = 0.3244
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
## -0.09071657 0.27152838
## sample estimates:
## mean of x
## 0.09040591
El análisis predictivo se centra en construir modelos que puedan predecir resultados futuros. El paquete caret es útil para ajustar modelos de machine learning y evaluar su rendimiento:
library(caret)
## Warning: package 'caret' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
##
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
##
## %+%, alpha
## The following object is masked from 'package:NLP':
##
## annotate
## Loading required package: lattice
data(iris)
# Dividir los datos en entrenamiento y prueba
set.seed(123)
inTrain <- createDataPartition(iris$Species, p = 0.7, list = FALSE)
training_data <- iris[inTrain,]
testing_data <- iris[-inTrain,]
Las metodologías híbridas combinan elementos de varias metodologías teóricas. Pueden ser útiles cuando se trabaja con datos de múltiples fuentes y estructuras. La metodología CRISP-DM (Cross-Industry Standard Process for Data Mining) es un ejemplo de enfoque híbrido que abarca desde la comprensión del negocio hasta la implementación del modelo.
El tipo de datos que estamos analizando puede variar, y es importante adaptar la metodología en consecuencia. Los datos se pueden clasificar en tres categorías principales:
Los datos estructurados se presentan en tablas con filas y columnas. Ejemplos comunes incluyen hojas de cálculo, bases de datos relacionales y archivos CSV, tienen un formato o tratamiento de modo que se puede analizar.
Los datos semiestructurados no siguen un formato rígido de tabla. Ejemplos incluyen archivos XML, JSON y datos HTML. R proporciona paquetes como jsonlite para analizar datos JSON, el dato cuenta con patrones de estructura pero no es regular.
library(jsonlite)
json_data <- '{"nombre": "Juan", "edad": 30, "ciudad": "Madrid"}'
fromJSON(json_data)
## $nombre
## [1] "Juan"
##
## $edad
## [1] 30
##
## $ciudad
## [1] "Madrid"
Los datos no estructurados no tienen una estructura definida y pueden incluir texto, imágenes, audio, video, etc. El procesamiento de datos no estructurados generalmente requiere técnicas específicas, como el procesamiento de lenguaje natural (NLP) o visión por computadora, tienen un formato o tratamiento de modo que se puede analizar.
R cuenta con numerosos paquetes que facilitan el análisis de datos. Algunos paquetes adicionales y ejemplos son:
lubridate es útil para trabajar con fechas y horas.
Puede ser esencial cuando se analizan datos temporales.
library(lubridate)
## Loading required package: timechange
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:base':
##
## date, intersect, setdiff, union
date_data <- c("2023-01-15", "2023-02-20", "2023-03-25")
date_data <- ymd(date_data)
caret es una librería versátil para la construcción y
evaluación de modelos de machine learning. Ejemplo:
library(caret)
data(iris)
# Dividir los datos en entrenamiento y prueba
set.seed(123)
inTrain <- createDataPartition(iris$Species, p = 0.7, list = FALSE)
training_data <- iris[inTrain,]
testing_data <- iris[-inTrain,]
dplyr es una potente librería para el manejo y
transformación de datos. Permite realizar operaciones como filtrado,
selección, agregación y unión de datos de forma eficiente. Aquí hay un
ejemplo:
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.2.3
##
## 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
data <- data.frame(
Nombre = c("Ana", "Juan", "Carlos"),
Edad = c(25, 30, 35)
)
filtered_data <- data %>% filter(Edad > 30)
ggplot2 es una librería para crear visualizaciones
atractivas y personalizables. Permite la creación de gráficos de alta
calidad. Ejemplo:
library(ggplot2)
data <- data.frame(
Mes = c("Enero", "Febrero", "Marzo"),
Ventas = c(100, 120, 90)
)
ggplot(data, aes(x = Mes, y = Ventas)) + geom_bar(stat = "identity")
tidyr se utiliza para la manipulación de datos en
formato “tidy” o “long”. Ayuda a reorganizar datos de manera que sean
más fáciles de analizar. Ejemplo:
library(tidyr)
data <- data.frame(
Nombre = c("Ana", "Juan"),
Semana_1 = c(100, 120),
Semana_2 = c(90, 110)
)
gather(data, key = "Semana", value = "Ventas", -Nombre)
## Nombre Semana Ventas
## 1 Ana Semana_1 100
## 2 Juan Semana_1 120
## 3 Ana Semana_2 90
## 4 Juan Semana_2 110
Un gráfico realizado con ggplot2 presenta, al menos, tres elementos:
Datos (Data) que queremos representar (que serán un data frame). Características estéticas (aesthetic mappings) que describen cómo queremos que los datos se vean en el gráfico. Para más información podemos consultar la vignette (vignette(“ggplot2-specs”)). Como luego veremos, se introducen con la función aes() y se refieren a: posición (en los ejes) color exterior (color) color de relleno (fill) forma de puntos (shape) tipo de línea (linetype) tamaño (size) Objetos geométricos (Geom) representan lo que vemos en un gráficos (puntos, líneas, etc.). Todo gráfico tiene, como mínimo, una geometría. La geometría determina el tipo de gráfico: geom_point (para puntos) geom_lines (para lineas) geom_histogram (para histograma) geom_boxplot (para boxplot) geom_bar (para barras) geom_smooth (líneas suavizadas) geom_polygons (para polígonos en un mapa) etc. (si ejecutáis el comando help.search(“geom_”, package = “ggplot2”) podéis ver el listado de objetos geométricos) Por tanto, para construir un gráfico con ggplot2 comenzamos con la siguiente estructura de código, usando + como nexo entre argumentos:
ggplot(datos, aes() ) + geom_tipo()
A partir de esta estructura básica puede mejorarse la presentación de los gráficos introduciendo, por ejemplo, características estéticas en los objetos geométricos, rotulando los gráficos, etc.
Otros elementos que conviene tener presente en un gráfico de ggplot2 son:
Stat (Stat), transformaciones estadísticas para, generalmente, resumir datos (por ejemplo: contar frecuencias, número de intervalos en los histogramas, etc.). Escalas (Scale). Las escalas, por ejemplo, convierten datos en características estéticas (colores, etc.), crean leyendas… . Coordenadas (coord): sistema de coordenadas cartesianas, polares, proyecciones, etc. Faceting (Faceting), permite representar gráficos separados para subconjuntos de los datos originales. Vamos a realizar algunos gráficos con ggplot2. Para ello, cargamos la librería. Si no está instalado el paquete lo instalamos.
if(!require(ggplot2)) { install.packages(“ggplot2”) library(ggplot2)}
#Barras
library(ggplot2)
data <- data.frame(categoria = c(“A”, “B”, “C”, “D”), valor = c(20, 30, 15, 40))
ggplot(data, aes(x = categoria, y = valor)) + geom_bar(stat = “identity”)
#Lineas
library(ggplot2)
data <- data.frame(tiempo = 1:10, valor = c(3, 5, 8, 12, 18, 25, 33, 42, 52, 63))
ggplot(data, aes(x = tiempo, y = valor)) + geom_line()
library(ggplot2) data(mpg) # Cargamos un conjunto de datos de ejemplo
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point()
library(ggplot2) data(mpg) # Cargamos un conjunto de datos de ejemplo
ggplot(data = mpg, aes(x = class, y = hwy)) + geom_boxplot()
library(ggplot2) data(economics) # Cargamos un conjunto de datos de ejemplo
ggplot(data = economics, aes(x = date, y = unemploy, fill = uempmed)) + geom_area()
#Histograma library(ggplot2) data(mpg) # Cargamos un conjunto de datos de ejemplo
ggplot(data = mpg, aes(x = hwy)) + geom_histogram(binwidth = 2, fill = “blue”, color = “black”) + labs(title = “Histograma de millas por galón (hwy)”)
library(ggplot2) data(mpg) # Cargamos un conjunto de datos de ejemplo
ggplot(data = mpg, aes(x = displ, y = hwy)) + geom_point() + geom_smooth(method = “lm”, se = FALSE, color = “red”) + labs(title = “Gráfico de dispersión con regresión lineal”)
library(ggplot2) data(mpg) # Cargamos un conjunto de datos de ejemplo
ggplot(data = mpg, aes(x = class, fill = drv)) + geom_bar() + labs(title = “Gráfico de barras apiladas por clase de vehículo y tipo de tracción”)
library(ggplot2) data(mpg) # Cargamos un conjunto de datos de ejemplo
ggplot(data = mpg, aes(x = 1, fill = drv)) + geom_bar() + coord_polar(theta = “y”) + labs(title = “Gráfico de pastel de tipo de tracción”)
El paquete R corrplot proporciona una herramienta de exploración visual en la matriz de correlación que admite el reordenamiento automático de variables para ayudar a detectar patrones ocultos entre las variables.
corrplot es muy fácil de usar y proporciona una amplia gama de opciones de trazado en método de visualización, diseño gráfico, color, leyenda, etiquetas de texto, etc. También proporciona valores p e intervalos de confianza para ayudar a los usuarios a determinar la importancia estadística de las correlaciones.
corrplot()Tiene alrededor de 50 parámetros, sin embargo, los más comunes son sólo unos pocos. Podemos obtener un gráfico de matriz de correlación con solo una línea de código en la mayoría de las escenas.
Los parámetros que más se utilizan incluyen method,,,,, etc.typeorderdiag
Hay siete métodos de visualización (parámetro ) en el methodpaquete corrplot , ‘circle’denominados ,,,,,,,, . La intensidad del color del glifo es proporcional a los coeficientes de correlación según la configuración de color predeterminada.’square’‘ellipse’‘number’‘shade’‘color’‘pie’
‘circle’y ’square’, las áreas de círculos o cuadrados muestran el valor absoluto de los coeficientes de correlación correspondientes.
‘ellipse’, las elipses tienen su excentricidad escalada paramétricamente al valor de correlación. Proviene del trabajo de DJ Murdoch y ED Chow, ver en la sección Referencias.
‘number’, números de coeficientes con diferente color.
‘color’, cuadrado de igual tamaño con diferente color.
‘shade’, similar a ‘color’, pero los glifos de coeficientes negativos están sombreados. Método ’pie’y ’shade’proviene del trabajo de Michael Friendly.
‘pie’, los círculos se rellenan en el sentido de las agujas del reloj para los valores positivos y en el sentido contrario a las agujas del reloj para los valores negativos.
corrplot.mixed()es una función ajustada para estilos de visualización mixtos, que puede configurar los métodos visuales del triangular inferior y superior por separado.
Hay tres tipos de diseño (parámetro type) ‘full’: ‘upper’y ’lower’.
La matriz de correlación se puede reordenar según los coeficientes de la matriz de correlación. Esto es importante para identificar la estructura y el patrón ocultos en la matriz.
library(corrplot)
## Warning: package 'corrplot' was built under R version 4.2.3
## corrplot 0.92 loaded
M = cor(mtcars)
corrplot(M, method = 'number') # numero colorido
corrplot(M, method = 'color', order = 'alphabet')
corrplot(M) # por defecto, método = 'círculo'
corrplot(M, order = 'AOE') # después del reorden 'AOE'
corrplot(M, method = 'shade', order = 'AOE', diag = FALSE)
corrplot(M, method = 'square', order = 'FPC', type = 'lower', diag = FALSE)
corrplot(M, method = 'ellipse', order = 'AOE', type = 'upper')
corrplot.mixed(M, order = 'AOE')
corrplot.mixed(M, lower = 'shade', upper = 'pie', order = 'hclust')
Los detalles de cuatro ordera los goritmos, denominados ‘AOE’, ‘FPC’, ‘hclust’, ‘alphabet’ son los siguientes.
‘AOE’ es para el orden angular de los vectores propios. Se calcula a partir del orden de los ángulos. \(a_i\),
$\[ a_i = \begin{cases} \arctan\left(\frac{e^{i2}}{e^{i1}}\right) & \text{si } e^{i1} > 0, \\ \arctan\left(\frac{e^{i2}}{e^{i1}}\right) + \pi & \text{en otro caso}. \end{cases} \] $
dónde \(e_1\) y \(e_2\) son los dos valores propios más grandes de la matriz de correlación.
‘FPC’ para el primer pedido de componente principal.
‘hclust’ para el orden de agrupación jerárquico y ‘hclust.method’ para el método de aglomeración que se utilizará. ‘hclust.method’ debe ser uno de ‘ward’, ‘ward.D’, ‘ward.D2’, ‘single’, ‘complete’, ‘average’, o .’mcquitty’‘median’‘centroid’
‘alphabet’ por orden alfabético.
También puede reordenar la matriz ‘manualmente’ mediante la función corrMatOrder().
Si usa ‘hclust’, corrplot() puede dibujar rectángulos alrededor del gráfico de la matriz de correlación según los resultados de la agrupación jerárquica.
corrplot(M, order = 'hclust', addrect = 2)
corrplot(M, method = 'square', diag = FALSE, order = 'hclust',
addrect = 3, rect.col = 'blue', rect.lwd = 3, tl.pos = 'd')
La seriación del paquete R proporciona la infraestructura para ordenar
objetos con una implementación de varias técnicas de
seriación/secuenciación/ordenación para reordenar matrices, matrices de
disimilitud y dendrogramas. Para más información, ver en el apartado
Referencias.
Podemos reordenar la matriz mediante el paquete de seriación y luego corregirla. Aquí hay unos ejemplos.
library(seriation)
## Warning: package 'seriation' was built under R version 4.2.3
##
## Attaching package: 'seriation'
## The following object is masked from 'package:lattice':
##
## panel.lines
list_seriation_methods('matrix')
## [1] "BEA" "BEA_TSP" "CA" "Heatmap" "Identity" "LLE"
## [7] "Mean" "PCA" "PCA_angle" "Random" "Reverse"
list_seriation_methods('dist')
## [1] "ARSA" "BBURCG" "BBWRCG" "Enumerate"
## [5] "GSA" "GW" "GW_average" "GW_complete"
## [9] "GW_single" "GW_ward" "HC" "HC_average"
## [13] "HC_complete" "HC_single" "HC_ward" "Identity"
## [17] "isomap" "isoMDS" "MDS" "MDS_angle"
## [21] "metaMDS" "monoMDS" "OLO" "OLO_average"
## [25] "OLO_complete" "OLO_single" "OLO_ward" "QAP_2SUM"
## [29] "QAP_BAR" "QAP_Inertia" "QAP_LS" "R2E"
## [33] "Random" "Reverse" "Sammon_mapping" "SGD"
## [37] "Spectral" "Spectral_norm" "SPIN_NH" "SPIN_STS"
## [41] "TSP" "VAT"
data(Zoo)
Z = cor(Zoo[, -c(15, 17)])
dist2order = function(corr, method, ...) {
d_corr = as.dist(1 - corr)
s = seriate(d_corr, method = method, ...)
i = get_order(s)
return(i)
}
Los métodos ‘PCA_angle’ y ‘HC’ en seriación son los mismos que ‘AOE’ y ‘hclust’ por separado en corrplot() y corrMatOrder().
Aquí hay algunas tramas después de la seriación.
# Ordenamiento rápido y óptimo de las hojas para agrupaciones jerárquicas
i = dist2order(Z, 'OLO')
corrplot(Z[i, i], cl.pos = 'n')
# Problema de asignación cuadrática
i = dist2order(Z, 'QAP_2SUM')
corrplot(Z[i, i], cl.pos = 'n')
# Escalamiento multidimensional
i = dist2order(Z, 'MDS_nonmetric')
## Warning in get_seriation_method("dist", method): seriation method
## 'MDS_nonmetric' is now deprecated and will be removed in future releases. Using
## `isoMDS`
corrplot(Z[i, i], cl.pos = 'n')
# Recocido simulado
i = dist2order(Z, 'ARSA')
corrplot(Z[i, i], cl.pos = 'n')
# solucionador de TSP
i = dist2order(Z, 'TSP')
corrplot(Z[i, i], cl.pos = 'n')
# seriación espectral
i = dist2order(Z, 'Spectral')
corrplot(Z[i, i], cl.pos = 'n')
## Cambiar espectros de color, leyenda de color y leyenda de texto
Podemos obtener colores secuenciales y divergentes de COL1() y COL2(). Las paletas de colores se toman prestadas del R Color Brewer paquete.
Aviso : el color medio que sale COL2() se fija en ‘#FFFFFF’ (blanco), por lo que podemos visualizar el elemento 0 con color blanco.
COL1(): Obtenga colores secuenciales, adecuados para visualizar una matriz no negativa o no positiva (por ejemplo, matriz en [0, 20], o [-100, -10], o [100, 500]).
COL2(): Obtenga colores divergentes, adecuados para visualizar una matriz cuyos elementos son en parte positivos y en parte negativos (por ejemplo, matriz de correlación en [-1, 1] o [-20, 100]).
Los colores de los gráficos de correlación se pueden personalizar colen corrplot(). Están distribuidos uniformemente en col.limel intervalo.
col: vector, los colores de los glifos. Están distribuidos uniformemente en col.limel intervalo.
Por defecto,Si is.corres TRUE, colserá COL2(‘RdBu’, 200). Si is.corres así FALSE, y corres una matriz no negativa ni positiva, col será COL1(‘YlOrBr’, 200);
de lo contrario (los elementos son en parte positivos y en parte negativos), colserá COL2(‘RdBu’, 200). col.lim: el intervalo de límites (x1, x2) para asignar color por col. Por defecto, col.limserá c(-1, 1)cuando is.corrsea TRUE, col.limserá c(min(corr), max(corr))cuando is.corrsea FALSE.
AVISO : si establece col.limcuándo is.corres TRUE, la asignación de colores aún se distribuye uniformemente en [-1, 1], solo afecta la visualización en la leyenda de color.
is.corr: lógico, ya sea que la matriz de entrada sea una matriz de correlación o no. El valor predeterminado es TRUE.
Podemos visualizar una matriz de no correlación configurando is.corr = FALSE. Aquí se muestran a continuación todos los colores divergentes COL2()y secuenciales .COL1()
Colores divergentes :
Colores secuenciales :
Uso de COL1()y COL2():
COL1(sequential = c("Oranges", "Purples", "Reds", "Blues", "Greens",
"Greys", "OrRd", "YlOrRd", "YlOrBr", "YlGn"), n = 200)
## [1] "#FFF5EB" "#FEF4E9" "#FEF3E8" "#FEF3E7" "#FEF2E6" "#FEF1E5" "#FEF1E4"
## [8] "#FEF0E2" "#FEF0E1" "#FEEFE0" "#FEEEDF" "#FEEEDE" "#FEEDDD" "#FEEDDB"
## [15] "#FEECDA" "#FEEBD9" "#FEEBD8" "#FEEAD7" "#FEEAD6" "#FEE9D4" "#FEE8D3"
## [22] "#FEE8D2" "#FEE7D1" "#FEE7D0" "#FEE6CF" "#FDE5CD" "#FDE5CC" "#FDE4CA"
## [29] "#FDE3C8" "#FDE2C6" "#FDE1C4" "#FDE0C3" "#FDDFC1" "#FDDEBF" "#FDDDBD"
## [36] "#FDDDBC" "#FDDCBA" "#FDDBB8" "#FDDAB6" "#FDD9B5" "#FDD8B3" "#FDD7B1"
## [43] "#FDD6AF" "#FDD5AD" "#FDD5AC" "#FDD4AA" "#FDD3A8" "#FDD2A6" "#FDD1A5"
## [50] "#FDD0A3" "#FDCFA1" "#FDCE9F" "#FDCC9D" "#FDCB9A" "#FDCA98" "#FDC896"
## [57] "#FDC794" "#FDC691" "#FDC48F" "#FDC38D" "#FDC18B" "#FDC089" "#FDBF86"
## [64] "#FDBD84" "#FDBC82" "#FDBB80" "#FDB97E" "#FDB87B" "#FDB779" "#FDB577"
## [71] "#FDB475" "#FDB273" "#FDB170" "#FDB06E" "#FDAE6C" "#FDAD6A" "#FDAC68"
## [78] "#FDAA66" "#FDA964" "#FDA862" "#FDA660" "#FDA55E" "#FDA45D" "#FDA25B"
## [85] "#FDA159" "#FDA057" "#FD9E55" "#FD9D53" "#FD9C51" "#FD9A4F" "#FD994D"
## [92] "#FD984C" "#FD964A" "#FD9548" "#FD9446" "#FD9244" "#FD9142" "#FD9040"
## [99] "#FD8E3E" "#FD8D3C" "#FC8C3B" "#FC8A39" "#FB8937" "#FB8736" "#FA8634"
## [106] "#FA8532" "#F98331" "#F9822F" "#F8802D" "#F87F2C" "#F77D2A" "#F77C29"
## [113] "#F67A27" "#F67925" "#F67824" "#F57622" "#F57520" "#F4731F" "#F4721D"
## [120] "#F3701B" "#F36F1A" "#F26D18" "#F26C16" "#F16A15" "#F16913" "#F06812"
## [127] "#EF6611" "#EE6511" "#ED6410" "#EC620F" "#EB610E" "#EA600E" "#E95E0D"
## [134] "#E85D0C" "#E75C0C" "#E65A0B" "#E5590A" "#E45809" "#E35609" "#E25508"
## [141] "#E15407" "#E05206" "#DF5106" "#DF5005" "#DE4E04" "#DD4D04" "#DC4C03"
## [148] "#DB4A02" "#DA4901" "#D94801" "#D74701" "#D54601" "#D34601" "#D14501"
## [155] "#CF4401" "#CD4301" "#CB4301" "#C94201" "#C74101" "#C54001" "#C24001"
## [162] "#C03F01" "#BE3E02" "#BC3E02" "#BA3D02" "#B83C02" "#B63B02" "#B43B02"
## [169] "#B23A02" "#B03902" "#AE3802" "#AC3802" "#AA3702" "#A83602" "#A63602"
## [176] "#A43503" "#A33403" "#A13403" "#9F3303" "#9E3303" "#9C3203" "#9B3103"
## [183] "#993103" "#983003" "#963003" "#942F03" "#932E03" "#912E03" "#902D03"
## [190] "#8E2D03" "#8D2C03" "#8B2B03" "#892B03" "#882A03" "#862A03" "#852903"
## [197] "#832803" "#822803" "#802703" "#7F2704"
COL2(diverging = c("RdBu", "BrBG", "PiYG", "PRGn", "PuOr", "RdYlBu"), n = 200)
## [1] "#67001F" "#6A011F" "#6E0220" "#720320" "#760421" "#790622" "#7D0722"
## [8] "#810823" "#850923" "#880A24" "#8C0C25" "#900D25" "#940E26" "#970F26"
## [15] "#9B1027" "#9F1228" "#A31328" "#A71429" "#AA1529" "#AE162A" "#B2182B"
## [22] "#B31B2C" "#B51F2E" "#B72330" "#B92632" "#BB2A33" "#BD2E35" "#BE3137"
## [29] "#C03538" "#C2383A" "#C43C3C" "#C6403D" "#C7433F" "#C94741" "#CB4B43"
## [36] "#CD4E44" "#CF5246" "#D05548" "#D25949" "#D45D4B" "#D6604D" "#D76450"
## [43] "#D96752" "#DA6B55" "#DC6E58" "#DD725A" "#DF755D" "#E07860" "#E27C62"
## [50] "#E37F65" "#E58368" "#E6866A" "#E88A6D" "#E98D70" "#EB9172" "#EC9475"
## [57] "#EE9878" "#EF9B7A" "#F19F7D" "#F2A280" "#F4A583" "#F4A886" "#F5AB89"
## [64] "#F5AD8D" "#F5B090" "#F6B394" "#F6B697" "#F7B89B" "#F7BB9E" "#F8BEA2"
## [71] "#F8C0A5" "#F9C3A9" "#F9C6AC" "#FAC9B0" "#FACBB3" "#FACEB7" "#FBD1BA"
## [78] "#FBD3BD" "#FCD6C1" "#FCD9C4" "#FDDBC8" "#FDDDCA" "#FDDFCD" "#FDE1D0"
## [85] "#FDE2D3" "#FDE4D6" "#FDE6D9" "#FDE8DB" "#FDEADE" "#FDECE1" "#FEEDE4"
## [92] "#FEEFE7" "#FEF1E9" "#FEF3EC" "#FEF5EF" "#FEF6F2" "#FEF8F5" "#FEFAF7"
## [99] "#FEFCFA" "#FEFEFD" "#FDFEFE" "#FBFDFD" "#F9FBFD" "#F6FAFC" "#F4F9FB"
## [106] "#F2F7FA" "#EFF6FA" "#EDF5F9" "#EBF3F8" "#E9F2F7" "#E6F1F7" "#E4EFF6"
## [113] "#E2EEF5" "#DFEDF4" "#DDECF4" "#DBEAF3" "#D8E9F2" "#D6E8F1" "#D4E6F1"
## [120] "#D1E5F0" "#CFE4EF" "#CBE2EE" "#C8E0ED" "#C5DFEC" "#C2DDEB" "#BFDBEA"
## [127] "#BCDAEA" "#B8D8E9" "#B5D7E8" "#B2D5E7" "#AFD3E6" "#ACD2E5" "#A9D0E4"
## [134] "#A5CFE3" "#A2CDE2" "#9FCBE1" "#9CCAE0" "#99C8E0" "#96C7DF" "#92C5DE"
## [141] "#8FC3DD" "#8BC0DB" "#87BEDA" "#83BBD8" "#7FB9D7" "#7BB6D6" "#77B4D4"
## [148] "#73B1D3" "#6FAFD2" "#6BACD0" "#67AACF" "#63A7CE" "#5FA5CC" "#5BA2CB"
## [155] "#57A0CA" "#539DC8" "#4F9BC7" "#4B98C5" "#4796C4" "#4393C3" "#4191C2"
## [162] "#3F8EC0" "#3E8CBF" "#3C8ABE" "#3A88BD" "#3985BC" "#3783BB" "#3581B9"
## [169] "#337FB8" "#327CB7" "#307AB6" "#2E78B5" "#2D76B4" "#2B73B3" "#2971B1"
## [176] "#286FB0" "#266DAF" "#246AAE" "#2268AD" "#2166AC" "#1F63A8" "#1E60A4"
## [183] "#1C5EA1" "#1B5B9D" "#1A5899" "#185595" "#175391" "#15508E" "#144D8A"
## [190] "#134B86" "#114882" "#10457F" "#0E427B" "#0D4077" "#0C3D73" "#0A3A70"
## [197] "#09386C" "#073568" "#063264" "#053061"
Además, la función colorRampPalette()es muy conveniente para generar espectro de colores.
El grupo de parámetros cl.*es para leyenda de color. Los de uso común son:
cl.poses para la posición de las etiquetas de color. Es de carácter o lógico. Si es carácter, debe ser uno de ‘r’(significa derecho, predeterminado si type=‘upper’o ’full’), ‘b’(significa abajo, predeterminado si type=‘lower’) o ‘n’(significa no dibujar etiqueta de color). cl.ratioes para justificar el ancho de la leyenda del color, se sugiere 0,1~0,2. El grupo de parámetros cl.* es para leyenda de texto. Los de uso común son:
tl.poses para la posición de las etiquetas de texto. Es de carácter o lógico. Si es carácter, debe ser uno de ‘lt’, ‘ld’, ‘td’, o . (predeterminado si ) significa izquierda y arriba, (predeterminado si ) significa izquierda y diagonal, (predeterminado si ) significa arriba y diagonal (cerca), significa diagonal, significa izquierda, significa no agregar etiqueta de texto.’d’‘l’‘n’‘lt’type=’full’‘ld’type=’lower’‘td’type=’upper’‘d’‘l’‘n’ tl.cexes para el tamaño de la etiqueta de texto (nombres de variables). tl.srtes para la rotación de la cadena de etiquetas de texto en grados.
corrplot(M, order = 'AOE', col = COL2('RdBu', 10))
corrplot(M, order = 'AOE', addCoef.col = 'black', tl.pos = 'd',
cl.pos = 'n', col = COL2('PiYG'))
corrplot(M, method = 'square', order = 'AOE', addCoef.col = 'black', tl.pos = 'd',
cl.pos = 'n', col = COL2('BrBG'))
## leyenda de color inferior, leyenda de texto diagonal, rotar etiqueta de texto
corrplot(M, order = 'AOE', cl.pos = 'b', tl.pos = 'd',
col = COL2('PRGn'), diag = FALSE)
## etiquetas de texto giradas 45 grados y leyenda de color más amplia con números ## alineados a la derecha
corrplot(M, type = 'lower', order = 'hclust', tl.col = 'black',
cl.ratio = 0.2, tl.srt = 45, col = COL2('PuOr', 10))
## eliminar leyenda de color, leyenda de texto y glifo diagonal principal
corrplot(M, order = 'AOE', cl.pos = 'n', tl.pos = 'n',
col = c('white', 'black'), bg = 'gold2')
El paquete Shiny en R permite la creación de aplicaciones web interactivas. Estas aplicaciones web permiten a los usuarios interactuar con análisis de datos y visualizaciones en tiempo real. Shiny es especialmente útil para la presentación de resultados de manera interactiva y la toma de decisiones basadas en datos.
Shiny consta de dos componentes principales:
La interfaz de usuario define cómo se ve la aplicación y qué
elementos de control se muestran a los usuarios. Aquí hay un ejemplo de
definición de la interfaz de usuario en un archivo
ui.R:
library(shiny)
## Warning: package 'shiny' was built under R version 4.2.3
##
## Attaching package: 'shiny'
## The following object is masked from 'package:jsonlite':
##
## validate
ui <- fluidPage(
titlePanel("Ejemplo de Aplicación Shiny"),
sidebarLayout(
sidebarPanel(
sliderInput("slider", "Selecciona un valor:", min = 1, max = 100, value = 50)
),
mainPanel(
plotOutput("plot")
)
)
)
Para poder que las salidas de la App sean dinámicas; es decir cambian
con los cambios que realiza el usuario, Shiny hace uso de la función
render, esta función puede cambiar dependiendo el tipo de
salida que se tenga, para las salidas mencionadas en el punto
anterior.
renderText Para el código.renderPlot Para gráficos estáticos.renderPlotly Para gráficos de Plotly.Existen otras opciones de esta función, cuya documentación en R o
Rstudio se puede ver con el comando ?shiny::render y la
tecla tabular.
Dentro de la función render las funciones funcionan de la misma forma que lo hacen en un script de R.
En ocasiones es necesario hacer que también las entradas e incluso los datos cambien de acuerdo a lo que selecciona el usuario, reactive, es una forma de llamar a las funciones que se ejecutan cuando el usuario selecciona una opción.
Por ejemplo en el siguiente que de código cuando el usuario selecciona un año y una región, la base de datos cambia se reduce a los que cumplen las condiciones, en caso contrario se muestra la base de datos completa.
selectData <- reactive({
l <- data$year == input$year & data$region != "total"
if(input$region != 'total'){
l <- l & data$region %in% input$region
}
l
})
En ocasiones también se requiere que toda la interfaz cambie según
las opciones que elija el usuario para esto se utiliza la función
conditionalPanel lo que permite que cuando se cumple una
condición.
Esta función tiene como argumentos, ID y condición
conditionalPanel("nombre",
condition = "input.plot_type == 'opción'",
#A partir de este punto va el contenido del panel
)
Shiny usa la función img() para colocar archivos de
imagen en su aplicación.
Para insertar una imagen, debes colocar tres argumentos
img(src = "mi_imagen.png", height = 72, width = 72)
Los Widget() son elementos web con los que el usuario
puede interactuar, proporcionando una forma de intercambiar valores u
opciones.
actionButton(): Crea un botón de acción que los
usuarios pueden hacer clic para realizar una acción específica, como
cargar datos o realizar un cálculo.
checkInput(): Crea una casilla de verificación que
permite a los usuarios seleccionar o deseleccionar una opción.
checkboxGroupInput(): Permite a los usuarios
seleccionar múltiples opciones de un conjunto de casillas de
verificación.
dateInput(): Proporciona un calendario para
seleccionar una fecha.
fileInput(): Permite a los usuarios cargar archivos
en la aplicación, lo que es útil para cargar datos desde sus
dispositivos.
helpText(): Muestra texto de ayuda o explicativo
para proporcionar información adicional a los usuarios.
numericInput(): Crea un campo de entrada donde los
usuarios pueden ingresar números.
radioButtons(): Ofrece un conjunto de botones de
selección única respuesta para que los usuarios elijan una opción entre
varias.
selectInput(): Permite a los usuarios seleccionar
una opción de un menú desplegable.
sliderInput(): Crea un deslizador que permite a los
usuarios seleccionar un valor dentro de un rango determinado.
submitButton(): Crea un botón de envío que los
usuarios pueden hacer clic para enviar un formulario o activar una
acción.
textInput(): Permite a los usuarios ingresar texto
en un campo de entrada.
Para agregar un widget() a la aplicación, se puede
agregar en sidebarPanel() o en mainPanel()
dentro del objeto ui.
Los primeros dos argumentos para cada widget son:
Nombre para el widget: el usuario no verá este nombre, pero es necesario en el código, para poder acedera él. Etiqueta: será el nombre que el usuario podrá ver en la aplicación Los argumentos restantes varían de un widget a otro. Éstos pueden ser valores iniciales, rangos o incrementos.
Es posible Integrar Shiny con Rmarkdown, pudiendo generar cosas como
simulaciones dentro de un Rmarkdown para esto se utiliza la librería
install_phantomjs del paquete webshot*.
options(repos = c(CRAN = "https://cran.r-project.org"))
install.packages("webshot")
## Installing package into 'C:/Users/wilde/AppData/Local/R/win-library/4.2'
## (as 'lib' is unspecified)
## package 'webshot' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\wilde\AppData\Local\Temp\RtmpEJZnIi\downloaded_packages
webshot::install_phantomjs()
## It seems that the version of `phantomjs` installed is greater than or equal to the requested version.To install the requested version or downgrade to another version, use `force = TRUE`.
Teniendo instaladas las librerías anteriores, pueden integrarse de varias formas, la primera es, alojando la app en un servidor y se vincula con el Rmd utilizando la URL donde está alojada la app.
knitr::include_app("/URL_de_la_app")
Es importante saber que por defecto la altura y el ancho de la entrada de la app es de 400px, por lo que es posible que se vea recortada y con barras de desplazamiento, para evitar esto se puede editar el tamaño de este para poder que se vea bien la app.
En ocasiones no se quiere insertar la app directamente, sino que se
quiere poner un pantallazo de la misma, knitr tiene una
función que permite hacer esto de forma automática.
Esto guarda una screenshot de la app en formato png en la carpeta de origen, con el nombre shinyshot y se puede ahora mostrar.
La importación de datos en RStudio es un paso crucial en el análisis de datos, ya que te permite cargar conjuntos de datos desde diferentes fuentes para su posterior exploración y manipulación. Hay varias librerías en R que facilitan este proceso, y cada una tiene sus propias funciones y características únicas. Dentro de todo esto, existen diferentes librerías que contienen funciones que nos ayudarán en la importanción de datos
Base R: La librería base de R proporciona funciones esenciales para la importación de datos, como read.table() y read.csv(). Estas funciones son convenientes para archivos de texto y CSV simples, comunes en análisis de datos básicos. Aunque la base R puede carecer de algunas características avanzadas, es una opción confiable y eficiente para la carga de datos estándar. Es especialmente útil para usuarios que prefieren no depender de librerías externas y que trabajan con conjuntos de datos simples y bien estructurados.
readr: Dentro del tidyverse, la librería readr destaca por su eficiencia al importar datos tabulares en formatos de texto delimitado. Con funciones como read_csv(), readr es especialmente útil cuando la velocidad de lectura y la manipulación sencilla de datos son prioritarias. Además, readr proporciona mensajes de error claros y detallados, facilitando la identificación y resolución de problemas durante la importación de datos. Su integración con el tidyverse hace que sea una elección popular entre los analistas de datos que buscan un flujo de trabajo coherente y eficiente desde la importación hasta el análisis y la visualización de datos.
haven: La librería haven destaca por su capacidad para importar datos desde formatos de software estadístico como SAS, SPSS y Stata. Al ofrecer funciones como read_sas() y read_spss(), haven facilita la integración de datos provenientes de diferentes entornos estadísticos, lo que es esencial en proyectos que requieren la combinación de resultados de distintas herramientas. Esta librería también maneja eficientemente los metadatos asociados con los conjuntos de datos, lo que mejora la precisión y comprensión de la información importada.
foreign: En el ámbito de la importación de datos desde programas estadísticos diversos, la librería foreign juega un papel crucial. Con funciones como read.arff() y read.xport(), foreign permite a los usuarios de R trabajar con datos provenientes de una variedad de fuentes. Esto es especialmente valioso en investigaciones colaborativas o proyectos que involucran el intercambio de datos entre diferentes plataformas estadísticas. La capacidad de foreign para manejar formatos específicos de programas estadísticos hace que sea una opción valiosa para aquellos que necesitan interoperabilidad entre R y otras herramientas estadísticas.
xlsx: Para aquellos que necesitan trabajar con datos almacenados en hojas de cálculo de Excel, la librería xlsx ofrece soluciones eficientes. Su función principal, read.xlsx(), facilita la importación de datos desde archivos de Excel, permitiendo a los usuarios aprovechar la familiaridad y popularidad de esta plataforma. xlsx también proporciona opciones adicionales para manipular y gestionar datos en formato tabular, haciendo que sea una elección práctica para proyectos que involucren la colaboración con usuarios de Excel.
rio: La librería rio se destaca por su versatilidad al importar datos desde diversos formatos, incluyendo CSV, Excel, SPSS y Stata. La función clave, import(), simplifica el proceso de importación, eliminando la necesidad de recordar funciones específicas para cada formato. Esto la convierte en una opción conveniente para proyectos que involucran una variedad de tipos de archivos. Además, rio proporciona mensajes informativos durante la importación, facilitando la comprensión de los datos y la identificación de posibles problemas. Su capacidad para manejar múltiples formatos hace que sea una opción atractiva para usuarios que trabajan con conjuntos de datos provenientes de diferentes fuentes.
# Cargar
library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
credito_xls <- read_excel("C:/Users/wilde/Downloads/Programación en lenguaje estadístico/Sesión 11/Valoracion_credito.xlsx")
# Observar los primeros registros del dataframe credito_xls
head(credito_xls)
## # A tibble: 6 × 6
## Valoracion_credito Edad Ingresos Tarjetas_credito Educacion Creditos_coche
## <chr> <dbl> <chr> <chr> <chr> <chr>
## 1 Malo 36.2 Medio 5 o más Bachillerato 2 o más
## 2 Malo 22.0 Medio 5 o más Bachillerato 2 o más
## 3 Malo 29.2 Bajo 5 o más Universitar… 2 o más
## 4 Malo 32.8 Bajo 5 o más Bachillerato 1 o ninguno
## 5 Malo 36.8 Medio 5 o más Bachillerato 2 o más
## 6 Malo 39.3 Medio 5 o más Bachillerato 2 o más
# Cargar la librería readr
library(readr)
## Warning: package 'readr' was built under R version 4.2.3
# Cargar el archivo CSV con read_csv de readr
credito_csv <- readr::read_csv("C:/Users/wilde/Downloads/Programación en lenguaje estadístico/Sesión 11/Valoracion_credito.csv")
## Rows: 2464 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Valoracion_credito;Edad;Ingresos;Tarjetas_credito;Educacion;Credito...
##
## ℹ 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.
head(credito_csv)
## # A tibble: 6 × 1
## `Valoracion_credito;Edad;Ingresos;Tarjetas_credito;Educacion;Creditos_coche`
## <chr>
## 1 "Malo;36.22;Medio;5 o m\xe1s;Bachillerato;2 o m\xe1s"
## 2 "Malo;21.99;Medio;5 o m\xe1s;Bachillerato;2 o m\xe1s"
## 3 "Malo;29.17;Bajo;5 o m\xe1s;Universitario;2 o m\xe1s"
## 4 "Malo;32.75;Bajo;5 o m\xe1s;Bachillerato;1 o ninguno"
## 5 "Malo;36.77;Medio;5 o m\xe1s;Bachillerato;2 o m\xe1s"
## 6 "Malo;39.32;Medio;5 o m\xe1s;Bachillerato;2 o m\xe1s"
library(haven)
## Warning: package 'haven' was built under R version 4.2.3
# Cargar el archivo SPSS
datos_spss <- read_sav("C:/Users/wilde/Downloads/Programación en lenguaje estadístico/Sesión 11/Capacidad_cognitiva.sav")
# Mostrar los primeros registros del dataframe capacidad_spss
head(datos_spss)
## # A tibble: 6 × 8
## x1 x2 x3 x4 x5 x6 x7 x8
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 113 124 118 122 116 115 127 105
## 2 100 95 115 97 121 102 106 112
## 3 124 115 122 116 117 109 119 118
## 4 125 110 124 130 114 115 126 127
## 5 103 89 109 91 106 102 101 97
## 6 88 113 89 110 96 88 109 111
library(readr)
url <- "https://raw.githubusercontent.com/VictorGuevaraP/SOFTWARE_APLICACION/master/Caso_telefonia.csv"
datos_telefonia <- read_csv(url, locale = locale(encoding = "latin1"))
## Rows: 120 Columns: 1
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): Género;Estado_civil;Edad;Llamadas;Minutos;Monto facturado;Tiempo de...
##
## ℹ 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.
head(datos_telefonia)
## # A tibble: 6 × 1
## Género;Estado_civil;Edad;Llamadas;Minutos;Monto facturado;Tiempo de espera;F…¹
## <chr>
## 1 1;4;27;7;33;90.7;16.9;A veces;Regular;Suc. Este
## 2 0;2;28;4;31.7;95.7;1.5;Casi Siempre;Bueno;Suc. Este
## 3 0;4;24;9;31.4;99.3;2.8;A veces;Pésimo;Suc. Este
## 4 1;4;33;5;26.9;83.3;4.6;A veces;Pésimo;Suc. Este
## 5 1;4;21;4;35.5;97.3;3.5;Regularmente;Excelente;Suc. Este
## 6 1;3;28;7;39.9;114.5;4;Casi Siempre;Pésimo;Suc. Este
## # ℹ abbreviated name:
## # ¹`Género;Estado_civil;Edad;Llamadas;Minutos;Monto facturado;Tiempo de espera;Frecuencia_visita;Opinión;Sucursal`
library(openxlsx)
## Warning: package 'openxlsx' was built under R version 4.2.3
#Leer desde un archivo CSV
datos <- read.xlsx('C:/Users/wilde/Downloads/Programación en lenguaje estadístico/Sesión 11/Diego/super.xlsx')
# Previsualizar los primeros n datos del dataframe:
head(datos, n = 10) # Esto mostrará los primeros 10 registros
## date prod_id prod_name
## 1 20190609 7.702155e+12 Limpia tapicería en espuma Binner
## 2 20190609 7.702155e+12 Limpia tapicería y alfombras Binner
## 3 20190609 4.008455e+12 Limpiador Dr. Beckmann alfombras 2en1 poder oxi
## 4 20190609 7.702532e+12 Aceite Bon Aire eléctrico perfume flores
## 5 20190609 7.702532e+12 Ambientador Aire Varitas Bambú Bonaire 2 Repuestos
## 6 20190609 7.702532e+12 Ambientador Auto Spray Carro Nuevo Bonaire
## 7 20190609 7.702532e+12 Ambientador Bon Aire electra oíl vainilla
## 8 20190609 7.702532e+12 Ambientador Bon Aire toque único fantasía floral
## 9 20190609 7.702532e+12 Ambientador Bonaire concentrado tropical breeze
## 10 20190609 7.702532e+12 Ambientador Bonaire fantasía floral + repuesto
## prod_name_long
## 1 Limpia tapicería en espuma Binner x 400ml
## 2 Limpia tapicería y alfombras Binner x 500ml
## 3 Limpiador Dr. Beckmann alfombras 2en1 poder oxi x 650 ml
## 4 Aceite Bon Aire eléctrico perfume flores x 25 ml
## 5 Ambientador Aire Varitas Bambú Bonaire 2 Repuestos x 80ml c-u
## 6 Ambientador Auto Spray Carro Nuevo Bonaire x 25ml
## 7 Ambientador Bon Aire electra oíl vainilla x 25ml
## 8 Ambientador Bon Aire toque único fantasía floral x 14ml + dosificador
## 9 Ambientador Bonaire concentrado tropical breeze x 60 ml
## 10 Ambientador Bonaire fantasía floral + repuesto x 250 ml
## prod_brand category subcategory tags prod_unit_price
## 1 BINNER Supermercado Aseo de hogar Alfombras 15590
## 2 BINNER Supermercado Aseo de hogar Alfombras 13993
## 3 DR.BECKMANN Supermercado Aseo de hogar Alfombras 16513
## 4 BONAIRE Supermercado Aseo de hogar Ambientadores 14990
## 5 BONAIRE Supermercado Aseo de hogar Ambientadores 34990
## 6 BONAIRE Supermercado Aseo de hogar Ambientadores 8190
## 7 BONAIRE Supermercado Aseo de hogar Ambientadores 14390
## 8 BONAIRE Supermercado Aseo de hogar Ambientadores 7273
## 9 BON AIRE Supermercado Aseo de hogar Ambientadores 7790
## 10 BONAIRE Supermercado Aseo de hogar Ambientadores 28990
## prod_units prod_icon prod_source type
## 1 Unidades ../icons/SVG/53-places/home-3.svg VERDE 1
## 2 Unidades ../icons/SVG/53-places/home-3.svg VERDE 1
## 3 Unidades ../icons/SVG/53-places/home-3.svg VERDE 1
## 4 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
## 5 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
## 6 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
## 7 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
## 8 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
## 9 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
## 10 Unidades ../icons/SVG/58-beauty-spas/spa-vapor.svg VERDE 1
# Previsualizar los últimos n datos del dataframe:
tail(datos, n = 10)
## date prod_id prod_name
## 25629 20200220 5.000281e+12 Whisky Old Parr 12 años
## 25630 20200220 5.000281e+12 Whisky Old Parr 18 años
## 25631 20200220 7.703616e+12 Whisky Sir Edwards
## 25632 20200220 8.043240e+10 Whisky Something Special 1000 ml
## 25633 20200220 8.043240e+10 Whisky Something Special 360 ml
## 25634 20200220 8.043240e+10 Whisky Something Special 750 ml
## 25635 20200220 5.010328e+12 Whisky the balvenie double wood 12 años bot.x750ml
## 25636 20200220 5.000299e+12 Whisky The Glenlivet 15 años botella
## 25637 20200220 7.702451e+12 Whisky The Highland supreme botella
## 25638 20200220 5.010314e+12 Whisky the macallan fine oak 12 años bot.x700ml
## prod_name_long prod_brand
## 25629 Whisky Old Parr 12 años x 1000 ml OLD PARR
## 25630 Whisky Old Parr 18 años x 750ml OLD PARR
## 25631 Whisky Sir Edwards x 700ml SIR EDWARDS
## 25632 Whisky Something Special 1000 ml SOMETHING SPECIAL
## 25633 Whisky Something Special 360 ml SOMETHING SPECIAL
## 25634 Whisky Something Special 750 ml SOMETHING SPECIAL
## 25635 Whisky the balvenie double wood 12 años bot.x750ml THE BALVENIE
## 25636 Whisky The Glenlivet 15 años botella x 700 ml THE GLENLIVET
## 25637 Whisky The Highland supreme botella x 750ml HIGHLAND SUPREME
## 25638 Whisky the macallan fine oak 12 años bot.x700ml MACALLAN
## category subcategory tags prod_unit_price prod_units
## 25629 Supermercado Vinos y Licores Whisky 131990 Botella
## 25630 Supermercado Vinos y Licores Whisky 209990 Botella
## 25631 Supermercado Vinos y Licores Whisky 43990 Botella
## 25632 Supermercado Vinos y Licores Whisky 63990 Botella
## 25633 Supermercado Vinos y Licores Whisky 27990 Botella
## 25634 Supermercado Vinos y Licores Whisky 49990 Botella
## 25635 Supermercado Vinos y Licores Whisky 209990 Botella
## 25636 Supermercado Vinos y Licores Whisky 165990 Botella
## 25637 Supermercado Vinos y Licores Whisky 55990 Botella
## 25638 Supermercado Vinos y Licores Whisky 183990 Botella
## prod_icon prod_source type
## 25629 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25630 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25631 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25632 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25633 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25634 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25635 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25636 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25637 ../icons/SVG/73-drink/whiskey.svg VERDE 1
## 25638 ../icons/SVG/73-drink/whiskey.svg VERDE 1
El paquete dplyr contiene una colección de funciones para realizar operaciones de manipulación de datos comunes como: filtrar por fila, seleccionar columnas específicas, reordenar filas, añadir nuevas filas y agregar datos.
# Configura el mirror de CRAN
options(repos = "https://cloud.r-project.org")
# Instala el paquete dplyr
install.packages("dplyr")
## Warning: package 'dplyr' is in use and will not be installed
#Contar el número de registros (filas) que tiene un dataframe:
nrow(datos)
## [1] 25638
# Contar el número de registros (filas) que tiene una columna:
# En donde rooms es el nombre de la columna.
length(datos$rooms)
## [1] 0
# Resumen general de las características de cada columna del dataframe:
str(datos) # Muestra la estructura del dataframe, incluyendo tipos de datos y las primeras observaciones de cada columna.
## 'data.frame': 25638 obs. of 13 variables:
## $ date : num 20190609 20190609 20190609 20190609 20190609 ...
## $ prod_id : num 7.70e+12 7.70e+12 4.01e+12 7.70e+12 7.70e+12 ...
## $ prod_name : chr "Limpia tapicería en espuma Binner " "Limpia tapicería y alfombras Binner " "Limpiador Dr. Beckmann alfombras 2en1 poder oxi " "Aceite Bon Aire eléctrico perfume flores " ...
## $ prod_name_long : chr "Limpia tapicería en espuma Binner x 400ml" "Limpia tapicería y alfombras Binner x 500ml" "Limpiador Dr. Beckmann alfombras 2en1 poder oxi x 650 ml" "Aceite Bon Aire eléctrico perfume flores x 25 ml" ...
## $ prod_brand : chr "BINNER" "BINNER" "DR.BECKMANN" "BONAIRE" ...
## $ category : chr "Supermercado" "Supermercado" "Supermercado" "Supermercado" ...
## $ subcategory : chr "Aseo de hogar" "Aseo de hogar" "Aseo de hogar" "Aseo de hogar" ...
## $ tags : chr "Alfombras" "Alfombras" "Alfombras" "Ambientadores" ...
## $ prod_unit_price: chr "15590" "13993" "16513" "14990" ...
## $ prod_units : chr "Unidades" "Unidades" "Unidades" "Unidades" ...
## $ prod_icon : chr "../icons/SVG/53-places/home-3.svg" "../icons/SVG/53-places/home-3.svg" "../icons/SVG/53-places/home-3.svg" "../icons/SVG/58-beauty-spas/spa-vapor.svg" ...
## $ prod_source : chr "VERDE" "VERDE" "VERDE" "VERDE" ...
## $ type : num 1 1 1 1 1 1 1 1 1 1 ...
summary(datos) # Proporciona estadísticas resumidas como la media, mediana, mínimo, máximo, etc., para las columnas numéricas.
## date prod_id prod_name prod_name_long
## Min. :20190609 Min. :5.245e+06 Length:25638 Length:25638
## 1st Qu.:20190609 1st Qu.:7.702e+12 Class :character Class :character
## Median :20190709 Median :7.702e+12 Mode :character Mode :character
## Mean :20192793 Mean :7.137e+12
## 3rd Qu.:20191101 3rd Qu.:7.704e+12
## Max. :20200220 Max. :9.334e+12
## prod_brand category subcategory tags
## Length:25638 Length:25638 Length:25638 Length:25638
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## prod_unit_price prod_units prod_icon prod_source
## Length:25638 Length:25638 Length:25638 Length:25638
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## type
## Min. :1
## 1st Qu.:1
## Median :1
## Mean :1
## 3rd Qu.:1
## Max. :1
#Resumen de las características de una columna específica:
#En donde rooms es el nombre de la columna.
summary(datos$rooms)
## Length Class Mode
## 0 NULL NULL
# Obtener la mediana de los valores de una columna:
median(datos$rooms)
## NULL
#Eliminar columnas de un dataframe:
En este ejemplo se eliminan las columnas lat, lon, currency, title y description del dataframe datos, las columnas restantes son asignadas a un nuevo dataframe llamado df.
“df <- select(datos, -lat, -lon, -currency, -title, -description)”
sum(is.na(df))
En donde bathrooms es el nombre de la columna.
sum(is.na(df$bathrooms))
Existen varios métodos, en este caso vamos a utilizar drop_na(), para esto necesitamos la biblioteca «tidyr».
install.packages(“tidyr”) library(tidyr)
df2 <- df %>% drop_na(bathrooms)
df2 <- df %>% drop_na(bathrooms,surface_total, surface_covered)
Missing Data
library(simputation) library(tidyverse)
Datos faltantes La incompletitud de datos dentro de cualquier estudio trae aparejado implicaciones muy importantes para su análisis. Sin lugar a dudas, la pérdida de datos necesariamente conlleva a la pérdida de información y a una menor precisión en la estimación de los parámetros de interés (Molenberghs 2015).
Una de las principales tareas para el análisis de datos suele ser por tanto, la evaluación de la inexistencia de datos (datos faltantes o “missing data”). La ausencia de valores en los conjuntos de datos puede tener varios efectos perjudiciales. He aquí algunos ejemplos:
Pueden limitar la capacidad para realizar importantes tareas de ciencia de datos, como la conversión de tipos de datos o la visualización de datos. Pueden reducir la validez estadística de los modelos, lo que a su vez aumenta la probabilidad de error de tipo II. El error de tipo II es la incapacidad de rechazar una hipótesis nula falsa. Los datos que faltan pueden reducir la representatividad de las muestras del conjunto de datos. Los datos que faltan pueden distorsionar la validez de los ensayos científicos y llevar a conclusiones no válidas. En R la ausencia de valores se representa por el valor “NA” lo que permite su reconocimiento y consideración en el uso de funciones sobre datos. Las tareas consisten pues en:
Evaluar la existencia de valores perdidos (exploración). Excluir los valores ausentes. Recodificar los valores ausentes (imputación). Si bien existen funciones que incluyen las funciones como argumento “na.omit” o “na.rm = TRUE,” que permiten ejecutar funciones numéricas sobre datos NA, algunos análisis devolverán un error ante la existencia de valores NA o vacíos (““).
Las acciones que pueden llevarse a cabo frente a datos ausentes son por tanto, las que pueden o no modificar el comportamiento de los datos en su totalidad o llevar a conclusiones erróneas:
Eliminar las filas completas que contengan al menos un valor ausente. Eliminar las filas que contengasn datos ausntes en alguna variable considerada clave para el análisis. Cambiar los valores ausentes a otro valor. Modificar los valores ausentes a un valor predeterminado. Realizar imputación de datos. Nota: la mejor estrategia es no contar con datos ausentes.
El problema de la ausencia La existencia de datos en un set de datos provoca errores sobre todo en aquellas funciones estadísticas que agrupan datos para obtener un resultado.
mean(airquality$Ozone) ## [1] NA
A menos que dentro de la función se pueda especificar omitir este tipo de datos.
mean(airquality$Ozone, na.rm = TRUE) ## [1] 42.12931
Clasificación de datos En teoría todas las variables tienen datos que tienen alguna probabilidad de estar ausentes dentro de un conjunto de datos. Se identifican 3 mecanismos que establecen datos ausentes.
👣 Estos mecanismos no son controlados por el encargado del estudio y mas bien se infieren o asumen.
MCAR Missing Completely at Random. Si la probabilidad de estar ausentes en la misma en todos los casos, entonces se dice que poseen datos perdidos en forma completamente aleatoria. Este es el estado deseado en caso de datos perdidos, ya que indica que no hay sesgo respecto de las perdidas. Por tanto se mantendrían las medidas de normalidad y distribución estadística. La pérdidad de datos no esta relacionada a los datos mismos. Al capturar datos de una muestra los datos no ingresados en ella son evitados en forma MCAR (totalmente aleatoria, cuando el muestreo es correcto).
MAR Missing at Random. Existe una relación sistemática entre los datos observados y la propensión a valores ausentes. Que una observación falte no tiene que ver con esos valores sino con los valores de las variables observadas. Un ejemplo claro es la edad que es más probable que los hombres la digan respecto de las mujeres. Entonces la edad es MAR.
La ausencia de datos está sesgada ya que no tienen la misma distribución, en el ejemplo anterior, las respuestas ausentes provienen mayoritariamente de mujeres. También puede originarse de una mala muestra de datos (no representativa o sesgada).
MNAR Missing Not at Random. Pérdida de datos no aleatoria. Existe una relación entre la propensión a que falte un dato y sus valores. Esto origina un problema en el análisis de datos. Como ejemplo si la mayoría no responde una pregunta determinada puede deberse a que esa pregunta no se entendió del todo. Las personas más enfermas son las más propensas a abandonar el estudio.
En una encuesta pública las personas con carácter más tímido responderán con menos frecuencia que otras de caracter más fuerte.
👣 Cuando los datos son NMAR, casi todos los métodos de análisis estándar no son válidos. Por ejemplo, los métodos estándar basados en la verosimilitud que ignoran el mecanismo de los datos perdidos producen estimaciones sesgadas.
Es importante considerar el tipo de clasificación de datos perdidos para identificar el tipo de análisis a realizar.
Nota: Considerar que en la mayoría de los conjuntos de datos, más de una variable tendrá datos perdidos, y puede que no todas tengan el mismo mecanismo. Vale la pena diagnosticar el mecanismo para cada variable con datos perdidos antes de elegir un enfoque.
Los valores atípicos o los outliers en R son una observaciones que se encuentran a una distancia anormal de otros valores de la muestra.
La definición está abierta, todo depende de qué datos se quieran descartar (reemplazar por NA).
Los podemos identificar mediante diagramas de dispersión o diagramas de cajas.
¿Qué papel cumplen los outliers en R en el análisis exploratorio? El análisis exploratorio consiste en observar nuestros datos, echarles un primer vistazo para ver qué tenemos, qué debemos y podemos arreglar y cómo vamos a trabajar con el dataset que tenemos.
Los primeros pasos en el análisis exploratorio consisten en observar y para esto las mejores opciones son las gráficas, todas aquellas que nos permitan analizar los datos en un panóptico.
Los histogramas son una excelente opción; también puedes pintar funciones de densidad de probabilidad. En estas opciones vemos claramente los outliers en R.
También podemos pintar un boxplot para ver si realmente hay outliers en R, tal y como hicimos en el gráfico anterior.
Si encontramos outliers es importante tratarlos con cuidado, mirar a ver si tienen sentido o si simplemente son errores de medición, o quizás fueron causados por algún usuario que ingresó mal los datos. También pueden ser usuarios que tengan una conexión de red demasiado mala o demasiado buena.
Hay otros factores a tener en cuenta, como los externos y de conocimiento individual. Por ejemplo, el tiempo mínimo de retardo que tienen las redes 4G son de 40 milisegundos, esto quiere decir que si en el gráfico, histograma, boxplot o cualquier otro elemento que hayas dibujado para tu dataset salen datos que estén por debajo de ese rango, es que las muestras están mal medidas y a lo mejor deberías hacer un proceso de limpieza de datos.
Lo mismo pasa si tienes medidas, por ejemplo, de 100 milisegundos y de repente te sale una medida de dos horas; tiene que haber algo que está mal ahí y deberías empezar a mirar curvas de probabilidad para verificar si existen outliers en R.
¿Qué sigue? Ahora que sabes qué son y cómo funcionan los outliers en R, vas a tener la oportunidad de entender un poco mejor todo el proceso de limpieza de datos, análisis exploratorios y toda la parte que tenga que ver con tener información previa sobre los datos que vamos a tratar.
# Instala el paquete si aún no lo has hecho (solo una vez)
install.packages("readxl")
## Warning: package 'readxl' is in use and will not be installed
# Carga el paquete
library(readxl)
# Lee el archivo de Excel y muestra su contenido
super <- read_excel("C:/Users/wilde/Downloads/Programación en lenguaje estadístico/Sesión 11/Diego/super.xlsx")
## Warning: Expecting numeric in I15823 / R15823C9: got '70386,95'
## Warning: Expecting numeric in I15843 / R15843C9: got '48388,88'
## Warning: Expecting numeric in I15847 / R15847C9: got '81388,23'
## Warning: Expecting numeric in I15854 / R15854C9: got '101190,47'
View(super)
#previsualización de datos
head(super$prod_unit_price,n=10)
## [1] 15590 13993 16513 14990 34990 8190 14390 7273 7790 28990
# Previsualizar los últimos n datos del dataframe:
tail(super$prod_unit_price, n=10)
## [1] 131990 209990 43990 63990 27990 49990 209990 165990 55990 183990
# Agregamos paquete dyplr
install.packages("dplyr")
## Warning: package 'dplyr' is in use and will not be installed
library(dplyr)
#Contar datos
count(super)
## # A tibble: 1 × 1
## n
## <int>
## 1 25638
#Conteo de número de columnas
length(super$rooms)
## Warning: Unknown or uninitialised column: `rooms`.
## [1] 0
#REsumen general
summary(super)
## date prod_id prod_name prod_name_long
## Min. :20190609 Min. :5.245e+06 Length:25638 Length:25638
## 1st Qu.:20190609 1st Qu.:7.702e+12 Class :character Class :character
## Median :20190709 Median :7.702e+12 Mode :character Mode :character
## Mean :20192793 Mean :7.137e+12
## 3rd Qu.:20191101 3rd Qu.:7.704e+12
## Max. :20200220 Max. :9.334e+12
##
## prod_brand category subcategory tags
## Length:25638 Length:25638 Length:25638 Length:25638
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
##
## prod_unit_price prod_units prod_icon prod_source
## Min. : 0 Length:25638 Length:25638 Length:25638
## 1st Qu.: 4190 Class :character Class :character Class :character
## Median : 7390 Mode :character Mode :character Mode :character
## Mean : 16171
## 3rd Qu.: 13990
## Max. :990000
## NA's :9
## type
## Min. :1
## 1st Qu.:1
## Median :1
## Mean :1
## 3rd Qu.:1
## Max. :1
##
Los datos univariados consisten en observaciones de una única variable. En esta presentación, exploraremos técnicas para visualizar y entender mejor la distribución de estos datos utilizando RStudio, los gráficos univariados trazan la distribución de datos de una sola variable. La variable puede ser categórica (por ejemplo, raza, sexo) o cuantitativa (por ejemplo, edad, peso).
La visualización de datos univariados es crucial para comprender la naturaleza de una variable y tomar decisiones informadas en el análisis de datos.
Utilizaremos R y RStudio, potentes herramientas para análisis de datos y visualización.
Antes de comenzar, asegúrate de tener instalado el paquete
ggplot2:
install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)
datos <- mtcars
¿Por qué los histogramas son importantes?
Revelan la forma y distribución de la variable.
Permiten identificar tendencias y patrones.
Código para crear un histograma:
ggplot(datos, aes(x = variable)) + geom_histogram(binwidth = 5, fill = "blue", color = "black", alpha = 0.7) + labs(title = "Histograma de la Variable", x = "Variable", y = "Frecuencia") + theme_minimal()
Interpretación del Histograma:
Eje x: Valores de la variable.
Eje y: Frecuencia de ocurrencia.
Forma: Simetría, sesgo a la izquierda/derecha.
¿Por qué los diagramas de caja son útiles?
Resumen visual de estadísticas descriptivas. Identificación de valores atípicos.
Código para crear un diagrama de caja:
ggplot(datos, aes(y = variable)) + geom_boxplot(fill = "green", color = "black", alpha = 0.7) + labs(title = "Diagrama de Caja de la Variable", y = "Variable") + theme_minimal()
Interpretación del Diagrama de Caja:
Caja: Interquartil Range (IQR).
Línea Mediana: Mediana de la variable.
Bigotes: Rango de valores no atípicos.
Puntos: Valores atípicos.
KDE (Kernel Density Estimate)
¿Por qué el KDE es útil?
Proporciona una estimación suave de la distribución de la variable.
Código para crear un gráfico KDE:
ggplot(datos, aes(x = variable)) + geom_density(fill = "purple", alpha = 0.7) + labs(title = "Estimación de Densidad Kernel (KDE)", x = "Variable", y = "Densidad") + theme_minimal()
Interpretación del KDE:
Los datos univariados consisten en observaciones de una única variable. En esta presentación, exploraremos técnicas para visualizar y entender mejor la distribución de estos datos utilizando RStudio, los gráficos univariados trazan la distribución de datos de una sola variable. La variable puede ser categórica (por ejemplo, raza, sexo) o cuantitativa (por ejemplo, edad, peso).
La visualización de datos univariados es crucial para comprender la naturaleza de una variable y tomar decisiones informadas en el análisis de datos.
Utilizaremos R y RStudio, potentes herramientas para análisis de datos y visualización.
Antes de comenzar, asegúrate de tener instalado el paquete
ggplot2:
install.packages("ggplot2")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)
datos <- mtcars
¿Por qué los histogramas son importantes?
Revelan la forma y distribución de la variable.
Permiten identificar tendencias y patrones.
Código para crear un histograma:
ggplot(datos, aes(x = mpg)) + geom_histogram(binwidth = 5, fill = "blue", color = "black", alpha = 0.7) + labs(title = "Histograma de la Variable", x = "Variable", y = "Frecuencia") + theme_minimal()
Interpretación del Histograma:
Eje x: Valores de la variable.
Eje y: Frecuencia de ocurrencia.
Forma: Simetría, sesgo a la izquierda/derecha.
¿Por qué los diagramas de caja son útiles?
Resumen visual de estadísticas descriptivas. Identificación de valores atípicos.
Código para crear un diagrama de caja:
ggplot(datos, aes(y = cyl)) + geom_boxplot(fill = "green", color = "black", alpha = 0.7) + labs(title = "Diagrama de Caja de la Variable", y = "Variable") + theme_minimal()
Interpretación del Diagrama de Caja:
Caja: Interquartil Range (IQR).
Línea Mediana: Mediana de la variable.
Bigotes: Rango de valores no atípicos.
Puntos: Valores atípicos.
KDE (Kernel Density Estimate)
¿Por qué el KDE es útil?
Proporciona una estimación suave de la distribución de la variable.
Código para crear un gráfico KDE:
ggplot(datos, aes(x = qsec)) + geom_density(fill = "purple", alpha = 0.7) + labs(title = "Estimación de Densidad Kernel (KDE)", x = "Variable", y = "Densidad") + theme_minimal()
Interpretación del KDE:
¿Por qué el gráfico de violín es valioso?
Combina un diagrama de caja con un KDE.
Código para crear un gráfico de violín:
ggplot(datos, aes(x = disp, y = hp)) + geom_violin(fill = "orange", alpha = 0.7) + labs(title = "Gráfico de Violín", x = "Variable", y = "Densidad") + theme_minimal()
Interpretación del Gráfico de Violín:
Muestra la distribución y la densidad de la variable.
Calculemos medidas como la media y la mediana:
mean_variable <- mean(datos$drat)
median_variable <- median(datos$wt)
print(mean_variable)
## [1] 3.596563
print(median_variable)
## [1] 3.325
Interpretación:
Media: Promedio de la variable.
Mediana: Valor central de la variable.
Velázquez, A. (2023, 25 febrero). ¿Qué es el análisis prescriptivo? QuestionPro. https://www.questionpro.com/blog/es/analisis-prescriptivo/
Ortega, C. (2021, 28 julio). ¿Qué es el análisis de diagnóstico? https://tudashboard.com/analisis-de-diagnostico/
Mecalux. Análisis prescriptivo: un plan a medida para la cadena de suministro. https://www.mecalux.es/blog/analitica-prescriptiva#:~:text=El%20an%C3%A1lisis%20prescriptivo%20se%20basa,alternativas%2C%20un%20plan%20de%20acci%C3%B3n/
Losada, C. (2022, 27 septiembre). 4 tipos de análisis de datos que debes conocer - Making science. Making Science. https://www.makingscience.es/blog/4-tipos-de-analisis-de-datos-que-debes-conocer/
Admin. (2019b, febrero 25). Análisis de datos predictivos, descriptivos y prescriptivos ¿Dónde está la diferencia? Prometeus Global Solutions. https://prometeusgs.com/analisis-de-datos-diferencias/
RPUbs - Introducción a Shiny (parte 1). https://rpubs.com/JairoAyala/Shiny_parte1