martes, 7 de febrero de 2017

Qué es Inteligencia de Negocios (BI)

La Inteligencia de Negocios (Business Intelligence BI) la podríamos definir como una combinación de tecnología, herramientas y procesos que permitirán transformar los datos de la empresa en información y esta a su vez en conocimiento dirigido a un plan o estrategia comercial.

La mayoría de las empresas poseen software ERP, a través de los cuales gestionan sus procesos administrativos, nómina, contabilidad, producción, distribución, etc.

Pero esta data esta dispersa, en forma de documentos. Es cierto que al final del día podemos ver el total de ventas, cuanto fue al banco, etc. Pero para definir una estrategia de negocios, esto no es suficiente.

Allí es cuando se aplica la BI.

En que consiste la arquitectura de la BI?

Normalmente la data puede estar dispersa. Puede estar en una base de datos, pero eso no garantiza que esta en la forma en que podemos analizarla fácilmente.

Puede estar de varias maneras en la empresa: Base de datos, archivos de texto, hojas de excel, etc.

El consultor deberá entonces efectuar varios procesos para llegar al objetivo final.



El primero es obtener la data de los diferentes orígenes, procesarla, limpiarla. Dependiendo del volumen se recurre a un almacenamiento temporal (DataWareHouse) y luego usando herramientas de visualización de procede a convertirla en informacion.

Estas herramientas permiten ver la data de forma grafica o de reporte, pero con filtros interactivos que permiten evaluar diferentes escenarios.


Esto lleva a que los diferentes niveles de gerencia hagan sus evaluaciones que permitan diseñar diferentes estrategias de negocios según los análisis realizados.




Rafael Rangel


miércoles, 25 de enero de 2017

Títulos de gráficos dinámicos en Power Bi

Como probablemente sabrá, gráficas y muchas otras visualizaciones en Power BI tiene títulos con texto estático. Puede hacerlo seleccionando la gráfica, ir a la pestaña de FORMATO y cambiar el titulo en las propiedades del gráfico. 
image
Pero que sucede si desea que el título cambie en función de los seleccionado? Por ejemplo puede usar slicers o filtros para permitir al usuario seleccionar días de la semana. Aqui querria un titulo que muestre que dia de la semana selecciono; esto podria ser particularmente importante si el reporte usa filtros o si el reporte va a ser impreso. Desafortunadamente  la función integrada del texto del titulo no puede ser utilizada para mostrar valores dinamicos, pero en este blog mostraremos como resolver esto utilizando DAX.
Este es un ejemplo de un reporte que contiene un titulo de grafico dinamico:
image
Usando DATA de una base de datos Adventure Works (DW) se ha creado un modelo de datos simple que contiene una tabla de una dimensión llamada DimDate y una tabla de datos llamada FactInternetSales; DimDate contiene un campo llamado EnglishDayNameOfWeek y contiene los nombres de los días de la semana y el reporte contiene una columna que muestra una medida de ventas desglosada por día de la semana. Tambien hay un filtro donde el usuario selecciona uno o mas días de la semana y al tope esta el titulo que contiene la lista de los días seleccionados en el filtro y mostrados en el gráfico.

Hay dos partes de la solución. la primera es crear una medida que retornara el texto necesario para el titulo del grafico, y se basa en la función DAX ConcatenateX(). Esta es la medida:
1
2
3
4
5
6
7
Title =
"Sales Amount for "
    & CONCATENATEX (
        VALUES ( 'DimDate'[EnglishDayNameOfWeek] ),
        'DimDate'[EnglishDayNameOfWeek],
        ", "
    )
Aquí la función (Values() es usada para retornar una tabla conteniendo todos los días seleccionados de la semana, y se pasan a la función CancatenateX() para obtener un texto que contenga la lista de los nombres de los días separados por coma(,).

La segunda parte maneja como mostrar el valor retornado por la medida. En el reporte de arriba se utiliza una Tarjeta (Card), y se le pasa la medida en el area de campo (field) y se apaga la Etiqueta. De manera que solo muestre la medida.
image
image
Y esto es todo lo que se necesita para recrear el reporte de arriba.

Se puede hacer mejor!. En vez de una lista delimitada por comas (,)  de los nombres de los dias seria mejor si podemos cambiar la ultima coma en la lista por un "and".
image
También, si todos los nombres de los días, seria bueno no mostrar el nombre del dia mas largo pero muestra algunos textos por defecto en vez:image
Aqui unas medidas en DAX que hace esto:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Title2 =
VAR SelectedDays =
    VALUES ( 'DimDate'[EnglishDayNameOfWeek] )
VAR NumberOfSelectedDays =
    COUNTROWS ( SelectedDays )
VAR NumberOfPossibleDays =
    COUNTROWS ( ALL ( 'DimDate'[EnglishDayNameOfWeek] ) )
VAR AllButLastSelectedDay =
    TOPN ( NumberOfSelectedDays - 1, SelectedDays )
VAR LastSelectedDay =
    EXCEPT ( SelectedDays, AllButLastSelectedDay )
RETURN
    "Sales Amount "
        & IF (
            NumberOfSelectedDays = NumberOfPossibleDays,
            "By Day Of Week",
            "For "
                & IF (
                    NumberOfSelectedDays = 1,
                    "",
                    CONCATENATEX (
                       AllButLastSelectedDay,
                       'DimDate'[EnglishDayNameOfWeek],
                       ", " )
                        & " And "
                )
                & LastSelectedDay
        )
Usamos una serie de variables DAX para hacer el codigo mas legible, y este es la medida:
Si el número de dias seleccionado es el mismo del total del numero de días posibles, y retorne el texto "Por Día de la Semana", de otra forma

  • Si dos o mas dias han sido seleccionados, entonces retorna una lista delimitada por comas conteniendo solo los dias seleccionados  (Use TopN()) para obtener la tabla de los seleccionados) mas el "Y" al final. Si solo un dia ha sido seleccionado, retornara una cadena vacia, entonces
  • concatenar the ultimo dia seleccionado al texto regresado por el paso previo. Use la funcion Except() para encontrar el dia que fue excluido por el TOPN() en el paso previo.