Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What is going on with this article?
@momeemt

Nimで統計分析が行える stats

はじめに

こんにちは。高校2年の樅山です。
今回は、Nimで統計分析が行える標準ライブラリである、statsをご紹介いたします。

この記事は、

の17日目に参加しています。

他の標準ライブラリを調べる👇

stats

statsは、統計分析を行うための基本的な機能を備えた標準ライブラリの一つです。
統計分析用のRunningStat型や、回帰分析用のRunningRegress型にデータを与えて初期化すると、その時点で様々な計算が行われ、結果を取得することができます。

statをimportする
import stats

統計分析を行う

データを与える

統計分析を行うためには、RunningStat型の可変変数を定義する必要があります。
初期化後、pushプロシージャに intfloat、またはどちらかの配列を渡すことでデータを与えることができます。

初期化する
import stats

var runningStat: RunningStat
runningStat.push @[1, 2, 3, 4, 5]

ここで、RunningStat型について説明しておきます。

RunningStat型の定義
RunningStat = object
  n*: int
  min*, max*, sum*: float
  mom1, mom2, mom3, mom4: float

object型として定義されており、nminmaxsumがフィールドとして公開されています。

データの大きさを得る

フィールドの1つである n は、データの大きさ1を保持しています。

データの大きさを得る
import stats

var runningStat: RunningStat
runningStat.push @[1, 2, 3, 4, 5]

echo runningStat.n

上のコードでは、5が出力されます。

データの最小値・最大値を得る

minはデータの最小値を、maxはデータの最大値を保持しています。

データの最小値・最大値を得る
import stats

var runningStat: RunningStat
runningStat.push @[1, 2, 3, 4, 5]

echo runningStat.min
echo runningStat.max

上のコードでは、

結果
1.0
5.0

が出力されます。

データの総和を得る

sumはデータの総和を保持しています。

データの総和を得る
import stats

var runningStat: RunningStat
runningStat.push @[1, 2, 3, 4, 5]

echo runningStat.sum

上のコードでは、15.0が出力されます。

データの平均値を計算する

meanに、RunningStat型の可変変数を渡すことで、データの平均値を返します。

データの平均値を計算する
import stats

var runningStat: RunningStat
runningStat.push @[1.2, 2.3, 3.4, 4.5, 5.6]

echo runningStat.mean

上のコードでは、3.399999999999999が出力されます。

データの分散を計算する

varianceに、RunningStat型の可変変数を渡すことで、データの分散2を返します。

データの分散を計算する
import stats

var runningStat: RunningStat
runningStat.push @[1.2, 2.3, 3.4, 4.5, 5.6]

echo runningStat.variance

上のコードでは、2.42が出力されます。

データの標準偏差を計算する

standardDeviationに、RunningStat型の可変変数を渡すことで、データの標準偏差3を返します。

データの標準偏差を計算する
import stats

var runningStat: RunningStat
runningStat.push @[1.2, 2.3, 3.4, 4.5, 5.6]

echo runningStat.standardDeviation

データの歪度を計算する

skewnessに、RunningStat型の可変変数を渡すことで、データの歪度4を返します。

データの歪度を計算する
import stats

var runningStat: RunningStat
runningStat.push @[1.2, 2.3, 3.4, 4.5, 5.6]

echo runningStat.skewness

上のコードより、歪度は 9.437069623944553e-17 であることがわかります。

データの尖度を計算する

kurtosisに、RunningStat型の可変変数を渡すことで、データの尖度5を返します。

データの尖度を計算する
import stats

var runningStat: RunningStat
runningStat.push @[1.2, 2.3, 3.4, 4.5, 5.6]

echo runningStat.kurtosis

上のコードより、尖度は -1.3 であることがわかります。

データを結合する

2つの RunningStat型のデータに +演算子を適用することで、2つのデータを結合できます。

文字列にキャストする

RunningStat型のデータに、$演算子を適用することで、文字列にキャストできます。

回帰分析を行う

回帰分析とは、あるデータの変動を、他のデータの変動によって予測する手法です。
分析を行うためのRunningRegress型は、二つのデータを同時に持ちながら計算を行います。

データを与える

回帰分析を行うには、RunningRegress型の可変変数を定義する必要があります。
初期化後、pushプロシージャに intfloat、またはどちらかの配列を渡すことでデータを与えることができます。

初期化する
import stats

var runningRegress: RunningRegress
runningRegress.push @[1, 3, 4, 6, 9, 11], @[2, 2, 4, 5, 8, 13]

