見出し画像

Preppin Data Practice #11 (25年2月 2025 : PDPJ_004 Prep講座の、受講生と講師の人数を把握しよう)

Japan Preppin' Data Fam 第11回目のPreppin' Data勉強会、25年2月のYouTube動画公開は、25年1月にPreppin' Data勉強会でチャレンジした内容から、Tableau Prepユーザー会の自作問題をチャレンジです。

本家のPreppin‘ Dataが25年 年明けからお休みに入っているため、ユーザー会のメンバーが自作問題をつくり始めました。
自作問題は、ユーザー会のNoteページで公開しています(下記リンク先です)。
https://note.com/tableauprep_user/m/m5d525d7094b8

今回は、その中からの、4番目の問題(PDPJ_004)を取り上げます。
Tableau Prepの講座に参加した受講者が午前と午後に何人参加していたか、講師は午前と午後通しで対応したかを確認するためのデータ処理になります。

是非、Preppin' Data勉強会の配信動画(YouTube)と合わせてご覧ください。アーカイブのリンク先はこちらです
https://youtu.be/4gD9RpUUFmo?si=V2P136eqZNzcV30n


1)課題の内容

今回取り上げた課題は、下記を参照ください。

出題の背景、対応項目

Prepの講座に参加した受講生の人数把握をすることになったのですが、送られてきたデータにトラブルが、、、日付データのはずが、数値データになっています。
データが集計されたExcelファイルからの出力時に、日付型のデータではなく、数値データ(シリアル値)で扱われてしまったようです。

さあ、トラブルに対応し、受講生の人数と共に、対応した講師の人数も把握する課題にチャレンジしましょう。

入力データ

1)出席者名簿 : Participant list 2

データソース:Participant list 2.xlsx

データソースは、次のリンク先にあります。
https://docs.google.com/spreadsheets/d/1XRwRbpQ4986FUCDyFGNmvaJsrw3qeKxP/edit?usp=sharing&ouid=106772308224852769026&rtpof=true&sd=true

要件

下記の記述に従い、フローを作成してください。

(1) データソースを接続して、内容を確認してください。
(2) 受講日のデータが、数値になっています。講座は、2025年3〜 4月に開催され
 る名簿です。日付形式のデータに修正する必要があります。
  *講座の開催期間は、3月1日〜 4月19日 です。
(3) 受講した時間のデータを、開始時間と終了時間に分けてください。
(4) 受講生、講師をそれぞれ午前(13時まで)、午後(13時以降)に参加した
 人数として開催日ごとにまとめてください。
午前と午後に両方に参加した方は、それぞれ午前 1名、午後 1名 として数え
 てください。
 講師のデータには、講師の名前も入れてくださいね。

出来れば、受講生と講師の人数をまとめる方法を、違う手段を使ってください。
 *集計 以外にもまとめる方法があるのでは?

(5) まとめた結果を、Excelファイルの形式で出力してください。受講生と講師
 のデータはそれぞれ別のワークシートに分けて、1つのExcelファイルとして
 出力してください。

出力

2つの出力データをExcelのテーブルとして作成し、ファイル出力時に同時にExcelファイルとして出力作業が出来るように試みてください。

Excel形式のファイル(例) : ファイル名 Prep Course Participant List.xlsx
https://docs.google.com/spreadsheets/d/1f1ybTSvNZMpeTqC2xn5a3Jg3H3gAvUVg/edit?usp=sharing&ouid=106772308224852769026&rtpof=true&sd=true

<Participants>
・開催日
・午前の受講者数
・午後の受講者数
フィールド数 3
レコード数 50(ヘッダー含み 51)

<Lecturer>
・開催日
・午前の講師数
・午後の講師数
フィールド数 4
レコード数 185(ヘッダー含み 186)

2)参加者の解答例、Tipsなど

今回の問題に対する対応課題は、次の3つになります。
 (1) 数値型になっている日付データの扱い
 (2) 時間データの扱い(計算方法)
 (3) 集計処理、集計ステップ以外の処理方法

順に参加者の回答内容を見ていきましょう。

(1) 数値データの日付への対応

問題のデータソースに利用されたExcelにおいて、日付データはシリアル値(数値)として扱われています。Excelでは、1900年1月1日を1として、何日経過したかを表す数値として利用されています。
今回の参加者は、いろいろなタイミングで、Prep中での日付型変化処理を試みています。ステップのタイミングによっては、上記のリンク先方法で対処できないケースもあったようです。

クリーニングステップでの日付型への変更(Riekoさん)
データ接続後のクリーニングステップで、シリアル値を型変換しようとしたら、NULLになってしまったようです。

このExcelのシリアル値をTableauで日付型に変換する方法を、SaleForce社HPで発見し、対処を実施しています。

クリーニングステップで日付型に変換
NULLになってしまった!!

[開催日]
DATE(INT([開催日])-2)

ここで、INTで数値型に変更した上で、DATE関数を利用すうることで、日付型に変換する
SaleForceのHP記載の日数を2調整する作業をしています。
日付型に出来た!!

クリーニングステップでDATEADD関数を利用する(たっくんさん)

