Seaborn 모듈을 사용하면 단순히 Matplotlib 하나만 사용할 때 보다 더 편하게 차트를 그릴 수 있다.

즉, Matplolib 시각화 차트 그리기를 Seaborn이 쉽게 그릴 수 있도록 도와준다.

예제를 통해 따라가보자.

 

1. 필요 모듈 복붙하기

import matplotlib.pyplot as plt
from matplotlib import rc
import seaborn as sns
%matplotlib inline

rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

 

 

2. 판다스로 데이터 불러오기

import pandas as pd

csData = pd.read_csv("../exampleCode/dataset/customerdata.csv")
csData.head(10)

 

3.1 카운트 차트 (countplot) : 특정 컬럼을 기준으로 불연속적인 '데이터의 빈도수' 분포를 확인

sns.countplot(data = csData, x="EMI")    # EMI : 무이자 할부 건수

csData에서 "EMI"를 count해서 보여준다.

 

sns.countplot(data = csData, x="EMI", hue = "CUSTTYPE")

hue 옵션을 통해 "EMI"를 좀 더 세분화 해서 보여준다. 즉, 위에 차트에서 각각의 "EMI" 1, 2, 3을 "CUSTTYPE"으로 한 번 더 세분화 하는 것이다. (hue : x축의 값을 해당 옵션으로 세분화한다.)

 

3.2 히스토그램 (distplot) : 특정 컬럼을 기준으로 연속적인 '데이터의 빈도수' 를 linear 혹은 구간별로 분포를 확인

figure = plt.figure(figsize=(18,6))

ax1 = plt.subplot(1,2,1)
sns.distplot(csData.AVGPRICE, kde = True, hist = False, ax=ax1)
ax2 = plt.subplot(1,2,2)
sns.distplot(csData.AVGPRICE, ax=ax2)    # 기본값은 kde(선) True, hist(막대) True

kde을 표현해주고, hist막대를 표현해준다. 기본값을 둘 다 'True'이기 때문에 하나만 보고 싶다면 둘 중 하나를 'False'로 줘야 한다.

 

3.3 바 차트 (bar plot) : 하나의 컬럼을 기준으로 다른 변수의 평균을 그래프로 표현

카운트 차트에서는 x와 y의 상관 관계를 보는 것이 아니고, x축으로 설정한 값들의 개수를 세는 것(count)이었기 때문에 y축을 지정할 수 없었지만 바 차트에서는 x와 y의 상관 관계를 보는 것이기 때문에 x축과 y축을 모두 정한다.

sns.barplot(x = 'EMI', y = 'AVGPRICE', data = csData, ci = 'sd')

ci : Confidence Interval (신뢰구간)
sd : sample standard deviation (표본표준편차) 로 95% 신뢰구간을 나타낸다.

 

마찬가지로 바 차트도 'hue' 옵션을 사용하여 세분화 할 수 있다.

sns.barplot(x = 'EMI', y = 'AVGPRICE', data = csData, hue = 'CUSTTYPE', ci = 'sd')

 

 

3.4 박스 차트 (boxplot) : 정해진 기준에 따라 변수의 분포를 시각화

sns.boxplot(data = csData, x = 'EMI', y = 'AVGPRICE')

아래 막대선 ~ 박스의 하단 : 하위 25%
박스의 하단 ~ 박스의 중간 : 그 다음 25%
박스의 중간 ~ 박스의 상단 : 그 다음 25%
박스의 상단 ~ 위 막대선 : 상위 25%

를 나타낸다. 즉, 4분위로 나누어 1사분위수, 2사분위수, 3사분위수, 4사분위수를 표현하며 범위와 밀집도를 확인할 수 있다.

 

만약 데이터를 제한하고 싶다면 seborn에서는 표를 그릴 때 아래와 같이 원하는 데이터만 선택해서 취하면 된다.

# EMI가 1인 것은 제외하고 보겠다.
sns.boxplot(data = csData[csData.EMI != 1], x = 'EMI', y = 'AVGPRICE')

 

# EMI가 2인 것만 보겠다.
sns.boxplot(data = csData[csData.EMI == 2], x = 'EMI', y = 'AVGPRICE')

 

