티스토리 뷰

SQL 코드카타

Q159. Weather Observation Station 14

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-14/problem

2. 정답 코드:

SELECT ROUND(MAX(LAT_N), 4)
FROM STATION
WHERE LAT_N < 137.2345;

 

Q160. Weather Observation Station 15

1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-15/problem

2. 정답 코드:

SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE LAT_N = (SELECT MAX(LAT_N) FROM STATION WHERE LAT_N < 137.2345);

 

Q171. The Report

1. 문제 링크: https://www.hackerrank.com/challenges/the-report/problem

2. 정답 코드:

SELECT
    IF(Marks < 70, NULL, Name) as Name,
    CASE
        WHEN marks >= 90 THEN 10
        WHEN marks >= 80 THEN 9
        WHEN marks >= 70 THEN 8
        WHEN marks >= 60 THEN 7
        WHEN marks >= 50 THEN 6
        WHEN marks >= 40 THEN 5
        WHEN marks >= 30 THEN 4
        WHEN marks >= 20 THEN 3
        WHEN marks >= 10 THEN 2
        ELSE 1
    END AS Grade,
    Marks
FROM Students
ORDER BY Grade DESC, Name, Marks;

+ 여기서 서브쿼리를 활용해 더 간단하게 작성할 수 있다!

SELECT 
    IF(G.Grade < 8, NULL, S.Name), 
    G.Grade, 
    S.Marks
FROM Students S
JOIN Grades G ON S.Marks BETWEEN G.Min_Mark AND G.Max_Mark
ORDER BY G.Grade DESC, S.Name ASC, S.Marks ASC;

 

CASE 문으로 일일이 점수를 나열하는 대신, BETWEEN을 활용한 조인(Join) 기법을 사용한 점이 핵심!

구조별로 나누어 살펴보자.

 

1. JOIN ... ON S.Marks BETWEEN ... (비등가 조인)

보통 JOIN은 A.id = B.id처럼 값이 딱 떨어지는 경우에 쓰지만, 여기서는 범위를 사용했다.

  • 동작 방식: 학생의 점수(S.Marks)가 Grades 테이블에 정의된 최솟값(Min_Mark)과 최댓값(Max_Mark) 사이에 있다면 두 테이블을 합친다.
  • 장점: CASE WHEN marks >= 90... 처럼 길게 코드를 짤 필요가 없다. 등급 기준이 바뀌어도 Grades 테이블의 데이터만 수정하면 쿼리는 그대로 쓸 수 있어 유지보수가 매우 좋다.

2. IF(G.Grade < 8, NULL, S.Name)

이 부분은 출력 화면에 보여줄 이름의 조건부 노출을 결정한다.

  • 조건: 조인된 결과에서 Grade가 8보다 작으면(즉, 1~7등급) 이름을 NULL로 마스킹한다.
  • 결과: 8, 9, 10등급 학생은 이름이 그대로 나오고, 나머지는 이름 없이 성적과 점수만 나온다.

3. ORDER BY G.Grade DESC, S.Name ASC, S.Marks ASC

문제에서 요구하는 까다로운 정렬 조건을 한 줄로 해결!

  1. G.Grade DESC: 일단 성적이 높은 순서대로(10등급부터) 줄을 세운다.
  2. S.Name ASC: 같은 등급(8~10) 내에서는 이름을 알파벳 순서로 정렬한다.
  3. S.Marks ASC: 이름이 NULL인 학생들(1~7등급)은 이름 정렬이 의미가 없으므로, 그 안에서 점수가 낮은 순서대로 정렬한다.

Python 코드카타 (https://github.com/heeso0908/codekata.git)

Q53. 명예의 전당 (1)

1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/138477

2. 정답 코드:

def solution(k, score):
    answer = []
    temp = []
    for n in score:
        if len(temp) < k:
            temp.append(n)
            answer.append(min(temp))
        elif len(temp) == k:
            if min(temp) < n:
                temp.remove(min(temp))
                temp.append(n)
                answer.append(min(temp))
            else: 
                answer.append(min(temp))
    
    return answer

# 내가 작성한 코드

상위 k개 점수를 저장하는 temp 리스트와 최하위 점수를 저장하는 answer 리스트로 구분!  
if문을 중첩해서 작성해야 하는데,  

1) temp 리스트에 k개만 들어가야 하므로 len(temp)가 k보다 작을 때와 같을 때 2가지 케이스로 먼저 나눈다  
→ k보다 작을 때는 temp.append(n), 그리고 최하위 점수를 출력하기 위해 answer.append(min(temp))  

