[D-4] seaborn으로 상관관계 보기

2026. 6. 28. 19:38·AI
반응형
edit_note 오늘 코테 문제
문제데이터 분석 (Lv.1)
플랫폼프로그래머스
난이도Lv. 1
핵심 요구사항ext 컬럼 값이 val_ext보다 작은 행 필터링 후 sort_by 기준 오름차순 정렬
내가 작성한 코드
python
def solution(data, ext, val_ext, sort_by):
    answer = []

    if ext == 'code':       mask = 0
    elif ext == 'date':     mask = 1
    elif ext == 'maximum':  mask = 2
    else:                   mask = 3

    for info in data:
        if info[mask] < val_ext:
            answer.append(info)

    if sort_by == 'code':       mask = 0
    elif sort_by == 'date':     mask = 1
    elif sort_by == 'maximum':  mask = 2
    else:                       mask = 3

    answer.sort(key=lambda x: x[mask])
    return answer
시간복잡도O(N log N) — 정렬이 지배
풀이 접근법
data[i]가 [code, date, maximum, remain] 순서의 리스트이므로, 컬럼명을 인덱스 번호로 바꿀 수 있으면 필터·정렬을 하나의 로직으로 처리할 수 있다고 생각했다. 그래서 컬럼명마다 if/elif로 인덱스를 직접 할당해 마스크를 만들고, 필터링과 정렬에 각각 적용했다. 동작은 하지만 같은 분기 패턴이 필터용·정렬용으로 두 번 반복되고, 컬럼이 늘어나면 두 블록을 모두 수정해야 한다는 점이 아쉬웠다.
고도화
컬럼 순서와 동일한 배열 by를 하나 만들고 list.index()로 컬럼명 → 인덱스 변환을 한 줄로 처리했다. if/elif 블록이 완전히 사라지고 컬럼이 추가되더라도 by에만 추가하면 나머지 로직은 그대로 동작한다.
✦ 고도화
python
def solution(data, ext, val_ext, sort_by):
    by = ["code", "date", "maximum", "remain"]
    #       0        1         2         3

    answer = [item for item in data if item[by.index(ext)] < val_ext]
    return sorted(answer, key=lambda x: x[by.index(sort_by)])
핵심 — sorted(answer, key=lambda x: x[by.index(sort_by)])
부분역할
sorted(answer, ...)answer를 정렬해 새 리스트 반환
key=lambda x: ...정렬 기준값을 뽑는 함수
x각 행 (예: [1, 20300104, 100, 80])
by.index(sort_by)컬럼명 → 인덱스 (예: "remain" → 3)
x[by.index(sort_by)]해당 행에서 정렬 기준 컬럼 값 추출
sort_by = "remain"이면 by.index("remain") == 3이므로 lambda x: x[3]으로 동작. sort_by가 어떤 값이어도 분기 없이 처리된다.
핵심 인사이트
✓컬럼명 배열 by 하나로 if/elif 분기를 완전히 없앨 수 있다. 컬럼이 늘어나도 by만 수정하면 된다.
✓sorted(answer, key=lambda x: x[by.index(sort_by)]) — lambda 안에서 동적으로 인덱스를 계산해 정렬 기준을 유연하게 바꿀 수 있다는 점이 새로웠다.
한 줄 회고if/elif 반복 대신 배열 하나로 매핑 — 코드가 짧아질수록 확장성은 올라간다
menu_book 오늘 공부한 내용
학습 주제Seaborn — 데이터 분포 시각화, 상관관계 시각화
참고 자료코드잇 기초 통계와 데이터 시각화 강의
소요 시간3시간
Seaborn 기본 사용법
Matplotlib보다 적은 코드로 세련된 그래프를 만들 수 있는 통계 시각화 라이브러리다. 같은 x축 값의 데이터를 자동으로 묶어 평균을 계산해주고, hue 파라미터 하나로 그룹별 비교가 가능하다. 커스텀이 필요할 때는 Matplotlib, 빠르게 보기 좋은 그래프를 만들 때는 Seaborn이 적합하다.
python
import seaborn as sns
import pandas as pd
import matplotlib.pyplot as plt

bike_df = pd.read_csv('data/bike.csv')

# 막대 그래프 — 같은 월 데이터를 자동으로 묶어 평균 계산
sns.barplot(data=bike_df, x='month', y='total', errorbar=None)
plt.show()

