자기계발/Python

[혼공단 9기] 6주차 : Chapter 06 복잡한 데이터 표현하기

호등 2023. 2. 17. 15:08
반응형

 

벌써 혼공단 마지막 주차가 되었네요.
아무것도 안했다면 그냥 흘러갔을 시간인데 정말 알찬 시간 보낸 것 같습니다.

아직 Python을 자유자재로 활용하는 것은 불가능하지만 데이터분석이 대강 어떻게 진행되는지 알 수 있었어요.
추후 실제 데이터를 가지고 교재 내용 참고하여 이것저것 실습해보고 다른 교재도 공부해보아야 겠어요.

이번 혼공단 9기에 참여하신 분들 고생 많으셨습니다.


Chapter 06 복잡한 데이터 표현하기

 

 

6-1 객체지향 API로 그래프 꾸미기


그래프를 그리는 방식에는 두 가지 방법이 있다.
첫 번째로 matplotlib.pyplot에 있는 함수를 사용하는 pyplot 방식
두 번째로는 피겨 객체와 서브플롯 객체를 만들고 이 객체의 메서드를 사용하는 객체지향 API 방식이다.

pyplot 방식으로 그래프 그리기

plt.plot([1,4,9,16])
plt.show()

plot() 함수에 하나의 리스트만 전달하면 원소를 y축의 값이라고 인식하고, 리스트의 인덱스를 x축의 값으로 사용한다.

객체지향 API 방식으로 그래프 그리기

fig, ax = plt.subplots() #하나의 Axes 객체를 가지는 피겨 생성
ax.plot([1, 4, 9, 16])
fig.show()

피겨 객체와 Axes 객체를 사용하는 객체지향 API 방식으로 그린 그래프이다.
그래프를 여러 개 그리는 등 복잡한 그래프를 그리는 경우에는 객체지향 방식을 사용하는 것이 좋다.

폰트 지정하기1 : font.family 속성

plt.rcParams['font.family'] = 'NanumGothic'

맷플롯립의 기본 폰트는 영문 sans-serif 폰트이다.
rcParams 객체로 기본값을 나눔고딕(NanumGothic)체로 바꿔주었다.

폰트 지정하기2 : rc() 함수

plt.rc('font', family = 'NanumBarunGothic', size = 11)

rc() 함수의 첫 번째 매개변수에는 그룹을, 두 번째 매개변수에는 그룹 하위 속성을 지정한다.
rc() 함수를 사용하면 그룹 내의 여러 설정(폰트, 사이즈 등)을 한번에 지정할 수 있다.

* rcParams 객체를 사용했을 때 font.family라는 코드를 작성했는데 font가 그룹, family가 그룹의 하위 속성임

특정 열의 상위 N개의 데이터 추출 : value_counts() 메서드

top30_pubs = ns_book7['출판사'].value_counts()[:30]

value_counts() 메서드 : 카운트가 높은 순으로 결과 내림차순 정렬, 슬라이스 연산자를 사용할 수 있다.

상위 N개에 해당하는 데이터 행 표시 : inin() 메서드

top30_pubs_idx = ns_book7['출판사'].isin(top30_pubs.index)

isin() 메서드 : 데이터프레임에서 일치하는 값을 찾아 불리언 배열로 전달한다.

산점도 그리고 값에 따라 마커크기 다르게 나타내기

fig, ax = plt.subplots(figsize=(10, 8))
ax.scatter(ns_book8['발행년도'], ns_book8['출판사'],s=ns_book8['대출건수'])
ax.set_title('출판사별 발행 도서')
fig.show()

scatter() 함수의 s 매개변수로 마커의 크기를 조정할 수 있다.

s 매개변수를 하나의 실수로 지정하면 모든 마커 크기가 동일하게,
입력 데이터와 동일한 길이의 배열을 지정하면 위 그래프처럼 각 마커의 크기가 달라진다.

* rcParams['lines.markersize']로 선그래프와 산점도 마커 크기를 지정할 수 있다. (기본값 6)
* s 매개변수의 기본값은 rcParams['lines.markersize']의 제곱을 사용한다.

마커 꾸미기

1. 투명도 조절 : alpha 매개변수
2. 마커 테두리 색 변경 : edgecolor 매개변수 (기본값 face)
3. 마커 테두리 선 두께 변경 : linewidths 매개변수 (기본값 1.5)
4. 산점도 색 변경 : c 매개변수 (큰 값은 밝은 노랑, 작은 값은 진한 녹색)

값에 따라 색상을 표현하는 컬러맵

fig, ax = plt.subplots(figsize=(10,8))
sc = ax.scatter(ns_book8['발행년도'], ns_book8['출판사'],
                linewidths=0.5, edgecolors='k', alpha=0.3,
                s=ns_book8['대출건수']**1.3, c=ns_book8['대출건수'], cmap='jet')

ax.set_title('출판사별 발행 도서')
fig.colorbar(sc)
fig.show()

Chapter 06 기본 미션 : 344p 컬러맵으로 그린 산점도

cmap(컬러맵) 매개변수로 값에 따른 색상을 다르게 표현할 수 있다.
기본값은 virdis이며, 자주 사용하는 컬러맵 중 하나인 jet 컬러맵을 지정해주었다.

컬러맵 색깔이 어떤 값에 대응하는지 정보를 제공하기 위해 colorbar() 메서드로 컬러 막대를 그렸다.


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

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

역시나 도서대출 데이터를 활용하여 실습을 진행한다.

reset_index() 메서드를 사용하기 전(좌)과 후(우)

groupby() 메서드로 특정 열을 기준으로 행을 모으면 기준이 된 열들이 인덱스가 되기 때문에 reset_index() 메서드로 인덱스를 초기화 해줘야 한다는 것을 잊지 말자!

