Upgrade to Pro — share decks privately, control downloads, hide ads and more …

アンケートの集計システムを作った

 アンケートの集計システムを作った

M3 Tech Meetup #5

Jumpei Takiyasu

December 06, 2018
Tweet

More Decks by Jumpei Takiyasu

Other Decks in Technology

Transcript

  1. アンケート設問の種類 # 種類 アンケート用語でいうと 1 プルダウン SA (Single Answer) 2

    ラジオ SA (Single Answer) 3 チェックボックス MA (Multiple Answer) 4 数値入力 数値回答 (FAの一種) 5 テキスト入力 FA (Free Answer) # 形式 1 単一設問 2 マトリクス設問 5 × 2 = 10通りのパターンがある! こんなかんじ
  2. 設問の種類…多すぎ…? Booleanマトリクスと、数値マトリクスだけと考えることができる # 種類 整理すると・・ 1 プルダウン Booleanの配列 2 ラジオ

    3 チェックボックス 4 数値入力 数値の配列 5 テキスト入力 集計対象外(生データには必要) # 形式 1 単一設問 要素数1のマトリクス設問 2 マトリクス設問 ←
  3. 集計ツールのInput/Output 集計 ツール アンケート 設問A マトリクス行 選択肢 回答 設問B マトリクス行

    マトリクス行 選択肢 選択肢 選択肢 選択肢 選択肢 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 true/false/数値 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 true/false/数値 Q1集計表(SA) Q2集計表(マトリクスSA) アンケートABC (集計軸:Q10, Q11, Q12) Q3 ….
  4. 「加工」で主にやりたいこと 新しい設問を計算によって作り出す アンケート 設問A マトリクス行 選択肢 回答 設問B マトリクス行 マトリクス行

    選択肢 選択肢 選択肢 選択肢 選択肢 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 true/false/数値 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 回答 回答 回答 回答 回答 回答 回答 医師ごとの回答 true/false/数値 設問Aと設問Bの合成 (単一設問として) Aの選択肢1を選んだ かつ Bの選択肢1を選んだ Aの選択肢2を選んだ かつ Bの選択肢3を選んだ 医師ごとの回答は ←から計算できる 医師ごとの回答は ←から計算できる 例: • 男性かつ30代 • 関東(東京、埼玉…) • 患者数n人以上
  5. データの流れ 加工 集計 アンケート 定義 計算式を追加 除外IDを設定 集計軸を設定 集計対象を設定 加工設定

    集計設定 #2 集計設定 #1 アンケート システム アンケート 回答 アンケート 回答 計算結果 納品用集計表 Readonlyなので 元データは壊れない
  6. DSLの実装 - Knetic/govaluate 当初、文字列をGoとしてtypes.Eval()する方法を検討した →ファイルに書き出さずにメモリ上で関数の定義をするのは難しそう 独自でパーサまで実装しているKnetic/govaluateを利用 • 四則演算、論理演算、関数定義はOK • 変数もfloat64,

    boolがつかえる 関数は可変長のinterface{}しか受け取れない制限がある →Goで同等の関数を書いて、ラップする(型チェックは自前) バリデーションは ホワイトリスト的に やってます
  7. Golden file testingを使ったテストの雰囲気 アンケートシステム バックエンドAPI go-vcr テスト対象: Application層 のハンドラ インテグレーションテ

    スト RequestのObjectは人手で作る 外部APIの Response YAMLファイル juntaki/fix.Fix() 集計システムAPI のResponse バイナリ/JSON ハンドラへのインプットを作るだけでテストが量産できます リグレッションテストとしてはコスパ高い! ※網羅性などをきちんと考えた、他のユニットテストとの併用がおすすめ