본문 바로가기

데이터 분석 학습

[모두의 데이터분석 With 파이썬] Unit.07 리뷰 / 데이터에 맞는 시각화

2022.03.23 - [데이터 분석 학습] - [모두의 데이터분석 With 파이썬] Unit.01 리뷰 / CSV, 아나콘다, 크롬

2022.03.23 - [데이터 분석 학습] - [모두의 데이터분석 With 파이썬] Unit.02 리뷰 / 주피터, 코랩

2022.03.23 - [데이터 분석 학습] - [모두의 데이터분석 With 파이썬] Unit.03 리뷰 / 데이터 전처리

2022.03.23 - [데이터 분석 학습] - [모두의 데이터분석 With 파이썬] Unit.04 리뷰 / 기본 그래프 그리기

 

 

Unit.07 우리동네 인구 구조 시각화하기

 

이번 장부터는 인구 공공데이터를 통한 데이터 분석을 시작한다.

일단 인구통계표를 다운 받아야하는데, 행정안전부(www.mois.go.kr)에 접속한 후

정책자료 → 통계 → 주민등록 인구통계 → 연령별 인구현황 메뉴 → 통계표 탭으로 선택한다.

인구 통계 데이터

여기서 조회기간을 2019년 2월 ~ 2019년 2월, 남여 구분 체크 해제, 연령구분 1세, 만 연령구분 0 ~ 100이상으로 설정한다.

마지막으로 전체읍면동현황을 체크하고 csv파일을 다운받는다.

여기서 age.csv로 파일 이름을 수정해서 파일을 열어본다.

 

읍면동을 기준으로 연령별 인구가 정렬되어 있는것을 볼 수 있다.

0세부터 100세까지 총 101개 구간의 데이터가 제공된다.

 

이제 본격적으로 인구 데이터를 뜯어볼 준비가 되었다.

만약 우리 동네의 인구 데이터를 시각화하기 위해서는 어떤 단계를 거쳐서 생각해야 할까?

  1. 인구 데이터 파일을 읽어온다.
  2. 전체 데이터에서 한 줄씩 반복해서 읽어온다.
  3. 우리 동네에 대한 데이터인지 확인한다.
  4. 우리 동네일 경우 0세부터 100세 이상까지의 인구수를 순서대로 저장한다.
  5. 저장된 연령별 인구수 데이터를 시각화한다.

이런 과정이 알고리즘을 설계하는 것이다. 이 알고리즘을 우리는 코드로 표현해야한다. 일단 인구 데이터 파일(age.csv)을 읽어와서 한 줄씩 출력해보자

 

import csv
f = open('/content/age.csv', encoding='cp949')
data = csv.reader(f)

for row in data:
  print(row)

결과값: 

이제 우리 동네 데이터만 선택해서 출력한다. 책에서는 신도림(아마 출판사 위치겠지)을 선택했지만 학습자의 동네를 선택해도 큰 무리는 없다.

확인해보면 0번째 열(처음 열)인 row[0]에 지역명이 저장되어 있으므로, 이를 이용해 동네의 인구 데이터를 출력한다.

 

for row in data:
  if '제주특별자치도 제주시 연동(5011065000)' == row[0]:
    print(row)

