데이터 구조화

1. stack 과 unstack

  • stack 은 컬럼을 인덱스로 이동시켜 데이터를 길게 쌓는 것이고 unstack은 쌓은 것을 옆으로 늘어뜨리는 것
  • 읽어온 데이터의 구조가 원하는 구조가 아닐 때 이러한 구조화 메소드를 이용해서 원하는 구조로 만들어서 데이터 분석을 수행합니다.
# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
import pandas as pd 
import numpy as np 
# 멀티 인덱스 만들기
# 튜플의 list를 이용해서 멀티 인덱스 만들기 
mul_index = pd.MultiIndex.from_tuples([('cust_1', '2015'),('cust_1','2016'),
                                        ('cust_2','2015'),('cust_2','2016')])

print(mul_index)


# %%
# 데이터 프레임 만들기
data = pd.DataFrame(data=np.arange(16).reshape(4,4),
                    index=mul_index,
                    columns=['prd_1', 'prd_2','prd_3','prd_4'])

print(data)


# 컬럼들을 인덱스로 설정 - stack 
# 모든 열을 세로 방향으로 세워서 하나의 열로 만든다. 
# index는 1개의 Level이 더 많아 진다. 
data_stacked = data.stack()
print(data_stacked)



# unstack은 데이터를 가로 방향으로 늘어뜨리는 것
# level 옵션을 이용해서 원하는 만큼만 열로 만들 수 있다.
# 지금같은 경우는 index가 3가지 이므로 0,1,2 가능 
print(data_stacked.unstack(level=0))
print()
print(data_stacked.unstack(level=2))
print()
print(data_stacked.unstack(level=2).unstack(level=1))

2. melt

  • ID 변수를 기준으로 원래 데이터 셋에 있던 여러 개의 칼럼 이름을 'variable'칼럼에 위에서 아래로 길게 쌓아놓고, 'value' 칼럼에 ID와 variable에 해당하는 값을 넣어주는 식으로 데이터를 재구조화

  • 여러개의 컬럼의 데이터를 합쳐서 하나의 컬럼으로 만드는것

  • 데이터프레임과 id_vars 매개변수에 합치고자 하는 컬럼 이름의 list를 대입하면 된다.
# 위 코드 이어서 
# 2개의 컬럼을 합쳐서 1개로 만들기 
# 남겨두고자 하는 컬럼의 list를 id_vars에 대입하면 
# 나머지 컬럼을 합쳐서 컬럼의 이름은 variable 
# 값은 value에 설정한다. 
print(data)
print()
print(pd.melt(data, id_vars=['prd_3','prd_4']))

3. crosstab

  • 범주형 변수로 되어있는 요인(factors)별로 교차분석(cross tabulations)해서, 행, 열 요인 기준 별로 빈도를 세어서 도수분포표(frequency table), 교차표(contingency table) 를 생성

  • 행과 열을 기준으로 빈도를 세워서 테이블을 만들어주는 함수

  • 교차분석 할 때 이용 - 도수분포표(frequency table)를 만들어주는 기능
  • 함수에 행 이름과 열 이름을 설정
  • 머신러닝 결과 등을 나타낼 때 자주 이용
import pandas as pd 
import numpy as np 

data = pd.DataFrame({
    'id' : ['id1', 'id1','id1','id2','id2','id2'],
    'fac_1' : ['a','a','a','b','b','b'],
    'fac_2' : ['c','c','c','c','d','d']})

print(data)
print()
# 분류 할때 실제값, 예측결과 대입하면 맞다 틀리다 나옴 
# fac_1 : 실제 데이터값, fac_2 : 테스트한 데이터값
print(pd.crosstab(data['fac_1'], data['fac_2']))



# 비율로 출력하기 
print(pd.crosstab(data['fac_1'], data['fac_2'], normalize=True))

평가지표, 리콜
어커런시, 재현율
평가 - 잔차(error)의 합 (회귀에서 씀, 예측값-실제값)
분류 - 도수분포표로 실제값 대비 예측값
ex)
비오는날 10, 비안오는날 90
비안오는날을 업샘플링 하든지, 비오는날을 다운샘플링하던지
비율을 둘이 같게 해서 분석해야된다.

Cartogram

  • 데이터의 크기 등을 나타내기 위해서 지도의 면적을 왜곡해서 표현하는 그림
  • 만드는 방식은 엑셀 등을 이용해서 지도를 그려내는 방식이고 일러스트레이터나 web의 svg(xml)을 이용해서 그린 후 svg를 추출하는 방법

