공간융합빅데이터 공모전 - 응급환자 병원 커버리지 분석 시각화

지은·2023년 11월 29일
0

🔍 참여 프로젝트

공간융합빅데이터공모전

참여 인원 : 본인 1명


📌 프로젝트 주제 선정 계기 및 필요성

나는 최근 늦은 시각에 응급 상황에 처해 119 차량에 실려갔으나, 주변에 적절한 응급 시설이 부족하여 멀리 이동해야 했다.
이 경험으로 응급환자가 실제로 신속하고 효과적인 응급 서비스를 받기 어렵다는 현실을 몸소 느끼게 되었다.

현재의 상황에서는 지역 응급 서비스의 불균형과 부족으로 인해 골든타임을 확보하는 것이 어렵다.
따라서, 지역 응급 서비스의 부족을 해소하여 모든 지역에서 골든타임을 확보할 수 있는 환경을 조성하는 것이 필요하다.


📌 프로젝트 목표

응급환자 발생 지역의 병원 커버리지를 시각적으로 확인하여 부족한 지역을 식별하고, 응급 의료 서비스의 효율성을 높이는 것을 목표로 한다.

응급 환자 발생

병원 커버리지 확인

응급 의료 서비스 효율 증가


📌 프로젝트 사용 데이터

기본 제공 데이터 : 공간융합빅데이터플랫폼 - 서울시병원정보.csv, 서울시의원정보.csv

외부 데이터 : 소방빅데이터플랫폼 - 교통사고구급출동현황.csv, 사고부상구급출동현황.csv, 온열질환구급출동현황.csv, 중증응급질환구급출동현황.csv


📌 프로젝트 핵심 데이터 전처리

🧷 기본 제공 데이터 전처리

✏️ 기본 제공 데이터에서 주어진 좌표정보(x), 좌표정보(y)
TM(EPSG:2097)좌표계 기준 위치 정보로, 위도, 경도 WGS84(EPSG:4326)좌표계로 변환

medical['좌표정보(x)'] = pd.to_numeric(medical['좌표정보(x)'], errors="coerce")
medical['좌표정보(y)'] = pd.to_numeric(medical['좌표정보(y)'], errors="coerce")
meditmp = medical[['좌표정보(x)', '좌표정보(y)']]

def coordinateTrans(coord, p1_type, p2_type):
  """
  좌표계 변환 함수
  coord : x, y 좌표 정보가 담긴 numpy array
  p1_type : 입력 좌표계 정보
  p2_type : 출력 좌표계 정보
  """
  p1 = pyproj.Proj(init=p1_type)
  p2 = pyproj.Proj(init=p2_type)
  fx, fy = pyproj.transform(p1, p2, coord[:, 0], coord[:, 1])
  return np.dstack([fy, fx])[0] # 위도, 경도 순
  
 coord = np.array(meditmp)
p1_type = "epsg:2097"
p2_type = "epsg:4326"

# 좌표계 변환
meditmpres = coordinateTrans(coord, p1_type, p2_type)

def convertListToStr(data):
  return float(data[0]), float(data[1])


🧷 외부 데이터 전처리

✏️ 외부 데이터에서 주어진 좌표정보(x), 좌표정보(y)
TM(EPSG:5186)좌표계 기준 위치 정보로, 위도, 경도 WGS84(EPSG:4326)좌표계로 변환

✏️ 신고시각, 출동시각, 현장도착시각, 환자접촉시각, 현장출발시각, 병원도착시각 칼럼
시간 데이터에 대하여 시간값을 모두 6글자로 통일 후, 날짜 데이터와 결합하여, datetime(ds)형식으로 변환

