LoginSignup
1
2

More than 5 years have passed since last update.

全ての特徴パターンを1セルの数値で表し,どの特徴が含まれているのか自動計算する

Posted at

Excel2016で実験結果をまとめる時,countやifでは難しい壁に当たった.
excel_func01.png
※データは適当

やろうとした集計

  1. 学習者が解いたのは,どんなタイプの問題が多いか(機能性,使用性など)
  2. 学習者側は,どんなタイプの問題を解いたと思ってるのか
  • 学習者はA~G
  • 何か数値がある所(赤背景の3とか)は「学習者が解けた」
  • その数値は「学習者はそれをどういう問題だと思ったか」

例えば学習者Aが解いた問題1(赤背景)は機能性に関するものだが,Aの主観では効率性だと思ってる.

もし学習者が「この問題は機能性と使用性に関わるだろう」と答えたら,1セルでは表現できなくなる.

かといって5番目の特徴に機能性+使用性,6番目の特徴に機能性+効率性,と始めたら,対応づけるのが辛い.

これ以上判定だけのためにセルを増やしたくない.いっそのこと全パターンを1セルの記号ないし数値で表して,計算すれば任意の特徴があるかどうかわかる,みたいなのが良い.

特徴の全パターンを1つの数値で表す

2進法を利用した自作関数で解決した.
4種の特徴(機能性,使用性,効率性,信頼性)をそれぞれ2進法の各ビット1,2,4,8と対応付けて,特徴が2つ以上あるなら加算してしまう.
すると3は1+2(機能性+使用性),12は4+8(効率性+信頼性)だと一意に定まる.下表のような感じ.
excel_func02b.png

また,12の中に4があるか知りたければ,「4の2倍の数で12を割った余り」が4以上かどうかでわかる.
実際に計算してみると,4と8だけある.即ち12=4+8で合ってる.計算できるということは関数で自動化できるということなのでハッピー.

12 mod (1 * 2) = 0  :ない
12 mod (2 * 2) = 0  :ない
12 mod (4 * 2) = 4  :4以上,ある
12 mod (8 * 2) = 12 :8以上,ある

Excel2016の自作関数は以下.「縦一列のセル範囲」「探したい数字」を指定すると,その数字が含まれているかどうか1セルずつ見ていく.最終的には「その数字が含まれるセルがいくつあったか」を吐き出す.

Function extSingle(target As Range, fig As Integer)
Dim i As Range
Dim sum As Integer
sum = 0
For Each i In target
    If (i.Value Mod (fig * 2)) >= fig Then
        sum = sum + 1
    End If
Next i
extSingle = sum
End Function

使用例:=extsingle(J3:J7,1)
※関数名は適当

結果
excel_func02_extSingle.png
学習者Aが解いた問題は機能性と効率性,一方でAの主観は使用性に寄ってるかな? みたいな傾向を出せる.

※学習者の主観の数値は変えてない.最初は赤背景の3を「効率性だけ」の意味だと書いたが,ここでは「機能性と使用性」に意味が変わる.もし効率性だけという意味にしたければ,この数値は4にすれば良い.

今までの表現方法にも適用する

ついでに「機能性が1,使用性が0」みたいなベクトル表現もどきもやめてみた.こちらもセル範囲は縦一列.
「セル範囲1」「抽出したい数字」「セル範囲2」を指定すると,「セル範囲1のN番目から数字が抽出できる」&「セル範囲2のN番目が0超過の数字」となるセルを数える.
これで,学習者は機能性に関する問題を何個解いたか,を表せる.

Function extDouble(target As Range, fig As Integer, compare As Range)
Dim i As Integer
sum = 0
For i = 1 To target.Count
    If (target(i).Value Mod (fig * 2) >= fig) And (compare(i).Value > 0) Then
        sum = sum + 1
    End If
Next i
extDouble = sum
End Function

使用例:=extdouble(H3:H7,1,J3:J7)

結果
excel_func02_extDouble.png
問題2の特徴6は2+4で,つまり使用性と効率性に関する問題だという表現になる.

既出だと思ったが・・・

この手の方法は既出のはず・・・が,僕のググり力が足りなかったのかドンピシャなものは見つけられなかった.

2進法を使って大量のフラグを簡単に処理しよう,という記事はあった.僕が最初にやってたのと同じ(機能性が1,使用性が0みたいな).プログラミングならむしろこっちだと思う.

ゲームのフラグ管理はビット演算で効率かつ簡単に管理する
      sleep palarysis poison excitation
player1_state = 0   0   0   0
このようにビットパターンの各桁を状態として定義しておくと、以下のように非常に簡単に状態を変更できます。

本稿の内容は,これをさらに「状態数が増えても1つの数値で表せる」&「計算すればその中に任意の状態があるか否かわかる」に変えてみた,というところか.

この手法は多分,状態数が20も30もある場合には向かない.2のn乗で表せる整数しか使わないものの,21個目の特徴を1048576で表現するのには抵抗がある.

・・・31個でint型が限界・・・?

1
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2