Tableauでアンケート分析するための記事
*前回から後半部分を追記しました。
アンケートもTableauで分析する時代
Hakali小川です。Tableau、してますか。BIツールは数あれどデータアナリスト個人をエンパワーしてくれるBIというと現状だとTableauがやっぱり強いですよね。
直近でもtableau prepが登場し下処理しやすくなったことに加えて、LOD表現ができるようになったことでますます使いやすくなってきています(LOD表現については後述)。
そんな中、今回はアンケートもTableauでいろいろ見れると捗るよね、ということでそのやり方を書いてみたいと思います。
データ加工
まずはTableauで快適に分析するためのデータセットを作らねばなりません。アンケートデータというと、基本的には行がユーザーIDユニークで、列がひたすらに設問が広がっていくのがよくある形かと思います。
しかしこれだとDB的には圧倒的にいじりずらいです。項目が死ぬほど増えてしまい見づらいです。また、定期的に行っているレポートとかだと「前回との違い」を見たいと思いますが、多くの場合前回とちょっと設問が変わっていたり少し項目増やしてたりするので、1つのファイルで扱おうとすると無駄に列を増やさないと行けないです。
これを解消するには、データを「縦持ち」にするのが良いと思われます。例えば下記。こちらはTableauPrepの「ピボット」機能を使って縦持ちにしてます。
それ以外にも、Pythonの(Pandasの)stack()関数を使う方法があります。大量のファイルをいじるのであればこちらの方がコピペコピペで作業効率はいいかもなーとやってみて感じました。
こちらは、Jupyterを使うといいと思いますがhomebrew→pyenv→anacondaの順にインストールすると早いかと思います。僕はこちらを参考にさせてもらいました。
ちなみに縦に持つのはQAの部分ですが、いろいろな切り口で集計するためにも、いわゆる「属性情報」は横持ちのままにしておくのがいいかと思います。
MA(複数回答)ってどうするの?
ここはですね、現状は全部分けて「0,1」にするしかないかなと思っています。例えば
Q1:下記の中からすきな食べ物をいくらでも挙げてください。
A1:スパゲッティ、A2:ハンバーグ、A3:寿司、A4:天ぷら、A5:うどん
とすると、データとしては、
みたいな感じです。
FAってどうしよう
後ほどTableauで読み込む際に、FAが大量にあると結構スピードに影響が出てきます。そもそもFAの分析はTableauで云々する感じでもないと思いますので、思い切って削ってしまうのも手だと思います。数字のみにすると割とスピード出ました(具体的に記述できずすいません)。
経年等のアンケートをつなげる場合
経年変化等を知りたい場合は、rawデータで結合する必要があります。この際、当然ながらローデータ別に認識させる必要があるので、rawデータに列を追加して、「year」とか「ver」とかでどのバージョンかわかるようにしておく必要があります。
マスタづくり
いわゆるQAだと「Q3のAは3」みたいな感じで記号で構成されてると思うので分析するときは「Q3:うどん県の方にお伺いします。あなたは東京のさぬきうどんを認めますか」「A3:1.はい、2.いいえ、3.どちらでもない」みたいなものをまとめたマスタづくりが必要になってきます。何を隠そうこのアンケートDB化の一番大変なのはこのマスタづくりです。入稿時にマスタ化することを想定せずに作ったエクセルをマスタに足るように加工していくため、かなり重労働です。
こちらは現状作業のコツ、はよくわからんのですが、「Q(設問のみ)のマスタ」と「QA(選択肢の項目も含めたマスタ)」の両方必要だと感じています。
(そのうち画像作ります)
また、経年での同じ質問等はフラグを用意しておけると親切です。加工データの方に入れておこうかと思いましたが、いったん「Q(設問のみ)マスタ」にあればそれ見てすぐに比較できるので十分かなと思っています。
ウェイトバックってどうするよ?
あとは普通にTableauで読み込めばOK、と思いきや、自分でやるときにアンケートデータ特有の「ウェイトバック集計」をどうすればよいか若干悩んだのでここにも書いておきます。
ウェイトバック集計が何かはこの辺を参照ください。
例えば男女比がサンプルと母集団で少し異なる、母集団よりも男性の方が多い、となると女性の方を少し1.✕倍したり、逆に男性の方を0.✕倍する必要があります。なのでTableau回答を集計する際に考慮しないといけません。
今データの状態がどうなっているかというと、行に同じユーザーが大量にいる状態になるので、集計時にはおそらくcountd関数を使ってあげる必要があります。
しかし、男女で区切ってcountd関数を使ったもの、を重み付けする、てどうやるんだ??というところで止まりました。
いろいろ悩んだ末に、結論としては、「元のcolumnの属性データの方にウェイトバックの値を入れておき、LOD表現を使う」という方法を取ることにしました。
もともとウェイトバックするポイントは決まっているので、それぞれのユーザーの属性にウェイトバックの値を入れておきます(仮に「WB_SEX」とします)。そのうえで、LODを用いて、WBS_VALUE = {include [userID] : min([WB_SEX])}とかやってあげることで、集計時にWBの数字が使えるようになります。これで性別のウェイトバックができるようになりました。
LODがよくわからんぞ
LOD(Level Of Detail)表現は最近搭載された関数ですが、要するに中間テーブルを作ってくれるような感じでしょうか。タブローのインターフェースは、エクセルのピボットみたいな感じで表現するので、同時にデータの粒度を複数にセットすることができないのです。例えば、を書きたいですが大変なのでまたもや参考資料で逃げます。。
webだとこの辺見るとよいかもです。
ですし、書籍でいうとこの定番本がいい感じでした(この本は本当につまづきポイントが押さえられててステキです。ユーザー会の人たちが本作るとこうなるのかと感動しました。ステマみたいであれですけどTableauユーザーは一冊持ってても損はないかと思います。まぁまぁいいいお値段ですけど)
LOD表現ができるようになったことで、ローデータをシンプルにしたまま(追加の加工をする必要なく)Tableau上でいろんな表現が可能になりました。
アンケートをTableauで!の今後
実はマクロミルさんがTableauで読み込む前提でマスタ作り始めてたりしてます。
この記事見つけて早速この責任者の方にお話を聞きにいきましたが、現状とてもニーズあり、正直受けきれずにお断りをしているレベルとのこと。んでもって、マクロミルさんでやると、最初から経年での比較ができるようにフラグも立ててるようでステキでした。
しばらくはこれまでのアンケートデータをTableauで読めるように変換しなきゃいけない日々はありつつも、今後徐々にTableauで読む前提で作り込みされていく世界になっていくのではないでしょうか。
てなわけで、アンケートデータをTableauで読みたいニーズあればビジネスとしてご相談乗ります!ただ、自力でできる人も増やしたいのでもし自分でやりたい!ということであればそちらも相談に乗ろうと思ってます!なんかあればお声がけくださいませ。
ではでは。