초보 개발자의 일기
Boston Marathon 2019 - 시각화2 (Pareto Chart) 본문
안녕하세요!
이번에는 금방 돌아올 줄 알았는데 또 달이 바뀌어버렸네용... 시간이 정말 빨라요!
지난번에 Column Chart를 그려봤는데, 이번에는 파레토 차트를 다뤄보겠다고 말씀드렸었죠? 기억하시나요?
파레토 차트... 저한테는 차트 중에 가장 어렵습니다... 하지만 공부는 끝이 없으니 계속 다뤄봐야 늘겠죠!
이 차트는 파레토 법칙을 알고계시면 이해하기 쉬울 것 같아요. 파레토 법칙이란 80-20 rule이라고도 하는데, 그 이유는 전체의 20%에 해당하는 카테고리의 수량이나 영향이 전체의 80%를 차지한다는 내용입니다. 음... 이 설명이 잘 되었는지 모르겠네요. 정보처리기사 시험에도 나오는 개념인데, 만약 시스템을 구축하기 위해 코드를 짠다면, 전체 결함의 80%는 전체 코드의 20%에 해당하는 부분이 차지할 때가 있다고 합니다. 조금은 이해가 되셨나요?
파레토 법칙이 더 궁금하신 분들은 아래 링크를 참조해 주세요!
데이터 로딩
차트를 그리기 위해 가장 먼저 해야 할 일은 라이브러리와 데이터를 불러오는 것이죠!
라이브러리를 import 하고, 지난번처럼 데이터를 DataFrame으로 불러옵니다.
# 필요한 라이브러리 임포트
import pandas as pd
import matplotlib.pyplot as plt # 시각화 라이브러리
# 파이썬 warning을 무시하고 싶다면 아래 코드를 함께 넣어줍니다.
import warnings
warnings.filterwarnings(action='ignore')
# 데이터 불러오기
df = pd.read_csv("./data/Dataset-Boston-2019.csv")
df
지난번에 결측치 등은 모두 확인했으니 넘어가고, 한국인이면서 18~59세에 해당하는 참가자의 데이터만 가져오겠습니다.
runner_korea_18_59 = df[(df.Country=='Korea, Republic of') & (df.Age.isin(range(18,60)))]
runner_korea_18_59
이제 차트를 그리기 위해 축을 설정할 데이터를 만들어줍니다.
나이대별 참가자 수의 비율을 나타내기 위해 먼저 나이대(18~59) 별로 카운트한 데이터를 만듭니다.
runner_korea_18_59_counting = runner_korea_18_59.Age.value_counts()
runner_korea_18_59_counting
58 12
56 12
59 9
57 8
53 7
54 6
52 6
47 5
55 5
48 5
34 4
51 4
50 4
49 4
45 3
32 3
46 2
44 2
43 2
37 2
35 2
27 1
41 1
40 1
39 1
38 1
36 1
31 1
29 1
25 1
Name: Age, dtype: int64
X축을 그리기 위해 Age를 나열합니다.
x = runner_korea_18_59_counting.index
print(type(x[0]))
print(x)
<class 'numpy.int64'>
Int64Index([58, 56, 59, 57, 53, 54, 52, 47, 55, 48, 34, 51, 50, 49, 45, 32, 46,
44, 43, 37, 35, 27, 41, 40, 39, 38, 36, 31, 29, 25],
dtype='int64')
Age를 문자열로 변환합니다.
x = [str(i) for i in x]
print(type(x[0]))
print(x)
<class 'str'>
['58', '56', '59', '57', '53', '54', '52', '47', '55', '48', '34', '51', '50', '49',
'45', '32', '46', '44', '43', '37', '35', '27', '41', '40', '39', '38', '36', '31',
'29', '25']
y축을 그리기 위해 나이대별로 count한 값을 저장합니다.
y = runner_korea_18_59_counting.values
print(type(y[0]))
print(y)
<class 'numpy.int64'>
[12 12 9 8 7 6 6 5 5 5 4 4 4 4 3 3 2 2 2 2 2 1 1 1
1 1 1 1 1 1]
누적 데이터를 확인하기 위해 비율을 구합니다.
ratio = y/y.sum()
ratio_sum = ratio.cumsum()
ratio_sum
array([0.10344828, 0.20689655, 0.28448276, 0.35344828, 0.4137931 ,
0.46551724, 0.51724138, 0.56034483, 0.60344828, 0.64655172,
0.68103448, 0.71551724, 0.75 , 0.78448276, 0.81034483,
0.8362069 , 0.85344828, 0.87068966, 0.88793103, 0.90517241,
0.92241379, 0.93103448, 0.93965517, 0.94827586, 0.95689655,
0.96551724, 0.97413793, 0.98275862, 0.99137931, 1. ])
이제 드디어 그래프를 그릴 시간이에요!
# 그래프 사이즈 지정
fig,barChart = plt.subplots(figsize = (20,8))
# bar 차트 그리기
barChart.bar(x, y)
# line차트 함께 그리기
lineChart = barChart.twinx()
lineChart.plot(x, ratio_sum, '-g^', alpha = 0.5)
차트를 그렸지만 제목도 없고, 레이블이 없어서 보기가 불편합니다.
코드를 좀 더 추가해서 그래프를 다시 그려줍니다.
fig,barChart = plt.subplots(figsize = (20,8))
barChart.bar(x, y)
lineChart = barChart.twinx()
lineChart.plot(x, ratio_sum, '-g^', alpha = 0.5)
######### 추가 #########
ranges = lineChart.get_yticks() # y차트의 단위들
lineChart.set_yticklabels(['{0:.1%}'.format(x) for x in ranges])
# line차트 데이터 별 %값
ratio_sum_percentages = ['{0:.0%}'.format(x) for x in ratio_sum]
for i, txt in enumerate(ratio_sum_percentages):
lineChart.annotate(txt, (x[i], ratio_sum[i]), fontsize=12)
# x, y label 지정
barChart.set_xlabel('Age', fontdict={'size':16})
barChart.set_ylabel('Number of runner', fontdict={'size':16})
# plot에 title 생성
plt.title('Pareto Chart - Number of Korea runner by Age', fontsize=18)
plt.show()
레이블이 생기니 훨씬 직관적이네요!
이렇게 파레토 차트를 그려보면 직관적으로 상위 n%를 확인할 수 있습니다.
다시 코드를 만들어 봤는데 재미는 있지만 조금 어렵네용.
지난번에는 x축에 여러 값을 나타내는 그래프까지 그려봤는데 오늘은 축을 2개로 만들었습니다. 어떠신가요?
다음 번에는 동그란 모양의 차트를 그려보겠습니다. 파레토보다 쉬워서 더 재미있을것 같네요!
그럼 맛저하세요!
'소소한 공부 일기 > 데이터 분석' 카테고리의 다른 글
Boston Marathon 2019 - 시각화3 (Pie Chart) (0) | 2021.08.09 |
---|---|
Boston Marathon 2019 - 시각화1 (Column Chart) (0) | 2021.07.11 |
Boston Marathon 2019_데이터 확인 (0) | 2021.06.06 |
Web Crawling - '멜론(Melon)' 크롤링(2) (5) | 2021.05.17 |
Web Crawling - '멜론(Melon)' 크롤링(1) (0) | 2021.05.16 |