JHJ

[내일배움캠프 QAQC 부트캠프]기초통계&머신러닝(2)(27일차, 260618) 본문

[내일배움캠프 QAQC 부트캠프]/TIL

[내일배움캠프 QAQC 부트캠프]기초통계&머신러닝(2)(27일차, 260618)

Jo, Hongjin 2026. 6. 18. 09:54

1. 오늘 학습 키워드:

기초통계, 머신러닝(2일차)





 


2. 오늘 학습 한 내용을 나만의 언어로 정리하기:

통계학 기초

2-1 모집단과 표본

모집단: 전체 집단
표본: 모집단에서 (무작위로) 추출한 일부
표본을 사용하는 이유: 
1. 비용과 시간 면에서 비효율
2. 접근성(모든 데이터에 접근이 물리적으로 불가능) 
3. 대표성(무작위 추출 시, 특성 반영/일반화가 가능)
4. 데이터 관리(처리의 용이성, 품질 관리 등등)

전수조사: 모집단 전체 조사
표본조사: 표본만 조사

numpy.random.normal(loc=0.0, scale=1.0, size=None)
정규분포를 따르는 난수를 생성
loc: 정규분포의 평균 (기본값: 0.0)
scale: 정규분포의 표준편차 (기본값: 1.0)
size : 출력 배열의 크기 (기본값: None, 즉 스칼라 값 반환)

numpy.random.choice(a, size=None, replace=True, p=None)
주어진 배열에서 임의로 샘플링하여 요소를 선택
a: 샘플링할 원본 배열. 정수인 경우 np.arange(a)와 동일
size: 출력 배열의 크기 (기본값: None, 즉 단일 값 반환)
replace: 복원 추출 여부. True면 동일한 요소 여러 번 선택 가능(기본 True)
p: 각 요소가 선택될 확률. 배열의 합은 1.

plt.hist - 추가 셋팅
bins: 빈(구간)의 개수
alpha: 막대의 투명도
label , color: 레이블, 색상

2-2 표본오차와 신뢰구간

표본오차: 표본 통계량과 모집단값 간 차이
무작위 추출을 할수록, 표본 크기가 클수록 값이 작아짐

신뢰구간: 모집단의 특정값에 대해 추정된 값이, 포함될 것으로 기대되는 범위(모집단의 특정값을 포함할 것으로 예상되는 범위)
신뢰구간=표본평균±z×표준오차
z: 선택된 신뢰수준에 해당하는 z-값. (ex. 95% 신뢰수준의 z-값은 1.96)


scipy.stats.t.interval(alpha, df, loc=0, scale=1)
주어진 신뢰 수준에서 t-분포를 사용하여 신뢰 구간을 계산
alpha : 신뢰 수준, ex. 95퍼 구간 -> 0.95
df: 자유도, 일반적으로 df = n - 1
loc: 표본 평균
scale: 표본 표준 오차(표본 표준편차를 표본 크기의 제곱근으로 나눈 값, scale = sample_std / sqrt(n))

2-3 정규분포
정규분포: 평균을 중심으로 좌우 대칭, 멀어질수록 데이터의 빈도 감소
normal_dist = np.random.normal(170, 10, 1000)

중심 극한 정리:  동일한 확률분포를 가진 독립적인 확률 변수들의 분포은 표본의 크기 n이 커질수록 항상 정규분포에 가까워짐

2-4 긴 꼬리 분포
대부분의 데이터가 한쪽 끝에 분포, 긴 꼬리 형태(비대칭)
데이터가 많아져도 정규분포가 되지 않음
파레토 분포를 포함
long_tail = np.random.exponential(1, 1000)

2-5 스튜던트 t 분포
표본이 적을 때 정규분포 대신 사용
t분포는 모집단의 표준편차를 모르고 표본이 적을 때(<30) 사용
자유도가 낮을수록 꼬리가 두꺼움
자유도(데이터 개수와 연관)가 커질수록 정규분포와 유사
t_dist = np.random.standard_t(df=10, size=1000)

2-6 카이제곱분포
독립성 검정/ 적합도 검정에 사용되는 분포
독립성 검정: 두 범주형 변수 간의 관계가 있는지 
적합도 검정: 관측한 값들이 특정 분포에 해당하는지
chi2_dist = np.random.chisquare(df=2, size=1000)

2-7 이항분포
결과가 2개만 나오는 상황
데이터 수가 많아지면 정규분포와 유사
binom_dist = np.random.binomial(n=10, p=0.5, size=1000)

2-8 푸아송 분포
단위 시간/공간당 희귀한 사건 발생 수를 모델링 할 때 사용
발생 유무 ->이산형 분포
람다: 특정 시간/공간에서 사건 기대값
k: 사건이 k회 일어날 확률
람다가 무한으로 가면 정규 분포와 유사
lambda_value = 4 
x = np.arange(0, 15)
poisson_pmf = poisson.pmf(x, lambda_value)

