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変数の基本統計量
・相関係数
公式:
# 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