# cargar datos
datos <- read.table("Base_tarea_AAR.txt", header = TRUE, sep = "|")

#head(datos)
#str(datos)

Ejercicio 1. Contesta las siguientes preguntas:

a. De acuerdo con lo visto en clase, ¿Qué temas se deben estudiar como mínimo para que una persona pueda manejar bases de datos con algún lenguaje de programación?

Se requiere que tenga conocimiento en:

  • Tipos de datos: fechas, númericos.

  • Tipos de operadores: para realizar filtros con “>, <”, “=”, etc y filtrar o seleccionar objetos de la base

  • Carga y descarga de datos: obtener datos desde archivos csv o xlsx para su manipulación

  • Objetos: dataframes, matrices, listas, vectores.

  • Bucles: for, while

  • Condicionales: if, ifelse

  • Limpieza y manipulación de datos:Uso de la librería dplyr para filtrar, seleccionar y modificar datos, que incluye funciones como select, filter, mutate, group by, summarise , arrange, joins.

b. ¿Qué es un IDE?

IDE es labreviación para Entorno de Desarrollo Integrado, en inglés integrated development environment (IDE). Este sirve para hacer más fácil la programación al incluir herramientas como consolas, resaltado de sintaxis, depuración, etc. En el caso de R, la IDE más utilizada es RStudio

c. ¿Qué es una librería?

Una librería es un conjunto de funciones, clases y métodos predefinidos que facilitan la programación al evitar escribir código desde cero. Con esto nos referimos a que al tener una librería en uso, por ejemplo en R, entonces podemos reutilizar código al hacer uso de las funciones que ya incluye, lo que nos permite desarrollar nuestro código de manera más rápida y corta.

d. ¿Cuál es la diferencia entre un archivo txt y csv?

Aunque ambos archivos son de texto plano, un archivo csv siempres esta delimitado por comas, como bien lo dicen sus siglas comma seperated values, o incluso otros delimitadores específicos como “;”. Además,los datos que se guardan en un csv suelen estar estructurados para almacenar datos de tablas, por lo que se puede abrir facilmente desde hojas de cálculo.

Por el otro lado, un archivo txt no está limitado a un delimitador en específico, además los datos que contine no suelen estar estructurados, por lo que puede tener texto de cualquier tipo y datos en cualquier orden.

e. ¿Cuál es la diferencia entre un archivo de texto plano y un Excel?

La principal diferencia es que un archivo de texto plano no tiene formato visual, pues solo almacena los datos en líneas de texto, mientras que un Excel contiene datos en formato de tabla con celdas, columnas y filas, es decir, si tiene un formato visual.

f. ¿Cuál es la diferencia entre Python y R?

Aunque ambos son lenguajes de programación, Python es un lenguage de propósito general mientras que R es más bien para un propósito estadístico, esto hace que Python sea más versatil y utilizado por su amplia variedad de librerías para distintos propósitos.

Ejercicio 2. Crea los siguientes bucles:

a) Un bucle infinito

Lo pusimos en comentarios para que cuando lo corran no se quede imprimiendo

{r} #while(TRUE) { # print("bucle infinito") #}

b) Introduce un break para detener el bucle anterior

{r} contador <- 1 while(TRUE) { print(paste("Iteración", contador)) if (contador == 5) { print("Se detiene el bucle") break } contador <- contador + 1 }

c) Tienes la siguiente matriz matrix(1:12, nrow=3, byrow=T), crea un bucle que imprima los valores en orden inverso (12, 11, 10,…) pero que no imprima el número 5 ni 3.

{r} matriz <- matrix(1:12, nrow=3, byrow=TRUE) valores <- as.vector(t(matriz)) for (i in rev(valores)) { if (i == 3 || i == 5) { next } print(i) }

Ejercicio 3

a. ¿Cuál es la diferencia entre una matriz y data frame?

Una matriz en R es una estructura de datos bidimensional donde todos los elementos deben ser del mismo tipo (numérico, carácter, lógico, etc.). Se organizan en filas y columnas y pueden crearse usando la función matrix().

Un data frame, en cambio, también es una estructura bidimensional similar a una tabla, pero permite almacenar diferentes tipos de datos en cada columna (por ejemplo, números en una columna y caracteres en otra). Los data frames se crean comúnmente con la función data.frame().

b. ¿Qué es una lista?

Una lista en R es una estructura de datos que puede contener elementos de diferentes tipos, como vectores, matrices, data frames, incluso otras listas. Es una colección ordenada de objetos y se crea usando la función list(). Las listas son muy flexibles y permiten almacenar objetos complejos en un solo contenedor.

c. ¿Qué es el encoding?

El término encoding (o codificación) se refiere al conjunto de reglas que determinan cómo los caracteres de texto se representan internamente en la memoria de una computadora. En el contexto de R y del manejo de datos, el encoding define cómo se almacenan los caracteres, especialmente aquellos con acentos, símbolos especiales o caracteres de otros idiomas.

Algunos de los encodings más comunes son:

  • UTF-8

  • Latin-1 (ISO-8859-1)

  • ASCII

