# cargar datos
datos <- read.table("Base_tarea_AAR.txt", header = TRUE, sep = "|")
#head(datos)
#str(datos)
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.
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
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.
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.
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.
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.
Lo pusimos en comentarios para que cuando lo corran no se quede imprimiendo
{r} #while(TRUE) { # print("bucle infinito") #}
{r} contador <- 1 while(TRUE) { print(paste("Iteración", contador)) if (contador == 5) { print("Se detiene el bucle") break } contador <- contador + 1 }
{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) }
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().
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.
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
dim(datos)
## [1] 1189 7
De acuerdo a la salida anterior tenemos 1189 renglones y 7 columnas.
#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)
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')