[혼공학습단 9기] 혼자 공부하는 데이터분석 with 파이썬 6주차 (2) - 맷플롯립의 고급 기능을 사용해보자!

coshibaken413·2023년 2월 19일
0

혼공학습단 9기

목록 보기
19/20

CHAPTER 6 - 복잡한 데이터 표현하기

6-2. 맷플롯립의 고급 기능 배우기

핵심 키워드
범례 피벗 테이블 스택 영역 그래프 스택 막대 그래프 원 그래프

하나의 피겨에 여러 개의 선 그래프 그리기

맷플롯립에서 하나의 피겨에 여러 개의 선 그래프를 그리려먼 plot() 함수를 여러 번 호출하면 된다.

먼저 출판사에 대한 발행년도 별 대출건수 그래프를 그리기 위해 대출건수 상위 30개의 출판사 목록을 추출한다.

이제 2개의 출판사 데이터를 만들어 발행년도에 대한 선 그래프를 그려보자.
그리고 두 개의 선 그래프를 구분하기 위해 범례(legend)를 추가한다.
plot() 함수를 호출할 때 각각의 선 그래프에 대해 레이블을 추가하고, 마지막에 legend() 메서드를 호출하면 범례가 추가된다.

이번에는 상위 5개 출판사의 발행년도에 대한 대출건수 그래프를 그려보자.
set_xlim() 메서드를 사용해서 대부분의 대출건수가 발생한 1990 이후의 데이터가 중점적으로 보이도록 1985년부터 2025년까지 설정했다.

위와 같이 범례를 추가했음에도 그래프가 너무 많아 어떤 출판사인지 파악하기 쉽지 않을 때는 스택 영역 그래프를 그리는 것이 좋다.

스택 영역 그래프

스택 영역 그래프는 하나의 선 그래프 위에 다른 선 그래프를 차례대로 쌓는 것이다. 그래프 사이의 간격이 y축이 된다.

스택 영역의 그래프는 맷플롯립의 stackplot() 메서드로 그릴 수 있다.
첫 번째 매개변수에는 x축의 값(발행년도)을 저장하고, 두 번째 매개변수에는 y축 값을 2차원 배열로 전달한다.

1. 각 발행년도 열의 값을 열로 바꾸기: pivot_table()
원본 데이터프레임에는 각각의 발행년도가 값으로 되어있지만, 스택영역 그래프에서 필요한 값은 발행년도 값이 열로 되어있는 값이다.

데이터 구조를 바꾸려면 판다스의 pivot_table() 메서드를 사용한다.
index 매개변수와 columns 매개변수에 원본 데이터프레임의 열을 지정하면 각 열의 고유한 값이 피벗 테이블로 변환된다.

2. 발행년도 열을 리스트 형태로 바꾸기
상위 10개에 대한 출판사 이름과 x축에 놓을 발행년도 리스트를 추출하기 위해서는 판다스의 get_level_values() 메서드를 사용한다.

판다스 인덱스 객체의 다단으로 구성된 열 이름에서 선택된 항목만 가져올 수 있다.

원본 데이터프레임에는 열이 ('대출건수', 1947) 과 같이 되어있으니 여기에서 연도에 해당되는 두 번째 항목을 가져온다.

3. 스택 영역 그래프 그리기: stackplot()
x축과 y축에 전달할 값이 준비되었으니 마지막으로 stackplot() 메서드에 각각의 값을 전달해준다.
범례는 legend() 메서드에서 loc 매개변수로 범례의 위치를 지정할 수 있다.

각 년도에서 확인할 수 있는 그래프의 면적이 대출건수와 같다.
예를 들어 2010년의 그래프 면적을 보면 '웅진씽크빅'의 대출건수가 가장 많다는 것을 알 수 있다.

하나의 피겨에 여러 개의 막대 그래프 그리기

막대 그래프를 여러 개 그리는 방법도 선 그래프와 비슷하게 bar() 함수를 여러 번 호출하면 된다.
하지만 그냥 호출하면 나중에 그려진 막대가 먼저 그려진 막대를 가려버리기 때문에 두 그래프가 함께 나란히 그려지도록 막대 위치와 막대 너비를 따로 지정한다.

여러 개의 막대 그래프를 그리는 또다른 방법으로는 스택 막대 그래프가 있다.
말 그대로 스택처럼 여러 막대를 위로 쌓아 올려 표현한 그래프다.

맷플롯립에서는 bar() 메서드의 bottom 매개변수를 사용해서 수동으로 막대를 쌓아 그린다.

위 그래프에서는 리스트 컴프리헨션을 이용해서 막대의 길이를 누적시킨 값으로 그래프를 그렸다. 이렇게 하면 그래프를 그릴 때마다 막대의 시작 위치를 계속 보관하지 않아도 된다.

스택 막대 그래프는 단순히 위로 쌓아 올려 표현하기 때문에 여러 개의 데이터가 있으면서, 각각의 데이터에 대한 누적된 값을 표현해야 할 때 적합하다.

발행 연도별 대출건수가 차례대로 누적된 막대그래프를 스택 막대 그래프로 그려보자.

상위 10개의 출판사에 대한 누적된 대출건수 값은 판다스의 cumsum() 메서드를 사용해서 구할 수 있다.

이제 누적된 대출건수를 이용해 막대 그래프를 쌓는다.
이때 주의할 점으로는 가장 긴 막대를 먼저 그려야 한다. 그렇지 않으면 가장 긴 막대가 이전에 그린 막대를 모두 덮어버리게 된다.

range() 함수로 ns_book12 데이터프레임 행 개수만큼 인덱스 번호를 만들고, for 문에 reversed() 함수를 사용해 인덱스의 역순으로 반복해서 그린다.

원 그래프 그리기

원 그래프(파이 차트)는 전체 데이터에 대한 비율을 원 부채꼴로 나타낸 그래프이다.

원 그래프는 맷플롯립의 pie() 메서드로 그릴 수 있다.
첫 번째 매개변수에 데이터를 전달하면 자동으로 데이터 전체에 대한 비율을 계산해서 그래프를 그린다.
두 번째 매개변수에는 지정한 레이블을 넣는다.

상위 10개 출판사의 도서 개수를 나타낸 원 그래프는 아래와 같이 그릴 수 있다.

하지만 원 그래프는 다른 그래프와는 달리 시각적으로 어떤 데이터가 더 큰지 한 눈에 파악할 수 없다.

이러한 원 그래프의 단점을 보완하기 위해 각각의 비율을 표시하고 가장 많은 비율을 차지하는 조각을 부채꼴로 강조해보자.

pie() 메서드의 autopct 매개변수에는 파이썬의 % 연산자에 적용할 포맷팅 문자열을 비율로 전달할 수 있다.
예를들어 %d를 전달하면 정수를, %f를 전달하면 각 부채꼴에 대한 비율이 실수로 표시된다.

explode 매개변수에 강조하려는 조각의 간격을 반지름의 비율롤 지정하면 해당 부채꼴 조각을 원 그래프에서 조금 떨어트려 시각적으로 부각시킬 수 있다.
예를 들어 첫 번째 출판사인 '문학동네'를 강조하려면 첫 번째 항목이 0.1이고 나머지는 모두 0인 리스트를 만들어 전달한다.

profile
프론트엔드 기술면접 공부중

0개의 댓글