病院のベッド利用と Tableau Prep
病院が満床状態になることは問題ですが、リソースを過剰に抱えることもまた問題です。ベッドをリソースと考える病院の視点でベッドを理解することが重要です。しかし、患者の視点でデータが保管されていることがよくあります。いつ患者がベッドを利用しているか、ベッドの使用状況はどのようなものかなどを判別できるデータはどうすれば得られるでしょうか?
注: このチュートリアルのタスクを完了するには、Tableau Prep をインストールする必要があります (Tableau Desktop は任意)。
Tableau Prep と Tableau Desktop をインストールするには、「Tableau Desktop および Tableau Prep 導入ガイドの概要」(新しいウィンドウでリンクが開く)を参照してください。または、Tableau Prep(新しいウィンドウでリンクが開く) と Tableau Desktop(新しいウィンドウでリンクが開く) の無料トライアル版をダウンロードすることもできます。
以下の 3 つのデータ ファイルをダウンロードする必要もあります。データは、マイ Tableau Prep リポジトリのデータ ソース フォルダーに保存することをお勧めします。
- Beds.xlsx(新しいウィンドウでリンクが開く)
- Hours.xlsx(新しいウィンドウでリンクが開く)
- Patient Beds.xlsx(新しいウィンドウでリンクが開く)
データ
A、B、C、および D のベッド 4 床に対し、どの患者がベッドを利用しているかと、その患者の利用の開始と終了の時刻を追跡します。データは次のようになります。
予備的な分析
このデータを Tableau Desktop に読み込むと、患者がいつベッドを利用しているかを表示するガント チャートを作成することができます。
これは便利な Viz です。ベッド A とベッド B は未使用の期間が短いことが分かりますが、ベッド C はこの期間が長くなっています。ベッド D の患者の終了時間がありませんが、これはいくつか計算で解決できます。これでベッドの利用状況に関する概要が視覚的に把握できます。
しかし、ベッドが空いている時間数をカウントしたい場合はどうでしょうか? さらに、新方針の実施前後でベッドの空き時間を比較するとどうなるでしょうか? 現在のデータ構造では、このような情報を得るのは容易ではありません。
目的のデータ構造
ごく基本的なデータ セットを作成して Tableau Prep で組み合わせることにより、このデータ セットをより高度な分析を実行できる形式に変えたり、さらに有益な Viz を作成できるようになります。
しかし、Tableau Prep に進む前に「各ベッドが未使用の状態は何時間だったか?」の質問に答えるには何を作成する必要があるか、ここで立ち止まって考えてみましょう。
各ベッドについて 1 時間単位で検討し、ベッドを使用した患者の有無を把握する必要があります。現時点では、患者がベッドを使用したときのデータのみが存在します。ベッドが未使用だった時間に関する情報は Tableau に提供していません。
全ベッドと全時間から成る完全なマトリックスを作成するために、2 つの新しい データ セットを作成します。1 つはベッド (A、B、C、D) のリストというシンプルなもので、もう 1 つは時間 (1、2、3、…、23、24) のリストです。クロス結合 (1 つのデータ セットのすべての行と、他のデータ セットのすべての行との結合) を行うことで、ベッドと時間の可能なすべての組み合わせ結果が得られます。
Beds.xlsx データ セットは次のように表示されます。 | Hours.xlsx データ セットは次のように表示されます。 | さらに、クロス結合の結果は次のように表示されます。 |
次に、患者のベッド利用に関する情報を作成して、ベッドと時間のそれぞれの組み合わせに、特定の患者がいるかどうかラベル付けを行います。最終的に、ベッドと時間の組み合わせを 1 行とするデータ セットを作成し、患者がベッドを使用していた場合は患者の番号と開始と終了の時刻も算出します。Null 値はベッドが利用されなかったことを示します。
この構造のデータを通じて上記の分析を行うことができ、これによって、利用中のベッドと同様に、利用されなかったベッドについても調査できるようになります。
データの再構成
では、Tableau Prep を使用してこれを行う手順を見ていきましょう。2 つのパートから成るフローを構築します。まず、"Bed Hours (ベッドの利用時間)" マトリックスを構築し、次にこれを "Patient Beds (患者のベッド利用)" データと組み合わせます。3 種類の Excel ファイル (Beds.xlsx、Hours.xlsx、および Patient Beds.xlsx) をすべてダウンロードしていることを確認してください。
Bed Hour (ベッドの利用時間) マトリックス
最初に、Beds.xlsx ファイルに接続します。
Tableau Prep を開きます。
[スタート] 画面から [データへの接続] をクリックします。
[接続] ペインで [Microsoft Excel] をクリックします。Beds.xlsx を保存した場所に移動し、[開く] をクリックします。
[フロー] ペインに [Beds (ベッド)] シートが自動的に表示されます。
ヒント: データへの接続に関する詳細は、データへの接続(新しいウィンドウでリンクが開く)を参照してください。
次に、Hours (時間) データ セットとのクロス結合を実行するために使用するフィールドを作成する必要があります。値 1 を使用するシンプルな計算を追加します。
[フロー] ペインで、[ベッド] を選択し、提案された [クリ―ニング ステップ] をクリックします。
追加した [クリーニング] ステップに [プロファイル] ペインが表示されます。ツールバーで [計算フィールドの作成] をクリックします。
フィールドに「Cross Join (クロス結合)」という名前を付け、値に「1」を入力します。
[データ] グリッドが更新され、データの最新の状態が表示されます。
次に、"Hours (時間)" データ セットでこのプロセスを繰り返します。
[接続] ペインで [接続の追加] ボタンをクリックして、別のデータ接続を追加します。
[Microsoft Excel] を選択してから Hours.xlsx ファイルを選択し、 [開く] をクリックします。
[フロー] ペインで [Hours (時間)] を選択し、提案された [クリーニング ステップ] をクリックしてフローに追加します。
ツールバーの [プロファイル] ペインで「Cross Join (クロス結合)」という名前の計算フィールドを作成し、値として「1」を入力します。
これで、両データ セットに共有フィールド [Cross Join (クロス結合)] が含まれ、結合することができます。
[Clean 2 (クリーニング 2)] を [Clean 1 (クリーニング 1)] の上にドラッグして [結合] オプション上にドロップし、2 つのクリーニング ステップを結合します。
下の [結合プロファイル] に、結合の設定が自動的に入力されます。
「Cross Join (クロス結合)」という名前を両フィールドに付けたため、Tableau Prep でこれらが共有フィールドとして自動的に特定され、適切な適用した結合句を作成します。
既定の結合タイプは内部で、今回もこの設定を使用します。
この結合で 'Beds (ベッド)" のすべての行と "Hours (時間)" のすべての行が照合され、データ グリッドに結果が表示されます。
A. 結合句
B. 結合タイプ
C. データ グリッドの結果
ヒント: 結合の詳細については、データの結合(新しいウィンドウでリンクが開く)を参照してください。
[Cross Join (クロス結合)] フィールドは不要になったので、これらは削除できます。
[フロー] ペインで [結合 1] を選択し、プラス アイコンをクリックして [Add Clean Step (クリーニング ステップの追加)] を選択します。
[Cross Join-1 (クロス結合 1)] と [Cross Join (クロス結合)] を選択して [フィールドの削除] をクリックします。
[Clean 3 (クリーニング 3)] ラベルをダブルクリックし、このステップを「Bed Hour Matrix (ベッドの利用時間マトリックス)」に名前変更します。
これで、すべてのベッドとその全利用時間のデータが含まれた "Bed Hour Matrix (ベッドの利用時間マトリックス)" というデータ セットができ、データ セットを構築する最初のパートはこれで終了です。
患者のベッド利用
パート 2 では、患者のベッド使用状況のデータを取り込みます。最初に、データに接続します。
[接続] ペインで [接続の追加] ボタンをクリックして、別のデータ接続を追加します。
[Microsoft Excel] を選択してから Patient Beds.xlsx ファイルを選択し、 [開く] をクリックします。
[フロー] ペインで [患者のベッド] を選択し、提案された [クリーニング ステップ] をクリックしてフローに追加します。
Bed Hour Matrix (ベッドの利用時間マトリックス) ファイルは時間数を基に作成されていますが、Patient Beds (患者のベッド利用) ファイルは実時間を基準にしているため、Patient Beds (患者のベッド利用) から開始時刻と終了時刻から時間数を計算する必要があります。また、終了時刻については、患者が当日の最終時刻 (真夜中の 24 時) にまだベッドを利用している場合、データ セットに終了時刻がない場合でも、そのベッドはふさがっているとします。この新しいステップの計算フィールドを追加します。
ツールバーで [計算フィールドの作成] をクリックします。
フィールドに「Start Hour (開示時刻)」という名前を付けます。計算のために次のように入力します。
DATEPART('hour',[Start Time])
「End Hour (終了時刻)」という名前を付けて計算フィールドをもう 1 つ作成します。計算のために次のように入力します。
IFNULL(DATEPART('hour',[End Time]), 24)
この計算で開始時刻を表す 1 時間単位の数値が導き出されます。したがって、"1/1/18 9:35 AM" の計算結果は "9" のみになります。
DATEPART
の部分で終了時刻の時間数が取り出されます。IFNULL
の部分は終了時刻の 24 時 (真夜中) を、欠落している終了時刻に割り当てます。
これで、患者のベッド使用状況と「Bed Hour Matrix (ベッドの利用時間マトリックス)」を結合する準備ができました。これは、以前よりやや複雑な結合です。両方のデータ セットにある値のみを返すのが内部結合です。ただ今回は、患者がベッドを利用しているかどうかにかかわらず、ベッドの時間枠をすべて保持したいため、左結合を行う必要があります。この結果、多くが null となりますが、問題ありません。
また、どのベッドの時間枠を患者 (複数の場合あり) が使用しているかの照合を行う必要もあります。患者とベッドの照合作業に加えて、時間についても考える必要があります。"Bed Hour Matrix (ベッドの利用時間マトリックス)" データ セットにあるフィールドは [Hour (時間)] のみですが、"Patient Beds (患者のベッド利用)" データ セットには [Start Hour (開始時刻)] と [End Hour (終了時刻)] の 2 つがあります。ここで、患者が指定のベッドの時間枠に割り当てられているか判別するために、次の基本的なロジックを使用します。「開始時刻がベッドの時間枠より前または等価 (<=) で、かつ、患者の終了時刻がベッドの使用枠より後または等価 (>=) の場合に、患者がベッドを利用していると見なす」
したがって、これら 2 つのデータ セットを正しく照合するには、次の 3 種類の結合句が必要になります。
[Clean 3 (クリーニング 3)] ステップと [Bed Hour Matrix (ベッドの利用時間マトリックス)] ステップを結合します。
[適用した結合句] 領域には既定で Hour = End Hour (時間と終了時刻が等価) と表示されています。結合句をクリックして、演算子 "=" を "<=" に変更します。
[適用した結合句] 領域の上部右側のプラス ボタンをクリックし、別の結合句を追加します。Hour >= Start Hour (時間が開始時間より後か等価) に設定します。
3 番目の結合句、Bed = Hospital Bed (ベッドと病院のベッドが等価) を追加します。
[結合タイプ] セクションで、[Bed Hour Matrix (ベッドの利用時間マトリックス)] の横で網掛けのない領域をクリックし、結合タイプを左結合に変更します。
注: 反対に、[Bed Hour Matrix (ベッドの利用時間マトリックス)] を [Clean 3 (クリーニング 3)] にドラッグすると、左結合ではなく右結合を使用して目的の結果を得ることができます。ステップをドラッグする順序によって結合の向きが決まります。この結合句は逆の順序にもなります。時間を比較するための正しいロジックを保持するようにしてください。
これでデータが結合されましたが、結合で生成された結果の一部をクリーンアップしてフィールドを整理する必要があります。[Start Hour (開始時刻)] と [End Hour (終了時刻)] は不要になりました。[Hospital Bed (病院のベッド)] と [Bed (ベッド)] も冗長で不要です。最後に、[Patient (患者)] フィールドが Null 値の場合、ベッドが使用されていないという意味です。
[フロー] ペインで、結合したデータを整理できるようにクリーニング ステップを追加します。
Ctrl + クリック (Mac では Command + クリック) で、[End Hour (終了時刻)]、[Start Hour (開始時刻)]、および [Hospital Bed (病院のベッド)] のフィールドを一度に選択し、ツールバーで [フィールドの削除] をクリックします。
[Patient (患者)] フィールド プロファイル カード上で Null 値をダブルクリックし、「Unoccupied (未使用)」と入力します。
これで、すべてのベッドの時間を表示した行によるデータ構造ができました。このうちベッドを利用した患者があった場合、その患者の情報も表示されます。あとは、出力のステップを追加し、データ セット自体を生成する作業が残っています。
[フロー] ペインで [Clean 4 (クリーニング 4)] を選択し、プラス アイコンをクリックして、[出力の追加] を選択します。
[出力] ペインで [Output type (出力タイプ)] を .csv に変更してから、[参照] をクリックします。
参照先名に「Bed Hour Patient Matrix (患者のベッドの利用時間マトリックス)」と入力し、該当する場所を選択してから、[許可] をクリックして保存します。
ペイン下部の [フローの実行] ボタンをクリックして出力を生成します。ステータス ダイアログで [完了] をクリックしてダイアログを閉じます。
ヒント: 出力とフローの実行に関する詳細は、作業の保存と共有(新しいウィンドウでリンクが開く)を参照してください。
最終的なフローは次のようになります。
Tableau Desktop での分析
このチュートリアルを進む前に、無料トライアル版をダウンロードすると Tableau Desktop をインストールできます。
これで、目的の構造のデータ セットができたので、元のデータよりさらに高度な分析ができます。
Tableau Desktop を開きます。[接続] ペインで [テキスト ファイル] を選択し、Bed Hour Patient Matrix.csv ファイルに移動してから [開く] をクリックします。
[データ ソース] タブに、既定でデータがキャンバスに表示されます。[Sheet 1 (シート 1)] をクリックします。
[データ] ペインで、[Hour (時間)] を [メジャー] と[ディメンション] を区切っている線より上にドラッグして、これを不連続のディメンションにします。
[Bed (ベッド)] を [行] シェルフに、[Hour (時間)] を [列] シェルフにそれぞれドラッグします。
[Patient (患者)] を [色] シェルフにドラッグします。
書式設定は任意ですが、設定すると Viz が見やすくなります。
[色] シェルフをクリックし、[Edit Colors (色の編集)] を選択します。
左側の領域で、[Unoccupied (未使用)] を選択します。右側のドロップダウンから、[Seattle Grays (シアトル グレー)] カラー パレットを選択します。
4 番目の最も明るい灰色を選択し、[OK] をクリックします。
もう一度 [色] シェルフをクリックしてから [枠線] ドロップダウンをクリックします。右端にある 2 番目の灰色のオプションを選択します。
ツールバーの [サイズ] ドロップダウンで、[標準] を [幅に合わせる] に変更します。
[書式設定] メニューをクリックしてから [枠線] をクリックします。
[行の境界線] で [ペイン] ドロップダウンをクリックして、かなり明るい灰色を選択します。
[レベル] スライダーを調整して 2 番目のチェック マークに設定します。
[列の境界線] でも同様に操作します。[ペイン] の色を明るい灰色に設定し、[レベル] を 2 番目のチェック マークに設定します。
下部の [シート] タブをダブルクリックし、「Bed Use by Hour (時間ごとのベッド利用)」に名前変更します。
指定のベッドが使用中かどうかがこのビューですぐに分かります。
次に、各ベッドが空いている時間数をカウントします。
下部の新規シート タブのアイコン をクリックして、シートを新しく開きます。
[Patient (患者)] を [行] にドラッグします。
[Hour (時間)] を [列] にドラッグします。[Hour (時間)] ピルを右クリックしてメニューを開きます。[メジャー]、[カウント] の順に選択します。
[データ] ペインから [Patient (患者)] フィールドの別のコピーを [色] シェルフにドラッグします。
軸を右クリックして [軸の編集] を選択します。タイトルを「Hours (時間)」に変更してダイアログを閉じます。
[シート] タブを「Bed Hours by Patient (患者ごとのベッドの利用時間)」に名前変更します。
このビューによって、元のデータ セットでは分からなかった、ベッドが使用されていない時間数を把握することができます。他にはどのようなチャートやダッシュボードが作成できるでしょうか? これまでに適切なデータ構造が構築できたので、挑戦してみましょう。
まとめとリソース
Tableau Prep を使用して今回のデータ構造を構築するために必要だったアクションは以下のとおりです。
ベッドや時間など、分析する各要素でデータ セットを構築する。
これらのデータ セットのクロス結合を行い、ベッドと時間の可能なすべての組み合わせを使用した "Bed Hour Matrix (ベッドの利用時間マトリックス)" データ セットを作成する。
"Bed Hour Matrix (ベッドの利用時間マトリックス)" と "Patient Bed (患者のベッド利用)" データを結合する。結合ですべてのベッドの時間枠が保持され、結合句で患者のベッドのデータとベッドの時間枠とが適切に照合されるようにする。
次の計算を使用して、結合に使用するためのフィールドを作成しました。第 2 と第 3 の計算では、元の日付時刻のフィールドから時間数の情報を取り出しました。
Cross Join =
1
この計算ですべての行に値 1 が割り当てられます。
Start Hour =
DATEPART('hour',[Start Time])
この計算で開始時刻を表す 1 時間単位の数値が導き出されます。したがって、"1/1/18 9:35 AM" の計算結果は "9" のみになります。
End Hour =
IFNULL(DATEPART('hour',[End Time]), 24)
ここでは、Start Time で使用したものと類似の
DATEPART('hour',[End Time])
を使用することができます。この計算で終了時刻を表す 1 時間単位の数値が導き出されます。したがって、"1/1/18 4:34 PM" の計算結果は "4" のみになります。しかし、まだふさがっている患者のベッド (終了時刻は未表示) が使用中で空いていないことを示したい場合があります。この場合は、
IFNULL
関数を使用して、終了時刻の 24 時 (真夜中) を欠落している任意の終了時刻に割り当てます。最初の引数DATEPART('hour',[End Time])
が Null の場合、先の値ではなく "24" が計算で返されます。
注: 次の手順でこれまでの作業を確認することができます。Tableau Prep パッケージド フロー ファイル (Hospital Beds.tflx(新しいウィンドウでリンクが開く)) と Tableau Desktop パッケージド ワークブック ファイル (Hospital Beds.twbx(新しいウィンドウでリンクが開く)) をダウンロードします。
リソース: 他のトレーニングが必要な場合は、参加型トのトレーニング(新しいウィンドウでリンクが開く) コースを受講してください。どのような機能か興味がある場合は、Tableau Prep オンライン ヘルプで他のトピックを確認してください。これ以外のリソースは、「学習用リソースのリストで Tableau Prep をマスター」(英語)(新しいウィンドウでリンクが開く) ブログ投稿をご覧ください。