過去の桐井戸端BBS (桐ver.9)
31107 度数分布表を作成したい MAX 2006/02/13-09:40
桐VER.9を使用しています。
[組][番][氏名][性別][現代文][国語演習].....
という項目があり、[現代文]以下の項目に対して各科目の度数分布を
0-9
10-19
20-29
.
.
というように作成したいのですが、どういう風にすればいいのでしょうか?
過去ログを読んだのですが今ひとつ良く分かりませんでした。
現在はエクセルに読み込ませて処理をしているのですが、出来れば一括処理でやらせたいと思っています。
ご教授よろしくお願いします。
31109 Re:度数分布表の作成 宮城 2006/02/13-11:15
記事番号31107へのコメント
ナマの点数を0-9、10-19、20-29、・・・・
というインデクスに変換してやれば済む話だと思いますが。

項目追加、文字列型。

項目計算式はこんな感じ。

#条件選択([現代文]<=9,"0-9",[現代文]<=19,"10-19",[現代文]<=29,"20-29",・・以下略・・)

31110 Re:度数分布表の作成 MAX 2006/02/13-12:09
記事番号31109へのコメント
宮城さん、アドバイスありがとうございます。

この後の処理はどうなりますか?1つ1つの科目について行集計をするのでしょうか?

[現代文段階]という項目を作って計算式に #切り捨て([現代文],-2) と入れる。転置集計で
見出し項目に[現代文段階].(10) 転置項目に[現代文段階] 集計項目に[現代文段階] として
集計で件数を指定すればその科目の度数分布が出るのですが、ここからの処理の仕方が全く分からないのです。
もし1桁の点数の生徒がいなければ転置集計をしても 0〜 には値が入らないわけですし、ファイルを書き出して併合するにしても照合項目の検討がつかないのです。
31112 Re:度数分布表の作成 宮城 2006/02/13-12:54
記事番号31110へのコメント
どんな資料を作りたいかという問題じゃないかと思うのですが。
たとえば、

>もし1桁の点数の生徒がいなければ転置集計をしても 0〜 には値が入らないわけですし、

迷わず、ダミー行入れます。

31113 Re:度数分布表の作成 アックン 2006/02/13-14:40
記事番号31107へのコメント
MAXさん、こんにちは。
度数分布の値を入力する表は、同じ表ですか。それとも別の表ですか。
わからないので、ここでは素データが存在する表に列を作ってみます。
なお、0-9 が 0以上9以下か未満かなどもわからないので、適当に処理してます。

(a) [B]に区分データ(=ビン)があらかじめ入力されている場合は、
計算結果を[C]に(一括処理またはイベントで求めて)入力することにします。

(b) [D]に区分データが入力されてない場合は、
区分データを[D]に、計算結果を[E]に入力することにします。

・表(一括処理またはイベント処理を実行前)
素データ(数値) ビン(文字列) 結果 ビン(文字列) 結果
[A] [B] [C] [D] [E]
22 0-9
12 0-19
0 20-29
10
:

・表(一括処理またはイベント処理を実行後)
素データ(数値) ビン(文字列) 結果 ビン(文字列) 結果
[A] [B] [C] [D] [E]
22 0-9 5 0-9 5
12 0-19 9 0-19 9
0 20-29 6 20-29 6
10
:

一括処理またはイベント処理の内容
**-------------------
 var 固有, 数値{ &bin[3]={0} }
 検索 [A]=#cond( [A]<10,#setvar(bin,1,&bin[1]+1) ,\
         [A]<20,#setvar(bin,2,&bin[2]+1) ,\
         [A]<30,#setvar(bin,3,&bin[3]+1) ,\
         1,1000000 \
        )
 置換 [C]=""
 ジャンプ 行番号=先頭
/* (a) [A]が素データ、[B]がビン、[C]に結果データの場合。 */
 while( [B] )    /* [B]データが連続している限り繰り返します。 */
* while( .not#eof ) /* 最終行まで繰り返します。 */
 行訂正 [C]=#cond( \
          [B]="0-9" ,&bin[1] ,\
          [B]="10-19",&bin[2] ,\
          [B]="20-29",&bin[3] \
         )
 ジャンプ 行番号=次行
end
/* (b) [A]が素データ、[D]にビン、[E]に結果データの場合。 */
 ジャンプ 行番号=先頭
 var 数値{ &i }
 for &i=1,3,1    /* 3回繰り返します。 */
   行訂正 [D]=#case(&i,"0-9","10-19","20-29"),[E]=#v(bin,&i)
   ジャンプ 行番号=次行
 end
**-------------------
アックン(=^・^=)

