Portfolio

[ 2019 1학년 1학기 웹/파이선 프로그래밍 Term Project ] 자동심장충격기 (AED) 위치 분석 및 최단 거리 탐색

J2on 2020. 3. 20. 18:02

주제 : 전국의 자동심장충격기 배치 현황 분석 + 가장 근접한 AED 위치 표출 시스템

 

1. 주제 선정 이유

 

우리나라의 자동심장충격기(자동 제세동기, AED)의 현황을 분석하고자 함

 

2. 가설 정의

 

가설 : 전국적으로 자동심장충격기가 인구수에 비해 부족할 것이다.

 

3. 데이터 가공 과정

import pandas as pd
AED_daejeon= pd.read_csv('../2019102127/Daejeon_AED.csv',encoding = 'cp949')
del AED_daejeon['Unnamed: 4']
del AED_daejeon['성인아동범용여부']
del AED_daejeon['제조번호']
del AED_daejeon['제조사']
del AED_daejeon['운영담당자명']
del AED_daejeon['운영기관명']
del AED_daejeon['데이터기준일자']
del AED_daejeon['운영기관전화번호']
del AED_daejeon['설치유형']
del AED_daejeon['관리기관명']
AED_daejeon.rename(columns={AED_daejeon.columns[2]: '주소'}, inplace = True)
AED_daejeon.rename(columns={AED_daejeon.columns[5]: '전화번호'}, inplace = True)
AED_daejeon.head()

 

대전의 데이터 가공

AED_ulsan = pd.read_csv('../2019102127/Ulsan_AED.csv', encoding = 'cp949')
del AED_ulsan['성인아동범용여부']
del AED_ulsan['제조번호']
del AED_ulsan['제조사']
del AED_ulsan['운영담당자명']
del AED_ulsan['운영기관명']
del AED_ulsan['데이터기준일자']
del AED_ulsan['운영기관전화번호']
del AED_ulsan['설치유형']
del AED_ulsan['소재지지번주소']
del AED_ulsan['관리기관명']
AED_ulsan.rename(columns={AED_ulsan.columns[2]: '주소'}, inplace = True)
AED_ulsan.rename(columns={AED_ulsan.columns[5]: '전화번호'}, inplace = True)
AED_ulsan.head()

울산의 데이터 가공

Korea_people = pd.read_csv('../2019102127/Korea_people.csv', encoding = 'UTF-8')
del Korea_people['남']
del Korea_people['여']
del Korea_people['지역']
del Korea_people['남자']
del Korea_people['여자']
del Korea_people['성비']
del Korea_people['세대수']
del Korea_people['세대당인구']
Korea_people.drop([0,2,3,4,5],inplace = True) 
Korea_people.rename(index={Korea_people.index[0]: '0'}, inplace = True)
Korea_people.rename(index={Korea_people.index[1]: '1'}, inplace = True)
Korea_people.rename(index={Korea_people.index[2]: '2'}, inplace = True)
Korea_people.head()

for i in range(8,18):    
    Korea_people.drop([i],inplace = True)   
Korea_people.head()
Korea_people.rename(columns={Korea_people.columns[1]: '총 인구수'}, inplace = True)

 

우리나라 인구 데이터 가공

AED_seoul = pd.read_csv('../2019102127/Seoul_AED.csv', encoding = 'UTF-8')
del AED_seoul['번호']
del AED_seoul['도로명주소']
del AED_seoul['행정시']
del AED_seoul['행정동']
del AED_seoul['행정구']
AED_seoul.rename(columns={AED_seoul.columns[0]: '설치기관명'}, inplace = True)
AED_seoul.head()
# 서울의 AED 현황을 정리한 파일을 불러와 데이터를 추렸습니다.

서울의 데이터 가공

Korea_people2 = pd.read_csv('../2019102127/Korea_people2.csv', encoding=  'cp949')
# 추가적인 대한민국 인구&가구 정보를 알기위해 불러왔습니다.


Seoul_AED_N = AED_seoul.count()[1]
Daejeon_AED_N = AED_daejeon.count()[1]
Ulsan_AED_N = AED_ulsan.count()[1]
AED_data = pd.DataFrame({'도시 명':['서울특별시','대전광역시','울산광역시'],
                         'AED 개수':[Seoul_AED_N,  Daejeon_AED_N, Ulsan_AED_N]})
#정리한 데이터를 모으기 위해 데이터프레임을 만들었습니다.

AED_data['도시 면적(km^2)'] = ([605.2,539.8,1057])
AED_data['총 인구수'] = ([Korea_people['총 인구수'][0],Korea_people['총 인구수'][1],Korea_people['총 인구수'][2]])
AED_data['가구수'] = ([int(Korea_people2['2017.10'][5]),int(Korea_people2['2017.10'][83]),int(Korea_people2['2017.10'][89])])
AED_data['1인당 AED'] = (AED_data['AED 개수'] / AED_data['총 인구수'])
AED_data['1만명당 AED'] = (AED_data['1인당 AED']) * 10000
AED_data['1km^2당 AED'] = AED_data['AED 개수']/ AED_data['도시 면적(km^2)']
AED_data['가구수 대비 AED'] = AED_data['AED 개수'] / AED_data['가구수']

