1. Seabron Library ?

 

🍋  시본 Seaborn 라이브러리는 맷플로립을 기반으로 다양한 테마와 통계용 차트 등의 동적인 기능을 추가한 라이브러리
🍋  시본 라이브러리는 맷플로립과 다르게 통계와 관련된 차트를 제공하기 떄문에 데이터프레임으로 다양한 통계 지표를 만들어 낼 수 있으며 데이터 분석에 활발하게 사용되고 있다

🍋  시본 라이브러리로 그리는 그래프들은 크게 관계형, 분포형, 카테고리형의 세가지 범주로 분류
       ▶️  실제 분석에는 맷플로립과 시본 라이브러리 두 가지를 함께 사용
🍋  사용할 때 주의할 점은 시본이 맷플로립에 의존적이기 때문에 맷플로립 라이브러리도 반드시 함께 임포트 해야 함

💡 시본 라이브러리의 주요 특징 💡
     a. 뛰어난 시각화 효과 

     b. 간결한 구문 제공 

     c. 판다스 데이터프레임에 최적화 

     d. 쉬운 데이터프레임 집계 및 차트 요약

🍋  기본적으로 맷플로립보다 제공하는 색상이 더 많기에 색 표현력이 좋음
🍋  맷플로립으로 그래프를 표현하더라도 시본의 set() 함수를 미리 선언해 주면 자동으로 시본 팔레트에 출력
🍋  시본은 'deep, muted, pastel, bright, dark, colorblind'의 6개 기본 팔레트를 제공

https://seaborn.pydata.org/

 

seaborn: statistical data visualization — seaborn 0.13.2 documentation

seaborn: statistical data visualization

seaborn.pydata.org


 

2. 데이터 시각화 준비하기


 1) 라이브러리 및 데이터 읽어오기 

# 2020년 건강검진 일부 데이터 엑셀 파일을 읽어와 동적인 시각화를 표현
import pandas as pd

data = pd.read_excel('../input/health_screenings_2020_1000ea.xlsx')
data.head()

출력 결과

 


 

2) 데이터 전처리

# 성별, 음주 여부, 흡연 상태에 대하여 숫자로 저장되어 있는 정보를 데이터 분석의 가독성을 높이기 위해
# 'Male', 'Female', 'Non-drinking', 'Drinking', 'Non-smoking', 'Smoking'의 문자열로 
# 변경하여 데이터 전처리

# 필요 컬럼 추출하여 저장
data6 = data[['gender', 'height', 'weight', 'waist', 'drinking', 'smoking']]
data6.head()
# 성별 데이터를 Male과 Female로 변경
data6.loc[data6['gender'] == 1, ['gender']] = 'Male'
data6.loc[data6['gender'] == 2, ['gender']] ='Female'

# 음주 여부 0(비음주)는 Non-drinking, 1(음주)는 Drinking으로 변경
data6.loc[data6['drinking'] == 0, ['drinking']] = 'Non-drinking'
data6.loc[data6['drinking'] == 1, ['drinking']] = 'Drinking'

# 흡연상태 1(비흡연)과 2(흡연 끊음)을 Non-smoking으로 변경하고, 3(흡연)을 Smoking으로 변경
data6.loc[(data6['smoking'] ==1) | (data6['smoking'] ==2), ['smoking']] = 'Non-smoking'
data6.loc[data6['smoking'] == 3, ['smoking']] = 'Smoking'

data6.head()

 

출력 결과

 

# 데이터 타입 변경없이 저장
data6.to_pickle('../output/data6.pickle')

 

3.  sns.barplot()

🍋  시본에서 사용하는 막대 그래프는 barplot() 함수로 속성 3개를 지정하여 범주별 그룹을 쉽게 표현
🍋  시본 막대 그래프는 기본적으로 오차 막대가 표시 되는데, 오차 막대를 그리는 범위를 신뢰구간이라고 함
        ▶️ 오차 막대 신뢰구간을 표준편차로 하고 싶다면 ci 속성을 'sd'(ci='sd')로 지정

# 다음과 같은 인수를 가진다
sns.barplot(x=None, y=None, hue=None, data=None, order=None, 
            hue_order=None, estimator=<function mean at 0x7f9e05dcf5e0>, 
            ci=95, n_boot=1000, units=None, seed=None, orient=None, 
            color=None, palette=None, saturation=0.75, errcolor='.26', 
            errwidth=None, capsize=None, dodge=True, ax=None, **kwargs)

 

<x>  x축에 사용할 데이터의 열 이름 또는 위치 (정수) <y> y축에 사용할 데이터의 열 이름 또는 위치 (정수)
<hue> 범례에 사용할 데이터의 열 이름 또는 위치 (정수) <data> 그래프를 그릴 데이터프레임
<order> 막대 그래프를 그릴 때, x축 값들의 순서 <hue_order> 범례에 표시될 값들의 순서
<estimator> 막대의 높이를 어떻게 계산할 것인지를 지정하는 함수
                          (기본값: mean)
