Study/Python

[Python/Matplotlib] 특정 지역과 비슷한 연령별 인구 구조를 가진 지역 추출 및 꺾은선 그래프로 시각화하기

ChoiSenn 2022. 2. 3. 14:16

 

 

 

특정 지역과 비슷한 연령별 인구 구조를 가진 지역 추출 및 꺾은선 그래프 그리기

 

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()를 이용하여 꺾은선 그래프를 화면에 나타낸다.

 

 

 

 

 

출력된 그래프