[Python] matplotlib과 seaborn 라이브러리를 활용한 데이터 시각화

기초부터 쌓아가는 머신러닝 #3

3주차 : matplotlib과 seaborn 라이브러리를 활용한 데이터 시각화


  • 시각화 라이브러리
  1. matplotlib
    • 파이썬으로 기본적인 차트들을 쉽게 그릴 수 있도록 도와주는 시각화 라이브러리
  2. seaborn
    • matplotlib 기반으로 만들어진 통계 데이터 시각화 라이브러리

- Bar 차트 이해 및 제작

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
import warnings
plt.rcParams['figure.figsize']=[10,8]
sns.set(style='whitegrid')
sns.set_palette('pastel')
warnings.filterwarnings('ignore')

---------------------------------------------------
# % 한글이 깨지는 경우 %
from matplotlib import font_manager, rc
import platform

if platform.system() == 'Windows':
# 윈도우인 경우
    font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
    rc('font', family=font_name)
else:    
# Mac 인 경우
    rc('font', family='AppleGothic')

matplotlib.rcParams['axes.unicode_minus'] = False 
---------------------------------------------------

# Loding "tips" dataset from seaborn
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
...	...	...	...	...	...	...	...
239	29.03	5.92	Male	No	Sat	Dinner	3
240	27.18	2.00	Female	Yes	Sat	Dinner	2
241	22.67	2.00	Male	Yes	Sat	Dinner	2
242	17.82	1.75	Male	No	Sat	Dinner	2
243	18.78	3.00	Female	No	Thur	Dinner	2

tips.shape
>(244, 7)

# matplotlib을 활용한 시각화
# 요일별 tip의 합계를 막대그래프로 나타내기
sum_tip_by_day = tips.groupby('day')['tip'].sum()
sum_tip_by_day
>day
Thur    171.83
Fri      51.96
Sat     260.40
Sun     247.39
Name: tip, dtype: float64

x_label = ['Thu','Fri','Sat','Sun']
x_label_index = np.arange(len(x_label))

plt.bar(x_label_index,sum_tip_by_day,
        color='pink', # color : 색깔 지정
        alpha=0.6, # alpha : 색 투명도
        width=0.3, # width:0.3
        align='edge') # default:'center' 
plt.title('Sum Of Tips by Days', fontsize=16)
plt.xlabel('Days',fontsize=14)
plt.ylabel('Sum Of Tips',fontsize=14)
plt.xticks(x_label_index,
           x_label,
           rotation=45, # x 라벨이 많은 경우 기울여서 씀
           fontsize=15)
plt.show()

# seaborn을 활용한 시각화
sns.barplot(data = tips, # 데이터 프레임
            x='day', # x 변수
            y='tip', # y 변수ns.barplot(data = tips, # 데이터 프레임
            hue='sex', # 특정 컬럼값을 기준으로 나눠서 보고 싶을 때
            palette='pastel', # pastel, husl, Set2, flare, Blues_d
            order=['Sun','Sat','Fri','Thur'], # x 변수 순서 지정
            edgecolor=".6", # edge 선명도 지정
            linewidth=2.5 # line두께 지정
            )
plt.title('Sum Of Tips by Days', fontsize=16)
plt.xlabel('Days')
plt.ylabel('Sum of Tips')
plt.xticks(rotation=45)
plt.show()           


- Pie 차트 이해 및 제작

# matplotlib을 활용한 시각화
sum_tip_by_day = tips.groupby('day')['tip'].sum()
ratio_tip_by_day = sum_tip_by_day/sum_tip_by_day.sum()
ratio_tip_by_day
>day
Thur    0.234875
Fri     0.071024
Sat     0.355942
Sun     0.338159
Name: tip, dtype: float64

x_label = ['Thu','Fri','Sat','Sun']
plt.pie(ratio_tip_by_day, # 비율 값
        labels=x_label, # 라벨 값
        autopct='%.1f%%', # 부채꼴 안에 표시될 숫자 형식(소수점 1자리까지 표시)
        startangle=90, # 축이 시작되는 각도 설정
        counterclock=True, # True: 시계방향순 , False:반시계방향순
        explode=[0.05,0.05,0.05,0.05], # 중심에서 벗어나는 정도 표시
        shadow=True, # 그림자 표시 여부
        colors = ['#ff9999', '#ffc000', '#8fd9b6', '#d395d0'], # colors=['gold','silver','whitesmoke','gray']
        wedgeprops = {'width':0.7,'edgecolor':'w','linewidth':3}
        ) #width: 부채꼴 영역 너비,edgecolor: 테두리 색 , linewidth : 라인 두께
plt.title('Ratio Of Tips by Days', fontsize=16)
plt.show()


- Line 차트 이해 및 제작

matplotlib을 활용한 시각화

# line 차트 예제를 위해, tips 데이터에 가상 시간 컬럼 추가하기
# 일요일 데이터만 사용
sun_tips = tips[tips['day']=='Sun']
현재 서버 시간을 얻기 위해 datetime 라이브러리 사용
import datetime
date = []
today = datetime.date.today() # 오늘 날짜 출력 YYYY-MM-DD
date.append(today)