class Timetranslator:
    def __init__(self, df, datecolumn, timecolumn, newcolumn):
        self.df = df
        self.datecolumn = datecolumn
        self.timecolumn = timecolumn
        self.newcolumn = newcolumn

    def fillLenStr(self):
        '''
        시간값 6글자로 변환하는 함수
        '''
        self.df = self.df.astype(str)
        for idx in range(len(self.df)):
            try:
                if self.timecolumn in self.df.columns:
                    if len(self.df.loc[idx, self.timecolumn]) == 6:
                        continue
                    else:
                        if len(self.df.loc[idx, self.timecolumn]) == 5:
                            self.df.loc[idx, self.timecolumn] = '0' + self.df.loc[idx, self.timecolumn]
                        elif len(self.df.loc[idx, self.timecolumn]) == 4:
                            self.df.loc[idx, self.timecolumn] = '00' + self.df.loc[idx, self.timecolumn]
                        elif len(self.df.loc[idx, self.timecolumn]) == 3:
                            self.df.loc[idx, self.timecolumn] = '000' + self.df.loc[idx, self.timecolumn]
            except KeyError:
                continue

        return self.df

    def pretypeformat(self):
        '''
        datetime(ns)형식 변환 전 준비
        '''
        for idx in range(len(self.df)):
            try:
                self.df.loc[idx, self.datecolumn] = self.df.loc[idx, self.datecolumn][0:4] + '-' + self.df.loc[idx, self.datecolumn][4:6] + '-' + self.df.loc[idx, self.datecolumn][6:8]
                self.df.loc[idx, self.timecolumn] = self.df.loc[idx, self.timecolumn][0:2] + ':' + self.df.loc[idx, self.timecolumn][2:4] + ':' + self.df.loc[idx, self.timecolumn][4:6]
            except:
                self.df.loc[idx, self.timecolumn] = np.nan
        return self.df

    def convertDatetimeformat(self):
        '''
        datetime 형식으로 변환하는 함수
        '''
        self.df[self.newcolumn] = self.df[self.datecolumn] + ' ' + self.df[self.timecolumn]
        for idx in range(len(self.df)):
            try:
                self.df.loc[idx, self.newcolumn] = datetime.strptime(self.df.loc[idx, self.newcolumn] ,'%Y-%m-%d %H:%M:%S')
            except: #* 잘못된 시각 기록 pass
                self.df.loc[idx, self.newcolumn] = np.nan
        return self.df

    def process(self):
        self.df = self.fillLenStr()
        #self.df = self.convert24Hour()
        self.df = self.pretypeformat()
        self.df = self.convertDatetimeformat()
        return self.df

🧷 기본 제공 데이터 + 외부 구급 출동 현황 데이터

  • 기본 제공 데이터에 존재하는 병원 기준으로 필터링 후, 상위 상급 병원 50개 대상으로 진행

  • 응급 서비스 이용 빈도가 낮은 병원의 경우, 환자들이 많이 가지 않아 응급실이 충분히 갖춰져 있지 않을 가능성이 높은 곳으로 간주되어 제거

  • 사고 지역 위치와 병원 위치 사이 거리를 계산하여 사고발생_병원간거리 칼럼으로 추가


📌 시각화1

해당 그림은 각 사고 발생 장소들의 Point들이며, Point들은 이송된 병원 마다 색상 분류하여 표기


📌 시각화2

해당 그림은 각 병원 별 사고 발생 지역 표기

이화여자대학교의과대학부속목동병원은 서울 전체 1위 병원으로,
주로 양천구, 강서구, 마포구, 영등포구 지역이 커버 대상으로, 이외에도 서울 전 구역에서 응급 서비스를 커버한다.
해당 병원에 대한 서울 전 구역에서의 수요가 높음을 알 수 있다.

서울현대병원은 주로 강북구, 도봉구가 커버 대상으로,
서울현대병원이 커버한 사건 발생 건수는 이대목동병원 사건 발생 건수의 약 3분의1 비율이다.
강북구와 도봉구 지역의 응급 상황에 빠르게 대응하는 것으로 파악된다.


📌 시각화3

각 병원마다 사고 발생 지역 간의 평균 거리의 반지름으로 병원 위치 기준 원을 그려 병원의 평균 효력도 시각화