# hue로 그룹별 비교
sns.set_theme(rc={'figure.figsize': (8, 4)}, style='white')
sns.barplot(data=bike_df, x='month', y='total', errorbar=None, hue='workingday')
plt.show()

# 꺾은선 그래프
sns.lineplot(data=bike_df, x='month', y='total', errorbar=None, hue='workingday')
plt.show()
sns.barplot — 월별 자전거 대여량 평균
hue='workingday' — 평일/주말 그룹 비교
sns.lineplot — 월별 추이 꺾은선
set_theme() — 스타일 / 폰트 / 팔레트 설정
python
# style: darkgrid(기본) / white / dark / whitegrid / ticks
# font: Mac은 'AppleGothic', Windows는 'Malgun Gothic'
# palette: deep(기본) / pastel / muted / bright / dark / colorblind
# rc: 그래프 크기 등 rcParams 설정

sns.set_theme(
    style='white',
    font='AppleGothic',
    font_scale=1.0,
    palette='pastel',
    rc={'figure.figsize': (12, 6)}
)
데이터 분포 시각화 1 — stripplot / swarmplot
stripplot은 개별 데이터 점을 그대로 찍어 분포를 보여준다. 데이터가 겹쳐 보이기 어려울 때는 swarmplot을 쓰면 겹치는 점들이 옆으로 퍼지면서 쌓인다.
python
sns.stripplot(data=bike_df, x='month', y='total')  # 점 그대로 찍기
sns.swarmplot(data=bike_df, x='month', y='total')  # 겹치면 옆으로 쌓기
sns.stripplot — 개별 데이터 점 분포
sns.swarmplot — 겹치지 않게 옆으로 쌓음
데이터 분포 시각화 2 — boxplot / violinplot / histplot / kdeplot
violinplot은 박스 플롯과 KDE Plot을 합쳐놓은 형태다. 흰 점이 중간값, 굵은 선이 IQR, 얇고 긴 선이 Whisker 위치에 해당하며 곡선 모양으로 디테일한 분포까지 볼 수 있다. histplot과 kdeplot은 Matplotlib의 hist/kde와 동일하지만 Seaborn 스타일로 그려진다.
python
sns.boxplot(data=bike_df, x='day_of_week', y='registered')
# order 파라미터로 x축 순서 지정 가능
sns.boxplot(data=bike_df, x='day_of_week', y='registered',
            order=['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'])
plt.show()

sns.violinplot(data=bike_df, x='day_of_week', y='registered')
plt.show()

sns.histplot(data=bike_df, x='registered')           # 히스토그램
# multiple='stack' 하면 겹치지 않고 막대 위에 쌓아서 표시
sns.kdeplot(data=bike_df, x='registered')            # KDE Plot
plt.show()
sns.boxplot — 요일별 등록 대여량
sns.violinplot — 박스 플롯 + KDE 결합
sns.histplot — 등록 대여량 히스토그램
sns.kdeplot — 등록 대여량 KDE Plot
상관관계 시각화
어떤 값이 변할 때 다른 값도 함께 변하면 두 값은 상관관계(correlation)가 있다고 한다. 상관관계를 수치로 표현한 것이 상관계수(correlation coefficient)이며 −1 ~ 1 사이의 값을 가진다. 0에 가까울수록 연관성이 약하고, −1이나 1에 가까울수록 강하다. 양수면 양의 상관관계(같이 커짐), 음수면 음의 상관관계(반대로 움직임)다.
가장 널리 쓰이는 피어슨 상관계수는 두 변수의 공분산을 각 변수의 표준편차의 곱으로 나눈 값이다. 공분산만으로는 변수의 단위에 따라 값이 달라지는 한계가 있는데, 표준편차로 나눔으로써 −1 ~ 1 범위로 정규화해 단위에 관계없이 비교할 수 있다.
python
# 산점도
sns.scatterplot(data=bike_df, x='temperature', y='total')

# 회귀선 추가 — 두 값의 상관관계를 하나의 선으로 요약
sns.regplot(data=bike_df, x='temperature', y='total')
plt.show()

# 상관계수 행렬 (numeric_only=True 필수 — 문자형 컬럼 제외)
bike_df.corr(numeric_only=True)

# total과 다른 변수들의 상관계수만 추출 후 정렬
bike_df.corr(numeric_only=True)['total'].sort_values(ascending=True)