# 가공한 데이터들을 데이터프레임 안에 정리했습니다.

 

데이터 프레임 가공

4. 분석 결과

서울의 인구 1인당 AED 개수가 가장 적은 것으로 나타남

첫 번째 그래프는 인구 1만 명당 AED 개수로 울산 > 대전 > 서울 순으로 나타남

두 번째 그래프는 1제곱킬로미터당 AED 개수로 대전 > 서울 > 울산 순으로 나타남

 

5. 근접한 AED 표출 시스템

def calc_near_AED(pre_latitude, pre_longitude, latitude, longitude , file) :
    # 이 함수는 입력받은 위도와 경도 값을 이용하여 가장 근접한 AED의 위치를 찾아 알려주는 함수입니다. (KOR)
    # This function shows the location of the nearest AED using longitude and latitude. (ENG)
    for i in range(len(file)):
        set_latitude = float(file['위도'][i])
        set_longitude = float(file['경도'][i])
        if (latitude - pre_latitude)**2 + (longitude - pre_longitude)**2 > (latitude -set_latitude)**2 + (longitude - set_longitude)**2 :
            pre_latitude = set_latitude
            pre_longitude = set_longitude
            global latitude_inform
            latitude_inform = set_latitude
            global longitude_inform
            longitude_inform = set_longitude
            global AED_place
            AED_place = file['설치시설명'][i]
            global detail_place
            detail_place = file['상세설치장소'][i]
            global AED_address
            AED_address = file['주소'][i]
            global AED_call_number
            AED_call_number = file['전화번호'][i]
            
        else :
            continue
        
    print('현재 위치와 가장 가까운 설치장소는 ', AED_place ,'입니다.')
    your_dicision = input(prompt = '더 자세한 정보를 불러올까요? (Y/N)')
    
    if your_dicision == 'Y' or 'y' or 'yes' or 'Yes':
        print('상세설치장소 : ',detail_place)
        print('주소 : ', AED_address)
        print('전화번호 : ',AED_call_number)
        print('위도 : ',latitude_inform)
        print('경도 : ',longitude_inform)
    elif your_dicision =='N' or 'n' or 'no' or 'No' : 
        print('다음에 또 이용해 주세요.')
    else : 
        print('정확히 입력하였는지 확인 후 다시 시도해 주시기 바랍니다.')

입력받은 위치를 기준으로 최단거리의 AED 위치를 계산 후 출력하는 함수 지정

global latitude
global longitude

city = input('지금 위치하고 있는 도시 :')
if (city ==  '대전') :
    latitude = float(input('현재 위치의 위도는? '))
    longitude = float(input('현재 위치의 경도는? '))
    pre_latitude = -500
    pre_longitude = -500
    calc_near_AED(pre_latitude, pre_longitude, latitude, longitude , AED_daejeon)
    
elif (city == '울산') :
    latitude = float(input('현재 위치의 위도는? '))
    longitude = float(input('현재 위치의 경도는? '))
    pre_latitude = -500
    pre_longitude = -500
    calc_near_AED(pre_latitude, pre_longitude, latitude, longitude, AED_ulsan)
else :
    print('죄송합니다. 현재 울산과 대전의 데이터만을 제공하고 있습니다. 정확히 입력하였는지 확인해 주십시오.')

실질적으로 위치를 입력받는 부분.

 

 

1. 입력 프롬프트로 사용자 위치를 변수로 받음 

   

     #사용자의 위치는 위도와 경도를 사용.

 

 2. 입력받은 위도와 경도를 이용해 가장 가까운 AED 설치 장소를 계산

 

     1)입력받은 값은 위도와 경도는 각각 latitude, longitude에 저장.

 

     2) pre_latitude, pre_longitude의 초기값은 모두 -500으로 지정.

 

     3) file 변수에 입력된 (위에서 가공한 AED_daejeon, AED_ulsan을 사용) 엑셀 파일의 데이터 수만큼 반복문 사용

 

     4) file 안의 AED 위치 데이터를 set_latitude, set_longitude 에 저장하여 latitude, longitude 값과 계산한 거리가                pre_latitude, pre_longitude 값과 latitude, longitude 사이의 거리보다 적을 때, set_latitude, set_longitude 값을

        각각 pre_latitude, pre_longitude 값에 저장한다.

   

 3. 계산한 장소를 표출하고 추가 정보 제공

     

     # pre_latitude, pre_longitude 값의 데이터 번호에 맞는 데이터를 표출한다.

 

6. 5번의 시각화

 

import folium
AED_map = folium.Map(location=[latitude_inform, longitude_inform],zoom_start=14)
folium.Marker([latitude_inform,longitude_inform], popup = AED_place,
             icon=folium.Icon(color ='red')).add_to(AED_map)
folium.Marker([latitude,longitude], popup = AED_place,
             icon=folium.Icon(color = 'blue')).add_to(AED_map)
AED_map

folium 모듈을 사용.

표출한 AED의 위치와 사용자의 위치를 지도위에 표시한다.

 

7. 결과물

https://github.com/J2on/2019_Term_Project

 

GitHub - J2on/2019_Term_Project

Contribute to J2on/2019_Term_Project development by creating an account on GitHub.

github.com