GAA1104 · Big Data e Inteligencia de Negocios · Clase 10

Las reglas del modelador y los dos granos

Declarar el grano por escrito, separar hechos de dimensiones con una regla que se pueda aplicar sin pensar, y resolver el conflicto descuento-por-factura vs producto-por-línea con modelamiento y no con parches — dejando las tablas cargadas y verificadas en la máquina de cada estudiante.

El notebook de esta clase: https://gaa1104.vercel.app/notebooks/clase-10.ipynb

Ing. en Administración · mención Finanzas · Prof. Tomás Fernández

Clase 10 · el gráfico de hoy

Ninguno: diagrama de esquema

Se dibuja el modelo —hechos y dimensiones—, que es un diagrama de estructura, no una visualización de datos.

La forma la decide el trabajo que hace el dato —magnitud, identidad, polaridad, cambio en el tiempo, distribución—, no el gusto. Regla del curso: un solo eje.

Apertura — Active recall y la respuesta de la insignia · 12 min

Lo que quedó planteado en la clase insignia (se proyecta la pregunta, NO la respuesta):

«El descuento se cuenta 2,60 veces y el flete 2,04. Si los dos se repiten en las mismas líneas de las mismas facturas, ¿por qué los factores son distintos?»

Tres preguntas, en silencio, 90 segundos (espaciado 1–3–7–21):

Apertura — Active recall y la respuesta de la insignia · 12 min
  1. (clase 09) ¿Qué representa una fila del libro de ventas de Austral, y cuánto costó no saberlo? → una línea de factura · 9,7 puntos de margen.
  2. (clase 07) Los cuatro pasos del orden de ataque frente a un archivo nuevo.
  3. (clase 05) Las 639 líneas sin fecha de pago son un faltante legítimo y las 89 sin tipo de cambio son un error de captura. Misma celda vacía: ¿qué las distingue?
Apertura — Active recall y la respuesta de la insignia · 12 min

Par (2 min) → plenaria (2 min). Exigir el número, no la idea: 2,60 · 2,04 · 14,90 · 24,59.

Y ahora la pregunta colgada se responde con ellos, con la consulta en pantalla. Nadie dicta nada.

Punto de partida: el promedio de líneas por factura es 2,03.

SELECT ROUND(COUNT(*) * 1.0 / COUNT(DISTINCT numero_factura), 2) AS lineas_por_factura
FROM ventas;
-- 2.03
Apertura — Active recall y la respuesta de la insignia · 12 min

Entonces, si cada cargo se repite una vez por línea, los dos factores deberían ser 2,03. Uno lo es (2,04). El otro no (2,60).

Apertura — Active recall y la respuesta de la insignia · 12 min
WITH f AS (SELECT numero_factura, COUNT(*) AS n,
                  MAX(descuento_factura) AS d, MAX(flete_despacho) AS fl
           FROM ventas WHERE moneda = 'CLP' GROUP BY 1)
SELECT ROUND(SUM(n * d)  / SUM(d),  2) AS factor_descuento,
       ROUND(SUM(n * fl) / SUM(fl), 2) AS factor_flete,
       ROUND(AVG(n), 2)                AS lineas_promedio
FROM f;
-- 2.60 · 2.04 · 2.03
Apertura — Active recall y la respuesta de la insignia · 12 min

Se lee en voz alta y se deja que lo digan ellos:

Apertura — Active recall y la respuesta de la insignia · 12 min
Apertura — Active recall y la respuesta de la insignia · 12 min

La fórmula, escrita en la pizarra:

factor = Σ (líneas × cargo) ÷ Σ (cargo)

Es el promedio de líneas por factura ponderado por el tamaño del cargo. Si el cargo no depende del tamaño de la factura (flete), el factor cae en 2,03. Si el cargo crece con la factura (descuento), las facturas grandes pesan más y el factor se va a 2,60.

Y el remate, que es la lección de oficio del día:

Apertura — Active recall y la respuesta de la insignia · 12 min
«El error no es aleatorio: está sesgado hacia las facturas grandes. Si fuera ruido, se compensaría solo y a nadie le importaría. Pero castiga justamente a tus clientes más importantes y a tus meses más fuertes. Un error con sesgo no se promedia: se acumula en la dirección equivocada.»
Las tres reglas del modelador · 18 min

Una lámina por regla, con su ejemplo de Austral al lado. Se copian textuales al cuaderno.

Regla 1 — El grano se declara por escrito, antes de la primera consulta

«Una fila de fact_venta_linea es un producto vendido en una factura.»

