오도원입니다.

건강과 행복을 위하여

PNU DSC/파이썬 데이터 분석

03-2. 인구 공공데이터2

오도원공육사 2020. 5. 15. 14:55
반응형

1. 인구 구조를시각화하기

import csv
import matplotlib.pyplot as plt
f = open('age.csv')
data = csv.reader(f)
result = []
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 :  ')

for row in data:
    if name in row[0]:
    	for i in row[3:]:
            result.append(int(i.replace(',', ''))) # int로 형변환하기 위해 ,를 없앤다.
            
plt.style.use('ggplot')
plt.rc('font', family='Malgun Gothic')
plt.title(name + ' 지역의 인구구조')
plt.plot(result)
plt.show()

 

2. 막대그래프

연령대가 같은 사람들의 정보로 그래프를 그린다면 지역에 따른 비교를 할 수 있다. 성별을 기준으로 그래프를 그린다면 지역별 성비도 확인할 수 있다.

 

1) bar() 함수

bar()함수는 막대그래프를 표현하는 명령어이다. 막대의 길이는 각 데이터의 크기를 의미한다.

plt.bar([0, 1, 2, 4, 6, 10], [1, 2, 3, 5, 6, 7])
plt.show()

다음과 같이 막대그래프를 그린다.

bar(막대를 표시할 위치, 막대의 높이)

위의 그래프에서 0에 위치하는 막대의 높이는 1, 10에 해당하는 막대의 높이는 7인 그래프가 그려진다.

 

2) range()

range()함수를 사용하여 막대그래프의 위치를 표현할 수 있다.

plt.bar(range(6), [1, 2, 3, 5, 6, 7])
plt.show()

이제 인구구조를 막대 그래프로 표현해보자.

f = open('age.csv')
data = csv.reader(f)

result = []
for row in data:
	if '장전제1동' in row[0]:
    	for i in row[3:]:
        	result.append(int(i))
            
plt.bar(range(101), result) # 0세~100세이상까지이므로 ragne(101)로 설정
plt.show()
f.close()

3) barh()함수

막대 그래프를 수평방향으로 그릴 수도 있다.

plt.barh(range(101), result)

3. 항아리 모양 그래프

1) 남녀인구분포 다운받기

정책자료 -> 통계 -> 주민등록 인구통계

  • 연령별 인구현황
  • 통계표
  • 남/여 구분
  • 연령 구분 단위 1세
  • 0세 ~ 100세이상
  • 검색
  • 전체읍면동현황
  • csv파일 다운로드

gender.csv 파일로 저장한다.

 

해당 csv파일은 남성 나이별 인구수가 나오고 그 다음 여성 나이별 인구수가 나온다.

 

  • 남성 데이터는 인덱스3(0세)부터 인덱스103(100세이상)
  • 여성 데이터는 인덱스106(0세)부터 마지막(100세이상)까지 나와있다.
    • 따라서 여성데이터는 마지막인덱스부터 106인덱스까지 거꾸로 저장하고나서 뒤집을 것이다.
f = open('gender.csv')
data = csv.reader(f)
m = []
f = []

for row in data:
    if '장전제1동' in row[0]:
    	for i in range(0, 101):
            m.append(int(row[i+3]))
            f.append(int(row[-(i+1)])) # 100세이상부터 0세까지 거꾸로 저장

f.reverse() # 거꾸로 저장된 데이터를 뒤집는다.

 

다른 방법은 여성데이터를 다른 for loop를 이용하여 인덱스106(0세)부터 차례로 저장하는 것이다.

f = open('gender.csv')
data = csv.reader(f)
m = []
f = []

for row in data:
    if '장전제1동' in row[0]:
    	for i in row[3:104]:
            m.append(int(i))
        for i in row[106:]:
            f.append(int(i))

 

이제 저장된 데이터를 barh()함수를 이용해서 시각화해보자.

plt.barh(range(101), m)
plt.barh(range(101), f)
plt.show()

남성 그래프와 여성 그래프가 겹쳐서 알아보기 어렵다. 이것을 남성 데이터를 음수로 바꿔서 그래프를 그려서 문제를 해결해보자.

 

다음 코드를 사용한다.

m.append(-int(i)) # 마이너스 부호를 넣어서 음수로 변경
import csv
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file)
m = []
f = []
for row in data:
    if '장전제1동' in row[0]:
        for i in range(0, 101):
            m.append(-int(row[i+3])) # 마이너스 부호를 넣어서 음수로 변경
            f.append(int(row[-(i+1)])) # 여성 데이터를 리스트 f에 저장
f.reverse()
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
plt.title('장전제1동 지역의 남녀 성별 인구 분포')
plt.barh(range(101), m, label='남성')
plt.barh(range(101), f, label='여성')
plt.legend()
plt.show()
file.close()

 

4. 정리

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()
file.close()

반응형