2) len(temp) == k 일 때는 경우가 나뉘는데,  
   새로 들어가는 n이 기존 최소값보다 클 때 → 기존 min(temp) 값을 remove 하고 n을 append 한 후 answer.append(min(temp)) 해준다! ★중요★
   새로 들어가는 n이 기존 최소값보다 작거나 같을 때 → answer.append(min(temp)) → n은 어차피 temp에 안 들어가니까

라이브 세션) 머신러닝 실습 5일차: 평가지표

로지스틱 회귀 : train 시간이 긺

의사결정트리 : train 시간이 긺(트리를 만들 때 시간이 걸림)

KNN : 학습 단계 X → test 데이터가 주어져야지만 계산 시작(이때부터 시간 오래 걸림)

 

실무에서 사용하기에는 KNN은 test 시간이 길어서 사용 지양하는 편!

(데이터가 많아질 수록 test 시간이 기하급수적으로 증가함)

 

실무에서 가장 좋은 모델은? 의사결정트리 기반 앙상블 모델!

→ 스케일링 안해도 됨, 비선형 데이터도 볼 수 있음

 

실시간 학습? ex. 도로 위에서 생기는 상황에서 실시간으로 대처


 1) 주요 하이퍼파라미터 ★중요★

  • max_depth 
  • min_samples_split
  • min_sample_leaf

높을 수록 성능 좋아지긴 하는데

너무 높으면 과적합

너무 낮으면 과소적합

 

+ feature importance 매우매우 중요★

컬럼 개수 변경되는 이유? 전처리 과정에서의 원-핫 인코딩 때문

원-핫 인코딩할 때 꼭 범주형 개수만큼 컬럼 만들지 않아도 된다! (범주형 개수-1) 해도 됨

 

cat_features 가 핵심, pipeline을 사용해서


3) Base Rate Fallacy (기저율 오류)

기저율 = 사전 확률(Base Rate)→ 어떤 사건이 발생할 확률을 전체적으로 바라본 기본 확률

 

기저율 오류 → 특정 정보(추가 정보, 단서)에만 주목하고 전체 집단의 기본 확률(Base Rate)을 무시해 잘못된 판단을 하는 오류
 
(1) 반드시 사전 확률을 먼저 확인!
(2) 평가 지표를 올바르게 선정하기: Accuracy(정확도)를 버린다 (불균형 데이터에서는 정확도는 의미가 없다
      → 정밀도, 재현율, F1-score, AUC-ROC, AUC-PR을 사용)
(3) Oversampling / Undersampling / SMOTE 사용
(4) 시뮬레이션(test) 환경에서 기저율 반영
(5) 예측 임계값(Threshold) 조정
(6) 교차 검증 시 Stratified K-Fold 사용: 불균형 데이터를 균형 있게 나누기 위해 사용

라이브 세션) 머신러닝 이론 6일차: 회귀

얼마나 오를까? 얼마나 내릴까? → '얼마나'를 알아보는 방법!

이것은 A인가 B인가? → 분류 → 경계선(Decision Boundary)을 그어 라벨을 나눔

이것은 얼마인가? → 회귀 → 추세선(Trend Line)을 그어 숫자를 예측

 

1) 추세선(Trend Line)

100% 모든 데이터가 추세선에 맞진 않지만, 노이즈를 감안하고도 최대한 맞출 수 있는 선을 긋는다!

 

y = ax + b 에서,

b(절편, intercept): x가 0일 때 y가 어디서 시작하는가? → 출발점!

a(기울기, coefficient): x가 1 증가할 때마다 y가 평균적으로 얼마나 변하는지! 기울기 부호로 방향도 정해짐


2) 잔차(Residual)