Se escribe arriba del notebook, en una celda de texto, antes de cualquier CREATE TABLE. Todo lo que después entre a esa tabla tiene que respetar esa frase. Lo que no la respeta, no entra: se va a otra tabla.

Las tres reglas del modelador · 18 min

Regla 2 — Hechos largos y flacos; dimensiones cortas y anchas

Las tres reglas del modelador · 18 min
«Si tu dimensión tiene un millón de filas, casi siempre es un hecho disfrazado. Si tu tabla de hechos tiene 40 columnas de texto, casi siempre le sobran dimensiones adentro.»

Regla 3 — Cada dimensión se relaciona 1:N con los hechos. Nunca al revés

Un cliente, muchas líneas. Un producto, muchas líneas. Una fecha, muchas líneas.

Las tres reglas del modelador · 18 min
«Si te encuentras una relación muchos-a-muchos, no la fuerces: te falta una tabla en el medio, y casi siempre es una tabla de hechos que todavía no descubriste. Eso es lo que nos va a pasar hoy, en cuarenta minutos, con el descuento.»

Un minuto de traducción de vocabulario, dentro del bloque, porque el enunciado del Parcial 2 puede venir en el otro idioma:

Las tres reglas del modelador · 18 min
Como lo decimos en claseComo lo dice el enunciado
llave natural (numero_factura + sku)clave candidata — identifica la fila y sale de los propios datos
llave surrogate (id_producto, la que construimos en la clase 11)clave primaria artificial — la candidata que se eligió, inventada y estable
la relación 1:N que Power BI dibuja de la dimensión al hechoclave foránea — la columna del hecho que apunta a la primaria de la dimensión
Las tres reglas del modelador · 18 min

Y la escalera completa, que se lee de arriba abajo: superclave → clave candidata → clave primaria → clave foránea.

«Eso dibujado es un modelo entidad-relación. Y el esquema estrella que estamos armando es un modelo entidad-relación con una forma particular: si el enunciado pide "modelo entidad-relación o esquema estrella", ustedes ya lo tienen. Lo que faltaba era reconocer el nombre.»
El clasificador: seis columnas nuevas del ERP · 14 min

El bloque donde trabajan ellos. El docente reparte las tarjetas y plantea el contexto:

«Llega un correo de Control de Gestión: "desde el próximo cierre, la exportación del ERP va a traer seis columnas más". Ninguna viene con explicación. ¿Dónde va cada una en tu modelo?»

Mecánica, con reloj (probada, no improvisar):

El clasificador: seis columnas nuevas del ERP · 14 min
  1. La primera fila se resuelve en voz alta con ellos, como modelo a imitar: «¿tiene sentido sumar el costo financiero del crédito? Sí, sumar costos financieros de dos facturas da el costo financiero de las dos. → medida, va al hecho.»
  2. Las otras cinco, 90 segundos cada una: la sala propone, se cuenta hasta cinco en silencio, se marca la respuesta.
El clasificador: seis columnas nuevas del ERP · 14 min
Columna nuevaDónde vaLa trampa
costo_financiero_credito_clpMedida → fact_venta_linea (o al hecho de cabecera, si viene por factura)Directa. Sirve de modelo. Ojo: preguntar a qué grano llega.
nombre_ejecutivo_cobranzaAtributo → dim_comercial (o dimensión propia si tiene atributos)«¿Creamos dim_ejecutivo?» Depende de si tiene atributos propios (sucursal, meta, jefatura). Si es sólo un nombre, vive como atributo.
tipo_cambio_diaAtributo de dim_tiempoES NUMÉRICA Y NO SE SUMA. La trampa mayor.
limite_credito_cliente_clpAtributo de dim_clienteLa segunda trampa: también es numérica, y además pertenece al cliente, no a la venta.
folio_nota_creditoDimensión degenerada → se queda en el hechoIdentificador sin atributos propios. No merece tabla.
dias_moraMedida derivada, pero al grano FACTURALa más fina: se calcula, sí — pero de la fecha de pago del documento, no de la línea. Es el problema del descuento otra vez.
El clasificador: seis columnas nuevas del ERP · 14 min

La trampa, demostrada y no discutida

SELECT ROUND(SUM(tipo_cambio), 1) AS suma_del_tipo_de_cambio,
       ROUND(AVG(tipo_cambio), 1) AS promedio,
       COUNT(tipo_cambio)         AS lineas_con_dato
