barplot
x와 hue를 카테고리화해서 body_mass_g 값의 평균과 신뢰구간(confidence intervals)을 구해서 바 플롯으로 표현하고 있습니다.
df = sns.load_dataset('penguins')
sns.barplot(data = df, x = 'species', y = 'body_mass_g', hue = 'sex')
box plot
박스-휘스커 플롯(Box-Whisker Plot) 혹은 간단히 박스플롯이라 부릅니다. 박스 플롯은 박스와 박스 바깥의 선(whisker)으로 이루어집니다.
박스는 실수 값 분포에서 1사분위수(Q1)와 3사분위수(Q3)를 뜻합니다. 이 3사분위수와 1사분위수의 차이(Q3 - Q1)를 IQR(Interquartile range)라고 합니다. 박스 내부의 가로선은 중앙값을 나타냅니다. 박스 외부의 세로선은 1사분위 수보다 1.5 x IQR만큼 낮은 값과 3사분위 수보다 1.5 x IQR만큼 높은 값의 구간을 기준으로 그 구간의 내부에 있는 가장 큰 데이터와 가장 작은 데이터를 잇는 선분입니다.
그 바깥의 점은 아웃라이어(outlier)라고 부르는데 일일히 점으로 표시합니다.
아래 예제에서는 boxplot() 메서드에 x값으로 Series만을 전달하고 있습니다. 이 결과로 하나의 box plot을 수평하게 그렸습니다.
타이타닉호에 탑승한 사람들의 나이(age)에 대한 4분위를 그래프로 표현합니다.
df = sns.load_dataset('titanic')
sns.boxplot(x = df['age'])
타이타닉호의 데이터셋 중 class column의 Dtype은 카테고리입니다. 이 카테고리화 된 column을 하나의 분류 값으로 추가하기 위해서 y 키워드 인수로 설정했습니다. 이렇게하면 y축을 기준으로 카테고리별 box plot을 unique한 value 개수만큼 나눠서 얻을 수 있습니다.
sns.boxplot(data = df, x = 'age', y = 'class')
x에 할당한 값에 대한 분포를 구하는데, y와 hue에 전달된 column을 기준으로 그룹화한 결과를 박스 플롯으로 그리고 있습니다.
sns.boxplot(data = df, x = 'age', y = 'class', hue = 'alive')
box plot을 그렸는데 여러개로 출력된 그래프의 순서가 맘에 들지 않는 경우가 있을 수 있습니다. 그 때는 order 키워드 인수를 사용하면 됩니다. order 키워드 인수로 전달할 값을 리스트의 형태로 작성하면 되는데, 원하는 차례로 ticklabel을 적으면 됩니다.
sns.boxplot(data = df, x = 'fare', y = 'alive', order = ['yes', 'no'])
수치값을 갖는 column 여럿을 동시에 하나의 box plot에 표현할 수 있습니다. data 키워드 인수로 DataFrame을 전달할 때 그래프로 표현하고 싶은 수치 값을 갖는 column들을 인덱싱해서 DataFrame 형태로 전달하면 됩니다.
또 box plot의 방향을 바꾸고 싶으면 orient 키워드 인수에 h(수평), v(수직) 값을 줘서 설정하면 됩니다.
sns.boxplot(data = df[['age','fare']], orient = 'v')
violinplot()
box plot과 kde(커널밀도함수) 둘을 콤비네이션한 그래프입니다. 그런데 마치 그 생김새가 바이올린 같다하여 violin plot이라고 불립니다. 세로 방향으로 kde의 모양을 그리는데 kde가 좌우 대칭되게 그려집니다.
그 규칙은 box and whisker plot과 비슷합니다. 하나 이상의 카테고리 column을 가지고 데이터의 분포를 나란히 그립니다. 그래서 그 그래프들의 분포를 비교하기에 적합합니다. 샘플 사이즈에 따라 분포에 영향이 있을 수 있으므로 그 점을 참고해서 사용해야합니다.
violinplot() 메서드에 x 키워드 인수만 값을 Series로 할당하여 violin plot을 그렸습니다. Series 값으로 그래프를 그리면 기본적으로 수평방향의 그래프를 그립니다.
df = sns.load_dataset('titanic')
sns.violinplot(x = df['age'])
카테고리 Dtype을 갖는 class colum을 활용하여 y축의 값으로 설정했습니다. 그렇게하면 각 카테고리마다 갖는 데이터 분포를 y축을 기준으로 하여 분리해서 그릴 수 있습니다. x축에 수평하게 그래프를 그려내고 있습니다.
df = sns.load_dataset('titanic')
sns.violinplot(data = df, x = 'age', y = 'class')
x 키워드 인수에 카테고리 자료형을 설정하고 있습니다. 이에 따라 violin plot의 방향이 vertical하게 변경된 것을 확인할 수 있습니다.
sns.violinplot(data = df, x = 'class', y = 'age', hue = 'alive')
violin의 그래프가 hue에 설정한 alive column의 값에 따라 좌측, 우측 각각 분포를 그려내고 있습니다. split 키워드 인수에 True 값을 전달하는 조건으로 hue에 설정된 값의 level이 단 두개여야합니다. 즉 현재 hue에 설정된 alive가 갖는 값이 'yes'와 'no' 단 두개이기 때문에 spliit 키워드 인수에 True 설정을 할 수 있는 것입니다.
sns.violinplot(data = df, x = 'deck', y = 'age', hue = 'alive', split = True)
만약 hue의 level이 정확히 2개가 아니라면 어떤 결과가 나올까요?
실행조차 되지 않고 ValueError를 반환합니다. split 키워드 인수의 값을 True로 하고 싶다면 반드시 hue에 오는 column의 값이 단 2가지만으로 분류되어야합니다.
violin plot을 표현할 때 범위를 제한할 수 있습니다. 타이타닉 호 데이터셋에서 나이(age)의 경우에 0미만의 범위에 대해 그래프가 표현될 수 있습니다. 나이의 데이터 특성상 음수는 있을 수 없기 때문에 이런 표현은 바람직하지 않습니다.
값의 표현 범위를 명확히 하기 위해서 cut이라는 키워드 인수를 사용할 수 있습니다. cut 키워드 인수에 0 값을 작성하면 가지고 있는 데이터의 범위를 초과해서 그래프가 표현되지 않습니다. 0 이외의 실수 값을 입력하면 대역폭(bandwidth)의 크기가 됩니다.
sns.violinplot(data =df, x = 'age', y = 'alive', cut = 0)
kde의 그래프 모양을 부드럽게 처리하다보면 대역폭의 크기가 커집니다. 이를 줄이기위해선 bw(bandwidth) 키워드 인수에 소수 값을 가지는 비율을 설정해주면 됩니다.
sns.violinplot(data = df, x = 'age', y ='alive', bw = .15)
violin plot 내부에 데이터의 분포를 직접적으로 표현할 수도 있습니다. inner 키워드 인수에 stick이란 값을 전달하면 됩니다. 아래의 예제를 보면 inner 키워드 인수에 stick이란 값을 전달하여 데이터의 분포를 그래프 안에 표현했습니다.
sns.violinplot(data = df, x = 'age', y ='embark_town', inner = 'stick')
scale에 따라 각 그래프의 크기가 달라집니다. scale은 총 area, count, width의 값을 지정할 수 있으며 기본값은 area입니다.
area는 violin의 영역 너비가 같게 그려집니다. count는 실제 갖는 데이터 개수에 따라 그 violin의 크기가 달라집니다.
width는 violin이 동일한 폭을 갖게 됩니다.
sns.violinplot(data = df, x = 'age', y ='embark_town', scale = 'count', inner = 'stick')
'데이터 분석 및 시각화 > 데이터 시각화' 카테고리의 다른 글
[Python] folium (0) | 2023.01.31 |
---|---|
[Python] Seaborn(stripplot, swarmplot, catplot, jointplot, pairplot, Pandas pivot table), Pandas Pivot table (0) | 2023.01.27 |
[Python] Seaborn(style 세팅, 카운트 플롯, 히스토그램(displot)) (0) | 2023.01.26 |
[Python] matplotlib - 차트 (0) | 2023.01.26 |
[Python] Matplotlib - 폰트 설정법 (0) | 2023.01.26 |