본문 바로가기

데이터실험

종합병원지수 데이터 시각화1

2021년 버전

https://bongdatalab.tistory.com/10

 

종합병원지수 데이터 시각화-2021

2018년에 했던 종합병원지수 데이터를 2021년버전으로 업데이트 합니다. https://bongdatalab.tistory.com/2 종합병원지수 데이터 시각화1 1. 계기 2018년 설을 앞둔 어느날, http://highthroughput.org/wp/does-l..

bongdatalab.tistory.com

 

1. 계기
2018년 설을 앞둔 어느날,
http://highthroughput.org/wp/does-lotteria-locate-different
글을 보게되었씁니다.
버거 지수대신에 병원지수를 표현해보는 건 어떨까라는 생각에서 시작하게 되었습니다.

2. 참고 소스코드 
http://highthroughput.org/wp/does-lotteria-locate-different/ 의 코드와
지도를 그리기 위해  http://pinkwink.kr/1005 를 참고하였습니다.

3. 소스코드 : https://github.com/bongbongd/hospital_index.git

3. 데이터 준비 
병원위치 데이터 : http://opendata.hira.or.kr/op/opc/selectOpnsApi.do?sno=713

전국 주소 데이터 : http://www.juso.go.kr/addrlink/addressBuildDev.do

 

4. 시작

병원위치 데이터 api를 신청하여 hospital_info.json에 저장하였습니다. 이 파일을 불러옵니다..

import json
path = './hospital_info.json'

with open(path, 'r') as rf:
    json_file = rf.read()
result = json.loads(json_file)

pandas dataframe 로 변환후 데이터 확인

df1 = DataFrame(result)
df1
의원       31078
치과의원     17444
한의원      14133
보건진료소     1905
요양병원      1539
병원        1473
보건지소      1316
한방병원       313
종합병원       302
보건소        241
치과병원       232
상급종합        42
조산원         26
보건의료원       16
Name: clCdNm, dtype: int64

 

원래는 상급종합병원만 뽑아내서 병원지수를 뽑으려고 했는데 생각보다 데이터가 적습니다...

상급 종합병원과 종합병원 데이터를 합쳐서 병원지수를 뽑아보도록 하겠습니다.

 

상급종합병원은 upper_general_df

종합병원은 general_df 에 저장합니다.

 

상급병원과 종합병원의 지역 분포를 보고 싶네요... 이럴땐 지역값의 중복을 제거 한후 어떤 지역이 있나 봅니다.

upper_general['d1'].unique()
array(['부산광역시', '인천광역시', '서울특별시', '대구광역시', '경상남도', '경기도', '충청남도', '강원도',
       '전라북도', '광주광역시', '대전광역시', '충청북도', '전라남도'], dtype=object)
general['d1'].unique()
array(['인천광역시', '경기도', '전라북도', '대구광역시', '광주광역시', '서울특별시', '강원도', '경상남도',
       '충청북도', '경상북도', '전라남도', '부산광역시', '대전광역시', '충청남도', '울산광역시',
       '제주특별자치도'], dtype=object)
 

위의 데이터를 보니... 종합병원의 지역이 더 많아보입니다. 그럼 상급 종합 병원이 없는 지역은 어디일까요??

set(general['d1'].unique())- set(upper_general['d1'].unique())
{'경상북도', '울산광역시', '제주특별자치도'}

상급종합 병원부터 지역별로 묶어 주고 지역별 개수를 상위 10개만 출력해  봅니다.

B = (upper_general).apply(lambda r: r['d1'] + ' ' + r['d2'] if r['d2'] else r['d1'], axis=1).value_counts()
B.head(10)
부산광역시 서구      3
광주광역시 동구      2
대구광역시 중구      2
서울특별시 강남구     2
충청남도 천안시      2
서울특별시 종로구     2
대구광역시 남구      2
전라북도 익산시      1
경기도 성남시       1
서울특별시 서대문구    1
dtype: int64

 

그다음 종합병원

B = (general).apply(lambda r: r['d1'] + ' ' + r['d2'] if r['d2'] else r['d1'], axis=1).value_counts()
B.head(10)
경상남도 창원시       11
서울특별시 영등포구      7
광주광역시 광산구       6
충청북도 청주시        5
경상북도 포항시        5
경상남도 김해시        5
전라남도 목포시        5
제주특별자치도 제주시     5
광주광역시 서구        5
광주광역시 북구        5
dtype: int64


상급종합병원 데이터와 종합병원 데이터를 합쳐보고 싶습니다..

df_all = pd.concat([upper_general, general], ignore_index=True)

 

이 합친데이터 중에 어디 지역이 가장 종합병원이 많은지 볼까요??

B= df_all.apply(lambda r: r['d1'] + ' ' + r['d2'] if r['d2'] else r['d1'], axis=1).value_counts()
B.head(20)
경상남도 창원시       11
서울특별시 영등포구      7
경기도 성남시         6
광주광역시 광산구       6
충청북도 청주시        6
광주광역시 서구        5
전라남도 목포시        5
제주특별자치도 제주시     5
경상북도 포항시        5
광주광역시 북구        5
경기도 부천시         5
경상남도 김해시        5
서울특별시 동대문구      5
경기도 고양시         5
전라북도 전주시        5
인천광역시 서구        5
경기도 수원시         4
전라남도 순천시        4
경기도 안산시         4
서울특별시 종로구       4
dtype: int64 
 

예상으로는 수도권이었는데.. 경상남도 창원시가 가장 많은 종합병원이 있네요.

이제 전체 주소 데이터를 가져와서 시도+구 까지만 가공합니다. road_code_total.txt 파일을 가공합니다.
path =  './road_code_total.txt'
addr_list = list()
with open(path, 'r',  encoding = 'utf-8') as rf:
    for line in rf:
        addr_info = line.split("|")
        addr_list.append({'d1' : addr_info[5].strip(), 'd2' : addr_info[6].strip()})
addr_df = DataFrame(addr_list).drop_duplicates() # 중복주소 제거
df_all_count=  df_all.apply(lambda r: r['d1'] + ' ' + r['d2'] if r['d2'] else r['d1'], axis=1).value_counts()
addr_df.head()
  d1 d2
0 서울특별시 종로구
1555 서울특별시 중구
2728 서울특별시 용산구
4166 서울특별시 성동구
5307 서울특별시 광진구

잘 가져온 것 같습니다.

 

df_all_count 처럼 주소 데이터도 시도+시구 데이터로 가공합니다.

addr_df.index = addr_df.apply(lambda r:  r['d1'] + ' ' + r['d2'] if r['d2'] else r['d1'], axis=1)

df_all_count 와 addr_df 데이터를 join 합니다.

hos_t_count = pd.DataFrame({'count': df_all_count}).fillna(0)
hos_t = pd.merge(addr_df, hos_t_count, how='outer', left_index=True, right_index=True)

이제 지도로 표현해볼까요??

종합병원이 0개인 지역의 이름을 빨간색으로 표시해 봅니다.