2-9 분포 - 정리

데이터가 많으면 정규분포
데이터가 적으면 상황에 맞게
긴 꼬리 분포 등도 조심
 

 라이브 세션

통계
2회차 - 두번 봐도 괜찮을듯
.describe()
기초통계량
.describe(include = 'all')
범주형까지 전부

사건 -> 확률변수: 확률


모든 확률은 더했을 때 1이 되어야 함

PMF: 확률 질량 함수 - 이산형 확률변수
PDF: 확률 밀도 함수 - 연속형 확률변수
KDE(커널밀도추정): 데이터 기반 PDF 근사, kdeplot()

베르누이 시행: 결과가 두 개뿐인 실험
포아송분포: 일정한 단위 시간, 공간에서 발생하는 이벤트의 수의 확률분포
정규분포: 연속형 변수의 대표, 품질 특성 대부분
SPC에서 관리도(USL, LSL)와 Z-점수 해석, 3시그마 개념 -> 정규분포 기반

3시그마 법칙 - 68 -95 -99.7 규칙이라고도 함
6시그마는 불량률 3.4ppm 목표, zero defects 등

CP(공정 능력 지수): 공정이 주어진 공차 내에서 얼마나 일관된 생산?
Cp = (USL -LSL) / (6*시그마)
Cp는 정규분포 가정, 3시그마 범위를 기준으로 계산

Cpk(공정 성능 지수)
Cpk = min((뮤 -LSL) / (3*시그마), (HSL - 뮤) / (3*시그마))

즉, Cp 와 다르게 Cpk는 공정의 평균이 중심에서 얼마나 치우쳐 있는지

표준정규분포: 평균이 0이고 표준편차가 1인 정규분포
Z -score: 실측값(x)을 평균(μ)에서 얼마나 떨어져 있는지를 표준편차(σ) 단위로 환산한 값
Z - 정규화: 모든 값을 평균 0, 표준편차 1로 변환 // 서로 다른 단위를 가진 변수들을 같은 스케일로 통일, 비교

정규화: 데이터의 범위를 0과 1 사이로 압축하는 스케일링 기법, 이상치에 매우 민감
표준화: 데이터의 평균(μ)을 0, 표준편차(σ)를 1로 맞추는 스케일링 기법, 이상치에 상대적으로 강건함

이상치: 데이터 분석의 왜곡, 하지만 무조건 지우는 것은 옳지 않음
히스토그램, 박스플롯, 바이올린플롯 등 파이썬 시각화 방법은 많이 알수록 좋음
머신러닝
2회차 - 다시 봐야 할 듯

데이터 전처리
인코딩: 범주형 데이터를 숫자로 변환하는 과정
머신러닝 모델은 숫자만 입력받을 수 있음
OneHotEncoding: 순서 없는 범주에 사용
LabelEncoding: 순서 있는 범주에 사용

스케일링: (머신러닝 등에서) 수치형 데이터의 단위(스케일)를 맞추는 전처리 과정
머신러닝 모델은 입력 변수들의 크기 차이에 민감
StandardScaler: 평균 0, 표준편차 1로 변환 → 정규분포에 적합
MinMaxScaler: 0~1 사이로 변환 → 정규분포 아니어도 사용 가능

다중공선성 제거
다중공선성: 독립 변수(Feature)들 간에 강한 상관관계가 있는 경우
선형 모델에서는 다중공선성이 있으면 모델이 예측하는데 불안정
비선형 모델 -> 변수 간의 독립성을 가정X, 다중공선성 있어도 트리가 분할할 변수를 자동 선택 ->상대적 덜 영향을 받음 

과적합: 학습 데이터에 지나치게 최적화, 새로운 데이터에 대한 예측 성능이 저하
너무 복잡한 모델, 부족한 훈련 데이터, 많은 노이즈 등이 과적합을 발생
정규화, 교차 검증 등으로 과적합 방지 가능

VIF 기반 변수 제거
VIF 값이 높으면 해당 변수는 다른 변수들과 높은 상관관계
10 이상이면 다중공선성이 높다고 판단, 제거 고려

높은 상관관계를 가진 변수 제거
피어슨 상관계수를 계산하여 상관계수 0.9 이상인 변수 쌍 중 하나를 제거

PCA 분석 -> 비지도 학습
다중공선성이 높은 변수를 직접 제거하지 않고, 새로운 축으로 변환하여 차원을 줄이는 방법
PCA를 사용하여 주요 정보를 유지하면서 변수를 축소

데이터 분할
데이터를 훈련 데이터(Train)와 테스트 데이터(Test)로 나눔 -> train : test = 8:2
훈련 데이터: 모델 학습 // 테스트 데이터: 일반화 성능 평가 
분할 -> 과적합을 방지 및 일반화 성능 평가

회귀

회귀분석: 종속변수와 독립변수 간의 관계를 모델링
선형 회귀분석: 1차식 형태