Excelのシリアル値を利用した場合、今回の開催日の初日は 45,717 になっていることを利用して、DATEADD関数で用いるinterval の値を [開催日]-45717 で計算し、開催日の初日(3月1日、#2025-03-01#)に加える計算式で、各々の開催日を算出しています。

[開催日]
date(dateadd('day',[開催日]-45717,#2025-03-01#)

シリアル値と開催初日を利用した計算方法

アーカイブでは説明がありませんでしたが、nakajima2で以前この問題を対応した時に、クリーニングステップで読み込まれているシリアル値を、そのままDATEADD関数のinterval の値に利用することで、日付算出をしています。

[開催日]
date(dateadd('day',[開催日],#1899-12-30#))

シリアル値をExcelの基準値を参考にして計算させる方法

データソース接続に日付型に直接変更(Kaoriさん)

Prepがデータソース接続をする時点の処理をしています。
データ接続時点では、PrepがExcelなどからのデータを処理すると認識出来るようで、この接続時点でデータ型を「日付型」に変えてしまうことで、難なく正しい日付データを得ることが出来ています。

データ接続の処理時に日付型に型変更してしまう


(2) 午前と午後の参加者集計(時間データの扱い方)

時間を関数で作成する(Riekoさん)

文字列データを分割し、開始時間と終了時間を先に分けて、時間(9時など)の部分をデータとして抽出します。
その文字部分を、MAKETIME関数を利用して日付時刻型のデータとして時間の処理が可能としています。

[終了時刻]
MAKETIME(
     INT(
     REPLACE(
          LEFT(TRIM( SPLIT( [時間], "-", 2 ) ),2),":","")
     ),0,0)

MAKETIME関数を利用した日付時刻型の計算例

文字列の時間分のみを分割で取り出す(Kaoriさん)

時間のデータは、全て定時(00分)になっている点を利用して、時間の文字列のみを扱い時間計算に利用しています。
開始時間に対しては、’:’ の分割処理を上手く利用し、1回の処理で開始の時間のみを数値型データに変更しています。
終了時間は、分割処理を複数回行うことで、1回の処理で時間を取り出す処理をしています。

[開始時間]
INT(SPLIT( [時間], ":", 1 ) )

最初の ’:’ の左側部分のみを取り出し、数値に変換して利用する

[終了時間]
INT(SPLIT(SPLIT( [時間], "-", 2 ), ':',1))

"-", の後を取り出し、 ':' の前を取り出し数値データに変換して利用する 

(3) 人数の集計作業(集計ステップ、その他の方法)

集計ステップを利用(たっくんさん)

講師の集計処理において、集計ステップを上手く利用した例です。
午前午後の人数をカウントするために、クリーニングステップで 1 , 0 のフラグを立てて集計を共通に処理しています。

全体のフロー

参加者の集計は、フラグを合計で集計することで求めています。

参加者人数の集計

講師の集計においては、各講師が午前と午後にいたかどうかを確認するフラグを立てる回答になっています。
このため、集計処理では最大値(MAX)を用いて 1 , 0 の 1  を取り出すように工夫しています。最小値(MIN)とすると 0 が取り出されてしまいますね。この点は、よく考えられた処理対応です。

FIXED関数の利用と条件式の併用(Riekoさん、Kaoriさん)

午前参加者の集計に、FIXED関数を利用しています。
FIXED関数で集計を行う計算式の後半部分に条件式を入れる技を使っています。計算式の集約し、スマートに記述する良い方法です。

[午前参加者]
{ FIXED [開催日],[講師]:
     COUNTD(if [午前フラグ] = 1 then [講師] END)}

//午前フラグの場合だけ講師数を数える

Riekoさんの条件式を含めたFIXED関数の利用方法
Kaoriさんは、午後のフラグも同時に確認している

 3)いちばんシンプルな処理は

最もシンプルに必要最低限の処理だけでフローを作成したのはもりたさん。
データ接続時に日付型に変更し、最初のクリーニングステップで午前午後の参加状況を一つの計算式でフラグを作ります。
参加者と講師の集計は、それぞれ合計と最大値を利用して処理をしています。開催日順の日付ソートも行っています。

もりたさんのシンプルなフロー

[午前参加者]
IIF
     (
     INT(SPLIT(SPLIT([時間],'-',1),':',1))<13
     ,1
     ,0
)

午前参加者のフラグ計算

[午後参加者]
IIF
     (
     INT(SPLIT(SPLIT([時間],'-',2),':',1))<=13
     ,0
     ,1
)

午後参加者のフラグ計算
参加者の集計
講師の集計

4)参加者が回答したPrep フローファイル

勉強会に参加したメンバーが作成したPrepフローのファイルを公開致します。
このブログ、動画アーカイブをご覧頂いたみなさまで、ご自分で手を動かしフロー作成をされた方の少しでもご参考になればと思っています。
下記のリンク先にフローファイルを保存しています。みなさまのお役に立てれば幸いです。
https://drive.google.com/drive/folders/1_HgV0zC5Yq_n-4v2oEc6XaFmgu8P3By2?usp=sharing

5)おわりに

今回で11回目の勉強会 公開配信(ビデオ解説)になります。
それぞれが他の参加者から得た気づきを持ち帰り、実務で応用する機会が得れたと感じています。

Preppin' Data勉強会では、新規参加者を募集しています。
 ・Prep使ってみたい
 ・仕事で使っているけど ちょっととっつきにくい
 ・Preppn' Dataの初心者向け課題を始めました
という方々、一歩踏み出してスタートすると想像以上に力がつきます。実務でも役立つTipsが 目から鱗いっぱいありますので、是非ご参加ください。

参加希望の方は、下記までメールご連絡をお願いします。
Tableau Prepユーザー会 : tableauprep.usergroup@gmail.com

いいなと思ったら応援しよう!