본문 바로가기
Programming/Python

[ 모두의 데이터 분석 with python ] 2. 인구 데이터

by _S0_H2_ 2020. 5. 5.
728x90
반응형

0. 데이터 가져오기

다음의 책을 참조하였습니다.

참조한 책

인구 데이터를 다운로드 받기 위해서 www.mois.go.kr에에 접속합니다.

상단에서 정책자료 -> 통계 -> 주민등록 인구 통계를 클릭합니다.

왼쪽의 연령별 인구 현황을 클릭한 뒤, 다음과 같이 설정하였습니다.


1. 데이터 살펴보기

파일을 로드하였습니다.

import csv
f = open('/모두의 데이터 분석 with 파이썬/Unit3 인구 raw.csv', encoding='cp949')
data = csv.reader(f)

for row in data:
    print(row)

다음과 같이 데이터가 있음을 확인하였습니다.

신도림 동의 인구를 확인해보겠습니다 !

# data를 한 줄 씩 돌면서
for row in data :
    if '신도림' in row[0]: # 행정구역을 나타내는 row[0]에 '신도림'이라는 글자가 있으면
        for i in row[3:] : # row[3:] 부분을 전체 순회합니다
            result.append(int(i)) # 결과는 int로 변환하여 저장합니다

print(result)

( 결과 )

[326, 334, 406, 413, 389, 408, 417, 434, 411, 387, 420, 383, 354, 357, 340, 338, 349, 339, 407, 380, 390, 453, 424, 516, 451, 466, 448, 484, 471, 476, 558, 541, 579, 619, 638, 740, 756, 792, 745, 789, 671, 687, 700, 636, 726, 691, 657, 619, 649, 585, 579, 470, 522, 534, 563, 445, 511, 569, 572, 513, 532, 456, 426, 497, 379, 384, 399, 279, 289, 276, 268, 271, 223, 170, 150, 154, 177, 140, 126, 114, 121, 97, 86, 80, 59, 48, 44, 43, 28, 29, 22, 15, 13, 12, 5, 8, 5, 4, 2, 3, 7]

그림으로 나타내보겠습니다.

import matplotlib.pyplot as plt
plt.style.use('ggplot')
plt.plot(result)
plt.show()

신도림동 인구 추이


2. 위를 함수로 구현하여 간편하게 만들어보자.

import csv
import matplotlib.pyplot as plt
def population(name):

    for row in data :
        if name in row[0]:
            for i in row[3:] :
                result.append(int(i.replace(',','')))
                
    plt.style.use('ggplot')
    plt.plot(result)
    plt.show()

이제, population(찾고싶은 동)을 입력하면 됩니다.

+ ) 군자동은 다른 지역에도 있어서 광진구 군자동을 함께 입력하였습니다.

f = open('/content/drive/My Drive/도서 참고/모두의 데이터 분석 with 파이썬/Unit3 인구 raw.csv', encoding='cp949')
data = csv.reader(f)
result = []

population('광진구 군자동')

광진구 군자동 result

population('무거동')

무거동 result


3. 성별 데이터 가져오기

위의 방법과 마찬가지로 데이터를 가져오겠습니다. 이번에는 남/여 구분이 된 데이터를 가져와 살펴보겠습니다.


4. 데이터 살펴보기

데이터를 살펴본 뒤, 신도림동의 남자, 여자 인구 데이터를 확인하겠습니다.

import pandas as pd
data = pd.read_csv('/모두의 데이터 분석 with 파이썬/Unit3 인구성별 raw.csv', encoding='cp949')
data.columns

column은 행정구역 + 남_총인구수 + 남_연령구간 인구수 + 0 ~ 100 + 여_총인구수 + 여_연령구간 인구수 + 0 ~ 100 으로 구성되었습니다. 따라서 남자 인구를 구할 때는 column이 3 ~ 103, 여자 인구를 구할 때는 106 ~ 206을 사용해야함을 알게 되었습니다.

 

그렇다면! 이를 어떻게 알고리즘으로 구현해볼까요?

m = [] # 남자 result
f = [] # 여자 result

for row in data:
    if '신도림' in row[0]:
        for i in range(0,101):
            m.append(int(row[i+3])) # 남자는 앞에서부터 진행 : 3 ~ 103
            f.append(int(row[-(i+1)])) # 여자는 뒤에서부터 진행 : 106 ~ 206 을 역순으로
    # 역순으로 받았기 때문에 다시 뒤집어 m과 순서를 맞춰준다
f.reverse()
plt.barh(range(101), m)
plt.barh(range(101), f)
plt.show()

result

겹쳐져서 보기가 안좋으니 다른 방향으로 바꾸기 위해 코드를 수정해보겠습니다.

import csv
f = open('/모두의 데이터 분석 with 파이썬/Unit3 인구성별 raw.csv', encoding='cp949')
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()


5. 함수로 구현해보자.

def man_woman(name):
    for row in data:
        if name in row[0]:
            for i in range(0,101):
                m.append(-int(row[i+3])) # 음수로 변경
                f.append(int(row[-(i+1)])) 
    f.reverse()
    plt.barh(range(101), m)
    plt.barh(range(101), f)
    plt.show()

이제 함수로 찾아보겠습니다 !

f = open('/content/drive/My Drive/도서 참고/모두의 데이터 분석 with 파이썬/Unit3 인구성별 raw.csv', encoding='cp949')
data = csv.reader(f)
m = [] 
f = [] 

man_woman('광진구 군자동')

광진구 군자동 result

man_woman('무거동')

무거동 result


7. 지역의 성별 인구를 파이 차트로 그리기

import csv
f = open('/모두의 데이터 분석 with 파이썬/Unit3 인구성별 raw.csv', encoding='cp949')
data = csv.reader(f)

size = []
name = input('찾고 싶은 지역의 이름을 알려주세요 : ')
# 제주특별자치도 입력 !
for row in data:
    if name in row[0] : 
        m = 0
        f = 0
        for i in range(101) :
        # 1,843의 ,를 없애기 위해 replace 사용
            m += int(row[i+3].replace(',',''))
            f += int(row[i+106].replace(',',''))
        break

size.append(m)
size.append(f)

color = ['lightcoral','lightblue']
plt.axis('equal')
plt.pie(size, labels=['male', 'female'], autopct='%.1f%%', colors = color, startangle = 90)
plt.show()

pie chart result


8. 추세선, 산점도로 그려보기

name = input('궁금한 동네를 입력해주세요 : ')
m = []
f = []

for row in data :
    if name in row[0]:
        for i in range(3,104):
            m.append(int(row[i].replace(',','')))
            f.append(int(row[i+103].replace(',','')))
        break

# 추세선 그리기
plt.plot(m, label='Male')
plt.plot(f, label = 'Female')
plt.legend()
plt.show()

# 산점도 그리기
# c : 몇 개 그릴건지
# cmap : 무지개 컬러
# alpha : 투명도 조절 (1이 불투명)
plt.scatter(f,m,c=range(100), cmap='jet', alpha=0.5)
plt.colorbar()
plt.plot(range(max(m)), range(max(m)) , 'g')
plt.xlabel('male')
plt.ylabel('female')
plt.show()

제주특별자치도를 입력해보았습니다.

추세선
산점도

무거동은 또 다르게 생겼네요 !

무거동 result

군자동도 다른 느낌 ~ 이었습니다.

군자동 result

 

728x90
반응형