[데이터 분석] 다양한 차트 그래프 | dasfef

2023.04.24

개인 기록용입니다 :) 더욱 자세하고 구체적인 정보는 원문 정보를 참고해주세요


다양한 그래프와 차트 DATA : mois.go.kr 인구통계
1) barplot 활용한 항아리 그래프

import matplotlib.pyplot as plt

plt.rc('font', family = 'Malgun Gothic')        # 원하는 폰트로 지정 가능, 한글 사용시 필요
plt.rcParams[axes.unicode_minus]) = False       # 플롯에 -값이 깨질 때 활용
plt.style.use('ggplot')                         # 격자 그래프 그리기 용도
import csv
import matplotlib.pyplot as plt

f = open('gender.csv', encoding='cp949')
data = csv.reader(f)
m = []
f = []
name = input('알고 싶은 동네 >> ')

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

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()


2) piechart

import matplotlib.pyplot as plt

plt.pie([10, 20])
plt.show()
# value, label 배열화 / autopct 활용
import matplotlib.pyplot as plt

plt.rc('font', family = 'Malgun Gothic')    # font 설정
size = [2441, 2312, 1031, 1233]             # value 설정
label = ['A형', 'B형', 'AB형', 'O형']

plt.axis('equal')                           # 타원형이 아닌 원 그리기
plt.pie(size, labels = label, autopct = '%.1f%%')    # autopct 뒤에는 포맷문자열이 와야함
plt.show()

piechart 의 시작 지점은 12시 방향이 아닌 우측 90도 방향부터 반시계 방향으로 값의 차례대로 만들어진다
piechart explode 활용

# explode / color 활용
import matplotlib.pyplot as plt

plt.rc('font', family = 'Malgun Gothic')
size = [2441, 2312, 1031, 1233]
label = ['A형', 'B형', 'AB형', 'O형']
color = ['black', 'gray', 'hotpink', 'orange']

plt.axis('equal')
# explode 도 마찬가지로 반시계 방향으로 배열 지정됨
plt.pie(size, labels = label, autopct = '%.1f%%', explode = (0, 0, 0.2, 0.2), colors = color)
plt.legend()
plt.show()

explode 를 활용하여 떨어져 보이는 효과를 나타낼 수 있다
3) piechart - startangle
우측 90도부터 시작지점인 piechart에 startangle 속성으로 시작 지점을 변경할 수 있다

import csv
import matplotlib.pyplot as plt

f = open('gender.csv', encoding='cp949')
data = csv.reader(f)
name = input('원하는 도시 입력 >> ')
m = 0
f = 0
size = []
for row in data :
    if name in row[0]:
        for i in range(101):
            m += int(row[i+3].replace(',', ''))
            f += int(row[i + 106].replace(',', ''))
            break

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

plt.pie(size, autopct = '%.1f%%', colors = ['crimson', 'darkcyan'], labels=['남', '여'], startangle = 90)
plt.axis('equal')
plt.rc('font', family = 'Malgun Gothic')
plt.title(name + '의 남녀 성비')
plt.legend()
plt.show()

startangle = 90 인 즉, 우측 90도를 시작지점 기준으로 90 만큼 더 이동하는 것인데 반시계 방향으로 값의 차례대로 들어오기 때문에 시작지점은 좌측으로 90만큼 틀어진다
따라서 우측 90도에서 좌측 90도로 기울어진 12시 방향에 시작지점이 지정된다
4) barplot 양,음수로 차이 나타내기

import csv
import matplotlib.pyplot as plt

f = open('gender.csv', encoding = 'cp949')
data = csv.reader(f)
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.rcParams['axes.unicode_minus'] = False
plt.bar(range(101), result)
plt.show()

최종으로 데이터를 부르고 앞에서 뒤의 값을 빼주면 앞의 값이 크면 양수, 뒤의 값이 크면 음수로 된다


예시 데이터 : 제주도 60세 이상으로는 여자가 많고, 그 전에는 남자의 수가 더 많음을 유추할 수 있다
5) scatter 산점도 표현

import matplotlib.pyplot as plt
plt.scatter([1,2,3,4], [10,30,20,40], s = [100,200,250,300], c = ['red', 'blue', 'green', 'gold'])
plt.colorbar()
plt.show()

s = size c = color 각 속성의 의미는 이러하다

import matplotlib.pyplot as plt
plt.scatter([1,2,3,4], [10,30,20,40], s = [100,200,250,300], c = range(4))
plt.colorbar()
plt.show()

color 속성을 range 로 바꾸어주면


range 범위 값만큼 각기 다른 색으로 표현할 수 있다
6) 랜덤 값 생성 후 scatter + cmap 활용

import matplotlib.pyplot as plt
import random

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))

# cmap 속성을 통해 여러 색에 대한 표현을 간단히 할 수 있다
plt.scatter(x, y, s = size, c = size, cmap = 'jet', alpha = 0.3)
plt.colorbar()
plt.show()

alpha = 마커의 투명도 alpha 가 1에 가까울수록 불투명 겹치는 부분이 있으면 위에 위치한 마커가 겹친 마커를 가리기 때문에 alpha 를 통해 투명도를 조정해준다
7) 제곱근으로 사이즈 크기 조절

import matplotlib.pyplot as plt
import csv
import math

f = open('gender.csv', encoding = 'cp949')
data = csv.reader(f)
name = input('도시명 >> ')
m = []
f = []
size = []

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(',','')))
            # sqrt 제곱근으로 사이즈 크기 조정
            size.append(math.sqrt(int(row[i].replace(',','')) + int(row[i+103].replace(',',''))))
        break

plt.rc('font', family = 'Malgun Gothic')
plt.title(name + '의 연령별 인구 분포')
plt.plot(range(max(f)), range(max(f)), 'g--')
plt.scatter(m, f, c = range(101), alpha = 0.4, cmap = 'jet', s = size)
plt.colorbar()
plt.show()

각 값의 크기가 천차만별일 경우 마커의 크기도 천차만별이 된다
이 크기를 자연스럽게 표현하기 위해 제곱근(루트 : math.sqrt())로 계산하여 소수점 단위의 크기로 표현하면 자연스러운 크기 차이로 표현할 수 있다