<ci> 신뢰 구간을 설정할 때 사용하는 값 (기본값: 95)
<n_boot> 신뢰 구간 계산에 사용할 부트스트랩 샘플링 수
                     (기본값: 1000)
<units> 그래프를 그릴 때 사용할 데이터의 단위
<seed> 난수 발생 시드 값 <orient> 그래프의 방향 ('v' 또는 'h', 기본값: 'v')
<color> 모든 막대의 색상을 지정하는 단일 값 또는 색상 맵 <palette> 범주형 변수에 대한 색상 맵
<saturation> 색상 맵의 채도 <errcolor> 오차 막대의 색상
<errwidth> 오차 막대의 두께 <capsize> 오차 막대 끝 부분의 크기
<dodge> 막대를 서로 구분하기 위한 여유 공간 여부 (기본값: True) <ax> 그래프를 그릴 matplotlib의 축 객체

 

1) barplot() 함수 사용 예시

# 모듈 import
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 데이터 프레임 생성
data6 = pd.read_pickle('../output/data6.pickle')

# 음주 여부 및 흡연 상태 데이터 준비하기
# data6에서 성별, 음주 여부의 그룹별 개수(인원)를 구하여 drinking에 저장
drinking = data6.groupby(['gender', 'drinking'])['drinking'].count()

# data6에서 성별, 흡연 상태의 그룹별 개수(인원)를 구하여 smoking에 저장
smoking = data6.groupby(['gender', 'smoking'])['smoking'].count()

# 음주 여부와 흡연 상태에 대한 그룹별 개수(인원)의 시리즈를 데이터프레임으로 변경
drinking = drinking.to_frame(name='count')
smoking = smoking.to_frame(name='count')

 

  📌  series.to_frame() : series ▶️ dataframe 으로 변경하는 함수

데이터 프레임 변경 결과

 

# 데이터프레임의 인덱스를 초기화
drinking = drinking.reset_index()
smoking = smoking.reset_index()
drinking
# 컬럼이 1개 -> 3개로 변경됨

 

  📌  reset_index() : 설정 인덱스를 제거하고 기본 인덱스(0,1,2, ... , n)으로 변경

인덱스 초기화 결과


# 성별 음주 여부 및 흡연 상태 시본 막대 그래프
fig = plt.figure(figsize=(17, 6))

# 1행 2열의 서브플롯 생성
area1 = fig.add_subplot(1, 2, 1)
area2 = fig.add_subplot(1, 2, 2)

# barplot() 함수를 이용하여 x축에 성별, y축에 음주여부 개수 (인원), hue에 성별 음주 여부를 할당하여 첫 번째 서브플롯에 할당
ax1 = sns.barplot(data=drinking, x='gender', y='count', hue='drinking', ax=area1)
# barplot() 함수를 이용하여 x축에 성별, y축에 흡연상태 개수 (인원), hue에 성별 흡연상태 그룹별 데이터를 할당하여
# 두 번째 서브플롯에 할당
ax2 = sns.barplot(data=smoking, x='gender', y='count', hue='smoking', ax=area2)

fig.suptitle('2020 Health Screenings Drinking & Smoking Type Seaborn Bar Graph', fontweight='bold')
area1.set_title('Drinking Type')
area2.set_title('Smoking Type')

plt.show()

출력 결과

 


 

4.  add_subplot() 함수

🍋  add_subplot() 함수의 인자를 통해 서브플롯 개수를 조정
      📍 add_subplot(1, 2, 1)은 1 X 2 (행 X 열)의 서브플롯을 생성한다는 의미
             ➡️  세 번째 인자 1은 생성된 두 개의 서브플롯 중 첫 번째 서브플롯을 의미
      📍 마찬가지로 (1, 2, 2)는 1 X 2 서브플롯에서 두 번째 서브플롯을 의미

 

# 성별 음주 여부 및 흡연 상태 막대 그래프

# 1) 전체 설정
fig = plt.figure(figsize=(17,6))  # 그래프 크기 지정 및 그림 객체 생성
fig.suptitle('2020 Health Screenings Drinking & Smoking Type Bar Graph', fontweight='bold')
index = np.arange(4)  # x축 눈금 개수를 배열로 생성하고 index에 저장

# 2) 첫 번쨰 서브플롯 설정
fig.add_subplot(1, 2, 1)  # 1행 2열의 서브플롯 중 첫 번쨰 서브플롯을 생성
# 첫 번째 서브플롯에 그려질 음주 여부 데이터 개수 (인원)을 bar() 함수를 이용하여 저장.
plt.bar(index, drinking['count'])
plt.title('Drinking Type')
plt.ylabel('Count')
# x축 눈금 이름 지정
plt.xticks(index, ['Drinking(Female)', 'Non-drinking(Female)', 'Drinking(Male)', 'Non-drinking(Male)'])

