웅진X유데미 STARTERS/TIL (Today I Learned)

[스타터스 TIL] 6일차.파이썬 데이터 시각화 (3) - seaborn, 실습

라밍쏭 2023. 2. 13. 22:41
728x90


1. 새롭게 알게된 내용

1.1 seaborn 그래프

지난주에는 matplotlib 패키지를 활용한 그래프 그리기 위주로 공부했다면, 오늘은 seaborn 패키지를 활용하는 것을 배웠다.

그래서 titanic 데이터를 seaborn의 다양한 그래프로 그려보았다.

 

GitHub - aramssong/Udemy_STARTERS

Contribute to aramssong/Udemy_STARTERS development by creating an account on GitHub.

github.com

 

 

✅ sns.countplot()

- x축에 사용될 컬럼만 지정해주면 해당 컬럼의 갯수를 count 해주어 그래프로 표현

- y를 그룹핑할 컬럼을 'hue = '로 지정

 

plt.figure(figsize = (10, 5))

plt.subplot(1, 2, 1)
sns.countplot(data = titanic, x = 'who')
plt.title('탑승자 성별', size = 15)

plt.subplot(1, 2, 2)
sns.countplot(data = titanic, x = 'who', hue = 'alive')
plt.title('탑승자 성별 별 생존여부', size = 15)

plt.suptitle('탑승자 성별', size = 20, weight = 'bold')
plt.tight_layout()

plt.show()

 

 

✅ sns.displot()

❓ displot 2개의 그래프를 서브플롯으로 그릴려고 했는데, 자꾸 에러가 났다...

displot은 서브플롯이 안 되는 것인가..?

 

-  히스토그램과 더불어 곡선 그래프도 같이 그릴 수 있음 (kde = True)

- 커널 밀도 그래프를 그리고 싶으면 'kind = 'kde'' 매개변수를 추가해주면 됨

- rugplot도 같이 그릴 수 있음 (rug = True)

 

sns.displot(data = titanic, x = 'age', bins = 20, kde = True)
plt.title('탑승자 나이', size = 15, weight = 'bold')
plt.show()

 

sns.displot(data = titanic, x = 'age', hue = 'alive', rug = True, kind = 'kde')
plt.title('나이 별 생존여부(커널밀도그래프)', size = 15, weight = 'bold')
plt.show()

 

 

✅ sns.boxplot() / sns.violinplot() / sns.stripplot() / sns.swarmplot()

- 스트립플롯 : 점으로 밀도를 나타내줌

- 스웜플롯 : 스트립플롯은 점이 겹쳐져 있어서 점을 겹치지 않는 그래프를 그릴려면 스웜플롯 사용

   (점 크기 설정 가능하며 점 크기가 커서 겹쳐지면 경고 메시지 뜸)

 

plt.figure(figsize = (10, 8), facecolor = 'snow')

# 박스플롯
plt.subplot(2, 2, 1)
sns.boxplot(data = titanic, x = 'class', y = 'fare')

# 바이올린플롯
plt.subplot(2, 2, 2)
sns.violinplot(data = titanic, x = 'class', y = 'fare')

# 스트립플롯
plt.subplot(2, 2, 3)
sns.stripplot(data = titanic, x = 'class', y = 'fare')

# 스웜플롯
plt.subplot(2, 2, 4)
sns.swarmplot(data = titanic, x = 'class', y = 'fare', s = 2)

plt.suptitle('객실등급 별 요금', size = 20, weight = 'bold')
plt.tight_layout()

plt.show()

 

 

1.2 시각화 실습

✅ 세 개의 plot을 하나의 axes에 그리기 + 수평선 그리기 (plt.axhline())

- 각 플롯의 최대값, 최솟값 위치에 수평선을 그려 강조하기

 

# 세 개의 플롯을 하나의 axes에 그리기
plt.figure(figsize = (15, 7))

plt.plot(df_seoul_mean, 'g.-', label = '평균기온')
plt.plot(df_seoul_min, 'b.-', label = '최저기온')
plt.plot(df_seoul_max, 'r.-', label = '최고기온')

plt.xticks(range(1910, 2021, 5))
plt.yticks(range(-25, 45, 5))

plt.grid(ls = ':')

plt.legend(loc = (0, 1.01), ncol = 3, fontsize = 12, edgecolor = 'k')

