병상 사용률과 Tableau Prep
병원의 수용 능력에 도달하면 문제가 되지만 지나친 수용 능력은 자원 낭비입니다. 병상이 자원이라는 관점에서 병상을 이해하는 것이 중요합니다. 하지만 데이터는 환자 관점에서 저장되는 경우가 많습니다. 병상에 환자가 있는 때를 표현하는 데이터를 구하고 병상 사용률을 결정하려면 어떻게 해야 할까요?
참고: 이 자습서의 작업을 완료하려면 Tableau Prep이 필요하며 선택적으로 Tableau Desktop을 설치해야 합니다.
Tableau Prep 및 Tableau Desktop을 설치하려면 Tableau Desktop 및 Tableau Prep 배포 가이드(링크가 새 창에서 열림)를 참조하십시오. 또는 Tableau Prep(링크가 새 창에서 열림) 및 Tableau Desktop(링크가 새 창에서 열림) 무료 평가판을 다운로드할 수 있습니다.
또한 데이터 파일 세 개를 다운로드해야 합니다. 파일들을 [내 Tableau Prep 리포지토리] > [데이터 원본] 폴더에 저장하는 것이 좋습니다.
- Beds.xlsx(링크가 새 창에서 열림)
- Hours.xlsx(링크가 새 창에서 열림)
- Patient Beds.xlsx(링크가 새 창에서 열림)
데이터
네 개의 침상 A, B, C 및 D에 대해 침상에 어떤 환자가 있는지, 환자의 침상 사용 시작 시간과 종료 시간은 언제인지 추적합니다. 데이터는 다음과 같습니다.
임시 분석
이 데이터를 Tableau Desktop으로 가져오는 경우 Gantt 차트를 만들어 침상에 환자가 있는 때를 표시할 수 있습니다.
이것은 유용한 시각화입니다. 침상 A와 B의 사용률은 작은 차이만 있지만 침상 C는 사용률이 매우 낮다는 것을 확인할 수 있습니다. 침상 D의 환자는 종료 시간이 없지만 몇 가지 계산으로 문제를 해결할 수 있습니다. 이 차트는 침상이 사용되는 방식에 대한 시각적 개요를 제공합니다.
하지만 침상이 비어 있던 시간을 계산하려면 어떻게 해야 할까요? 또는 새 정책 적용 전과 후의 침상 준비 시간(open bed time)을 비교하려면 어떻게 해야 할까요? 현재 구조화된 데이터를 사용하여 이 문제를 손쉽게 해결할 수 있는 방법은 없습니다.
바람직한 데이터 구조
몇 가지 매우 기본적인 데이터 집합을 만들고 Tableau Prep에서 결합하면 이 데이터 집합을 심층 분석을 수행할 수 있고 보다 유용한 비주얼리제이션을 만들 수 있는 형태로 수정할 수 있습니다.
Tableau Prep 단계로 이동하기 전에 잠시 시간을 가지고 "각 침상이 비어 있는 시간은 얼마입니까?"라는 질문에 답하기 위해 만들어야 할 것들을 생각해 보십시오.
매 시간마다 각 침상을 살펴볼 수 있어야 하며 침상에 환자가 있었는지 여부를 알 수 있어야 합니다. 지금 당장은 침상에 환자가 있던 때의 데이터만 있으며 비어 있는 시간에 대한 정보를 Tableau 제공하지 않았습니다.
모든 침상과 모든 시간에 대한 전체 행렬을 만들기 위해 새 데이터 집합 두 개를 만듭니다. 한 배열은 단순히 침상의 목록(A, B, C, D)이고 다른 배열은 시간의 배열(1, 2, 3, …, 23, 24)입니다. 한 데이터 집합의 모든 행과 다른 데이터 집합의 모든 행을 조인하는 교차 조인을 수행하면 침상과 시간의 모든 가능한 조합을 얻을 수 있습니다.
Beds.xlsx 데이터 집합은 다음과 같습니다. | Hours.xlsx 데이터 집합은 다음과 같습니다. | 교차 조인 결과는 다음과 같습니다. |
다음으로, Patient Beds(환자 침상) 정보를 가져오고 특정 환자가 있는지 여부로 각 침상-시간 조합에 레이블을 지정합니다. 각 침상-시간에 대한 행과 환자가 침상에 있는지 여부, 환자 번호 및 시작/종료 시간이 있는 데이터 집합을 준비했습니다. Null 값은 침상이 점유되지 않았음을 나타냅니다.
이 구조의 데이터를 사용하면 다음과 같은 분석을 수행할 수 있으며, 점유되지 않은 침상을 환자 침상만큼 쉽게 조사할 수 있습니다.
데이터 재구성
Tableau Prep을 사용하여 이러한 목적을 달성하려면 어떻게 해야 할까요? 두 부분으로 흐름을 작성합니다. 먼저 Bed Hours(침상 시간) 행렬을 작성하고 이 행렬을 Patient Beds(환자 침상) 데이터와 결합합니다. 따라 할 Excel 파일 3개(Beds.xlsx, Hours.xlsx 및 Patient Beds.xlsx)를 모두 다운로드합니다.
Bed Hour(침상 시간) 행렬
먼저 Beds.xlsx 파일에 연결합니다.
Tableau Prep을 엽니다.
시작 화면에서 데이터에 연결을 클릭합니다.
연결 패널에서 Microsoft Excel을 클릭합니다. Beds.xlsx를 저장한 위치로 이동하고 열기를 클릭합니다.
Beds 시트가 자동으로 흐름 패널에 열려야 합니다.
팁: 데이터 연결에 대한 자세한 내용은 데이터에 연결(링크가 새 창에서 열림)을 참조하십시오.
다음으로, 필드를 만들기 위해 Hours(시간) 데이터 집합에서 교차 조인을 수행할 수 있습니다. 단순히 값이 1인 계산을 추가합니다.
흐름 패널에서 Beds를 선택하고 제안된 정리 단계를 클릭합니다.
앞서 추가한 정리 단계와 함께 프로필 패널이 나타납니다. 툴바에서 계산된 필드 만들기를 클릭합니다.
필드명을 Cross Join(교차 조인)으로 지정하고 값으로 1을 입력합니다.
데이터 그리드가 업데이트되어 데이터의 현재 상태를 표시합니다.
이제 Hours(시간) 데이터 집합에서 이 프로세스를 반복합니다.
연결 패널에서 연결 추가 단추를 클릭하여 다른 데이터 연결을 추가합니다.
Microsoft Excel을 선택한 다음 Hours.xlsx 파일을 선택하고 열기를 클릭합니다.
흐름 패널에서 Hours(시간)를 선택하고 제안된 정리 단계를 클릭하여 흐름에 추가합니다.
프로필 패널의 툴바에서 Cross Join(교차 조인)이라는 계산된 필드를 만들고 값으로 1을 입력합니다.
이제 두 데이터 집합에 공유 필드인 Cross Join(교차 조인)이 있으므로 서로 조인할 수 있습니다.
정리 2를 정리 1 위로 끌고 조인 옵션 위에 놓아 두 정리 단계를 조인합니다.
아래의 조인 프로필에서 조인 구성이 자동으로 채워집니다.
두 필드의 이름을 모두 Cross Join(교차 조인)으로 지정했으므로 Tableau Prep이 자동으로 필드를 공유 필드로 식별하고 적절한 적용된 조인 절을 만듭니다.
기본 조인 유형은 내부 조인이며, 이것이 원하는 유형입니다.
데이터 그리드에서 볼 수 있는 것처럼, 이 조인은 Beds(침상)의 모든 행과 Hours(시간)의 모든 행을 일치시킵니다.
A. 조인 절
B. 조인 유형
C. 데이터 그리드 결과
팁: 조인에 대한 자세한 내용은 데이터 조인(링크가 새 창에서 열림)을 참조하십시오.
더 이상 Cross Join(교차 조인) 필드가 필요하지 않으며 제거할 수 있습니다.
흐름 패널에서 조인 1을 선택하고 더하기 아이콘을 클릭한 다음 정리 단계 추가를 선택합니다.
Cross Join-1(교차 조인-1) 및 Cross Join(교차 조인) 필드를 선택한 다음 필드 제거를 클릭합니다.
정리 3 레이블을 두 번 클릭하고 단계 이름을 Bed Hour Matrix(침상 시간 행렬)로 변경합니다.
이제 모든 침상과 모든 시간을 포함하는 Bed Hour Matrix(침상 시간 행렬) 데이터 집합을 준비했으며 데이터 집합 작성의 첫 번째 부분을 완료했습니다.
환자 침상 사용률
두 번째 부분은 환자 침상 사용률을 가져오는 것입니다. 시작하려면 데이터에 연결합니다.
연결 패널에서 연결 추가 단추를 클릭하여 다른 데이터 연결을 추가합니다.
Microsoft Excel을 선택한 다음 Patient Beds.xlsx 파일을 선택하고 열기를 클릭합니다.
흐름 패널에서 Patient Beds(환자 침상)를 선택하고 제안된 정리 단계를 클릭하여 흐름에 추가합니다.
Bed Hour Matrix(침상 시간 행렬) 파일은 시간에 기반하지만 Patient Beds(환자 침상)는 실제 시간에 기반하므로 Patient Beds(환자 침상) 시작 및 종료 시간에서 시간을 가져와야 합니다. 또한 종료 시간의 경우 환자가 하루가 끝날 때(자정, 24시) 여전히 침상에 있는 경우 데이터 집합에 종료 시간이 없는 경우에도 해당 침대가 점유되었다고 나타내고 싶습니다. 이 새로운 단계에 계산된 필드를 추가합니다.
툴바에서 계산된 필드 만들기를 클릭합니다.
필드명을 Start Hour(시작 시간)로 지정합니다. 계산으로
DATEPART('hour',[Start Time])
를 입력합니다.End Hour(종료 시간)라는 또 다른 계산된 필드를 만듭니다. 계산으로
IFNULL(DATEPART('hour',[End Time]), 24)
를 입력합니다.
이 계산은 시작 시간에서 시간을 가져옵니다. 즉, "1/1/18 9:35 AM"은 "9"가 됩니다.
DATEPART
부분은 종료 시간의 시간을 가져옵니다. IFNULL
부분은 모든 누락된 종료 시간에 종료 시간 24(자정)를 할당합니다.
이제 환자 침상 사용률을 Bed Hour Matrix(침상 시간 행렬)에 조인할 준비가 되었습니다. 이 조인은 지금까지 한 것보다 다소 복잡한 조인입니다. 내부 조인은 두 데이터 집합에 모두 존재하는 값만 반환합니다. 침상에 환자가 있는지 여부와 관계없이 모든 침상-시간 슬롯을 유지해야 하므로 왼쪽 조인을 수행합니다. 이렇게 하면 많은 Null이 발생하지만 정상입니다.
또한 침상-시간 슬롯이 하나 이상의 환자에 의해 점유된 때와 일치시켜야 합니다. 따라서 침상을 점유한 환자와 일치시킬 뿐만 아니라 시간도 고려해야 합니다. Bed Hour Matrix(침상 시간 행렬) 데이터 집합에는 Hour(시간) 필드만 있고 Patient Beds(환자 침상) 데이터 집합에는 Start Hour(시작 시간)와 End Hour(종료 시간)가 있습니다. 환자가 지정된 침상-시간 슬롯에 할당되어야 하는지 여부를 결정하기 위해 몇 가지 기본적인 논리를 사용합니다. 환자의 시작 시간이 침상-시간 슬롯보다 작거나 같고(<=) AND 환자의 종료 시간이 침상-시간 슬롯보다 크거나 같은(>=) 경우 환자가 침상에 있다고 간주합니다.
따라서 이 두 데이터 집합을 적절히 일치시키려면 조인 절 3개가 필요합니다.
정리 3 단계와 Bed Hour Matrix(침상 시간 행렬) 단계를 조인합니다.
적용된 조인 절 영역에서 기본값은 Hour(시간) = End Hour(종료 시간)입니다. 조인 절을 클릭하여 연산자를 "="에서 "<="로 변경합니다.
적용된 조인 절 영역의 오른쪽 위에서 더하기 단추를 클릭하여 또 다른 조인 절을 추가합니다. 조인을 Hour(시간) >= Start Hour(시작 시간)으로 설정합니다.
Bed(침상) = Hospital Bed(병원 침상)에 대한 세 번째 조인 절을 추가합니다.
조인 유형 섹션에서 Bed Hour Matrix(침상 시간 행렬) 옆에 있는 그래픽 영역의 음영이 없는 부분을 클릭하고 조인 유형을 Left(왼쪽) 조인으로 변경합니다.
참고: 대신 Bed Hour Matrix(침상 시간 행렬)를 정리 3에 끌어 놓으면 왼쪽 조인 대신 오른쪽 조인을 사용하여 원하는 결과를 얻을 수 있습니다. 단계를 끌어 놓는 순서는 조인 방향과 관련이 있습니다. 조인 절도 역순이 되므로, 시간을 비교하는 올바른 논리를 유지해야 합니다.
이제 데이터가 조인되었지만 조인에서 몇 가지 정보를 정리하여 필드를 간소화해야 합니다. 더 이상 Start Hour(시작 시간)와 End Hour(종료 시간)가 필요하지 않습니다. Hospital Bed(병원 침상)와 Bed(침상)도 중복됩니다. 최종적으로, Patient(환자) 필드의 Null 값은 실제로 침상이 점유되지 않았음을 의미합니다.
조인된 데이터를 간소화할 수 있도록 흐름 패널에서 정리 단계를 추가합니다.
Ctrl+클릭(Mac의 경우 Command+클릭)하여 End Hour(종료 시간), Start Hour(시작 시간) 및 Hospital Bed(병원 침상) 필드를 다중 선택한 다음 툴바에서 필드 제거를 클릭합니다.
Patient(환자) 필드 프로필 카드에서 Null 값을 두 번 클릭하고 Unoccupied(비점유)를 입력합니다.
이제 데이터 구조에 모든 침상-시간에 대한 행이 있습니다. 해당 시간 동안 침상에 환자가 있다면 환자 정보도 있습니다. 남은 작업은 출력 단계를 추가하고 데이터 집합 자체를 생성하는 것입니다.
흐름 패널에서 정리 4를 선택하고 더하기 아이콘을 클릭한 다음 출력 추가를 선택합니다.
출력 패널에서 출력 유형을 .csv로 변경한 다음 찾아보기를 클릭합니다.
이름으로 Bed Hour Patient Matrix(침상 시간 환자 행렬)를 입력하고 원하는 위치를 선택한 다음 적용을 클릭하여 저장합니다.
패널 맨 아래에서 흐름 실행 단추를 클릭하여 출력을 생성합니다. 상태 대화 상자에서 완료를 클릭하여 대화 상자를 닫습니다.
팁: 출력 및 흐름 실행에 대한 자세한 내용은 작업 저장 및 공유(링크가 새 창에서 열림)를 참조하십시오.
최종 흐름은 다음과 같이 표시됩니다.
Tableau Desktop의 분석
이 자습서를 계속하기 전에 Tableau Desktop을 설치하려면 무료 평가판을 다운로드할 수 있습니다.
이제 원하는 구조의 데이터 집합이 있으므로 원래 데이터를 사용하는 것보다 심층적인 분석을 수행할 수 있습니다.
Tableau Desktop을 엽니다. 연결 패널에서 텍스트 파일을 선택하고 Bed Hour Patient Matrix.csv 파일로 이동한 다음 열기를 클릭합니다.
데이터 원본 탭에서 기본적으로 캔버스에 데이터가 나타나야 합니다. 시트 1을 클릭합니다.
데이터 패널에서 측정값과 차원을 구분하는 선 위로 Hour(시간)를 끌어와 불연속형 차원으로 만듭니다.
Bed(침상)를 행 선반으로 끌고 Hour(시간)를 열 선반으로 끌어 놓습니다.
Patient(환자)를 색상 선반으로 끕니다.
서식 지정은 선택 사항이지만 가독성을 높이는 데 도움이 될 수 있습니다.
색상 선반을 클릭하고 색상 편집을 선택합니다.
왼쪽에 있는 영역에서 Unoccupied(비점유)를 선택합니다. 오른쪽에 있는 드롭다운에서 시애틀의 회색 색상표를 선택합니다.
네 번째 가장 밝은 회색을 선택하고 확인을 클릭합니다.
색상 선반을 다시 클릭한 다음 테두리 드롭다운을 클릭합니다. 맨 오른쪽에서 두 번째 회색 옵션을 선택합니다.
툴바의 크기 드롭다운에서 표준을 너비 맞추기로 변경합니다.
서식 메뉴를 클릭한 다음 테두리를 클릭합니다.
행 구분선에서 패널 드롭다운을 클릭하고 매우 밝은 회색을 선택합니다.
수준 슬라이더를 두 번째 눈금까지 조정합니다.
열 구분선에 대해 이 과정을 반복합니다. 패널 색상을 밝은 회색으로 설정하고 수준을 두 번째 눈금으로 설정합니다.
맨 아래에서 시트 탭을 두 번 클릭하고 시트 이름을 Bed Use by Hour(시간별 침상 사용률)로 변경합니다.
이 뷰를 사용하여 지정된 침상이 점유되었거나 비어 있는 때를 빠르게 확인할 수 있습니다.
하지만 더 나아가 각 침상이 점유되지 않은 시간을 계산할 수 있습니다.
맨 아래에서 새 시트 탭 아이콘을 클릭하여 빈 시트를 엽니다.
Patient(환자)를 행으로 끌어옵니다.
Hour(시간)를 열로 끌어옵니다. Hour(시간) 알약 모양을 마우스 오른쪽 단추로 클릭하여 메뉴를 엽니다. 측정값 > 카운트를 선택합니다.
Patient(환자) 필드의 또 다른 복사본을 데이터 패널에서 색상 선반으로 끌어옵니다.
축을 마우스 오른쪽 단추로 클릭하고 축 편집을 선택합니다. 제목을 Hours(시간)로 변경하고 대화 상자를 닫습니다.
시트 탭 이름을 Bed Hours by Patient(환자별 침상 시간)로 변경합니다.
이 뷰를 사용하면 비점유 침상의 시간이 얼마인지 확인할 수 있으며 이 정보는 원래 데이터 집합에서 얻을 수 없는 것입니다. 어떤 다른 차트나 대시보드를 만들 수 있을까요? 데이터가 올바른 구조가 되었으니 이제 시도해 보십시오.
복습 및 리소스
Tableau Prep을 사용하여 데이터 구조를 작성하려면 다음과 같은 작업을 수행해야 합니다.
분석할 각 특성에 대한 데이터 집합을 작성합니다. 이 경우 Beds(침상)와 Hours(시간)입니다.
이러한 데이터 집합을 교차 조인하여 침상과 시간의 모든 가능한 조합이 있는 Bed Hour Matrix(침상 시간 행렬)를 만듭니다.
Bed Hour Matrix(침상 시간 행렬)와 Patient Bed(환자 침상) 데이터를 조인합니다. 이 조인에서 모든 침상-시간 슬롯이 유지되며 조인 절이 환자 침상 데이터와 침상-시간 슬롯을 적절히 일치시키는지 확인합니다.
여기에서는 다음과 같은 계산을 사용하여 조인에 사용할 필드를 만들었습니다. 원래 날짜/시간 필드에서 두 번째 및 세 번째 시간 정보를 가져옵니다.
Cross Join(교차 조인) =
1
이 계산은 단순히 모든 행에 1의 값을 할당합니다.
Start Hour(시작 시간) =
DATEPART('hour',[Start Time])
이 계산은 시작 시간에서 시간을 가져옵니다. 즉, "1/1/18 9:35 AM"은 "9"가 됩니다.
End Hour(종료 시간) =
IFNULL(DATEPART('hour',[End Time]), 24)
Start Time(시작 시간)에서 했던 것처럼
DATEPART('hour',[End Time])
을 사용합니다. 이 계산은 종료 시간에서 시간을 가져옵니다. 즉, "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 온라인 도움말에서 다른 주제를 확인해 보십시오. 추가 리소스를 찾으십니까? Master Tableau Prep with this list of learning resources(이 학습 자료 목록으로 Tableau Prep 마스터)(링크가 새 창에서 열림) 블로그 게시물은 귀하를 위한 것입니다.