2022.08.23

자율 주제 발표

교수님께서 자율 팀 주제 발표를..내주셨다.
omg,, 교수님 제에발 팀플은
이라고 하기엔 너무 재밌었다.
이번 주제가 인구구조 데이터를 활용하여 시각화하는 것이었는데,
기초과정을 배우다가 문득 이런 생각이 들었다.
"대한민국이 점점 고령사회로 접어들어가는데 그러면 노령층과 유아층의 차이는 얼마나 될까?" 그리고 "노령층이 많은 지역은 어디고, 유아층이 많은 지역은 어디일까?"
해답을 얻기 위해서 손가락을 열심히 움직여보았다.

import csv

f = open('/content/population.csv')
g = open('/content/baby(2022).csv')
i = open('/content/work7.csv')

data_all = csv.reader(f)
data_baby = csv.reader(g)
data_old = csv.reader(i)

result_all = [] # 결과값 정의
result_pop = []
result_baby =[]
resultold = []

city_a = input("조회하고 싶은 동네명(동)을 입력하세요. ")
city_b = input("비교하고 싶은 동네명(동)을 입력하세요. ")

# 데이터 읽기

for row in data_old: # 신중동의 모든 나이대 데이터를 가져온다.
    if city_a in row[0]:
      for i in row[3:]:
          result_all.append(-int(i.replace(',',''))) # <- 쉼표를 공백으로 바꿔 준다 .

    if city_a in row[0]: 
      for i in row[3:-31]: # 신중동의 노년(70 ~ 99세)의 나이대 데이터를 가져온다.
          resultold.append(-int(i.replace(',','')))

for row in data_all : # 물금읍의 모든 나이대 데이터를 가져온다.
    if city_b.split('(')[0] in row[0] :
        for f in row[3:104] :
            result_pop.append(int(f.replace(',','')))

for row in data_baby : # 물금읍의 유아기 나이대 데이터를 가져온다.
    if city_b.split('(')[0] in row[0] :
        for g in row[3:] : # 0 ~ 만 5세 까지만 지정한다.
            result_baby.append(int(g.replace(',','')))

# 시각화

import matplotlib.pyplot as plt
plt.figure(dpi = 200)
plt.style.use('ggplot')
plt.barh(range(len(result_pop)),result_pop, color = 'r')
plt.barh(range(len(result_baby)),result_baby, color = 'y', label = '0 ~ 6세 유아')
plt.barh(range(len(result_all)), result_all, color = 'b', label = '70 ~ 99세 노년')
plt.barh(range(len(resultold)), resultold, color = 'r')
plt.title(city_a + ',' + city_b + '의 인구 그래프')
plt.legend()

plt.show()

결과는

이렇게 왼쪽은 노령층을 나타내고 오른쪽은 유아층을 나타내주면서 한눈에 차이를 극명하게 볼 수 있도록 설계했다.

인구구조를 다양한 형태로 시각화하기

항아리 형태로 인구구조를 시각화 했다면 이번에는 파이형으로 구현해보면 어떨까?

step 1. 성별 데이터를 저장한다.

# 인구 구조를 다양한 형태로 시각화하기

import csv

f = open('/content/201902_201902_gender.csv')
data = csv.reader(f)

m_list = []
f_list = []

address = input("검색할 동을 입력하세요.")

for row in data:
    if address in row[0]:
        for i in range(0,101): # 같은 범위내에서 한번에 데이터를 담기 위한 방법
            m_list.append(int(row[i+3].replace(',',''))) # 남성의 데이터 3 ~ 103 index 까지 (0 ~ 100세)
            f_list.append(int(row[-(i+1)].replace(',',''))) # 여성의 데이터 -1 ~ -101 index 까지 (100 ~ 0세)

print(f_list)

# 거꾸로 수집한 여성의 연령 데이터를 뒤집기
f_list.reverse()
print(f_list)

성별 데이터를 행안부에서 추출해서 불러온다.

step 2. 데이터를 시각화해본다.

import matplotlib.pyplot as plt

plt.figure(dpi=200)

plt.rcParams['axes.unicode_minus'] = False

plt.title(address + '지역의 남녀 성별 인구 분포')
plt.barh(range(101), m_list, label = '남성')
plt.barh(range(101), f_list, label = '여성')

plt.legend()
plt.show()

내가 검색하고 싶은 동네를 입력해서 나온 결과를 보면 '둔산2동'의 남녀 성별 비율을 barh형태로 볼 수 있다.

step3. 남성의 데이터를 음수로 만든다.

# 인구 구조를 다양한 형태로 시각화하기

import csv

f = open('/content/201902_201902_gender.csv')
data = csv.reader(f)

m_list = []
f_list = []

address = input("검색할 동을 입력하세요.")

for row in data:
    if address in row[0]:
        for i in row[3:104]:
            m_list.append(-int(i.replace(',','')))

        for i in row[106:]:
            f_list.append(int(i.replace(',','')))

print(f_list)
print(m_list)


이처럼 둔산2동의 여성 데이터와 남성 데이터를 불러온다.

step4. 항아리 형태로 시각화하기.

# 인구 구조를 다양한 형태로 시각화하기

import csv

f = open('/content/202202_202202_gender.csv')
data = csv.reader(f)

m_list = []
f_list = []

address = input("검색할 동을 입력하세요.")

for row in data:
    if address in row[0]:
        for i in row[3:104]:
            m_list.append(-int(i.replace(',','')))

        for i in row[106:]:
            f_list.append(int(i.replace(',','')))
        break

print(f_list)
print(m_list)

import matplotlib.pyplot as plt

plt.figure(dpi=200)

plt.rcParams['axes.unicode_minus'] = False

plt.title(address + '지역의 남녀 성별 인구 분포')
plt.barh(range(101), m_list, label = '남성')
plt.barh(range(101), f_list, label = '여성')

plt.legend()
plt.show()

m_list.append(-int(i.replace(',','')))를 보면 int앞에 -(minus)를 부여해서 그래프를 좌우변환시켜준다.
그렇다면 그래프는

이렇게 나오게 된다.

step5. 파이형 그래프로 시각화하기

# 파이차트 시각화
plt.figure(dpi=200)
color = ['crimson', 'darkcyan']
label = ['남', ' 여']
plt.pie(size, labels = label, autopct ='%.1f%%', colors = color, startangle = 90)
plt. title(address + '지역의 남녀 성별 비율')
plt.legend()
plt.show()

plt.pie를 이용하여 파이형 그래프를 그릴 수 있다.

그렇다면 파이형 그래프를 다양하게 꾸며보면 어떨까?

여러개의 데이터로 시각화하기 위해서 혈액형을 채택했다.

import matplotlib.pyplot as plt

# plt.figure(dpi = 100)

size = [1244, 2312, 1031, 1233]
label = ['A형', 'B형', 'AB형', 'O형']
plt.axis('equal')
plt.pie(size, labels = label, autopct = '%.1f%%')
plt.legend()
plt.show()


그럼 이런 형태로 파이형 그래프가 만들어지게 된다.

-끝!-

profile
Do (Awe)Something!

1개의 댓글

comment-user-thumbnail
2022년 8월 25일

질문하기를 아주 아주 잘 했어요! 그래서 유아층과 노년층을 잘 시각화 한 결과를 볼 수 있었습니다 굿굿
생각보다 팀플은 재밌답니다 후훗

답글 달기