2025.04.16 본_캠프 40일차

민동·2025년 4월 16일
1

본캠프

목록 보기
39/74
post-thumbnail

SQL 122. Second Highest Salary

문제 설명

Employee 테이블에는 직원들의 급여 정보가 들어 있다. 이 중 두 번째로 높은(distinct) 급여를 구하는 SQL 쿼리를 작성하라.

  • 만약 두 번째로 높은 급여가 존재하지 않으면 null을 반환해야 한다.
  • 결과 컬럼명은 SecondHighestSalary 이어야 한다.

접근 방식

  1. 가장 높은 급여(MAX(salary))를 먼저 구한다.
  2. 그보다 작은 급여들 중에서 다시 최댓값을 구하면, 그것이 두 번째로 높은 급여.
  3. 만약 두 번째 급여가 없다면 null이 반환됨.

최종 쿼리

SELECT MAX(salary) AS SecondHighestSalary
FROM Employee
WHERE salary < (SELECT MAX(salary) FROM Employee);

쿼리 설명

  • SELECT MAX(salary):
    • 전체 급여 중에서 두 번째로 큰 급여를 찾기 위해, 가장 높은 급여를 제외한 값 중에서 다시 MAX()를 사용.
  • WHERE salary < (...):
    • 가장 높은 급여를 제외한 조건을 걸어준다.
  • 중복 급여가 있어도 MAX()는 하나의 값만 반환하므로 DISTINCT가 없어도 작동엔 문제 없음.

SQL 123. Group Sold Products By The Date

문제 설명

Activities 테이블에는 제품이 판매된 날짜와 제품명이 들어 있다.
각 날짜별로 판매된 고유한 제품의 수(num_sold) 와,
판매된 제품들의 이름을 사전순으로 정렬하여 쉼표로 이어붙인 문자열(products) 을 구하라.

출력 컬럼:

  • sell_date : 판매일
  • num_sold : 고유하게 판매된 제품의 수
  • products : 판매된 제품명들을 알파벳 순으로 정렬해 쉼표로 구분한 문자열

내 풀이 (정답 쿼리)

SELECT 
  sell_date,
  COUNT(DISTINCT product) AS num_sold,
  GROUP_CONCAT(DISTINCT product ORDER BY product SEPARATOR ',') AS products 
FROM Activities
GROUP BY sell_date
ORDER BY sell_date;

쿼리 설명

  • COUNT(DISTINCT product)
    → 날짜별로 중복되지 않는 제품 수를 센다.

  • GROUP_CONCAT(DISTINCT product ORDER BY product SEPARATOR ',')
    → 제품들을 알파벳순으로 정렬 후, 쉼표로 연결해서 문자열로 만든다.

  • GROUP BY sell_date
    → 날짜별로 그룹을 묶는다.

  • ORDER BY sell_date
    → 결과를 날짜 기준으로 정렬한다.


python 44번 문제 "최소직사각형"

문제:
최소직사각형

문제설명:
명함의 가로·세로 크기가 담긴 리스트 sizes가 주어질 때,
모든 명함을 수납할 수 있는 가장 작은 지갑의 크기를 구하는 문제.

핵심은 명함을 회전시켜서 세로/가로를 바꿔 넣을 수 있다는 점을 이용하는 것.


내 정답:

def solution(sizes):
    max_w = 0  # 지갑 가로 길이 후보
    max_h = 0  # 지갑 세로 길이 후보
    
    for w, h in sizes:
        w, h = max(w, h), min(w, h)  # 항상 큰 쪽을 가로, 작은 쪽을 세로로 정렬
        max_w = max(max_w, w)
        max_h = max(max_h, h)
        
    return max_w * max_h

정답 쿼리 설명:

  1. for w, h in sizes
    → 모든 명함의 가로/세로를 하나씩 꺼내서 반복

  2. w, h = max(w, h), min(w, h)
    → 회전시킬 수 있으니까 항상 큰 쪽을 가로(w), 작은 쪽을 세로(h)로 정렬

  3. max_w = max(max_w, w)
    → 지금까지 나온 가로 길이 중 가장 큰 것 저장

  4. max_h = max(max_h, h)
    → 지금까지 나온 세로 길이 중 가장 큰 것 저장

  5. return max_w * max_h
    → 결국 가장 큰 가로, 세로를 곱하면 최소 지갑 크기 완성


예시 실행:

print(solution([[60, 50], [30, 70], [60, 30], [80, 40]]))        # 출력: 4000
print(solution([[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]]))   # 출력: 120
print(solution([[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]]))   # 출력: 133

이상탐지

  1. 이상탐지란?
    1. 이상치(Anomoly)의 정의
      • 정상 패턴에서 벗어난 관측값
      • ex) 은행 거래 데이터에서 매운 드문 금액 혹은 비정상적 패턴, 센서 데이터에서 일반적인 동작 범위를 벗어나는 값
    2. 지도학습 vs 비지도 학습
      • 지도 학습
        • Label 이 있는 상태(정답이 필요함 → 정상/이상 라벨링이 완료됨)
        • 정확한 학습 및 평가 가능
        • 그러나, 데이터 라벨링 시간,비용이 많이 듬(사람이 직접 정답 지정해야 함)
      • 비지도 학습
        • 라벨링 안 해도 됨 (ex 군집,밀도기반 탐지등)
        • 라벨링이 필요 없어 비용 적고 빠름
        • 그러나, 정답이 없어 평가가 어려움, 그리고 도메인 지식이 어느정도 필요함

