BLOG

 

235日のセブIT留学  成長日記「Java Script で統計」 ( 13/235 days )

21 7月 2018, Posted by keisuke in IT留学, プログラミング, 統計

こんばんわ! Keisukeです!

 

先週は, Pythonで統計を行いましたが, JavaScriptをやる機会があったのでJavaScriptでも導入してみたいと思います。

 

JavaScriptはWebサイトなどを作ることに向いているようです。

数値処理には向いてないのかな?と思いましたが一通りの処理は普通にできるようです!

 

今回は, 2016年のアイスクリームの売り上げから2017年1月の売り上げを予測してみようと思います!

 

 

用いたデータは, 日本アイスクリーム協会から2016年のデータをDLして用いています!

 

————————————————————————————————————

function calcSum(data) //合計値

{

var sum = 0;

for (i=0; i<data.length; i++) {

sum = sum + data[i];

}

return (sum);

}

 

function calcAve(data) //平均値

{

return (calcSum(data) / data.length);

}

 

function calcVar(data) //分散値

{

var ave = calcAve(data);    // 平均値

var varia = 0;

for (i=0; i<data.length; i++) {

varia = varia + Math.pow(data[i] – ave, 2);

}

return (varia / (data.length – 1));  //n-1法に変更

}

 

function calcStd(data) //標準偏差

{

return Math.sqrt(calcVar(data));    // 分散の平方根

}

 

function calcinc(data) //純増値

{

var inc=[];

var n = 0;

for (n=0; n<data.length; n++) {

inc[n]=(data[n]-data[n-1]);

 

if(isNaN(inc[n])) {

inc[n] = data[n];

}

 

}

return(inc)

}

 

function invNormalDistStd(p) { //正規分布 Q-Qプロット

if ( (p<0) || (p>1) ) return “入力エラー:0<p<1”;

if ( (p > 0.49999) && (p < 0.50001) ) return 0;

var q = -Math.log(4*p*(1-p));

var a = [ 1.570796288, 0.03706987906, -0.0008364353589, -0.0002250947176,

0.000006841218299, 0.000005824238515, -0.00000104527497, 0.00000008360937017,

-0.000000003231081277, 0.00000000003657763036, 0.0000000000006936233982 ];

var r = a[0];

for (var i=1; i<=10; i++) {

r = r + a[i] * Math.pow(q, i);

}

var x = Math.sqrt(q*r);

if (p < 0.5) x = -x;

return x;

}

 

function Correl(xx,yy){ //相関関数

var m = Math

,n;

if (xx.length==yy.length){

n = xx.length;

var sumx=0, sumy=0, sumxx=0, sumyy=0, sumxy=0

,xm ,ym ,xxi ,yyi

,sumxxm=0, sumyym=0, sumxym=0

,i;

for(i=0; i<n; i++){

sumx += (xx[i]-0); //xxの総和

sumy += (yy[i]-0); //yyの総和

}

xm = sumx/n; //xxの平均

ym = sumy/n; //yyの平均

for(i=0; i<n; i++){

xxi = (xx[i]-0);

yyi = (yy[i]-0);

sumxxm += (xxi-xm) * (xxi-xm); //(xi-average(x))^2

sumyym += (yyi-ym) * (yyi-ym);

sumxym += (xxi-xm) * (yyi-ym); //(xi-average(x))*(yi-average(y))

}

return sumxym / m.sqrt(sumxxm) / m.sqrt(sumyym); // = sumxym/Math.sqrt(sumxxm*sumyym); //sqrtは平方根を返す

}else{

throw new Error(“Array length is not same.”);

}

}

 

function pNormalDist(x, μ, σ) { //正規分布

if (μ == null) μ = 0;

if (σ == null) σ = 1;

if (σ < 0) return “入力エラー:σ > 0”;

var σ2 = σ*σ;

return  Math.exp(-(x-μ)*(x-μ)/(2*σ2))/Math.sqrt(2*Math.PI*σ2);

}

 

function main()

{

//標本の抽出(data1) ※母集団からランダムで取り出す機能が必要

var data1 = [489,871,1343,1967,2882,3796,5190,6560,7386,7985,8474,9047];

//t値決定   ※データ数に対応するよう改善必要

t = 2.262

 

//純増値算出(data2)

data2 = calcinc(data1);

//純増平均

average = calcAve(data2);

document.write(“純増平均 : ” + average ,”<BR>”);

 

//分散値

vari = calcVar(data2);

//標準偏差

stdeva = calcStd(data2);

document.write(“標準偏差 : ” + stdeva,”<BR>”);

 

//正規分布

var dataND = []

for(nd=0; nd<data2.length; nd++){

dataND[nd] = pNormalDist(data2[nd],average,stdeva)

}

//標本 昇順(data3) X

data3 = data2.sort(function(a,b){

if( a < b ) return -1;

if( a > b ) return 1;

return 0;

});

 

//標本数(data4)

var data4 = []

for(s=0; s<data3.length; s++) {

 

if(data3[s] == data3[s-1]){

data4[s] = data4[s-1];

}

else{

data4[s] = s + 1;

}

 

}

 

//標本数 確率変換p(data5)

var data5 = []

for(p=0; p<data4.length; p++){

data5[p] = (data4[p] / (data4.length+1))//*100

}

 

//誤差関数(data6) Y  7/19 Q-Qplot を書きたい! 誤差関数の導入方法が分からず

var data6 = []

for(f=0; f<data4.length; f++){

data6[f] = invNormalDistStd(data5[f]);

}

 

//相関関数 R算出

R = Correl(data3,data6);

document.write(“R^2     : ” + R,”<BR>”);

 

//正規的か? R > 0.7   ※母集団からランダムで取り出した後、判断機能が必要

if(R > 0.7){

document.write(“正規的      : ” + R,”<BR>”);

}

else{

document.write(“正規的でない : ” + R,”<BR>”);

}

 

//信頼区域

confidence_p = Math.round(average + ((t * stdeva)/Math.sqrt(data2.length)));

confidence_psum = Math.round(confidence_p + Math.max.apply(null, data1));

confidence_m = Math.round(average – ((t * stdeva)/Math.sqrt(data2.length)));

confidence_msum = Math.round(confidence_m + Math.max.apply(null, data1));

document.write(“上限予想 : ” + confidence_psum,”<BR>”);

document.write(“下限予想 : ” + confidence_msum,”<BR>”);

document.write(“純増値 : ” + confidence_m,” ~ “,+ confidence_p,”<BR>”);

document.write(“信頼区域 : ” + confidence_msum,” ~ “,+ confidence_psum,”<BR>”);

 

}

————————————————————————————————————

実行結果がこちらになります!

 

純増平均 : 742.3333333333334

標準偏差 : 326.3537771786744

R^2   : 0.9364213001184641

正規的  : 0.9364213001184641

上限予想 : 9863

下限予想 : 9437

純増値信頼区域 : 529 ~ 955

信頼区域 : 9437 ~ 9863

 

2017年の1月のアイスの売り上げ予想は529 ~ 955万円の間になるようです!

 

アイスクリーム協会から2017年1月の実測値は….

 

2017年 1月 489万円….

 

完全に信頼区域から外れていますね…

 

どうやら, t値では売り上げ予測はできないようです…簡単じゃないんですね!

 

[今日の達成]

・JavaScriptで統計

 

[今日の未消化]

・アイスクリーㇺの売り上げ予測

 

Post a comment