🍓 시본 산점도 그래프는 스트립 플롯 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()
🐰 평균 막대 그래프는 평균값의 크기를 막대 길이로 표현한 그래프 🐰 여러 집단의 평균 값을 비교할 때 평균 막대 그래프를 주로 사용
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를 입력
📍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()
🍋 시본 Seaborn 라이브러리는 맷플로립을 기반으로 다양한 테마와 통계용 차트 등의 동적인 기능을 추가한 라이브러리 🍋 시본 라이브러리는 맷플로립과 다르게 통계와 관련된 차트를 제공하기 떄문에 데이터프레임으로 다양한 통계 지표를 만들어 낼 수 있으며 데이터 분석에 활발하게 사용되고 있다
🍋 시본 라이브러리로 그리는 그래프들은 크게 관계형, 분포형, 카테고리형의 세가지 범주로 분류 ▶️ 실제 분석에는 맷플로립과 시본 라이브러리 두 가지를 함께 사용 🍋 사용할 때 주의할 점은 시본이 맷플로립에 의존적이기 때문에 맷플로립 라이브러리도 반드시 함께 임포트 해야 함
💡 시본 라이브러리의 주요 특징 💡 a. 뛰어난 시각화 효과
b. 간결한 구문 제공
c. 판다스 데이터프레임에 최적화
d. 쉬운 데이터프레임 집계 및 차트 요약
🍋 기본적으로 맷플로립보다 제공하는 색상이 더 많기에 색 표현력이 좋음 🍋 맷플로립으로 그래프를 표현하더라도 시본의 set() 함수를 미리 선언해 주면 자동으로 시본 팔레트에 출력 🍋 시본은 'deep, muted, pastel, bright, dark, colorblind'의 6개 기본 팔레트를 제공
# 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()
# 데이터 타입 변경없이 저장
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 으로 변경하는 함수
📌 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)'])