잘잔디 2023. 5. 2. 11:42

폰트 적용

# 설치한 폰트 설정 저 파일 위치의 폰트들을 확인해서 긁어옴.
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib.font_manager as font_manager
# Add every font at the specified location
font_dir = ['C:\\\\Chang_git\\\\python_basic\\\\fonts']
for font in font_manager.findSystemFonts(fontpaths=font_dir):
    print(mpl.font_manager.FontProperties(fname=font).get_name())
    font_manager.fontManager.addfont(font)
# Set font family globally
mpl.rcParams['font.family'] = 'LINE Seed Sans KR'
print(mpl.rcParams['font.family'])
mpl.rcParams['axes.unicode_minus'] = False

Seaborn이란

  • Matplotlib을 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지 인다.
  • 시각화 기능은 Matplotlib 패키지에 의존하며
  • 통계 기능은 Statsmodels 패키지에 의존한다.

카운트 플롯

  • countplot()을 사용하면 각 카테고리 값마다의 데이터가 얼마나 있는지 표시할 수 있다.
  • value_counts()를 보듯이 각 유니크한 값들이 몇 개씩 있는지 시각적으로 확인 가능
  • 카운트 플롯은 카테고리별 히스토그램이라 볼 수 있다.
  • API 옵션은 바차트와 동일(모양도 바차트와 동일)

테마를 활용해서 스타일 적용하기

  • set_theme()는 global 범위의 테마를 적용해서 그래프를 쉽게 꾸밀 수 있다.
  • style과 palette 키워드 인수를 활용해서 그 값을 설정한다.
    • style = darkgrid, whitegrid, dark, white, ticks,…
    • palette = pastel, husl, spectral, flasre, …
  • set_context()의 인수로 paper, notebook, talk , poster 중 하나를 넣으면 해당하는 설정을 세팅할 수 있다.
import seaborn as sns
sns.set_theme(style = 'whitegrid')
sns.set_context('paper')
df = sns.load_dataset('titanic')
sns.countplot(x = df['class']) # x 키워드 인수에 Series 값을 전달한다.
df

survived pclass sex age sibsp parch fare embarked class who adult_male deck embark_town alive alone

0 0 3 male 22.0 1 0 7.2500 S Third man True NaN Southampton no False
1 1 1 female 38.0 1 0 71.2833 C First woman False C Cherbourg yes False
2 1 3 female 26.0 0 0 7.9250 S Third woman False NaN Southampton yes True
3 1 1 female 35.0 1 0 53.1000 S First woman False C Southampton yes False
4 0 3 male 35.0 0 0 8.0500 S Third man True NaN Southampton no True
886 0 2 male 27.0 0 0 13.0000 S Second man True NaN Southampton no True
887 1 1 female 19.0 0 0 30.0000 S First woman False B Southampton yes True
888 0 3 female NaN 1 2 23.4500 S Third woman False NaN Southampton no False
889 1 1 male 26.0 0 0 30.0000 C First man True C Cherbourg yes True
890 0 3 male 32.0 0 0 7.7500 Q Third man True NaN Queenstown no True

891 rows × 15 columns

  • hue 키워드 인수를 활용해서 분류할 두 번째 변수를 설정할 수 있다.
  • data 키워드 인수에 DataFrame을 전달하고, x 키워드 인수에 DataFrame 중 매칭하고 싶은 column의 name을 전달한다.
# groupby
sns.countplot(data = df , x = 'class',hue='alive') 
# data영역에 titanic 자체를 넣고 x 에 column 정보를 담아도 된다.
# alive column을 두 번째 변수로 지정하여 선실별 생존 여부를 가시적으로 확인할 수 있도록 돕는다.

  • 플롯을 수평하게 작성할 수도 있다.
  • y 키워드 인수에 data로 넘긴 DataFrame의 column name 값을 전달하면 된다.
sns.countplot(data = df , y = 'class',hue='alive')

tips 데이터셋

tips = sns.load_dataset('tips')
tips.head()

total_bill tip sex smoker day time size

0 16.99 1.01 Female No Sun Dinner 2
1 10.34 1.66 Male No Sun Dinner 3
2 21.01 3.50 Male No Sun Dinner 3
3 23.68 3.31 Male No Sun Dinner 2
4 24.59 3.61 Female No Sun Dinner 4

러그 플롯

  • 데이터 위치를 x 축 위에 작은 선분(rug)으로 나타내어 실제 데이터들의 위치를 보여준다(촘촘할수록 데이터 밀집되어 있음을 알 수 있음.)
  • 커널 밀도는 커널이라는 함수를 겹치는 방법으로 히스토그램보다 부드러운 형태의 분포 곡선을 보여주는 방법이다.
sns.kdeplot(data=tips,x='total_bill') # 위에 파란선 (밀도를 보기 유리함) = kernel density = kde
sns.rugplot(data=tips,x='total_bill') # 밑에 주황색점 (밀도를 볼 수 있음.)

  • scatterplot을 사용해서 y에 tip에 대한 column name을 넣어주어서 전체 금액 대비 tip의 비용이 얼마인지 볼 수 있다.
  • (x, y를 부여해서 점형태로 분포를 볼 수 있다.)
sns.scatterplot(data=tips,x='total_bill',y= 'tip', hue= 'time')
sns.rugplot(data=tips,x='total_bill', y = 'tip', hue = 'time')
​

  • hue 속성에 추가 값을(time column) 넣어서 식사시간 별로 추가 분류(색으로) 하여 가시적으로 보임
sns.scatterplot(data=tips,x='total_bill',y= 'tip', hue= 'time')
sns.rugplot(data=tips,x='total_bill', y = 'tip',hue='time',height = .1) 
# rugplot의 크기를 조절하기 위해 height 키워드를 사용가능하다. 0.1 = 전체 그래프 10%

