folium choropleth map

SOOYEON·2022년 9월 27일
0

pandas

목록 보기
29/37

data

aed.shape

# output
(527, 8)

→ 총 527개의 심제세동기가 설치되어 있음을 확인

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 527 entries, 0 to 526
Data columns (total 7 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   설치장소    527 non-null    object
 1   설치위치    527 non-null    object
 2   전화번호    498 non-null    object
 3   도로명주소   527 non-null    object
 4   지번주소    527 non-null    object
 5   경도      527 non-null    object
 6   위도      527 non-null    object
dtypes: object(7)
memory usage: 28.9+ KB

위도 경도의 데이터 형태가 object 이므로 float형으로 형변환

aed['위도'] = aed['위도'].astype('float')
aed['경도'] = aed['경도'].astype('float')

foliumn map 생성

jeju_map = folium.Map((33.361664, 126.5291762), zoom_start= 10)
jeju_map

설치 장소의 지번주소로 법정동 컬럼 생성

aed['법정동'] = aed['지번주소'].str.split(' ').str[2]

aed['법정동'].unique()

# output 
array(['도남동', '연동', '이도일동', '화북이동', '조천읍', '건입동', '한경면', '애월읍', '구좌읍',
       '한림읍', '이도이동', '오라이동', '노형동', '봉개동', '도두일동', '도련일동', '도평동', '일도이동',
       '화북일동', '삼도이동', '월평동', '오등동', '삼양이동', '삼양일동', '영평동', '아라일동',
       '외도일동', '오라일동', '외도이동', '용담이동', '용담삼동', '우도면', '해안동', '아라이동',
       '이호일동', '일도일동', '삼도일동', '도련이동', '용담일동', '추자면'], dtype=object)

법정동별 제세동기 설치 수

aed_emd = aed.groupby('법정동')[['설치장소']].count().reset_index().sort_values('설치장소',ascending=False).reset_index(drop=True)
aed_emd

# output
법정동	설치장소
0	건입동	56
1	아라일동	51
2	노형동	44
3	애월읍	43
4	조천읍	30
5	연동		30
6	한림읍	29
7	구좌읍	29
8	우도면	19
9	오라이동	18
10	화북일동	18
11	한경면	16
12	이도이동	16
13	영평동	15
14	이도일동	12
15	일도이동	10
16	용담이동	9
17	오라일동	7
18	도남동	7
19	봉개동	7
20	화북이동	6
21	삼도이동	6
22	월평동	5
23	도련일동	5
24	추자면	4
25	삼양이동	4
26	외도일동	4
27	용담삼동	3
28	도두일동	3
29	도평동	3
30	삼도일동	3
31	용담일동	3
32	외도이동	2
33	일도일동	2
34	해안동	2
35	아라이동	2
36	도련이동	1
37	삼양일동	1
38	이호일동	1
39	오등동	1

Choropleth map 생성

# Choropleth map
folium.Choropleth(
    geo_data = geo_str, # 행정구역 경계 JSON 
    data = aed_emd, # 법정동별 제세동기 설치 수
    columns = ['법정동','설치장소'], # 사용할 컬럼
    fill_color = 'PuRd', # color
    key_on = 'properties.EMD_NM', # 법정동명 으로 매핑
    legend_name = '설치 수', # legend 이름 지정
    fill_opacity = 0.7, # 색칠 투명도
    line_opacity = 0.2 # 라인 투명도
).add_to(jeju_map)

jeju_map

데이터가 없는 지역은 지도에서 검은 배경으로 출력됨

데이터 수정

  • 제세동기 설치 데이터에서 해당되는 법정동의 리스트를 저장
aed_lst = aed.법정동.tolist()
  • 제세동기 설치현황 정보가 없는 법정동명 추출
emd_na = df[~df['EMD_NM'].isin(aed_lst)]
emd_na

  • 리스트 저장
emd_lst = emd_na['EMD_NM'].tolist()
  • 기존 제세동기 데이터 프레임과 병합하기 위해 정보가 없는 법정동명의 데이터 프레임을 생성
na_aed = pd.DataFrame({'법정동': emd_lst, '설치장소': [0]* len(emd_lst)})
na_aed

  • pd.concat으로 데이터 병합
aed_df = pd.concat([aed_emd, na_aed])
aed_df
  • 같은 방법으로 choropleth map 생성
jeju_map = folium.Map((33.361664, 126.5291762), zoom_start= 10)
jeju_map
# Choropleth map
folium.Choropleth(
    geo_data = geo_str, # 행정구역 경계 JSON 
    data = aed_df, # 법정동별 제세동기 설치 수
    columns = ['법정동','설치장소'], # 사용할 컬럼
    fill_color = 'PuRd', # color
    key_on = 'properties.EMD_NM', # 법정동명 으로 매핑
    legend_name = '설치 수', # legend 이름 지정
    fill_opacity = 0.7, # 색칠 투명도
    line_opacity = 0.2 # 라인 투명도
).add_to(jeju_map)

jeju_map

# html save
jeju_map.save('aed_jeju.html')

데이터가 없는 지역도 해당 색상 범례에 맞춰 지도 생성

0개의 댓글