오도원입니다.

건강과 행복을 위하여

PNU DSC/파이썬 데이터 분석

03-3. 인구 공공 데이터 - 파이차트

오도원공육사 2020. 5. 23. 00:53
반응형

1. 우리 동네 인구 구조를 파이 차트로 나타내기

제주도의 남녀 성별 비율을 barh()그래프로 나타내보자.

import csv
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file)

m = []
f = []

name = input('지역 입력 => ')
for row in data:
    if name in row[0]:
        for i in row[3:104]:
            m.append(-int(i.replace(',','')))
        for i in row[106:]:
            f.append(int(i.replace(',', '')))

plt.style.use('ggplot')
plt.figure(figsize=(10,5), dpi=300)
plt.rc('font', family='malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False
plt.title(name + ' 지역의 남녀 성별 인구 분포')
plt.barh(range(101), m, label='남성')
plt.barh(range(101), f, label='여성')
plt.legend()
plt.show()

위와 같이 오류가 발생한다. 

 

gender.csv에는 남성과 여성에 대해 0세부터 100세 이상까지의 인구가 저장되어있고, 따라서 여성과 남성에 대해 각각 101개의 데이터가 존재할 것이다. 맞는지 확인해보자.

print(len(m), len(f))

4646이라는 값이 출력되었다.

이유는 위와 같이 제주특별자치도에 해당하는 행이 여러개이기 때문이다. 따라서 코드를 다음과 같이 수정해야한다.

 

name = input('지역 입력 => ')
for row in data:
    if name in row[0]:
    	for i in row[3:104]:
            m.append(-int(i.replace(',', '')))
        for i in row[106:]:
            f.append(int(i.replace(',', '')))
        break

break을 추가하니 제대로 출력이 되었다.

 

2. 혈액형 비율 표현하기

1) pie()함수

원그래프라고도 불리는 파이차트(pie chart)는 전체 데이터 중 특정 데이터의 비율을 보기 쉽게 표현한다. pie()함수의 괄호 안에 값을 입력하여 파이 차트를 그리는 코드이다.

plt.pie([10, 20])
plt.show()

size = [2441, 2312, 1031, 1233]
plt.pie(size)
plt.show()

3. % 추가하기

파이 그래프에서 특정 데이터가 몇 퍼센트(%)를 차지하는지 표시해야 더욱 유용하다.

 

1) 레이블 추가하기

labels 속성을 사용한다. labels는 데이터의 개수만큼 지정해주어야 한다.

plt.rc('font', family='Malgun Gothic') # 그래프에 한글 표시
size = [2441, 2312, 1031, 1233] # 데이터
label = ['A형', 'B형', 'AB형', 'O형'] # 레이블
plt.pie(size, labels=label)
plt.show()

레이블은 반시계 방향으로 적용되며, 파이 그래프의 시작지점은 3시이다.

 

2) 비율 및 범례 표시

위의 A형과 B형 처럼 비율이 비슷하면 육안으로 구분하기 힘들다. 이때는 auto percent를 사용하면 비율을 표시할 수 있다. 이것은 autopct 속성을 이용한다. 또한 legend()를 사용하면 labels를 범례로 추가할 수 있다.

plt.rc('font', family='Malgun Gothic') # 그래프에 한글 표시
plt.figure(figsize=(10,6), dpi=150)
size = [2441, 2312, 1031, 1233] # 데이터
label = ['A형', 'B형', 'AB형', 'O형'] # 레이블
plt.pie(size, labels=label, autopct='%.1f%%')
plt.legend()
plt.show()

3) 색 및 돌출 효과 적용

colors 속성은 그래프의 색상을 지정하고, explode 속성은 돌출 효과를 적용할 수 있다.

plt.rc('font', family='Malgun Gothic') # 그래프에 한글 표시
plt.figure(figsize=(10,6), dpi=150)
size = [2441, 2312, 1031, 1233] # 데이터
label = ['A형', 'B형', 'AB형', 'O형'] # 레이블
color = ['darkmagenta', 'deeppink', 'hotpink', 'pink']
plt.pie(size, labels=label, autopct='%.1f%%', colors=color, explode=(0,0,0.1,0))
plt.legend()
plt.show()

 

3. 지역의 성별 인구 비율 표시하기

이번에는 성별 인구의 총 수가 필요하다. 남성은 3~103번 까지의 인구, 여성은 106~206까지의 데이터를 더하여 구할 수 있다. 물론 B행과 DA행의 이미 총인구수가 저장되어있어서 그것을 참조해도된다.

import csv
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file)
size = []
name = input('찾고 싶은 지역의 이름 입력 => ')
for row in data:
    if name in row[0]:
        m = 0
        f = 0
        for i in range(101):
            m += int(row[i+3].replace(',', '')) # 3~103번 남성 인구 데이터 누적
            f += int(row[i+106].replace(',', '')) # 106~206번 여성 인구 데이터 누적
        break

size.append(m) # 남성 인구 합계 데이터를 리스트에 추가
size.append(f) # 여성 인구 합계 데이터를 리스트에 추가
print(size)
plt.rc('font', family='Malgun Gothic')
color = ['crimson', 'darkcyan']
plt.pie(size, labels=['남', '여'], autopct='%.1f%%', colors=color, startangle=90)
plt.title(name + ' 지역의 남녀 성별 비율')
plt.show()

정리

import csv
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file) # 데이터 불러오기

size = [] # 남녀 인구수를 저장할 리스트 생성
name = input('찾고 싶은 지역의 이름 입력 => ') # 찾을 지역 이름 입력받기
for row in data:
    if name in row[0]:
        m = 0 # 남성 인구수를 누적할 변수
        f = 0 # 여성 인구수를 누적할 변수
        for i in range(101):
            m += int(row[i+3].replace(',', '')) # 남성 인구수 누적
            f += int(row[i+106].replace(',', '')) # 여성 인구수 누적
        break # 반복 종료

size.append(m) # 남성 인구 합계 데이터를 리스트에 추가
size.append(f) # 여성 인구 합계 데이터를 리스트에 추가
print(size)

plt.rc('font', family='Malgun Gothic')
color = ['crimson', 'darkcyan'] # 그래프 색상 설정
plt.pie(size, labels=['남', '여'], autopct='%.1f%%', colors=color, startangle=90)
plt.title(name + ' 지역의 남녀 성별 비율') # 그래프 제목 설정
plt.show()
file.close()

결과는 위와 동일

반응형