Unidad 2 - Fundamentos de R y Programación

Introducción al Business Analytics · Semana 3 · 06278-ECO

Autor/a

PhD. Eduard F. Martínez-González

1 Objetivo de la semana

Esta semana NO aprenderemos “programación” en el sentido tradicional. El foco está en interpretación, no en memorizar sintaxis.

¿Qué significa “interpretar” en este contexto?

Significa entender qué hace una herramienta cuando la ejecutamos, cómo leer sus resultados, y cómo conectar esos resultados con decisiones de negocio. No necesitamos ser programadores expertos, necesitamos ser usuarios inteligentes de herramientas analíticas.

1.1 Lo que aprenderemos esta semana

1. Entender qué hace R cuando ejecutamos código

  • Qué pasa “por dentro” cuando presionamos ejecutar
  • Cómo R almacena información (objetos en memoria)
  • Por qué algunos comandos funcionan y otros no

2. Leer e interpretar lo que R nos muestra

  • Diferenciar entre resultados normales, advertencias (warnings) y errores
  • Entender la consola como “conversación” con R
  • Leer el panel Environment para saber qué existe en cada momento

3. Reconocer objetos y estructuras de datos

  • Qué es un objeto y por qué todo es un objeto en R
  • Diferencia entre vectores (una dimensión) y data frames (tablas)
  • Cómo acceder y manipular información básica

2 Interfaz de RStudio

RStudio es un IDE (Entorno de Desarrollo Integrado) que hace más fácil trabajar con R. Organiza su espacio de trabajo en cuatro paneles, cada uno con una función específica.

Distribución de paneles en RStudio

2.1 Los cuatro paneles principales

2.1.1 Panel superior izquierdo: Source (Editor de scripts)

Este es nuestro “cuaderno de trabajo”. Aquí:

  • Escribimos código que queremos guardar y reutilizar
  • Documentamos nuestro análisis paso a paso
  • Ejecutamos líneas con Ctrl + Enter (Windows/Linux) o Cmd + Enter (Mac)

¿Por qué escribir aquí y no directamente en la consola?

Porque necesitamos poder reproducir nuestro trabajo, corregir errores, y compartir análisis con otros. El script es nuestra “memoria” del proceso analítico.

2.1.2 Panel inferior izquierdo: Console (Consola)

La consola es donde R “nos habla”. Aquí:

  • Aparecen los resultados de lo que ejecutamos
  • R nos muestra mensajes, advertencias y errores
  • Podemos escribir código directamente (pero no se guarda)

Cómo leer la consola

Cuando ejecutamos código, R puede responder de tres formas: - Resultado normal: Muestra el output esperado - Warning (advertencia): Algo inesperado, pero el código continúa - Error: Algo falló y el código se detiene

Aprenderemos a distinguir estos tres casos más adelante en esta misma clase.

2.1.3 Panel superior derecho: Environment / History

Este panel tiene dos pestañas importantes:

Environment (Entorno): Muestra todos los objetos que hemos creado en la sesión actual (datos, variables, resultados). Es como el “inventario” de lo que existe en la memoria de R en este momento.

History (Historial): Registra todos los comandos que hemos ejecutado durante la sesión.

El Environment es tu aliado

Durante todo el curso, el panel Environment será tu mejor referencia. Si un objeto no aparece aquí, R no lo “conoce” y dará error si intentas usarlo. Si ejecutaste código correctamente, deberías ver nuevos objetos aparecer en este panel.

2.1.4 Panel inferior derecho: Files / Plots / Packages / Help

Este panel agrupa varias funcionalidades útiles:

Files: Navegador de archivos del proyecto (carpetas, datos, scripts)
Plots: Visualización de gráficos que generamos
Packages: Listado de paquetes (librerías) instalados y cargados
Help: Documentación de funciones (se abre cuando usamos ?nombre_funcion)


2.2 Flujo de trabajo recomendado

La rutina de trabajo en RStudio

  1. Escribo código en el panel Source (script)
  2. Ejecuto la línea o bloque seleccionado (Ctrl/Cmd + Enter)
  3. Reviso el resultado en la Console (¿funcionó? ¿error? ¿warning?)
  4. Verifico el Environment (¿se creó el objeto? ¿tiene los valores esperados?)

