Semana 7

Author

Nathalia Báez

Published

June 11, 2026

Parte 1 — Diagnóstico Relacional

facturas_sin_cliente <- facturas |> 
  anti_join(clientes, by = "id_cliente")

# COMENTARIO DIAGNÓSTICO 1.1: 
# La factura F006 tiene el id_cliente C007, el cual no existe  en la tabla de clientes. 
#Esto representa un problema de integridad referencial.


clientes_sin_factura <- clientes |> 
  anti_join(facturas, by = "id_cliente")
# Son 2 clientes en total, Luis García y Jorge Reyes.


facturas_sin_pago <- facturas |> 
  anti_join(pagos, by = "id_factura")
# Los IDs de las facturas sin pago son F003, F005 y F008.


facturas |> 
  count(id_cliente, mes, monto) |> 
  filter(n > 1)
# A tibble: 1 × 4
  id_cliente mes   monto     n
  <chr>      <chr> <dbl> <int>
1 C001       Ene   15000     2
# COMENTARIO DIAGNÓSTICO 1.4:
# El id_cliente que tiene una factura duplicada en contenido es C001.
# Consultaría con el equipo de sistemas o ventas para verificar si fue un error 
#de doble envío en el sistema o si realmente fueron dos compras idénticas. 
#De ser un error, procedería a eliminar uno de los registros.

Parte 2 — Aplicando los 4 Joins

nrow(clientes) 
[1] 6
clientes_con_facturas <- clientes |> left_join(facturas, by = "id_cliente")
nrow(clientes_con_facturas)
[1] 9
# El resultado tiene 9 filas. Tiene más filas que la tabla original porque un 
#cliente puede tener múltiples facturas y R duplica la fila del cliente para 
#emparejarla con cada factura que le corresponda.


clientes_inner <- clientes |> inner_join(facturas, by = "id_cliente")

# Los clientes que desaparecen son C004 y C006. 
# Desaparecen porque inner_join solo conserva las filas que tienen coincidencia 
#exacta en ambas tablas, y ellos no registran ninguna factura.


clientes_full <- clientes |> full_join(facturas, by = "id_cliente")

# Aparece una fila extra al final con id_cliente C007 e id_factura F006. 
#Esta fila tiene valores NA en nombre, ciudad y tipo. Aparece porque full_join 
#mantiene absolutamente todos los registros de ambas tablas, sin importar si 
#carecen de correspondencia en la otra.


tabla_maestra <- clientes |>
  left_join(facturas, by = "id_cliente") |>
  left_join(pagos,    by = "id_factura")

print(tabla_maestra)
# A tibble: 9 × 8
  id_cliente nombre       ciudad       tipo  id_factura mes   monto monto_pagado
  <chr>      <chr>        <chr>        <chr> <chr>      <chr> <dbl>        <dbl>
1 C001       Ana Torres   Santo Domin… Prem… F001       Ene   15000        15000
2 C001       Ana Torres   Santo Domin… Prem… F002       Feb   22000        22000
3 C001       Ana Torres   Santo Domin… Prem… F008       Ene   15000           NA
4 C002       Pedro Méndez Santiago     Regu… F003       Ene    8500           NA
5 C002       Pedro Méndez Santiago     Regu… F007       Mar    9800         9800
6 C003       María López  Santo Domin… Prem… F004       Feb   31000        31000
7 C004       Luis García  La Vega      Regu… <NA>       <NA>     NA           NA
8 C005       Carmen Díaz  San Pedro    Regu… F005       Ene    4500           NA
9 C006       Jorge Reyes  Santo Domin… Prem… <NA>       <NA>     NA           NA
# ¿Cuántas filas tiene? Tiene 9 filas.
# ¿Por qué algunos monto_pagado son NA? Por dos razones:
# 1. Los clientes C004 y C006 no tienen facturas asociadas, por eso tampoco pagos.
# 2. Las facturas F003, F005 y F008 existen en el registro, pero no han sido pagadas, dejando el monto como pendiente.

Parte 3 — Joins de Filtro: Auditoría

clientes_con_al_menos_una <- clientes |> semi_join(facturas, by = "id_cliente")
# Son 4 clientes.

clientes |> 
  anti_join(facturas, by = "id_cliente") |> 
  select(nombre, ciudad)
# A tibble: 2 × 2
  nombre      ciudad       
  <chr>       <chr>        
1 Luis García La Vega      
2 Jorge Reyes Santo Domingo
facturas |> 
  anti_join(clientes, by = "id_cliente") |> 
  select(id_factura, id_cliente, monto)
# A tibble: 1 × 3
  id_factura id_cliente monto
  <chr>      <chr>      <dbl>
1 F006       C007       12000

Parte 4 — Manejo de Duplicados

facturas_sin_dup <- facturas |> filter(!duplicated(facturas))
# Quedan 8 filas. 

facturas_max <- facturas |>
  group_by(id_cliente) |>
  slice_max(order_by = monto, n = 1) |>
  ungroup()

tabla_maestra_sin_dup <- clientes |>
  left_join(facturas_sin_dup, by = "id_cliente") |>
  left_join(pagos,    by = "id_factura")

# No cambió el número de filas porque no se quitó nada porque el id_factura de 
#cada registro es único.

Parte 5 — Tidy Data con pivot

ventas_por_mes <- tabla_maestra_sin_dup |>
  filter(!is.na(mes)) |>
  group_by(nombre, mes) |>
  summarise(total = sum(monto, na.rm = TRUE), .groups = "drop") |>
  pivot_wider( names_from  = mes,
    values_from = total,
    values_fill = 0)

print(ventas_por_mes)
# A tibble: 4 × 4
  nombre         Ene   Feb   Mar
  <chr>        <dbl> <dbl> <dbl>
1 Ana Torres   30000 22000     0
2 Carmen Díaz   4500     0     0
3 María López      0 31000     0
4 Pedro Méndez  8500     0  9800
ventas_largo <- ventas_por_mes |>
  pivot_longer(cols      = -nombre,     
    names_to  = "mes",
    values_to = "total")

print(ventas_largo)
# A tibble: 12 × 3
   nombre       mes   total
   <chr>        <chr> <dbl>
 1 Ana Torres   Ene   30000
 2 Ana Torres   Feb   22000
 3 Ana Torres   Mar       0
 4 Carmen Díaz  Ene    4500
 5 Carmen Díaz  Feb       0
 6 Carmen Díaz  Mar       0
 7 María López  Ene       0
 8 María López  Feb   31000
 9 María López  Mar       0
10 Pedro Méndez Ene    8500
11 Pedro Méndez Feb       0
12 Pedro Méndez Mar    9800
total_mensual <- ventas_largo |> 
  group_by(mes) |> 
  summarise(total_mes = sum(total, na.rm = TRUE), .groups = "drop") |> 
  arrange(desc(total_mes))

print(total_mensual)
# A tibble: 3 × 2
  mes   total_mes
  <chr>     <dbl>
1 Feb       53000
2 Ene       43000
3 Mar        9800