芋の独り言

当ブログへのアクセスは当ブログのプライバシーポリシーに同意したものとみなします.

基礎の基礎

Pythonで平均とか求める. 統計量全て一度に算出するメソッドもあるけど,一個ずつやります. とはいえ,最初のはnumpyのメソッドでラクして出しますけども...

まず最初にnumpyのインポートと例題として以下のリストを定義.

>>> import numpy as np
>>> a=[1,2,3]

では求めます.

# 平均
>>> np.mean(a)
2.0
# 標準偏差の算出
>>> np.std(a)
0.816496580927726
# 平均偏差の算出
>>> def md(x:list)->float:
...     md = sum([abs(i-np.mean(x)) for i in x])/len(x)
...     return md
... 
>>> md(a)
0.6666666666666666
# 分散の算出
>>> np.var(a)
0.6666666666666666
# 不偏分散の算出
>>> def nvar(x:list)->float:
...     return sum([(i-np.mean(x))**2 for i in x])/(len(x)-1)
... 
>>> nvar(a)
1.0

例題のリストならば手計算は容易ですので以上の算出された値が 正しい(コンピュータによる計算故誤差はある程度あると思うが)ことが 分かるかと思います.

numpyのメソッドを使う際,

>>> np.array(a).mean()

っというようにnumpy配列にしてからメソッドを呼び出して算出するという書き方もできる. この後の処理でnumpy配列として使う際は事前にnumpy配列に変換してから算出するのがいいでしょうね. ただ,以上のような書き方ならば特にメリットはないかな.
ここで,ndarrayではサイズに限界があるので, データが多い場合は以上のようなarraymatrix(制限あるかもしれないけど)で変換した方が良いです.

summaxminは標準のメソッドとして用意されているのでnumpyのを使わなくても 出せますが,numpyで統一して行った方が良いかも.

あと,中央値に関してはnumpyのメソッドnp.medianで. あえて,自作するならば,

>>> np.median(a)
2.0
>>> np.median([1,4,5,8])
4.5
# メソッドを自作してみる
>>> def median(x:list)->float:
...     if len(x)%2 == 0:
...         return (x[int(len(x)/2)-1]+x[int(len(x)/2)])/2.0
...     else:
...         return x[int(len(x)/2)]
... 
>>> median(a)
2
>>> median([1,4,5,8])
4.5

っという感じかな.

参考