티스토리 뷰

SQL 코드카타

Q153. Average Population

1. 문제 링크: https://www.hackerrank.com/challenges/average-population/problem

2. 정답 코드:

SELECT ROUND(AVG(POPULATION), 0)
FROM CITY;

 

Q134. Weather Observation Station 2

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

2. 정답 코드:

SELECT
    ROUND(SUM(LAT_N), 2),
    ROUND(SUM(LONG_W), 2)
FROM STATION;

 

Q126. 1517. Find Users With Valid E-Mails ★정규 표현식 사용

1. 문제 링크: https://leetcode.com/problems/find-users-with-valid-e-mails/description/

2. 정답 코드:

SELECT *
FROM Users
WHERE mail like "%@leetcode.com%"
  AND (mail like "%_%" OR mail like "%.%" OR mail like "%-%")
  AND left(mail, 1) NOT LIKE '%[^a-zA-Z]%'

# 내가 작성한 쿼리

3. 오류 상황: 원하는 조건대로 필터링이 되지 않음

4. 시도 방법: 조건을 구현하기 위해 SQL에서 알파벳인지 아닌지 판별하는 함수가 무엇인지 생성형 AI에게 물어봄

5. 최종 문제 해결 방법: LIKE 구문을 사용할 순 있지만 여기서는 정규 표현식을 사용하는 것이 훨씬 간단하다!


정규 표현식이란?

: 복잡한 문자열 패턴을 하나의 식으로 표현하는 마법 같은 도구!

 

MySQL에서 REGEXP와 함께 쓰기 위해 꼭 알아야 할 핵심 기호들을 정리해 보자.

 

1) 위치와 수량을 정하는 기호

기호 의미 예시
^ 문자열의 시작 ^A : 'A'로 시작하는 문자열
$ 문자열의 Z$ : 'Z'로 끝나는 문자열
* 앞의 문자가 0번 이상 반복 ab* : 'a', 'ab', 'abbb' 모두 포함
+ 앞의 문자가 1번 이상 반복 ab+ : 'ab', 'abbb'는 되지만 'a'는 안 됨
? 앞의 문자가 0번 또는 1번 존재 ab? : 'a', 'ab'만 해당

 

2) 범위를 지정하는 기호 [ ]

대괄호는 "이 안의 문자 중 하나"라는 뜻이다.

  • [a-z]: 소문자 중 하나
  • [0-9]: 숫자 중 하나
  • [a-zA-Z]: 모든 알파벳 중 하나
  • [^a-z]: 소문자가 아닌 것 (대괄호 안의 ^는 부정을 의미)

3) 특수 문자를 찾을 때 \ (이스케이프)

마침표(.)나 대시(-) 같은 기호들은 정규 표현식 자체에서 특별한 의미로 쓰일 때가 있다. 이들을 문자 그대로 찾고 싶다면 앞에 역슬래시(\)를 붙여준다. (MySQL에서는 종종 \\로 두 번 써야 할 때가 있다.)

  • \. : 마침표 문자 그대로의 .
  • \- : 대시 문자 그대로의 -
💡 문제 적용 팁
이메일 문제를 해결하려면 패턴을 크게 세 부분으로 나누어 생각해 보면 쉽다.

시작 부분: ^[a-zA-Z] (알파벳으로 시작)
중간 부분: [a-zA-Z0-9_.-]* (알파벳, 숫자, _, ., - 가 0개 이상 반복)
끝 부분: @leetcode\.com$ (@leetcode.com으로 끝남)

위의 조각들을 하나로 합치면 REGEXP 뒤에 들어갈 하나의 패턴이 완성된다!
SELECT *
FROM Users
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\.com$'

# 정규 표현식 적용(1) 쿼리


필터링 불가 케이스 발견

그런데 문제가 발생했다..!

winston@leetcode?com 케이스를 필터링하지 못했다.

왜 그런지 다시 살펴보자.

 

winston@leetcode?com이 통과되는 이유는 정규 표현식에서 마침표(.)가 가진 특별한 의미 때문이다.

 

🔍 원인 분석: 정규 표현식에서 그냥 마침표(.)는 "아무 문자 하나"를 의미하는 와일드카드이다.

  • 작성한 패턴: @leetcode\.com$
  • 실제 작동: \.이라고 썼지만, 일부 SQL 환경이나 문자열 처리 방식에 따라 역슬래시(\)가 일반 문자로 해석되어 버리면, 뒤의 .이 "어떤 문자든 한 글자(여기서는 '?')가 와도 된다"라고 인식될 수 있다.

🛠️ 해결 방법

MySQL에서 역슬래시(\) 자체도 특수 문자로 취급되기 때문에, "진짜 마침표"를 의미하려면 역슬래시를 두 번 써야 한다!


