Panama Power BI User Group

Please login or click SIGN UP FOR FREE to create your PowerPlatformUG account to join this user group.

Regresion Lineal Simple con DAX en Power BI

  • 1.  Regresion Lineal Simple con DAX en Power BI

    Top Contributor
    Posted Jul 18, 2018 10:48 AM

    En este articulo voy a desarrollar como aplicar un modelo de Regresion Lineal simple (univariable) en Power BI, usando DAX.

    No es la intencion de este documento explicar como se usa o para que sirve un modelo de regresion lineal, unicamente explicar como se puede desarrollar en Power BI de una manera sencilla.

    DAX comparte muchas funciones de Excel, y entre ellas SLOPE y INTERCEPT; funciones necesarias para desarrollar un modelo de regresion lineal.

    El principal beneficio de usar DAX para regresion lineal es que no se almacena en memoria y se carga muy rapido. Lo que es muy beneficioso cuando se trabaja con bases de datos o gran cantidad de datos en memoria.

    Vamos a desarrollar 2 casos en los que usar Regresion Lineal:

    i)                  Regresion Lineal de serie temporal (la variable independiente es temporal); y

    ii)                Regresion Lineal simple (entre 2 variables continuas)

    Regresion Lineal de Serie Temporal

    Para llevar a cabo este analisis, es necesario tener un dataset de una serie temporal y variables continuas (numericas) para analizar. Imagine un reporte de ventas por dias, inventarios, costos, gastos, cotizaciones de precios, etc…

    La serie temporal ira ubicada en el eje X, y la variable objetivo en el eje Y.

    Lo primero que necesitamos hacer esc rear una medida (measure) con nuestra variable continua que queremos analizar. De esta manera agregamos el valor por columna.

    Por ejemplo, si temenos una columna de ventas, la medida seria:

    Medida Y = SUMX('Tabla', Tabla[Ventas])

    Una vez tengamos nuestra medida sobre la variable objeto de analisis, creamos la medida con la formulacion de la regresion lineal de serie temporal: 

    Regresion Lineal de Serie Temporal =

    VAR Known =

       FILTER (

           SELECTCOLUMNS (

               ALLSELECTED ( 'Tabla'[Fecha] ),

               "Known[X]", 'Tabla'[Fecha],

               "Known[Y]", [Medida Y]

           ),

           AND (

               NOT ( ISBLANK ( Known[X] ) ),

               NOT ( ISBLANK ( Known[Y] ) )

           )

       )

    VAR Count_Items =

       COUNTROWS ( Known )

    VAR Sum_X =

       SUMX ( Known, Known[X] )

    VAR Sum_X2 =

       SUMX ( Known, Known[X] ^ 2 )

    VAR Sum_Y =

       SUMX ( Known, Known[Y] )

    VAR Sum_XY =

       SUMX ( Known, Known[X] * Known[Y] )

    VAR Average_X =

       AVERAGEX ( Known, Known[X] )

    VAR Average_Y =

       AVERAGEX ( Known, Known[Y] )

    VAR Slope =

       DIVIDE (

           Count_Items * Sum_XY - Sum_X * Sum_Y,

           Count_Items * Sum_X2 - Sum_X ^ 2

       )

    VAR Intercept =

       Average_Y - Slope * Average_X

    RETURN

       SUMX (

           DISTINCT ( 'Tabla'[Fecha] ),

           Intercept + Slope * 'Tabla'[Fecha]

       )

    Sustituya los campos en negrita con los datos de su tabla y su analisis, copie y pegue el codigo DAX en el campo de la medida.

    Una vez realizado, puede usar un grafico de linea (line chart) para mostrar los datos, como por ejemplo:

    Algo que se me ocurrio cuando hice esto fue crear un abanda de +/- 5% sobre la linea de regresion lineal, lo que me permitio estudiar la concentracion de datos dentro y fuera de la banda.

    Lo que hice fue crear 2 medidas agregando el factor de la banda, de esta manera:

    Reg Lin +5% = Regresion Lineal de Serie Temporal * 1.05

    Reg Lin -5% = Regresion Lineal de Serie Temporal * 0.95

    Este fue el resultado:

    Regresion Lineal Simple

    Para este caso, necesitamos hacer algunas cosas mas sobre el ejemplo anterior.

    Lo primero es usar el campo (o columna) de categoria que une o vincula las 2 medidas que queremos analizar.

    Seguidamente, necesitamos crear 2 medidas, una para cada una de las variables (continuas), donde 1 ira al Eje X y otra al Eje Y.

    Una vez hecho lo anterior, cree una nueva medida con el siguiente codigo DAX:

    Regresion Lineal Simple =

    VAR Known =

       FILTER (

           SELECTCOLUMNS (

               ALLSELECTED ( Tabla[Columna] ),

               "Known[X]", [Medida X],

               "Known[Y]", [Medida Y]

           ),

           AND (

               NOT ( ISBLANK ( Known[X] ) ),

               NOT ( ISBLANK ( Known[Y] ) )

           )

       )

    VAR Count_Items =

       COUNTROWS ( Known )

    VAR Sum_X =

       SUMX ( Known, Known[X] )

    VAR Sum_X2 =

       SUMX ( Known, Known[X] ^ 2 )

    VAR Sum_Y =

       SUMX ( Known, Known[Y] )

    VAR Sum_XY =

       SUMX ( Known, Known[X] * Known[Y] )

    VAR Average_X =

       AVERAGEX ( Known, Known[X] )

    VAR Average_Y =

       AVERAGEX ( Known, Known[Y] )

    VAR Slope =

       DIVIDE (

           Count_Items * Sum_XY - Sum_X * Sum_Y,

           Count_Items * Sum_X2 - Sum_X ^ 2

       )

    VAR Intercept =

       Average_Y - Slope * Average_X

    RETURN

       Intercept + Slope * [Medida X]

    Sustituya los campos coloreados con sus medidas y campos, y copie / pegue el codigo DAX en el campo de la medida.

    Aqui tiene un ejemplo de uso.

    Tenemos una tabla de datos con la siguiente estructura:

    Y despues de aplicar la formulacion, este es el resultado:

    Espero que les haya sido de utilidad y que puedan aplicarlo a sus analisis.

    Por cierto, se atreven a hacer una regresion lineal multivariable? Y que tal una Regresion Logistica?

    Un saludo



    ------------------------------
    Pablo Moreno
    Data Intelligence Engineer
    Dell Technologies
    Panama
    ------------------------------