본문 바로가기

DATA STUDY/모두의 데이터분석 with 파이썬

셋째 마당 - 인구 구조 다양한 형태로 시각화하기 UNIT 08-01

책에서 안내해주는 것을 따라 남녀 구분이 된 데이터를 다운받습니다.

 

인덱싱 부분은 책에 자세히 설명되어 있으니 책 내용을 잘 따라가면 될 것 같습니다.

 

imort csv
f = opne('gender.csv')
data = csv.reader(f)
m = []
f = []
for row in data:
    if '신도림' in row[0]:
        for i in row[3:104]:
            m.append(int(i))
        for i in row[106:]:
            f.append(int(i))

 

 

이렇게 보는 것이 이해하기 더 쉬워보여 먼저 이 코드부터 보겠습니다.

 

책에서 나와있듯 3번 인덱스부터 103번까지가 0세부터 100세까지의 남성 데이터, 다시 106부터 끝까지가 여성 데이터입니다.

 

같은 내용을 다르게 표현해볼까요?

 

 

imort csv
f = opne('gender.csv')
data = csv.reader(f)
m = []
f = []
for row in data:
    if '신도림' in row[0]:
        for i in range(0, 101):
            m.append(int(row[i+3]))
            f.append(int(row[-(i+1)]))
f.reverse()

 

 

int()는 정수화시키는 부분이니 제외하고 row[i+3]과 row[-(i+1)]))만 이해해보겠습니다.

우선 책 내용을 보면 3번째(0부터 시작하면) 데이터부터 103번째까지가 남성 데이터이고 같은 방식으로 뒤에서부터 세면 여성 데이터가 나옵니다.

 

range(0, 101), 0부터 100까지 반복하기 때문에 m.append의 경우 3부터 103까지 f.append는 -1부터 -101까지

 

인덱싱이 다르게 표현됐지만 결국에는 위와 같은 의미입니다. 

 

마지막에 f 리스트를 reverse() 함수를 사용해 역순으로 만들어주면 남성과 여성 데이터가 동일하게 0세부터 100세까지로 정렬이 됩니다.

 

처음에 f가 2개가 있어 마지막 f.reverse()가 어떤 것을 의미하는지 헷갈렸는데 코드를 돌려보니 f 리스트를 역순으로 바꾼다가 맞는 해석 같습니다.

 

import matplotlib.pyplot as plt
plt.barh(range(101), m)
plt.barh(range(101), f)
plt.show()

 

barh() 함수를 이용해 수평 막대그래프를 그리겠습니다.

 

range를 101로 설정했기 때문에 y값이 100까지 나오겠네요. 

 

결과값을 보면 두 그래프가 양수 방향에 겹쳐져 그려집니다. 두 데이터 중 한 가지를 음수처리하면 양쪽으로 그래프를 그릴 수 있겠죠?

 

처리 방법은 append() 함수 사용 부분에서 int를 음수화 시켜주면 됩니다. ex) m.append(-int(i))

 

+

혹시 출력값의 마이너스 부분이 깨진다면 plt.rcParams['axes.unicode_minus'] = False를 추가해주시면 됩니다.