인구 소멸지역을 나타내는 cartogram과 colorgleth(단계 구분도)

1. 국가 통계 포털에서 인구정보를 다운로드

  • population_raw_data.xlsx

2. 필요 패키지 import

3. 엑셀 파일의 내용을 읽기

4. 결측치 처리 (NA, None, NULL, np.NaN)

  • 컬럼 자체를 제거, NA 인 행 만 제거, 다른 값으로 치환(이전값, 이후값, 중간값, 평균, 최빈값, 머신러닝의 결과- 가장 정확할 가능성이 높지만 시간이 오래 걸림)

5. 컬럼이름 변경

  • 데이터를 직접 다운로드를 받으면 컬럼이름이 사용하기 어려운 경우가 많다.

통계청의 데이터들이나 다른 데이터들의 컬럼이 엉망인게 많다.
보통 성별은 sex, gender 를 사용하는데, RC-1, RC-2, .. 등으로 대입되어있는게 많다.
컬럼의 설명은 따로 되어 있다 RC-1 : 성별, RC-2 : 직업 .. 등
컬럼이름 확인해서 필요한 부분으로 수정 할것

6. 시도가 소계인 데이터를 제외 하고 가져오기

7. 항목 컬럼을 구분으로 변경하고 구분컬럼의 셀들을 합계, 남자, 여자로 변경

8. 청년과 노년을 분리하기 위해서 20~39 까지의 합계와 65~100+ 까지의 합계를 새로운 컬럼으로 추가

9. 피봇 테이블(행과 열을 설정해서 데이터의 기술통계 값을 확인) 생성

10. 소멸비율 컬럼을 생성해서 추가

  • 청년층 여자 / 노년층 합계 / 2

11. 소멸위기지역이라는 컬럼을 추가 - 소멸비율이 1.0 미만이면 True 아니면 False

12. 인덱스로 설정되어 있는 광역시도와 시도를 일반 컬럼으로 전환

  • 인덱스를 컬럼으로 만들고자 할 때는 인덱스를 제거하면 된다.

13. 2단(위아래)으로 구성된 컬럼이름을 하나의 컬럼이름으로 합치기

14. 광역시도 시도 이름 합치기

  • 광역시는 구별로 분류가 되어 있는데 광역시가 아닌데 구를 가진 곳은 분류가 안되어 있다.
  • 이 작업은 행정구역을 알아야 한다. (도메인지식)

15. 도시 이름을 pop에 새로운 컬럼으로 추가

  • pop['ID'] = si_name

16. 지도 정보를 가진 Excel 파일 읽기

  • draw_korea_raw.xlsx

17. 각 셀의 위치를 좌표로 만들기

18. 지도 그리기

1) 경계선 만들기 위한 좌표 생성

20. pop의 시도이름과 draw_

21. pop와 darq_korea_raw_stacked 를 join

22. 좌표와 인구수를 이용해서 피벗테이블 생성

python에서 인스턴스 메소드 호출

  1. 클래스.메소드이름(인스턴스) - unbound 호출
  2. 인스턴스.메소드이름() - bound 호출 크게 상관없다.

23. 컬럼이름과 dataframe 그리고 생상 이름을 대입하면 cartogram을 그려주는 함수

위의 데이터를 이용해서 단계구분도(colorpleth) 그리기

  • 단계구분도를 그릴 때는 그리고자 하는 지도의 경계를 나타내는 json 파일이 있어야 한다.
  • 우리나라 데이터는 southkore-maps를 검색하면 git-hub에서 제공

  • 실습 link

# To add a new cell, type '# %%'
# To add a new markdown cell, type '# %% [markdown]'
# %%
# 인구 소멸지역을 나타내는 cartogram과 colorgleth(단계 구분도)
# 1. 국가 통계 포털에서 인구정보를 다운로드 
# 2. 기본설정

# 배열 자료구조(행렬 포함), 선형대수, 과학 기술 계산을 위한 패키지
import numpy as np 
# Series, DataFrame(자료구조), 기술통계, 간단한 시각화를 위한 패키지
import pandas as pd 

# 시각화 기본 패키지
import matplotlib.pyplot as plt 

# 그래프에서 한글 처리를 위한 패키지
import platform
from matplotlib import font_manager, rc 