for i in range(sun_tips.shape[0]-1): 
    today += datetime.timedelta(+1) # 하루씩 추가
    date.append(today)
sun_tips['date'] = date
sun_tips
>   total_bill	tip	sex   smoker	day	 time  size	   date
0	16.99	1.01	Female	No	Sun	Dinner	2	2021-04-10
1	10.34	1.66	Male	No	Sun	Dinner	3	2021-04-11
2	21.01	3.50	Male	No	Sun	Dinner	3	2021-04-12
3	23.68	3.31	Male	No	Sun	Dinner	2	2021-04-13
4	24.59	3.61	Female	No	Sun	Dinner	4	2021-04-14
...	...	...	...	...	...	...	...	...
186	20.90	3.50	Female	Yes	Sun	Dinner	3	2021-06-20
187	30.46	2.00	Male	Yes	Sun	Dinner	5	2021-06-21
188	18.15	3.50	Female	Yes	Sun	Dinner	3	2021-06-22
189	23.10	4.00	Male	Yes	Sun	Dinner	3	2021-06-23
190	15.69	1.50	Male	Yes	Sun	Dinner	2	2021-06-24

plt.plot(sun_tips['date'],sun_tips['total_bill'],
         linestyle='-', # linestyle= '--', '-', ':', '-. 
         linewidth=1, # line두께
         color='pink', # 색상 선택
         alpha=10, # 투명도 조절
         )
plt.title('Total Tips by Date',fontsize=20)
plt.xlabel('date',fontsize=15)
plt.ylabel('total tip',fontsize=15)
plt.xticks(rotation=90)
plt.show()

# seaborn을 활용한 시각화
sns.lineplot(data=sun_tips,x='date',y='total_bill',
             hue='sex',
             palette='pastel')
plt.title('Total Bill by Date & Sex')
plt.show()


- Scatter 차트 이해 및 제작

# matplotlib을 활용한 시각화
plt.scatter(tips['total_bill'],tips['tip'],
            color='pink', # 색상 선택
            edgecolor='black', # 테두리 색깔
            linewidth=2) # 라인 두께
plt.show()

# seaborn을 활용한 시각화
sns.scatterplot(data=tips,x='total_bill',y='tip',
                hue='day', # 색깔로 구분해서 보고 싶을 때
                style='time', # 모양으로 구분해서 보고 싶을 때
                size='size',sizes=(20,200), # 크기별로 보고 싶을때
                palette='pastel') # 색상 지정
plt.title('Scatter between total_bill and tip',fontsize=20)
plt.xlabel('total_bill',fontsize=16)
plt.ylabel('tip',fontsize=16)
plt.show()


- Heat Map 차트 이해 및 제작

# seaborn을 활용한 시각화
sns.heatmap(tips.corr(),
            annot=True, # 박스안 corr 값 표시할지 말지
            square=True, # 박스를 정사각형으로 할지 말지
            vmin=-1,vmax=1, # 최소 최댓값 지정
            linewidth=.5, # 라인 두께 지정
            cmap='RdBu') # 색상 선택
plt.title('Heatmap by correlation',fontsize=20)
plt.show()


- Histogram 차트 이해 및 제작

# matplotlib을 활용한 시각화
plt.hist(tips['total_bill'],
         bins=30,
         density=True,
         alpha=0.7,
         color='pink',
         edgecolor='black',
         linewidth=0.9)
plt.title('Histogram for total_bill')
plt.xlabel('total_bill')
plt.ylabel('rate')
plt.show()

# seaborn을 활용한 시각화
sns.histplot(data=tips,x='total_bill',
             bins=30, # bin의 갯수
             kde=True, #kernel density estimate to smooth the histogram
             hue='sex', # 색깔에 따른 구분
             multiple='stack', # dodge
             stat="density", # 비율로 확인할 때
             shrink=0.6 # bin의 두께
             )
plt.title('Histogram for total_bill')
plt.xlabel('total_bill')
plt.ylabel('rate')
plt.show()


- Box 차트 이해 및 제작


출처 : https://towardsdatascience.com/understanding-boxplots-5e2df7bcbd51

# matplotlib을 활용한 시각화
plt.boxplot(tips['tip'],
            sym='rs', # outlier => red & square로 표현
          )
plt.title('Box Plot for Tip',fontsize=20)
plt.ylabel('tip',fontsize=15)
plt.show()

# seaborn을 활용한 시각화
sns.boxplot(data=tips,x='day',y='tip',
            hue='smoker',
            palette='pastel',
            linewidth=3,
            order=["Sun", "Sat","Fri","Thur"])
plt.title('Box Plot for Tip by Day',fontsize=20)
plt.ylabel('tip',fontsize=15)
plt.show()


결론

단순히 보면 보이지 않던 것들이 비로소 시각화를 하면 새로운 인사이트를 발견하게 된다.

좋은 웹페이지 즐겨찾기