31114 Re:度数分布表の作成 アックン 2006/02/13-14:46
記事番号31113へのコメント
この板は投稿すると半角スペースが消えるので、
表だけもう一度アップしときます。

>・表(一括処理またはイベント処理を実行前)
>素データ(数値) ビン(文字列) 結果 ビン(文字列) 結果
>[A] [B]  [C] [D] [E]
>22 0-9
>12 0-19
>0  20-29
>10
>:
>
>・表(一括処理またはイベント処理を実行後)
>素データ(数値) ビン(文字列) 結果 ビン(文字列) 結果
>[A] [B]  [C] [D]  [E]
>22  0-9  5  0-9  5
>12  0-19 9  0-19 9
>0  20-29 6 20-29  6
>10
>:

31116 Re:度数分布表の作成 MAX 2006/02/13-15:25
記事番号31113へのコメント
アックンさんは No.31113「Re:度数分布表の作成」で書きました。

>度数分布の値を入力する表は、同じ表ですか。それとも別の表ですか。
>わからないので、ここでは素データが存在する表に列を作ってみます。
>なお、0-9 が 0以上9以下か未満かなどもわからないので、適当に処理してます。

度数データを入力する表は同じ表です。
[現代文][国語演習].....[現代文段階][国語演習段階].....
という感じにして、[現代文段階]以下の項目には各科目の素点を切捨てした数値を計算式で求めるつもりなのですが。
0-9 というのは転置集計して出来る項目値です。0以上9以下です。

出来上がりの表は以下のようなイメージで考えています.
[現代文] [現代文度数][国語演習][国語演習度数]...
0-9 3    0-9 0
10-19 7 10-19 3
20-29 13 20-29 2
... ... ... ...
90-100 8 90-100 5

この表は元の表とは別に度数分布表として別の表を作りたいのです。転置集計を使えば簡単に出来るかと思ったのです
が、なかなか難問で悩んでいます。教えていただいた一括処理では区分を設定して最初に値を書き込まなければならないのですね?

31119 Re:度数分布表の作成 アックン 2006/02/13-18:41
記事番号31116へのコメント
MAXさん
> 一括処理では区分を設定して最初に値を書き込まなければならないのですね?
その値というのは、0-9 〜 90-100 の文字列のことですね。
あらかじめ 0-9 〜 90-100 という値をどこかに明記しておくと、処理が楽になります。
一括処理(cmd)・イベント(kev)・表(tbl)・変数ファイル(var)等、どこか1箇所にあればどのようにでもなります。

この文字列 0-9 〜 90-100 は10種あって、値が変化しないのですね? 変化するのですか?
それと、複数の項目名(科目名)は固定ではないのですか?

アックン(=^・^=)


31120 Re:度数分布表の作成 MAX 2006/02/13-18:49
記事番号31119へのコメント
アックンさん
>この文字列 0-9 〜 90-100 は10種あって、値が変化しないのですね? 変化するのですか?

10点刻みで変化しません。

>それと、複数の項目名(科目名)は固定ではないのですか?

項目名(科目名)は固定です。
31124 Re:度数分布表の作成 うにん 2006/02/13-21:20
記事番号31120へのコメント

>10点刻みで変化しません。

区分が均等なら集計時に「グループ化指定」もできますね。
転置集計だと自動的に項目名が[0〜][10〜]のようになります。

31127 Re:度数分布表の作成 アックン 2006/02/14-12:51
記事番号31120へのコメント
MAXさん
サンプルをアップしました。

テスト用ですから、フォームとイベントを使っていますが、
ほぼそのまま一括処理にコピペすればいいように記述しています。
・度数分布.wfm
すべての表を閉じてから起動してください。
コマンドボタンをクリックすると、各科目毎の度数が自動的に入ります。

・科目名.tbl
科目名を入力してください。
この表に入力した科目名と、素点.tbl・度数分布.tbl の科目名ならびに度数分布.wfm のソースを
一致させておいてください。

・素点.tbl
テストするときは、科目名の項目を #乱数(100) で置換すれば、点数が入ります。
実際の点を読み込んでテストするとき、小数点以下を切り捨てなくていいです。

テスト用に2科目しか設定しておりませんが、項目を増やしてもそのまま動作すると思います。
一応、プログラム内容を変更しないで試してください。

なお、
度数分布.tblを編集対象表にしたフォーム上のコマンドボタンで、度数を求めています。
(私がテストのためにそうしただけのことです。)、
素点.tblを編集対象表にしたフォーム上のコマンドボタンでやりたい場合や、
素点.tblを開いたまま一括処理を実行したい場合は、プログラムを一部変更する必要があります。
その際は、表のオープンクローズと編集表の切替に注意なさってください。

