본문 바로가기

AI

[Python Data Visualization] Seaborn 사용법

코세라 머신러닝 강의를 다 듣고 실제로 데이터에 적용시켜보고 싶어서 캐글에 도전하게 되었다

 

캐글 python data visualizaion course에서 알게된 seaborn library의 사용법을 정리해보려고 한다

한번 정리해서 두고두고 찾아봐야지

 

www.seaborn.pydata.org

matplotlib를 기반으로 하는 Seaborn 라이브러리는 matplotlib을 많이 사용해보지는 않았지만 matplotlib에 비해 사용법이 훨씬 간단하다고 느꼈다

 

Visualizing Statistical Relationships

 

데이터 셋의 값들이 서로 어떤 영향을 끼치고 의존하는가에 대한 분석을 위해 필요한 api

relplot() 함수를 가장 많이 쓴다

relplot 함수는 인자로 kind를 가지는데 이 인자에 의해 scatter plot, line plot이 결정된다

scatter plot이 default

 

relplot에 kind 인자를 주어서 나타내는 것 이외에도 scatterplot, lineplot 함수를 바로 사용해도 괜찮은데 FacetGrid에는 relplot이 더 유리하다고 한다

데이터 시각화에 익숙해지는 단계니까 그냥 간단하게 써야지

 

1. scatter plot

 

산점도를 나타내어주는 함수!

x,y,hue,size,style,data 등 다양한 인자들이 존재한다

자주 쓰일 것 같은 인자들만 살펴보았다

 

먼저 x,y에 넣어주는 값들은 numeric 해야하고 데이터를 바로 넘겨주어도 되고 data 인자에 넣어준 값에서 reference column을 이용할 수도 있다

hue에 들어가는 값은 numeric 해도 괜찮고 categorical 해도 괜찮다, 어차피 다른 색으로 분류가 된다

data에는 당연히 데이터 값이 들어간다

 

캐글의 당뇨병에 관련된 데이터를 이용해보았다

1
2
3
4
5
6
7
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
 
import matplotlib.pyplot as plt
import seaborn as sns
 
diabetes_data = pd.read_csv('/kaggle/input/diabetes/diabetes.csv')
diabetes_data.head()
cs

데이터에 어떠한 feature들이 있는지 살펴 보았다

 

인슐린과 글루코스의 관계, 나이와 혈압의 관계를 산점도로 살펴보고자 한다

1
sns.scatterplot(x=diabetes_data['Insulin'],y=diabetes_data['Glucose'])
cs

scatterplot을 이용하여 x축에 인슐린 y축에 글루코스 값을 넣어주었다

인슐린과 글루코스 값이 관계가 있는듯 없는듯..ㅎㅎ

두 변수의 상관관계를 한눈에 보기 좋다

 

1
sns.regplot(x=diabetes_data['Insulin'],y=diabetes_data['Glucose'])
cs

 

이러한 함수를 사용하면 이렇게 선형회귀 적합선 또한 포함시킬수 있다

인슐린과 글루코스가 정비례하긴 하나보다! 

이번에는 나이와 혈압의 관계를 나타내어 보았다

hue 조건에 outcome, 즉 당뇨병의 여부를 넣어주어 산점도에서 구분해주었다

1
sns.scatterplot(x=diabetes_data['Age'],y=diabetes_data['BloodPressure'],hue=diabetes_data['Outcome'])
cs

당뇨병이 있는 사람과 없는사람이 색깔로 구분된다

 

2. line plot

 

아보카도 판매와 관련된 데이터를 사용해 보았다

1
2
3
avocado_data = pd.read_csv('/kaggle/input/avocado-prices/avocado.csv')
avocado_data = avocado_data.tail(20)
avocado_data.describe()
cs

몇개만 살펴보자면

이러한 feature들을 가지고 있었다

 

시간에 따른 아보카도 가격의 변화를 선도표를 이용하여 알아보았다

1
sns.lineplot(x=avocado_data['Date'],y=avocado_data['AveragePrice'],data=avocado_data)
cs

아무래도 아보카도 가격의 변화폭보다 날짜가 많을 것 같아 가로로 긴 이미지를 만들어주었다

그리고 lineplot 함수에 날짜와 가격을 지정해주었다

 

각 날짜의 길이가 길어서 겹친다ㅠㅠ

그리고 에러를 나타내는 부분이 생겼는데 같은 날짜에 중복되는 값들이 들어갔나보다

err_style='bars'로 지정해주면 에러가 이렇게 다른 형태로 나타난다

한 날짜에 여러 값이 들어간 이유를 알아내기 위해 데이터를 살펴본 결과 region별로 같은 날짜의 데이터가 들어간 경우가 있었다

1
sns.lineplot(x=avocado_data['Date'],y=avocado_data['AveragePrice'],data=avocado_data,hue='region')
cs

이렇게 region을 구분해주면 중복된 값이 들어가지 않았다

 

Plotting with categorical data

 

scatter points, distribution, estimate의 세가지 틀로 크게 나뉘어지었다

각 항목별로 한가지 함수를 사용해보았다

 

1.  stripplot

 

이번에는 구글 플레이스토어의 데이터를 사용해보았다

 

1
2
app_data = pd.read_csv('/kaggle/input/google-play-store-apps/googleplaystore.csv').head(100)
sns.stripplot(x=app_data['Rating'],data=app_data)
cs

 

stripplot으로 별점을 나타내면 다음과 같다

 

별점의 분포를 알아볼 수 있었다

 

그 다음 목표였던 카테고리 별 분류를 해보았다

 

예시를 앞에 100개만 가져왔더니 약간 이상한 모습이 되었지만 카테고리별 별점또한 한눈에 파악할 수 있었다

 

2. violinplot

 

같은 인자를 바이올린 플롯으로 나누어보면 다음과 같은 모양!

 

3. countplot

 

count plot은 히스토그램과 비슷한 모양!

 

아직 어떤 함수를 어떤 상황에서 쓰는게 가장 효율적인지는 체감이 안되지만

내가 알고싶은 경향성들을 어떻게 파악할 수 있을지는 알것같다

실제 데이터를 적용하는것은 당연히 훨씬 복잡하겠지만 차근차근 해봐야겠다