# 데이터 셋과 화려한 시각화를 위한 패키지
import seaborn as sns 
# 데이터 전처리를 위한 패키지
# sklearn 은 데이터셋과 전처리, 머신러닝을 위한 패키지 
from sklearn import preprocessing

# 지도 시각화(단계구분도)를 위한 패키지 
import folium

if platform.system() == 'Darwin':
    rc('font', family='AppleGothic')
elif platform.system() == 'Windows':
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)

# 음수 사용을 위한 설정
plt.rcParams['axes.unicode_minus'] = False


# %%
# 3. 파일열기
population = pd.read_excel('../data/population_raw_data.xlsx', header=1)
print(population)
population.info()


# %%
# 4. 결측치 처리

# 이 엑셀 파일에서는 위와 항목이 같은 경우가 NaN
# 전국, 소계 쪽에 NaN 이 있다(값없음)
# 이번 값으로 NA를 채우기
population.fillna(method='ffill', inplace=True)
print(population.head())
population.info()


# %%
# 5. 컬럼 이름 변경

# 딕셔너리 형태로 변경전컬럼이름과 변경후컬럼이름을 준다. 
population.rename(columns=
    {'행정구역(동읍면)별(1)':'광역시도', 
    '행정구역(동읍면)별(2)':'시도', 
    '계':'인구수'}, inplace=True)

population.info()


# %%
# 6. 시도가 소계인 데이터를 제외

# 제외를 할 때는 drop을 이용해서 삭제 할 수도 있고 필터링을 할 수도 있다. 
# 필터링 (특정한 조건을 제외(!=) 해버리고 싶다. 포함(==))
population=population[(population['시도'] != '소계')] 
print(population.head())


# %%
# 7. '항목' 컬럼을 '구분'으로 변경

population.rename(columns={'항목':'구분'}, inplace=True)
population.info()


# %%
# 셀의 값 변경 
# 구분이 '총인구수 (명)' -> 함계
# 구분이 '남자인구수 (명)' -> 남자
# 구분이 '여자인구수 (명)' -> 여자 

# loc로 '구분'의 '총인구수 (명)' 을 찾고 '합계'로 변경
population.loc[population['구분'] =='총인구수 (명)', '구분'] = '합계'
population.loc[population['구분'] =='남자인구수 (명)', '구분'] = '남자'
population.loc[population['구분'] =='여자인구수 (명)', '구분'] = '여자'

print(population['구분'].head())
# 구분 컬럼의 셀들이 변경된 것을 확인할수있다


# %%
# 8. 청년과 노년을 분리

# 청년과 노년 층으로 새로운 컬럼을 추가 
population['청년'] = (
    population['20 - 24세'] + population['25 - 29세'] + 
    population['30 - 34세'] + population['35 - 39세'])

population['노년'] = (
    population['65 - 69세'] + population['70 - 74세'] + 
    population['75 - 79세'] + population['80 - 84세'] + 
    population['85 - 89세'] + population['90 - 94세'] + 
    population['95 - 99세'] + population['100+'])            

print(population['청년'].head())
print(population['노년'].head())


# %%
# 9. 피봇테이블 생성

# 기술 통계 값을 확인
# 광역시도와 시도별, 구분 별로 청년과 노년의 값 확인 
pop = pd.pivot_table(population, 
    index=['광역시도', '시도'], 
    columns= '구분', 
    values=['인구수', '청년', '노년'])

print(pop.head())


# %%
# 10. 소멸비율 컬럼을 생성 
# '청년'층 '여자' / '노년'층 '합계' / 2

pop['소멸비율'] = pop['청년', '여자'] / (pop['노년', '합계'] / 2)
print(pop['소멸비율'].head())


# %%
# 11. 소멸위기지역 컬럼 생성 
# 소멸비율 < 1.0 True, 아니면 False 

pop['소멸위기지역'] = pop['소멸비율'] < 1.0 
print(pop['소멸위기지역'])

# 소멸위기지역에서 False인 값의 인덱스 두번째 항목을 가져오기
print(pop[pop['소멸위기지역'] == False].index.get_level_values(1))


# %%
# 12. 인덱스로 설정되어 있는 광역시도와 시도를 일반 컬럼으로 전환

# 인덱스 제거 
pop.reset_index(inplace=True)
print(pop.head())


# %%
# 13. 2단(위아래)으로 구성된 컬럼이름을 하나의 컬럼이름으로 합치기  