plt.title('서울시 기온 변화', size = 20, weight = 'bold', pad = 30)

# 수평선 ( 각 플롯의 최대, 최소값의 위치에 수평선 그리기 )
# 평균기온
plt.axhline(df_seoul_mean.min(), color = 'gray', ls = '--')
plt.axhline(df_seoul_mean.max(), color = 'gray', ls = '--')

# 최저기온
plt.axhline(df_seoul_min.min(), color = 'gray', ls = '--')
plt.axhline(df_seoul_min.max(), color = 'gray', ls = '--')

# 최고기온
plt.axhline(df_seoul_max.min(), color = 'gray', ls = '--')
plt.axhline(df_seoul_max.max(), color = 'gray', ls = '--')

plt.show()

 

 

✅ 그래프 중 특정 데이터 표시 + 화살표 & 텍스트 추가하기

- 그래프 중에 특정 데이터를 강조하고 싶다면, 추가로 plt하여 그리면 됨

- 그래프에 화살표와 텍스트를 추가하여 설명을 기재할 수 있음

 

# 지점별 연 최저기온
plt.figure(figsize = (20, 5))
plt.bar(df_2020_cold.index, df_2020_cold.values, color = 'skyblue')

# x축 눈금 회전
plt.xticks(rotation = 90)

# 그래프 제목
plt.title('2020년 지점별 연 최저기온', fontsize = 20, weight = 'bold', pad = 30)

# 최저, 평균, 최고지점 표시
plt.axhline(df_2020_cold.max(), color = 'r', ls = '--', label = '최고' + str(df_2020_cold.max()))
plt.axhline(df_2020_cold.mean(), color = 'g', ls = '--', label = '평균' + str(round(df_2020_cold.mean(), 1)))
plt.axhline(df_2020_cold.min(), color = 'b', ls = '--', label = '최저' + str(df_2020_cold.min()))

# 범례 표시
plt.legend(loc = (0, 1.01), ncol = 3, fontsize = 12, edgecolor = 'k')

# 서울 표시
plt.bar('서울', df_2020_cold.loc['서울'], color = 'b')

# 화살표와 텍스트 표시
plt.annotate('서울(' + str(df_2020_cold.loc['서울']) + ')'  # 표시할 텍스트
            , xy = ('서울', df_2020_cold.loc['서울'])       # 화살표가 가리키는 곳 위치
            , xytext = ('서울', df_2020_cold.loc['서울'] - 5)  # 텍스트 위치
            , arrowprops = {'width':1, 'headwidth':10, 'headlength':10, 'shrink':0.1, 'fc':'r'}  # 화살표 속성
            , fontsize = 12, color = 'r')  # 텍스트 속성

# 텍스트만 표시
# plt.text('서울', df_2020_cold.loc['서울'] - 1.5
#          , '서울(' + str(df_2020_cold.loc['서울']) + ')'
#          , ha = 'center', fontsize = 12)

plt.show()

 

 

2. 멘토링

[나의 질문]
%matplotlib inline  이 코드를 사용할 때나 사용하지 않을 때, 그래프가 출력이 되는 것은 동일합니다. 그래서 이 코드의 의미와 기능이 무엇인지 궁금합니다!

 

▶ [답변]

주피터 노트북 안에 그래프를 그리기 위해 사용하는 코드로, 사용하지 않아도 괜찮음.

[+]

%matplotlib tk

위와 같은 코드를 사용하게 된다면 그래프가 주피터 노트북 내에 그려지지 않고, 팝업창으로 그래프가 그려진다.

 

 

3. 회고

seaborn 패키지를 활용한 시각화와 다양한 기능을 활용한 시각화를 배웠다. 새롭게 알게된 기능들이 매우 많았고, 확실히 matplotlib보다 seaborn 그래프가 그리기 쉬웠다. 그만큼 다양한 기능을 사용하는데에 제약은 있지만 일반적으로 그래프 그릴 때는 주로 seaborn을 사용할 것 같다.

오늘도 titanic 데이터셋를 활용해서 seaborn 그래프를 그려보았는데, 계속해서 오류가 발생하기도 했고, 시각화에서 더 나아가 어떤 식으로 분석해야 할지에 대한 고민도 많이 생겼다. (이 부분은 좀 더 보완해가도록!)

728x90