티스토리 뷰
SQL 코드카타
Q157. Top Earners
1. 문제 링크: https://www.hackerrank.com/challenges/earnings-of-employees/problem
2. 정답 코드:
SELECT
(months * salary) as total,
COUNT(*)
FROM Employee
WHERE (months * salary) = (SELECT MAX(months * salary) FROM Employee)
GROUP BY total;
집계 함수가 아닌 (months * salary) 컬럼은 GROUP BY로 묶어주기!
WHERE 절에서 monthe * salary는 2개 컬럼을 연결한 값이기 때문에 비교할 때 괄호로 적어주기
Q158. Weather Observation Station 13
1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-13/problem
2. 정답 코드:
SELECT ROUND(SUM(LAT_N), 4)
FROM STATION
WHERE LAT_N > 38.7880 AND LAT_N < 137.2345;
Q170. Weather Observation Station 20
1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-20/problem
2. 정답 코드:
SELECT ROUND(LAT_N, 4)
FROM (SELECT LAT_N, ROW_NUMBER() OVER (ORDER BY LAT_N DESC) AS rnk FROM STATION) as sub
WHERE rnk = (SELECT CEIL(COUNT(*)/2) FROM STATION)
3. 오류 상황: 중앙값의 순서를 찾는 방법을 쿼리로 구현하지 못함
4. 시도 방법: 생성형 AI를 활용해 힌트를 얻음
5. 최종 문제 해결 방법: 쿼리 구조 변경
[문제 풀이 순서]
1. FROM 절에 윈도우 함수를 사용하여 서브쿼리 작성 → ROW_NUMBER() OVER (ORDER BY LAT_N DESC)
PARTITION BY가 아닌 ORDER BY를 쓰는 구조라서 익숙하지 않았다.
2. 중앙값의 순서를 찾기 위해 WHERE 절에서 서브쿼리 사용 → (SELECT CEIL(COUNT(*)/2) FROM STATION)
CEIL을 하지 않으면 COUNT(*)/2이 정수가 되지 않을 때 값이 나오지 않으므로 무조건 CEIL 해줘야 한다!
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에 안 들어가니까
라이브 세션) 머신러닝 실습 4일차: 평가지표
sigmoid 쓰는 이유? 0~1 사이의 확률 값으로 만든다!
(sin 함수도 되는데 왜 sigmoid 쓸까? → 로짓(로그 + 오즈)을 가지고 확률 값을 구하기로 정의했기 때문에!)
로지스틱 회귀 = 로짓을 예측하는 회귀 → 로짓 값을 가지고 확률도 구할 수 있다! (분류)
태어난 핏줄은 회귀이지만, 출생의 비밀로 인해 현재 분류로 살아가고 있다.
오버피팅 막기 위해서 아래와 같은 하이퍼파라미터 조정!
1) C(규제 강도의 역수)
규제(regularization) = 극단적인 값이 안 나오도록 제한해주는 역할 (≠ 정규화(normalization))값이 작을수록 규제가 강함값이 클수록 규제가 약함2) penaltyl2(가장 일반적)l1(불필요한 feature를 0으로 만들 수 있음 → feature selection 효과)
accuracy 쓰면 좋지만 불균형 데이터일 때는 f1-score를 봐야 하기 때문에, 주로 f1-score를 보면 값을 파악하기 용이하다!
트리기반 모델에서는 스케일링 안해도 괜찮다! → 실무에서 많이 사용
3) Base Rate Fallacy (기저율 오류)
기저율 = 사전 확률(Base Rate)→ 어떤 사건이 발생할 확률을 전체적으로 바라본 기본 확률기저율 오류 → 특정 정보(추가 정보, 단서)에만 주목하고 전체 집단의 기본 확률(Base Rate)을 무시해 잘못된 판단을 하는 오류
라이브 세션) 머신러닝 이론 5일차: 분류
1) KNN (K-Nearest Neighbors) - 거리 기반 다수결
KNN은 지도학습 → 훈련 데이터에 이미 정답 값이 있음!
(정답값을 기준으로 + k개 기준으로) 새로운 데이터가 뭔지 분류!
KNN에서는 모델 성능보다는 어떤 데이터를 넣었는지가 중요함!
- k값
- 거리(어떤 거리 공식 적용했는지?)
- 스케일링
(1) k값(홀수로 → 동률 방지하기 위해서)
| k값 | 특징 | 문제 |
| k 작음(1~3) | 경계가 복잡 | 노이즈에 민감 → 과적합 |
| k 큼(15~) | 경계가 단순 | 세부 패턴 놓침 → 과소적합 |
| k 적당 | 균형 | 교차검증(CV)으로 찾기 |
(2) 거리(유클리드 거리) : 피타고라스 정리 기반
(3) 스케일링 필수 : 거리 구하려면 단위 맞춰야 하니까?
스케일링 전후 Accuracy 차이가 많이 남!
근데 스케일링을 한다고 해서 무조건 Accuracy가 올라가는 것은 아님 → 더 정확한 결과가 나오는 것!
2) 결정 트리
각각의 박스 = 노드
gini: 불순도 → 0에 가까울 수록 혼란이 없어진다!
max_depth를 None(횟수 제한 X)으로 할 때, max_depth = 3인 경우보다 Accuracy가 더 낮았음!
→ 왜? 과적합으로 인해서 새로운 문제는 못풀기 때문에
좋은 질문 = gini(불순도)를 낮출 수 있는 질문!
2클래스 기준, gini(불순도) : 0 ~ 0.5
+ gini(불순도) 말고 엔트로피라는 값도 있음 (gini에 비해 계산 속도 느림)
(1) 하이퍼파라미터
- max_depth
- min_samples_split
- min_samples_leaf
→ 같은 max_depth를 설정해줘도, min_samples_split이나 min_samples_leaf 조건에 위배되면 depth가 바뀔 수 있다!
(2) Feature Importance
불순도를 낮출 때 가장 기여했던 Feature를 말함 → 제일 중요한 Feature라는 뜻은 아님!
Feature가 많이 사용됐다는 뜻일 뿐 인과관계 성립을 말하는 것은 아님
F1, F2, F3이 비슷하다면 중요도를 나눌 수 있다? 하나의 Feature를 안 쓰는 것도 방법
(3) 결측치와 클래스 불균형 처리
- 결측치(NaN)가 있으면 결정 트리 적용 못함 → SimpleImputer로 채워야 함
- class_weight='balanced'를 사용하면 소수 클래스에 더 큰 가중치를 부여해서 균형 있는 학습을 시킬 수 있다
데이터 과학이나 머신러닝 공부를 시작하면 반드시 마주치게 되는 '차원의 저주(Curse of Dimensionality)'는 데이터의 차원(변수/특성)이 늘어날수록 오히려 모델의 성능이 떨어지고 분석이 어려워지는 현상을 말한다.
쉽게 말해, "정보(변수)가 많아질수록 더 정확해질 것 같지만, 실제로는 데이터가 너무 희소해져서 아무것도 찾을 수 없게 되는 상황"
1. 왜 이런 현상이 발생할까?
차원이 늘어남에 따라 우리가 직면하는 가장 큰 문제는 공간의 급격한 팽창
- 데이터의 희소성 (Sparsity): 차원이 증가하면 공간의 부피가 기하급수적으로 늘어난다. 하지만 데이터의 양은 그대로라면, 데이터 사이의 거리가 너무 멀어져 빈 공간이 대부분을 차지하게 된다.
- 거리 개념의 상실: 고차원에서는 모든 데이터 포인트 사이의 거리가 거의 비슷해진다. '가까운 이웃'과 '먼 이웃'의 구분이 모호해져서, 거리 기반 알고리즘(예: KNN, Clustering)이 제대로 작동하지 않는다.
2. 시각적인 예시 (상자에 담긴 공)
이해를 돕기 위해 1차원에서 3차원으로 확장되는 과정을 상상해 보자.
| 차원 | 비유 | 설명 |
| 1차원 (선) | 10cm 선 위에 점 10개 | 점들이 촘촘하게 모여 있어 패턴을 찾기 쉽다. |
| 2차원 (면) | 10x10 사각형 안에 점 10개 | 점들이 여기저기 흩어지기 시작한다. |
| 3차원 (입체) | 10x10x10 상자 안에 점 10개 | 점들이 어디 있는지 찾기도 힘들 정도로 휑해진다. |
만약 이게 100차원이라면? 데이터는 마치 광활한 우주에 떠 있는 먼지처럼 서로 너무 멀리 떨어져 있게 된다.
3. 어떻게 해결하나요?
데이터 과학자들은 이 '저주'를 풀기 위해 다음과 같은 전략을 사용한다.
- 차원 축소 (Dimension Reduction): 중요하지 않은 변수는 버리거나, 여러 변수를 합쳐 핵심적인 특성만 추출한다. (예: PCA, LDA)
- 데이터 추가 확보: 차원이 늘어난 만큼 공간을 채울 수 있도록 훨씬 더 많은 양의 데이터를 수집한다. (현실적으로 가장 어렵다.)
- 규제(Regularization) 적용: 모델이 너무 복잡해져서 개별 데이터(노이즈)에 과적합(Overfitting)되지 않도록 제약을 건다. (예: L1, L2 규제)
결국 차원의 저주는 "과유불급"이라는 말과 통한다. 변수가 많다고 무조건 좋은 게 아니라, 모델이 감당할 수 있을 만큼의 핵심 정보만 남기는 것이 기술!
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 43일차) 내일배움캠프 데이터 분석 TIL - 머신러닝(8) (0) | 2026.02.25 |
|---|---|
| 42일차) 내일배움캠프 데이터 분석 TIL - 머신러닝(7) (0) | 2026.02.24 |
| 40일차) 내일배움캠프 데이터 분석 TIL - 머신러닝(5), QCC (0) | 2026.02.20 |
| 39일차) 내일배움캠프 데이터 분석 TIL - 머신러닝(4) (0) | 2026.02.19 |
| 38일차) 내일배움캠프 데이터 분석 TIL - 머신러닝(3) (0) | 2026.02.13 |
- Total
- Today
- Yesterday
- 데이터분석
- 머신러닝
- 파이썬입문
- 텍스트분석
- Til
- 파이썬
- GoogleColab
- 데이터분석입문
- 코드카타
- 구글코랩
- 중학생코딩
- SQL
- github
- 코딩처음
- 통계
- git
- 내일배움캠프
- 판다스
- Tableau
- 코딩기초
- 데이터시각화
- 프로그래밍입문
- 태블로
- 비전공자코딩
- Python
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
