4 Replies Latest reply on Sep 20, 2016 7:22 PM by Keita Ogawa

    月別で前回購入期間の計算

    Keita Ogawa

      先日ご教授して頂いた前回来店日の関連するのですが

      これはまた違う形で表示が必要な様で質問させていただきます。

       

      その月にオーダーした顧客が前回購入した日付から再来(前回購入からの期間)で分けていくにはどうすれば良いでしょうか。

      初めて購入=初回

      6か月以内に再度購入=6か月以内購入

      12か月以内に再度購入=1年以内購入

      それより長い=1年以上前購入

       

      列は2016年1月、 2月、 3月・・・

      行は 初回

          6か月以内購入

          1年以内購入

          1年以上前購入

       

      でそれぞれの顧客数を表示したいです。

      それぞれのオーダーレコードで、

      DATEDIFF('month',[オーダー日],[前回購入日]>1なら1か月以内購入、

                                                                  >6なら6か月以内購入  と言った設定でいけるかとおもったのですが、

      顧客名ごとの各月ごとの前回購入日の定義が難しいです。

       

      よろしくお願い致します。

        • 1. Re: 月別で前回購入期間の計算
          Keiko Iizuka

          添付作成してみました。

          「確認用」シートをまず完成させて、それを何とか棒グラフに出来ないか、というアプローチでやっています。

           

          基本的な考え方は、Ogawaさんのおっしゃる通り

          DATEDIFF('month',[オーダー日],[前回購入日]>1なら1か月以内購入、

                                                                      >6なら6か月以内購入

          なので、以下2つの計算フィールドを作成しています。

           

          [前回購入からの期間]

          DATEDIFF("month", [Last Time Order], attr([オーダー日]))

           

          [初回・再来区分]

          if ISNULL([前回購入からの期間]) then "初回"

          elseif [前回購入からの期間] <= 6 then "6ヶ月以内購入"

          elseif [前回購入からの期間] <= 12 then "1年以内購入"

          else "1年以上前購入"

          end

           

          今回難しいのは、[Last Time Order]をLOOKUP関数で算出しているところですね。

          LOOKUP関数のようなTableauの表計算関数は、名前通り「表」にしたときに、何かを基準に1つ前を見たり、1つ後ろを見たり…という関数です。

          ですので、表の形式を変更したら(例えばクロス集計→棒グラフ)、表にディメンションを追加したら、どこを基準にどこを見にいくのか設定し直す必要があります。

          「サンプル」シートに配置されている[初回・再来区分]を右クリック→「表計算の編集」メニューを色々いじって確認してみてください。

           

           

          もし可能であれば、元データの方で「前回購入日」や「初回・再来区分」の算出をしてしまって、各レコードごとに確定した値を持ってしまえればベストです。

          • 2. Re: 月別で前回購入期間の計算
            Keita Ogawa

            IIZUKA様

             

            サンプルシートありがとうございます。

            希望する値がでました。最近いつも返答して貰っていたMURAKAMIさんがご不在で若干あきらめてました。。

             

            どうもATTRの使い方が明確になりません。

            この場合もそこになぜATTRが?って感じです。どこかに詳しく書かれていれば良いのですが。

             

            ご指摘の通りカスタムクエリでレコード毎に前回来店日を追加してしまうのが一番すっきりしますね。

            それ以外でのアプローチがあるか知りたかったので参考になりました。

            またどうぞよろしくお願い致します。

            • 3. Re: 月別で前回購入期間の計算
              Keiko Iizuka

              Ogawa様

               

              お役に立ててよかったです。

              レコードごとに前回来店日を固定できるのであれば、単純に(今回)来店日と前回来店日を同レコード内で比較するだけなので、だいぶ楽になると思います。

               

               

              ATTR関数ですが、私は「本来集計する必要がないデータを、Tableauの計算フィールドの中で単位を合わせるために集計するための関数」だと認識しています。

              Tableauの計算フィールドを書いていると、よく下記のようなエラーメッセージが出ませんか?(私はしょっちゅう出ます。)

              calc editor_error.png

               

              大前提として、計算フィールドの中で使用するディメンションやメジャーは、集計なら集計、非集計なら非集計のどちらかに統一する必要があります。

              今回は[Last Time Order]の中で min([オーダー日]) を使用しているので、[Last Time Order]はすでに集計されています。

              そうすると[オーダー日]も集計に合わせるしかないのですが、日付型のディメンションをSUMやAVGしても??となるので、私はよく以下の3つを使います。

               

              ・ATTR

              ・MIN

              ・MAX

               

              ATTRは「すべての行について1個の(ユニークな)値を持つ場合にのみ、指定された式の値を返します」。

              今回はビューの中に絶対にオーダー日が存在する、かつスライスの最小単位として存在することが分かっていたので、「絶対にユニークな値があるでしょ」ということでATTRを使用して”集計された”日付を返しました。

              今回のケースだと、MINでもMAXでも結果は同じになるはずです。

               

              ただしビューの構造次第でユニークかユニークでないかは変化するので、毎回どれを使っても大丈夫、というわけではないのですが…。

              例えば以下のケースだと、各カテゴリで複数回購入している場合には、複数のオーダー日が返ってくるので * となります。

              attr.png

              1 of 1 people found this helpful
              • 4. Re: 月別で前回購入期間の計算
                Keita Ogawa

                IIZUKAさん

                 

                詳しい説明をありがとうございます!

                「集計および非集計を混在させることは・・・」のメッセージは毎日見てます笑

                自分でも使いこなせるようにしたいと思います。

                またよろしくお願い致します