DAX 第六篇:統計函數(描述性統計)


統計函數用於創建聚合,對數據進行統計分析。在使用統計函數時,必須考慮到數據模型,表之間關系,數據重復等因素,一般都會搭配過濾函數實現數據的提取和分析。

統計量一般是:均值、求和、計數、最大值、最小值、求中位數、求分位數、方差和標准差等。

一,求均值

均值分為幾何均值和算術均值,幾何平均數是n個變量值連乘積的n次方根:

常用下面兩個函數計算列值的算術平均值,AVERAGE函數用於對表中的數值型的列計算均值,並且只能用於基礎表,參數的格式是table[decimal_column]:

AVERAGE(<column>)  AVERAGEX(<table>,<expression>) 

而AVERAGEX函數功能更為強大,參數table可以是基礎表,也可以是返回表值的函數;參數 expression 是關於列的表達式,函數計算表達式的均值:

=AVERAGEX(InternetSales, InternetSales[Freight]+ InternetSales[TaxAmt])

對於幾何均值,有下面兩個函數來計算:

GEOMEAN(<column>)
GEOMEANX(<table>, <expression>) 

二,求和

通過以下兩個函數來計算加和,SUM函數只能用於數值型的列,並且只能用於基礎表,參數的格式是table[decimal_column]:

SUM(<column>)
SUMX(<table>, <expression>)  

SUMX函數從表中計算每一個行的加和,參數table可以是基礎表,也可以是返回表值的函數;參數 expression 是關於列的表達式,只有數值會被加和,忽略空值,date,邏輯值或文本值:

 示例,第一個參數是過濾器返回的表值,計算[Freight]的加和:

=SUMX(FILTER(InternetSales, InternetSales[SalesTerritoryID]=5),[Freight])  

可以把SUMX函數,轉換為CALCULATE函數:

=CALCULATE( SUM(InternetSales[Freight]), FILTER(InternetSales, InternetSales[SalesTerritoryID]=5))  

三,計數

常用的計數函數有8個,函數的語法如下:

COUNT(<column>)
COUNTA(<column>)
DISTINCTCOUNT(<column>)
DISTINCTCOUNTNOBLANK (<column>)
COUNTBLANK(<column>)
COUNTROWS(<table>)
COUNTX(<table>,<expression>)
COUNTAX(<table>,<expression>)

這8個函數都用於計數,根據函數的名稱,大致分為5類:

  • 函數名稱中的 A 是指適用於Any 數據類型,不帶A的函數只能用於數值、日期和字符串,不支持邏輯類型;不統計Blank值;
  • 函數名稱帶后綴X的函數適用於基礎表和返回表值的表達式,不帶X的函數只能用於基礎表;不統計Blank值;
  • 統計Blank值
  • 統計總行數
  • 唯一值計數

下面的6個函數用於基礎表,根據列值和列的類型進行計數:

  • COUNT                  :統計列值不為Blank的行的數量,列值的類型可以是:數值、日期和字符串,不支持邏輯類型,Blank值會被忽略。
  • COUNTA                :統計列值不為Blank的行的數量,列值的類型可以是:數值、日期、字符串和邏輯類型,Blank值會被忽略。
  • COUNTBLANK      :統計列值是Blank的行的數量,列值的類型可以是任意類型,該函數只統計包含Blank值的行的數量。
  • COUNTROWS      :統計表的總行數
  • DISTINCTCOUNT :統計列值不重復的數量,列值的類型可以是任意類型,包含BLANK,在該函數中BLANK的值是相同的。
  • DISTINCTCOUNTNOBLANK :統計列值不為Blank,且不重復的數量,列值的類型可以是任意類型

下面的2個函數用於基礎表,或返回表的表達式中:

  • COUNTX           :統計列值不為Blank的行的數量,列值的類型可以是:數值、日期和字符串,不支持邏輯類型,Blank值會被忽略。
  • COUNTAX         :統計列值不為Empty(Blank)的行的數量,列值的類型可以是:數值、日期、字符串和邏輯類型,Blank值會被忽略。

注意:在COUNTAX函數中,如果列中包含表達式,而表達式的結果是空值,在這種情況下,COUNTAX函數把包含公式的列值作為非空(nonblank)看待,計數值會增加。如果COUNTAX函數的列中不包含表達式,當列值為Blank時,COUNTAX函數會忽略Blank值,計數值不會增加。

四,求最大值和最小值

通過以下6個函數來計算列值的最大值和最小值,在進行比較時,Blank(或Empty Cell)會被忽略掉。

MAX(<column>)
MAXA(<column>)
MAXX(<table>,<expression>)
MIN(<column>)
MINA(<column>)
MINX(<table>, < expression>)

1,列值比較

根據函數中是否帶后綴A,把函數分為兩類:

  • 帶后綴A的統稱為最值 - A函數,有MAXA和MINA共2個;
  • 不帶后綴A的統稱為常規最值函數,有MAX、MAXX、MIN和MINX 共4個。

這兩類函數在功能上有微小的區別:

  • 常規最值函數:不支持邏輯值的比較,但是支持數值、日期和文本的比較,忽略Blank;如果所有的列值都是Blank/Empty,導致列中沒有可用的值,那么常規最值函數最終返回Blank。
  • 最值 - A函數:不支持文本的比較,但是支持數值、日期和邏輯值的比較,忽略Blank;如果所有的列值都是Blank/Empty,導致列中沒有可用的值,那么最值 - A函數最終返回0。