Ejercicio 4

a. ¿Qué dimensión tiene la base?

dim(datos)
## [1] 1189    7

De acuerdo a la salida anterior tenemos 1189 renglones y 7 columnas.

b. Realiza la limpieza de datos:

#Limpiamos

#datos$matricula
#unique(gsub("[A-Z]|0|1|2|3|4|5|6|7|8|9| ","",datos$matricula))
#unique(gsub("0|1|2|3|4|5|6|7|8|9","",datos$anio_nacimiento))


datos_limpios <- datos %>% mutate(.,
                 matricula=gsub("[^[:alnum:] ]","",toupper(matricula))
                 ,anio_nacimiento=as.numeric(gsub("[^0-9]","",toupper(anio_nacimiento)))
                 ,mes_nacimiento=as.numeric(gsub("[^0-9]","",toupper(mes_nacimiento)))
                 ,dia_nacimiento=as.numeric(gsub("[^0-9]","",toupper(dia_nacimiento)))
                 ,edad=as.numeric(gsub("[^0-9]","",toupper(edad)))
                 ,num_articulos=as.numeric(gsub("[^0-9]","",toupper(num_articulos)))
                 ,mto_ventas = case_when(
                   # Detecta USD, $, o dólares (variaciones comunes)
                   grepl("usd", mto_ventas, ignore.case = TRUE) ~ as.numeric(gsub("[^0-9.]","",mto_ventas))*20,
                   # Si no coincide con ningún patrón conocido
                   TRUE ~ as.numeric(gsub("mxn","",mto_ventas))
                 )
                 ,fecha_nacimiento=as.Date(paste(anio_nacimiento,mes_nacimiento,dia_nacimiento,sep="-"))
                 ,edad_2=ceiling(as.numeric(as.Date("2025-03-26")-fecha_nacimiento)/365))

datatable(datos_limpios,class = 'cell-border stripe', width = '400px')
#str(datos_limpios)
#summary(datos_limpios)

c. Responde las siguientes preguntas:

Utilizando el hecho de que la matrícula es un campo identificador del cliente, utilizamos la función unique para determinar las matrículas únicas que se encontraban en la base de datos. Al notar que había un valor repetido, observamos que dicho registro pareciera pertenecer a un mismo cliente, sin embargo la fecha de nacimiento no es la misma en ambos registros. Esto nos podría indicar que al momento del registro se registró de forma errónea la matrícula de alguno de los clientes que contaban con matrículas similares.

Combinando ambos registros, fecha de nacimiento y matrícula obtuvimos que todos los registros de nuestra base son únicos, es decir 1189 clientes únicos.

#i
length(unique(datos_limpios$matricula))
## [1] 1188
#buscamos el registro que se repite
todos_duplicados <- datos_limpios$matricula[datos_limpios$matricula%in% datos_limpios$matricula[duplicated(datos_limpios$matricula)]]

#vamos todos los registros del resgistro de dicha matricula que aparece dos veces
matricula_repetida <- datos_limpios%>%filter(.,matricula=="XSF45")
length(unique(datos_limpios$fecha_nacimiento))
## [1] 1189
kable(matricula_repetida, format = "html") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),  
    full_width = FALSE,
    font_size = 14
  )
matricula anio_nacimiento mes_nacimiento dia_nacimiento edad num_articulos mto_ventas fecha_nacimiento edad_2
XSF45 2004 2 4 22 23 100 2004-02-04 22
XSF45 2003 12 5 22 15 40 2003-12-05 22
#
unicos <- unique(datos_limpios[c("matricula", "fecha_nacimiento")])
dim(unicos)
## [1] 1189    2
#ii
sum(datos_limpios$num_articulos)
## [1] 30992

Sumamos todos los registros de número de artículos obteniendo que han sideo comprados 30,992 artículos.

#iii
sum(datos_limpios$mto_ventas)
## [1] 65609

Sumamos todos los montos de ventas de los clientes, obteniendo un monto total de 65,609

#iv
ventas_promedio <- datos_limpios %>%
  group_by(.,matricula,fecha_nacimiento)%>%
  summarise(.,mean(mto_ventas))

datatable(ventas_promedio,class = 'cell-border stripe', width = '600px')

A continuación podemos ver que la diferencia entre ambas columnas es 0. Esto podría deberse a que algunos clientes decidieron redondear al siguiente entero su edad, es decir que aun cuando falten meses para cumplir la edad que registraron, la registran pues están próximos a cumplirla. Edad 2 fue calculado redondeando al entero superior.

#v
diferencias <- data.frame(Diferencias=datos_limpios$edad-datos_limpios$edad_2)
unique(diferencias$Diferencias)
## [1] 0
datatable(diferencias,class = 'cell-border stripe', width = '600px')
estadisticas <- datos_limpios %>%
  summarise(.,media = mean(edad_2)
            ,mediana=median(edad_2)
            ,moda=mfv(edad_2))
datatable(estadisticas,class = 'cell-border stripe', width = '600px')