diamonds = sns.load_dataset('diamonds')
sns.scatterplot(data=diamonds, x = 'carat', y='price',s=5)
sns.rugplot(data=diamonds,x = 'carat',y = 'price', lw=1, alpha=.005) # 투명도를 많이줘서 얼마나 밀집되어있는지 표현이 가능하다(많이 겹쳐야 본래의 색이 보이기 때문)

히스토그램

  • 1차원 혹은 2차원 데이터를 구간별로 보는데 유용하다
penguins = sns.load_dataset('penguins')
penguins.info() # info로 전체 데이터 조회 가능

histplot() x축 기준

  • x 키워드 인수로 columns label 값을 전달한다.
  • 좌측 y축은 개수를 표현하고 있다.
sns.histplot(data = penguins, x = 'flipper_length_mm') # 하지만 이정도 분류로는 파악이 어렵다.

histplot() y축 기준

  • x 키워드 인수를 y 키워드 인수로 변경하여 표현 가능
sns.histplot(data = penguins, y = 'flipper_length_mm')

  • binwidth 키워드 인수를 사용해서 bin(막대한칸)의 너비를 지정할 수 있다.
sns.histplot(data = penguins,x = 'flipper_length_mm',binwidth=3) # x축의 너비를 3씩나눔

  • bins 키워드 인수를 사용해서 bin의 개수(막대의 개수)를 지정할 수도 있다.
sns.histplot(data = penguins,x = 'flipper_length_mm',bins = 30)

histplot() kde를 동시에 표시하기

  • kde 키워드 인수를 True로 바꿔줌으로써 함수를 겹치는 방법으로 히스토그램보다 부드러운 형태의 분포 곡선을 보여준다.
sns.histplot(data=penguins,x = 'flipper_length_mm',kde=True)

histplot() hue 키워드 인수로 데이터 분리하기

  • hue 키워드 인수에 분류 기준이 될 column label을 전달해서 여러 개의 히스토그램을 합친 것과 같은 결과의 그래프를 얻을 수 있다.
  • 기본설정상으로는 값들이 overlab 되어 보인다.
sns.histplot(data=penguins,x = 'flipper_length_mm',hue='species') # 좀 더 보기 명확해졌다.

stack을 사용한 표현법

  • 각 히스토그램의 layer가 겹친다면 이를 누적하듯 표현하는 방법도 있다
sns.histplot(data=penguins,x = 'flipper_length_mm',hue='species',multiple = 'stack')

element 키워드 인수에 step을 활용한 표현법

  • 하나의 도형 형태로 윤곽선만 따서 보여준다.
  • elements 키워드 인수에 ’step’이란 값을 전달하여 shape에 치중하여 더 잘 보이도록 할 수 있다.
sns.histplot(data=penguins,x = 'flipper_length_mm',hue='species',element = 'step')

element 키워드 인수에 poly을 활용한 표현법

  • element 인자에 ‘poly’ 값을 전달하면 다각형 모양으로 표현된다.
sns.histplot(data=penguins,x = 'flipper_length_mm',hue='species',element= 'poly')

histogram의 heatmap

  • x, y 축에 모두 column을 할당할 경우 만들어지는 형태이다.
sns.histplot(data=penguins,x = 'bill_depth_mm',y= 'body_mass_g',hue='species') # 진할수록 데이터가 더 겹친다는 의미.

  • 카테고리화되어있는 값들이 인자의 값으로 들어가면 좀 더 보기 편한 heat map이 된다.
  • x, y 축 column을 할당할 때 그중 하나의 값이 이산 된 값이라면 아래와 같이 데이터를 시각화하여 표현하면 이해하기 좋다.
sns.histplot(data=penguins,x = 'bill_depth_mm',y= 'species',hue='species',legend = False)  #

히스토그램 - displot()

  • 1,2차원 데이터의 분포를 히스토그램으로 보여준다.
  • 다만 rug와 kde에 대해 동시에 표현이 가능해서 표현 범위가 더 넓고 더 많이 사용된다.
sns.displot(data=penguins, x = 'flipper_length_mm') # histplot()과 동일한 인수와 그래프 모양을 보인다.

displot()에서 kde 표현하기

  • kind 키워드 인수를 활용해서 히스토그램 종류를 kde로 변경 가능하다.(부드러운 곡선형태)
sns.displot(data=penguins, x = 'flipper_length_mm',kind= 'kde')

displt() ecdf로 표현하기

  • kind 키워드 인수에 ecdf를 활용해서 누적 분포 그래프로 표현 가능하다.
sns.displot(data=penguins, x = 'flipper_length_mm',kind= 'ecdf')

 

displot() 히스토그램과 kde 동시에 표현하기

  • kde 키워드 인수 값을 True로 전달하면 히스토그램 와 kde를 동시에 표현 가능하다.
sns.displot(data=penguins, x = 'flipper_length_mm',kde = True)

displot() heatmap

  • 마찬가지로 x, y에 각각 값을 할당하여 히트맵 형태로 그래프를 출력할 수 있다.
sns.displot(data=penguins, x = 'flipper_length_mm',y = 'bill_length_mm',hue = 'species')

displot() 2 개의 값을 kde로 표현하기

  • x, y축 모두 할당한 앞의 히스토그램을 kde로도 표현 가능하다.
  • 또한 rug = True 키워드 인수를 전달해서 rug에 대한 표현도 동시에 가능하다.
sns.displot(data=penguins, x = 'flipper_length_mm',y = 'bill_length_mm',kind = 'kde',rug=True) # 안쪽 영역일수록 더 밀도가 높다는 뜻.