Este ciclo se repite constantemente durante el análisis de datos. No es necesario memorizarlo, se volverá automático con la práctica.


2.3 Mini-ejercicio: Reconociendo los paneles

Abra RStudio y localice cada panel. Luego:

  1. En la Console, escriba 2 + 2 y presione Enter. ¿Dónde aparece el resultado?
  1. Escriba ?mean en la consola. ¿En qué panel se abre la ayuda?

Si puede responder estas preguntas, ya entendió la función básica de cada panel. En la siguiente sección aprenderemos a “guardar” resultados para usarlos después.

3 R como calculadora

Antes de trabajar con datos, podemos usar R como calculadora para familiarizarnos con la consola. Esto nos ayuda a entender cómo R ejecuta operaciones y muestra resultados.

3.1 Operaciones aritméticas básicas

R reconoce todos los operadores matemáticos estándar:

Nota importante: Estos resultados aparecen en la consola pero no se guardan en ningún lugar. Si queremos reutilizar un resultado, necesitaremos aprender a “guardarlo” (lo haremos en la siguiente sección sobre objetos).

3.2 Orden de precedencia

R sigue las reglas matemáticas estándar. Las operaciones se evalúan en este orden:

  1. Paréntesis ( )
  2. Potencias ^
  3. Multiplicación * y división /
  4. Suma + y resta -

Regla práctica

Cuando tenga dudas sobre el orden de operaciones, use paréntesis. Es mejor ser explícito que obtener un resultado inesperado.

3.3 Operadores de comparación (anticipo)

R puede comparar valores y devolver respuestas de verdadero o falso:

Nota importante: Para comparar si dos valores son iguales usamos == (dos signos igual). Más adelante veremos que = (un solo igual) sirve para otra cosa: asignar valores.

3.4 Operadores lógicos (anticipo)

Podemos combinar comparaciones usando operadores lógicos:

¿Para qué sirven estas comparaciones?

En la Semana 04, usaremos estos operadores para filtrar datos. Por ejemplo: “mostrar solo clientes con ventas > 1000 y región == ‘Norte’”. Por ahora, solo necesitamos saber que existen y cómo funcionan básicamente.

4 Tipos de datos

En R existen diferentes tipos de datos. Los tres más comunes son: numérico, carácter y lógico.

4.1 Numérico

Representa números (enteros o decimales):

4.2 Carácter (texto)

Representa texto. Siempre va entre comillas " " o ' ':

Advertencia

Cuidado con las comillas

100 (sin comillas) es un número que puede sumarse, multiplicarse, etc.
"100" (con comillas) es texto que R no puede usar en operaciones matemáticas.

Este es un error común al importar datos desde Excel o CSV.

4.3 Lógico

Solo dos valores posibles: TRUE o FALSE (en mayúsculas, sin comillas):

Los valores lógicos resultan de comparaciones:

4.4 Valores especiales

R tiene algunos valores especiales que encontraremos frecuentemente:

¿Cuál es la diferencia entre NA y NULL?

  • NA significa “dato faltante”: había un espacio para un valor, pero no lo conocemos. Ejemplo: un cliente no reportó su edad.
  • NULL significa “inexistente”: no hay ni siquiera un espacio. Ejemplo: todavía no hemos creado esa variable.

Por ahora, solo necesitamos reconocer NA porque es muy común en bases de datos reales.

Hasta aquí hemos visto: Podemos usar R como calculadora y obtener resultados inmediatos, pero estos resultados no se guardan. En la siguiente sección aprenderemos a guardar información para reutilizarla.

5 Objetos y asignación

5.1 R es orientado a objetos (OOP)

Concepto fundamental: Todo es un objeto

En R, absolutamente todo es un objeto: - Un número es un objeto - Una tabla de datos es un objeto - Un gráfico es un objeto - Un modelo estadístico es un objeto - Incluso una función es un objeto

Esta filosofía nos permite trabajar con múltiples elementos simultáneamente sin preocuparnos por “guardar y cargar” constantemente (como en Excel o Stata).

Ventaja práctica: Podemos tener abiertas varias tablas de datos al mismo tiempo, crear múltiples gráficos, y guardar resultados de diferentes modelos, todo en la misma sesión.

5.2 ¿Qué es un objeto?

Un objeto es un nombre que almacena información en la memoria de R. Es como una etiqueta que le ponemos a algo para poder referirnos a ello después.

