반응형
1. 인구 구조를시각화하기
import csv
import matplotlib.pyplot as plt
f = open('age.csv')
data = csv.reader(f)
result = []
name = input('인구 구조가 알고 싶은 지역의 이름(읍면동 단위)을 입력해주세요 : ')
for row in data:
if name in row[0]:
for i in row[3:]:
result.append(int(i.replace(',', ''))) # int로 형변환하기 위해 ,를 없앤다.
plt.style.use('ggplot')
plt.rc('font', family='Malgun Gothic')
plt.title(name + ' 지역의 인구구조')
plt.plot(result)
plt.show()
2. 막대그래프
연령대가 같은 사람들의 정보로 그래프를 그린다면 지역에 따른 비교를 할 수 있다. 성별을 기준으로 그래프를 그린다면 지역별 성비도 확인할 수 있다.
1) bar() 함수
bar()함수는 막대그래프를 표현하는 명령어이다. 막대의 길이는 각 데이터의 크기를 의미한다.
plt.bar([0, 1, 2, 4, 6, 10], [1, 2, 3, 5, 6, 7])
plt.show()
다음과 같이 막대그래프를 그린다.
bar(막대를 표시할 위치, 막대의 높이)
위의 그래프에서 0에 위치하는 막대의 높이는 1, 10에 해당하는 막대의 높이는 7인 그래프가 그려진다.
2) range()
range()함수를 사용하여 막대그래프의 위치를 표현할 수 있다.
plt.bar(range(6), [1, 2, 3, 5, 6, 7])
plt.show()
이제 인구구조를 막대 그래프로 표현해보자.
f = open('age.csv')
data = csv.reader(f)
result = []
for row in data:
if '장전제1동' in row[0]:
for i in row[3:]:
result.append(int(i))
plt.bar(range(101), result) # 0세~100세이상까지이므로 ragne(101)로 설정
plt.show()
f.close()
3) barh()함수
막대 그래프를 수평방향으로 그릴 수도 있다.
plt.barh(range(101), result)
3. 항아리 모양 그래프
1) 남녀인구분포 다운받기
정책자료 -> 통계 -> 주민등록 인구통계
- 연령별 인구현황
- 통계표
- 남/여 구분
- 연령 구분 단위 1세
- 0세 ~ 100세이상
- 검색
- 전체읍면동현황
- csv파일 다운로드
gender.csv 파일로 저장한다.
해당 csv파일은 남성 나이별 인구수가 나오고 그 다음 여성 나이별 인구수가 나온다.
- 남성 데이터는 인덱스3(0세)부터 인덱스103(100세이상)
- 여성 데이터는 인덱스106(0세)부터 마지막(100세이상)까지 나와있다.
- 따라서 여성데이터는 마지막인덱스부터 106인덱스까지 거꾸로 저장하고나서 뒤집을 것이다.
f = open('gender.csv')
data = csv.reader(f)
m = []
f = []
for row in data:
if '장전제1동' in row[0]:
for i in range(0, 101):
m.append(int(row[i+3]))
f.append(int(row[-(i+1)])) # 100세이상부터 0세까지 거꾸로 저장
f.reverse() # 거꾸로 저장된 데이터를 뒤집는다.
다른 방법은 여성데이터를 다른 for loop를 이용하여 인덱스106(0세)부터 차례로 저장하는 것이다.
f = open('gender.csv')
data = csv.reader(f)
m = []
f = []
for row in data:
if '장전제1동' in row[0]:
for i in row[3:104]:
m.append(int(i))
for i in row[106:]:
f.append(int(i))
이제 저장된 데이터를 barh()함수를 이용해서 시각화해보자.
plt.barh(range(101), m)
plt.barh(range(101), f)
plt.show()
남성 그래프와 여성 그래프가 겹쳐서 알아보기 어렵다. 이것을 남성 데이터를 음수로 바꿔서 그래프를 그려서 문제를 해결해보자.
다음 코드를 사용한다.
m.append(-int(i)) # 마이너스 부호를 넣어서 음수로 변경
import csv
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file)
m = []
f = []
for row in data:
if '장전제1동' in row[0]:
for i in range(0, 101):
m.append(-int(row[i+3])) # 마이너스 부호를 넣어서 음수로 변경
f.append(int(row[-(i+1)])) # 여성 데이터를 리스트 f에 저장
f.reverse()
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False # 마이너스 기호 깨짐 방지
plt.title('장전제1동 지역의 남녀 성별 인구 분포')
plt.barh(range(101), m, label='남성')
plt.barh(range(101), f, label='여성')
plt.legend()
plt.show()
file.close()
4. 정리
import csv
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file)
m = []
f = []
name = input('찾고 싶은 지역 입력 => ')
for row in data:
if name in row[0]:
for i in row[3:104]:
m.append(-int(i.replace(',', '')))
for i in row[106:]:
f.append(int(i.replace(',', '')))
plt.style.use('ggplot')
plt.figure(figsize=(10, 5), dpi=300)
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False
plt.title(name + ' 지역의 남녀 성별 인구 분포')
plt.barh(range(101), m, label='남성')
plt.barh(range(101), f, label='여성')
plt.legend()
plt.show()
file.close()
반응형
'PNU DSC > 파이썬 데이터 분석' 카테고리의 다른 글
03-4. 인구 공공데이터 - 산점도 (0) | 2020.05.23 |
---|---|
03-3. 인구 공공 데이터 - 파이차트 (0) | 2020.05.23 |
03-1. 인구 공공데이터 1 (0) | 2020.05.11 |
02-3. 데이터 시각화 기초 3 (1) | 2020.05.06 |
02-2. 데이터 시각화 기초 2 (0) | 2020.05.05 |