FROM ventas
WHERE moneda = 'USD';
-- 269.881,8 · 882,0 · 306
El clasificador: seis columnas nuevas del ERP · 14 min
«269.882 pesos por dólar. Ese número no significa absolutamente nada y ninguna base de datos te va a avisar. El promedio, 882, sí significa algo. Si lo puedes sumar pero la suma no significa nada, no es una medida: es un atributo que se disfraza de número.»

Cuando alguien cae —y siempre cae alguien—: «es EL error que comete todo el mundo la primera vez, yo incluido».

Respiro · 5 min

Pararse, estirar, subir la luz.

La bisagra · 4 min

Éste es el bloque que convierte dos sesiones en una clase. Se dicta de pie, sin proyectar SQL.

«Descuento y flete viven al grano factura; el resto vive al grano línea. ¿Se reparten entre las líneas, o se guardan aparte en su propia tabla?»

Y el enlace con lo que acaban de escribir, que es lo que hace que la clase sea una y no dos:

La bisagra · 4 min
«Fíjense en lo que acaba de pasar. La regla 1 dice que el grano se declara por escrito. La regla 3 dice que si te aparece un muchos-a-muchos te falta una tabla. Y dias_mora, que clasificamos hace tres minutos, ya nos lo dijo: hay columnas que llegan al grano factura y no al grano línea.

La respuesta a la pregunta colgada no es "reparto" ni "tabla aparte": son las dos, y hay que saber qué gana y qué pierde cada una. En los próximos cuarenta minutos las comparamos con números y después las cargamos las dos.»
Las dos salidas, comparadas con números · 22 min

Opción A — Segunda tabla de hechos al grano factura

Cada cargo se guarda una sola vez, donde de verdad ocurrió:

Las dos salidas, comparadas con números · 22 min
CREATE OR REPLACE TABLE fact_venta_factura AS
SELECT numero_factura,
       COALESCE(TRY_STRPTIME(fecha_emision, '%Y-%m-%d'),
                TRY_STRPTIME(fecha_emision, '%d/%m/%Y'))::DATE
         AS fecha_key,
       MAX(descuento_factura) AS descuento_clp,
       MAX(flete_despacho)    AS flete_clp,
       COUNT(*)               AS lineas
FROM ventas
WHERE moneda = 'CLP'
GROUP BY numero_factura, fecha_key;
Las dos salidas, comparadas con números · 22 min
SELECT COUNT(*)                  AS facturas,
       ROUND(SUM(descuento_clp)) AS descuento_total,
       ROUND(SUM(flete_clp))     AS flete_total
FROM fact_venta_factura;
-- 2.758 facturas · 416.964.602 · 209.502.530
Las dos salidas, comparadas con números · 22 min
Las dos salidas, comparadas con números · 22 min

Opción B — Reparto proporcional a la venta de cada línea

-- 1) El cargo y el bruto de cada factura, una sola vez.
CREATE OR REPLACE VIEW cabecera AS
SELECT numero_factura,
       MAX(descuento_factura) + MAX(flete_despacho) AS cargo,
       COUNT(*) AS lineas,
       SUM(cantidad * precio_unitario) AS bruto
FROM ventas WHERE moneda = 'CLP' GROUP BY 1;
Las dos salidas, comparadas con números · 22 min
-- 2) Lo que le toca a cada línea de la factura de las tres líneas.
SELECT v.numero_factura, v.sku, v.linea_negocio,
       ROUND(v.cantidad * v.precio_unitario) AS venta_linea,
       ROUND(CASE WHEN c.bruto <> 0
              THEN (v.cantidad * v.precio_unitario) / c.bruto
              ELSE 1.0 / c.lineas END * c.cargo) AS cargo_asignado
FROM ventas v JOIN cabecera c USING (numero_factura)
WHERE v.moneda = 'CLP'
  AND v.numero_factura = 'F-2022-000023';
-- ELE-1004 975.520 → 62.516
-- FIJ-4003 217.664 → 13.949
-- HER-2003 1.455.588 → 93.281
Las dos salidas, comparadas con números · 22 min

La respuesta profesional, escrita en la pizarra:

Las dos salidas, comparadas con números · 22 min
Se cargan las dos tablas. fact_venta_factura guarda la verdad auditable; el reparto se calcula sobre fact_venta_linea como una medida declarada, con su regla escrita al lado. Nunca se guarda el reparto como si fuera un dato de origen.

La dimensión degenerada (últimos 6 minutos del bloque)

Pregunta a la sala: «¿numero_factura va a una dimensión?»

