내일배움캠프

[내일배움캠프] TIL 21일차 26.01.21(수)

nom_de_plume 2026. 1. 21. 20:29

SQL 

RECURSIVE CTE:

  • 재귀적 공통 테이블 식
  • CTE는 WITH 절을 사용하여 만드는 임시 결과 집합. 여기에 RECURSIVE가 붙으면 자기 자신을 참조하여 반복적인 계산을 수행
  • 가상의 연속 데이터를 만들거나 계층 구조를 풀 때 사용
  • 조직도(계층 구조) 조회, 1부터 100까지 숫자 생성, 날짜 리스트 만들기 등에 사용
WITH RECURSIVE cte_name AS (
-- Anchor member (초기값)
SELECT ...

UNION ALL

-- Recursive member (반복)
SELECT ...
FROM cte_name
JOIN ...
ON ...
)
SELECT * FROM cte_name;
  • 구성요소:
    • Anchor member: 재귀의 시작점 (최초 1회 실행)
    • UNION ALL: 결과를 합치기 위해 사용 (보통 ALL 사용)
    • Recrusive member: 이전 결과를 이용해서 반복적으로 실행
    • cte_name: 바로 위에서 생성된 결과 참조

 

 

AUTO_INCREMENT:

  • 자동 증가
  • 테이블에 새로운 데이터를 넣을 때마다 중복되지 않는 고유한 번호(ID)를 자동으로 생성해주는 속성
  • 데이터의 순번 부여, 고유 식별자 생성에 사용
  • 우리가 번호를 직접 입력하지 않아도 DB가 1, 2, 3... 순서대로 알아서 넣어준다.
  • 주로 기본 키(Primary Key)에 설정
CREATE TABLE 테이블명 (
    열명 데이터타입 AUTO_INCREMENT,
    ...
    PRIMARY KEY (열명)
);
  • 구성요소:
    • 테이블명: 생성할 테이블 이름
    • 열명: AUTO INCREMENT가 적용될 열의 이름
    • 데이터타입: 해당 열의 데이터 타입
    • ATUO_INCREMENT 키워드: 이 열이 자동으로 증가할 것임 지정

 

 

Pandas

1. 데이터 정제 및 타입 변환

.dropna(subset=["컬럼명"])

  • 내가 지정한 컬럼에 값이 비어있을 때만 해당 행을 삭제
    • subset 사용 이유:
      • 어떤 컬럼은 비어있어도 괜찮지만, 어떤 컬럼은 반드시 값이 있어야만 하는 경우 사용
.dropna(subset=["컬럼명"])

 

 

bool 변환

  • 외부에서 불러온 데이터(CSV, Excel 등)는 같은 "참"의 의미라도 True, "True", "T", 1 등 제각각인 경우 다수 존재
  • 비교 연산자(==)를 활용하면 산재한 데이터들을 하나의 기준에 맞춰 정직한 True/False 값으로 수렴
df["column"] = (df["column"].astype("string").str.upper() == "TRUE")
  • 작동원리
    • 강제 형변환 (.astype("string")): 숫자, 논리형, 객체 등이 섞인 컬럼을 모두 문자열로 통일
    • 표준화 (.str.upper()): "true", "True", "TRUE"를 모두 "TRUE"라는 하나의 형태로 정규화
    • 논리 판정 (== "TRUE"): 대상이 특정 값과 일치하는지 비교
      • Yes: 값이 "TRUE"인 경우 → True 반환
      • No: 값이 "TRUE"가 아닌 나머지 모든 경우False 반환
    • 연산의 결과는 반드시 Boolean Series
  • 주의사항
    • 결측치(NaN) 처리: 위 문법을 사용하면 NaN 값은 "NAN" 문자열이 되었다가 "TRUE"와 비교되면서 False 처리. 만약 NaN을 그대로 유지해야 한다면 별도의 처리가 필요
    • 유지보수성: "TRUE" 외에 "Y", "YES", 1 등도 True로 간주해야 한다면 .isin(["TRUE", "Y", "1"])과 같은 문법을 사용

 

2. 데이터 그룹화

as_index 옵션

  • Pandas의 groupby() 메서드에서 사용하는 옵션
  • 그룹화의 기준이 되는 컬럼을 결과물의 인덱스(행 이름)로 사용할 것인지를 결정
    • as_index=True (기본값): 기준 컬럼이 인덱스가 됨 (계층형 구조).
    • as_index=False: 기준 컬럼이 일반 데이터 컬럼으로 유지됨 (SQL 스타일).
df.groupby("column", as_index=True)

 

 

3. 데이터 시각화

plt.plot(x, y, marker="o")

  • 선형 그래프(Line Plot): “시간에 따라 변하나?
  • 데이터의 흐름(추세) 파악
  • x축 데이터별 y축 데이터 변화를 선 그래프로 출력
    • marker=:
      • 데이터가 위치한 지점에 표식 추가
      • "o": 원 모양의 점
      • "s": 사각형 모양의 점
      • "d": 다이아몬드 모양의 점
      • "^": 삼각형 모양의 점
      • "x": 엑스표 모양의 점
      • "*": 별 모양의 점
plt.plot(x, y, marker="점 모양")

 

 

plt.xticks(rotation=45)

  • x축에 적히는 글자(눈금 레이블)들 45도 회전
  • x축에 '2024-01-21' 같은 날짜 데이터가 많으면 글자들이 서로 겹쳐서 검게 뭉쳐 보일 수 있어 각도를 틀어주면 좁은 공간에도 많은 글자를 깔끔하게 배치
    • rotation=90: 수직

 

plt.tight_layout()

  • 그래프의 여백 자동 조절하여 구성 요소들이 겹치지 않게 최적화 해주는 함수
  • 축 글자를 회전시키거나 그래프 제목, 축 이름 등을 넣다 보면 글자가 그림 밖으로 잘리거나(Out of bounds), 축 이름과 눈금이 겹치는 경우가 발생할 수 있기 때문에 사용
  • Pandas/Matplotlib이 전체적인 레이아웃을 계산해서 "안 잘리고 예쁘게" 여백을 다시 잡아줌.
  • 보통 plt.show()를 하기 바로 직전에 습관적 입력 추천

 

sns.barplot()

  • 막대 그래프(Bar Chart): “항목별 비교는?”
  • 항목 간의 크기를 비교하는 데 최적화
sns.barplot(data="DataFrame", x="항목", y="수치")
  • 입력사항
    • data에는 변수명을, x와 y에는 컬럼 이름을 문자열로 넣어야 한다.  
      • data: 분석할 데이터프레임 변수명 입력. (예: df, menu_sales 등)
      • x: 가로축에 올릴 범주형(Category) 컬럼명을 따옴표 안에 입력.
      • y: 세로축에 올릴 수치형(Numeric) 컬럼명을 따옴표 안에 입력

 

 

sns.scatterplot()

  • 산점도(Scatter Plot): “두 변수는 관계가 있나?”(상관관계 여부)
sns.scatterplot(data=df, x="x축", y="y축", hue="그룹컬럼", s=70, alpha=0.9)
  • 입력사항
    • data=df: 그래프를 그릴 때 참조할 데이터프레임(DataFrame) 소스를 지정
    • x="x축", y="y축": 가로축과 세로축에 들어갈 컬럼 이름을 정한다. 두 수치형 변수 사이의 상관관계를 확인하는 목적.
    • hue="그룹컬럼": 색상(Hue)을 통해 데이터를 그룹화. 지정한 컬럼의 값에 따라 점의 색깔이 자동으로 다르게 칠해지며, 범례(Legend)가 생성된다.
    • s=70: 점의 크기(Size)를 설정. 기본값보다 크게 설정하여 데이터 포인트를 명확하게 강조.
    • alpha=0.9: 점의 투명도를 조절. (0: 투명 ~ 1: 불투명) 점들이 겹쳐 있는 구간의 데이터 밀도를 확인하기 위해 사용.

 

 

