こんばんわ! 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で統計
[今日の未消化]
・アイスクリーㇺの売り上げ予測