Up

1変量順序統計量(四分位数、中央値)

 

順序統計量に関わる計算(四分位数、中央値など)を行うプログラムOneVarOrd.pyを、まず、クラス型の宣言を用いない形で以下のように作成した。

なお、統計についての解説は、岡本安晴「データ分析のための統計学入門」を参照されたい。

=============  OneVarOrd.py  ===================

data = [8, 5, 7, 6]

 

def CalcQ( p, n, data ):

    v = 0.0

    pos = 0.5 + p * n

    if pos <= 1:

        v = data[0]

    elif pos >= n:

        v = data[n - 1]

    else:

        j = int(pos)

        w1 = pos - j

        w2 = 1.0 - w1

        v = w2 * data[j - 1] + w1 * data[j]

    return v

       

 

n = len(data)

for i in range(0, n - 1):

    k = i

    for j in range(i + 1, n):

        if (data[j] < data[k]):

            k = j

    if k > i:

        data[k], data[i] = data[i], data[k]

 

print(data)

 

min = data[0]

max = data[n - 1]

Q1 = CalcQ(0.25, n, data)

Med = CalcQ(0.5, n, data)

Q3 = CalcQ(0.75, n, data)

print("\nMin = %f"%min)

print("Q1  = %f"%Q1)

print("Med = %f"%Med)

print("Q3  = %f"%Q3)

print("Max = %f"%max)

=========================================

 

データは、リストdataに設定されている。四分位数などは、順序統計量をに内分する点の値を重み付き平均値で求めている(岡本安晴(2009)「データ分析のための統計学入門」おうふう、p.53)。プログラムの実行結果は図1のようになる。

図1

 

上のプログラムOneVarOrd.pyにおいて、順序統計量の計算部分をクラス型CalcOrdStatとしてまとめたものが次のプログラムOneVarOrdC.pyである。

 

=================  OneVarOrdC.py  =======================

class CalcOrdStat:

    def __init__(self, data):

        self.data = data

       

    def CalcQ( self, p ):

        v = 0.0

        pos = 0.5 + p * self.n

        if pos <= 1:

            v = self.data[0]

        elif pos >= self.n:

            v = self.data[self.n - 1]

        else:

            j = int(pos)

            w1 = pos - j

            w2 = 1.0 - w1

            v = w2 * self.data[j - 1] + w1 * self.data[j]

        return v

 

    def calc(self):

        self.n = len(self.data)

        for i in range(0, self.n - 1):

            k = i

            for j in range(i + 1, self.n):

                if (self.data[j] < self.data[k]):

                    k = j

            if k > i:

                self.data[k], self.data[i] = self.data[i], self.data[k]

   

        print(self.data)

 

        min = self.data[0]

        max = self.data[self.n - 1]

        Q1 = self.CalcQ(0.25)

        Med = self.CalcQ(0.5)

        Q3 = self.CalcQ(0.75)

 

        return min, Q1, Med, Q3, max

 

data = [8, 5, 7, 6]

os = CalcOrdStat(data)

min, Q1, Med, Q3, max = os.calc()

print("\nMin = %f"%min)

print("Q1  = %f"%Q1)

print("Med = %f"%Med)

print("Q3  = %f"%Q3)

print("Max = %f"%max)

=========================================

 

実行結果は、図2に示されるように、OneVarOrg.pyの場合(図1)と同じである。

図2

 

上の2つのプログラムは圧縮ファイルOneVarOrdPrg.zipにまとめた。

 

Up