min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

bash 引数の分散を求めるスクリプト

予算の関係で将来の獲得件数の予測を立てる仕事が最近あり。夜中まで大変な思いをしたので、経験したことを形にしておきたい。

 

本屋に寄ったら「数学は演繹、統計は帰納。アプローチが違う」と書いた本があり。目から鱗な感じ。そうか。予測を立てるには数学じゃなくて統計学が必要なわけか。

 

 

 

同じ作者の統計の本から読んでみることにする。

f:id:min117:20201024101855j:plain

「平均」の次の「分散」のあたりから理解が怪しくなってくる。

 

要は「それぞれのデータが全体の平均値とどれくらい離れているのか?が知りたくて、それぞれの値の平均値との差をとって、正負反転するために二乗する」「それらの差を積み上げて、データの個数で割って平均とったら、平均からのズレってどんくらいあるの?が分かる」と。そういう話だろうと思った。

 

これならbashのループですぐ実装できる。引数にとった数字の「分散」を求めるスクリプト 。こうなる。

$ ./my_statics_bunsan.sh  7 3 8 1 11 6 4 3 11 6

 f:id:min117:20201024105954g:plain

 

ソースはこれ。

f:id:min117:20201024110756p:plain

f:id:min117:20201024110827p:plain

 

コピペ用

#!/bin/bash

 

shopt -s expand_aliases

source ~/.bashrc

 

mydate=`date +"%Y%m%d_%H%M%S"`

mypath=`pwd`

 

echo $mydate

 

echo '「分散」を求める'

echo '-----------------------'

echo $0 data.csv

echo '-----------------------'

echo '1 引数の平均を求める'

echo '  1+2+3+4+5 /5 = 3'

echo ''

echo '2 引数と平均の差を求める'

echo '  3 -1 = 2'

echo '  3 -2 = 1'

echo '  3 -3 = 0'

echo '  3 -4 = -1'

echo '  3 -5 = -2'

echo ''

echo '3 それぞれを二乗する'

echo '  2 * 2 = 4'

echo '  1 * 1 = 1'

echo '  0 * 0 = 0'

echo '  -1 * -1 = 1'

echo '  -2 * -2 = 4'

echo ''

echo '4 二乗した値の平均をとる'

echo '  (4 +1 +0 +1 +4) /5'

echo ''

echo 'それが「分散」'

echo '----------------------------'

sleep 15

clear

 

if [[ $# -lt 1 ]]

then

    echo '===================='

    echo '引数不足 最低1個必要'

    #echo '整数を入力してください'

    echo '===================='

    exit

fi

 

### 平均を求める

echo '1 引数の平均を求める'

sum=0

for i in "$@" # 全ての引数$0

do

    #echo -n '引数:'"$i"' '

    echo '引数:'"$i"' '

    sum=$*1

    # echo '小計:'"$sum"

    # echo '----------'

done

 

echo '--------'

echo '合計:'"$sum"

#平均mean 中央値median 最頻値mode 引数の個数$#

mean=$*2

echo '平均:'"$mean"

echo ''

 

### 分散を求める

# echo '2 引数の平均との差を求める'

 

# for i in "$@"

# do

#     echo 引数:"$i" 平均:"$mean"

#     #echo -n '引数 - 平均値'

#     echo -n '('"$i" - "$mean"')' '= '

#     tmp=$*3

#     echo "$tmp"

# 

#     echo -n 'その二乗= '

#     echo $*4

# 

#     #echo $*5 * $*6

#     echo '----------'

# done

# echo ""

 

echo '3 引数の平均との差 の二乗の平均をとる'

sum2=0

bunsan_str='_'

for i in "$@"

do

    echo 引数:"$i" 平均:"$mean"

    #echo -n '引数 - 平均値'

    echo -n '('"$i" - "$mean"')' '= '

    tmp=$*7

    echo "$tmp"

 

    echo -n '●その二乗= '

    jijo=$*8

    echo "$jijo"

 

    #echo $*9 * $*10

    # echo -n '    二乗の足し上げ= '

    # echo -n "$sum2"' + '"$jijo"' = '

    sum2=$*11

    # echo "$sum2"

    bunsan_str="$bunsan_str"' + '"$jijo"

    echo '----------'

done

echo ''

 

echo '分散=● の平均'

echo "$bunsan_str"' / '"$#"' = '

echo -n "$sum2"' / '"$#"' = ' 

#echo $*12

#echo "scale=5; $*13" | bc

#echo "scale=5; 1/3" | bc | xargs printf %.5f

# echo "scale=5; $*14" | bc | xargs printf %.5f

echo "scale=5; $sum2 / $#" | bc | xargs printf %.5f

echo ''

 

bunsan=`echo "scale=5; $sum2 / $#" | bc | xargs printf %.5f`

 

echo ''

echo '=========================='

#echo -n '引数'

#for i in $@; do echo -n "$i"','; done

#echo 'の'

echo '引数'"$@"''

echo '分散:'"$bunsan"

echo '=========================='

 

ちなみにメルカリでポチった。

 f:id:min117:20201024102127p:plain f:id:min117:20201024102138p:plain

ドコモ払いの手数料は還元される(キャンペーンをドコモが今月打ってる)。

f:id:min117:20201024102144p:plain

 

しばらく統計とデータ分析にハマる。

 

めっちゃ参考になった記事

orebibou.com

 

 

 

 

 

*1:sum + i

*2:sum /$#

*3:i - mean

*4:tmp*tmp

*5:i - mean

*6:i - mean

*7:i - mean

*8:tmp*tmp

*9:i - mean

*10:i - mean

*11:sum2 + $jijo

*12: sum2 / $#

*13: sum2 / $#

*14: sum2 / $#