본문 바로가기
카테고리 없음

[Python] 데이터 순위를 정하는 Dual Axis, 파레토 차트개발

by 엘파뉴e 2021. 7. 17.

[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]

 

 

 

바차트 - 도착영업소코드별 통행회수

라인차트 - 통행횟수 비율을 도착영업소코드별 기준 순차로 누적 해서 보여준다.

 

 

 

 

 

댓글