오도원입니다.

건강과 행복을 위하여

PNU DSC/파이썬 데이터 분석

03-4. 인구 공공데이터 - 산점도

오도원공육사 2020. 5. 23. 01:05
반응형

지금까지의 그래프는 다음과 같다.

위의 그래프는 연령대별 성별 비율을 알아보기 힘들다.

 

1. 꺾은선 그래프로 표현하기

남성 데이터와 여성 데이터를 서로 다른 색의 꺾은선 그래프로 표현해보자.

file = open('gender.csv')
data = csv.reader(file)
m = []
f = []

name = input('지역 입력 => ')
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()
file.close()

위와 같이 표현하니 남녀 인구의 차이가 더 보기 쉽다. 

 

이번에는 연령별로 남성 인구수를 뺀 차이를 막대그래프로 표현해보자.

file = open('gender.csv')
data = csv.reader(file)
result = []
name = input('지역 입력 => ')

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

plt.title(name + ' 지역의 남녀 인구 차이 (+:남>여, -:남<여)')
plt.rcParams['axes.unicode_minus'] = False
plt.bar(range(101), result)
plt.show()
file.close()

이처럼 같은 데이터라도 다양한 형태로 시각화하면 데이터에 숨겨진 다양한 사실을 발견할 수 있다.

 

2. 산점도로 표현하기

산점도는 가로축과 세로축을 기준으로 두 요소가 서로 어떤 관계를 맺고 있는지를 파악하기 쉽게 나타낸 그래프이다. 예를 들어, 가로축을 남성 인구, 세로축을 여성 인구수라고 설정하면 두 요소를 기준으로 그린 산점도는 남성 인구수와 여성 인구수 사이에 어떤 관계가 있는지 파악하기 쉽다.

 

1) scatter()

산점도는 scatter()함수를 사용한다. '흩뿌리다, 사방으로 흩어지다'라는 등의 의미로 산점도는 말 그대로 여기저기 점이 흩어진 모양의 그래프이다.

 

산점도는 x축과 y축에 해당하는 데이터의 상관관계를 표현할 때 사용하며 점이 흩어져있는 그래프이다. 두개의 축을 기준으로 데이터가 얼마나 퍼져있는지(분포) 알 수 있어 '산포도'라고도 불린다.

plt.style.use('ggplot')
plt.scatter([1, 2, 3, 4], [10, 30, 20, 40])
plt.show()

2) 버블 차트로 표현

scatter()함수는 s속성을 추가하여 점의 크기를 조절하여 버블 차트로 그릴 수 있다.

plt.scatter([1, 2, 3, 4], [10, 30, 20, 40], s=[100, 400, 250, 300])
plt.show()

3) c속성으로 색상 지정

plt.scatter([1, 2, 3, 4],[10, 30, 20, 40], s=[30, 60, 90, 120], c=['red', 'blue', 'green', 'gold'])
plt.show()

4) colorbar()

plt.scatter([1, 2, 3, 4],[10, 30, 20, 40], s=[30, 60, 90, 120], c=range(4))
plt.colorbar()
plt.show()

5) cmap속성

cmap속성은 컬러맵 속성으로 컬러바에 사용될 색상의 종류를 정할 수 있다. 'jet'는 무지개 색이다.

plt.scatter([1, 2, 3, 4], [10, 30, 20, 40], s=[30, 60, 90, 120], c=range(4), cmap='jet')
plt.colorbar()
plt.show()

산점도 뜻 눈으로 확인하기

random모듈을 이용해서 위치와 크기가 서로다른 100개의 점을 만들어보자.

x = []
y = []
size = []
for i in range(100):
    x.append(random.randint(50, 100))
    y.append(random.randint(50, 100))
    size.append(random.randint(10, 100))
plt.scatter(x, y, s=size, c=size, cmap='jet', alpha=0.7) # alpha 속성으로 투명도 조절, (0~1 : 투명 ~ 불투명)
plt.colorbar()
plt.show()

 

3. 연령대별 성별 비율을 산점도로 표현하기

먼저 성별 인구 데이터를 읽어서 가져온다.

file = open('gender.csv')
data = csv.reader(file)
m = []
f = []
name = input('지역 입력 => ')

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.scatter(m, f)
plt.show()

여기에 연령에 따른 컬러맵을 적용한다. 또한 남성 인구수 중 가장 큰 값을 기준으로 y = x 형태의 추세선을 그려서 어떤 성별의 인구가 더 많은지 쉽게 비교할 수 있도록 한다.

plt.scatter(m, f, c=range(101), alpha=0.5, cmap='jet') # 컬러맵 적용
plt.colorbar()
plt.plot(range(max(m)), range(max(m)), 'g') # 추세선 추가
plt.show()

정리

import csv
import math
import matplotlib.pyplot as plt
file = open('gender.csv')
data = csv.reader(file)

m = []
f = []
size = []
name = input('지역 입력 => ')

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(',', '')))
            size.append(math.sqrt(int(row[i].replace(',','')) + int(row[i+103].replace(',',''))))
        break

plt.style.use('ggplot')
plt.rc('font', family='Malgun Gothic')
plt.figure(figsize=(10, 5), dpi=300)
plt.title(name + ' 지역의 성별 인구 그래프')
plt.scatter(m, f, s=size, c=range(101), alpha=0.5, cmap='jet')
plt.colorbar()
plt.plot(range(max(m)), range(max(m)), 'g')
plt.xlabel('남성 인구수')
plt.ylabel('여성 인구수')
plt.show()

반응형