728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.
이전 분석 내용
19대 대선 결과 득표율 시각화하기
시각화를 위해 사용할 함수는 지난 분석에 작성한 drawKorea 함수 및 Border_Lines를 입력하고
BORDER_LINES=[
[(5,1),(5,2),(7,2),(7,3),(11,3),(11,0)], # 인천
[(5,4),(5,5),(2,5),(2,7),(4,7),(4,9),(7,9),(7,7),(9,7),(9,5),(10,5),(10,4),(5,4)], # 서울
[(1,7),(1,8),(3,8),(3,10),(10,10),(10,7),(12,7),(12,6),(11,6),(11,5),(12,5),(12,4),(11,4),(11,3)], # 경기도
[(8,10),(8,11),(6,11),(6,12)], # 강원도
[(12,5),(13,5),(13,4),(14,4),(14,5,),(15,5),(15,4),(16,4),(16,2)], # 충청북도
[(16,4),(17,4),(17,5),(16,5),(16,6),(19,6),(19,5),(20,5),(20,4),(21,4),(21,3),(19,3),(19,1)], # 전라북도
[(13,5),(13,6),(16,6)],
[(13,5),(14,5)], # 대전시 세종
[(21,2),(21,3),(22,3),(22,4),(24,4),(21,2),(24,2)], #광주
[(20,5),(21,5),(21,6),(23,6)], #전라남도
[(10,8),(12,8),(12,9),(14,9),(14,8),(16,8),(16,6)], # 충청북도
[(14,9),(14,11),(14,12),(13,12),(13,13)], # 경상북도
[(15,8),(17,8),(17,10),(16,10),(16,11),(14,11)], # 대구
[(17,9),(18,9),(18,8),(19,8),(19,9),(20,9),(20,10),(21,10)], # 부산
[(16,11),(16,13)], #울산
[(27,5),(27,6),(25,6)]
]
def drawKorea(targetData, blockedMap, cmapname):
gamma = 0.75
whitelabelmin = (max(blockedMap[targetData]) -
min(blockedMap[targetData]))*0.25 + \
min(blockedMap[targetData])
datalabel = targetData
vmin = min(blockedMap[targetData])
vmax = max(blockedMap[targetData])
mapdata = blockedMap.pivot_table(index='y', columns='x', values=targetData)
masked_mapdata = np.ma.masked_where(np.isnan(mapdata), mapdata)
plt.figure(figsize=(9, 11))
plt.pcolor(masked_mapdata, vmin=vmin, vmax=vmax, cmap=cmapname,
edgecolor='#aaaaaa', linewidth=0.5)
# 지역 이름 표시
for idx, row in blockedMap.iterrows():
# 광역시는 구 이름이 겹치는 경우가 많아서 시단위 이름도 같이 표시한다.
#(중구, 서구)
if len(row['ID'].split())==2:
dispname = '{}\n{}'.format(row['ID'].split()[0], row['ID'].split()[1])
elif row['ID'][:2]=='고성':
dispname = '고성'
else:
dispname = row['ID']
# 서대문구, 서귀포시 같이 이름이 3자 이상인 경우에 작은 글자로 표시한다.
if len(dispname.splitlines()[-1]) >= 3:
fontsize, linespacing = 10.0, 1.1
else:
fontsize, linespacing = 11, 1.
annocolor = 'white' if row[targetData] > whitelabelmin else 'black'
plt.annotate(dispname, (row['x']+0.5, row['y']+0.5), weight='bold',
fontsize=fontsize, ha='center', va='center', color=annocolor,
linespacing=linespacing)
# 시도 경계 그린다.
for path in BORDER_LINES:
ys, xs = zip(*path)
plt.plot(xs, ys, c='black', lw=2)
plt.gca().invert_yaxis()
plt.axis('off')
cb = plt.colorbar(shrink=.1, aspect=10)
cb.set_label(datalabel)
plt.tight_layout()
plt.show()
이를 이용하여 당시 각 후보들 간 득표율 격차를 그리면 된다.
득표율 격차: 문재인 후보 vs 홍준표 후보
drawKorea('moon_vs_hong', final_elect_data, 'RdBu')
득표율 격차: 문재인 후보 vs 안철수 후보
drawKorea('moon_vs_ahn', final_elect_data, 'RdBu')
득표율 격차: 홍준표 후보 vs 안철수 후보
drawKorea('ahn_vs_hong', final_elect_data, 'RdBu')
Folium을 통한 결과 비교
먼저 Folium을 import 하고
import folium
import json
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
ID를 index로 잡고, '광역시도'와 '시군' 데이터 삭제
pop_folium = final_elect_data.set_index('ID')
del pop_folium['광역시도']
del pop_folium['시군']
pop_folium.head()
문재인 후보 vs 홍준표 후보의 득표율 비교
geo_path = '../data/05. skorea_municipalities_geo_simple.json'
geo_data = json.load(open(geo_path, encoding='utf-8'))
map = folium.Map(location=[36.2002, 127.054], zoom_start=6)
folium.Choropleth(geo_data = geo_data,
data = pop_folium['moon_vs_hong'],
columns = [pop_folium.index, pop_folium['moon_vs_hong']],
fill_color = 'PuBu', #PuRd, YlGnBu
key_on = 'feature.id').add_to(map)
map
전체 코드
728x90
반응형
'[파이썬 Projects] > <파이썬 데이터 분석>' 카테고리의 다른 글
[파이썬] 시계열 데이터 다루기 - 2 (0) | 2024.05.06 |
---|---|
[파이썬] 시계열 데이터 다루기 - 1 (0) | 2024.05.06 |
[파이썬] 19대 대선 결과 분석 -3 (0) | 2024.05.04 |
[파이썬] 19대 대선 결과 분석 -2 (0) | 2024.05.01 |
[파이썬] 19대 대선 결과 분석 -1 (1) | 2024.05.01 |