
‖表計算シート集3‖xlsokan.html 《戻る》 《玄関へ》
《 相関表作成あれこれ 》
【内容】
相関表作成をいくつかの方法でやってみました。
マクロで実行させれば処理に要する時間は殆ど差がありませんでした。
(いずれもCPU2.3GHz、メモリー512MBで約1秒、CPU166MHz、メモリー48MBで約9秒でした)
なお、小生の『桐』による「教務部補佐」にある相関表作成一括処理は下記の(2)の方法に相当しますが、
一部では『桐』の転置集計を使用するところもあります。
【用例と解説】
(0) サンプルデータはSheet1のセルA60:B360に入れました。
<サンプルデータと処理用データ(A60:G360)>

データに対する前処理は相関の頻度のとり方によって異なる部分がありますが、共通する部分もあります。階級幅を25点にする場合は、
=INT(A61/25)*25 の式をC61に記入しC360までコピーしておきます。
これにより25点刻みの処理用データが準備できます。B列の素点も同様にD列に処理しておきます。階級幅10点の場合も同様です。
受け皿としての相関表は以下の(1),(2)の方法ではあらかじめシート内に準備しておきます。
(これもマクロに書き込んでもおいてよい)
(1) 縦軸の各階級毎に度数をとる方法
@ 前処理として、データを降順に並べ替えておきます。
A 縦軸の各階級毎にデータを選択する方法をとっているので、
選択条件を記入するセルや、選択先のセルを予め設定します。
<選択条件を記入するセル(C5:F6)> <選択したデータの貼り付け先のセル(A370:F670)>

B 縦軸となる階級で選択されたデータに対し度数を計算する式を記入したセルを予め用意しておきます。
これによって横軸となる各階級の頻度を計算します。
<度数を計算する式を記入したセル(J4:AD5)>

C 上記Bで得た縦軸のある階級の度数分布(この場合はJ6:AD6)の値だけを受け皿である相関表(この場合はJ11:AD21)にコピーします。
縦横の各頻度と累計もマクロ処理しています。相関係数は素点から求めています。

D この方法によるマクロ(A)を下に掲載しています。
(2) データの度数を直接相関表に展開する方法
@ 共通の前処理をおこない処理用データを用意します。
(1)の方法は一次元の処理を繰り返すためにデータを降順に
並べ替えますが、ここでの方法は二次元に一挙に展開(入力)するので、
並べ替えの必要がありません。
受け皿の相関表は上記のものをそのまま利用しました。
A 処理用データ(t素点とk素点)を1行毎づつ取得し、縦横の階級を計算し
相関表のどの位置に頻度を入力するかを求めます。
B Excel VBA には初心者以前に相当する小生ですが、
何とか動きましたので、マクロ(Z)を下に掲載しました。
〔参考〕小生の『桐』による相関表作成一括処理に比べて
処理速度はあまり変わらなかった。
(3) ピボットテーブルを使う方法
@ 共通の前処理をおこない処理用データを用意します。
データの並べ替えは必要ありません。受け皿の相関表の準備も不要ですが、
各データに対し件数を表す項目(フィールド)を用意し、
データとして各1を入力しておきます。(上表を参照)
A ピボットテーブル作成ウィザードを利用しました。
この場合、対象データの範囲はC60:G360とし、
レイアウトの画面で、C列(t25幅)を縦軸に、D列(k25幅)を横軸に、
G列(件)をデータ域に設定します。
横軸のデータは降順設定が出来るのですが、縦軸は並べ替えの設定ができませんでした。
B 作成された表は下のとおりで、縦軸の階級は昇順でした。
<作成直後のテーブル>

C 縦軸の階級を降順表記するため、一旦上記Bの表を値だけ(この場合上表のI60:S71)を別のセル(この場合下表のI39)にコピーし、
階級の列から総計の列(この場合下表のI列〜S列)について、行は総計の行を除く頻度が表現されている行(この場合下表の41〜49)
についてI列(この場合t25幅)で降順の並べ替えをします。
<縦軸の階級および頻度を降順に並べ替えした表>

