Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total



GitHub Contribution
Loading data ...
관리 메뉴

초보 개발자의 일기

Boston Marathon 2019 - 시각화2 (Pareto Chart) 본문

소소한 공부 일기/데이터 분석

Boston Marathon 2019 - 시각화2 (Pareto Chart)

Da다 2021. 8. 8. 16:46
 

Boston Marathon 2019 - 시각화1 (Column Chart)

Boston Marathon 2019_데이터 확인 학원에서 Finishers Boston Marathon 2015, 2016 & 2017 데이터셋으로 데이터 전처리와 시각화방법을 배웠는데요! 캐글에 검색해보니 Boston Marathon 2019 데이터가 있어서 복..

dada-devdiary.tistory.com

안녕하세요!

이번에는 금방 돌아올 줄 알았는데 또 달이 바뀌어버렸네용... 시간이 정말 빨라요!

지난번에 Column Chart를 그려봤는데, 이번에는 파레토 차트를 다뤄보겠다고 말씀드렸었죠? 기억하시나요?

파레토 차트... 저한테는 차트 중에 가장 어렵습니다... 하지만 공부는 끝이 없으니 계속 다뤄봐야 늘겠죠!

 

이 차트는 파레토 법칙을 알고계시면 이해하기 쉬울 것 같아요. 파레토 법칙이란 80-20 rule이라고도 하는데, 그 이유는 전체의 20%에 해당하는 카테고리의 수량이나 영향이 전체의 80%를 차지한다는 내용입니다. 음... 이 설명이 잘 되었는지 모르겠네요. 정보처리기사 시험에도 나오는 개념인데, 만약 시스템을 구축하기 위해 코드를 짠다면, 전체 결함의 80%는 전체 코드의 20%에 해당하는 부분이 차지할 때가 있다고 합니다. 조금은 이해가 되셨나요?

 

파레토 법칙이 더 궁금하신 분들은 아래 링크를 참조해 주세요!

 

롱테일 법칙과 파레토 법칙

파레토 법칙은 80 대 20 법칙으로 불리며 오랫동안 대중적인 마케팅 기법으로 인식되어 왔다. 그러나 인터넷 2.0 시대가 도래하면서 역(逆)파레토 법칙이라고 하는 롱테일 법칙이 나타나고 있다.

terms.naver.com


데이터 로딩

차트를 그리기 위해 가장 먼저 해야 할 일은 라이브러리와 데이터를 불러오는 것이죠!

라이브러리를 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개로 만들었습니다. 어떠신가요? 

다음 번에는 동그란 모양의 차트를 그려보겠습니다. 파레토보다 쉬워서 더 재미있을것 같네요!

그럼 맛저하세요!

Comments