Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

pythonで統計

pythonを使って統計処理をします。
 
○1変数の基本統計量
素数
平均mean
範囲
最頻値mode
中央値median
分散variance
標準偏差standard deviation

# -*- coding: utf-8 -*-

from collections import Counter

def mean(seq):
    return sum(seq) / len(seq)    # 平均=合計/要素数

def range_(seq):
    return min(seq), max(seq)     # 範囲:(最小値, 最大値)

def mode(seq):
    c =Counter(seq).most_common() # (要素, 頻度)というタプルの頻度順リスト
    max_f = c[0][1]               # c[0]:最頻出要素
    modes = filter(lambda x:x[1]==max_f, c) # 頻度1位を全て抜き出す
    return [i[0] for i in modes]  # 値のみをリスト内包表記にして返す
             
def median(seq):
    s = sorted(seq)
    if len(s) % 2 == 0:          # 要素が偶数個なら2つの平均
        return (s[len(s) // 2] + s[(len(s) // 2) - 1]) / 2
    else:
        return s[len(s) // 2]    # 要素が奇数個なら中央の値

def sigma(seq):                  # 分散
    m = mean(seq)
    total = sum(map(lambda x:(x - m)**2, seq))
    return total / len(seq)

def sd(seq):
    return sigma(seq) ** 0.5     # 標準偏差=sqrt(分散)

def stat(seq):
    if len(seq) == 0:
        print("要素がありません")
    else:
        print("要素数:", len(seq))
        print("平均:", round(mean(seq), 2)) # 小数第2位までで表示
        print("範囲:", range_(seq))
        print("最頻値:", *mode(seq))
        print("中央値:", median(seq))    
        print("分散:", round(sigma(seq), 2))
        print("標準偏差:", round(sd(seq), 2))

list1 = [100, 60, 50, 70, 100]  # タプルでもOK
stat(list1)

# 要素数: 5
# 平均: 76.0
# 範囲: (50, 100)
# 最頻値: 100
# 中央値: 70
# 分散: 424.0
# 標準偏差: 20.59

 
○2変数の基本統計量
相関係数
公式:f:id:rare_Remrin:20170505165448p:plain

# correlation coefficient
def corr(x, y):
    if len(x) != len(y):
        return "different length"
    sx = sum(x)
    sy = sum(y)
    sx2 = sum(map(lambda x:x**2, x))
    sy2 = sum(map(lambda x:x**2, y))
    sxy = sum(map((lambda x, y:x*y), x, y))
    n = len(x)
    try:
        return (n*sxy-sx*sy)/((n*sx2-sx**2)*(n*sy2-sy**2))**0.5
    except:
        return 0
    
x = [1, 2, 3]
y = [5, 5, 6]
print("相関係数:", corr(x, y)) # 相関係数: 0.8660254037844387

 
pythonでの乱数についてはこちら