SDAPSのCSV出力を解析してみた

# はじめに

SDAPSは割と使い勝手の良いOMR(Optical Mark Reader)です。
OCRのような文字を判別する仕組みと違って、チェックの有無を読み取るだけのシンプルな仕組みのため精度は比較的高いです。

SDAPSは専用用紙を利用せず、通常の印刷用紙を利用するため、日本で一般的な試験などに使われるマークシートと比較すると信頼性は高くありません。とはいえ、専用用紙のコスト負担がないため、アンケートの集計などには向いていると思います。

以前のバージョンでは読み取れないケースが少しありましたが、現在では蛍光マーカーなどを使われない限りは、ほぼ全て読み取れています。

読み取った集計結果をCSV形式で出力することができるのですが、質問形式によって出力がどのように変化するのか、まとめていきたいと思います。

なおCSVヘッダーの添字はVisualBasicなどと同様に1から始まっていて、数値は無記入の場合はゼロ、何等か記入・選択されている場合には、1以上の数値が出力されています。

# 環境

* SDAPS Version: 1.9.7 (Custom Docker Image [https://hub.docker.com/repository/docker/yasuhiroabe/sdaps-ja](https://hub.docker.com/repository/docker/yasuhiroabe/sdaps-ja))
* 質問用紙作成方法: LaTeX

なお利用した質問票のソースコードについては、GitHub上で公開しています。

* [GitHub YasuhiroABE / sdaps-ja-example](https://github.com/YasuhiroABE/sdaps-ja-example)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/eb1fb7ec-ccb5-ac18-c516-9555e0095c74.png)


# 質問用紙(LateX)の形式

使用しているのは、次のように修正マークを使用不可にするなどしたLaTeXファイルを使用しています。

```latex:questionnair.texの構造
\documentclass[
  english,
  a4paper, 
  checkmode=check,
  pagemark,
  stamp]{sdapsclassic}
\usepackage[utf8]{inputenc}
% For demonstration purposes
\usepackage{multicol}

\usepackage{xltxtra}
\setmainfont{IPAPMincho}
\setsansfont{IPAPGothic}
\setmonofont{IPAGothic}
\XeTeXlinebreaklocale "ja"

\author{...}
\title{...}

\begin{document}
\begin{questionnaire}
  ... 
\end{questionnaire}
\end{document}
```

この \begin{questionnaire} ... \end{questionnaire} の ``...`` 中に書ける命令は、公式サイトに掲載されています。

* [公式サイト内 sdaps-class](https://sdaps.org/class-doc/sdapsclassic.html)

# CSVファイルの形式

各行の前半部分は以下のよう、ほぼ全て同じ結果になります。
今回のような形式の質問票の構成で、add,recognize,report_tex,csv exportなどのコマンドを利用しているだけであれば、この部分は変化しません。

```csv
questionnaire_id,global_id,empty,valid,recognized,review,verified,...
None,            None,     0,    1,    1,           ,     0,       ...
```

sdapsの質問票は、1ページ、又は、偶数ページである必要があります。
1ページの質問票を両面設定で読み込んだ場合には、裏面が白紙になりますが、白紙の場合には、``empty``列には1がセットされ、``valid``列には0がセットされます。

ここから先には、設問番号に対応したヘッダーと値が格納されていきます。

# LaTeXマクロとCSV出力の対応

LaTeXによる各設問形式の利用例と、そのCSV出力がどのようになるのか確認していきます。
まずsinglechoiceについて確認し、その次にmultichoiceが選択できる命令について改めて確認します。

# 単一選択項目のテスト

使用できる命令も多いため、まず単一選択項目についてまとめます。

## singlemark (1.1)

```latex:LaTeX利用例
\singlemark{singlemark test}{Yes/はい}{No/いいえ}
```

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/5988ea09-f2ca-603b-7e7b-e91a77e389f7.png)

### CSV出力

* 未記入: -1
* 2つを選択した場合: -2
* 最右(Yes/はい)を選択した場合: 1
* 最左(No/いいえ)を選択した場合: 5

欧米では No ⇔ Yes の順番で設定することが一般的なようですが、日本語での設問では、左側にポジティブな回答を配置する傾向があるようです。

## singlemarkother (1.2)

```latex:LaTeX利用例
\singlemarkother [var=singlemarkothervar,count=6] {singlemarkother test} {lower/下限} {upper/上限} {other/その他}
```

``var=``は省略可能ですが、指定したsinglemarkothervarは、CSVファイルの列名に入ります。何も指定しなければ設問番号の ``1_2`` が入ります。

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/23da6c61-fa8a-72bf-b4d8-31c5b536302e.png)

### CSV出力

* 未記入: -1
* その他(other/その他)を選択した場合: 0
* 最右(lower/下限)を選択した場合: 1

singlemarkでは``0``になる場合はありませんでしたが、otherを選択した場合に、``0``がセットされます。

## textbox (1.3)

```latex:LaTeX利用例
\textbox[var=textboxvar]{0.5cm}{textbox test}
```

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/48501e79-1b23-40a0-866f-3c0b62e28f45.png)

### CSV出力

* 未記入: 0
* 記入済: 1

singlemark(1.1)などとは違い、未記入の場合は``0``がセットされます。

## choicequestion (1.4)

複数の回答を並べることができます。singlechoiceモードでは ``\choiceitemtext``命令は利用できません。

```latex:LaTex利用例
\begin{choicequestion}[cols=3,singlechoice] {choicequestion test}
    \choiceitem{choiceitem test}
    \choicemulticolitem{2}{choicemulticolitem test}
\end{choicequestion}
```

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/520f2d95-d827-899c-2d7c-d011b6a0b845.png)

