AT's Blog

趣味のプログラミング、ギター、音楽とかとか

Python3でリストの平均値・分散・標準偏差を計算するコードを書いてみた

Introduction

  • 表題のとおり、リストの平均値・分散・標準偏差を計算するコードを書いてみました。
  • 勉強のためのコーディングです。実用目的ならNumpyを利用すべきかと思います。
  • 組み込み関数やリスト内包表記、クラスの導入などいろいろ試してみました。

コードと実行結果

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

class Analystic:
    def __init__(self):
        pass
    
    def average(self, ls):
        return(sum(ls)/len(ls))

    def dispersion(self, ls):
        ave = self.average(ls)

        return(sum([(x-ave)**2 for x in ls]) / len(ls))

    def stddev(self, ls):
        return(self.dispersion(ls)**0.5)

def main():
    ls = [4,5,6]

    a = Analystic()
    print(a.average(ls))
    print(a.dispersion(ls))
    print(a.stddev(ls))
    
if __name__=='__main__':
    main()
5.0
0.6666666666666666
0.816496580927726

コードの説明

Analystic.average

  • ここでは平均値はリストの総和÷リストの要素数として計算できます。
  • 組み込み関数sum()で総和を、len()で要素数を求めています。
  • 一時変数やループを使わずに、サクッと1行で書くことができました(気持ちいい!)

Analystic.dispersion

  • リスト内包表記で(各要素数-平均値)の2乗としたリストを生成し、sum()で総和を取っています。
  • 一時変数aveを使用した方が、リスト内包表記中でaverage()を実行するよりも、私の環境では10msほど実行時間が早かったです(MacBook Pro, 2.7 GHz Intel Core i5, 16GBメモリ)

Analystic.stddev

  • 単純にdispersion()の結果の平方根を取っています。

感想

  • わりとシンプルなコードが書けたのではないかと思います。
  • 私のようなプログラミング素人でも、サクサクと気持ちよくコードが書けるのもPythonの魅力のひとつではないでしょうか。
  • Numpy関数で同じことをした場合の実行時間の比較もやってみたいです(宿題)