즐겁게!! 자신있게!! 살아보세!!

재밌는 인생을 위하여! 영촤!

Language_Study/Python

[Python] 11-2.Dataframe응용과 시각화

Godwony 2021. 1. 19. 21:27
728x90
반응형

데이터 구조화

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. 청년과 노년을 분리하기 위해서 2039 까지의 합계와 65100+ 까지의 합계를 새로운 컬럼으로 추가

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')
728x90
반응형

'Language_Study > Python' 카테고리의 다른 글

[Python] 12.통계학  (0) 2021.01.19
[Python] 11-1.DataFrame응용과 시각화  (0) 2021.01.19
[Python] 10-2.데이터전처리  (0) 2021.01.19
[Python] 10-1.데이터전처리  (4) 2021.01.19
[Python] 9.시각화  (0) 2021.01.19