티스토리 뷰
SQL 코드카타
Q154. Japan Population
1. 문제 링크: https://www.hackerrank.com/challenges/japan-population/problem
2. 정답 코드:
SELECT SUM(POPULATION)
FROM CITY
WHERE COUNTRYCODE = 'JPN';
Q135. Weather Observation Station 3
1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-3/problem
2. 정답 코드:
SELECT DISTINCT CITY
FROM STATION
WHERE ID % 2 = 0;
Q137. Weather Observation Station 5
1. 문제 링크: https://www.hackerrank.com/challenges/weather-observation-station-5/problem
2. 정답 코드:
SELECT
CITY,
LENGTH(CITY) as length
FROM STATION
ORDER BY length DESC, CITY ASC
LIMIT 1
)
UNION
(
SELECT
CITY,
LENGTH(CITY) as length
FROM STATION
ORDER BY length ASC, CITY ASC
LIMIT 1
)
Python 코드카타 (https://github.com/heeso0908/codekata.git)
Q46. 숫자 문자열과 영단어
1. 문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/81301
2. 정답 코드:
def solution(s):
num = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
for key, value in num.items():
s = s.replace(key, str(value))
return int(s)
이 문제에서는 숫자+영단어의 맵핑 정보를 담은 num 이라는 딕셔너리를 생성한 후 replace 메서드를 이용해서 바꿔주는 코드가 필요하다.
딕셔너리에서 for 문과 .items() 메서드를 사용해 key 값과 value 값을 언패킹하여 가져온다.
처음에는 num 딕셔너리를 생성할 때, {0:'zero', 1:'one', ...} 이런 순서로 작성했지만 문제에서는 알파벳을 숫자로 변환해야 하므로 그 순서를 반대로 해주면 더 효율적인 코드를 작성할 수 있다.
라이브 세션) 통계 실습 3일차: 확률 기초와 확률 분포 & 추정과 가설검정
1) 중심극한정리 (Central Limit Theorem)
표본 크기가 충분히 크면, 표본평균의 분포는 정규분포에 가까워진다

예를 들어, 주사위 눈의 분포는 균등 분포(정규분포가 아님)이지만
주사위를 30번 던져서 평균을 구하는 실험을 수천 번 반복하면
그 평균들의 분포는 정규분포 모양이 된다.
이것이 통계학에서 정규분포가 그토록 중요한 이유이다.
보통 n이 30 이상이면 정규 분포에 근사?
P(X ≥ x) : x 이상일 확률
- 연속형: P(X ≥ x) = P(X > x) → dist.sf(x) (한 점의 확률 = 0이므로 초과와 같음)
- 이산형: P(X ≥ k) = P(X > k-1) → dist.sf(k - 1) (또는 1 - dist.cdf(k - 1))
| 통계량 | Statistic | 표본에서 계산한 값 — 표본마다 달라짐 |
대표 예시: 표본평균의 표본분포
| 성질 | 수식 | 의미 |
| 기대값 | E[Xˉ]=μ | 표본평균의 평균은 모평균과 같다 (불편성) |
| 분산 | Var(Xˉ)=σ2n | n이 커질수록 분산 감소 → 더 정밀한 추정 |
| 표준오차(SE) | SE=σn | 표본평균들의 표준편차 (추정의 정밀도) |
모집단이 어떤 분포든 상관없이, 표본크기 n이 충분히 크면 (보통 n ≥ 30), 표본평균 Xˉ의 분포는 정규분포에 가까워짐


CLT에 대한 흔한 오해
| 오해 | 진실 |
| "개별 데이터가 정규분포를 따른다" | 개별 데이터는 그대로이며, 평균의 분포만 정규분포가 된다 |
| "많이 반복하면 정규분포가 된다" | 표본 크기(n) 가 클수록 정규분포에 가까워지며, 반복 횟수는 분포 모양과 무관 |
| "모든 통계량이 정규분포를 따른다" | 평균(또는 합계) 에만 적용됨. 중앙값, 최댓값 등은 해당되지 않는다 |
| "n ≥ 30이면 무조건 충분하다" | 30은 경험적 기준일 뿐, 모집단의 원래 분포에 따라 다르다 |
표준오차의 의미를 직관적으로 이해하기
모집단 → 표본1(n=100) → 평균1
→ 표본2(n=100) → 평균2
→ 표본3(n=100) → 평균3
→ ... 무한반복 ...
이 평균들(평균1, 평균2, ...)의 표준편차 = 표준오차
하지만 실제로는 표본을 한 번만 뽑으므로, 분산의 성질에서 유도된 공식 SE = σ / √n 을 사용한다.
(σ를 모르면 s로 대체: SE = s / √n)
모평균의 신뢰구간
| 조건 | 공식 | 사용 상황 |
| σ를 아는 경우 | Xˉ±zα/2⋅σn | 거의 없음 (이론적) |
| σ를 모르는 경우 | Xˉ±tα/2,n−1⋅sn | 실무에서 대부분 이 경우 |
오차한계 = (임계값) × (표준오차) 라는 구조를 기억!
신뢰수준과 구간 너비의 관계
| 신뢰수준 | z 임계값 | 구간 너비 | 특징 (n이 고정일 때를 가정) |
| 90% | 1.645 | 좁음 | 덜 확신하지만 정밀한 추정 |
| 95% | 1.960 | 보통 | 가장 널리 사용 (기본값) |
| 99% | 2.576 | 넓음 | 매우 확신하지만 추정이 넓어짐 |
Trade-off 관계 :
신뢰수준을 높이면 → 구간이 넓어지고 → 정밀도가 떨어진다
반대로 신뢰수준을 낮추면 → 구간이 좁아지지만 → 틀릴 가능성이 높아진다
n 크기를 키우면 구간도 좁히고 틀릴 가능성도 낮출 수 있음
추정이 목적일 때 표본크기 결정
"오차한계를 특정 값 이하로 하려면 표본이 얼마나 필요한가?"

