PowerBI DAX 区间分组通用模式及正态分布曲线

2019-09-23 19:25:10 浏览数 (1)

先看图吧:

该案例有三大亮点:

  • PowerBI DAX 如何描绘正态分布
  • 如何创建通用的区间分组模式
  • 如何将区间划分颜色显示

通用区间分组模板

在我们的很多培训中,都给出了商业智能的独有见解,其中一个重要特性就是必须:化无限为有限分类讨论 便是一种通用思想。(分类讨论 是来自初高中的数学基础教育的非常基本的思想)而 等步长分组,就是将无限化为有限的常用做法,虽然 PowerBI 在可视化的界面给出了分组的点击实现以提供给小白使用,然而其存在很多鸡肋。例如:区间名称是无法自定义的。

于是,我们需要一种自主的建立区间的方法,这里给出设计模式。

先看我们需要的:

没错,我们需要这种可以自己定义区间名称及自动生成区间的方法。

下面给出模板:

代码语言:javascript复制

RangeTemplate =
// 区间模板 V1.0
// 作者:BI佐罗
// 最后更新:2019.05.01
// 描述:
// 生成区间表
// 输入:
// - 区间整体左边界值,比左边界更小的认为是其他部分
// - 区间整体右边界值,比右边界更大的认为是其他部分
// - 区间分段数,如:0到100,分成10段,则步长为10
// - 边界条件 "[)" 或 "(]" 分别表示是否包括边界值的方式
VAR LeftNumber = 0
VAR RightNumber = 100
VAR BoxNumber = 10
VAR RangeOption =
    BLANK () // "[)" "(]"
// 高级设置
// 如果需要更多显示上的自定义方式,则使用本部分
VAR LeftPartName =
    BLANK () // "小于0"
VAR RightPartName =
    BLANK () // "大于100"
VAR RangeLeftWord =
    BLANK () // "" 
VAR RangeRightWord =
    BLANK () // ""
VAR RangeConcatWord =
    BLANK () // " ~ "
// 注意
// - 步长 = ( 右值 - 左值 ) / 箱数,如步长不是整数,将取整,且区间将按照实际来划分。例如:0,100划分11箱,则最大值实际是99而不是100。
// 以下内容请勿修改
VAR Step =
    INT ( ( RightNumber - LeftNumber ) / BoxNumber )
VAR RightNumberActual = LeftNumber   Step * BoxNumber // 实际右端点
RETURN
    VAR LeftPart =
        ROW (
            "BoxNumber", 0,
            "LeftValue", - 1 / 0,
            "RightValue", LeftNumber,
            "RangeName", IF (
                ISBLANK ( LeftPartName ),
                IF (
                    RangeOption = "(]",
                    "≤" & LeftNumber,
                    "<" & LeftNumber
                ),
                LeftPartName
            )
        )
    VAR MiddlePart =
        ADDCOLUMNS (
            SELECTCOLUMNS (
                GENERATESERIES (
                    1,
                    BoxNumber
                ),
                "BoxNumber", [Value]
            ),
            "LeftValue", LeftNumber   ( [BoxNumber] - 1 ) * Step,
            "RightValue", LeftNumber   ( [BoxNumber] - 1 ) * Step   Step,
            "RangeName", IF (
                RangeOption = "(]",
                "(",
                IF (
                    ISBLANK ( RangeLeftWord ),
                    "[",
                    RangeLeftWord
                )
            ) & ( LeftNumber   ( [BoxNumber] - 1 ) * Step )
                & IF (
                    ISBLANK ( RangeConcatWord ),
                    ",",
                    RangeConcatWord
                ) & ( LeftNumber   ( [BoxNumber] - 1 ) * Step   Step )
                & IF (
                    RangeOption = "(]",
                    "]",
                    IF (
                        ISBLANK ( RangeRightWord ),
                        ")",
                        RangeRightWord
                    )
                )
        )
    VAR RightPart =
        ROW (
            "BoxNumber", BoxNumber   1,
            "LeftValue", RightNumberActual,
            "RightValue", 1 / 0,
            "RangeName", IF (
                ISBLANK ( RightPartName ),
                IF (
                    RangeOption = "(]",
                    ">" & RightNumberActual,
                    "≥" & RightNumberActual
                ),
                RightPartName
            )
        )
    RETURN
        UNION (
            LeftPart,
            MiddlePart,
            RightPart
        )

直接拷贝上述DAX进入PowerBI便可以直接进行分组区间的生成。

正态分布随机数

正态分布是高中数学统计学的基本知识,我们观察一些数据点是否构成类似正态分布的特点以进一步分析它们的特点。

在学习过程中,我们需要能够模拟正态分布的点,有很多用途,问题是如何产生正态分布的随机点呢?

这里采用:Box–Muller 变换( Box–Muller transform ,自行参见维基百科)

代码语言:javascript复制

RandomNumbers =
ADDCOLUMNS (
    ADDCOLUMNS (
        SELECTCOLUMNS (
            GENERATESERIES (
                1,
                100000
            ),
            "ID", [Value]
        ),
        "U1", RAND (),
        "U2", RAND ()
    ),
    "N-Rand", (
        SQRT (
            LN ( [U1] ) * ( -2 )
        )
            * COS (
                2
                    * PI () * [U2]
            )
    ) * 100
)

这里随机产生10W个符合正态分布的数字,这里的100为放大倍数,使随机数的分布更容易被观察。

绘制正态分布曲线

这里需要特别提到的是,绘制的曲线应该可以动态的选择可视化的区间,为此我们创建一个度量值如下:

代码语言:javascript复制

Numbers =
VAR X =
    COUNTROWS (
        FILTER (
            RandomNumbers,
            [N-Rand]
                >= SELECTEDVALUE ( Range[LeftValue] )
                && [N-Rand]
                    < SELECTEDVALUE ( Range[RightValue] )
        )
    )
VAR XLeft =
    MIN ( 'VarX'[Item] )
VAR XRight =
    MAX ( 'VarX'[Item] )
RETURN
    SWITCH (
        SELECTEDVALUE ( RedGreenLegend[Item] ),
        "Red", IF (
            MIN ( Range[LeftValue] ) > XRight
                || MAX ( Range[RightValue] ) < XLeft,
            X
        ),
        "Green", IF (
            MIN ( Range[LeftValue] ) <= XRight
                && MAX ( Range[RightValue] ) >= XLeft,
            X
        ),
        BLANK ()
    )

得到结果:

正态分布有极其广泛的实际背景,生产与科学实验中很多随机变量的概率分布都可以近似地用正态分布来描述。关于正态分布的神奇,我们只能这样来说明:

神说, 要有正态分布, 就有了正态分布。 神看正态分布是好的, 就让随机误差就服从了正态分布。

仅此而已。PowerBI DAX 给了我们用可视化的方法窥测神意的方法。

总结

本文说了好几件重要的事:

  • 等距离分组区间的通用构造模式
  • 正态分布随机数的产生
  • PowerBI DAX 动态区间观察正态分布曲线

希望大家玩得开心。

注意:

订阅会员自动更新,非订阅会员如需获得源文件,分享转发2小时候截图私信。本设计模式已并入《PowerBI DAX 数据建模设计思想大全》中。预览:

我们将不断整合设计模式及模板进入,私信进一步了解。

成为 PowerBI 专家

0 人点赞