Analogía: Si calculamos 10 + 5, el resultado 15 aparece en la consola pero desaparece inmediatamente. Si queremos usar ese 15 más tarde (por ejemplo, para multiplicarlo por 2), necesitamos “guardarlo” con un nombre. Eso es un objeto.

5.3 Crear objetos: Asignación con <-

Para crear un objeto usamos el operador de asignación <-:

Estructura general:

nombre_objeto <- valor_o_resultado

¿Qué pasó? 1. R calculó el valor 15000 2. Lo guardó en memoria con el nombre ventas_enero 3. El objeto aparece en el panel Environment 4. Ahora podemos usar ese nombre en lugar de escribir 15000 cada vez

5.4 Más ejemplos de asignación

¿Cuándo crear objetos?

Cree un objeto cuando: - Va a reutilizar un valor varias veces - Quiere documentar qué representa un número (mejor tasa_descuento que 0.15) - Necesita guardar resultados intermedios de un análisis - Quiere comparar o combinar diferentes cálculos

No es necesario crear objetos para cálculos únicos y simples.

5.5 ¿<- o =?

Ambos funcionan para asignar objetos, pero tienen diferencias sutiles:

Recomendación del curso

Use <- para asignar objetos:

resultado <- mean(ventas)

Reserve = para argumentos dentro de funciones:

mean(ventas, na.rm = TRUE)

Esto hace el código más legible y sigue la convención estándar de la comunidad R.

Atajo de teclado: Alt + - (Windows/Linux) o Option + - (Mac) escribe <- automáticamente.

5.6 Reglas para nombrar objetos

Reglas obligatorias: - Debe empezar con letra (no con número) - Puede contener letras, números, . y _ - NO puede contener espacios - Es sensible a mayúsculas (ventasVentas)

Buenas prácticas de nomenclatura

Use nombres descriptivos:

# Mal
x <- 1500
v <- 2000

# Bien
precio_unitario <- 1500
volumen_ventas <- 2000

Sea consistente en el estilo:

# snake_case (recomendado para este curso)
ventas_anuales
precio_promedio

# camelCase (también válido)
ventasAnuales
precioPromedio

# Use uno u otro consistentemente

Evite nombres que puedan confundirse con funciones:

# Evitar
mean <- 50  # 'mean' es una función importante
data <- datos  # 'data' es una función de R

5.7 Mini-ejercicio: Creando objetos

Revise el panel Environment: Debería ver cuatro objetos creados (precio_base, impuesto, precio_final, precio_con_descuento).

6 Clase, tipo y estructura

Ahora que sabemos crear objetos, necesitamos herramientas para inspeccionar qué contienen. R provee tres funciones “lupa”:

6.1 class(): ¿Qué tipo de objeto es?

La clase indica cómo R interpreta ese objeto (número, texto, lógico, tabla de datos, etc.).

6.2 typeof(): ¿Cómo lo almacena internamente?

El tipo es más técnico y detalla cómo R guarda ese dato en memoria. Para nuestros propósitos, class() es más útil.

6.3 str(): Muestra la estructura completa

str() es especialmente útil para objetos complejos (vectores, tablas) que veremos pronto.

Las tres lupas en acción

Estas funciones nos ayudan a entender “qué es” un objeto antes de intentar trabajar con él. Muy útil cuando: - Importamos datos y queremos verificar si se leyeron correctamente - Recibimos un error y necesitamos entender qué tipo de objeto estamos usando - Queremos asegurarnos de que un cálculo produjo el tipo de resultado esperado

7 Environment: Gestión del espacio de trabajo

El panel Environment muestra todos los objetos que existen actualmente en la memoria de R. Aprendamos a gestionarlo.

7.1 Listar objetos: ls()

Esta función es útil cuando tenemos muchos objetos y queremos verificar qué existe.

7.2 Eliminar objetos: rm()

El objeto costos ya no existe. Si intentamos usarlo, R dará error.

7.3 Mantener el entorno limpio

Por qué importa un Environment limpio

Un entorno desordenado puede causar: - Confusión sobre qué objetos están disponibles - Errores al usar versiones viejas de objetos - Uso excesivo de memoria