| 변수 | 의미 | 예시 |
| n | 필요한 표본크기 | 구하려는 값 |
| z | 신뢰수준에 해당하는 z값 | 95% → 1.96, 99% → 2.576 |
| σ | 모표준편차 (사전 추정치) | 예비조사 또는 선행연구에서 추정 |
| E | 원하는 오차한계 | 예) ±3%p, ±0.5cm |
간접 증명 방식 (반증의 논리)
대립가설을 직접 증명하는 것은 불가능 (표본 기반 추론의 한계)
따라서 반증의 논리를 사용한다:
"귀무가설이 참이라면 이런 극단적 결과가 나올 확률이 매우 낮다
→ 귀무가설 기각 → 대립가설 지지"
한계: 귀무가설 기각 → 대립가설을 "지지"할 뿐, "확실한 증명"이 아니다. 5% 유의수준 = 20번 중 1번은 틀릴 가능성이 있다.
귀무/대립가설을 반대로 설정할 수 있을까?
일반 검정은 "있음"을 증명하는 구조이므로, 반대로 증명할 수 없다.
✅ 올바른 설정:
H₀: 신약 효과 = 0 (효과 없음)
H₁: 신약 효과 ≠ 0 (효과 있음)
❌ 잘못된 설정:
H₀: 신약 효과 있음
H₁: 신약 효과 없음
"효과 없음"을 증명하고 싶다면? → 동등성 검정(Equivalence Test)이라는 특수 검정을 사용해야 함
(예: 제네릭 의약품이 오리지널과 동등함을 증명할 때)
2) p-value와 유의수준
p-value란?
p-value = 귀무가설이 참이라고 가정했을 때, 현재 관찰한 결과보다 같거나 더 극단적인 결과가 나올 확률
쉽게 말하면: "H₀가 맞다면, 이런 결과가 나올 확률이 얼마나 되나?"
p-value 계산 과정
- H₀ 하에서 검정통계량의 분포를 정한다
- 표본 데이터로 검정통계량을 계산 (예: z = (x̄ - μ₀) / (σ/√n))
- 검정 방향에 따라 꼬리 확률을 구한다
| 검정 방향 | 대립 가설 | p-value 계산 | scipy 코드 |
| 양측검정 | H₁: μ ≠ μ₀ | 양쪽 꼬리 합 | 2 * stats.norm.sf(abs(z)) |
| 우측검정 | H₁: μ > μ₀ | 오른쪽 꼬리 | stats.norm.sf(z) |
| 좌측검정 | H₁: μ < μ₀ | 왼쪽 꼬리 | stats.norm.cdf(z) |
유의수준 (α)
유의수준 α = "H₀를 잘못 기각할 위험을 이 정도까지 감수하겠다"는 사전 기준
보통 α = 0.05 (5%)를 사용
판정 규칙
| p-value 결과 | 판정 | 해석 |
| p ≤ α | H₀ 기각 | "이 결과가 우연이라고 보기 어렵습니다" → 통계적으로 유의 |
| p > α | H₀ 기각 실패 | "이 결과가 우연일 수 있다" → 판단 보류 |
"기각 실패" ≠ "H₀가 참" — 증거가 부족해서 판단을 보류한 것일 뿐, H₀가 맞다고 증명된 것은 아님
📊 통계 분석 핵심 공식 및 판정 가이드
1) 신뢰구간 (Confidence Interval)
모평균이 존재할 것으로 기대되는 범위를 추정
| 구분 | 조건 | 공식 |
| 모표준편차(σ)를 알 때 | 정규분포(z) 사용 | 평균 ± z(α/2) * (σ / √n) |
| 모표준편차(σ)를 모를 때 | t-분포 사용 | 평균 ± t(α/2, n-1) * (s / √n) |
| 표본 크기 결정 | 허용 오차($E$) 기준 | n = [ (z(α/2) * σ) / 허용오차E ]² |
2) 검정통계량 (Test Statistics)
가설의 유의성을 판단하기 위해 계산하는 값입니다.
| 검정 종류 | 사용 상황 | 공식 |
| z-검정 | $\sigma$를 알고 표본이 클 때 | z = (표본평균 - 모평균) / (표준편차 / √n) |
| 단일표본 t-검정 | 한 집단의 평균 vs 특정 값 | t = (표본평균 - 모평균) / (표본표준편차 / √n) |
| 독립표본 t-검정 | 서로 다른 두 집단의 평균 비교 | t = (평균1 - 평균2) / √[ (표준편차1²/n1) + (표준편차2²/n2) ] |
| 대응표본 t-검정 | 동일 집단의 전/후 비교 | t = 차이평균 / (차이표준편차 / √n) |
| Cohen's d | 효과 크기(Effect Size) 측정 | d = |평균1 - 평균2| / 통합표준편차 |
3) Python 실전 함수 (scipy.stats)
데이터 분석 시 실제로 호출하는 핵심 메서드입니다.
| 함수명 | 용도 | 주요 파라미터 및 팁 |
| stats.t.interval() | 신뢰구간 계산 | confidence, df, loc(평균), scale(표준오차) |
| stats.t.ppf() | 임계값(Critical Value) | 누적확률과 자유도를 넣어 t-값 산출 |
| stats.ttest_1samp() | 단일표본 검정 | popmean: 비교하고자 하는 기준 평균값 |
| stats.ttest_ind() | 독립표본 검정 | equal_var=False: 등분산성이 깨질 때(Welch's) |
| stats.ttest_rel() | 대응표본 검정 | 두 데이터의 길이가 같아야 함 |
| stats.sem() | 표준오차(SEM) | $\frac{s}{\sqrt{n}}$ 값을 즉시 계산 |
4) 가설검정 판정 규칙
p-value를 보고 결론을 내리는 최종 단계입니다.
| 결과 (p-value) | 결정 (Decision) | 통계적 의미 | 실무적 해석 |
| p ≤ α | 귀무가설(H0) 기각 | 유의미한 차이 있음 | "우연히 일어날 확률이 매우 희박합니다." |
| p > α | 귀무가설(H0) 채택 안 함 | 유의미한 차이 없음 | "차이가 있다고 말할 증거가 부족합니다." |
라이브 세션) 통계 이론 4일차: 가설검정
1) 가설검정 기초
- σ를 알면, 정규 분포 → ± 1.96
- σ를 모르면, 표본 s 사용 → t 분포





2) 가설검정 심화



정규성을 보는 시각화 : QQ Plot
정규성을 확인? : shapiro

비모수 검정 ↓

- 3개 이상 평균 비교 : 분산분석(ANOVA)
F 값 = 집단 간 분산 / 집단 내 분산
F 값이 클 수록 집단 간 차이가 크다!
F 값이 작고 1에 가까울 수록 변동이 큰 것



- 사후검정

- 비율·범주형 : 평균 대신 확률을 비교




- 가정 점검 : 정규성·등분산성·독립성

정규성을 보려면 Q-Q Plot과 Shapiro-Wilk 를 보자!







오늘은 가설검정에 대해 자세히 배웠는데, 심화 단계로 들어가면서 이해가 잘 되지 않는 부분이 많아졌다.
복습을 하려고 했지만 라이브 세션이 늦게 끝나 충분히 정리하지 못한 점이 아쉽다.
VOD 강의와 통계 101 서적을 활용해 가설검정 개념을 조금 더 쉽게 정리한 뒤, 라이브 세션 내용을 다시 봐야 할 것 같다.
'내일배움캠프 데이터 분석' 카테고리의 다른 글
| 36일차) 내일배움캠프 데이터 분석 TIL - 통계(6), 머신러닝(1) (0) | 2026.02.11 |
|---|---|
| 35일차) 내일배움캠프 데이터 분석 TIL - 통계(5) (0) | 2026.02.10 |
| 33일차) 내일배움캠프 데이터 분석 TIL - 통계(3) (0) | 2026.02.06 |
| 32일차) 내일배움캠프 데이터 분석 TIL - 통계(2) (1) | 2026.02.05 |
| 31일차) 내일배움캠프 데이터 분석 TIL - 통계(1) (0) | 2026.02.04 |
- Total
- Today
- Yesterday
- 파이썬입문
- GoogleColab
- 구글코랩
- 내일배움캠프
- 파이썬
- 데이터분석입문
- git
- Python
- 판다스
- 데이터분석
- 텍스트분석
- Tableau
- 머신러닝
- SQL
- 코딩기초
- 통계
- 프로그래밍입문
- 데이터시각화
- 비전공자코딩
- 태블로
- github
- Til
- 코드카타
- 중학생코딩
- 코딩처음
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