Sklearn 에서 모델 만드는 법
모델 생성, 모델 학습, 예측 값 확인, .예측 성능 확인

최소제곱법: 잔차 제곱의 합이 최소가 되도록 가중치

절대 오차: 실제값과 예측값의 차이를 절대값으로 변환해 평균
오차의 크기를 그대로 반영하여 오차 평균 크기 확인

평균 제곱 오차: 제 값과 예측 값 간의 차이를 제곱하여 계산한 후 평균
0에 가까울수록 모델이 실제 값을 잘 예측
단위가 원래 데이터의 제곱이 되어 해석의 어려움
--> 평균 제곱근 오차: MSE의 제곱근을 취한 값

결정 계수: 모델이 실제 값의 변동성을 얼마나 잘 설명하는지를 나타내는 지표

다중 선형회귀: 두 개 이상의 독립변수를 사용하여 종속변수를 예측
각 독립변수는 종속변수에 개별적으로 영향, 모든 독립변수의 영향을 동시에 고려

분류 모델

분류 모델: 어떤 대상을 정해진 범주에 구분해 넣는 작업
군집 분석과 다르게 분류 분석은 각 범주가 정의되어 있음
로지스틱 회귀 분석: 종속변수가 범주형(0, 1)일 때 사용하는 분석 방법
선형 회귀로 한다면 '확률은 0과 1 사이 값'을 만족X
로지스틱 회귀는 시그모이드 함수 사용으로 항상 0~1 사이 값 보장, S자 곡선 형태로 자연스러운 확률 변화 표현

혼동 행렬: 예측 값이 실제 값과 일치하는지 분류하는 분류표
정확도: 전체 데이터 중 올바르게 분류한 비율
정밀도: 예측한 전체 긍정 중 참 긍정의 비율
재현율: 실제 전체 긍정 수에서 참 긍정의 비율
F1 Score: 정밀도와 재현율의 조화 평균
정밀도와 재현율은 Trade-off 관계

ROC 커브와 AUC
임계값(스레스홀드) 독립적, 모델 비교 용이, 비즈니스 의사결정

코드카타

알고리즘
 
73 - 공원산책

def solution(park, routes):
    #방향
    d = {'N': (-1, 0), 'S': (1, 0), 'W': (0, -1), 'E': (0, 1)}
    #최대/최소
    W = len(park[0])
    H = len(park)
    #S의 위치
    x = 0
    y = 0
    for i, j in enumerate(park):
        if 'S' in j:
            y = i
            x = j.index('S')
    #route 로 위치 이동시키기
    for i in routes:
        A, B = i.split(" ")
        B = int(B)
        dy, dx = d[A]
        #이동가능성 판단
        nx, ny = x, y
        C = True
        for _ in range(B):
            ny += dy
            nx += dx
        # 공원 밖 또는 장애물 조우
            if not (0 <= nx < W and 0 <= ny < H) or park[ny][nx] == 'X':
                C = False
                break
        # C=ture -> 위치 갱신
        if C:
            x, y = nx, ny
    return [y,x]

SQL

41 - 조건에 맞는 도서 리스트 출력하기

SELECT BOOK_ID, PUBLISHED_DATE
FROM BOOK
WHERE YEAR(PUBLISHED_DATE) = 2021 AND CATEGORY ='인문'
ORDER BY PUBLISHED_DATE
42 - 평균 일일 대여 요금 구하기

SELECT ROUND(SUM(DAILY_FEE)/COUNT(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE= 'SUV'
43 - 조건에 맞는 사용자와 총 거래금액 조회하기

SELECT B.USER_ID, B.NICKNAME, SUM(A.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD AS A
INNER JOIN USED_GOODS_USER AS B
ON A.WRITER_ID = B.USER_ID
WHERE A.STATUS = 'DONE'
GROUP BY A.WRITER_ID
HAVING SUM(A.PRICE) >= 700000
ORDER BY SUM(A.PRICE)
44 - 가격대 별 상품 개수 구하기

SELECT FLOOR(PRICE/10000)*10000 AS PRICE_GROUP,COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
45 - 3월에 태어난 여성 회원 목록 출력하기

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_OF_BIRTH
FROM MEMBER_PROFILE 
WHERE MONTH(DATE_OF_BIRTH) = 3 AND GENDER = 'W' AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC

3. 학습하며 겪었던 문제점& 에러 + 회고

3-1 문제점& 에러: X

                           

3-2 회고:

1. 코드카타 알고리즘의 난이도가 확실히 올라갔다. 꾸준히/착실히 해보자

2. 머신러닝과 관련해 너무 많은 양의 새로운 개념들이 머리 속으로 들어온다. 주말을 활용해 다시 공부할 필요가 있어보인다. 

 


4. 내일 학습할 것은 무엇인지(기본적인 AI 진단퀴즈, 코드카타, TIL 제외)

- 금요일(19일): 라이브 세션, 강의수강(통계 3강), 어학공부