D この後、縦横の累計や相関係数を求めておくと良いが、今回は罫線などの処理設定もしていません。
この方法によるマクロ(X)を下に掲載しています。
〔参考〕『桐』による転置集計による一括処理に比べて処理速度はあまり変わらなかった。
【マクロ(A,Z,X)】
(A) エクセルによる相関表作成(縦軸階級毎に頻度をとる方法、25点幅)
Sub sokan25()
'-------------------素点の前処理(降順並べ替え・25点幅+10点幅)-------------------------
Range("A60:B360").Select
Selection.Sort Key1:=Range("A61"),
Order1:=xlDescending, Key2:=Range( _
"B61"), Order2:=xlDescending,
Header:=xlGuess, OrderCustom:=1, MatchCase
_
:=False, Orientation:=xlTopToBottom,
SortMethod:=xlPinYin, DataOption1:= _
xlSortNormal, DataOption2:=xlSortNormal
Range("C61").Select
ActiveCell.FormulaR1C1 = "=INT(RC[-2]/25)*25"
Range("D61").Select
ActiveCell.FormulaR1C1 = "=INT(RC[-2]/25)*25"
Range("E61").Select
ActiveCell.FormulaR1C1 = "=INT(RC[-4]/10)*10"
Range("F61").Select
ActiveCell.FormulaR1C1 = "=INT(RC[-4]/10)*10"
Range("C61:F360").Select
Selection.FillDown
Range("J6").Select
ActiveCell.FormulaR1C1 = _
"=IF(DCOUNTA(R370C1:R670C4,4,R[-2]C:R[-1]C)=0,"""",DCOUNTA(R370C1:R670C4,4,R[-2]C:R[-1]C))"
Range("J6:AD6").Select
Selection.FillRight
Range("AJ6").Select
ActiveCell.FormulaR1C1 = _
"=IF(DCOUNTA(R370C1:R670C6,6,R[-2]C:R[-1]C)=0,"""",DCOUNTA(R370C1:R670C6,6,R[-2]C:R[-1]C))"
Range("AJ6:CH6").Select
Selection.FillRight
'-----------------------------頻度処理(25点幅)------------------------------------
Dim I, N
Application.CommandBars("Stop
Recording").Visible = False
Range("C6").Select
For I = 1 To 21
Range("C6").Select
N = 500 - (I - 1) * 25
ActiveCell.FormulaR1C1
= N
Range("A60:D360").AdvancedFilter
Action:=xlFilterCopy, CriteriaRange:=Range
_
("C5:D6"),
CopyToRange:=Range("A370:D670"),
Unique:=False
Range("J6:AD6").Select
Selection.Copy
Range("J10").Select
ActiveCell.Offset(I).Select
Selection.PasteSpecial
Paste:=xlPasteValues, Operation:=xlNone,
SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode
= False
Next I
'---------------------------頻度・累計計算(25点幅)・相関係数------------------
Range("AE11").Select
ActiveCell.FormulaR1C1 = "=SUM(RC[-21]:RC[-1])"
Range("AF11").Select
ActiveCell.FormulaR1C1 = "=R[-1]C+RC[-1]"
Range("AF11").Select
ActiveCell.FormulaR1C1 = "=RC[-1]"
Range("AE11:AE31").Select
Selection.FillDown
Range("AF12").Select
ActiveCell.FormulaR1C1 = "=R[-1]C+RC[-1]"
Range("AF12:AF31").Select
Selection.FillDown
Range("J32").Select
ActiveCell.FormulaR1C1 = "=SUM(R[-21]C:R[-1]C)"
Range("J32:AD32").Select
Selection.FillRight
Range("AD33").Select
ActiveCell.FormulaR1C1 = "=R[-1]C"
Range("AC33").Select
ActiveCell.FormulaR1C1 = "=RC[1]+R[-1]C"
Range("J33:AC33").Select
Range("AC33").Activate
Selection.FillLeft
Range("H8").Select
ActiveCell.FormulaR1C1 = "相関係数↓"
ActiveCell.Characters(1, 2).PhoneticCharacters
= "ソウカン"
ActiveCell.Characters(3, 2).PhoneticCharacters
= "ケイスウ"
Range("I9").Select
ActiveCell.FormulaR1C1 = "=CORREL(R60C1:R[351]C1,R60C2:R360C2)"
Range("H8:I9").Select
Selection.Copy
Range("AH8").Select
ActiveSheet.Paste
Application.CutCopyMode = False
'---------------------------------------------------------------------------
Range("C6").Select
End Sub
(Z) エクセルによる相関表作成(直接展開する方法)
Sub sokan-d()
Application.CommandBars("Stop
Recording").Visible = True
'-----------------------------頻度処理(25点幅)------------------------------------
Dim I, T, K,HABA,MANTEN, DOSU,
SHYOT, SHYOK As Integer
Range("J11:AD31").Select
'相関表内の以前のデータを消去する
Selection.ClearContents
Range("A61:B360").Select
'処理対象データの範囲
HABA=25,MANTEN=500 '階級幅と満点の設定
For I = 1 To 301
T = Range("A61:B360").Cells(I,
1).Value '対象範囲の上から下へ順にデータ(t、K)を取り出す
K = Range("A61:B360").Cells(I,
2).Value
If (T = ""
Or K = "") Then Exit For
'T点またはK点のデータがなければ処理を終える
SHYOT = INT(MANTEN/HABA)+1
- INT(T / HABA) 'T点とK点とから相関表に収める階級を求める
SHYOK = INT(K /
HABA) + 1
Range("J11:AD31").Select
'相関表を選ぶ
DOSU = Range("J11:AD31").Cells(SHYOT,
SHYOK).Value '該当度数を入力するセルの現在頻度数を求める
DOSU = DOSU + 1
'現在頻度数に1を加える
Range("J11:AD31").Cells(SHYOT,
SHYOK).Value = DOSU '新しい頻度数で該当セルを更新する
Next I
'---------------------------頻度・累計計算(25点幅)・相関係数------------------
'マクロ(A)と同様なのでここでは省略
'---------------------------計算式を消して値だけ残す(一部の範囲だけの処理段階にある)---
Range("J11:AF33").Select
Selection.Copy
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
Range("C6").Select
End Sub
(X) エクセルによる相関表作成(ピヴォットテーブルを使う方法、25点幅)
Sub PIVOT25()
'-------------------素点の前処理(25点幅、フィールド[件]の設定)-------------------------
Range("C61").Select
ActiveCell.FormulaR1C1 = "=INT(RC[-2]/25)*25"
Range("D61").Select
ActiveCell.FormulaR1C1 = "=INT(RC[-2]/25)*25"
Range("C61:D360").Select
Selection.FillDown
Range("G60").Select
ActiveCell.FormulaR1C1 = "件"
ActiveCell.Characters(1, 1).PhoneticCharacters
= "ケン"
Range("G61").Select
ActiveCell.FormulaR1C1 = "1"
Range("G61:G360").Select
Selection.FillDown
'-------------------ピヴォットテーブルを使う-------------------------
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase,
SourceData:= _
"sample1!R60C3:R360C7").CreatePivotTable
TableDestination:= _
"[dosuu9.xls]sample1!R60C9",
TableName:="ピボットテーブル1", DefaultVersion:=
_
xlPivotTableVersion10
ActiveSheet.PivotTables("ピボットテーブル1").AddFields
RowFields:="t25幅", _
ColumnFields:="k25幅"
ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("件").Orientation
= _
xlDataField
ActiveWorkbook.ShowPivotTableFieldList
= False
Application.CommandBars("PivotTable").Visible
= False
ActiveSheet.PivotTables("ピボットテーブル1").PivotSelect
"t25幅 'Column Grand Total'" _
, xlDataAndLabel, True
Range("I60:S71").Select
Range("S71").Activate
Selection.Copy
Range("I39").Select
Selection.PasteSpecial Paste:=xlPasteValues,
Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("I41:S49").Select
Application.CutCopyMode = False
Selection.Sort Key1:=Range("I41"),
Order1:=xlDescending, Header:=xlNo, _
OrderCustom:=1, MatchCase:=False,
Orientation:=xlTopToBottom, SortMethod _
:=xlPinYin, DataOption1:=xlSortNormal
End Sub
'-----------------------------------------------------------以上です------
END
of FILE 《戻る》 《玄関へ》