Se deja que discutan 60 segundos, y después las dos preguntas que lo resuelven:

Las dos salidas, comparadas con números · 22 min
  1. ¿Se filtra o se agrupa por ella? Sí, todo el tiempo.
  2. ¿Tiene atributos propios que no estén ya en otra dimensión? El cliente es de dim_cliente. La fecha es de dim_tiempo. El canal es de dim_comercial. No le queda nada.
Las dos salidas, comparadas con números · 22 min
«Un identificador sin atributos propios no merece una tabla: se queda dentro de los hechos y se llama dimensión degenerada. numero_factura es el ejemplo perfecto, y es la llave que conecta las dos tablas de hechos.»

Y el matiz que hay que decir hoy para que no muerda en el Parcial 2:

Las dos salidas, comparadas con números · 22 min
«Si mañana el ERP empieza a mandar por factura el tipo de documento, la sucursal emisora y el estado de aprobación, entonces sí: dim_factura nace con derecho propio. Una dimensión degenerada lo es hasta que deja de serlo. Por eso el modelo se revisa cuando cambia la fuente, no cuando cambia el gusto.»
La prueba de que esto no es una discusión académica · 13 min
-- 1) Cada línea, con el total de SU factura al lado.
CREATE OR REPLACE VIEW linea_clp AS
SELECT numero_factura, linea_negocio,
       cantidad * precio_unitario AS venta_bruta,
       cantidad * costo_unitario  AS costo_venta,
       descuento_factura, flete_despacho,
       SUM(cantidad * precio_unitario)
         OVER (PARTITION BY numero_factura) AS bruto_factura,
       COUNT(*)
         OVER (PARTITION BY numero_factura) AS lineas_factura
FROM ventas WHERE moneda = 'CLP';
La prueba de que esto no es una discusión académica · 13 min
-- 2) Qué parte de los cargos le toca a cada línea.
CREATE OR REPLACE VIEW reparto AS
SELECT *, CASE WHEN bruto_factura <> 0
               THEN venta_bruta / bruto_factura
               ELSE 1.0 / lineas_factura END AS cuota
FROM linea_clp;
La prueba de que esto no es una discusión académica · 13 min
-- 3) El margen por línea de negocio, de las dos maneras.
SELECT linea_negocio,
       ROUND(100.0 * (SUM(venta_bruta) - SUM(costo_venta)
         - SUM(descuento_factura) - SUM(flete_despacho))
         / SUM(venta_bruta), 2) AS margen_naive_pct,
       ROUND(100.0 * (SUM(venta_bruta) - SUM(costo_venta)
         - SUM((descuento_factura + flete_despacho) * cuota))
         / SUM(venta_bruta), 2) AS margen_repartido_pct
FROM reparto
GROUP BY linea_negocio
ORDER BY margen_repartido_pct DESC;
La prueba de que esto no es una discusión académica · 13 min
Línea de negocioMargen naiveMargen con repartoBrecha
Seguridad20,79 %32,76 %11,97 pp
Herramientas21,76 %27,05 %5,29 pp
Eléctrico8,66 %19,74 %11,08 pp
Fijaciones−13,22 %12,45 %25,67 pp

Cinco segundos de silencio en la última fila. Y la pregunta a la sala:

La prueba de que esto no es una discusión académica · 13 min
«Si eres el gerente y ves que Fijaciones pierde 13,22 % en cada peso vendido, ¿qué haces?»

Van a decir: la cierro, la reviso, cambio de proveedor. Todas razonables.

La prueba de que esto no es una discusión académica · 13 min
«La línea gana 12,45 %. La decisión de cerrar un negocio rentable no se toma por mala fe ni por mal criterio comercial: se toma porque alguien sumó una columna que no se podía sumar. Fijaciones es la más castigada porque es la línea de tickets chicos: sus líneas conviven con otras en facturas grandes y absorbe el descuento y el flete completos de facturas donde apenas participa.»
La prueba de que esto no es una discusión académica · 13 min

Los cuatro números del margen bien calculado, que se anotan y vuelven en la clase 13: Seguridad 32,8 % · Herramientas 27,1 % · Eléctrico 19,7 % · Fijaciones 12,5 %.

Carga guiada del modelo, en la máquina del estudiante · 20 min

Cada estudiante construye su propio modelo y lo verifica. Las verificaciones se ejecutan, no se asumen.