注意:在比較邏輯值時,TRUE被視為1,FALSE被視為0。

2,比較兩個值

在比較兩個值時,如果參數為Blank,那么Blank被視為0:

MIN(<expression1>, <expression2>)
MAX(<expression1>, <expression2>)

五,中位數

中位數和分位數都是針對數值型進行統計的,Blank、日期、邏輯值和文本會被忽略。

MEDIAN(<column>)
MEDIANX(<table>, <expression>) 

六,分位數

k表示期望的百分位值,其中INC是指inclusive(包含),EXC是指exclusive(不包含)。后綴帶EXC的函數,參數k的取值范圍是0-1,不包含0和1;后綴帶INC的函數,參數k的取值范圍是0-1,包含0和1。

PERCENTILE.EXC(<column>, <k>) 
PERCENTILE.INC(<column>, <k>) PERCENTILEX.EXC(<table>, <expression>, k) PERCENTILEX.INC(<table>, <expression>, k)

當指定百分位數的值介於數組中的兩個值之間時,這4個函數都會進行插值。 如果無法插入指定的k百分位數,則返回錯誤。

  • 對於 INC函數,如果k不是1 /(n - 1)的倍數,則這4個函數將進行插值以確定第k個百分位數的值。
  • 對於 EXC函數,如果k不是1 /(n + 1)的倍數,則這4個函數將進行插值以確定第k個百分位數的值。

PERCENTILE.INC

計算原理是:對於數組中的每個值,都會按照從小到大的順序給定一個百分位(基於n-1),假如數組有n個數值,這n個百分位分別是:0/(n-1)、1/(n-1)、2/(n-1)……n-1/(n-1),當k值與這些百分位相同時,即k是1/(n-1)的倍數,直接返回數組中對應的數值,如果k不是 1/(n-1) 的倍數,則 PERCENTILE.INC 使用插值法來確定第k個百分點的值。

PERCENTILE.EXC

計算原理是:對於數組中的每個值,都會按照從小到大的順序給定一個百分位(基於n+1),假如數組有n個數值,這n個百分位分別是:1/(n+1)、2/(n+1)、3/(n+1)……n/(n+1),當k值與這些百分位相同時,即k是1/(n+1)的倍數,直接返回數組中對應的數值,如果k不是 1/(n+1) 的倍數,則 PERCENTILE.EXC 使用插值法來確定第k個百分點的值。

引用簡書上《 分位數計算,分析Excel中函數實現原理》的一個例子,作者是過橋0811 :

Python代碼實現:

import math

def percentile_inc(array,k):
    
    if len(array) == 0:
        return "數組不能為空"
    if k > 1 or k < 0:
        return "系數需為 0 到 1 之間的百分點值,包含 0 和 1"
    array_sort = sorted(array)

    address = (len(array_sort) - 1) * k + 1

    if address == len(array_sort):
        return array_sort[len(array_sort) - 1]

    i = int(math.modf(address)[1]) #取出整數部分
    j = math.modf(address)[0] #取出小數部分

    value = array_sort[i-1] + (array_sort[i] - array_sort[i-1]) * j
    #print("數組為:" + str(array), "系數為:" + str(k),"百分位數為:" + str(value))
    return value

def percentile_exc(array,k):
    
    if len(array) == 0:
        return "數組不能為空"
    if k >= 1 or k <= 0:
        return "系數需為 0 到 1 之間的百分點值,不包含 0 和 1 "
    array_sort = sorted(array)

    address = (len(array_sort) + 1) * k
    if address < 1:
        return "因系數過小,不能通過插入值來確定指定的百分點的值"

    i = int(math.modf(address)[1]) #取出整數部分
    j = math.modf(address)[0] #取出小數部分

    value = array_sort[i-1] + (array_sort[i] - array_sort[i-1]) * j
    #print("數組為:" + str(array), "系數為:" + str(k),"百分位數為:" + str(value))
    return value

print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],0))
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],0.01))
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],0.25))
print(percentile_inc([10,9,8,7,6,5,4,3,2,1,0],1))
print(percentile_inc([1,3,2,4],0.3)) # 官網測試數據

print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0))
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0.01))
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0.09))
print(percentile_exc([10,9,8,7,6,5,4,3,2,1,0],0.25))
print(percentile_exc([1,2,3,6,6,6,7,8,9],0.25)) # 官網測試數據
View Code

七,求方差和標准方差

標准差是方差的算術平方根,反映一個數據集的離散程度。DAX通過以下8個函數計算方差和標准方差,這些函數只適用於數值型列,並且會忽略Blank值:

VAR.S(<columnName>)
VAR.P(<columnName>)
VARX.S(<table>, <expression>)
VARX.P(<table>, <expression>)

STDEV.S(<ColumnName>)
STDEV.P(<ColumnName>)
STDEVX.S(<table>, <expression>)
STDEVX.P(<table>, <expression>)

根據函數后綴的不同,可以把函數分為兩類:后綴為P表示返回整個總體的方差或標准差,后綴為S表示返回樣本總體的方差或標准差。

對於方差來說,整個總體和樣本總體的計算公式是不同的:

  • 整個總體的方差計算公式是:∑(x - x̃)²/n
  • 樣本總體的方差計算公式是:∑(x - x̃)²/(n-1)

注釋:  是 數據的均值,n是數據的數量

 

 

 

 

參考文檔:

Statistical functions


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM