부트캠프

멋쟁이사자처럼 부트캠프 그로스마케팅 4기 20일차_260407

Yuuma 2026. 4. 7. 17:22

[TIL] Day4 | Pandas 정렬·필터링 & SQL 기초 개념

📅 2025.04.07
📚 데이터 분석 개론 4일차 학습 기록


오늘 배운 것 한 줄 요약

Pandas는 받아온 데이터를 다듬는 도구, SQL은 DB에서 데이터를 꺼내오는 도구.
둘을 함께 쓸 줄 알아야 데이터 분석의 첫 단계부터 끝까지 혼자 해낼 수 있다.


1. Pandas — 데이터 정렬 (Sorting)

기본 문법

df.sort_values(by="열이름", ascending=False)
# ascending=True  → 오름차순 (기본값)
# ascending=False → 내림차순

다중 기준 정렬

기준이 2개 이상일 때, ascending도 기준 수만큼 맞춰 써야 한다.

df.sort_values(
    by=["채널", "ROAS"],
    ascending=[True, False]  # 채널: 오름차순, ROAS: 내림차순
)

오름차순 정렬 순서 (기억용)

숫자(0~9) → 특수문자 → 영어 대문자(A~Z) → 영어 소문자(a~z) → 한글(가~힣)

자주 쓰는 패턴

# 상위 N개만 보기
df.sort_values("ROAS", ascending=False).head(5)

# 정렬 후 인덱스 재설정
df.sort_values("ROAS", ascending=False).reset_index(drop=True)

⚠️ 주의: sort_values는 원본을 바꾸지 않는다.
저장하려면 df = df.sort_values(...) 또는 inplace=True 사용.


2. Pandas — 데이터 필터링 (Filtering)

기본 원리: Boolean Indexing

# 조건식이 True인 행만 선택
df[ df["ROAS"] >= 3 ]
df[ df["채널"] == "Meta" ]

AND / OR 조건

Pandas에서는 and, or 대신 반드시 &, | 사용!
각 조건은 반드시 () 괄호로 감싸야 한다.

# AND 조건
df[ (df["ROAS"] >= 3) & (df["클릭수"] >= 2000) ]

# OR 조건
df[ (df["ROAS"] >= 5) | (df["전환수"] >= 150) ]

# NOT 조건
df[ ~(df["채널"] == "Meta") ]

query() — 더 읽기 쉬운 방법

# Boolean indexing 방식
df[ (df["ROAS"] >= 3) & (df["클릭수"] >= 2000) ]

# query() 방식 (훨씬 깔끔!)
df.query("ROAS >= 3 and 클릭수 >= 2000")

# 변수 사용 시 @ 기호 붙이기
target = 3.0
df.query("ROAS >= @target")

문자열 필터링

# 특정 값 목록에 포함되는지
df[ df["채널"].isin(["Meta", "Google"]) ]

# 반대: 포함되지 않는 것만
df[ ~df["채널"].isin(["카카오"]) ]

# 특정 단어가 포함된 행만
df[ df["캠페인명"].str.contains("신규유저") ]

# OR 조건 (| 사용)
df[ df["캠페인명"].str.contains("신규유저|리타겟팅") ]

범위 필터링

df[ df["광고비"].between(500000, 1500000) ]

조건 연산자 정리

연산자 의미
== 같다
!= 다르다
>= 이상
<= 이하
& AND
| OR
~ NOT

3. 정렬 + 필터링 결합

실무에서 가장 많이 쓰는 패턴: 먼저 필터링 → 그 안에서 정렬

# 기본 패턴
df[ 조건 ].sort_values(by="열", ascending=방향)

# 예시: Google 채널 중 ROAS 높은 순 TOP 3
(
    df[ df["채널"] == "Google" ]
    .sort_values("ROAS", ascending=False)
    .head(3)
)

평균 vs 중앙값 (헷갈리지 말 것!)

함수 의미 특징
mean() 평균 이상치에 민감
median() 중앙값 이상치가 있어도 안정적
std() 표준편차 데이터 퍼짐 정도
sum() 합계 전체 합
count() 개수 NaN 제외

💡 이상치(극단값)가 섞인 데이터라면 mean 보다 median이 더 대표값에 가깝다.


4. SQL 기초 개념

SQL이란?

데이터베이스(DB)에서 원하는 데이터를 꺼내오는 언어.
엑셀이 눈으로 보고 손으로 필터를 거는 방식이라면, SQL은 "이런 조건의 데이터 줘" 라고 말하면 컴퓨터가 찾아주는 방식.

SQL vs 엑셀 vs Pandas 비교

비교 엑셀 Pandas SQL
데이터 위치 내 컴퓨터 내 컴퓨터 회사 서버(DB)
데이터 크기 수만 행이면 버벅임 수십만 행 가능 수억 행도 OK
사용 방법 클릭, 드래그 파이썬 코드 SQL 문법

DB 핵심 개념

개념 DB에서는 예시
엔티티(Entity) 테이블 직원, 주문, 상품
인스턴스(Instance) 행(Row) 직원 한 명의 데이터
속성(Attribute) 열(Column) 이름, 급여, 부서

SQL의 종류