결과값: ['제주특별자치도 제주시 연동(5011065000)', '41,362', '41,362', '256', '283', '293', '320', '329', '334', '396', '414', '427', '338', '417', '437', '4.....

 

 

그런데 여기서 의문점. 꼭 저 행의 정확한 데이터 값을 넣어주어야할까? 이거 너무 귀찮다. 코딩은 귀찮은 일을 효율적으로 만드는데 목적이 있다. 파이썬의 in 연산자를 사용하면 조금 더 효율적으로 코드를 작성할 수 있다.

 

예를 들어, 'A in B'는 A가 B 안에 존재하면 참, 그렇지 않으면 거짓이 된다. 

 

즉, in 연산자는 data의 row[0] 값 중 똑같은 값이 있는지를 찾아서 그 결과를 True 또는 False로 반환한다. 한글자라도 다르면 해당 값이 없다고 판단한다.

 
print('연동' in '제주특별자치도 제주시 연동(5011065000)')
print('5011' in '제주특별자치도 제주시 연동(5011065000)')
print('()' in '제주특별자치도 제주시 연동(5011065000)')

 

결과값: True True False

 

출력 결과를 확인해보면 데이터 값에 일치하는 데이터가 있으면 True로 반환한다. 아 기능을 활용하면 짧은 단어를 이용해 동네를 찾을 수 있다.

 

그.러.나

 

for row in data:
  if '연동' in row[0]:
    print(row)

결과값: ['서울특별시 서대문구 천연동(1141052000)'] ['세종특별자치시 연동면(3611032000)'], ['강원도 태백시 황연동(4219052500)',] ......

 

 

만약 동네 이름이 '연동'처럼 너무 흔하다면 이렇게 중복되거나 '연동'이 포함된 이름을 가진 동네들이 모두 반환된다. 그러니까 정확하게 입력하고 싶다면 시 정보까지는 적어주자

for row in data:
  if '제주시 연동' in row[0]:
    print(row)

결과값: ['제주특별자치도 제주시 연동(5011065000)', '41,362', '41,362', '256', ...]

 

데이터를 잘 불러왔으니, 0~100세 이상까지의 인구수를 순서대로 저장한다.

엑셀로 데이터를 확인했을 때 1번째 열(row[0])은 지역명, 2번째 열(row[1])은 총 인구수, 3번째 열(row[2])은 0~100세까지의 총 인구수가 저장되어 있었다.

그럼 3번 인덱스부터 끝까지 데이터를 불러오면 연령별 인구 데이터를 출력할 수 있다.

 

for row in data:
  if '제주시 연동' in row[0]:
    for i in row[3:]:
      print(i)
print(len(row[3:])) # 마지막 출력을 총 데이터 수를 확인하는 것으로 지정한다.

결과값:

256 283 293 320 329 334 .... 101

 

마지막 101이라는 결과값이 나오는 것을 보니 0세~100세 인구 데이터가 제대로 출력되는 것을 볼 수 있다.

데이터를 불러오면? 저장한다!

순서대로 저장하는 것은 리스트 형태가 좋다. result라는 리스트를 담는 빈 클래스를 만들어 값을 추가한 후 출력하자

 

result = [] # 빈 리스트 만들기

for row in data:
  if '제주시 연동' in row[0]:
    for i in row[3:]:
      result.append(i) # 해당 연령의 인구수 리스트에 순서대로 저장

print(result)

결과값: ['256', '283', '293', '320', '329', '334', '396' ...]

 

한 줄(리스트 형태)로 잘 저장되어 있다.

그런데 작은따옴표가 있는걸 보니, 문자열 형태로 저장되어 있다는 것을 확인할 수 있다.

코드 한 줄을 바꿔 정수형태로 다시 저장하자

 

result = [] # 빈 리스트 만들기

for row in data:
  if '제주시 연동' in row[0]:
    for i in row[3:]:
      result.append(int(i)) # 해당 연령의 인구수 리스트에 순서대로 저장

print(result)

정수형태로 바꿔주는 int() 함수를 써서 변수(i)를 저장했다. 작은따옴표가 안보이는걸 보니 잘 저장되었다.

이제 시작화하자! matplotlib을 불러 그래프를 선택하고, show()함수로 보여주는 과정을 다시 반복한다.

 

import matplotlib.pyplot as plt
plt.style.use('ggplot') # 격자무늬 형태로 스타일을 지정한다.
plt.plot(result) # 플롯차트 안에 result의 데이터를 담는다
plt.show()

 

만약 원하는 지역의 이름을 입력하면 그 지역의 인구구조가 출력되게 하고, 어떤 지역의 인구 구조인지 알아 볼 수 있도록 제목을 자동으로 넣을 수 있을까? 이를 알고리즘 형태로 생각해보자.

  1. 사용자에게 이름을 받을 수 있도록 폼(form)을 만들어 이름을 입력 받는다
  2. 입력받은 데이터를 찾는다
  3. 그래프에 제목을 추가한다
  4. 인구 그래프를 그린다
result = [] # 빈 리스트 만들기
name = input('인구 구조가 알고 싶은 지역의 이름을 입력해주세요: ') # 1. 사용자에게 이름을 받을 폼(form)을 만든다 / input() 함수를 이용해 입력을 받는다.

# 2.입력받은 데이터를 찾는다 
for row in data: # data클래스의 csv데이터 행을 하나씩 실행한다
  if name in row[0]: # 만약 name에서 받은 입력값이 csv파일의 row[0]행의 값에 있다면
    for i in row[3:]: # row[3:]행(4번째 행 이후)의 데이터를 하나씩 실행한다
      result.append(int(i)) # 해당 연령의 인구수 리스트에 순서대로 저장(정수형으로)

import matplotlib.pyplot as plt
plt.style.use('ggplot') # 격자무늬 형태로 스타일을 지정한다.
plt.title(name+'Local Population Composition') # 3. 제목을 지정한다. name 데이터의 값 + '문자열' 형태
plt.plot(result) # 4. 인구그래프를 그린다. 플롯차트 안에 result의 데이터를 담는다
plt.show()

 

결과값: 인구 구조가 알고 싶은 지역의 이름을 입력해주세요: 제주시 연동

 

연동은 20~50대 인구가 많은 젊은 동네라는 것을 알 수 있다. 꺽은선 그래프로는 이런 정보를 알 수 있었는데, 다른 그래프는 어떨까? 예를 들어, 연령대가 같은 사람들의 정보로 그래프를 그린다면, 지역에 따른 비교를 해볼 수 있고, 성별을 기준으로 그린다면 지역별 성비를 확인할 수 있다.