line1 = ns_book9[ns_book9['출판사']== '황금가지']
line2 = ns_book9[ns_book9['출판사']== '비룡소']

fig, ax = plt.subplots(figsize=(8,6))
ax.plot(line1['발행년도'], line1['대출건수'], label='황금가지')
ax.plot(line2['발행년도'], line2['대출건수'], label='비룡소')
ax.set_title('연도별 대출건수')
ax.legend()
fig.show()

여러 개의 선 그래프를 그리는 방법은 바로 plot() 함수를 여러번 호출하는 것이다.
별도의 색을 지정하지 않아도 자동으로 선 그래프마다 다른 색으로 그려준다. (최대 10개의 색 사용)

선 그래프에 레이블(label)을 추가하고 legend() 메서드로 범례를 불러왔다.

'''선 그래프 5개 추가'''

ax.set_title('연도별 대출건수')
ax.legend()
ax.set_xlim(1985, 2025)
fig.show()

선 그래프 5개를 그릴땐 일일히 plot() 함수를 호출하지 않고 반복문인 for문을 사용하여 그려주었다.

축 범위 지정하는 방법
1) xlim(), ylim() 사용 예시 : plt.xlim(1985, 2025)
2) axis() 함수 사용 예시 : plt.axis([1985, 2025, 0, 13000]) | x축과 y축의 범위를 묶어서 전달해야함
3) set_xlim() 메서드 사용 예시 : ax.set_xlim(1985, 2025)

스택영역 그래프

하나의 선 그래프 위에 다른 선 그래프를 차례대로 쌓는 형태의 그래프를 말한다. 그래프 사이의 간격이 y축의 값이 된다.
다음은 스택영역 그래프를 그리는 과정이다.

1) pivot_table() 메서드로 각 '발행년도' 열의 값을 열로 바꾸기
index 매개변수에는 행 인덱스로 사용할 열 이름을,
columns 매개변수에는 열 인덱스로 사용할 열 이름을 넣어준다.

ns_book10 =ns_book9.pivot_table(index='출판사', columns='발행년도')


2) '발행년도' 열을 리스트 형태로 바꾸기

year_cols = ns_book10.columns.get_level_values(1)

위 캡처본의 열을 잘 보면 다단으로 되어 있다는 것을 알 수 있다. ('대출건수', 1947), ('대출건수', 1974) 등
get_level_values() 메서드로 연도만 선택하여 연도 항목만 가져왔다.

3) stackplot() 메서드로 스택 영역 그래프 그리기

fig, ax = plt.subplots(figsize=(8,6))
ax.stackplot(year_cols, ns_book10.loc[top10_pubs].fillna(0),
             labels=top10_pubs)
ax.set_title('연도별 대출건수')
ax.legend(loc='upper left')
ax.set_xlim(1985, 2025)
fig.show()

Chapter 06 선택 미션 : 356p~359p 스택 영역 그래프 그리는 과정

stackplot() 메서드 x축에는 year_cols 값을, y축에는 상위 10개 출판사에 해당하는 행을 골라 전달했다.
누락된 값으로 인하여 그래프가 이상하게 그려지는 경우를 대비하여 fillna() 메서드를 사용했다.


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

선 그래프와 마찬가지로 bar() 함수를 여러 번 호출하면 되는데 한 가지 문제가 생긴다. 그것은 바로 먼저 그린 막대 위에 연이어 그리게 된다는 것!

fig, ax = plt.subplots(figsize=(8,6))
ax.bar(line1['발행년도']-0.2, line1['대출건수'],width=0.4, label='황금가지')
ax.bar(line2['발행년도']+0.2, line2['대출건수'],width=0.4, label='비룡소')
fig.show()

기본 막대 그래프의 너비는 0.8이므로, 각각의 막대 그래프의 너비를 절반(0.4)로 줄여준 뒤, 막대 위치를 조금씩 조정하여 표현해주었다.

스택 막대 그래프

#bottom 매개변수 사용
height1 = [5,4,7,9,8]
height2 = [3,2,4,1,2]

plt.bar(range(5), height1, width=0.5)
plt.bar(range(5), height2, bottom=height1, width=0.5)
plt.show()

#y축 방향으로 데이터 값 누적
height3 = [a + b for a, b in zip(height1, height2)]
plt.bar(range(5), height3, width=0.5)
plt.bar(range(5), height1, width=0.5)
plt.show()

아쉽게도 막대그래프는 선 그래프의 stackplot() 메서드같은 함수가 없다.
하지만 2가지 방법으로 이 문제를 쉽게 해결할 수 있다.

첫 번째는 bottom 매개변수로 수동으로 막대를 쌓는 방법이고 (막대가 시작할 y좌표를 지정해주는 역할)
두 번째는 y축 방향으로 데이터값을 누적해서 그리는 방법이다.

bottom 매개변수 사용시의 막대의 시작 위치를 계속하여 보관해야한다는 단점이 있다.

이 외에 cumsum() 메서드로 값을 누적하여 스택 막대 그래프를 그리는 방법도 존재한다. 이 내용은 교재 364p에 자세히 나와있다.


원 그래프 다루는 방법, 여러 종류가 포함된 서브플롯 그래프를 나타내는 방법 등을 학습할 수 있었다.
이 부분은 교재 내용을 전부 올리게 될 것 같아 따로 올리지 않는다.

혼공학습단(혼자 공부하는 데이터 분석 with 파이썬) 6주차_기본 미션, 선택 미션


본문에 맷플롯립 컬러맵 산점도 캡쳐본, 스택 영역 그래프 그리는 과정 업로드 했습니다!

반응형