### CSV出力

* 空白: -1
* 最右(choiceitem test)を選択した場合: 1
* 最左(choicemultiitem test)を選択した場合: 2

複数の選択肢を同時にチェックしたエラー例については、挙動が同じな``optionquestion(1.6)``で確認しています。

## choicegroup（1.5)

```latex:LaTeX利用例
\begin{choicegroup} [singlechoice] {choicegroup test}
    \choice{choice1/選択1}
    \choice{choice2/選択2}
    \choice{choice3/選択3}
    \question{question1/質問1}
    \question{question2/質問2}
    \question{question3/質問3}
\end{choicegroup}
```

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/605b7097-22ab-1c54-fb40-60eed07927f2.png)


### CSV出力

最右の質問項目(choice1/選択1)の列名は"1_5_1"、右側は"1_5_2"のようになります。

* 未選択: -1
* 複数選択時(エラー): -2
* (question1/質問1, choice1/選択1) を選択した場合: 1
* (question2/質問2, choice2/選択2) を選択した場合: 2

別の質問票で2x2のテストケースでは、1行で2項目選択したエラー時の出力が、``-2,-1``となっているので、空欄とは区別ができなくなっています。


## markgroup (1.6), (1.7)

singlemark(1.1)かsinglemarkother(1.2)のいずれかを複数設置できるモードです。

```latex:LaTeX利用例
%% singlemarkを複数利用する例 (1.6)
\begin{markgroup}{markgroup test}
    \markline{question1}{lower}{upper}
    \markline{question2}{lower2}{upper2}
\end{markgroup}

%% singlemarkotherを複数利用する例 (1.7)
\begin{markgroup}[other]{markgroup test with other}
    \markline{question1}{lower}{upper}{other}
    \markline{question2}{lower2}{upper2}{other2}
\end{markgroup}
```

### CSV出力

それぞれ singlemark(1.1)、singlemarkother(1.2) のCSV出力と同様です。

## optionquestion

choicequestion(1.4)へのエイリアスで、singlechoiceが最初から有効にセットされています。
表示やCSV出力の挙動は同様です。

## optiongroup

choicegroup(1.5)へのエイリアスで、singlechoiceが最初から有効にセットされています。
表示やCSV出力の挙動は同様です。

# 複数選択項目のテスト

複数選択時には、未選択の行は``0``がセットされる挙動が、単一選択の``-1``がセットされる挙動と異なります。

## choicequestion (2.1)

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/4b7aed2d-a9ba-f3ea-e104-e60cfcfc84e4.png)

### CSV出力

* 未選択: 0
* 選択した項目: 1

``\choiceitemtext``に記入した場合には``1``がセットされます。

## choicegroup (2.2)

### 表示例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78296/66709541-b898-fc9f-a17d-c1905215db5b.png)

### CSV出力

* 未選択: 0
* 選択した項目: 1

以上で、必要な検証はほぼ終っているはずです。


以上