Smart Narrative en Power BI: de resúmenes genéricos a narrativa de negocio real
El objeto visual Smart Narrative (Narrativa Inteligente) llegó a Power BI con la promesa de democratizar la interpretación de datos. La idea es atractiva: un cuadro de texto que se genera solo y explica las variaciones más importantes del informe. Sin embargo, en entornos de consultoría real, el resumen que genera Power BI por defecto suele ser insuficiente, errático o, lo que es peor, carente de contexto de negocio. Un directivo no necesita que el informe le diga que "las ventas han subido un 12%"; necesita saber que "las ventas han subido un 12% debido al buen comportamiento de la campaña de verano en la zona Norte, compensando la caída en retail físico".
Como consultor, mi experiencia me dice que el Smart Narrative nativo es un excelente punto de partida para prototipos rápidos, pero falla estrepitosamente en producción si no se interviene. El problema principal radica en que la IA de Power BI intenta encontrar correlaciones estadísticas que no siempre coinciden con los KPIs críticos de la empresa. Además, cuando un usuario aplica filtros cruzados que dejan una selección vacía o muy granulada, las frases automáticas suelen romperse o mostrar valores sin sentido, dañando la credibilidad del cuadro de mando.
En este artículo analizaremos cómo pasar de una narrativa automática estándar a una solución profesional basada en medidas DAX personalizadas. Veremos cómo controlar cada palabra que aparece en pantalla, cómo gestionar la ausencia de datos y por qué el control del Interaciones entre el Row Context y el Filter Context con DAX es vital para que la explicación sea coherente con lo que el usuario está viendo en sus gráficos.
El problema de la narrativa predeterminada: ¿aporta valor o es ruido?
Cuando arrastras el icono de Smart Narrative al lienzo, Power BI escanea los visuales presentes y genera un texto. Este texto es dinámico, sí, pero su estructura es rígida. El motor lingüístico busca picos, valles y tendencias, pero ignora la jerarquía de tus dimensiones. Por ejemplo, en un modelo de Retail, puede que te interese destacar el margen de contribución, pero la narrativa automática se empeña en hablar del volumen de unidades vendidas solo porque tiene una varianza estadística mayor.
Otro gran inconveniente es la localización y el tono. Aunque Microsoft ha mejorado mucho el procesamiento de lenguaje natural, las construcciones gramaticales en español a veces resultan artificiales. Además, no puedes aplicar lógica condicional compleja fácilmente dentro del cuadro de texto nativo sin acabar creando decenas de "valores dinámicos" que son difíciles de mantener a largo plazo.
Para solucionar esto, la mejor práctica en proyectos de nivel empresarial es utilizar el objeto visual de Narrativa Inteligente (o simplemente un cuadro de texto o una tarjeta de varias filas) alimentado por medidas de texto DAX. Esto nos permite:
- Controlar el tono y la terminología exacta del sector (ej. "EBITDA" en lugar de "Suma de Beneficio").
- Introducir lógica de negocio: "Si el margen es menor al 10%, muestra un aviso en el texto".
- Gestionar errores de selección múltiple que el objeto nativo ignora.
La alternativa robusta: Construir narrativa con medidas DAX
La potencia real aparece cuando combinamos funciones de agregación con funciones de texto. El objetivo es que la medida devuelva una cadena de texto (String) completa. Para ello, nos apoyamos en funciones como SELECTEDVALUE, CONCATENATEX y FORMAT. Esta última es crucial, ya que al concatenar números en un texto, perdemos el formato de moneda o porcentaje a menos que lo forcemos manualmente.
Imagina que queremos un encabezado dinámico que explique el rendimiento del producto más vendido en el periodo seleccionado. Una implementación profesional evitaría el uso de la barra de división simple para evitar errores, tal como explicamos en DIVIDE frente a la barra ‘/’: errores, infinitos y divisiones imposibles en DAX.
ResumenVentasDinámico =
VAR VentasActuales = [Total Ventas]
VAR ProductoTop = TOPN(1, ALLSELECTED(Producto[Nombre]), [Total Ventas])
VAR NombreProducto = SELECTCOLUMNS(ProductoTop, "Nombre", Producto[Nombre])
VAR PorcentajeSobreTotal =
DIVIDE(
VentasActuales,
CALCULATE([Total Ventas], ALLSELECTED(Producto))
)
RETURN
IF(
ISBLANK(VentasActuales),
"No hay datos de ventas para la selección actual.",
"El rendimiento total es de " & FORMAT(VentasActuales, "#,#€") &
". El producto líder es " & NombreProducto &
", que representa un " & FORMAT(PorcentajeSobreTotal, "0.0%") & " del total seleccionado."
)En este bloque de código, estamos asegurando que si no hay ventas, el informe no muestre un espacio en blanco o un error, sino un mensaje informativo. Además, el uso de ALLSELECTED garantiza que el cálculo respete los filtros de fecha o categoría que el usuario haya aplicado en el informe.
Uso de CONCATENATEX para selecciones múltiples
Uno de los retos más habituales es cuando el usuario selecciona varios elementos en un segmentador (Slicer). El Smart Narrative nativo suele decir "Varios valores". Con DAX, podemos listar esos valores de forma elegante:
ListaTiendasSeleccionadas =
VAR Conteo = COUNTROWS(VALUES(Tienda[Ciudad]))
VAR Lista = CONCATENATEX(VALUES(Tienda[Ciudad]), Tienda[Ciudad], ", ")
RETURN
IF(
ISFILTERED(Tienda[Ciudad]),
"Analizando las tiendas de: " & Lista & " (Total: " & Conteo & ").",
"Mostrando resultados globales de todas las ciudades."
)Gestión de excepciones: El arte de no mostrar errores cuando no hay datos
Como consultor, he visto informes que pierden toda su utilidad porque, al filtrar por un mes sin actividad, el Smart Narrative muestra mensajes como "Ventas disminuyeron un NaN%". Esto ocurre porque el motor intenta calcular variaciones sobre denominadores cero o nulos.
Para evitar esto, debemos implementar una jerarquía de comprobaciones en nuestras medidas de narrativa. Antes de lanzar el texto final, la medida debe validar si existe contexto de datos suficiente. Si tu informe utiliza modelos complejos, recuerda que esto puede afectar al rendimiento. En escenarios de gran volumen, es vital revisar Las 50 Medidas y Patrones DAX que Destruyen el Rendimiento en DirectQuery (y cómo evitarlos) para no penalizar la experiencia de usuario con medidas de texto pesadas.
| Escenario | Comportamiento Nativo | Solución DAX Recomendada |
|---|---|---|
| Sin datos seleccionados | Muestra texto vacío o genérico. | Mensaje personalizado: «Por favor, seleccione un periodo». |
| Selección múltiple (>5) | «Varios valores». | «X elementos seleccionados» o lista truncada con TOPN. |
| Cero en denominador | Muestra (Blank) o error. | Uso de DIVIDE con resultado alternativo de texto. |
| Ranking con empates | Ignora el criterio de desempate. | Lógica con RANKX y empates para precisión. |
Rendimiento y costes de computación en medidas de texto
Es un error común pensar que, como el resultado es una cadena de texto, la medida es "ligera". En realidad, para generar ese texto, Power BI debe ejecutar todos los cálculos numéricos subyacentes. Si tu medida de narrativa resume las ventas por producto, por zona y por tiempo en una sola frase, estás forzando al motor a realizar múltiples escaneos de tablas.
En modelos con arquitectura Kimball bien definida, esto no suele ser un problema. Sin embargo, si estás trabajando con tablas planas gigantescas o DAX poco optimizado, el Smart Narrative puede ser el culpable de que tu informe tarde 2 segundos más en cargar tras cada clic. Mi recomendación es medir siempre con el Performance Analyzer. Si la medida de texto tarda más que el gráfico principal, simplifica la lógica o reduce el número de cálculos dinámicos dentro del String.
Errores críticos que veo en auditorías de informes
- Hardcoding de fechas: Escribir en el texto "en 2023" en lugar de usar
SELECTEDVALUE(Calendario[Año]). Esto hace que el informe caduque visualmente en cuanto cambian los datos. - Ignorar el plural/singular: Es un detalle de calidad. No es lo mismo decir "1 tiendas seleccionadas" que "1 tienda seleccionada". Un simple
IF(Conteo = 1, ...)marca la diferencia entre un informe amateur y uno profesional. - Demasiada información: El cerebro humano procesa mal los párrafos largos en un dashboard. Si la narrativa ocupa más de un 15% del espacio visual, deja de ser un resumen para convertirse en un obstáculo.
- Falta de formato en moneda: Presentar cifras como 1250400.4 en lugar de 1,25 M€. La legibilidad es parte de la accesibilidad.
Checklist: Antes de publicar tu narrativa dinámica
- [ ] ¿He validado qué aparece cuando no hay filtros seleccionados (estado inicial)?
- [ ] ¿He comprobado que las cifras del texto coinciden exactamente con los visuales adyacentes?
- [ ] ¿He gestionado los casos de división por cero o resultados nulos?
- [ ] ¿El texto es legible para personas con daltonismo (contraste adecuado)?
- [ ] ¿He utilizado
FORMAT()para asegurar que los decimales y símbolos de moneda son correctos?
Preguntas frecuentes
¿Sustituye el Smart Narrative a una reunión de análisis?
No. El objetivo es proporcionar contexto inmediato y ahorrar tiempo en la interpretación básica. Las decisiones estratégicas profundas siguen requiriendo el análisis humano sobre los matices que la IA o el DAX no capturan.
¿Es mejor usar el visual nativo o una medida en una tarjeta?
Para informes corporativos, siempre recomiendo medidas DAX en un cuadro de texto dinámico o tarjeta. Ofrecen un control total sobre la gramática y evitan que la IA de Microsoft genere conclusiones irrelevantes o erróneas.
¿Cómo afecta esto a la accesibilidad del informe?
La narrativa dinámica es una de las mejores herramientas de accesibilidad, ya que los lectores de pantalla pueden procesar el texto mucho mejor que una matriz de números compleja. Es fundamental para cumplir con estándares de diseño inclusivo.
¿Puedo incluir saltos de línea en mi medida DAX?
Sí, puedes usar la función UNICHAR(10) para forzar saltos de línea dentro de tus medidas de texto y estructurar la información en párrafos o puntos de lista de forma limpia.