El COALESCE rescata las 21 fechas escritas dd/mm/yyyy que un CAST directo habría convertido en NULL en silencio. Es la lección de la clase 04, cobrada aquí.
Carga guiada del modelo, en la máquina del estudiante · 20 min
-- 1) La dimensión del tiempo.
CREATE OR REPLACE TABLE dim_tiempo AS
WITH f AS (
  SELECT COALESCE(TRY_STRPTIME(fecha_emision, '%Y-%m-%d'),
                  TRY_STRPTIME(fecha_emision, '%d/%m/%Y'))::DATE
           AS fecha_key
  FROM ventas
)
SELECT DISTINCT fecha_key,
       EXTRACT(year    FROM fecha_key) AS anio,
       EXTRACT(month   FROM fecha_key) AS mes,
       EXTRACT(quarter FROM fecha_key) AS trimestre
FROM f;
Carga guiada del modelo, en la máquina del estudiante · 20 min
SELECT COUNT(*) AS dias, MIN(fecha_key) AS desde,
       MAX(fecha_key) AS hasta
FROM dim_tiempo;
-- 1.032 días · 2022-01-03 → 2024-12-27
Carga guiada del modelo, en la máquina del estudiante · 20 min
-- 2) El hecho al grano LÍNEA (el grano declarado: un producto vendido en una factura)
CREATE OR REPLACE TABLE fact_venta_linea AS
SELECT numero_factura,               -- dimensión degenerada
       COALESCE(TRY_STRPTIME(fecha_emision, '%Y-%m-%d'),
                TRY_STRPTIME(fecha_emision, '%d/%m/%Y'))::DATE
         AS fecha_key,
       sku, cantidad, precio_unitario, costo_unitario,
       cantidad * precio_unitario AS venta_bruta,
       cantidad * costo_unitario  AS costo_venta
FROM ventas
WHERE moneda = 'CLP';
Carga guiada del modelo, en la máquina del estudiante · 20 min

(El hecho al grano FACTURA, fact_venta_factura, ya quedó creado en el bloque de las 21:23.)

Las dos verificaciones que se corren en sala

-- V1 · conteo cruzado: no se perdió ni se duplicó una línea
SELECT (SELECT COUNT(*) FROM ventas WHERE moneda = 'CLP')
         AS origen,
       (SELECT COUNT(*) FROM fact_venta_linea) AS hechos;
-- 5.605 = 5.605
Carga guiada del modelo, en la máquina del estudiante · 20 min
-- V3 · el cargo, contado una sola vez (la insignia del modelo)
SELECT
  (SELECT ROUND(SUM(descuento_clp) + SUM(flete_clp))
   FROM fact_venta_factura) AS cargo_una_vez,
  (SELECT ROUND(SUM(descuento_factura) + SUM(flete_despacho))
   FROM ventas WHERE moneda = 'CLP') AS cargo_plano;
-- 626.467.132  contra  1.511.313.216
Carga guiada del modelo, en la máquina del estudiante · 20 min

El modelo devuelve el número de la clase insignia

CREATE OR REPLACE VIEW total_factura AS
SELECT numero_factura, SUM(venta_bruta) AS bruto
FROM fact_venta_linea GROUP BY 1;
Carga guiada del modelo, en la máquina del estudiante · 20 min
CREATE OR REPLACE VIEW rep AS
SELECT l.venta_bruta, l.costo_venta,
       CASE WHEN t.bruto <> 0 THEN l.venta_bruta / t.bruto
            ELSE 1.0 / f.lineas END
         * (f.descuento_clp + f.flete_clp) AS cargo_linea
FROM fact_venta_linea l
JOIN total_factura t USING (numero_factura)
JOIN fact_venta_factura f USING (numero_factura);
Carga guiada del modelo, en la máquina del estudiante · 20 min
SELECT ROUND(100.0 * (SUM(venta_bruta) - SUM(costo_venta)
                      - SUM(cargo_linea))
             / SUM(venta_bruta), 2) AS margen_pct,
       ROUND(SUM(cargo_linea))      AS cargo_repartido_total
FROM rep;
-- 24,59 % · 626.467.132
Carga guiada del modelo, en la máquina del estudiante · 20 min
Ahí está la verificación más elegante del semestre: el total repartido entre las líneas (626.467.132) es exactamente el total que la empresa cobró una sola vez. Si al repartir te sobra o te falta un peso, el reparto está mal.

Y la trampa fina del CASE, dicha en 40 segundos: hay 9 facturas en pesos cuyo bruto es cero (todas sus líneas salieron a precio 0: las muestras y reposiciones de garantía, las 43 líneas de la clase 05). Sin la rama ELSE 1.0 / lineas no se puede dividir por cero, y sus fletes se pierden en silencio: el margen sube a 24,60 % y nadie se entera.

