散布図と相関係数
2つの変量について散布図を描き、相関係数を計算します。
Initilaization スロットで関数を定義します。
===============================================
scatterplot(data1,data2,name,col):=(
if(length(data1)!=length(data2),drawtext([0,5],"2つのデータの個数が異なります"),
(
//KETCindy用 データ名とタイトル
Dataname1=name_1;
Dataname2=name_2;
//
slen=length(data1);
sketa=keta(data1_1); // 最初のデータで桁数を調べる
max1=ceil(max(data1)/10^sketa)*10^sketa;
min1=floor(min(data1)/10^sketa)*10^sketa;
sketa=keta(data2_1);
max2=ceil(max(data2)/10^sketa)*10^sketa;
min2=floor(min(data2)/10^sketa)*10^sketa;
scalex=20/(max1-min1);
scaley=20/(max2-min2);
apply(0..10,drawtext([#*2-0.4,-0.8],min1+#*(max1-min1)/10));
apply(0..10,drawtext([-0.8,#*2-0.2],min2+#*(max2-min2)/10));
//KETCindy用目盛リスト
Xmemori=flatten(apply(0..10,[[#*2-0.4,-0.8],"s",text(min1+#*(max1-min1)/10)]));
Ymemori=flatten(apply(0..10,[[-0.8,#*2-0.2],"w",text(min2+#*(max2-min2)/10)]));
//
drawtext([21,-1],name_1,size->16);
drawtext([-2,21],name_2,size->16);
repeat(slen,
draw([(data1_#-min1)*scalex,(data2_#-min2)*scaley],color->col);
);
//KETCindy用点座標リスト
Pointlist="";
repeat(slen-1,
Pointlist=Pointlist+text([(data1_#-min1)*scalex,(data2_#-min2)*scaley])+",";
);
Pointlist=Pointlist+text([(data1_slen-min1)*scalex,(data2_slen-min2)*scaley]);
//
// 相関係数
mean1=sum(data1)/slen;
mean2=sum(data2)/slen;
sx=0;
sy=0;
sxy=0;
repeat(slen,
sx=sx+(data1_#-mean1)^2;
sy=sy+(data2_#-mean2)^2;
sxy=sxy+(data1_#-mean1)*(data2_#-mean2);
);
Correlation=sxy/(sqrt(sx)*sqrt(sy));
//軸
draw([0,0],[25,0],color->[0,0,0]);
draw([0,0],[0,22],color->[0,0,0]);
// 平均値にラインを引く
draw([[(mean1-min1)*scalex,0],[(mean1-min1)*scalex,20]],size->1,dashtype->1,color->[0,1,0]);
draw([[0,(mean2-min2)*scaley],[20,(mean2-min2)*scaley]],size->1,dashtype->1,color->[0,1,0]);
//print(sxy/(slen-1));
Corr="相関係数:"+text(Correlation);
drawtext([15,19],Corr,size->16);
// 回帰直線 y=sxy/sx*(x-mean1)+mean2
Yy1= (sxy/sx*(min1-mean1)+mean2-min2)*scaley;
Yy2= (sxy/sx*(max1-mean1)+mean2-min2)*scaley;
drawtext([15,17],"回帰直線: y="+text(sxy/sx)+"x"+text(-sxy/sx*mean1+mean2),size->16);
// KETCindy用はTeX
Kaiki="回帰直線: $y="+text(sxy/sx)+"x"+text(-sxy/sx*mean1+mean2)+"$";
draw([[0,Yy1],[20,Yy2]],size->2);
)); // 全体を関数定義とした最初のif文の綴じかっこ
);
// 桁数を求める
keta(n):=(
k=0;
if(n>=10,
while(n>=10,n=n/10;k=k+1),
while(n<1,n=n*10;k=k-1);
);
k;
);
================================================
データは、CindyScript の Draw スロットに書きます。
実際には、表計算ソフトなどで入力し、CSVで書き出してコピーするのがよいでしょう。
================================================
// data list
data1=[6.6 ,7.0 ,6.9 ,6.9 ,6.8 ,7.0 ,7.1 ,7.4 ,7.6 ,7.3 ,7.6 ,8.0 ,7.5 ,7.3 ,7.1 ,6.3 ,6.4 ,7.0 ,7.1 ,7.3 ,6.5 ,6.5 ,7.9 ,6.7 ,6.5 ,7.0 ,7.0 ,6.6 ,7.5 ,7.2 ,6.5 ,6.7 ,6.9 ,7.2 ,6.8 ,7.4 ,7.7 ,6.9 ,7.0 ,6.9 ];
data2=[5.16 ,6.14 ,6.00 ,5.53 ,5.23 ,5.28 ,5.45 ,4.38 ,7.13 ,5.38 ,5.56 ,7.11 ,6.33 ,6.48 ,7.09 ,5.39 ,5.09 ,5.44 ,6.09 ,7.36 ,4.51 ,5.55 ,6.13 ,5.00 ,4.53 ,6.04 ,5.35 ,5.09 ,6.30 ,5.44 ,5.02 ,4.59 ,6.33 ,5.20 ,5.30 ,5.27 ,6.07 ,5.13 ,7.26 ,6.10 ];
// scatterplot(data1,data2,["name of data1","name of data2"],color of point);
// average (green line)
scatterplot(data1,data2,["running 50m","Endurance running"],[0,0,0]);
// Title regulate a position and the size properly.
drawtext([3,22],"Correlation between the items of the fitness test",size->22);
===============================================
Cinderellaの画面はこのようになります。
これをTeXに書き出すために、スクリプトを追加します。Drawスロットに続けて書きます。
============================================
// 以下 KETCindy用
// グラフの範囲は縦横とも20まで
// 不必要なものはコメントアウトする
Ketinit();
Addax(0);
Setunitlen("4mm");
Fhead="test";
// データの点
Ptsize(3);
Drawpoint(Pointlist);
// 目盛数字
Letter(Xmemori);
Letter(Ymemori);
// データ名とタイトル : 上の設定に合わせる
Letter([[6,21],"e","新体力テスト種目間相関",[21,-1],"e",Dataname1,[-2.5,21],"w",Dataname2]);
// 相関係数
Letter([[15,19],"e",Corr]);
// 回帰直線
Letter([[15,17],"e",Kaiki]);
Listplot("1",[[0,Yy1],[20,Yy2]]);
// 軸
Listplot("2",[[0,0],[20,0]]);
Listplot("3",[[0,0],[0,20]]);
=============================================
実行すると、文字がダブりますが、出力用なのでかまわないでしょう。出力したら、先頭の if 文を
if(1==0,
に変えておきます。
なお、この結果を見て、短距離走と長距離走のタイムには思ったほど相関がないことに加え、この程度の相関係数と回帰直線の意味の違いについても説明ができるでしょう。
< 戻る >