Tableau で Calendar その1 (全部で3か4)
先日、会計カレンダーの日付コンバージョンについてアップしたのですが、関連して、カレンダービューの作り方について書いておきます。
いきなり年度のカレンダーにいこうかと思ったのですが、想像以上に、STEPが多すぎたので、月度標準カレンダーからはじめます。
最終的には上記のようなVIZになります。
種明かしからすれば、横軸に曜日ごとに番号をつけ、縦軸に週ごとに番号をつけて、表にしてあげれば良いです。
こんな感じに数字が隠れています。
ちなみに、表示は以下のようにShow Headerの ON/OFFで切り替え可能です。
さて、縦軸、横軸にそれぞれ何が入っているかというと、
横軸
[Weekday ID]
datepart('weekday',[Calendar Date])
縦軸
[Week number]
datepart('week',[Calendar Date])
です。
'weekday' は、日曜日から順番に、1~7 で土曜日が7になります。
'week' は、1/1 から、1/2 以降いちばん早い土曜日までが week 1、以降日曜日を迎える度に 1ずつ増えていきます。最大53です。
どの週から始まろうが、月でフィルターしているので、少ない番号から順番に並んでくれます。
基本、以上でよいのですが、あと、少しだけビューを工夫します。
曜日の名前をHeaderに表示します。
曜日の名前は、下記の式です。
[Weekday Name]
datename('weekday',[Calendar Date])
これで、"Sunday" ~"Saturday" に変換されます。日本語版を使っていないので、「日曜日、土曜日」等の日本語標記がどうなるかは、残念ながら検証してません。
(どなたか教えてください。)
それともうひとつ、土曜日、日曜日を赤色で、他の曜日を黒色で表示します。
[Weekday Color]
if [Weekday ID]=1 or [Weekday ID]=7
then "Red" else "Black" END
色は、Red、Blackと表記するだけでは自動では変更されないので、Manualで変更します。
同様にして、Redを赤にします。
できました。
Headerを非表示にすると、下記の通りです。
今日はここまでで終わりたいと思います。
カレンダーやり出すと、手がかかり出します。
しばらく続ける予定です。次回は、曜日の始まりを月曜日にします。
それでは、ご自分でトライして楽しんでください。
製品Aと製品B 両方ともお買い上げのお客さま~
さて、Kaori さんの 投稿から
Twitterでいろいろ見ていると、Tableauに関してのAkiyah さんのブログを発見しました。
標題の件は、過去に何度か質問をされた方もある内容で、
『2つの商品を両方とも購入した顧客を抽出する』
という課題です。
Akiyah さんはLODを用いて4つのフィールドを作成し、VIZを作成されています。
ただ、ブログ内にもある通り、
計算フィールドを4つも作らないといけないところがつらいところです。 もっといい方法があるよ、という方、教えて下さい。
ということを書かれています。
そこで、これにお答えして、ちょっと別の方法をご紹介したいと思います。
LODを使用するのは同じですが、4つのMeasure Fieldsを作成する代わりに、一つのDimensionを作成して、カテゴリ分けしてしまいます。
作成する Calculated Fieldは、ちょっとややこしいですが、全体で見れば、より使いやすいと思います。
使いやすさの一つの例も紹介します。
Calculated Field を作成する
LODを用いて、Field内で条件分けを複数作成します。
[Customer Category]
if
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 1] then [Sales]end)}>0
and
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 2] then [Sales]end)}>0
then
"1-Purchased both "+[Param 1]+" and "+[Param 2]
elseif
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 1] then [Sales]end)}
=
{fixed[Customer Name],[Order month] :sum([Sales])}
then "2-Purchased "+[Param 1]elseif
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 2] then [Sales]end)}
=
{fixed[Customer Name],[Order month] :sum([Sales])}
then "3-Purchased "+[Param 2]ELSE
"4-No purchase on "+[Param 1]+" nor "+[Param 2]
END
ちょっと長い? そうですね。ちょと解説を付けます
[Customer Category]
if
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 1] then [Sales]end)}>0 // 該当月、該当顧客のうち、カテゴリがParam 1 に合致する売上げを合計して、0 より大きいかどうかを判定and
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 2] then [Sales]end)}>0 // 該当月、該当顧客のうち、カテゴリがParam 2 に合致する売上げを合計して、0 より大きいかどうかを判定
then
"1-Purchased both "+[Param 1]+" and "+[Param 2] // 両方に合致すれば値を返す。(=Param 1, Param 2 両方に売上げがある場合のみ)
elseif
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 1] then [Sales]end)} // 該当月、該当顧客のうち、カテゴリがParam 1に合致する売上げを合計
=
{fixed[Customer Name],[Order month] :sum([Sales])} // 該当月、該当顧客の売上げを合計
then "2-Purchased "+[Param 1] // 両者が合致すれば値を返す。(両方が同じであれば、結果的に Param 1 のみに売上げがある場合となります)elseif
{fixed[Customer Name],[Order month]:sum(if[Product Category]=[Param 2] then [Sales]end)} // 該当月、該当顧客のうち、カテゴリがParam 2に合致する売上げを合計
=
{fixed[Customer Name],[Order month] :sum([Sales])} // 該当月、該当顧客の売上げを合計
then "3-Purchased "+[Param 2] // 両者が合致すれば値を返す。(両方が同じであれば、結果的に Param 2 のみに売上げがある場合となります)ELSE
"4-No purchase on "+[Param 1]+" nor "+[Param 2] // 上記以外の場合
END
できましたか。
テキストに、1~4 の番号を追加したのは、強制的にその順序でソートするためです。必須ではありません。ちょっとしたノウハウです。
これで、このFieldをColor Shelf に追加すれば、色分けは完成です。ついでにLabel Shelfにも追加してLegend がなくても分かるようにしました。
このソリューションのもう一つのメリットは、表示が「Param-1」 とかだと、どのカテゴリか分かりにくかったのが、選択されたカテゴリ名を表示することで一目で分かるようになることです。
でもまだ、なんとなく物足りません。
というのは、両方買った顧客のことを強調したいので、それを工夫したいのです。
そこで、さらに一計を案じます。
強調1-Colorを変える
1- のカテゴリを強調する=他のカテゴリを目立たないようにします。
Edit Colorsで、薄めの配色を選択します。
次に、強調したい1- のカテゴリのカラーのところでW-Click します。
Paletteが開くので、濃い色を選択します。
センスはともかく、ちょっと強調できました。
強調-2 Label サイズを変える
さらに、もうひとつ欲張ります。
1- のカテゴリだけ、Labelを大きくしたいのです。
。。。
これは標準では出来ないので、ちょっとしたトリックを使います。
さっきの色と一緒で、「1-」 と それ以外 で違うLabelを使います。そのために、Labelのためだけに、二つのFieldを追加します。
実行するのはいたって簡単。
[HighLight]
if [Customer Category] = "1-Purchased both "+[Param 1]+" and "+[Param 2]
then [Customer Category] end
[Non-HighLight]
if [Customer Category] <> "1-Purchased both "+[Param 1]+" and "+[Param 2]
then [Customer Category] end
上記の2つのFieldです。
ここから、2つともLabel Shelfに追加します。
Label ShelfをClickしたあと、詳細設定を開きます。
詳細設定のダイアログの中で、改行を解除し、Highlight のみ選択し、サイズを変更し、と太字にします。
Labelは、複数設定したとき、別々のフォーマットが使えるのです。
なお、Fieldの計算式で、Else 以下を省くことで、条件に合わない場合は[null] 扱いとなっています。[null] は、#NA などの表示がされず、自動的に空白(スペースにもならない)扱いされるので、2つのFieldの条件が同時に成り立たない限り、重複して表示されることはありません。
最終的に、こんな感じの出来上がりです。
では、ご自分で試して楽しんで下さい。
20日締めとか4月始まりとか。。。会計月度計算 その2
さて、会計カレンダーその2です。
前回は、日付から「月度」を算出して、四半期、年と計算して行ったのですが、
年度と月度が会わない月(12月度を特別扱い)とか日付(12/21~12/31 を特別扱い)とか、ちょっと面倒な面がありました。
劇的に改善できるわけではないのですが、少しでもエレガントにしたいと思います。
加えて、カレンダー関連の数字を扱うときに一般的なやり方も含むので、他のケースでも応用可能だと思います。
それぞれの日付から直接、月、四半期、年を計算するのはその都度検証が必要で面倒だったので、今回は、あえて一段階ステップを増やして、「日付ごとに会計カレンダー用の違う日付に変更」してしまいます。
といっても、会計カレンダーの場合、「何年何月何日」を設定しようと思ったとき、「何年何月」までは問題ないのですが、「何日」で問題が生じます。
なぜでしょう?
実は例えば、20日締めで翌月になる場合、2月度は 1/21 ~2/20 となり、日数は31日となります。1/21~1/31 = 11日 、2/1~2/20 = 20日 で31日です。
つまり、2/30、2/31 という通常カレンダーでは現れない日にちが必要になるのです。
これでは、日付を 1対1でコンバートする訳にはいきません。
ですのでここでは、日付ごとにその日付の属する会見月度の最終日を割り振ることにします。
毎月20日を越えると(21日から)、通常の月度の翌月になります。
月度を計算してから「1」を足すと、13月が生じてしまうため、日付計算の計算式の中にこのロジックを取り込んでしまいます。
そうすれば、12月の翌月は自動的に1月になるし、自動的に翌年度になる訳です。
実際の計算式は、複数の日付に関する関数を使います。
[Fiscal calc date end 2]
date(
str(year(dateadd('month',iif(day([Calendar Date])>20,1,0),[Calendar Date])))
+","+
str(MONTH(dateadd('month',iif(day([Calendar Date])>20,1,0),[Calendar Date])))
+",20")
date() 関数は、()の中身が文字列(str)のとき、特定のFormatを満たしているとき、それを日付に変更してくれます。
目指すのは、"yyyy,mm,dd"のFormatなのですが、yyyy、mm、dd ともちょっと工夫しています。
yaer(日付のFormat)
- 年を4桁の数字で返します。
dateadd('カレンダーの単位',数字,日付のFormat)
- カッコ内の日付から、数字分の単位(月、年、週など)をずらした日付を返します。
day(日付のFormat)
- カッコ内の日付から「日」を返します。
str(数字)
- 数字を文字列で返します。
iif(条件,x,y)
- 条件に合致すれば xを、合致しなければ y を返します。
全部合わせて無理やり翻訳すれば、
『[Calendar date] から、20日/21日を境にして、一番近い未来の20日を日付Formatで返しなさい』
ということになるかと思います。
長々と書きましたが、とにかくこれで、日付ごとに一番近い未来の20日が算出できました。
月度は、この新しい日付自身の月度を
[Fiscal month 2]
month([Fiscal calc date end 2])
で計算すれば良いわけです。20日の条件分けはすでに出来てるので、そのまま月度が取得できます。
年度、四半期に関しては、そのままだと標準カレンダーに従ってしまうので、[Fiscal month 2]の月自身を3ヶ月ずらします。
ここでもdateaddを使うわけですね。
[Fiscal Year 2]
year(dateadd('month',-3,[Fiscal calc date end 2]))
[Fiscal Quarter 2]
datepart('quarter',(dateadd('month',-3,[Fiscal calc date end 2])))
ちょっとだけ簡単になってませんか?なってない。。。!?
最初の日付のコンバートが余計にややこしいですかね?
そうかも知れません。
ただ、ポイントは、アプローチのやり方が複数あるってことです。
1.『四半期や年度や月度を一旦計算した後で、特別扱いの条件を加える』
2.『四半期や年度や月度を計算する、もとの日付自体を変える』
の2つがあります。
それぞれ、その1(前回).その2(今回) に 示したことになります。
どっちのアプローチを使うべきかは、簡単さ、間違いの生じにくさ、事後の解析のし易さ でケースバイケースの判断になると思います。
それでは、ご自分で試して楽しんでください。
20日締めとか4月始まりとか。。。会計月度計算 その1
今日は趣向を変えて、カレンダーに関するトピックです。
通常の日付から、20日締めの会計月度や、4月始まりの会計年度を計算します。
If 構文を使えば、できるのです(その1)が、そこにいくつか工夫を加えてちょっと簡単にしてみたいと思います(その2)。
まずは、分かりやすいように、「日付」、「月」、「年」を日付データから予め抽出します。
[Normal day]
day([Calendar Date])
[Normal month]
MONTH([Calendar Date])
[Noramal year]
YEAR([Calendar Date])
会計「月」の計算は、
[Fiscal month 1]
if [Normal day]>20 then [Normal month] +1 else [Normal month] END
としたいところですが、これだと、答えが「13」を含んでしまいます。
ですので、以下のような回避方法を取ります。
[Fiscal month 1.1]
if [Normal day]>20 and [Normal month] <12 then [Normal month] +1
elseif [Normal day]>20 and [Normal month] =12 then 1
else [Normal month] END
13がでるのは、12の時だけなので、12だけ特別扱いしています。
会計「月」が出せれば、四半期は簡単です。
[Fiscal Quarter 1]
if [Fiscal month 1.2] <=3 then 4
elseif [Fiscal month 1.2] <=6 then 1
elseif [Fiscal month 1.2] <=9 then 2
elseif [Fiscal month 1.2] <=12 then 3
END
年は少しややこしいです。
[Fiscal Year 1]
if [Fiscal month 1.2]<=3 then [Noramal year] -1 else [Noramal year] END
これだと、12/21~12/31 までがおかしくなってしまうのです。
なので、
[Fiscal Year 1.1]
if [Fiscal month 1.2]=1 and [Normal month]=12 then [Noramal year]
elseif [Fiscal month 1.2]<=3 then [Noramal year] -1 else [Noramal year] END
一応、これでできました。
月や年の出し方がちょっとエレガントさとは、かけ離れています。。。
ですので、次回、もう少し別のアプローチを考えます。
それでは、ご自分で試して、楽しんでください。
棒グラフに2つ目のカテゴリーで色づけする
さて、今日は積み重ね棒グラフで、2つのカテゴリで色を付けてみます。
完成形を示したほうが早いと思います。以下のようなグラフを作成したいという意味です。
実は、知られている簡単な方法はあって、2つのDimensionをColor Shelfに持っていくというものです。
できました。
これはこれで便利ですし簡単です。
しかしながら、カラー Legendが 9種類になっていて、見にくいのと、色を変えたいときにすごーく面倒くさいのが難点です。加えて、(これがいちばん難ですが)Product Categoryの色をカスタマイズしているときは、カスタムカラーが無視されるという不具合もあります。
ですので、これとは 別の解法を示します。
スタートは、下記のシンプルなビューです。
あえて、Product Categoryの色をカスタマイズしています。
まず、"Sales" Fieldをもうひとつ、2ndary Axisに設定します。
Synclonizeも忘れずに。
棒グラフが2つになりました。
2軸目のグラフのColor Shelfに、"Ship Mode"を追加します。
こうなります。
元のカラーが、2軸目のカラーで上書きされました。
2軸目のカラーの"Edit Colors"を選択します。
Gray 5 あたりがよろしかろうと思います。
このままだと、濃淡が順序よくなっていないので、Delivery Truck のところをダブルクリックして、色を変更します。
さらに、2軸目の Color を"Edit Color"で、Transparencyを下げます。
25%で下のようになります。適当に選んでください。
2軸目の 表示を隠して、
Label を追加します。
これで、いちおう出来上がりです。
これだと、カスタマイズした"Product Category" の色調はそのままで、濃淡で"Ship Mode"の違いを表すことができます。
それでは、自分でトライして、楽しんでください。
標準棒グラフと積み重ね棒グラフを並べて表示する
ブログの継続って、やっぱり大変ですね。。。ある程度は恐れていたとはいえ、4ヶ月も空いてしまいました。
気を取り直して、再開です。
今日は、違うタイプの棒グラフを並べて表示する方法です。
めっちゃ簡単なのですが、同僚からいくつか問い合わせがあったので上げてみました。
データは、タブローのSample File を使いました。
Sample - Superstore Sales (Excel).xls |Tableau Support Community
こんな感じのビューからスタートです。
ゴールは、
背の低いアイテムを、ひとまとめにしたい。
でも、ひとまとめにしたアイテムだけ、積み上げグラフにしたい というものです。
まず、背の高い順番に並べます。
こうなりました。
Sales 500k 以下のアイテムをひとまとめにします。
いろいろ方法はあります(Group とか、Set とか)が、今回は、LODの計算式を使います。
[Province 2]
if {fixed [Province]:sum([Sales])} > 500000 then [Province] else "Small Sales" END
Fixed + Sum は、エクセルでいうと、「SUMIF」と同じ感じです。
{fixed [Province]:sum([Sales])} で、『他のDimensionの値に関わらず、[Province]で合計しなさい』という意味になります。
さて、
Columnに、[Province] の代わりに、[Province 2]を持ってきます。
すると、こうなりました。
違うDimensionを持ち込んだので、Sortはやり直しです。
ここで、[Province2]をColor Shelfに持ってくると、以下のようになります。
タブローの機能の中では、ColumnとLabel やColor は、必ずしも一致させる必要はありません。
ですので、[Province2]の代わりに、[Province]をColorに持ってきます。
すると、"Small Sales" の項目だけが、色分けされました。
なんのことはない、通常グラフの中身を色分けしただけで、物理的に通常グラフと積み重ねグラフを並べたわけではありません。
が、まあ、そのように見えるということです。
Color LegendのOrderが、Viewと異なっているので、Legendもソートします。
出来上がりはこのようになります。
では、自分でトライして、楽しんでください。
あれれっ?!軸を同期できない?
昨日の続きで、2軸のグラフの話を続けます。
課題は、違う会社同士を比較するグラフを作るです。
まずは、A 社のみのSalesを表すCalculated Fieldを作成します。If を使用して簡単にできます。
[Sales (=Company A)]
sum(if[Company]="A" then [Sales] end)
ついでに言っておくと、例えば、続けてB社の分も作るときは下記の様にして時間を短縮してください。
これで、A社のみのSalesを表すFieldとB社のみのSalesを表すFieldができました。
さて、A社をメイン軸、比較対象のB社を第2軸にしてみます。
続いて、比較対象のB社を折れ線にします。
さらに、第2軸を同期します。軸の編集で、同期を選択するだけです。
Label を入替えて、書式を合わせます。
できました~。
では次、A社と、他社平均を比べます。A社は棒グラフ、他社平均は折れ線です。
まずは、他社平均の計算Fieldを作成。
[Sales (<>Company A)]
sum(if[Company]<>"A" then [Sales] end)/2
Duplicateを使うと早いです。
さて、第2軸に持って行ってみます。
この場合は、既存のピルを上書きします。
第2軸を同期します。
あれれっ!!??
明らかに同期できてないのに、クリックするところがグレイアウトされています。
仕方ないので、マニュアルでってのはエレガントではないので、考えてみます。
さっきはできたのに、急にできなくなりました。さっきとの違いは。。。
そう、小数点です。
タブローでは、Field形式の種類をいくつかのカテゴリーに分けて判断しており、整数は
"Integer"、小数点を含むものは "float" とカテゴライズされています。これは表示形式ではなく、Fieldの中身の問題です。なので、Fieldの形式を揃えるには、計算式そのものを変更してあげる必要があります。
[Sales (<>Company A)]
int(sum(if[Company]<>"A" then [Sales] end)/2)
INTはIntegerの略で、整数で表すという意味です。
小数点は切捨になります。
さて、再度チャレンジしてみましょう。
計算式を変更したら、勝手に同期されてました。チェックボックスも復活しています。
できあがりです。
流れ作業をしていて、第2軸が同期できないって時には、Fieldの形式が違っているので、会わせるようにしましょう。というお話でした。
では、自分でトライして、楽しんでください。
思ったとおりに描けない :2軸のグラフの同期について
さて、更新が滞っておりました。
今日は、棒グラフと折れ線グラフを同時に描いてみます。
と、これ自体はさして難しくはないのですが、併せ技でいくつかおさらい。
まず、このグラフから。
先月との差を、今度はパーセンテージで表したいと思います。
テーブル計算を使います。簡単です。
これを、Rows に持って行くと、下のグラフが得られますが、イマイチです。
重ねて折れ線で表示したいと思います。
グラフの右端にドラッグすると、点線が現れます。これが、「2軸目に表示できますよ」のサインです。
取り合えず、重なりましたが、ちょっとダメですね。
折れ線グラフにしてみましょう。
できました~。が、なんかちょっとイヤですよね。
何かというと、棒グラフのY軸のマイナス部分はいらないんです。
折れ線だけ、マイナスがあれば良いです、この場合は。
さて、軸は、マニュアルでも設定できるので、メインのY軸の最小値を「0」にすることで、解決できます。。
が、そのやり方はエクセレントではありません。
で、そのエクセレントなやり方はこうです。
"Include zero" をCheck なしにします。
すると、
できました~。
Lavelの表示だけ、直しておきます。CTRLキーを押しながら、テーブル計算のピルを
折れ線グラフのラベルに持ってきます。
(一部、ラベルの重なりがありますが、まあ、パワーポイントで見せるなら修正が必要かもって内容ですね。タブロー使いなら、あんまり気にする必要ないレベルです。)
ひとつ注意があって、この「"Including zero" をCheckしない」をメイン軸でやると、こうなります。
一瞬、できたように見えますが、これは大きな間違いです。
Zeroを含まないので、底の数値が12800 あたりから始まっています。
これは、棒グラフでは絶対にやってはいけない表し方です。
ので、注意してください。
では、ご自分でトライして楽しんでください。
エクセルだと無理(たぶん)- 先月との差を表示する
友人から、「エクセルとの違いを教えておくれ」と言われました。
まぁ、随分違うのですが、角度を変えて、なぜタブローぢゃないといけないのか、一つの例を出します。
先日のデータを使って説明します。
まずは、タブローのグラフ
続いて、エクセルのピボットグラフ
忘れてた! エクセルって、Label 貼り付けるの、一つ一つかよ~。またこれで時間かかるがな。
それに、この前やったように、合計数値を表示するって方法
は、エクセルでは分からずじまいでした。どなたかご存知であれば、教えてください。
ともかく、ここまでは、大きな差はないです。
ここで、先月との差をこのグラフに合わせて表示させたいと思います。
両方の作業を再現してみましょう。
まずはエクセル
エクセルのできあがりはこれです。
まあ、使えたもんではないですね。工夫の余地はあるかも知れないですが、省略します。
あんまり時間ないんで 。
次にタブロー
タブローのできあがりはこれ ↓ 見れますね。
となりにおいてみます。
これだけでも、十分差は示せているのですが、
さらに、Companyごとのグラフを表示させたいとします。
え~っと、エクセルの分は省略させてください。あしからず。。。
だって、きちんと見れるグラフにしようと思ったら、
Company の 数 (3通り) x (通常+先月との差)の6種類のグラフを準備して、
それぞれにラベルと色を整えて、、、
すみません。先を急ぎますもので。。
タブローくん、ちょっと代わりにやってみて。
できちゃいました。
早いね~。
これで、月々のSales、先月との差を会社ごとに一覧で表示できました。
加えて、Y-軸のスケールが自動で同期されているので、一つのCompanyが少なめのSalesでも、だまされる事はありません。
軸の同期ってすごく重要で、会社内でも、
「絶対量が少ないのに差が大きいグラフと、絶対量が大きくて差がそこそこのグラフを同時に並べられて、無駄な議論に時間を費やす」
って結構あったんですよね。
かと言って、そうならないようにグラフを作るのは、それはそれで結構大変だったんです。
さて、グラフに戻ると、いくつかの目に付く点をすぐに指摘することができます。
Company A:製品ごとには比較的安定したセールスですが、いくつかのポイントで大きな差があります。
Company B:Prod.3 に関して、触れが大きいです。
Company C:Prod.4 に関して、触れが大きいです。
それに、例えば、特定の製品の結果を強調して見せたい(見てみたい)時には、
カラー凡例のところで、例えば "Prod.5" を選択すれば、それだけハイライトして見せてくれます。
上記はほんの一例ですが、私が、エクセルでこれ以上消耗したくない理由の一部です。
そして、タブローは私の救世主になりましたとさ。
<<タブロー パブリック へのリンク>
では、自分で試して、楽しんでください。