시각화 총 목차
1. 라이브러리 소개
2. 코드 한 줄로 만드는 시각화 보고서
3. 사용한 데이터셋
4. 가볍게 시작해보는 범주형 변수, 수치형 변수 시각화 예시
5. plot 종류 이해하기
6. 시각화 시 주의할 점
7. 퀴즈
데이터분석 공부를 시작할 시기에, 시각화에 대해 배웠던 내용을 정리 및 공부한 글입니다. 총 목차 중 파트5, plot 종류에 대해 소개합니다.
5. plot 종류 이해하기
seaborn 라이브러리를 기준으로 각 plot들이 어떻게 분류되는지, 특징은 무엇인지, 시각화 예시까지 알아봅시다. 데이터셋은 mpg 데이터셋을 사용합니다. mpg 데이터셋에서 수치형 변수는 mpg, horsepower, weight, acceleration이고, 범주형 변수는 origin, name입니다. 데이터타입은 int, float이지만, 범주형처럼 보는 변수는 model_year, cylinders입니다.
seaborn 라이브러리로 시각화를 할 때, 아래 도식화를 접하게 됩니다. 왜 relplot, displot, catplot과 하위의 plot들이 구별되어 있을까요? Figure-level function과 Axes-level function의 개념을 잡고 넘어가면, 그 이유를 이해하기 좋습니다.
Figure-level function은 seaborn의 FacetGrid라는 기능을 활용하여 자체적으로 시각화를 합니다. 여기서 FacetGrid라는 것은 여러 그래프를 한 번에 볼 수 있게 시각화 해주는 seaborn의 기능 중 하나입니다. Axes-level function은 matplotlib 기능(matplotlib.pyplot.Axes)을 활용하여 matplotlib 기반으로 생성된 축(axes)에 시각화를 합니다.
정리하자면, seaborn 라이브러리에 포함되어있는지, matplotlib 라이브러리에 포함되어 있는지의 차이입니다.
이것도 어렵다면, 그래프가 출력될 때 상단에 <seaborn.axisgrid.FacetGrid at ~이하 내용>가 출력되면 seaborn의 자체 기능인 Figure-level function을 사용했구나, <AxesSubplot: ~이하 내용>가 출력되면 matplotlib 기능을 사용한 Axes-level function 라고 가볍게 생각하고 넘어가면 좋습니다.
In addition to the different modules, there is a cross-cutting classification of seaborn functions as “axes-level” or “figure-level”. The examples above are axes-level functions. They plot data onto a single matplotlib.pyplot.Axes object, which is the return value of the function.
In contrast, figure-level functions interface with matplotlib through a seaborn object, usually a FacetGrid, that manages the figure. Each module has a single figure-level function, which offers a unitary interface to its various axes-level functions. The organization looks a bit like this:
5.1 Relational Plots
5.1.1 relplot
relplot는 relational plots의 줄인 표현으로 수치형 변수간의 상관관계를 비교할 때 사용합니다. relplot은 뒤에 나오는 lineplot과 scatterplot의 상위개념의 함수로, 해당 함수의 파라미터중 하나인 kind를 지정하여 lineplot과 scatterplot을 그릴 수 있습니다. 또한 Figure-level function이기 때문에 return값이 FacetGrid 입니다.
5.1.2 lineplot
lineplot은 두 변수의 관계를 선으로 표현하는 그래프입니다. lineplot에서 선은 추정 회귀선을 의미하고, 선 주변에 그림자는 신뢰구간을 의미합니다. lineplot은 변수간의 상관관계의 단순한 추정과 해당 추정의 신뢰구간을 볼 때 더 유용합니다.
5.1.3 scaterplot
scatter는 분산, 산포도라는 뜻으로 데이터가 얼마나, 어떻게 퍼져있나를 나타냅니다. 따라서 산점도라고도 불리우며, 점으로 두 수치형 변수의 관계를 표현하는 그래프입니다. lineplot과 달리 하나의 데이터를 하나의 점으로 표현하기 때문에 정확한 분포를 확인할 수 있습니다.
5.2 Distribution Plots
5.2.1 displot
Figure-level fuction으로 변수 하나 또는 두개의 분포를 시각화합니다. displot은 histplot, kdeplot, ecdfplot, rugplot의 상위 개념으로 kind나 rug라는 파라미터를 사용하여 원하는 plot을 지정하여 그릴 수 있습니다.
5.2.2 histplot
히스토그램(histogram)이라고도 불리는 histplot은 변수의 분포를 표현하기 위한 막대그래프의 한 종류입니다. 파라미터인 bins를 사용하면 몇개의 막대로 분할할지 정할 수 있습니다. 히스토그램의 bins가 존재함으로서 불연속성이 나타나기 때문에 완벽하게 정확한 분포를 확인하기에는 어려움이 있습니다.
5.2.3 kdeplot
kdeplot의 kde는 Kernel Density Estimation의 약자로 커널밀도추정 그래프를 의미합니다. kdeplot은 커널 함수를 이용하여 히스토그램의 단점이었던 불확실한 분포를 해결하여 분포의 추정값을 보여줍니다. kdeplot은 추정 분포를 선으로 표현한 그래프이기 때문에 히스토그램을 smoothing한 그래프라고 말할 수 있습니다. kill이라는 파라미터를 사용하게 된다면, 선 아래 범위를 채울 수 있습니다.
5.2.4 ecdfplot
ecdf는 empirical cumulative distribution function의 약자로, ecdfplot은 경험적 누적분포함수 그래프입니다. ecdfplot은 선으로 표현된 plot으로 이름 그대로 누적이 되기 때문에 x값이 증가함에 따라 y값도 무조건적으로 증가하며, 계단의 형태를 띄고 있습니다. 기본적으로 y값은 누적비율이 초기값이지만 stat이라는 파라미터를 이용하여 누적개수값으로 변경 가능합니다.
5.2.5 rugplot
rugplot은 모든 데이터 포인트를 축 위에 작은 선분(rug)으로 나타낸 그래프입니다. 데이터의 분포를 선분의 빼곡한 정도로 나타냅니다. 만약 값이 같은 여러개의 데이터가 존재하게 된다면 선분이 겹쳐져서 보이기 때문에 정확한 분포정도를 파악하기에는 큰 어려움이 있습니다. displot으로 rugplot을 그리기 위해서는 kind 파라미터가 아닌 rug를 True로 설정하여 그릴 수 있습니다.
5.2.6 distplot
distplot은 deprecated(중요도가 떨어져 더 이상 사용되지 않고, 사라지게 될)기능입니다. histplot이나 displot과 비슷한 기능을 가지고 있습니다.
5.3 Categorical Plots
5.3.1 catplot
범주형 또는 수치형 변수의 관계를 시각화합니다. catplot은 Figure-level function의 한 종류이기 때문에 kind라는 파라미터에 ‘strip’, ‘swarm’, ‘box’ 등을 지정하면 해당 그래프를 자유롭게 그릴 수 있습니다.
5.3.2 stripplot
stripplot은 쉽게 말해 점그래프로, 데이터의 실제 위치를 점으로 표현한 그래프입니다. 따라서 데이터의 실제 위치를 시각화하여 보여주기에 적합합니다. stripplot은 scatterplot의 단점을 보완한 그래프입니다.
5.3.3 swarmplot
swarmplot은 stripplot과 같은 점그래프의 한종류이지만 점 사이의 간격을 조정하여 보여주는 그래프입니다. swarmplot은 데이터 포인트들이 많아지면 점들이 겹쳐진다는 stripplot의 단점을 자료를 흩트려서(jittering) 보여줌으로서 보완한 그래프입니다.
5.3.4 boxplot
boxplot은 다섯 수치 요약(five number summary)을 기반으로 하는 그래프입니다. 뒤에 나오는 pointplot과 barplot의 경우에는 평균값만 보여주기 때문에 데이터의 분포나, 중앙값, 최소값, 최대값등을 한눈에 보기 어렵습니다. 따라서 정확한 중요 수치와 분포를 보여주는데에 목적을 가진다면 boxplot이나 비슷한 그래프인 violinplot, boxenplot을 추천합니다. boxplot의 이름은 그래프가 박스의 형태를 하고 있어 붙어진 이름입니다.
5.3.5 violinplot
violinplot이란 이름은 그래프가 바이올린의 형태를 띄고 있어 붙어진 이름입니다. violinplot은 boxplot과 커널 밀도 곡선(Kernel Density Curve)을 합친 그래프로 쉽게 말해 boxplot과 kdeplot을 합친 그래프라고 할 수 있습니다. 따라서, boxplot에서 보여주지 못했던 추정분포를 정확하게 보여줄 수 있다는 장점을 가지고 있습니다. 만약에 정확한 분포를 확인하고 싶다면 violinplot을 사용하는 것을 추천합니다.
5.3.6 boxenplot
boxenplot은 boxplot과 유사하나 boxplot보다는 데이터의 분포를 자세히 보여주는 그래프입니다. boxenplot은 boxplot과 히스토그램이 합쳐진 그래프이기 때문에 boxplot보다는 자세한 분포를 보여줄 수 있지만 kdeplot과 boxplot이 합쳐진 violinplot보다는 덜 정확한 추정 분포를 보여줍니다.
5.3.7 pointplot
pointplot은 범주형 변수의 평균값(중심 경향의 추정치)을 점으로 표시하고, 오차 막대를 사용하여 해당 추정치 주변의 불확실성에 대한 일부 표시를 제공하는 그래프입니다. 하나 이상의 범주형 변수를 비교하는 데에 있어 유용한 그래프입니다.
5.3.8 barplot
barplot은 흔히 알려진 막대그래프로, 직사각형의 막대의 높이를 이용하여 숫자 변수의 중심 경향 추정치를 나타내고 오차막대를 이용하여 해당 추정치 주변의 불확실성을 표시한 그래프입니다.
5.3.9 countplot
countplot은 범주형 변수의 개수를 세어 직사각형의 막대의 높이로 표현한 그래프입니다. countplot에는 y나 x 파라미터중 하나에만 변수명을 입력해야 그래프를 생성할 수 있습니다.
5.4 Regression
5.4.1 lmplot
회귀 시각화에 사용하는 그래프입니다. 두 연속형 수치변수나 연속성, 비연속성 수치변수 등을 시각화합니다. regplot의 상위호환 그래프로 Figure-level fuction이기 때문에 조건을 넣어 여러개의 그래프를 함께 그릴 수 있습니다.
5.4.2 regplot
regplot은 scatterplot과 lineplot을 합친 그래프입니다. regplot에서 lineplot은 scatterplot의 경향성을 예측하는 추정선입니다.
5.4.3 residplot
residplot은 회귀선을 기준으로 데이터들의 잔차(residual, 오차)를 시각화한 그래프입니다. regplot과 형태는 유사하며 단지 regplot의 회귀선을 x=0으로 가정하여 기울인 형태를 띕니다.
5.5 Matrix
상관계수를 시각화하거나, 결측치값을 확인할 때 사용합니다. 군집화가 되어있지 않은 상태로 heatmap을 시각화하게 된다면, 뚜렷한 패턴이 보이지 않아 유의미한 결과를 도출해내기 어렵습니다. 군집화가 필요한 데이터의 경우에는 clustermap을 사용하고 그렇지 않을 경우에는 heatmap을 사용합니다.
5.5.1 heatmap
heatmap은 색상으로 표현할 수 있는 다양한 정보를 일정한 이미지위에 열분포 형태로 표현한 시각화입니다.
5.5.2 clustermap
행렬 데이터를 계층적으로 군집화(clustering)된 heatmap으로 시각화한 맵입니다. 쉽게 말해 여러개의 군집에 대한 heatmap으로 이루어진 시각화입니다. clustermap의 안쪽 사각형은 heatmap이며 보통 옆에 legend가 있어 색농도에 따른 데이터의 수치를 알아볼 수 있습니다.
5.6 Grids
5.6.1 FacetGrid
FacetGrid는 subplot을 생성하며 figure-level function들도 사용할 수 있다는 특징을 가지고 있습니다. 앞서 figure-level function에 대해 설명하였듯, 변수의 범주에 따려 여러 그래프를 그릴 수 있습니다.
5.6.2 PairGrid / pairplot
3차원이상의 데이터라면 pairplot을 이용하여 각 데이터 열에 대한 scatterplot을 그려주고 같은 열이 만나는 부분은 해당 열에 대한 히스토그램을 그려줍니다. pairplot의 이름에서 알 수 있듯, 변수끼리 짝(pair)를 이뤄 변수간의 상관관계를 보여줍니다. 반면, PairGrid는 이름에서 알 수 있듯 그리드를 생성하는 함수입니다. seaborn에 있는 PairGrid의 기능들을 활용해 scatterplot과 히스토그램 이외의 다양한 plot들로 그리드를 구성을 할 수 있습니다.
5.6.3 JointGrid / jointplot
jointplot은 두 변수에 대한 두, 세가지 종류의 시각화가 합쳐진(joint된) 그래프입니다. 중앙에 들어가는 그래프는 scatterplot으로 두 변수의 상관관계를 보여주고, 상단과 우측에 있는 marginal plot에는 각 변수의 히스토그램을 그려줍니다. JointGrid는 중앙그래프와 두개의 marginal plot이 빈칸으로 되어있는 그리드를 생성하는 함수입니다. seaborn에 있는 JointGrid 함수를 사용하면, jointplot에서 기본 설정으로 들어가는 scatterplot과 히스토그램을 대신해 사용자가 변수들에 적합한 그래프를 지정할 수 있습니다.
Reference
plot 설명 공동집필
1. AIS7 박조은 강사님 강의
2. 시각화 라이브러리
라이브러리 종류별 시각화 : https://zzsza.github.io/development/2018/08/24/data-visualization-in-python/
판다스 시각화 : https://wikidocs.net/159927
3. 라이브러리 개념 및 API 공식 사이트
4. 시각화 보고서
https://github.com/ydataai/pandas-profiling
https://github.com/fbdesignpro/sweetviz
https://github.com/AutoViML/AutoViz
5. 데이터셋 설명
앤스컴콰르텟1 : https://seaborn.pydata.org/examples/anscombes_quartet.html
앤스컴콰르텟2 : https://ko.wikipedia.org/wiki/앤스컴_콰르텟
6. 시각화 parameter
barplot : https://seaborn.pydata.org/generated/seaborn.barplot.html
errorbar : https://seaborn.pydata.org/tutorial/error_bars.html
seaborn plot 별 설명 : https://seaborn.pydata.org/tutorial.html
boxplot 개념 설명 : https://ko.wikipedia.org/wiki/상자_수염_그림
댓글