'Python' 데이터 시각화 패키지( Seaborn, Matplotlib )를 이용한 그래프 그리기

2022. 7. 27. 15:34'Python 기반 데이터 분석'

1. Seaborn 패키지

  • Seaborn은 Matplotlib을 기반으로 다양한 색상 테마와 통계용 차트 등의 기능을 추가한 시각화 패키지이다. 기본적인 시각화 기능은 Matplotlib 패키지에 의존하며 통계 기능은 Statsmodels 패키지에 의존한다. seaborn 패키지 안에는 다양한 데이터가 내장되어 있으며 이번 실습 간에 'Tips' 데이터를 사용해서 다양한 그래프를 그려볼 것이다.

 

- seaborn 데이터 확인 방법 -

sns.get_dataset_names() # seaborn 데이터셋 확인
['anagrams',
 'anscombe',
 'attention',
 'brain_networks',
 'car_crashes',
 'diamonds',
 'dots',
 'exercise',
 'flights',
 'fmri',
 'gammas',
 'geyser',
 'iris',
 'mpg',
 'penguins',
 'planets',
 'taxis',
 'tips',
 'titanic']

 

- 필요 라이브러리 import -

import pandas as pd # 데이터 프레임화
import numpy as np # 데이터 배열
import scipy.stats as stats # 수학적 계산을 위한 모듈
import matplotlib.pyplot as plt # 시각화를 하기 위한 모듈
%matplotlib inline 
import seaborn as sns # seaborn 시각화 

# os에 따른 Font 깨짐 제거를 위해 Font 지정
import os
if os.name == 'nt' : # Windows OS
    font_family = "Malgun Gothic"
else: #MAC OS
    font_family = "AppleGothic"

# - 값이 깨지는 문제 해결을 위해 파라미터값 설정
sns.set(font=font_family, rc ={"axes.unicode_minus" : False})

 

- 데이터셋 불러오기(tips data) -

'Tips' 데이터를 이용해 상자그림, 막대그래프, 도수분포표, 히스토그램, 밀도그림을 그려볼 것이다.

# tips data 로드
data = sns.load_dataset('tips')
data.head() #맨 위의 데이터 5개만 추출 - 디폴트값이 5개 -
	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

 

● 상자그림과 하나의 변수에 대한 이상값(Outlier) 확인

# 시각화 탐색 - 상자그림 -
# 백분위수 계산(percentile)
print(data['tip'].quantile([0.05, 0.25, 0.5, 0.75, 0.95]))
      
print("\n")
percentages = [0.05, 0.25, 0.5, 0.75, 0.95]
df = pd.DataFrame(data['tip'].quantile(percentages))
df.index = [f'{p * 100}%' for p in percentages]
print(df.transpose())

0.05    1.4400
0.25    2.0000
0.50    2.9000
0.75    3.5625
0.95    5.1955
Name: tip, dtype: float64


     5.0%  25.0%  50.0%   75.0%   95.0%
tip  1.44    2.0    2.9  3.5625  5.1955

# 한 변수에 대한 이상값 시각화
ax = (data['tip']).plot.box() # plot.box() 상자그림 함수 
ax.set_ylabel('달러($)')

# 상자그림을 이용한 전체 변수의 이상값 확인
plt.figure(figsize = (10, 5))
sns.boxplot(data = data, orient='h')
plt.show()

상자그림과 이상값 확인
전체 변수의 상자그림과 이상값 확인

 

 

  막대 그래프 시각화

#막대그래프
# 요일별 tip 비교
tips_sum_day = data.groupby('day').tip.sum()
tips_sum_day

day
Thur    171.83
Fri      51.96
Sat     260.40
Sun     247.39
Name: tip, dtype: float64

# matplotlib 막대 그래프 시각화
label = ['Thur', 'Fri', 'Sat', 'Sun']
plt.bar(label, tips_sum_day, width=0.5, align='edge') # plt.bar() 막대 그래프 시각화

#seaborn 막대 그래프 시각화
# 성별, 평균 팁 비교
sns.barplot(data = data, x = 'sex', y = 'tip')

요일별 막대 그래프
성별 평균 팁 비교

●  도수분포표, 히스토그램, 밀도함수 시각화

#도수분포표
bin_total = pd.cut(data['total_bill'], 8)
bin_total.value_counts()

(15.005, 20.972]    81
(9.038, 15.005]     68
(20.972, 26.94]     38
(26.94, 32.908]     24
(3.022, 9.038]      12
(32.908, 38.875]    10
(38.875, 44.842]     6
(44.842, 50.81]      5
Name: total_bill, dtype: int64


fig, axs = plt.subplots(1, 2, figsize=(10,5))
#히스토그램
# plt.style.use('ggplot')
ax1 = plt.subplot(1, 2, 1)
ax1 = (data['total_bill']).plot.hist(bins=8)
ax1.set_xlabel('total_bill($)');
               
#밀도그림               
# plt.style.use('seaborn')
plt.subplot(1, 2, 2)
ax2 = data['total_bill'].plot.hist(density=True,xlim=[0,60], bins=8)
data['total_bill'].plot.density(ax=ax2);
ax2.set_xlabel('total_bill($)');

plt.tight_layout()
plt.show()

이런식으로 다양한 데이터를 가지고 보여주고자 하는 그래프를 시각화할 수 있습니다.

seaborn에 들어있는 다른 내장 데이터를 통해 연습하면 빠르게 습득하실 수 있을겁니다.