Buenas prácticas: 1. Elimine objetos intermedios que ya no necesita 2. Use nombres descriptivos para identificar objetos rápidamente 3. Al cerrar RStudio, elija “No” cuando pregunte si quiere guardar el workspace (.RData)

Filosofía del curso: Es mejor ejecutar el script completo desde cero cada vez (reproducibilidad) que depender de objetos guardados de sesiones anteriores.

7.4 Ver tamaño de objetos

Esto es útil cuando trabajamos con bases de datos grandes y queremos optimizar memoria.

8 ¿Qué puede pasar en la consola?

Cuando ejecutamos código, R nos responde de diferentes formas en la consola. Aprender a interpretar estos mensajes es fundamental para trabajar eficientemente.

8.1 Output normal (resultado esperado)

Si todo funciona correctamente, R simplemente muestra el resultado:

La notación [1] indica que estamos viendo el elemento número 1 del resultado. Si el resultado tuviera muchos elementos, veríamos [1], [10], [20], etc., indicando la posición.

8.2 Warning (advertencia)

Un warning NO detiene la ejecución del código, pero nos alerta que algo inesperado ocurrió.

Ejemplo controlado:

R nos advierte que generó NaN (Not a Number) porque matemáticamente no podemos calcular el logaritmo de un número negativo. Pero el código se ejecutó hasta el final.

Otro ejemplo común:

El resultado es NA porque hay un dato faltante. R nos advierte pero no da error. Para solucionarlo:

¿Qué hacer cuando veo un warning?

  1. Lea el mensaje completo (no lo ignore automáticamente)
  2. Revise el resultado: ¿tiene sentido o es NA/NaN?
  3. Ajuste el código si es necesario (como agregar na.rm = TRUE)

Los warnings son “alertas amarillas”: R pudo ejecutar, pero quiere que verifiquemos si el resultado es el esperado.

8.3 Error (fallo que detiene ejecución)

Un error detiene completamente la ejecución. R no puede continuar.

Ejemplo 1: Objeto inexistente

Mensaje: Error: object 'mi_dato_inexistente' not found

Interpretación: R buscó un objeto con ese nombre en el Environment y no lo encontró. Posibles causas: - Olvidamos crear el objeto - Escribimos mal el nombre - Lo creamos pero luego lo eliminamos

Ejemplo 2: Argumento mal escrito

Mensaje: Error in mean.default(...) : unused argument (naa.rm = TRUE)

Interpretación: R no reconoce el argumento naa.rm. El argumento correcto es na.rm (sin doble ‘a’).

Advertencia

¿Qué hacer cuando veo un error?

  1. No entre en pánico: Los errores son normales, incluso para programadores expertos
  2. Lea el mensaje completo: Usualmente indica qué salió mal
  3. Revise ortografía: Nombres de objetos, funciones y argumentos son sensibles a mayúsculas y espacios
  4. Verifique el Environment: ¿El objeto que intenta usar realmente existe?
  5. Use ?nombre_funcion para verificar argumentos correctos

La habilidad de leer y entender errores es más importante que memorizar sintaxis perfecta.

8.4 Mini-ejercicio: Identificando mensajes

Ejecute estos tres códigos y clasifique cada resultado como “output normal”, “warning” o “error”:

Respuestas esperadas:

  • Caso 1: Output normal (resultado: 60)
  • Caso 2: Warning (genera NaN por raíz cuadrada de número negativo)
  • Caso 3: Error (objeto no existe)

Si puede distinguir estos tres casos, ya tiene la habilidad clave para depurar código y trabajar eficientemente con R.

9 Funciones y sistema de ayuda

En R, prácticamente todo es una función. Incluso operaciones simples como + o <- son funciones internamente. Entender cómo funcionan las funciones y cómo consultar su documentación es esencial.

9.1 Anatomía de una función

Una función tiene tres componentes:

  1. Nombre: identifica qué hace (mean, sum, seq)
  2. Argumentos: valores que recibe como input (van entre paréntesis)
  3. Resultado: output que devuelve después de ejecutarse

Estructura general:

nombre_funcion(argumento1 = valor1, argumento2 = valor2, ...)

9.2 Funciones básicas comunes

Todo en R es función

Incluso operaciones que parecen simples son funciones internamente:

No necesitamos escribir así normalmente, pero ayuda entender que R trata todo consistentemente como funciones.

9.3 Sistema de ayuda: Consultando documentación

