6. 데이터 시각화(seaborn 패키지)

🔗 'Do it! 쉽게 배우는 파이썬 데이터 분석' 책을 기반으로 JupyterLab 환경에서 학습한 내용입니다 _φ(๑╹╹๑)

 

📌 산점도


  • 산점도: 연속값으로 된 두 변수의 관계를 표현할 때 사용하며, seaborn 패키지의 scatterplot(data = 데이터 프레임명, x = 'x축 변수명', y = 'y축 변수명') 함수 활용

 

  • 파일 불러오기: read_csv('파일경로') 함수 활용
import seaborn as sns
import pandas as pd

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

 

  • 산점도 생성
sns.scatterplot(data = mpg, x = 'displ', y = 'hwy')

 

  • 범위 제한: set(xlim = (시작, 끝), ylim = (시작, 끝)) 함수를 활용하며, set 함수 내에 xlim과 ylim 중에 하나만 작성하는 것도 가능
sns.scatterplot(data = mpg, x = 'displ', y = 'hwy').set(xlim = (3, 6), ylim = (10, 30));

# set(xlim = (3, 6)): x축 범위 3 ~ 6으로 제한
# set(ylim = (10, 30)): y축 범위 10 ~ 30으로 제한
# 함수 뒤에 ;작성시 <Axes: xlabel...> 설명 메시지 숨김 처리 가능

 

  • 종류별 표시 색상 변경: scatterplot(data = 데이터 프레임명, x = 'x축 변수명', y = 'y축 변수명', hue='종류별 색상 다르게 할 변수명')
sns.scatterplot(data = mpg, x = 'displ', y = 'hwy', hue = 'drv')

 

  • 그래프 설정 변경
import matplotlib.pyplot as plt

# 그래프 설정 변경
plt.rcParams.update({'figure.dpi': '150',
'figure.figsize': [8, 6],
'font.size': '15',
'font.family': 'Malgun Gothic'})

# figure.dpi: 해상도 (기본값 72)
# figure.figsize: 가로 세로 크기 (기본값 [6, 4])
# font.size: 글자 크기 (기본값 10)
# font.family: 폰트 (기본값 sans-serif), 맑은 고딕 설정시 그래프에 한글이 깨져보이는 것을 방지

# 그래프 설정 원래대로 복구
plt.rcParams.update(plt.rcParamsDefault)

 

  • 그래프 이미지 저장: 이미지 클릭 → shift + 마우스 오른쪽 → 이미지를 다른 이름으로 저장

 

 

 

📌 막대 그래프


  • 막대 그래프: 집단 간 차이를 표현할 때 사용

 

  • 평균 막대 그래프 생성
    1. 평균 데이터 프레임 생성 후, 막대 그래프를 평균 크기 순서대로 나타내기 위한 정렬 실행
    2. seaborn 패키지의 barplot(data = 데이터 프레임명, x  =  'x축 변수명', y = 'y축 변수명') 함수를 활용하여 막대 그래프 생성
# drv별 hwy 평균을 나타내는 데이터 프레임 생성한 후, mean_hwy 기준 내림차순 정렬
# groupby 함수 as_index = False 설정 필수: 그래프를 만들기 위해서는 변수명이 필요

hwy_avg = mpg.groupby('drv', as_index = False)\
.agg(mean_hwy = ('hwy', 'mean'))\
.sort_values('mean_hwy', ascending = False)
# 막대 그래프 생성
sns.barplot(data = hwy_avg, x = 'drv', y = 'mean_hwy')

 

  • 빈도 막대 그래프 생성
    1. 방법1
      1. 빈도 데이터 프레임 생성 후, 빈도 크기 순서대로 나타내기 위한 정렬 실행
      2. barplot(data = 데이터 프레임명, x = 'x축 변수명', y = 'y축 변수명') 함수 활용
    2. 방법2
      1. seaborn 패키지의 countplot(data = 데이터 프레임명, x = 'x축 변수명', order = 데이터 프레임명['졍렬할 변수명'].value_counts().index) 함수 활용
        • order을 설정하지 않을시, 데이터 프레임명['순서를 확인할 변수명'].unique()로 출력되는 순서대로 그래프 생성
df_mpg = mpg.groupby('drv', as_index = False)\
.agg(n = ('drv', 'count')

# 방법 1
sns.barplot(data = df_mpg, x = 'drv', y = 'n')

# 방법2

sns.countplot(data = df_mpg, x = 'drv', order = df_mpg['drv'].value_counts().index)

# value_counts().index: 크기 순서대로
# order = ['4', 'f', 'r']로 지정도 가능

 

 

 

📌 선 그래프


  • 선 그래프: 시간에 따라 달라지는 데이터를 표현할 때 사용
    • 시계열 데이터: 일정 시간 간격을 두고 나열된 데이터
    • 시계열 그래프: 시계열 데이터를 선으로 표현한 그래프

 

  • 시계열 그래프 생성
    1. 날짜 변수열의 데이터 타입을 확인하고 pandas 패키지의 to_datetime(데이터 프레임명['타입 바꿀 변수명']) 함수로 datetime 타입으로 변경
    2. x축으로 보고자 하는 변수(연도, 월, 일 등)를 데이터프레임의 dt.year, dt.month, dt.day 등을 활용하여 추출한 후, 데이터 프레임에 추가
    3. seaborn 패키지의 lineplot(data = 데이터 프레임명, x = '변수명', y = '변수명', ci = None) 함수 활용
      • ci(신뢰구간): 데이터의 조사 오차(표본 오차)를 기반하여, 모평균이 표본 평균으로부터 95% 확률(100% 확률로 한다면 신뢰구간이 너무 커지고, 90% 확률로 한다면 틀릴 확률이 높아져)로 존재할 영역을 계산한 구간을 의미(https://angeloyeo.github.io/2021/01/05/confidence_interval.html)
 

신뢰 구간의 의미 - 공돌이의 수학정리노트 (Angelo's Math Notes)

 

angeloyeo.github.io

economics = pd.read_csv('economics.csv')

economics.info() # 'date' 변수의 type 확인 결과: 문자열(object)

# datetime 타입으로 변경한 'date' 변수의 값들을 'date2' 변수에 할당
economics['date2'] = pd.to_datetime(economics['date'])
economics.info()

economics['year'] = economics['date2'].dt.year # 'date2' 변수의 값들에서 연도 추출 후 할당
economics.head()

# 연도별 실업자수 그래프
sns.lineplot(data = economics, x = 'year', y = 'unemploy', ci = None)

ci = None
ci = None 설정 X

 

 

 

📌 상자 그림


  • 상자 그림: 데이터의 분포를 상자 모양으로 표현한 그래프
    • 상자 밖 가로선: 극단치 경계로 1.5IQR(IQR = Q3 - Q1의 값)에 해당
    • 상자 아래 세로선(아랫수염): 극단치 경계 범위 내의 하위 0~25%에 해당하는 값
    • 상자 밑면: 하위 25% 위치의 값
    • 상자 안 가로선: 50% 위치의 값(중앙값)
    • 상자 윗면: 하위 75% 위치의 값
    • 상자 위 세로선(윗수염): 극단치 경계 범위 내의 하위 75~100%에 해당하는 값
    • 상자 밖 표식: 1.5IQR을 벗어난 값

 

  • 상자 그림 생성: boxplot(data = 데이터 프레임명, x = 'x축 변수명', y = 'y축 변수명')
sns.boxplot(data = mpg, x = 'drv', y = 'hwy')
  • 상자 그림 해석
    • f: 26~29 사이의 좁은 범위에 자동차가 모여있고, 극단치가 존재
    • 4: 중앙값이 상자 아래쪽에 있는 형태로 낮은 값 쪽으로 치우친 형태의 분포
    • r: 세로선이 짧고 극단치가 없는 형태로, 자동차들이 사분위 범위(1~3사분위 내) 중심으로 분포

sns.boxplot(data = mpg, x = 'drv', y = 'hwy')