2023. 2. 6. 22:12ㆍ기술 공부/Seaborn
+ Seaborn의 User guide and tutorial를 필사한 내용입니다.
+ 실행 환경은 Anaconda, IPython, Jupyter NoteBook 입니다.
오늘 다룰 주제는,
첫 번째 글인 An introduction to seaborn 이다.
바로 시작해보자.
들어가면 가장 먼저 보이는 문단을 살펴보자.
Seaborn is a library for making statistical graphics in Python. It builds on top of matplotlib and integrates closely with pandas data structures.
Seaborn helps you explore and understand your data. Its plotting functions operate on dataframes and arrays containing whole datasets and internally perform the necessary semantic mapping and statistical aggregation to produce informative plots. Its dataset-oriented, declarative API lets you focus on what the different elements of your plots mean, rather than on the details of how to draw them.
Seaborn은 Python에서 통계 그래픽을 만들기 위한 라이브러리입니다.
matplotlib 위에 구축 되며 pandas 데이터 구조 와 밀접하게 통합 됩니다. Seaborn은 데이터를 탐색하고 이해할 수 있도록 도와줍니다. 플로팅 기능은 전체 데이터 세트를 포함하는 데이터 프레임 및 배열에서 작동하며 필요한 의미론적 매핑 및 통계 집계를 내부적으로 수행하여 유익한 플롯을 생성합니다. 데이터세트 중심의 선언적 API를 사용하면 플롯을 그리는 방법에 대한 세부 정보가 아니라 플롯의 다양한 요소가 의미하는 바에 집중할 수 있습니다.
Seaborn은 Python에서 통계 데이터에 대한 시각화를 하기 위한 목적으로 만들어진 모듈이라고 한다.
matplotlib 기반으로 pandas와도 쉽게 연동하여 사용할 수 있도록 만들어진 듯 하다.
플로팅(plotting)기능은 데이터 프레임 및 배열을
의미론적 매핑 및 통계 집계를 내부적으로 수행하여 유익한 플롯을 생성합니다.
아직 이 부분은 무슨 말인지 정확히는 모르겠으나, 아마도 데이터 프레임 및 배열을 입력하면
Seaborn 내부에서 여러 유익한(?) 처리를 한 후 플롯을 그린다. 라는 의미인 것 같다.
Seaborn은 데이터 분석을 위한 플롯을 그리는 데 시간을 쓰는 것이 아닌,
그려진 플롯을 보고 의미하는 바가 무엇인가에 더 집중하는 것이 목표인 것 같다.
+ seaborn이 설치되어 있지 않기 때문에, pip를 통해 설치를 진행하였다.
+ conda를 이용하고 있다면, 주석처리된 명령어를 이용해보자.
+ 개인적으로는 pip만 이용하기 때문에, conda를 이용한 설치는 따로 찾아보는 것을 강력 권장한다.
!pip install seaborn
# !conda install seaborn
# !conda install -c conda-forge seaborn
+ Seaborn 설치 후 처음으로 플롯을 그릴 때는 잘 작동하였으나, 두번 째 실행 때는 플롯이 그려지지 않았다.
해당 문제는 아래 명령어를 사용하여 해결하였다.
%matplotlib inline
왜 이런 문제가 생긴 걸까?
matplotlib.pyplot.show()의 경우, IPython 백엔드(inline)를 통해 plot을 렌더링하는 것이 아닌,
matplotlib만의 백엔드를 통해 별도의 창(tkinter로 추측)을 사용하여 plot을 외부 창(IPython 외부)에 렌더링한다고 한다.
+ Seaborn이 matplotlib을 기반으로 만들어 졌으니, Seaborn도 비슷하게 작동하리라 가정하였다.
따라서 matplotlib을 사용할 때, 계속하여 IPython(즉, Jupyter NoteBook)에 plot을 그리려면,
matplotlib만의 백엔드를 통해 외부에 그리지말고 IPython 백엔드(inline)를 통해 plot을 렌더링하라고 설정해야 하는 것이다.
그리고 그 명령어가 위의 매직메서드가 되겠다.
(위 내용은 IPython Docs에서 읽은 내용이다.)
(번외로 seaborn.plt.show()를 plt.show()로 override한다는 썰(?)도 있지만, 사실인지는 모르겠다.)
사실은 IPython에서 매번 plt.show()를 직접 호출해주는 것이 정답이긴 하다.
하지만, Jupyter NoteBook(Ipython)에서 우리는 절대 plt.show()를 '직접' 호출하지 않는다.Jupyter NoteBook, Ipython이 우리를 나태하게 만든 것이다...!
+ 아래 코드는 IPython 5.0 및 matplotlib 2.0부터 매직 메서드를 사용하지 않고
matplotlib.pyplot의 내부 기능으로 설정하는 방법이라고 한다.
하지만 이 경우에는 matplotlib.pyplot를 import 해주어야 하기 때문에 리소스를 좀 더 잡아 먹을 수 있겠다.
(ion(), ioff()만 하기에는 램이 아깝다. 아니면 다른 용도로도 import 해야 한다면 유용하겠다.)
import matplotlib.pyplot as plt
plt.ion()
# 반대의 경우,
# plt.ioff()
그럼 하나 궁금한 점이 생긴다.
matplotlib.pyplot의 pyplot.show()를 사용하면 어떻게 매번 잘 그려주는 것일까.
matplotlib 백엔드가 외부 창을 tkinter로 사용한다는 가정하에,
matplotlib.pyplot.show()가 최초에 작동할 때 외부 창을 생성하여 plot을 그리게되고,
2번째 작동할 때는 최초에 그린 plot이 그려진 외부 창이 아직 열려있는 상태이므로 별다른 출력 없이 넘어가게 되어,
IPython에서도 커널에 Cell에 대한 출력이 없으므로, Cell의 결과에 아무것도 출력하지 않는 것이 아닐까.
즉, matplotlib.pyplot.show()의 명령어를 직접 호출한다면,
생성되어 있는 외부 창을 모두 종료하고 새로운 외부 창을 호출하여 plot을 그리고 출력을 남기게 되어,
IPython에서도 커널에 Cell에 대한 출력이 있으므로, 매번 새롭게 Cell의 결과에 출력을 하는 것이 아닐까.
라고 추측해보았다.
너무 산으로 가는 것 같으니, 이 점은 나중에 matplotlib을 분석하면서 언젠가 알아보도록 하자.
미래의 나에게 토스.
Seaborn이 할 수 있는 것을 미리 스포당해보자.
# Import seaborn
import seaborn as sns
# Apply the default theme
sns.set_theme()
# Load an example dataset
tips = sns.load_dataset("tips")
# Create a visualization
sns.relplot(
data=tips,
x='total_bill',
y='tip',
col='time',
hue='smoker',
style='smoker',
size='size'
)
위 코드를 직접 Jupyter NoteBook에서 실행하면서 알아보자.
!pip install seaborn
우선 위에서 설명한대로, seaborn을 설치하였다.
매직매서드를 이용하여, IPython의 백엔드(inline)을 통해 내부 커널에 출력을 남기도록 설정하였다.
%matplotlib inline
설치된 seaborn 모듈을 import 해주었다. 또한 암묵적이고 웅장한 네이밍 규칙에 따라 sns라는 별칭을 붙여주었다.
위 예제 코드를 실행하기 위한 모듈로는 seaborn만 있으면 된다고 한다.
import seaborn as sns
모듈 import 확인을 위해 버전을 출력해보았다.
sns.__version__
출력 결과 :
'0.11.2'
문제 없이 import된 듯 하다.
seaborn의 시각화 테마를 설정해주었다.
아무 것도 입력하지 않으면 기본 설정 테마로 입력이 된다고 한다.
sns.set_theme()
이 테마 설정 명령어는 matplotlib rcParam 시스템을 사용한다고 한다.
즉, 이 명령어를 실행하는 순간, matplotlib을 사용하는 다른 모듈의 테마도 이렇게 설정된다는 것이다.
기본 설정 테마 값은 아래와 같다.
sns.set_theme(
context='notebook',
style='darkgrid',
palette='deep',
font='sans-serif',
font_scale=1,
color_codes=True,
rc=None,
)
튜닝의 끝은 순정이라 한다. 그러니, 다른 테마 설정이 하고 싶을 때 알아보도록 하자.
시각화 할 예제 데이터 셋을 불러왔다.
tips = sns.load_dataset('tips')
tips
참고로 load_dataset()은 온라인으로 예제 데이터 셋을 받아온다고 한다.
인터넷이 연결되어 있는 상태로 실행하도록 하자.
대부분의 예제 데이터는 pandas의 DataFrame이라고 한다.
그렇다고 Seaborn이 pandas의 DataFrame만 허용하는 것은 아니라고 말하고 있다.
Seaborn은 허용하는 데이터 구조에 대해 매우 유연하다고 한다.
예제 데이터를 시각화 해보았다.
sns.relplot(
data=tips,
x='total_bill',
y='tip',
col='time',
hue='smoker',
style='smoker',
size='size'
);
우선 간단히 플롯을 설명하자면,
Seaborn의 relplot() 함수를 Single Call을 사용하여, tips 데이터 셋 내 5개 변수의 관계를 보여주는 플롯이라고 한다.
지금은 플롯의 내용보다는, 어떻게 플롯을 그렸는가를 더 집중적으로 살펴보자. 굉장히 심플하다.
data는 tips를 사용한다.
x축은 total_bill이다.
y축은 tip이다.
column은 time이다.
hue는 smoker다.
style은 smoker다.
size는 size다.
A는 B다. 로 역할과 변수의 이름만 제공한 방법에 주목하자.
matplotlib도 비슷하게 설정하지만 색상, 마커 모양, 마커 사이즈 등등 을 하나씩 설정해주어야 한다.
해당 방법이 matplotlib으로 플롯을 그릴 때와는 다른 점이라 볼 수 있겠다.
이러한 시각화에 대한 설정(색상, 마커 모양, 마커 사이즈 등등)을
Seaborn이 DataFrame의 데이터를 matplotlib이 이해하는 인수로 변환하여 처리한다는 것이다.
그리고 이러한 점이 데이터 분석을 위한 시각화를 위한 matplotlib 제어를 벗어날 수 있도록 해주어,
본래 목표인 데이터 분석에 더 집중할 수 있도록 해준다고 한다.
Seaborn은 데이터 분석을 위한 플롯을 그리는 데 시간을 쓰는 것이 아닌,
그려진 플롯을 보고 의미하는 바가 무엇인가에 더 집중하는 것이 목표인 것 같다.
아무래도 Seaborn은 목표를 잘 달성한 듯하다.
출처 :
User guide and tutorial — seaborn 0.12.2 documentation
https://seaborn.pydata.org/tutorial.html
User guide and tutorial — seaborn 0.12.2 documentation
seaborn.pydata.org
Rich Outputs - IPython 8.9.0 documentation
https://ipython.readthedocs.io/en/stable/interactive/plotting.html
Rich Outputs — IPython 8.9.0 documentation
Important This documentation covers IPython versions 6.0 and higher. Beginning with version 6.0, IPython stopped supporting compatibility with Python versions lower than 3.3 including all versions of Python 2.7. If you are looking for an IPython version co
ipython.readthedocs.io
GitHub :
MoonsRainbow/seaborn-tutorial
https://github.com/MoonsRainbow/seaborn-tutorial
GitHub - MoonsRainbow/seaborn-tutorial: Seaborn User guide and tutorial 필사 코드입니다.
Seaborn User guide and tutorial 필사 코드입니다. Contribute to MoonsRainbow/seaborn-tutorial development by creating an account on GitHub.
github.com
'기술 공부 > Seaborn' 카테고리의 다른 글
6) Figure-level vs. axes-level functions (1) (0) | 2023.02.12 |
---|---|
5) Similar functions for similar tasks (0) | 2023.02.12 |
4) Opinionated defaults and flexible customization (0) | 2023.02.09 |
3) Multivariate views on complex datasets (0) | 2023.02.09 |
2) A high-level API for statistical graphics (0) | 2023.02.07 |