アックン(=^・^=)
31132 Re:度数分布表の作成 MAX 2006/02/14-21:07
記事番号31128へのコメント
アックンさん、どうもありがとうございます。
明日ゆっくり試させていただきます。お手数をおかけしましたm(__)m
31133 Re:度数分布表の作成 今村 誠 2006/02/14-21:13
記事番号31124へのコメント
私もサンプルを作ってみました。
>転置集計だと自動的に項目名が[0〜][10〜]のようになります。
1番目にグループ項目を指定して
2番目に集計項目を指定しますが
フォームから実行するので一度フォームを閉じないと
度数分布の表は表示できません。
サンプルは桐8のを流用しています。

31134 Re:度数分布表の作成 MAX 2006/02/14-21:21
記事番号31133へのコメント
今村 誠さん、どうもありがとうございます。
サンプルを見ましたが、もしかして同業者ですか?
明日動作を検証してみます。お世話になりました。
31137 Re:度数分布表の作成 今村 誠 2006/02/15-00:31
記事番号31134へのコメント
こんにちは、思いついたのでコメントを残しておきます。
成績ファイルがたくさんあるのであれば、度数分布を
表示できるフォームを下記のONnojiさんのフォームを参考に
されて、グラフ作成まで持って行くのも一方かと思います。
「ワンタッチ表形式フォーム」
http://mokuchan.hp.infoseek.co.jp/download/dl-list.htm

メイン部で表ファイル名を指定するようにして、手続き実行で
イベントの中に記述している、proc ファイル名指定()と
手続き定義開始 集計書出()
を最初に実行して、編集対象表を作成した表にすれば
即表示が可能と思います。

>もしかして同業者ですか?

違います。

おもしろそうな話題だったので、作ってみました。
よくテストのグラフと一緒に個人の成績を重ねてありますが、
桐でもできるのでしょうか?
MAXさんは、下準備したファイルからエクセルで処理され
ているのでしょうか?
31141 Re:度数分布表の作成 MAX 2006/02/15-12:16
記事番号31127へのコメント
アックンさん

320人分(科目数33)の実際のデータで確認しました。素晴らしいです!ほぼ期待したとおりの動作をしてくれました。

後質問なのですが、今の形では受験していない生徒と0点の生徒の区別がされずに出力されているのですが、
これを未定義と0点とはっきり区別できるようにできますか?

それとフォームの定義でファイル名が指定されているようですが任意のファイル名にしたい場合はどうすればいいのでしょう?

31142 Re:度数分布表の作成 MAX 2006/02/15-12:23
記事番号31137へのコメント
今村 誠さん

>おもしろそうな話題だったので、作ってみました。
>よくテストのグラフと一緒に個人の成績を重ねてありますが、
>桐でもできるのでしょうか?
>MAXさんは、下準備したファイルからエクセルで処理され
>ているのでしょうか?

わざわざデータを作ってアップロードしていただき本当にありがとうございました。
テストのグラフと個人の成績を重ねるのはエクセルでやっています。
桐でも出来るとは思うのですが、何分力不足で。出来ればすべて桐でやってしまいたいという願望がありまして
質問した次第です。桐はVER.3から使っているので愛着があります。
でもウィンドウズ版になってかなり戸惑っています。VER.5が使えれば一番いいのですが。

個表と度数分布はエクセルで作成しています。それ以外はすべて桐で作成しています。

アップしていただいたファイルを良く見て、取り入れていこうと思っています。
ありがとうございました。
31146 未定義値処理の集計 今村 誠 2006/02/15-21:34
記事番号31142へのコメント
MAXさんこんにちは、試験を受けなかった方を未定義にして
その方も別項目にして集計に加えたい場合下記の記述箇所を
変更するといいと思います。行番号は増やした行もあるので
上下するかもしれません。
表の未定義値処理も未定義にする必要があるかもしれません。
データが多くないので、MAXさんが検証して下さい。