= 실제값 - 예측값

 

잔차와 Loss를 보고 모델이 얼마나 수정해야 하는지? 훈련을 한다!

완전 정확하게 추세선을 그릴 순 없기 때문에(잔차가 0이 될 수 없기 때문에) 이를 최소화하는 것이 목표! 회귀의 한계

 

(1) Loss = 잔차 제곱합(RSS)

데이터가 커질수록 잔차도 무수히 많아지는데 이걸 요약해주는 값이 Loss!

왜 제곱을 할까? 부호를 제거하기 위해 + 큰 오차에 큰 벌점 부여


3) MSE

: 회귀의 기본값

오차가 정규분포를 따른다고 가정!

 

  • MSE: 오차가 클수록 기울기도 커짐 → 큰 오차에 민감(이상치에 약함)
  • MAE: 오차 크기 상관 없이 기울기가 -1 ~ +1 이므로 이상치에는 강하지만 0에서 꺾임
  • Huber: 작은 오차는 MSE처럼 부드럽게, 큰 오차는 MAE처럼 완만하게
정리
MSE: 오차를 '제곱' → 이상치에 매우 민감
MAE: 오차를 '절대값' → 이상치에 강함
Huber Loss: 작은 오차는 MSE 처럼 '제곱' / 큰 오차는 MAE 처럼 '절대값'


4) 최소제곱법(OLS)

: 모든 점의 오차를 가장 공평하게 분산시키는 직선을 찾는 방법! 

  = 모든 데이터의 잔차 제곱합(RSS)을 가장 작게 만드는 직선

y = β1x + β0

β1(기울기), β0(위치),

그래프에서의 ★(가장 작은 Loss = 최적의 β1, β0 조합 = OLS의 해) ← 경사하강법으로 찾음(그래프에서 0 위치)


5) 데이터 전처리

(1) 결측치

(2) 이상치: 분석 목표에 따라서 이상치 제거 여부, 루트 처리 여부 등이 달라짐 (ex. 제조업에서 장비 고장 시기 예측을 위해서는 이상치가 필요할 수도)

(3) 인코딩: 범주형 → 숫자형 으로 변환

(4) 스케일링: feature들 간 수치 비교를 공정하게 하기 위해 필요!

(5) Pipeline: 무조건 쓴다고 생각


6) 다중회귀(Multiple Regression): β계수의 의미와 해석 실습

  • β0 절편(Intercept) 1개
  • β1, β2 ... 각 변수의 기울기(Coefficient)
  • ε 오차항(Residual)

(1) 다중공선성(Multicollinearity)

하나씩 있을 때보다 유사한 것들이 동시에 있을 때 coefficient가 더 작아질 수도 있다

해석의 안정성을 돕는게 상관행렬

 

(2) 다중공선성 진단: Variance Inflation Factor(VIF)

(3) 다중공선성이 회귀계수(가중치)에 미치는 영향: 다중공선성이 존재하면 가중치(β)를 어떻게 배분할지 결정이 모호해짐

데이터가 조금만 바뀌어도 β값이 크게 흔들림 → 회귀계수의 분산이 커짐

→ L2 규제(Ridge): Loss에 α x Σβ^2 항을 추가하여, 큰 계수값에 더 큰 벌점을 부여 → 계수의 해석을 안정화 시키기 위한 방법


7) 모델 평가 + 잔차 분석

TSS = 평균만 찍었을 때 오차(평균이 흔들리는 정도?) 100

RSS = 잔차 제곱합(모델이 흔들리는 정도?) 10

→ R^2 = 1 - RSS/TSS = 0.9 (0~1, 1에 가까울 수록 좋음)

R^2는 정확도 X, 설명력 O!

 

RMSE = MSE의 제곱근 → 오차를 원래 단위로 환산, 직관적 비교 가능

 

1) RMSE >= MAE 차이가 크다면?

  • 큰 오차가 일부 존재한다.
  • 이상치(Outlier)가 일부 존재할 수 있다!

2) 예측값 vs 실제값

예측값 > 실제값 → 과대 예측

예측값 < 실제값 → 과소 예측

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함