# 컬럼 이름 만들기 - 컬럼이 2레벨(두번째)로 되어 있어서 위 아래 레벨을 합치는 작업
# '청년' 의 '남자', '여자', '합계' 를 청년남자, 청년여자, 청년합계 방식으로 합치기
tmp_columns = [pop.columns.get_level_values(0)[n] + pop.columns.get_level_values(1)[n]for n in range(0, len(pop.columns.get_level_values(0)))]
print(tmp_columns)


# %%
# 만들어놓은 컬럼을 대입
pop.columns = tmp_columns
print(pop.head())


# %%
# 14. 광역시도 시도 이름 합치기 

# 시도 이름을 확인 
# '광역시도'는 다르지만 '시도'가 같은 지역이 있어서 주의가 필요하다. 
print(pop['시도'].unique())


# %%
# 시도 이름 만들기
si_name = [None] * len(pop)

# 광역시가 아닌 곳 중에 구를 가지고 있는 곳의 디셔너리 만들기 
tmp_gu_dict = {'수원':['장안구', '권선구', '팔달구', '영통구'],
    '성남':['수정구', '중원구', '분당구'],
    '안양':['만안구', '동안구'],
    '안산':['상록구', '단원구'],
    '고양':['덕양구', '일산동구', '일산서구'],
    '용인':['처인구', '기흥구', '수지구'],
    '청주':['상당구', '서원구', '흥덕구', '청원구'],
    '천안':['동남구', '서북구'],
    '전주':['완산구', '덕진구'],
    '포항':['남구', '북구'],
    '창원':['의창구', '성산구', '진해구', '마산합포구', '마산회원구'],
    '부천':['오정구', '원미구', '소사구']}

# 시도 고유 이름 만들기 
for n in pop.index :

    # ~광역시, ~특별시, ~자치시로 끝나지 않는  
    if pop['광역시도'][n][-3: ] not in ['광역시', '특별시', '자치시'] :
        # 중복된 지역인 '고성'에 대한 처리 
        if pop['시도'][n][:-1] == '고성' and pop['광역시도'][n] == '강원도' :
            si_name[n] = '고성(강원)'
        elif pop['시도'][n][:-1]=='고성' and pop['광역시도'][n]=='경상남도':
            si_name[n] = '고성(경남)'
        else:
            si_name[n] = pop['시도'][n][:-1]

            # 광역시 특별시 자치시가 아닌데 구를 가지고 있는곳 처리 
        for keys, values in tmp_gu_dict.items():
            if pop['시도'][n] in values:
                if len(pop['시도'][n])==2:
                    si_name[n] = keys + ' ' + pop['시도'][n]
                elif pop['시도'][n] in ['마산합포구','마산회원구']:
                    si_name[n] = keys + ' ' + pop['시도'][n][2:-1]
                else:
                    si_name[n] = keys + ' ' + pop['시도'][n][:-1]
    elif pop['광역시도'][n] == '세종특별자치시':
         si_name[n] = '세종'
    else:
        if len(pop['시도'][n])==2:
            si_name[n] = pop['광역시도'][n][:2] + ' ' + pop['시도'][n]
        else:
            si_name[n] = pop['광역시도'][n][:2] + ' ' + pop['시도'][n][:-1]

print(si_name)


# %%
# 15. 도시이름을 pop에 새로운 컬럼으로 추가 

pop['ID'] = si_name
print(pop['ID'])


# %%
# 현재 상태 확인 
print(pop.info())
print(pop.head())


# %%
# 16. 지도 정보를 가진 Excel 파일 읽기

draw_korea_raw = pd.read_excel('../data/draw_korea_raw.xlsx', encoding='cp949')
print(draw_korea_raw)


# %%
# 17. 각 셀의 위치를 좌표로 만들기

# 컬럼이름이 일련번호로 되어 있다. 
# 일련번호를 좌표로 사용할것이다
# stack 함수를 이용해서 컬럼이름을 인덱스로 만들기 

draw_korea_raw_stacked = pd.DataFrame(draw_korea_raw.stack())
print(draw_korea_raw_stacked) 


# %%
# 인덱스를 초기화해서 인덱스가 컬럼이 되도록 하기
# 인덱스를 컬럼 level_0, level_1로 꺼냈다 (컬럼 1개 -> 컬럼3개)

draw_korea_raw_stacked.reset_index(inplace=True)
print(draw_korea_raw_stacked)


# %%
print(draw_korea_raw_stacked.head(30))


