1.  시본 산점도 그래프

🍓  시본 산점도 그래프는 스트립 플롯 Strip Plot 그래프, 스웜 플롯 Swarm Plot 그래프 등이 있음
🍓  맷플롯립의 산점도 그래프처럼 모든 데이터를 점으로 표현하는데,
      맷플롯립의 산점도보다 범주에 따른 각 분포의 실제 데이터나 전체 형상등을 보여 준다는 장점이 있음

 

1) 데이터 준비

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에서 남성 및 여성이 성별, 몸무게, 허리둘레, 음주 여부, 흡연 상태 데이터를 가져와
# male_data, female_data에 각각 저장
male_data = data6.loc[data6.gender == 'Male', 
                     ['gender', 'weight', 'waist', 'drinking', 'smoking']]
female_data = data6.loc[data6.gender == 'Female', 
                       ['gender', 'weight', 'waist', 'drinking', 'smoking']]
male_data.head()

'''
  gender  weight  waist      drinking      smoking
0   Male      60   72.1  Non-drinking  Non-smoking
3   Male      70   90.8  Non-drinking  Non-smoking
5   Male      85   94.0      Drinking      Smoking
6   Male      80   93.0      Drinking      Smoking
7   Male      65   92.0  Non-drinking      Smoking
'''

 


 

2) 시본 스트립 플롯 생성

 

🍬  stripplot() : 데이터 개수가 1개이고 변수의 종류가 연속적이거나 범주형인 데이터에 대해 간단히 요약하여 띠 형태로 보여준다
        ▶️ 상자수염 또는 바이올린 그래프를 보충하는 그래프로 많이 사용
🍬  일반적으로 작은 데이터를 다루는 용도로 사용되는데, 큰 데이터를 다룰 때는 주로 히스토그램 등을 많이 사용

plt.figure(figsize=(10, 5))  # 그래프의 크기를 지정
plt.title('Seaborn Strip Plot Graph')  # 그래프의 제목을 지정

# stripplot() 함수로 허리 둘레 데이터를 x축에 지정, 몸무게 데이터를 y축에 각각 지정
sns.stripplot(data=male_data, x='waist', y='weight')
sns.stripplot(data=female_data, x='waist', y='weight')

# 허리둘레 최솟값, 최댓값
min(female_data['waist'])  # 53
max(male_data['waist'])  # 128

# x축 눈금 간격(눈금 개수는 총 127개)을 허리둘레의 최솟값(53)과 최댓값(128)을 중심으로 지정
plt.xticks(np.arange(0, 127, 63), labels=[53, 90.5, 128])
plt.show()

출력 결과


 

3) 팔레트 속성으로 색상 지정

 

🍬  시본의 색상 표현
    - 시본 사이트  https://seaborn.pydata.org/tutorial/color_palettes.html#palette-tutorial
    - 그래프 색상을 사용하는 원칙과 6개의 기본 팔레트 외에도 다양한 색상 팔레트를 확인할 수 있음

 

Choosing color palettes — seaborn 0.13.2 documentation

Choosing color palettes Seaborn makes it easy to use colors that are well-suited to the characteristics of your data and your visualization goals. This chapter discusses both the general principles that should guide your choices and the tools in seaborn th

seaborn.pydata.org

 

plt.figure(figsize=(10, 5))  # 그래프의 크기를 지정
plt.title('Seaborn Strip Plot Graph - Color Palette')  # 그래프의 제목을 지정

# stripplot() 함수로 허리 둘레 데이터를 x축에 지정, 몸무게 데이터를 y축에,
# 성별을 hue 속성에 지정, 팔레트 종류 dark, Set1을 palette 속성에 각각 지정.
sns.stripplot(data=male_data, x='waist', y='weight', hue='gender', palette='dark')
sns.stripplot(data=female_data, x='waist', y='weight', hue='gender', palette='Set1')

plt.xticks(np.arange(0, 127, 63), labels=[53, 90.5, 128])
plt.show()

출력 결과

 

 

 

 

 

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


 

1. 평균 막대 그래프

🐰  평균 막대 그래프는 평균값의 크기를 막대 길이로 표현한 그래프
🐰  여러 집단의 평균 값을 비교할 때 평균 막대 그래프를 주로 사용

 

1) 데이터 가져오기

 

  📌  mpg 데이터에서 drv(구동방식)별 hwy(고속도로 연비) 평균을 나타낸 막대 그래프를 만들기

import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

mpg = pd.read_csv('../input/mpg.csv')

2) 집단별 평균표 생성

 

✏️  평균 막대 그래프를 만들려면 집단별 평균값을 담은 데이터 프레임이 필요
✏️  '구동 방식별 고속도로 연비 평균'을 담은 데이터 프레임을 생성

# agg(mean_hwy=('hwy', 'mean') -> mean_hwy열을 생성하면서 'hwy'열의 평균(mean()) 값을 입력

df_mpg = mpg.groupby('drv').agg(mean_hwy=('hwy', 'mean'))
df_mpg

 

 

 

 📍  집단을 나타낸 변수 drv가 인덱스로 바뀌어 mean_hwy 아래에 표시
 📍  seaborn으로 그래프를 만들려면 값이 변수에 담겨 있어야 함
         ➡️  인덱스가 아니라 열로 만들어져야 함
 📍  변수를 인덱스로 바꾸지 않고 원래대로 유지하려면 df.groupby()에 as_index = False를 입력

 

df_mpg = mpg.groupby('drv', as_index=False).agg(mean_hwy=('hwy', 'mean'))
df_mpg

 

출력 결과


 

3) 그래프 만들기

 

✏️  생성된 데이터 프레임을 이용해 막대 그래프 생성

sns.barplot(data=df_mpg, x='drv', y='mean_hwy')
plt.show()

 

 

 

📍 data : 데이터 프레임을 지정
📍 x : x축에 범주를 나타낸 변수
📍 y : y축에 평균값을 나타낸 변수

 

 

 

 

 

 

 

 

 

 

 

 


 

4) 크기 순으로 정렬

 

✏️  막대 정렬 순서는 그래프를 만드는데 사용한 데이터 프레임의 행 순서에 따라 정해짐
✏️  앞에서 출력한 그래프를 보면 drv 막대가 4, f, r 순으로 정렬
✏️  크기 순으로 정렬하려면 그래프를 만들기 전에 df.sort_values()를 이용해 데이터 프레임을 내림차순으로 정렬

# 데이터 프레임 정렬하기
df_mpg = df_mpg.sort_values('mean_hwy', ascending=False)

# 막대 그래프 만들기
sns.barplot(data=df_mpg, x='drv', y='mean_hwy')
plt.show()

출력 결과


 

2.  빈도 막대 그래프

🐰 빈도 막대 그래프는 값의 빈도(개수)를 막대 길이로 표현한 그래프
🐰 여러 집단의 빈도를 비교할 때 빈도 막대 그래프를 자주 사용


1)  집단별 빈도표 만들기

 

✏️  빈도 막대 그래프를 만들려면 집단별 빈도를 담은 데이터 프레임이 필요
✏️  df.agg()에 빈도를 구하는 함수 count를 적용해 '구동 방식 별 빈도'를 담은 데이터 프레임을 만듦

# 집단별 빈도표 만들기
df_mpg = mpg.groupby('drv', as_index=False).agg(n=('drv', 'count'))
df_mpg

'''
  drv    n
0   4  103
1   f  106
2   r   25
'''

 

2) 그래프 만들기

 

# 막대 그래프 만들기
sns.barplot(data=df_mpg, x='drv', y='n')
plt.show()

 

출력 결과

 


 

✏️  sns.barplot() 대신 sns.countplot()을 이용하면 원데이터를 바로 이용해 빈도 막대 그래프를 만들 수 있음

# 빈도 막대 그래프 만들기
sns.countplot(data=mpg, x='drv')
plt.show()

출력결과

 

 

📍 두 그래프는 x축의 순서가 다름
📍 sns.barplot()에 사용한 df_mpg와 sns.countplot()에 사용한 mpg의 drv 값 순서가 다르기 때문

 

 

 

 

 

 

 

 

✏️  데이터 프레임에서 변수의 값 순서는 데이터 프레임에 입력된 행의 순서에 따름
        ➡️  mpg의 drv는 0~6행이 f, 7~17행이 4, 18~27이 r로 되어 있으므로 값의 순서는 f, 4, r
        ➡️  변수의 고유값을 출력하는 unique()를 이용하면 값의 순서를 알 수 있음

mpg['drv'].unique()  # ['f', '4', 'r']

# df_mpg의 drv는 값의 순서가 알파벳 순으로 되어 있음.
# groupby()를 이용해 데이터 프레임을 요약하면 값의 순서가 알파벳 순으로 바뀌기 때문
df_mpg['drv'].unique()  # ['4', 'f', 'r']

 


 

3) 막대 정렬

 

✏️  sns.countplot()으로 만든 그래프의 막대를 정렬하려면 order에 원하는 순서로 값을 입력

# 4, f, r 순으로 막대 정렬
sns.countplot(data=mpg, x='drv', order=['4', 'f', 'r'])
plt.show()

출력 결과


 

✏️  sns.countplot()의 order에 mpg['drv'].value_counts().index를 입력하면 drv의 빈도가 높은 순으로 막대를 정렬

# drv의 값을 빈도가 높은 순으로 출력
mpg['drv'].value_counts().index
# Index(['f', '4', 'r'], dtype='object', name='drv')
# drv 빈도 높은 순으로 막대 정렬
sns.countplot(data=mpg, x='drv', order=mpg['drv'].value_counts().index)
plt.show()

 

출력 결과

 

 

 

 

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


 

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 학원 강의 및 위키독스 ]

+ Recent posts