📌 분석 결과

  • 병원 별로 커버지역 겹치는 부분이 존재하나, 원이 겹치는 부분이 상대적으로 적거나 없는 구역 존재
    - 강북구 번동, 성북구 장위동 지역의 경우 타 구역에 비해 사고발생 대비 커버할 수 있는 상급 병원이 존재하지 않음
    - 인근 강북구에 위치한 한일병원, 서울현대병원, 강북으뜸병원, 노원구에 위치한 상계백병원은 번동과 장위동 지역을 커버하지 않음
    - 이 구역을 평소 커버하는 병원이 존재하지 않아 골든타임을 놓칠 수 있어, 다른 구역에 비해 응급 의료 서비스 강화 필요
    - 적어도 하나 이상의 상급 병원 확충을 통해 즉각 응대 필요
    - 인근 지역 병원과의 응급 의료 서비스 연계 필요

  • 원이 동시에 겹치는 부분이 존재하는 구역은 여러 병원이 동시에 커버하고 있어, 지역의 응급 서비스가 중복
    - 신대방동, 신림 일부, 대림 일부 지역의 경우 타 구역에 비해 병원의 커버리지 범위가 서로 겹침
    - 해당 지역에서는 서로 협력을 통해, 겹치는 구역에서의 의료서비스 분산 필요
    - 구로동과 가리봉동 지역의 응급서비스가 미비한 상황을 고려하여 4개 병원이 협력하여 해당 지역에 지원 필요

  • 광진구에 위치한 건국대학교병원과 서울프라임병원의 경우 겹치는 범위가 큼
    - 두 병원의 응급 서비스가 과하게 중복되는 것에 비해, 인근 구의동은 응급 서비스가 미비함
    - 두 병원의 협력을 통해, 응급 서비스를 분산 시키고, 구의동에 지원 필요

  • 송파구 가락동에 위치한 서울병원 처럼 넓은 구역을 하나의 병원이 커버하는 경우, 다양한 구역의 환자들을 동시에 대응하므로 골든 타임 확보가 어려움
    - 인근의 뉴스타트병원(가락동), 빠른병원(송파동), 올림픽병원(석촌동), 서울아산병원(풍납동)은 서울병원과 병원 커버리지 영역이 겹침
    - 서울병원은 겹치는 영역보다는 송파구 가락동 및 인근 응급서비스가 미비한 문정동, 오금동, 장지동 등의 지역을 중점적으로 커버할 필요
    - 이를 통해 구역 간 의료 서비스의 균형을 맞추고, 응급 환자들에게 효과적인 서비스를 제공할 수 있을 것으로 기대

  • 이태원동 주변에 응급 의료를 담당하는 병원 부재
    - 이 지역을 담당하는 상급병원은 순천향대학교부속서울병원만 존재
    - 순천향대학교부속서울병원은 이태원동 뿐 아니라 인근 한남동, 보광동까지 커버리지영역이므로, 이태원동에 대한 즉각 응급환자이송이 어려워 골든타임 확보 어려움
    - 2022년 이태원 참사 사건 당시, 응급 환자를 인근에 이송할 수 있는 병원이 부재하여, 참사의 원인에 크게 작용했을 것

현재 응급 시설이 당장 필요한 구역은 다음과 같음(그림 상으로 원이 존재하지 않는 영역)
신사동, 논현동, 삼성동, 청파동, 용산동, 번동, 월계동, 장위동, 사당동, 방배동, 노량진동, 상도동, 종암동, 동선동, 안암동,신설동, 면목동, 중화동, 구의동...등
적어도 한 곳에서라도 응급 서비스를 제공할 수 있도록 병원 신설 또는 인근 병원과 협력 통해 커버리지 확대 필요


📌 기대 효과

1. 응급 서비스의 빠른 대응
부족한 지역에 적절한 의료 인프라를 구축하여 응급환자에게 빠르게 대응

2. 지역 간 의료 서비스 균형 조정

부족한 지역을 식별하고 강화함으로써 지역 간 의료 서비스의 균형이 조정되어, 모든 지역에서 응급 서비스에 더 고르게 접근 가능


📌 융합 데이터 제안

인구 통계 데이터 활용

  • 연령대, 성별, 인구증감률, 인구수 등의 정보를 고려하여 응급 환자 발생 가능성 예측
  • 특정 연령대의 증가에 따른 응급 서비스 수요 변화를 예측하고, 지역마다 다른 의료 서비스를 효율적으로 배치

교통 데이터 활용

  • 교통 체증 정보를 활용하여 응급 차량의 이동 경로를 최적화하여 응급환자에게 신속한 서비스 제공

노인 인구 비율이 높은 강북구에서는 노인 거주 시설과 의료서비스 간의 평균 거리 데이터를 기반으로 의료 서비스의 위치를 최적화하고, 노인들의 이동성을 고려하여 노인 전용 교통 수단을 개선할 수 있음
또한 노인들을 위한 편의 시설인 휠체어 편의시설, 경사로 등의 시설을 확충하여 응급 서비스의 접근성을 향상시킬 수 있음

10대 청소년이 많은 송파구, 강남구, 노원구, 양천구 에서는 학교 및 청소년 센터 등에서 응급 처치 교육 및 응급 상황 대처에 대한 교육을 강화할 필요가 있음


profile
꾸준한 개발자를 꿈꿈

0개의 댓글