2025年7月19日土曜日

PowerBIでRank5以降をその他としてまとめた円グラフの作成(ただしスライサーなど外部フィルターは効かない)

PowerBIでは、
[日付]と[種類]というテーブル(左の表)から、指定期間(上のスライダー)での種類の発生度数を円グラフにすること(中央の円グラフ)は、
簡単な部類ですが、発生度数上位5位以外をまとめてそれ以外をその他とする円グラフにすること(左の円グラフ)は、何をすればよいか
わからず、手が止まってしまう。

いろいろ調べてやれることと限界が見えてきたので、まとめて記事化しておく。 まず簡単とした円グラフですが、元のテーブル
に、メジャー 「MCOUNT種類 = COUNT('テーブル2'[種類])」を追加して、円グラフで使えるようにする。
資格化で円グラフを選択し、凡例に「種類」、値に「MCOUNT種類」とすると、1つ目の図の中央の円グラフが表示される。
で、ここから問題。 やりたいこととしては元のテーブルに、さらに以下のようなメジャーを追加する。 MRANK種類数 = rankx(ALL('テーブル2'[種類]),[MCOUNT種類]) Mrank5種類 = if([MRANK種類数]<=5,max('テーブル2'[種類]),"その他") MRank5種類順 = if([MRANK種類数]<=5,[MRANK種類数],6) テーブル2から、日付を除く全ての列とメジャーを表示してみると以下のようになる。
上のデータで作りたい円グラフは、[Mrank5種類]を凡例に、[MCOUNT種類]を円グラフの値に、[MRank5種類順]を凡例の表示順にしたもの。 ただ、今回の問題にあたりPowerBIの円グラフでは、以下の制限がある。  1.凡例にメジャーが使えないことで、ランク5以下の種類をその他とするようなことが難しく、  2.凡例の表示順が凡例の名前順か値の大きさでしか指定できないことで、大きな割合の「その他」を円グラフの末尾に配置することが難しい。 それぞれの回避手段として、以下を考えて作ってみる。 1.の回避手段として、サマリーの新規テーブルを作り、Mrank5種類をメジャーでなく、列値として確定してしまう。  この弊害として、サマリーテーブルでは、日付列がなくなる。   →スライサーなど外部フィルターは視覚化部品の描画の直前で適応されるため、サマリーテーブルに指定日付範囲を適用できない。    →外部フィルターの適用は諦め、Filter関数などであらかじめ絞り込まれたテーブルで、サマリーテーブルを作る。 2.の回避手段として、凡例の前にRank番号を表示して、表示順を凡例名順の昇順にする。  この弊害として、凡例の前に意味のない数字が表れる。 いろいろ制限があるが、とりあえずやってみる。 まず、1つ目の新テーブルとして、Filter関数で元のテーブルから絞り込みをする。 [モデリング]メニュー→[新しいテーブル]ボタンで、以下の入力をしてみる。 Filteredテーブル = FILTER('テーブル2','テーブル2'[日付]>=dt"2025-6-7"&& 'テーブル2'[日付]<=dt"2025-7-6") (FILTER関数の結果を直でテーブルとして使うことに抵抗があるなら、以下でもいいかな。) Filteredテーブル = CALCULATETABLE('テーブル2','テーブル2'[日付]>=dt"2025-6-7", 'テーブル2'[日付]<=dt"2025-7-6") 追加したFilteredテーブルに以下のメジャーを追加する。 ftMCOUNT種類 = COUNT('Filteredテーブル'[種類]) ftMRANK種類数 = rankx(ALL('Filteredテーブル'[種類]),[ftMCOUNT種類]) ftMrank5種類 = if([ftMRANK種類数]<=5,max('Filteredテーブル'[種類]),"その他") ftMRank5種類順 = if([ftMRANK種類数]<=5,[ftMRANK種類数],6) 2つ目の新テーブルとして、サマリーテーブルを作る。 [モデリング]メニュー→[新しいテーブル]ボタンで、以下の入力をしてみる。 sumt = var s1=SUMMARIZE('Filteredテーブル','Filteredテーブル'[種類]) var s2=ADDCOLUMNS(s1,"MCOUNT種類",[ftMCOUNT種類],"nm",CONCATENATE([ftMRank5種類順],CONCATENATE(".",[ftMrank5種類]))) return s2 2つ目に追加したテーブルにメジャーを追加する。 メジャー = sum(sumt[MCOUNT種類]) 新しい円グラフをつくり、凡例をnm,値をメジャー,視覚化部品右上の3点リーダーから、軸の並び替えを選ぶ
で、一番上の右の円グラフが完成する。ただ、サマリーテーブルを作っている。 サマリーテーブルでは、既に日付列が既に存在しないため、スライサーの日付の影響を受け付けないので、使い物になるのかどうかといったところ。 もっといい方法があるのかもしれないけど、私にはここまででした。