Fork me on GitHub

役立ちぬ開発史、それはただのブログ

覚えておくといい、ブログの時代は終わる。いつかその内、きっとたぶん…

統計学の問題をSwiftで解いてみる。(偏差平方根、分散、標準偏差)

| Comments

 社内で統計熱があり、「入門 統計学 −検定から多変量解析・実験計画法まで−」を購入しました。統計学をこれまで学んだことはなく、学生時代にT検定、P検定を少しやったぐらいで、これを気に学習してみようと思います。

Swiftで偏差平方根と分散、標準偏差を計算してみた

 統計ではPythonやRを使う人が多いですが、iOSアプリエンジニアとして働いているプライドで、Swiftを使って解いていきました。なるべくライブラリを使わないで、どこまで出来るかに挑戦しました。PlayGroundで解いています。

 本を読んでみて、章末問題で出された問題をプログラムで解いてみようと思います。2章の章末問題に出てきた問題で、標準化してくださいっとありましたが、久しぶりの数学とSwiftでのコードの書き方に手こずり、偏差平方根と分散、標準偏差までで集中力がなくなりました。

 本の中で用意されていたデータは以下の2つでした。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 農家の収入
let farmer = [
400, 15, 480, 993, 600,
150, 115, 50, 0, 130,
3000, 500, 200, 55, 2200,
1, 900, 1000, 450, 400
]

// 農家の耕地面積
let area = [
60, 30, 365, 190, 136,
15, 37, 100, 170, 70,
783, 560, 50, 35, 595,
200, 300, 356, 155, 250
]

 このデータを使って、偏差平方和の求めるコードがこれ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let farmerAve = farmer.reduce(0, combine: { $0 + $1 }) / farmer.count
let areaAve = area.reduce(0, combine: { $0 + $1 }) / area.count

print("農家収入の平均", farmerAve)//581
print("耕地面積の平均", areaAve)//222

let mapFarmerMultiply = { $0 - farmerAve }
let mapAreaMultiply = { $0 - areaAve }

var farmerSumOfSquare = farmer.map(mapFarmerMultiply).reduce(0, combine: { $0 + $1 })
farmerSumOfSquare *= farmerSumOfSquare
var areaSumOfSquare = area.map(mapAreaMultiply).reduce(0, combine: { $0 + $1 })
areaSumOfSquare *= areaSumOfSquare

print("農家収入の偏差平方和", farmerSumOfSquare)//361
print("耕地面積の偏差平方和", areaSumOfSquare)//289

 平均を先に求めて、各データの平均からの移動距離を求めたら、その合計を取り、二乗します。

 二乗する関数がSwiftにはないのか、少し調べて出てこなかったので、'*='してしまいました。知っている方がいたら教えて下さい。次に分散の求め方です。  

1
2
3
4
5
let farmerVariance = farmerSumOfSquare / farmer.count
let areaVariance = areaSumOfSquare / area.count

print("農家収入の分散", farmerVariance)//18
print("耕地面積の分散", areaVariance)//14

 偏差平方根をデータ数で割れば求められます。分散まで出せたら、標準偏差は簡単です。

1
2
3
4
5
let farmerSquare = sqrt(Double(farmerVariance))
let areaSquare = sqrt(Double(areaVariance))

print("農家収入の標準偏差", farmerSquare)//4.242640687119285
print("耕地面積の標準偏差", areaSquare)//3.741657386773941

 分散の値をルートで求めたら算出できます。

 今回は以上です。また時間があるときに、計算してみようと思います。

Comments