3.5 조인트 차트 (jointplot) : 두 데이터의 관계 및 변수의 빈도수를 같이 표현 (수치형 데이터가 서로 2차원을 이룰 경우 활용 가능)

csData에서 EMI가 2인 것에 대해 'AVGPRICE'와 'PRODUCTAGE'의 상관 관계를 표현해보자.

csData[csData.EMI == 2].AVGPRICE.describe()

sns.jointplot(data = csData, x = 'AVGPRICE', y = 'PRODUCTAGE')

 

 

이번에는 다른 데이터를 불러와보자.

import pandas as pd
featuresData = pd.read_csv('../exampleCode/dataset/feature_regression_example.csv')
print(featuresData.shape)		# 결과 : (107, 12) -> row, column의 수를 출력한다.

featuresData

 

3.6 선 차트 (lineplot) : x축에 따른 y축의 변수의 변화량을 시각화

sns.lineplot(data = featuresData[featuresData.YEAR == 2015], x = 'YEARWEEK', y = 'QTY')

 

3.7 LM 차트 (lmplot) : 두 데이터의 상관 관계를 linear한 형태로 뽑아내는 차트

sns.lmplot(data = featuresData, x = 'QTY', y = 'PRO_PERCENT')    # 할인율이 오르면 판매량이 늘어나는구나.

 

sns.lmplot(data = featuresData[featuresData.YEAR == 2015], x = 'QTY', y = 'PRO_PERCENT')

할인율과 판매량은 특정 년도에 따라 다르지 않고 거의 같은 양상을 보인다는 것을 확인할 수 있다.

 

sns.lmplot(data = featuresData, x = 'QTY', y = 'HCLUS')    # 홀리데이(HCLUS)가 길면 판매가 줄어드는구나. 홀레데이가 짧으면 판매가 늘어나는구나.

연휴가 길면 판매가 줄어든다는 것을 확인할 수 있다. 이에 대한 이유는 이제 연휴 기간 소비자의 지출 내역을 조사해 예를 들어 "외식비, "여행경비"등 지출이 몰린 것을 확인함으로써 연휴가 길 때 판매량이 줄어든 원인을 찾아낼 수 있다.

 

3.8 상관 관계 및 heatmap : 데이터의 상관 관계를 확인

featuresCorr = featuresData.corr()    # 상관관계 분석
featuresCorr

rows와 columns가 자기 자신일 때는 완벽히 동일하니 상관 관계가 '1'이 나온다.

상관 관계가 높을 수록 1에 가깝게 나오고 떨어질 수록 값이 작아진다. 따라서, 어떤 데이터가 어떤 데이터와 얼마만큼 의미 있는 관계를 갖는지 알 수 있다. 이를 시각화하면

sns.heatmap(featuresCorr, annot = True)

(annot (annotation)을 False로 주면 표 안의 구역에 숫자 값을 넣지 않고 색상으로만 표현해준다.)

이를 통해 'YEARWEEK'와 'YEAR'은 상관 관계가 높음을 알 수 있고, (52주가 아닌 해가 있기 때문에 1은 나오지 않고 1에 근접하게 나왔다.)

'PRO_PERCENT'와 'QTY'의 상관 관계가 높음을 알 수 있다. 이것을 시각화 하고 싶다면 위 3.7 LM 차트를 이용해서 그리면 된다.

 

 

 

 

 

퀴즈 ) Flights 분석 (raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv) 자료를 분석하시오.

import matplotlib.pyplot as plt
from matplotlib import rc
import seaborn as sns
%matplotlib inline

rc('font', family='AppleGothic')
plt.rcParams['axes.unicode_minus'] = False

import pandas as pd

flightsRawUrl = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/flights.csv'
flightsData = pd.read_csv(flightsRawUrl)
flightsData

우선 데이터를 먼저 확인하자.

 

 

 sns.boxplot(data = flightsData, x = 'month', y = 'passengers')

 

sns.boxplot(data = flightsData, x = 'year', y = 'passengers')

 

sns.lmplot(data = flightsData, x = 'year', y = 'passengers')

 

 

+ Recent posts