2차 문제 발생..!

이번엔 winston@leetcode.COM 케이스를 필터링하지 못했다.

왜 그런지 다시 살펴보자.

 

🔍 원인 분석: MySQL은 기본적으로 대소문자를 구분하지 않는다

MySQL에서 REGEXP는 기본적으로 Case-insensitive(대소문자 무시) 모드로 동작한다.

그래서 우리가 패턴에 소문자로 [a-z]나 \.com이라고 써도, DB는 친절하게도(?) 대문자 [A-Z]나 .COM까지 다 찾아주고 있는 상황!

하지만 이 문제에서는 도메인이 반드시 소문자 .com이어야 한다는 제약 조건이 있기 때문에 문제가 된다..

 

🛠️ 해결 방법

 

  • REGEXP 파트: 이메일의 전체적인 구조(알파벳 시작, 허용된 특수문자, 도메인 형식)를 완벽하게 검증
  • LIKE BINARY 파트: REGEXP에서 자칫 놓칠 수 있었던 "대문자 .COM" 케이스를 확실하게 차단한다. BINARY 키워드가 붙으면 대소문자를 엄격하게 비교!

 


SELECT *
FROM Users
WHERE mail REGEXP '^[a-zA-Z][a-zA-Z0-9_.-]*@leetcode\\.com$' 
  AND mail LIKE BINARY '%@leetcode.com';

# 정답 쿼리

 

정규 표현식을 사용해야 하는 문제가 처음이었는데, 개념이 굉장히 헷갈렸다.
하나를 해결하면 또 다른 하나가 문제가 되어 신경 써야 하는 부분이 많았다.
우선 이런 문제가 있다는 정도로 인식하고 충분히 반복하면서 나중에는 AI 도움 없이도 사용할 수 있도록 해야겠다.

 

라이브 세션) 통계 실습 1일차: 통계적 사고와 기술통계

데이터의 유형

1) 수치형/양적 데이터

  • 이산형: 셀 수 있는 정수 값 (고객 수, 불량품 개수, 클릭 횟수)
  • 연속형: 측정 가능한 실수 값 (키, 몸무게, 온도, 풍속)

2) 범주형/질적 데이터

  • 명목형: 순서 없는 범주 (성별, 혈액형, 지역)
  • 순서형: 순서 있는 범주 (수능 등급, 만족도 등급, 선호도 순위)

• 기술통계/추론통계 비교, 데이터 유형, 측정 척도
• 범주 데이터 분석 (최빈값, 막대도표, 파이차트)
• 중심 지표 (산술평균, 절사평균, 가중평균, 중앙값, 최빈값)
• 산포도 (분산, 표준편차, 범위, IQR, 변동계수)
• 데이터 분포 시각화 (박스플롯, 히스토그램, KDE, 바이올린 도표)
• 왜도와 첨도

 

 

절대온도=비율척도 실제 0이 없음

분산과 표준편차: 평균으로부터 퍼져있는 정도

IQR: 중앙값으로부터 퍼져있는 정도

변동계수: 서로 다른 값들의 퍼져있는 정도도 파악 가능?(확인 필요)

절댓값 말고 분산, 표준편차(제곱 연산) 쓰는 이유 : 미분, 적분 계산 과정을 수월하게 하기 위해

IQR = Q3- Q1 (사분위 범위)

IQR 방법은 중앙값 기반이라 비대칭 분포에 강건(중앙값이 비대칭에 강건하니까)

Z-score 방법은 정규분포 가정 시 적합!

k = 2 95.4

k = 3 → 99.7


라이브 세션) 통계 이론 2일차: 확률과 분포

확률변수

  • 불확실성을 값으로 다루는 도구
  • 불확실성을 숫자로 번역
  • 사건을 숫자로 번역하는 도구
  • 표본공간의 각 원소에 하나의 실수 값을 대응시켜주는 함수

이산형 = 셀 수 있는 것 / 연속형 = 재는 것, 그래프 상에 점을 찍었을 때 언제든 값을 읽을 수 있는 것

 

확률분포는 확률변수가 어떻게 퍼져 있는지 보여주는 지도

  • 이산형은 막대
  • 연속형은 곡선+면적

기댓값 E(X)

  • 확률적으로 기대되는 평균 값
  • 오랫동안 반복했을 때 수렴하는 값

평균 뮤는 분포의 위치를, 시그마는 분포의 퍼짐을 결정한다.

평균은 항상 지렛대의 중심점이니까!


통계학 기초) 챕터 3: 유의성 검정

3-1. A/B 테스트

: 두 버전(A와 B) 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정 방법

  • 마케팅, 웹사이트 디자인 등에서 많이 사용
  • 두 그룹 간의 변화가 우연이 아니라 통계적으로 유의미한지를 확인