ここで、RunningRegress型について説明しておきます。

RunningRegress型の定義
RunningRegress = object
  n*: int
  x_stats*: RunningStat
  y_stats*: RunningStat
  s_xy: float

object型として定義されており、nx_statsy_srarsがフィールドとして公開されています。

回帰直線の傾きを求める

slopeに、RunningRegress型の可変変数を渡すことで、回帰直線の傾き6を得ることができます。

回帰直線の傾きを求める
import stats

var runningRegress: RunningRegress
runningRegress.push @[1, 3, 4, 6, 9, 11], @[2, 2, 4, 5, 8, 13]

echo runningRegress.slope

上のコードより、回帰直線の傾きは 1.070093457943925 であることがわかります。

回帰直線のy切片を求める

interceptに、RunningRegress型の可変変数を渡すことで、回帰直線のy切片7を得ることができます。

回帰直線のy切片を求める
import stats

var runningRegress: RunningRegress
runningRegress.push @[1, 3, 4, 6, 9, 11], @[2, 2, 4, 5, 8, 13]

echo runningRegress.intercept

上のコードより、回帰直線のy切片は、-0.3971962616822422 であることがわかります。

相関係数を求める

correlationに、RunningRegress型の可変変数を渡すことで、2つのデータの相関係数8を得ることができます。

相関係数を求める
import stats

var runningRegress: RunningRegress
runningRegress.push @[1, 3, 4, 6, 9, 11], @[2, 2, 4, 5, 8, 13]

echo runningRegress.correlation

上のコードより、相関係数は 0.9562274324117989 であることがわかります。

データを結合する

2つの RunningRegress型のデータに +演算子を適用することで、2つのデータを結合できます。

文字列にキャストする

RunningRegress型のデータに、$演算子を適用することで、文字列にキャストできます。

終わりに

さらに複雑な分析を行いたい場合には、他のライブラリを用いる必要がありますが、statsモジュールを利用することで、サードパーティライブラリに依存することなく基本的な分析を行えるようです。
Pythonにあるような統計ライブラリのように充実してくれば、Nimでデータ分析を行う土壌が整ってくるかもしれませんね。


  1. データの個数を データの大きさ と呼びます。 

  2. データのばらつきを表す値を分散と呼びます。具体的には、$\frac{1}{n}((x_1-\bar{x})^2+(x_2-\bar{x})^2+(x_3-\bar{x})^2+...+(x_n-\bar{x})^2)$ で計算できます。 

  3. 分散の正の平方根である値を標準偏差と呼びます。具体的には、$\sqrt{\frac{1}{n}\sum_{i=1}^n(x_i-\overline{x})^2}$ で計算できます。 

  4. データ分布が、正規分布からどれくらい歪んでいるかを示す値を歪度と呼びます。具体的には、 $\frac{n}{(n-1)(n-2)}\sum_{i=1}^n(\frac{x_i-\overline{x}}{s})^3$ で計算できます。 

  5. データ分布が、正規分布からどれくらい尖っているかを示す値を尖度と呼びます。具体的には、 $\frac{n(n+1)}{(n-1)(n-2)(n-3)}\sum_{i=1}^n(\frac{x_i-\overline{x}}{s})^4-\frac{3(n-1)^2}{(n-2)(n-3)}$ で計算できます。 

  6. 2つのデータを元に読み取れる、傾向を表した直線を回帰直線と言います。その傾きを、相関係数 $r$ 、データ$x$の標準偏差 $s_x$ 、データ$y$の標準偏差 $s_y$ を用いて、$\frac{r\cdot s_y}{s_x}$ で計算することができます。 

  7. 回帰直線のy切片は、回帰直線の傾き $a$ 、データ$x$の平均 $\overline{x}$ 、データ$y$の平均 $\overline{y}$ を用いて、$\overline{y} - a * \overline{x}$ で計算することができます。 

  8. 直線的な関係の強さを示す値のことを、相関係数と呼びます。これは、共分散 $s_{xy}$ 、データ$x$の標準偏差 $s_x$ 、データ$y$の標準偏差 $s_y$ を用いて、$\frac{s_{xy}}{s_x * s_y}$ で計算することができます。 

5
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
momeemt
こんにちは。高校3年生の樅山です。 Nimの記事を書いています。 標準ライブラリの解説をするのが好きです。
nim-in-japan
Nim言語の日本コミュニティです。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
5
Help us understand the problem. What is going on with this article?