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개 구간의 데이터가 제공된다.
이제 본격적으로 인구 데이터를 뜯어볼 준비가 되었다.
만약 우리 동네의 인구 데이터를 시각화하기 위해서는 어떤 단계를 거쳐서 생각해야 할까?
- 인구 데이터 파일을 읽어온다.
- 전체 데이터에서 한 줄씩 반복해서 읽어온다.
- 우리 동네에 대한 데이터인지 확인한다.
- 우리 동네일 경우 0세부터 100세 이상까지의 인구수를 순서대로 저장한다.
- 저장된 연령별 인구수 데이터를 시각화한다.
이런 과정이 알고리즘을 설계하는 것이다. 이 알고리즘을 우리는 코드로 표현해야한다. 일단 인구 데이터 파일(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()
만약 원하는 지역의 이름을 입력하면 그 지역의 인구구조가 출력되게 하고, 어떤 지역의 인구 구조인지 알아 볼 수 있도록 제목을 자동으로 넣을 수 있을까? 이를 알고리즘 형태로 생각해보자.
- 사용자에게 이름을 받을 수 있도록 폼(form)을 만들어 이름을 입력 받는다
- 입력받은 데이터를 찾는다
- 그래프에 제목을 추가한다
- 인구 그래프를 그린다
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대 인구가 많은 젊은 동네라는 것을 알 수 있다. 꺽은선 그래프로는 이런 정보를 알 수 있었는데, 다른 그래프는 어떨까? 예를 들어, 연령대가 같은 사람들의 정보로 그래프를 그린다면, 지역에 따른 비교를 해볼 수 있고, 성별을 기준으로 그린다면 지역별 성비를 확인할 수 있다.
'데이터 분석 학습' 카테고리의 다른 글
[혼자공부하는머신러닝+딥러닝] Ch.01 나의 첫 머신러닝 리뷰 / K-최근접 이웃 모델 (0) | 2022.04.05 |
---|---|
[모두의 데이터분석 With 파이썬] Unit.08 리뷰 / 항아리모양 그래프 그리기 (0) | 2022.03.25 |
[모두의 데이터분석 With 파이썬] Unit.06 리뷰 / 다양한 그래프 시각화 (0) | 2022.03.24 |
[모두의 데이터분석 With 파이썬] Unit.05 리뷰 / 데이터에 맞는 시각화 (0) | 2022.03.24 |
[모두의 데이터분석 With 파이썬] Unit.04 리뷰 / 기본 그래프 그리기 (0) | 2022.03.23 |