A/B 테스트 예시, 출처: 위키백과

보통 p-값이 0.05보다 작으면 두 그룹이 서로 다르다(= 우연이 아니다)


3-2. 가설검정

  • 표본 데이터를 통해 모집단의 가설을 검증하는 과정
  • 데이터가 특정 가설을 지지하는지 평가하는 과정

1) 단계

  • 귀무가설(H0)과 대립가설(H1) 설정
  • 유의수준(α) 결정: 일반적으로는 0.05 사용
  • 검정통계량 계산
  • p-값과 유의수준 비교

2) 통계적 유의성과 p-값

- 통계적 유의: 일반적으로 p-값이 0.05 미만이면 결과를 통계적으로 유의하다고 판단

- p-값: 일반적으로 p-값이 유의수준(α)보다 작으면 귀무가설을 기각


3-3. t검정

  • 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 검정 방법

1) 독립표본 t검정: 두 클래스의 시험 성적 비교

2) 대응표본 t검정: 다이어트 전후 체중 비교 (사람은 그대로고, 상황이 달라짐)


3-4. 다중검정

  • 여러 가설을 동시에 검정할 때 발생하는 문제
  • 각 검정마다 유의수준을 조정하지 않으면 1종 오류(귀무가설이 참인데 기각하는 오류) 발생 확률이 증가
  • 본페로니 보정, 튜키 보정, 던넷 보정, 윌리엄스 보정 등이 있음 → 가장 대표적인건 본페로니 보정 (평균 내듯이 계산해서 유의수준을 더 엄격하게 만드는 과정)


3-5. 카이제곱검정(범주형 데이터 분석)

  • 범주형 데이터의 표본 분포가 모집단 분포와 일치하는지 검정(적합도 검정)
  • 두 범주형 변수 간의 독립성을 검정(독립성 검정)

1) 적합도 검정: 주사위의 각 면이 동일한 확률로 나오는지 검정

  • p값이 높으면 데이터가 귀무 가설에 잘 맞음. 즉, 관찰된 데이터와 귀무 가설이 적합
  • p값이 낮으면 데이터가 귀무 가설에 잘 맞지 않음. 즉, 관찰된 데이터와 귀무 가설이 부적합

2) 독립성 검정: 성별과 직업 만족도 간의 독립성 검정

  • p값이 높으면 두 변수 간의 관계가 연관성이 없음 → 독립성이 있음
  • p값이 낮으면 두 변수 간의 관계가 연관성이 있음 → 독립성이 없음


3-6. 제 1종 오류와 제 2종 오류

1) 제 1종 오류: 귀무가설이 참인데 기각하는 오류(위양성)

  • α를 경계로 귀무가설을 기각하기 때문에 제1종 오류가 α만큼 발생
  • 유의수준(α)을 더 엄밀하게 정함으로써 제 1종 오류 제어 가능
  • 만약, 유의수준이 0.05라면 100번 중 5번 정도 일어날 수 있는 제 1종 오류는 감수하겠다는 것
m개의 검정에서 하나 이상의 제1종 오류가 발생할 확률(즉, 전체 제1종 오류율)은 1 − (1 − α)^m
m이 커질수록 빠르게 증가!

예를 들어, α=0.05, m=10인 경우 1 − (1 − 0.05)^10 ≈ 0.401
10개의 가설을 동시에 검정할 때 하나 이상의 가설에서 제 1종 오류가 발생할 확률이 약 40.1% 이므로
개별검증에서 발생하는 오류율(5%)보다 높다!

 

2) 제 2종 오류: 귀무가설이 거짓인데 기각하지 않는 오류(위음성)

  • 제 2종 오류가 일어날 확률은 β
  • 제 2종 오류가 일어나지 않을 확률은 검정력(1-β)으로 정의
  • 표본크기 n이 커질 수록 β가 작아짐
  • α와 β는 상충관계에 있어서 너무 낮은 α를 가지게 되면 β는 더욱 높아짐
새로운 약물이 효과가 없는데 있다고 결론 내리는 것(제 1종 오류)
효과가 있는데 없다고 결론 내리는 것(제 2종 오류)

어제 배운 내용을 실습으로 다시 정리하는 시간을 가졌는데,
확실히 직접 실습까지 진행하니 이해가 훨씬 잘 되는 느낌이었다.

이전에 품질 관련 공부를 할 때는 통계가 가장 어렵게 느껴졌는데, 이번에 VOD와 라이브 세션을 통해 배우다 보니 왜 그렇게 거부감부터 가졌을까 하는 아쉬움도 들었다.

오늘은 파이썬 코드카타를 진행하려고 계획했지만 시간이 부족해 실행하지 못했다. 그래서 내일은 SQL보다 파이썬 코드카타를 먼저 진행해야겠다!
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함