Para saber qué hace una función y qué argumentos acepta, usamos ? o help():

La documentación se abre en el panel Help y tiene esta estructura:

Description: ¿Qué hace la función? (resumen en una línea)
Usage: Sintaxis general (cómo se escribe)
Arguments: Qué valores recibe y qué significa cada uno
Details: Explicación más técnica (opcional, para profundizar)
Value: Qué devuelve la función
Examples: Ejemplos prácticos (¡LA SECCIÓN MÁS ÚTIL!)

Cómo leer la ayuda eficientemente

Cuando consulte la ayuda de una función por primera vez:

  1. Lea la sección Description (¿hace lo que necesito?)
  2. Vaya directo a Examples (copie y ejecute un ejemplo)
  3. Regrese a Arguments solo cuando necesite ajustar algo específico

La mayoría de usuarios (incluso expertos) aprenden más de los ejemplos que de las explicaciones técnicas.

9.4 Ejecutar ejemplos automáticamente

R permite ejecutar todos los ejemplos de una función automáticamente:

Esto ejecuta cada ejemplo paso a paso, mostrando el código y su resultado.

9.5 Buena práctica: Copiar y adaptar ejemplos

La forma más efectiva de aprender una función nueva:

  1. Consulte ?nombre_funcion
  2. Vaya a la sección Examples
  3. Copie un ejemplo a su script
  4. Modifíquelo paso a paso con sus datos
  5. Experimente cambiando argumentos

Ejemplo práctico:

No necesita memorizar funciones

Es imposible (e innecesario) memorizar todas las funciones y sus argumentos. Lo importante es: - Saber que existen herramientas para cada tarea - Saber cómo consultar la documentación - Practicar copiando y adaptando ejemplos

Con el tiempo, las funciones más usadas se memorizan naturalmente.

10 Paquetes y librerías

R viene con funciones básicas incluidas (base R), pero podemos expandir sus capacidades instalando paquetes (también llamados librerías).

10.1 ¿Qué es un paquete?

Un paquete es un conjunto de funciones especializadas en tareas específicas. Por ejemplo:

  • dplyr: manipulación de datos (filtrar, resumir, transformar)
  • ggplot2: creación de gráficos profesionales
  • readxl: importar archivos Excel

Actualmente existen más de 20,000 paquetes disponibles en el CRAN (repositorio oficial de R).

10.2 Dos pasos: Instalar vs. Cargar

Diferencia fundamental

Acción Comando Frecuencia Analogía
Instalar install.packages("nombre") Una sola vez en tu computadora Comprar un libro y guardarlo en tu estante
Cargar library(nombre) Cada vez que inicias R Sacar el libro del estante para leerlo

10.2.1 Instalar un paquete (una vez)

# Instalar dplyr
install.packages("dplyr")

# Instalar varios paquetes
install.packages(c("dplyr", "ggplot2", "readxl"))

Este comando descarga el paquete desde internet y lo guarda en tu computadora. Solo necesitas hacerlo una vez (a menos que quieras actualizar a una nueva versión).

10.2.2 Cargar un paquete (cada sesión)

Cada vez que abres RStudio, debes cargar los paquetes que necesitarás en esa sesión.

Advertencia

Error común: Intentar usar un paquete sin cargarlo

# Si no cargamos dplyr primero
filter(datos, edad > 25)
# Error: could not find function "filter"

# Solución: cargar el paquete
library(dplyr)
filter(datos, edad > 25)  # Ahora funciona

10.3 Atajo: pacman para gestión simplificada

El paquete pacman simplifica la gestión de librerías:

# Instalar pacman (solo una vez)
install.packages("pacman")

# Usar p_load para cargar (e instalar automáticamente si no existe)
pacman::p_load(dplyr, ggplot2, readxl)

La ventaja de p_load(): si un paquete no está instalado, lo instala automáticamente antes de cargarlo.

Práctica estándar para este curso

Al inicio de cada script, incluiremos:

# Gestión de paquetes
pacman::p_load(dplyr, ggplot2, tidyr, readxl)

Esto asegura que todos tengan los paquetes necesarios sin preocuparse por instalarlos manualmente.

10.4 Ver paquetes cargados

Esto muestra la versión de R, paquetes activos, y otra información técnica de la sesión.

11 Vectores