종류 설명 주요 명령어
DML 데이터 조작 SELECT, INSERT, UPDATE, DELETE
DDL 테이블 정의 CREATE, ALTER, DROP, TRUNCATE
DCL 권한 제어 GRANT, REVOKE
TCL 트랜잭션 제어 COMMIT, ROLLBACK

5. SQL 기본 문법

전체 쿼리 구조 (작성 순서)

SELECT   -- 어떤 열을 볼 건지
FROM     -- 어떤 테이블에서
WHERE    -- 어떤 조건으로
GROUP BY -- 어떤 기준으로 묶을 건지
HAVING   -- 묶은 결과에 조건 걸기
ORDER BY -- 어떤 순서로 정렬할 건지
LIMIT    -- 몇 개만 볼 건지

⚠️ 실제 실행 순서는 작성 순서와 다르다:
FROM → WHERE → GROUP BY → SELECT → ORDER BY

SELECT

-- 전체 열 보기
SELECT * FROM emp;

-- 특정 열만
SELECT empno, ename, sal FROM emp;

-- 별칭 붙이기
SELECT ename AS 이름, sal AS 급여 FROM emp;

-- 계산식
SELECT ename, sal, sal * 12 AS 연봉 FROM emp;

WHERE (조건 필터링)

-- 기본
SELECT * FROM emp WHERE sal >= 2000;

-- AND / OR
SELECT * FROM emp WHERE deptno = 10 AND sal >= 2000;
SELECT * FROM emp WHERE deptno = 10 OR deptno = 20;

-- 범위
SELECT * FROM emp WHERE sal BETWEEN 1000 AND 3000;

-- 목록
SELECT * FROM emp WHERE deptno IN (10, 20);

-- 문자열 포함
SELECT * FROM emp WHERE ename LIKE 'S%';   -- S로 시작
SELECT * FROM emp WHERE ename LIKE '%A%';  -- A가 포함

-- NULL 체크
SELECT * FROM emp WHERE comm IS NULL;
SELECT * FROM emp WHERE comm IS NOT NULL;

ORDER BY (정렬)

SELECT * FROM emp ORDER BY sal ASC;   -- 오름차순
SELECT * FROM emp ORDER BY sal DESC;  -- 내림차순

-- 다중 정렬
SELECT * FROM emp ORDER BY deptno ASC, sal DESC;

GROUP BY + 집계함수

-- 부서별 인원수
SELECT deptno, COUNT(*) AS 인원수
FROM emp
GROUP BY deptno;

-- 부서별 평균 급여 (내림차순)
SELECT deptno, ROUND(AVG(sal), 0) AS 평균급여
FROM emp
GROUP BY deptno
ORDER BY 평균급여 DESC;

HAVING (그룹 결과에 조건)

-- WHERE: 개별 행에 조건 (GROUP BY 전)
-- HAVING: 집계 결과에 조건 (GROUP BY 후)

SELECT deptno, AVG(sal) AS 평균급여
FROM emp
GROUP BY deptno
HAVING AVG(sal) >= 2000;

6. Pandas ↔ SQL 대응표

작업 Pandas SQL
전체 보기 df SELECT * FROM emp
열 선택 df[["ename","sal"]] SELECT ename, sal FROM emp
필터링 df[df["sal"] >= 2000] WHERE sal >= 2000
정렬 sort_values("sal", ascending=False) ORDER BY sal DESC
상위 N개 .head(5) LIMIT 5
그룹 집계 groupby("deptno")["sal"].mean() GROUP BY deptno + AVG(sal)
테이블 합치기 pd.merge(df1, df2, on="key") JOIN ... ON

7. 오늘의 실습 문제 (SQL)

EMP 테이블 기반 실습 — freesql.com (Oracle 기반)

-- 문제1: 급여 2000 이상, 높은 순 정렬
SELECT ENAME, JOB, SAL
FROM EMP
WHERE SAL >= 2000
ORDER BY SAL DESC;

-- 문제2: SALESMAN 중 커미션이 있는 직원
SELECT ENAME, COMM
FROM EMP
WHERE JOB = 'SALESMAN' AND COMM IS NOT NULL;

-- 문제3: 이름에 'A' 포함, 급여 내림차순
SELECT ENAME, DEPTNO, SAL
FROM EMP
WHERE ENAME LIKE '%A%'
ORDER BY SAL DESC;

-- 문제4: 급여 1500~3000 사이
SELECT ENAME, SAL
FROM EMP
WHERE SAL BETWEEN 1500 AND 3000;

-- 문제5: 이름이 S로 시작하는 직원
SELECT ENAME, HIREDATE
FROM EMP
WHERE ENAME LIKE 'S%';

-- 문제6: CHICAGO 위치 부서
SELECT DEPTNO, DNAME
FROM DEPT
WHERE LOC = 'CHICAGO';

오늘의 핵심 정리

  1. Pandas 정렬: sort_values(by="열", ascending=True/False)
  2. Pandas 필터링: df[조건] 또는 df.query("조건")
  3. 결합 패턴: df[조건].sort_values(...).head(n)
  4. SQL 구조: SELECT → FROM → WHERE → GROUP BY → HAVING → ORDER BY
  5. WHERE vs HAVING: WHERE는 행에, HAVING은 그룹 결과에 조건
  6. 이상치 있을 때: mean() 대신 median() 사용

📌 다음에 배울 것: SQL JOIN, 서브쿼리, Pandas groupby 심화