# 3) 두 번째 서브플롯 설정
fig.add_subplot(1, 2, 2)  # 1행 2열의 서브플롯 중 두 번쨰 서브플롯을 생성
# 두 번째 서브플롯에 그려질 흡연 상태 데이터 개수 (인원)을 bar()함수를 이용하여 저장
plt.bar(index, smoking['count'])
plt.title('Smoking Type')
plt.ylabel('Count')
# x축 눈금 이름 지정
plt.xticks(index, ['Non-smoking(Female)', 'Smoking(Female)', 'Non-smoking(Male)', 'Smoking(Male)'])

 

출력 결과

 

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 및 위키독스 ]


 

1. 막대 그래프

🚀  집단별 차이를 표현할 때 막대 그래프를 주로 사용 
       ⚡️  수량의 많고 적음 비교, 변화된 양에 대한 일별, 월별, 연별 통계 등의 비교
🚀  가독성 면에서 항목의 개수가 적으면 가로 막대가 좋고 항목이 많으면 세로 막대가 보기 편함

 

    📌  막대 그래프는 bar() 함수에 x축, y축 데이터를 지정하여 그림

import pandas as pd
import matplotlib.pyplot as plt

data = pd.read_excel('../input/fine_dust.xlsx', index_col='area')
data2016 = data[2016]
data2016.head()
'''
area
Seoul       48.0
Gyeonggi    53.0
Incheon     49.0
Busan       44.0
Daegu       43.0
Name: 2016, dtype: float64
'''

1) 세로 막대

# 2016년 지역별 미세먼지 세로 막대 그래프
plt.figure(figsize=(15, 4))
plt.bar(data2016.index, data2016, color='g')  
# x축에 data2016의 인덱스를, y축 데이터에 data2016 값을 지정
plt.title('2016 Fine Dust Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)  # y축 범위를 35-55 정함
plt.grid()
plt.show()

출력 결과

 


 

2) 그룹 세로 막대 그래프

import numpy as np
index = np.arange(4)
# NumPy의 np.arange() 함수는 주어진 범위와 간격에 따라 균일한 값을 갖는 어레이를 반환

plt.figure(figsize=(15, 4))
df1 = data.loc['Seoul':'Busan', 2016:2019]  
# (행) 서울, 경기, 인천, 부산 지역의 (열) 2016~2019년 데이터만 추출.

for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴.
    plt.bar(index, chart_data, width=0.2, label=str(year))  # 두께 0.2의 막대 그래프를 지정.
    index = index + 0.2   # 출력되는 위치를 0.2씩 이동
    
plt.title('2016 ~ 2019 Fine Dust Group Bar Graph')
plt.xlabel('area')
plt.ylabel('micrometer')
plt.ylim(35, 55)
# x축 눈금을 가운데로 지정하기 위해 막대그래프를 마지막 위치에서 0.5 빼주고, x축 눈금 이름을 지정.
plt.xticks(index - 0.5, ['Seoul', 'Gyeonggi', 'Incheon', 'Busan'])
plt.legend()
plt.show()

 

💡  xticks(), yticks() 함수에 파이썬 리스트 또는 NumPy 어레이를 입력하면 눈금과 숫자 레이블이 표시

 

출력 결과

 


 

3) 그룹 누적 가로 막대 그래프

 

🚀  2016 ~ 2019 지역별 미세먼지 그룹 막대 그래프를 누적하여 가로 방향으로 변경하여 표현
🚀  누적 막대 그래프를 그리는 것은 기존 막대 그래프 위에 막대 그래프를 하나 더 그리는 형식
        ▶️ 이를 위해서는 index의 위치를 변경해야 함
        ▶️ 가로 방향으로 바꾸는 것은 bar() 대신 barh()를 사용하면 됨
        ▶️ 막대 그래프를 가로 방향으로 변경했으므로 x축 및 y축 이름, x축 및 y축 눈금도 가로 방향에 맞게 변경

# 2016 ~ 2019 지역별 미세먼지 그룹 누적 가로 막대 그래프
ndex = np.arange(4)

plt.figure(figsize=(15, 4))
df1 = data.loc['Seoul':'Busan', 2016:2019]  # 서울, 경기, 인천, 부산 지역의 2016~2019년 데이터만 추출.
for year in range(2016, 2020):
    chart_data = df1[year]  # 연도별로 데이터 가지고 옴.
    plt.barh(index, chart_data, label=str(year))  # barh() 사용
    
plt.title('2016~2019 Fine Dust Group Bar Graph')
plt.ylabel('area')
plt.xlabel('micrometer')
plt.xlim(30, 55)
plt.yticks(index, ['Seoul', 'Gyeonggi', 'Incheon', 'Busan'])
plt.legend()
plt.show()

 

출력 결과

 

 

 

 

 

[ 내용 참고 : IT 학원 강의 ]

+ Recent posts