#/*********************************************************** # corrcoef.c -- 相関係数 #***********************************************************/ #include #include 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 = 0 if (syy > 0) syy = Math::sqrt(syy); else syy = 0 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 #include #include "statutil.c" NMAX = 1000 begin static x[NMAX], y[NMAX] n = 0 while (true) t = getnum(stdin); u = getnum(stdin) if (readerror(t) || readerror(u)) break if (missing(t) || missing(u)) continue if (n >= NMAX) error("多すぎます") x[n] = t; y[n] = u; n += 1 end printf("データの件数 %d\n", n) corrcoef1(n, x, y) corrcoef2(n, x, y) corrcoef3(n, x, y) return EXIT_SUCCESS end