手続き定義開始 集計書出() /* 6行目の変数を下記のように変更 */
  var Str{&読込順番="集計グループを指定,学科や試験名:中止はEsc",&グループ項
目,&集計項目名\
  ,&書出ファイル名="度数分布.k3",&Q=#JIS(34),&C=#JIS(44),&QCQ=#JIS(34)
+#JIS(44)+#JIS(34)\
  ,&QC=#JIS(34)+#JIS(44),&度数表="度数分布",&検索項目名},数値{&教科名
[11],&count\
  ,&項目終了番号=#項目番号("保健体育")},long{&終了確認,&中止確認=1}

   繰り返し終了 /* 51行目の印字を下記のように変更 */
   印字 &Q,&検索項目名,&QC\
      ,&教科名[1],&C,&教科名[2],&C,&教科名[3],&C,&教科名[4],&C,&教科名
[5]\
      ,&C,&教科名[6],&C,&教科名[7],&C,&教科名[8],&C,&教科名[9],&C,&教
科名[10],&C,&教科名[11]

proc 検索集計(Str &項目名, refer 数値 &度数分布[11]) /* 96行目の検索を下記
のように追加 */
   コマンド  "検索 [氏名] {#計算(\
#SETVAR(度数分布,1,#cond(#横合計(["+&項目名+"],["+&項目名+"])=#u,&度数分布
[1]+1,1,&度数分布[1]))\
,#SETVAR(度数分布,2,#cond(["+&項目名+"]>=0 .and ["+&項目名+"]<10,&度数分布
[2]+1,1,&度数分布[2]))\
途中省略
,#SETVAR(度数分布,11,#cond(["+&項目名+"]>=90 .and ["+&項目名+"]=<100,&度数分
布[11]+1,1,&度数分布[11]))\
,#cond([],#u,1,1))},文字比較方法=自動,部分一致検索=しない"
end

  繰り返し終了 /* 121行目の表の定義を1項目(未受験者)を追加 */
  印字 &Q,"科目名",&QCQ,"文字列",&QCQ,"M2712",&Q
  印字 &Q,"試験を受けませんでした",&QCQ,"整数",&QCQ,"M712",&Q
  印字 &Q,"0-9",&QCQ,"整数",&QCQ,"M712",&Q
途中省略
  印字 &Q,"90-100",&QCQ,"整数",&QCQ,"M712",&Q
  印字終了 改頁=しない
31154 Re:度数分布表の作成 アックン 2006/02/16-13:16
記事番号31141へのコメント
MAXさん> 動いてよかったですね。
0点と未定義を区別する式は難しいので、絞り込みを利用してみます。
(表の定義で未定義項目値処理がゼロの場合)
イベントファイル(kev)を再定義で開いて、下のように5行追加してください。
(上書きしないように注意してくださいね。)

既存行: var 数値{ &i , &Cnt }
追加行: method @フォーム.描画禁止( 1 )
既存行: for &i=1,#配列要素数("科目名")

既存行: 編集表 &table[2]
追加行: コマンド "絞り込み ["+#v("科目名",&i)+"]{#定義}"
既存行: コマンド "検索 ["+#v("科目名",&i)+"]=#cond(["\

既存行: +#v("科目名",&i)+"]<101,#setvar(bin,10,&bin[10]+1),1,10000)"
追加行:解除 1
既存行: /* 科目別の度数をセルの値にする。 */

既存行:   end
既存行: end
追加行: ジャンプ 行番号=先頭
追加行: method @フォーム.描画禁止( 0 )
既存行: 終了 表 &table[2]

なお、追加行の
 コマンド "絞り込み ・・ +"]{#定義}" 
の行は次のように書いてもいいです。ぼくはいつも下のように書いてます。
 コマンド "絞り込み ・・ +"]<>"""""

絞り込み・検索・解除を繰り返す処理時間を短くするために、
 method @フォーム.描画禁止( 1 )
で画面の書き換えを一時的に止めます。
 method @フォーム.描画禁止( 0 )
で、以降の書き換えを許可します。
この間、フォーム右側のスクロールバーだけ動きます。(このバーの動きは止められません。)

・もうひとつの質問
>それとフォームの定義でファイル名が指定されているようですが任意のファイル名にしたい場合はどうすれ
フォーム(wfm)を再定義で開きます。
桐のメニュー「書式」→「定義画面の設定」→「詳細プロパティを使用する」をチェック→OK(ボタン)
(一度設定すればいいです。)

続けて、フォームの周囲の白い台紙(ワークエリアと呼びます)を右クリック→オブジェクトの属性→
編集対象表(タブ)→編集対象表(T):→この欄にファイル名を入れてください。
(ヘルプは、この「オブジェクトの属性」パネルの右上?マークをクリックしてください。)

次にイベントファイル(kev)を書き換えます。
拡張子が kev のファイルを再定義で開きます。
ファイル名を直接指定している下記3行を、任意のファイル名に変更してください。

表 "20060213科目名.tbl" /* 科目名を記入した表 */

表 "20060213素点.tbl" /* 科目別に素点を入力した表 */

編集表 "20060213度数分布.tbl" /* 科目別に度数分布を自動記入する表  このフォームの編集対象表  */

アックン(=^・^=)

戻る