본문 바로가기

Python/Let's Get IT 파이썬 프로그래밍

[Let's Get IT 파이썬 프로그래밍] 9. 위치 정보 시각화

728x90
반응형

사람들이 가장 흥미를 가질 법한 챕터가 이번 단원이 아닐까 싶다. '내 코드를 지도로 나타낼 수 있다고?' 라고 생각하는 작성자와 '지도로 보니까 재밌네.' 라고 느끼는 독자의 반응이 혼재할 듯하다. 이번 포스트는 488~530 페이지에 대한 내용이다. 그리고 이번 포스트에 사용된 데이터는 지난 포스트의 '파일 링크'를 누르면 다운로드 가능하니 참고 바란다.


 

1. 환경 설정

folium이라는 라이브러리를 사용하는데 아마 설치가 안된 사람들이 많을 것이다. 설명에 따라 다운로드를 진행하자.

# folium 설치
!pip install folium
# 라이브러리 불러오기
import folium as fol
import csv
import operator as op
from openpyxl import load_workbook as lw

2. 위치 표시

apt = fol.Map([apt_lat, apt_long], 
               zoom_start = 16)
fol.Marker([apt_lat, apt_long], popup = "Samik Apt",
          icon = fol.Icon(icon = "home")).add_to(apt)
fol.Marker([tar_lat, tar_long], tooltip = "Centre", 
           icon = fol.Icon(color = "red") ).add_to(apt)
apt

 

코드의 구조는 기본 맵을 만들고, 거기에 Marker를 표시해주는 식이다. 좌표는 구글링으로 확보할 수 있다.

 

3. 프로젝트 결과를 지도에 표시하기

'Let's Get IT 파이썬 프로그래밍' 교재의 주제를 살짝 뒤틀어 여성인구 상위 19개동에 대해 알아봤다. ('순결한 19'인가 예전에 테마별로 랭킹을 보여주는 예능 프로가 있었는데... 너무 올드한가?) 코드가 점점 길어져 어렵게 느껴질 수 있지만, 지난 시간에 다룬 코드에 약간 추가됐을 뿐이니 너무 주눅들지 않아도 된다.

 

# 인구 데이터
f = open("./data/LOCAL_PEOPLE_DONG_202206.csv", 
        encoding = 'utf8')
data = csv.reader(f)
next(data) # 컬럼명 제거
data = list(data)

# 행정동 데이터
code = lw("./data/행정동코드_매핑정보_20200325.xlsx", 
                        data_only = True) # 수식 제외 셀값만 가져오기

# 행정동코드 시트의 데이터 가져오기
code = code['행정동코드']

# 행과 열의 데이터 출력 
all_cell = []

# code 데이터를 행 단위로 가져온다.
for r in code.rows:
    r_value = [] # 빈 셀을 만든다
    
    # 행 단위로 가져온 데이터에서 셀값을 추출해 리스트에 담는다.
    for cell in r:
        r_value.append(cell.value)
    
    # 위의 과정을 반복하며 모든 데이터를 가져온다.
    all_cell.append(r_value)

# 컬럼을 제외한다.
code = all_cell[2:]

# 위경도 데이터
f2 = open("./data/서울시 행정동별 전력 사용량 2008년 위치정보 (좌표계_ WGS1984).csv", 
        encoding = 'cp949')
where = csv.reader(f2)
next(where) # 컬럼명 제거
where = list(where)


# 행정동 데이터 자료형 변환
for row in data:
    for i in range(32):
        if i == 0 :
            row[i] = str(row[i])
        elif i <= 2 :
            row[i] = int(row[i])
        else :
            row[i] = float(row[i])
            
# 코드 데이터 자료형 변환
for row in code:
    row[0], row[1] = int(row[0]), int(row[1])
    
# 위경도 데이터 자료형 변환
for row in where:
    row[2], row[-2], row[-1] = int(row[2]), float(row[-2]), float(row[-1])  
  

# 여성인구 저장   
pop = {}

for r in data:
    dong_code, p = r[2], sum(r[18:32])
    
    if dong_code not in pop.keys():
        pop[dong_code] = p
    else :
        pop[dong_code] += p
        
top19 = sorted(pop.items(), key = op.itemgetter(1), reverse = True)[:19]

# 행정동 코드 저장
top_code = [c[0] for c in top19]


# 위경도 찾기
top19_name = [0 for i in range(19)]
top19_lat = [0 for i in range(19)]
top19_long = [0 for i in range(19)]

for i in range(len(top19)):
    # 행정동 이름
    for r in code:
        if r[1] == top_code[i]:
            top19_name[i] = r[-1]   
    
    # 행정동 위경도
    for r in where:
        if r[3] == top19_name[i]:
            top19_lat[i], top19_long[i] = r[-1], r[-2]

            
# 7자리 행정동 코드 처리
for i in range(len(top19_name)):
    
    # 위경도에 0인 데이터가 있으면
    if top19_lat[i] == 0 or top19_long[i] == 0 :
        
        # 7자리 행정동 코드 저장 
        for r in code:
            if top_code[i] == r[1]:
                code7 = r[0]
                
        # 7자리 코드 위경도 구하기
        for r in where:
            if code7 == r[2]:
                top19_lat[i], top19_long[i] = r[-1], r[-2]

                
# 지도 그리기
for i in range(len(top_code)):
    top19_name[i] = str(i + 1) + '-' + top19_name[i]
    
top19_map = fol.Map([top19_lat[0], top19_long[0]], zoom_start = 10)

# 반반 나누어 구분 표시
for i in range(19):
    if i >= 10:
        fol.Marker([top19_lat[i], top19_long[i]], tooltip = top19_name[i],
                  icon = fol.Icon(color = "purple", icon_color = "pink", icon = "female",
                                 prefix = 'fa')
                  ).add_to(top19_map)
    else:
        fol.Marker([top19_lat[i], top19_long[i]], tooltip = top19_name[i],
                  icon = fol.Icon(color = "purple", icon_color = "red", icon = "female",
                                 prefix = 'fa')
                  ).add_to(top19_map)

top19_map

 

서울시 여성 생활인구 1위는 역삼1동으로 나타났다. 낮에는 빌딩숲에서 일하는 직원들이, 밤에는 밤문화 종사자가 많기 때문일 것이다. 또 이들의 근무 패턴에 맞춰 식당, 미용실 등의 시설에서 일하는 사람도 많을 듯하다.

 


아이콘의 모양과 색을 바꿔가며 표현하면, 더욱 이목이 집중되는 멋있는 시각화가 가능할 것이다. Icon 명령어에서 prifix라는 파라미터를 사용해 다양한 그림을 적용시킬 수 있다. 

 

 

그럼 점심 맛있게 먹고, 다음에 또 보자.

728x90
반응형