728x90
반응형
시작에 앞서
해당 내용은 <파이썬으로 데이터 주무르기> -민형기 저, BJPUBLIC 출판사 의 내용을 토대로 작성되었습니다.
보다 자세한 내용은 해당 교재를 확인하여 주시기 바랍니다.
이전 시간 분석
인구소멸위기지역 확인
전 시간에 그렸던 인구수합계에서 bool 형이었던 것을 1과 0으로 바꾼다.
pop['소멸위기지역'] = [1 if con else 0 for con in pop['소멸위기지역']]
drawKorea('소멸위기지역', pop, 'Reds')
인구 현황에서 여성 인구 비율 확인하기
기존에 작성했던 drawKorea 함수 내용 중 일부를 변경해야 하는데, 그 이유는 표현하고자 하는 데이터에 음(-)의 값이 있는지 여부에 따라 일부 설정이 바뀌어야 하기 때문.
def drawKorea(targetData, blockedMap, cmapname):
gamma = 0.75
whitelabelmin = 20.
datalabel = targetData
tmp_max = max([ np.abs(min(blockedMap[targetData])),
np.abs(max(blockedMap[targetData]))])
vmin, vmax = -tmp_max, tmp_max
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 np.abs(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()
그런 다음, 여성 인구수와 합계를 나눈 다음 0.5를 빼는 작업을 하고 (0이면 여성 인구수가 50%)
▶ drawKorea에 색상 팔레트를 지정할 때 RdBu 같은 설정을 사용하면 0을 기준으로 좌우가 다른 색상을 갖도록 할 수 있음
pop['여성비'] = (pop['인구수여자']/pop['인구수합계'] - 0.5)*100
drawKorea('여성비', pop, 'RdBu')
파란색으로 갈수록 여성비가 높은 것이고, 빨간색으로 갈수록 여성비가 낮은 것
그러나, 이 데이터는 전체 여성 인구를 대상으로 한 것이기 때문에 소멸위기지역의 기준인 20-39세 여성 데이터로 변경하여야 한다.
pop['2030여성비'] = (pop['20-39세여자']/pop['20-39세합계'] - 0.5)*100
drawKorea('2030여성비', pop, 'RdBu')
Folium에서 인구 소멸 위기 지역 표현하기
원래 pop 데이터에서 ID 컬럼을 index로 설정
pop_folium = pop.set_index('ID')
pop_folium.head()
Folium과 json 을 import
import folium
import json
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)
인구수합계 표현하기
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=7)
folium.Choropleth(geo_data = geo_data,
data = pop_folium['인구수합계'],
columns = [pop_folium.index, pop_folium['인구수합계']],
fill_color = 'YlGnBu', #PuRd, YlGnBu
key_on = 'feature.id').add_to(map)
map
인구 소멸 위기 지역 표현하기
map = folium.Map(location=[36.2002, 127.054], zoom_start=7)
folium.Choropleth(geo_data = geo_data,
data = pop_folium['소멸위기지역'],
columns = [pop_folium.index, pop_folium['소멸위기지역']],
fill_color = 'PuRd', #PuRd, YlGnBu
key_on = 'feature.id').add_to(map)
map
마무리. CSV 저장하기
draw_korea_raw.to_csv("../data/05. draw_korea.csv", encoding='utf-8', sep='.')
전체 코드 및 csv 파일
728x90
반응형
'[파이썬 Projects] > <파이썬 데이터 분석>' 카테고리의 다른 글
[파이썬] 19대 대선 결과 분석 -2 (0) | 2024.05.01 |
---|---|
[파이썬] 19대 대선 결과 분석 -1 (1) | 2024.05.01 |
[파이썬] 우리나라 인구 소멸 위기 지역 분석 - 3 (0) | 2024.04.30 |
[파이썬] 우리나라 인구 소멸 위기 지역 분석 - 2 (2) | 2024.04.30 |
[파이썬] 우리나라 인구 소멸 위기 지역 분석 - 1 (0) | 2024.04.29 |