#/*********************************************************** # corrcoef.rb -- 相関係数 #***********************************************************/ def corrcoef1( n, x, y) sx = sy = sxx = syy = sxy = 0 for i in 0...n sx += x[i]; sy += y[i] end sx /= n; sy /= n for i in 0...n dx = x[i] - sx; dy = y[i] - sy sxx += dx * dx; syy += dy * dy; sxy += dx * dy end sxx = Math::sqrt(sxx / (n - 1)) syy = Math::sqrt(syy / (n - 1)) sxy /= (n - 1) * sxx * syy printf("標準偏差 %g %g 相関係数 %g\n", sxx, syy, sxy) end def corrcoef2( n, x, y) sx = sy = sxx = syy = sxy = 0 for i in 0...n sx += x[i]; sy += y[i] sxx += x[i] * x[i] syy += y[i] * y[i] sxy += x[i] * y[i] end sx /= n; sxx = (sxx - n * sx * sx) / (n - 1) sy /= n; syy = (syy - n * sy * sy) / (n - 1) if (sxx > 0); sxx = Math::sqrt(sxx); else; sxx = Math::sqrt(sxx); end if (syy > 0); syy = Math::sqrt(syy); else; syy = Math::sqrt(syy); end sxy = (sxy - n * sx * sy) / ((n - 1) * sxx * syy) printf("標準偏差 %g %g 相関係数 %g\n", sxx, syy, sxy) end def corrcoef3( n, x, y) sx = sy = sxx = syy = sxy = 0 for i in 0...n dx = x[i] - sx; sx += dx / (i + 1) dy = y[i] - sy; sy += dy / (i + 1) sxx += i * dx * dx / (i + 1) syy += i * dy * dy / (i + 1) sxy += i * dx * dy / (i + 1) end sxx = Math::sqrt(sxx / (n - 1)) syy = Math::sqrt(syy / (n - 1)) sxy /= (n - 1) * sxx * syy printf("標準偏差 %g %g 相関係数 %g\n", sxx, syy, sxy) end require "statutil.rb" NMAX = 1000 x = []; y = [] n = 0 while (true) t = getnum($stdin); u = getnum($stdin); if (readerror(t) || readerror(u)); break; end if (missing(t) || missing(u)); next; end if (n >= NMAX); error("多すぎます"); end x[n] = t.to_f; y[n] = u.to_f; n += 1 end printf("データの件数 %d\n", n) corrcoef1(n, x, y) corrcoef2(n, x, y) corrcoef3(n, x, y) exit 0