# 히트맵 — 상관계수를 색상으로 표현 (annot=True: 수치 표시)
sns.heatmap(bike_df.corr(numeric_only=True), annot=True)
plt.show()
sns.scatterplot — 기온과 총 대여량 산점도
sns.regplot — 회귀선 추가 (양의 상관관계 확인)
corr() — 상관계수 행렬 (temperature↔total: 0.64)
sns.heatmap — 색상으로 상관관계 강도 표현
피어슨 상관계수 수식
피어슨 상관계수 ρ는 공분산을 두 변수의 표준편차 곱으로 나눈 값이다.
피어슨 상관계수 공식
공분산 cov(X, Y)는 각 값의 편차를 곱해 평균을 낸 것으로, 두 변수가 같은 방향으로 움직이면 양수, 반대 방향이면 음수가 된다. 단, 공분산은 변수의 단위에 영향을 받아 크기만으로 강도를 판단하기 어렵다. 피어슨 상관계수는 이를 표준편차로 나눠 단위를 제거한 것이다.
공분산 공식
오늘의 키포인트
1violinplot은 박스 플롯 + KDE의 결합이다. 흰 점=중간값, 굵은 선=IQR, 얇은 선=Whisker이며 곡선으로 분포 모양까지 볼 수 있다.
2상관계수는 −1 ~ 1 범위다. corr(numeric_only=True)로 수치형 컬럼 간 상관계수를 한번에 구하고, heatmap으로 시각화하면 한눈에 파악할 수 있다.
3피어슨 상관계수 = 공분산 ÷ (표준편차X × 표준편차Y). 공분산의 단위 의존성 문제를 표준편차로 정규화해 해결한 것이다.
psychology 오늘 들었던 생각

코테에서 sorted(answer, key=lambda x: x[by.index(sort_by)]) 패턴이 신선했다. lambda 안에서 동적으로 인덱스를 계산해 정렬 기준을 바꾸는 게 Swift의 클로저랑 비슷한 느낌인데, 훨씬 간결하다. 수식들도 단순히 외우는 게 아니라 왜 그렇게 생겼는지 이해하고 있어야 나중에 직접 활용할 수 있겠다는 생각이 들었다.

rate_review 마무리
Seaborn으로 데이터 분포와 상관관계를 시각화하는 법을 익혔다. 그래프 하나로 데이터를 읽는 속도가 달라진다는 걸 느낀 하루.
checklist 내일 할 일
  • 프로그래머스 문제 한 개 풀기
  • 기초 통계와 데이터 시각화 복습
반응형

'AI' 카테고리의 다른 글

[D-2] 코테 한 문제, 그리고 잠시 숨 고르기  (0) 2026.06.30
[D-3] 시각화 도구 3종 비교  (0) 2026.06.29
[D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지  (0) 2026.06.27
[D-6] DataFrame 인덱싱 헷갈리는 포인트 정리  (1) 2026.06.26
[D-7] Numpy, Pandas, Matplotlib 한 번에 훑기  (0) 2026.06.25
'AI' 카테고리의 다른 글
  • [D-2] 코테 한 문제, 그리고 잠시 숨 고르기
  • [D-3] 시각화 도구 3종 비교
  • [D-5] 통계 기초 완주 — 박스 플롯부터 누적값까지
  • [D-6] DataFrame 인덱싱 헷갈리는 포인트 정리
Riu
Riu
안녕하세요 iOS 개발자를 꿈꾸는 Riu입니다. Github: woolnd
  • Riu
    Riu 개발노트
    Riu
  • 전체
    오늘
    어제
    • 분류 전체보기 (44) N
      • AI (16) N
      • iOS 개발 (21)
        • SwiftUI (9)
        • UIKit (6)
        • Combine (5)
        • Architecture (1)
      • 알고리즘 (1)
      • 회고록 (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    구름톤유니브
    SwiftUI
    앗차!
    cleanArchitecture
    ios개발
    AI엔지니어취업
    ios
    figma
    SWIF
    코드잇스프린트잇
    AI부트캠프
    나만의todo
    회고록
    UIKit
    SWIFT
    Combine
    AI엔지니어
    코드잇스프린트
    막자알림서비스
    Ai
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
Riu
[D-4] seaborn으로 상관관계 보기
상단으로

티스토리툴바