# %%
# 좌표로 사용하기 위해서 컬럼이름 변경
# 'level_0' -> 'y', 'level-1' -> 'x', 0 -> 'ID' 로 변경 
draw_korea_raw_stacked.rename(columns= {'level_0':'y', 'level_1':'x', 0 : 'ID'}, inplace=True)
print(draw_korea_raw_stacked)


# %%
# 18. 지도 그리기 

# 경계선 만들기 위한 좌표 생성
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), (24,2), (21,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)], #울산
    # [(9,14), (9,15)],
    [(27,5), (27,6), (25,6)],
    ]


# %%
# 19. 

plt.figure(figsize=(8,10))
# 지역 이름 표시
for idx, row in draw_korea_raw_stacked.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 = 9.5, 1.5
    else:
        fontsize, linespacing = 11, 1.2
    # 글자 작성 
    plt.annotate(dispname,(row['x']+0.5, row['y']+0.5), weight='bold', fontsize=fontsize, ha='center', va='center', linespacing=linespacing)         

# 시도 경계 그린다.
for path in BORDER_LINES:
    ys, xs = zip(*path)
    plt.plot(xs, ys, c='black', lw=1.5)

# 상하 뒤집기 - 엑셀은 하단으로 갈때 좌표가 증가하지만
# 모니터는 상단으로 갈때 좌표가 증가한다. 

plt.gca().invert_yaxis()
# 축제거
plt.axis('off')
plt.show()


# %%
print(pop[pop['ID'] == '서울 강남'])


# %%
print(draw_korea_raw_stacked[draw_korea_raw_stacked['ID'] == '서울 강남'])


# %%
# 20. pop의 ID와 draw_korea_raw_stacked 의 ID 불일치 찾기

# pop의 ID와 draw_korea_raw_stacked 의 ID 불일치 찾기 
# print(pop.head())
print(set(draw_korea_raw_stacked['ID'].unique()) - set(pop['ID'].unique()))
print()
print(set(pop['ID'].unique()) - set(draw_korea_raw_stacked['ID'].unique()))


# %%
# pop에는 있는데 draw에는 없는 데이터 제거할 리스트 만들기
del_list = list(set(pop['ID'].unique()) - set(draw_korea_raw_stacked['ID'].unique()))

# 리스트를 순회하면서 데이터를 제거 
for rownum in del_list :
    pop = pop.drop(pop[pop['ID'] == rownum].index)


# %%
# 더이상 불일치한 데이터가 나오면 안됨 
print(set(pop['ID'].unique()) - set(draw_korea_raw_stacked['ID'].unique()))
# set - 합집합, 교집합, 차집합 을 할 수 있음.


# %%
# 21. pop와 darq_korea_raw_stacked 를 join

pop = pd.merge(pop, draw_korea_raw_stacked, how='inner', on=['ID'])
print(pop.info())


# %%
# 22. 좌표와 인구수를 가지고 pivot 테이블 만들기 

mapdata = pop.pivot_table(index='y', columns='x', values='인구수합계')
print(mapdata)


# %%
# NaN 제거를 위한 작업

masked_mapdata = np.ma.masked_where(np.isnan(mapdata), mapdata)
print(masked_mapdata)


# %%
# 23. 컬럼이름과 dataframe 그리고 색상 이름을 대입하면 catogram을 그려주는 함수 

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])
    #x 와 y를 가지고 피봇 테이블 만들기
    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()


# %%
drawKorea('인구수합계', pop, 'Blues')


# %%
print(pop.head())


# %%
# 소멸위기지역을 수치 데이터로 변환 - True:1, False:0
pop['소멸위기지역'] = [1 if imsi else 0 for imsi in pop['소멸위기지역']]
drawKorea('소멸위기지역', pop, 'Blues')


# %%
#단계 구분도를 위한 라이브러리 
import folium
import json 

# 데이터에서 지역이름을 인덱스로 설정
pop_folium = pop.set_index('ID')
print(pop_folium)


# %%
# 표시하고자하는 지도의 경계선 데이터를 가져옵니다. 
geo_str = json.load(open('../data/korea_geo_simple.json'))
print(geo_str)


# %%
# 지도 출력
map = folium.Map(location=[36.2002, 127.054], zoom_start=7)

map.choropleth(geo_data = geo_str, 
    data = pop_folium['인구수합계'], 
    fill_color='YlGnBu', 
    key_on='feature.id', 
    columns=[pop_folium.index, pop_folium['인구수합계']])

map
#map.save('pop.html')

results matching ""

    No results matching ""