! 1行目にデータ数、2行目以降にx,yデータが並んでいるファイル
! (例えばhoge.d)を作る。kaiki<hoge.d と実行。
        program kaiki
        implicit real*8 (a-h, o-z)
        dimension x(1000),y(1000)
         print*,'x,yのデータからy=ax+bの回帰直線を求める'
        read(*,*) n
         sx=0.d0
         sy=0.d0
         sxy=0.d0
         sx2=0.d0
         sy2=0.d0
         sxxyy=0.d0
        do i=1,n
!         print*,i
         read(*,*) x(i),y(i)
         sx=sx+x(i)
         sy=sy+y(i)
         sxy=sxy+x(i)*y(i)
         sx2=sx2+x(i)**2
         sy2=sy2+y(i)**2
        end do
!
! x(i),y(i)の最大値xmax,ymaxと最小値xmin,yminを求める
               xmax=x(1)
               ymax=y(1)
               xmin=x(1)
               ymin=y(1)
               do i=1,n
               if (x(i).gt.xmax) xmax= x(i)
               if (y(i).gt.ymax) ymax= y(i)
               if (x(i).lt.xmin) xmin= x(i)
               if (y(i).lt.ymin) ymin= y(i)
               end do
!        
!        
!        
        xm=sx/n
        ym=sy/n
        do i=1,n
         sxxyy=sxxyy+(x(i)-xm)*(y(i)-ym)
        end do
         a=(n*sxy-sx*sy)/(n*sx2-sx**2)
         b=(sx2*sy-sxy*sx)/(n*sx2-sx**2)
         hen=sqrt( (sy2-b*sy-a*sxy)/n )
!         hensa=sqrt((sy2-n*ym**2-a*sxxyy)/n)
         r2=sxxyy**2/((sx2-n*xm**2)*(sy2-n*ym**2))
         r=sxxyy/sqrt((sx2-n*xm**2)*(sy2-n*ym**2))
!
         print*, 'a=',a
         print*, 'b=',b
         print*, 'r**2=',r2
         print*, 'r=',r
         print*,'xの平均',xm
         xb=sx2/n-xm**2
         print*,'xの分散、標準偏差',xb,sqrt(xb)
         print*,'yの平均',ym
         yb=sy2/n-ym**2
         print*,'yの分散、標準偏差',yb,sqrt(yb)
         print*, '回帰線に対する変数yの標準偏差',hen
         cv=sqrt(yb)/ym
         print*,'変動係数(y偏差/y平均)',cv
!
! 回帰直線の2点データを出力
         yxmin=a*xmin+b
         yxmax=a*xmax+b
         xymin=(ymin-b)/a
         xymax=(ymax-b)/a
         open(7,file='k.d')
!         write(7,*) xmin,yxmin
!         write(7,*) xmax,yxmax
         write(7,*) xymin,ymin
         write(7,*) xymax,ymax
         close(7)
!
         end
