[Python] 데이터 순위를 정하는 Dual Axis, 파레토 차트개발
통행횟수를 집계시 기준, 도착영업소기준 으로 바차트와, 누적증가비율을 라인차트로 표현하기 위한 듀얼엑시스, 파레토차트
1. 듀얼엑시스 Dual Axis 차트 개발 ( 통행회수 by 집계시 )
1. 파이썬 차트개발을 위한 matplotlib임폴트, 데이터편집을 위한 pandas 임폴트, 차트에서 한글깨짐 방지를 위한 rc 한글폰트(나눔고딕)적용
import matplotlib.pyplot as plt
import pandas as pd
#한글폰트 사용하기, 중요! 한글폰트가 사용된 plt.show() 함수보다 앞에 위치 시켜야 함
plt.rc('font', family="NanumGothic")
2. 데이터 불러오기.read_csv, 데이터 모양확인하기.head, 데이터 프레임 구조보기.info
file = "./data/data_2020.csv"
data = pd.read_csv(file) #데이터 읽어와 객체에 저장하기
data_Head = data.head() #데이터 모양 확인하기
print(data_Head)
data_Info = data.info() #데이터 프레임 구조보기
print(data_Info)
집계일자 집계시 출발영업소코드 도착영업소코드 통행시간 요일
0 20200101 4 101 105 637 2
1 20200101 4 101 105 773 2
2 20200101 4 101 105 762 2
3 20200101 4 101 105 746 2
4 20200101 4 101 105 875 2
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 152870 entries, 0 to 152869
Data columns (total 6 columns):
집계일자 152870 non-null int64
집계시 152870 non-null int64
출발영업소코드 152870 non-null int64
도착영업소코드 152870 non-null int64
통행시간 152870 non-null int64
요일 152870 non-null int64
dtypes: int64(6)
memory usage: 7.0 MB
None
3. 시간별로 불러오기 .isin(), 시간별로 정렬, .sort_values()
data_06_22 = data[data.집계시.isin(range(6,23))] #집계시 6시부터 ~ 22시까지 만 불러오기
print(data_06_22.sort_values(by='집계시')) #시간별로 정렬해서 출력한다.
집계일자 집계시 출발영업소코드 도착영업소코드 통행시간 요일
82028 20200715 6 101 140 16775 2
125225 20201026 6 101 110 5101 0
66049 20200609 6 101 105 713 1
66048 20200609 6 101 105 816 1
76951 20200704 6 101 135 10050 5
66047 20200609 6 101 105 894 1
141023 20201203 6 101 110 3452 3
66046 20200609 6 101 105 826 1
76952 20200704 6 101 135 12397 5
66045 20200609 6 101 105 832 1
66044 20200609 6 101 105 657 1
125235 20201016 6 101 120 6121 4
125249 20201016 6 101 115 5465 4
42786 20200414 6 101 110 2774 1
42787 20200414 6 101 110 3214 1
42788 20200414 6 101 110 3029 1
42789 20200414 6 101 110 3402 1
95557 20200818 6 101 120 8515 1
118321 20201009 6 101 110 3231 4
42798 20200412 6 101 110 3245 6
66003 20200607 6 101 140 17323 6
42800 20200414 6 101 115 4739 1
132441 20201114 6 101 130 9165 5
42801 20200414 6 101 115 5841 1
118330 20201001 6 101 115 4683 3
140981 20201202 6 101 125 7399 2
28257 20200310 6 101 110 2909 1
28256 20200310 6 101 110 3544 1
28255 20200310 6 101 110 3758 1
28254 20200310 6 101 110 3192 1
... ... ... ... ... ... ..
38817 20200404 22 101 125 8610 5
12583 20200131 22 101 120 6872 4
74023 20200627 22 101 135 16289 5
74032 20200627 22 101 140 16666 5
22476 20200224 22 101 140 14877 0
107492 20200915 22 101 115 5738 1
107491 20200915 22 101 115 6099 1
107490 20200915 22 101 115 4808 1
38788 20200404 22 101 120 7679 5
38779 20200404 22 101 115 5592 5
74067 20200626 22 101 110 3620 4
38778 20200404 22 101 115 5249 5
74178 20200628 22 101 105 816 6
38777 20200404 22 101 115 4666 5
38776 20200404 22 101 115 5434 5
5149 20200113 22 101 125 9153 0
12567 20200131 22 101 115 5756 4
107406 20200915 22 101 110 4041 1
107405 20200915 22 101 110 3112 1
12566 20200131 22 101 115 5805 4
12565 20200131 22 101 115 5851 4
12564 20200131 22 101 115 4886 4
22536 20200214 22 101 115 6305 4
107367 20200913 22 101 110 3548 6
5180 20200113 22 101 135 14165 0
74174 20200628 22 101 105 765 6
74175 20200628 22 101 105 870 6
74176 20200628 22 101 105 849 6
107489 20200915 22 101 115 6371 1
7741 20200120 22 101 105 873 0
[115244 rows x 6 columns]
4. 시간별로 카운트 하기 .value_counts()
data_06_22_counting = data_06_22['집계시'].value_counts() #시간별로 카운트하기
print(data_06_22_counting)
[115244 rows x 6 columns]
13 7092
14 7091
12 7089
15 7078
11 7059
10 7038
16 7011
9 7008
17 6919
8 6849
18 6742
19 6627
7 6614
20 6518
21 6284
22 6130
6 6095
Name: 집계시, dtype: int64
5. x 축에 index 시간별로 저장 ( 인덱스 틀어짐 방지 하기 위해 str 타입으로 변환해 저장)
x = data_06_22_counting.index #x 축에 index 시간별로 저장하기
x = [str(i) for i in x] #인덱스 틀어짐 방지하기 위해 str 타입으로 변환해서 저장
print(x)
['13', '14', '12', '15', '11', '10', '16', '9', '17', '8', '18', '19', '7', '20', '21', '22', '6']
6. y축에 벨류값 저장 및 누적값 확인
y = data_06_22_counting.values # y 축에 밸류 값 저장
#누적값 확인하기
ratio = y / y.sum()
ratio_sum = ratio.cumsum()
7. 차트설정하기
#차트설정
fig, barChart = plt.subplots(figsize=(20,10)) #바차트를 만들어준다.
barChart.bar(x, y) #x, y값의 바차트를 만듬
lineChart = barChart.twinx() #바차트의 트윈액스를 이용해 라인 차트를 만든다.
lineChart.plot(x, ratio_sum, '-ro', alpha=0.5) #라인차트 플랏에 x에 값과 누적 값, 중간에 동그라미 표시(-ro) 후 약간 투명 적용
ranges = lineChart.get_yticks() # 퍼센테이지 보여주기
print(ranges)
lineChart.set_yticklabels(['{:,.1%}' .format(x) for x in ranges]) #소숫점 한자리 퍼센테이지 포맷으로 만들어준다.
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=14) #라인차트 표현
barChart.set_xlabel('집계시', fontdict={'size':16}) #바차트 x 를 표현한다.
barChart.set_ylabel('통행회수', fontdict={'size':16}) #바차트 y 를 표현한다.
plt.title('Pareto Chart - 통행회수 by 집계시', fontsize=18)
plt.show()
[0. 0.2 0.4 0.6 0.8 1. 1.2]
바차트 - 집계시별 통행회수
라인차트 - 통행횟수 비율을 집계시기준 순차로 누적 해서 보여준다.
8. 전체코드
import matplotlib.pyplot as plt
import pandas as pd
#한글폰트 사용하기, 중요! 한글폰트가 사용된 plt.show() 함수보다 앞에 위치 시켜야 함
plt.rc('font', family="NanumGothic")
file = "./data/data_2020.csv"
data = pd.read_csv(file) #데이터 읽어와 객체에 저장하기
data_Head = data.head() #데이터 모양 확인하기
print(data_Head)
data_Info = data.info() #데이터 프레임 구조보기
print(data_Info)
data_06_22 = data[data.집계시.isin(range(6,23))] #집계시 6시부터 ~ 22시까지 만 불러오기
print(data_06_22.sort_values(by='집계시')) #시간별로 정렬해서 출력한다.
data_06_22_counting = data_06_22['집계시'].value_counts() #시간별로 카운트하기
print(data_06_22_counting)
x = data_06_22_counting.index #x 축에 index 시간별로 저장하기
x = [str(i) for i in x] #인덱스 틀어짐 방지하기 위해 str 타입으로 변환해서 저장
print(x)
y = data_06_22_counting.values # y 축에 밸류 값 저장
#누적값 확인하기
ratio = y / y.sum()
ratio_sum = ratio.cumsum()
#차트설정
fig, barChart = plt.subplots(figsize=(20,10)) #바차트를 만들어준다.
barChart.bar(x, y) #x, y값의 바차트를 만듬
lineChart = barChart.twinx() #바차트의 트윈액스를 이용해 라인 차트를 만든다.
lineChart.plot(x, ratio_sum, '-ro', alpha=0.5) #라인차트 플랏에 x에 값과 누적 값, 중간에 동그라미 표시(-ro) 후 약간 투명 적용
ranges = lineChart.get_yticks() # 퍼센테이지 보여주기
print(ranges)
lineChart.set_yticklabels(['{:,.1%}' .format(x) for x in ranges]) #소숫점 한자리 퍼센테이지 포맷으로 만들어준다.
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=14) #라인차트 표현
barChart.set_xlabel('집계시', fontdict={'size':16}) #바차트 x 를 표현한다.
barChart.set_ylabel('통행회수', fontdict={'size':16}) #바차트 y 를 표현한다.
plt.title('Pareto Chart - 통행회수 by 집계시', fontsize=18)
plt.show()
2. 파레토 Pareto Chart 차트 개발 ( 통행회수 by 도착영업소코드 )
전체코드
import matplotlib.pyplot as plt
import pandas as pd
#한글폰트 사용하기, 중요! 한글폰트가 사용된 plt.show() 함수보다 앞에 위치 시켜야 함
plt.rc('font', family="NanumGothic")
file = "./data/data_2020.csv"
data = pd.read_csv(file) #데이터 읽어와 객체에 저장하기
data_destination_counting = data['도착영업소코드'].value_counts() #도착영업소 별 데이터 카운트
print(data_destination_counting)
x = data_destination_counting.index #인덱스 값을 x 에 넣어준다.
x = [str(i) for i in x]#인티저 값으로 인해 소팅이 다시 되는걸 방지하기 위해 값을 str로 변경
y = data_destination_counting.values # 데이타 프레임 의 벨류 값을 y에 담아준다.
ratio = y / y.sum()
ratio_sum = ratio.cumsum() #누적 비율 을 보여주기 위한 값 을 만든다.
#차트설정
fig, barChart = plt.subplots(figsize=(20,10)) #바차트를 만들어준다.
barChart.bar(x, y) #x, y값의 바차트를 만듬
lineChart = barChart.twinx() #바차트의 트윈액스를 이용해 라인 차트를 만든다.
lineChart.plot(x, ratio_sum, '-ro', alpha=0.5) #라인차트 플랏에 x에 값과 누적 값, 중간에 동그라미 표시(-ro) 후 약간 투명 적용
ranges = lineChart.get_yticks() # 퍼센테이지 보여주기
print(ranges)
lineChart.set_yticklabels(['{:,.1%}' .format(x) for x in ranges]) #소숫점 한자리 퍼센테이지 포맷으로 만들어준다.
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=14) #라인차트 표현
barChart.set_xlabel('도착영업소코드', fontdict={'size':16}) #바차트 x 를 표현한다.
barChart.set_ylabel('통행회수', fontdict={'size':16}) #바차트 y 를 표현한다.
plt.title('Pareto Chart - 통행회수 by 도착영업소코드', fontsize=18)
plt.show()
105 49738
110 38526
115 26354
140 8954
130 7793
135 7428
125 7339
120 6738
Name: 도착영업소코드, dtype: int64
[0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1]
바차트 - 도착영업소코드별 통행회수
라인차트 - 통행횟수 비율을 도착영업소코드별 기준 순차로 누적 해서 보여준다.
댓글