Un vector es la estructura de datos más simple en R. Es fundamental entenderlo porque casi todo en R es un vector o está construido a partir de vectores.

11.1 Concepto: Estructura homogénea

Características de un vector

  • Homogéneo: Todos los elementos deben ser del mismo tipo (numérico, carácter o lógico)
  • Una dimensión: Solo filas O solo columnas (no ambas)
  • Ordenado: Los elementos tienen posición (1, 2, 3…)

11.2 Crear vectores: función c()

La función c() (concatenate) une elementos en un vector:

Revise el Environment: Debería ver tres objetos nuevos.

11.3 Secuencias regulares

Para crear vectores con patrones, usamos atajos:

11.4 Indexación: Acceder a elementos

R indexa desde 1 (no desde 0 como Python o JavaScript):

Indexación con condiciones lógicas

Podemos seleccionar elementos que cumplan una condición:

Esta técnica será fundamental cuando trabajemos con filtros en dplyr (Semana 04).

11.5 Reemplazar valores

11.6 Funciones útiles para vectores

11.7 Mini-ejercicio: Análisis de ventas semanales

Conexión con análisis de datos

Aunque los vectores parecen simples, son fundamentales porque: - Las columnas de una tabla de datos (data frame) son vectores - Las operaciones en dplyr trabajan sobre vectores - Los gráficos en ggplot2 se construyen mapeando vectores

Por eso es importante entender cómo funcionan ahora.

12 Data frames

Los data frames son LA estructura central para análisis de datos en R. Son el equivalente a una tabla de Excel o una hoja de cálculo.

12.1 Concepto: Tabla = Data frame

Características de un data frame

  • Heterogéneo: Cada columna puede ser de un tipo diferente (numérica, carácter, lógica)
  • Dos dimensiones: Filas (observaciones) y columnas (variables)
  • Estructura rectangular: Todas las columnas tienen la misma longitud
  • Columnas con nombre: Cada variable tiene un nombre único

Analogía: Un data frame es como una tabla de Excel donde: - Cada fila es una observación/registro (por ejemplo, un cliente) - Cada columna es una variable (por ejemplo, edad, ventas, región)

12.2 Crear un data frame

Nota: Cada columna es un vector del mismo largo. Si intentamos crear columnas de diferente longitud, R dará error.

12.3 Inspeccionar un data frame

Interpretación de str()

Qué nos dice: - 'data.frame': 4 obs. of 4 variables → 4 filas (observaciones), 4 columnas (variables) - $ nombre: chr → columna “nombre” es de tipo carácter - $ edad: num → columna “edad” es numérica - $ ventas: num → columna “ventas” es numérica - $ activo: logi → columna “activo” es lógica

Esta función es su “radiografía” rápida de cualquier tabla de datos.

12.4 Acceder a columnas con $

Nota: Cuando extraemos una columna con $, obtenemos un vector.

12.5 Acceder a celdas con [fila, columna]

Advertencia

Cuidado con el orden: siempre [fila, columna]

# Correcto: fila primero, columna después
clientes[2, 3]  # Fila 2, columna 3

# Incorrecto (orden invertido)
clientes[3, 2]  # Esto da un resultado diferente

Truco para recordar: Piense en RC (fila Row, columna Column) en orden alfabético.

12.6 Agregar columnas

12.7 Data frames precargados en R

R incluye varios data frames para practicar:

12.8 Mini-ejercicio: Análisis de clientes

Esto es la base para el resto del curso

Los data frames son fundamentales porque:

Semana 04 (dplyr): Aprenderemos funciones especializadas para manipular data frames: - filter(): Filtrar filas (en lugar de data[condicion, ]) - select(): Seleccionar columnas (en lugar de data$columna) - mutate(): Crear columnas nuevas (en lugar de data$nueva <- ...) - summarize(): Calcular resúmenes (promedios, totales, etc.)

Semana 05 (ggplot2): Visualizaremos data frames con gráficos profesionales

Semana 06: Importaremos data frames desde Excel, CSV, bases de datos

Semanas 09-16: Usaremos data frames para entrenar modelos de machine learning

Por ahora, lo importante es entender: - Qué es un data frame (tabla con filas/columnas) - Cómo acceder a sus elementos ($ para columnas, [,] para celdas) - Cómo crear data frames simples

Lo demás lo construiremos gradualmente.