실습을 통해 출력한 그래프는 다음과 같다.
어떻게 코드를 작성해야 하는지는 아래 상세히 설명을 할 것이니 그래프 개형만 참고하자!
0. 실습 전 준비
다음은 예제에서 이용할 엑셀 파일이다.
원하는 경로에 저장하여 실습에서 이용할 수 있도록 하자.
이번에는 데이터를 시각화하기 위해 Matplotlib를 이용할 것이다.
pandas가 관계형 데이터를 다루는데 사용하는 라이브러리라면, Matplotlib는 그 데이터들을 시각화 하는데 이용되는 라이브러리이다.
저번 포스팅에서와 동일하게 pandas와 Matplotlib를 이용하기 위해서 전처리기를 통해 import 해줘야 한다.
import pandas as pd
import matplotlib.pyplot as plt
1. 데이터 불러오기
우리가 분석하고자 하는 .csv 확장자 파일을 불러오기 위해 다음과 같은 코드를 작성해야 한다.
각각 다른 세 개의 .csv 파일을 불러와 data1, data2, data3 변수에 할당해주고 세 개의 데이터를 병합한 data4를 생성한다.
해당 코드의 자세한 설명은 지난 포스팅(https://da-y-0522.tistory.com/32)을 참고하도록 하자.
data1 = pd.read_csv('./data/chicken_07.csv')
data2 = pd.read_csv('./data/chicken_08.csv')
data3 = pd.read_csv('./data/chicken_09.csv')
data4 = pd.concat([data1, data2, data3])
data4 = data4.reset_index(drop=True)
2. 이용할 데이터 추출하기
실습을 통해 출력할 그래프는 다음과 같은 '요일에 따른 치킨 주문량 합계'에 대한 그래프이다.
위의 그래프를 그리기 위해선 우리가 가지고 있는 데이터에서 '요일' 정보와 '요일에 따른 통화건수의 총 합'의 값을 불러와야 한다.
해당 값들을 불러오기 위해 다음과 같이 코드를 작성할 수 있다.
sum_of_calls_by_week = data4.groupby('요일')['통화건수'].sum()
위 코드를 바로 이해하기 어렵다면 아래와 같이 코드를 쪼개서 이해해보도록 하자.
groupdata = data4.groupby('요일') # data4를 요일별로 그룹화(합침)
call_data=groupdata['통화건수'] # 요일별로 그룹화한 데이터에서 통화건수를 가져옴
sum_of_calls_by_week = call_data.sum() # 통화건수를 모두 합함(요일별 총 통화건수)
data.groupby('입력값') : '입력값'에 입력된 인덱스 값에 따라 같은 값을 하나로 묶어 통계 또는 집계 결과를 얻을 수 있음
따라서 위 코드를 통해 요일별 총 통화건수를 추출할 수 있었다.
3. 추출한 데이터로 그래프 그리기
plt.figure(figsize=(8,5)) # 그래프 생성
plt.bar(sum_of_calls_by_week.index, sum_of_calls_by_week) # 그래프의 x축, y축 값 설정
plt.title('요일에 따른 치킨 주문량 합계') # 그래프 타이틀 설정
plt.show() # 그래프 출력
plt.figure(figsize=(가로, 세로)) : 크기가 (가로, 세로)인치 단위인 그래프 생성
plt.bar(x축 값, y축 값) : 그래프의 x축 값, y축 값 설정
plt.title('제목') : 그래프의 제목 설정
plt.show() : 그래프 출력
하지만 해당 코드만 실행하여 그래프를 출력한다면, 그래프의 기본 폰트는 한글을 지원하지 않기 때문에 위 그래프처럼 파일이 깨지는 것을 볼 수 있을 것이다. 따라서 해당 코드를 추가해 한글을 지원해주는 폰트로 변경해야 한다.
plt.rcParams['font.family'] = "Malgun Gothic"
plt.show()
plt.rcParams['font.family'] = '폰트명' : 입력된 폰트로 그래프 폰트 변경
그 외에 아래 코드를 통해 폰트 크기도 변경 가능하다.
plt.rcParams['font.size'] = 10
plt.rcParams['font.size'] = 숫자 : 입력된 숫자로 그래프 폰트 크기 변경
4. 정렬 방식을 추가하여 그래프 출력하기
오름차순으로 정렬하기
그래프를 작성하는 방식은 위에서 작성한 코드와 같은 코드이다.
다만, 그래프에 사용되는 데이터가 오름차순으로 정렬된 데이터라는 것에만 차이가 있다.
아래와 같이 코드를 작성함으로써 위에서 사용한 sum_of_calls_by_week 데이터를 오름차순으로 정렬할 수 있다.
sorted_sum_of_calls_by_week = sum_of_calls_by_week.sort_values(ascending=True)
data.sort_values(ascending=True) : data를 오름차순으로 정렬
data.sort_values(ascending=False): data를 내림차순으로 정렬
위 코드를 포함해 다음과 같이 코드를 입력하면 '요일별 통화건수'가 오름차순으로 정렬된 그래프를 출력할 수 있다.
sorted_sum_of_calls_by_week = sum_of_calls_by_week.sort_values(ascending=True)
plt.figure(figsize=(8,5))
plt.bar(sorted_sum_of_calls_by_week.index, sorted_sum_of_calls_by_week)
plt.title('요일에 따른 치킨 주문량 합계')
plt.show()
그래프 출력 결과 오름차순으로 정렬된 그래프가 출력되는 것을 볼 수 있다.
사용자가 설정한 정렬 순서대로 정렬하기
해당 정렬 방식에서도 그래프 출력 방식은 동일하다.
다만 그래프가 '월, 화, 수, 목, 금, 토, 일' 순서대로 출력되도록 하기 위해 정렬 기준을 정하고, 이를 출력하려는 데이터에 적용해야 한다.
먼저 list를 통해 그래프에 출력될 요일의 정렬 순서를 정한다,
weeks = ['월', '화', '수', '목', '금', '토', '일']
그 후에 데이터를 그룹화 하는 방식은 위와 동일하다. 다만 reindex 함수를 추가적으로 적용시켜 위에서 입력한 list의 순서대로 데이터를 정렬해야 한다.
sum_of_calls_by_weeks =data4.groupby('요일')['통화건수'].sum().reindex(weeks)
data.reindex(list) : list에 입력된 정렬 기준에 따라 data의 인덱스 기준을 변경
위 코드를 포함해 다음과 같이 코드를 입력하면 '요일별 통화건수'가 list에 입력된 순서대로 정렬된 그래프를 출력할 수 있다.
weeks = ['월', '화', '수', '목', '금', '토', '일'] #요일의 기준을 정함
sum_of_calls_by_weeks =data4.groupby('요일')['통화건수'].sum().reindex(weeks) #위에서 정한 요일 기준대로 데이터들을 다시 정렬하여 그룹화 함
plt.figure(figsize=(8,5))
plt.bar(sum_of_calls_by_weeks.index, sum_of_calls_by_weeks)
plt.title('요일에 따른 치킨 주문량 합계')
plt.show()
그래프 출력 결과 위에서 입력한 list의 순서(월, 화, 수, 목, 금, 토, 일)대로 정렬된 그래프가 출력되는 것을 볼 수 있다.
5. 전체 실습 코드
import pandas as pd
import matplotlib.pyplot as plt
data1 = pd.read_csv('./data/chicken_07.csv')
data2 = pd.read_csv('./data/chicken_08.csv')
data3 = pd.read_csv('./data/chicken_09.csv')
data4 = pd.concat([data1, data2, data3])
data4 = data4.reset_index(drop=True)
sum_of_calls_by_week = data4.groupby('요일')['통화건수'].sum()
print(sum_of_calls_by_week)
#정렬하지 않고 그래프 출력
plt.figure(figsize=(8,5))
plt.bar(sum_of_calls_by_week.index, sum_of_calls_by_week)
plt.title('요일에 따른 치킨 주문량 합계')
plt.rcParams['font.family'] = "Malgun Gothic"
plt.show()
#오름차순으로 정렬된 그래프 출력
sorted_sum_of_calls_by_week = sum_of_calls_by_week.sort_values(ascending=True)
print(sorted_sum_of_calls_by_week)
plt.figure(figsize=(8,5)) #정렬된 그래프 출력
plt.bar(sorted_sum_of_calls_by_week.index, sorted_sum_of_calls_by_week)
plt.title('요일에 따른 치킨 주문량 합계')
plt.show()
#정렬 기준에 따라 정렬된 그래프 출력
weeks = ['월', '화', '수', '목', '금', '토', '일']
sum_of_calls_by_weeks =data4.groupby('요일')['통화건수'].sum().reindex(weeks)
print(sum_of_calls_by_weeks)
plt.figure(figsize=(8,5))
plt.bar(sum_of_calls_by_weeks.index, sum_of_calls_by_weeks)
plt.title('요일에 따른 치킨 주문량 합계')
plt.show()
'Python > 데이터분석' 카테고리의 다른 글
Python을 이용한 데이터 분석(1) - 데이터 입출력 (0) | 2021.06.26 |
---|