plt.hist()

  • 히스토그램(Histogram): “값의 분포는 어떤가?”
  • 수치형 데이터의 '분포(Distribution)'를 나타내는 그래프 출력
  • 데이터가 어느 구간에 많이 몰려 있는지, 전체적으로 어떤 모양을 띠고 있는지(종 모양인지, 한쪽으로 치우쳤는지 등) 한눈에 파악할 때 사용
plt.hist(df["컬럼명"], bins=개수, edgecolor="색깔", color="색깔")
  • "해당 컬럼의 데이터를 최솟값부터 최댓값까지 n개의 동일한 구간으로 나누어라" 는 뜻
  • 입력사항
    • bins: 막대의 개수. 데이터 보는 해상도.
      • bins가 적을 때: 데이터가 너무 크게 묶여서 대략적인 느낌만 파악 가능
      • bins가 많을 때: 데이터가 세밀하게 쪼개져서 미세한 변화를 볼 수 있지만, 너무 많으면 오히려 흐름 파악 방해.
    • edgecolor: 막대 테두리 색 지정. 막대끼리 구분 위해 사용
    • color: 막대 색 지정

 

 

sns.boxplot()

  • 박스플롯(Box): “이상치 비교”
  • 데이터의 5가지 요약 수치(최솟값, 제1사분위, 중앙값, 제3사분위, 최댓값)를 바탕으로 데이터의 중심과 퍼짐 정도, 이상치를 한눈에 보여준다.
import seaborn as sns

sns.boxplot(data=df, x="항목", y="수치")
  • 입력사항
    • data=df: 그래프를 그릴 때 참조할 데이터프레임(DataFrame) 소스를 지정
    • x="x축", y="y축": 가로축과 세로축에 들어갈 컬럼 이름을 정한다. 두 수치형 변수 사이의 상관관계를 확인하는 목적.
  • 해석
    • 상자 중앙의 선: 데이터의 중앙값(Median).
    • 상자의 길이: 데이터의 50%가 모여 있는 구간(IQR). 상자가 길수록 데이터가 널리 퍼져 있다는 뜻.
    • 상자 밖의 점들: 이상치(Outlier). 일반적인 범위에서 크게 벗어난 특이 데이터를 잡아내는 데 유용.

 

 

sns.violinplot()

  • 바이올린(Violin): “범위 비교”
  • 박스플롯과 히스토그램(정확히는 커널밀도추정, KDE)을 합친 형태
  • 박스플롯처럼 요약 수치를 보여주면서, 동시에 데이터가 어디에 얼마나 많이 몰려 있는지(곡선의 너비)까지 보여준다.
import seaborn as sns

sns.violinplot(data=df, x="항목", y="수치")
  • 입력사항
    • data=df: 그래프를 그릴 때 참조할 데이터프레임(DataFrame) 소스를 지정
    • x="x축", y="y축": 가로축과 세로축에 들어갈 컬럼 이름을 정한다. 두 수치형 변수 사이의 상관관계를 확인하는 목적.
  • 해석
    • 볼록한 부분: 데이터가 많이 밀집된 구간.
    • 중앙의 흰 점/검은 막대: 바이올린 안에 박스플롯 요소가 포함되어 있어 중앙값 등을 함께 확인 가능.
    • 장점: 데이터가 '쌍봉분포(봉우리가 두 개인 모양)'일 때 박스플롯은 이를 잡아내지 못하지만, 바이올린플롯은 그 형태를 정확히 보여준다.

 

 

 

오늘의 회고

파이썬 세션 연습문제가 생각보다 많아 푸는데 다 푸는데에는 시간이 역부족이었다. 01~05까지 풀었기에 내일 대략 27~30문제 정도만 풀면 모두 푼다. 빠르게 풀이 및 해설 후 모르는 코드를 재정리해 명후일의 시험을 대비해야겠다. try/except 부분을 제외하면 다른 파트에서는 기억이 안나던거 외에는 문제없이 풀어나갔던 것 같아 그래도 고무적이다.