→ 정리하자면. 이상치(Anomaly)란 일반적인 패넡에서 벗어난 소수의 특이한 데이터이며, 이를 빠르고 정확하게 찾는 것이 핵심

  1. 이상탐지 접근 방법

    1. 통계 기반 접근
      • 가정 : 정상 데이터가 특정 분포(정규분포)를 따른다고 가정 → 정규분포가 아니면 main data가 날랄가 위험이 있음 (Like 긴꼬리분포)
      • 장점 : 이해하기 쉽고 계산력이 적음
      • 단점 : 데이터 분포 가정을 벗어나면 성능이 떨어짐
    2. 머신러닝 기반 접근
      1. 비지도 학습 : 정상데이터만으로 모델을 학습 → 이상치를 찾을 수 있음
        • 가정 : 정상 데이터’만’으로 모델을 학습 → 특징(정상)만이라도 제대로 파악하게 됨 → 가정을 해결 → 정상을 잘 파악하게 됨
        • ex) Isolation Forest, LOF,AutoEncoder(딥러닝)
      2. 지도 학습 : 정상/이상 라벨이 있는 데이터로 분류 모델을 학습
        • 현실적으로 이상치 데이터 레이블이 부족하거나 왜곡되어 있는 경우가 많아 적용 어려움
        • 하지만 대부분의 실제 이상 데이터는 라벨이 부족하거나 없음
    특징지도학습비지도학습
    장점정확한 라벨 기반 → 더 높은 분류 정확도 기대라벨 없이도 모델 가능, 다양한 환경에 적용 가능
    단점이상치 라벨 수집 어려움, 불균형 데이터 문제이상 탐지 기준 설정 모호, 정밀도 튜닝 필요
    1. 간단한 통계적 기법
      1. Z-score
        • 각 데이터가 평균으로부터 몇 표준편차 떨어져 있는지를 나타내는 값 image.png
        • 절대값이 일정 기준을 넘으면 이상치로 간주
      2. IQR(Interquartile Range)
        • 1사분위(Q1)와 3사분위(Q3) 사이 범위
        • IQR = Q3-Q1
        • 이상치 판단 기준
          • 값 < (Q1 - 1.5IQR) OR 값>(Q3 + 1.5IQR)
    2. 머신러닝 기법
      1. Isolation Forest (비지도 이상탐지 가능)

        • 무작위로 특징을 선택하고 분할하면서 샘플을 고립(isolation) 시키는 방식(by 트리)
        • 정상 데이터는 여러 단계로 나눠야 하지만, 이상치는 적은 분할만으로도 격리 가
        • 이상치는 소수이면서 빠르게 고립될 것이라는 가정
        • scikit-learn의 IsolationForest 클래스로 간단하게 사용 가능
        • 노드를 계속 나눌 때 이상치는 빨리 혼자 남음 → 이게 이상치임을 의미
      2. LOF (Local Outlier Factor)

        • 한 데이터 포인트가 주변 데이터 밀도와 비교해 얼마나 외각에 있는 측정
        • 이상치로 의심되는 샘플일수록 주변 이웃(Neighbor)밀도가 현저히 낮음
        • 밀고 기반 이상치 탐지
        • 주변 밀도가 낮으면 이상치로 간주
        • 다차원 이상 탐지 가능하지만 새로운 데이터 예측 불가능
      3. One-Class SVM

        • One-Class SVM은 정상 데이터만을 사용해 경게를 학습하고, 이 경계를 벗어나는 데이터들을 이상치로 분류하는 비지도학습
        • 정상 데이터만 알면 나머지는 알아서 특징이 찾아짐
        • v(nu)라는 파라미터로 결정 경계의 유연성을 조절하며, 일반적으로 데이터 중 이상치로 판단하는 비율을 추정하는 역할
        알고리즘방식특징 및 장점단점
        Isolation Forest트리 기반빠르고 확장성 좋음, 해석 가능파라미터 민감
        LOF밀도 기반국소 밀도 비교로 미묘한 이상 탐지predict() 불가
        One-Class SVM커널 기반비선형 이상 탐지, 결정경계 학습느림, 고차원에 약함
    3. 평가 방법 & 마무리
      1. 평가지표
        • Precision,Recall : 이상치 탐지가 정확히 이상치만 골라내는지(Precision), 놓친 이상치는 없는지(Recall_
        • F1_score : Precision과 Recall의 조화평균
        • ROC AUC : 이상치에 대한 스코어를 기반으로 계산 가능 (지도학습 상황)
        • 실제 현업에서는 이상치 라벨이 부족하거나 없는 경우가 많으므로, 샘플조사나 도메인지식과의 결합이 매우 중요
      2. 마무리
        • 간단한 통계 기법은 이해하기 쉽고 계산 비용이 적지만, 분포 가정이 맞지 않으면 한계
          머신러닝 기법은 비지도학습 방식으로 유연하게 적용 가능. 다만 하이퍼파라미터(예:
          contamination 등)에 따라 결과가 많이 달라질 수 있음
        • 추가학습
          • PyOD 라이브러리(이상탐지를 위한 파이썬 라이브러리)
          • 딥러닝 기반 Autoencoder를 활용한 이상치 탐지 기법
          • 시계열(Time Series) 데이터 이상탐지 기법
profile
아자아자

0개의 댓글