Carga guiada del modelo, en la máquina del estudiante · 20 min
«Una centésima. Y esa centésima es la diferencia entre un modelo que sabe qué hizo con cada peso y uno que redondeó el problema. Los pesos no se evaporan: se pierden en el ELSE que no escribiste.»

La elección entre A y B se declara por escrito en el notebook, ahora, en una celda de texto. Es entregable.

El experto de negocio interno, síntesis y ticket · 12 min

Los dos roles en la misma lámina, con reloj: 3 minutos cada uno.

El experto de negocio interno, síntesis y ticket · 12 min
Control de Gestión: «tipo_cambio_dia. La pregunta no es dónde lo pongo: es ¿qué es? ¿Es un dato del negocio o un parámetro del cierre?»

— Si es el tipo de cambio observado del día que publica el Banco Central, es un atributo del día: va a dim_tiempo, y sirve para todas las facturas de esa fecha.
— Si es el tipo de cambio del cierre que la empresa fija una vez al mes para valorizar, entonces no es un dato del negocio: es un parámetro contable, cambia cuando Contabilidad lo decide, y ponerlo en dim_tiempo te va a dar diferencias con el balance.

El mismo número, dos modelos distintos. Y la respuesta no está en el archivo: está en Control de Gestión.
El experto de negocio interno, síntesis y ticket · 12 min
Contabilidad: se proyecta plan_cuentas.json, dos líneas:

``
5-02-001 Fletes de despacho tipo: Costo
6-01-001 Remuneraciones fuerza de venta tipo: Gasto
``

«¿El flete de despacho es costo de venta o gasto de distribución?

En este plan de cuentas está como costo, y por eso todo lo que hemos calculado lo resta del margen bruto: 24,59 %. Si mañana Contabilidad decide que es gasto de distribución —porque es el costo de llevar el producto, no de comprarlo—, sale del margen bruto y baja a resultado operacional. El margen bruto de Austral pasa a 26,89 %.

2,3 puntos, 209.502.530 pesos, y ni una sola fila cambió. La cuenta contable decide dónde va en el modelo, y el modelo decide qué número ve el directorio.»
El experto de negocio interno, síntesis y ticket · 12 min

Y la regla del curso, otra vez, en la pizarra: una consulta SQL sin una conversación previa es una opinión con formato de tabla.

Síntesis, construida con ellos (se pregunta, ellos responden, el docente escribe):

El experto de negocio interno, síntesis y ticket · 12 min
  1. Las tres reglas, en coro: grano declarado · hechos largos y flacos, dimensiones cortas y anchas · 1:N siempre.
  2. «¿Por qué 2,60 y no 2,03?» → porque el descuento crece con el tamaño de la factura y el error tiene sesgo.
  3. «¿Cómo se reconoce un número que no es una medida?» → súmalo. Si la suma no significa nada, es un atributo.
  4. «¿Cuántas tablas de hechos tiene ahora el modelo y por qué?» → dos, una por grano. Y numero_factura es la degenerada que las conecta.
  5. «¿Qué pasa si al repartir te sobra un peso?» → el reparto está mal. Se busca antes de seguir.
El experto de negocio interno, síntesis y ticket · 12 min

Ticket TC10 (3 min, se proyecta): a) ¿Cuál de las tres reglas del modelador obliga a decidir qué hacer con el descuento? Una frase. b) Reparto proporcional o segunda tabla de hechos al grano factura: elige una para el descuento de Austral y di qué pierdes con la que descartaste. c) 1–5 y qué te falta.

Anki del día: las tres reglas · los dos factores (2,60 / 2,04) · dimensión degenerada · las cuatro verificaciones · 24,59 contra 26,89.

Pregunta que queda planteada (se escribe en la pizarra y no se responde hoy):

El experto de negocio interno, síntesis y ticket · 12 min
→ El hecho está cargado y cada fila repite el segmento, la región y la descripción del producto. ¿Cuánto cuesta esa repetición, y cuándo empieza a doler?
Clase 10 · cierre

Ticket de salida

Tres minutos. No suma nota. Sirve para armar la apertura de la próxima clase.

El notebook de esta clase:
https://gaa1104.vercel.app/notebooks/clase-10.ipynb

← → avanzar · P proyector · F pantalla completa
GAA1104 · C10 · Las reglas del modelador y los dos granos 20:30 1 / 1