[Python/Matplotlib] 특정 지역과 비슷한 연령별 인구 구조를 가진 지역 추출 및 꺾은선 그래프로 시각화하기
특정 지역과 비슷한 연령별 인구 구조를 가진 지역 추출 및 꺾은선 그래프 그리기
import numpy as np
import csv
import matplotlib.pyplot as plt
f = open('age.csv')
data = csv.reader(f)
next(data)
data = list(data)
name = input('인구 구조가 알고 싶은 지역의 이름을 입력하세요.')
mn = 1 # 최솟값을 저장할 변수 생성 및 초기화
result_name = '' # 최솟값을 갖는 지역의 이름을 저장할 변수 생성 및 초기화
result = 0 # 최솟값을 갖는 지역의 연령대별 인구 비율을 저장할 배열 생성 및 초기화
for row in data:
if name in row[0]:
home = np.array(row[3:], dtype=int) / int(row[2])
for row in data:
away = np.array(row[3:], dtype=int) / int(row[2])
s = np.sum((home - away) ** 2)
if s < mn and name not in row[0]:
ms = s
result_name = row[0]
result = away
plt.style.use('ggplot')
plt.figure(figsize = (10, 5), dpi=300)
plt.rc('font', family='Malgun Gothic')
plt.title(name + ' 지역과 가장 비슷한 인구 구조를 가진 지역')
plt.plot(home, 'r.:', label = name)
plt.plot(result, color = '#CC14AF', label = result_name)
plt.legend()
plt.show()
전체 코드
1. 라이브러리 및 모듈 import
import numpy as np
import csv
import matplotlib.pyplot as plt
- 연산을 위해 numpy 모듈을 import한다.
- csv 파일을 읽기 위해 csv 모듈을 import한다.
- 그래프를 그려 시각화 하기 위해 matplotlib 라이브러리의 pyplot 모듈을 import한다.
2. csv 공공데이터 읽어오기
f = open('age.csv')
data = csv.reader(f)
next(data)
data = list(data)
- open()을 이용하여 age.csv 파일을 f에 저장한다. age.csv에는 연령별 인구 수 데이터가 저장되어있다.
- csv.reader()를 이용하여 f에 저장된 공공 기온 데이터를 읽어와 data에 저장한다.
- next()를 이용하여 분석에 필요없는 헤더 데이터를 제거해준다.
- 데이터 가공을 위해 list 형태로 만들어준다.
3. 데이터 시각화를 위한 변수 선언
name = input('인구 구조가 알고 싶은 지역의 이름을 입력하세요.')
mn = 1 # 최솟값을 저장할 변수 생성 및 초기화
result_name = '' # 최솟값을 갖는 지역의 이름을 저장할 변수 생성 및 초기화
result = 0 # 최솟값을 갖는 지역의 연령대별 인구 비율을 저장할 배열 생성 및 초기화
- input()을 이용하여 인구 구조를 알고 싶은 특정 지역 이름을 입력받아 name 변수에 저장한다.
- 최솟값 인구수 저장을 위한 변수 mn을 선언한다.
- 인구수 최솟값을 갖는 지역의 이름을 저장하기 위한 변수 result_name을 선언한다.
- 인구수 최솟값을 갖는 지역의 연령대별 인구 비율을 저장하기 위한 배열 변수 result를 선언한다.
4. 공공데이터로부터 원하는 데이터 추출 및 저장
for row in data:
if name in row[0]:
home = np.array(row[3:], dtype=int) / int(row[2])
for row in data:
away = np.array(row[3:], dtype=int) / int(row[2])
s = np.sum((home - away) ** 2)
if s < mn and name not in row[0]:
ms = s
result_name = row[0]
result = away
- for row in data를 이용하여 모든 데이터를 한 줄 씩 읽는다.
- 만약 입력받은 특정 지역명인 name이 0번째 줄(지역 이름)과 동일하다면
- home 변수에 해당 지역의 인구 수 데이터를 저장한다.
- for row in data를 이용하여 모든 데이터를 한 줄 씩 읽는다.
- away 변수에 해당 지역의 인구 수 데이터를 우선 저장한다.
- s 변수에 home(위에서 저장한 특정 지역의 인구 구조 데이터)의 구조 평균을 대입한다.
- 만약 s가 mn보다 작고 지역명이 0번째 줄(지역 이름)과 같지 않다면(동일 지역이 아니라면)
- ms에는 s를 대입하고, result_name에는 지역 이름, result에는 away를 대입한다.
5. 그래프를 그리고 화면에 나타내기
plt.style.use('ggplot')
plt.figure(figsize = (10, 5), dpi=300)
plt.rc('font', family='Malgun Gothic')
plt.title(name + ' 지역과 가장 비슷한 인구 구조를 가진 지역')
plt.plot(home, 'r.:', label = name)
plt.plot(result, color = '#CC14AF', label = result_name)
plt.legend()
plt.show()
- plt.style.use()를 이용하여 꺾은선 그래프 형식임을 지정한다.
- plt.figure()를 이용하여 이미지의 크기와 해상도를 지정해준다.
- plt.title()을 이용하여 그래프의 제목을 '(지역 이름) 지역과 가장 비슷한 인구 구조를 가진 지역'으로 지정한다.
- plt.plot()을 이용하여 home 데이터대로 꺾은선 그래프를 작성한다. 색상은 붉은색, 점선 형태, 첨단마다 큰 원을 표시하며, 레이블은 name으로 준다.
- plt.plot()을 이용하여 result 데이터대로 꺾은선 그래프를 작성한다. 색상은 #CC14AF로 지정하고, 레이블은 result_name으로 준다.
- plt.legend()를 이용하여 레이블을 그래프에 붙여준다.
- plt.show()를 이용하여 꺾은선 그래프를 화면에 나타낸다.