카테고리 없음

06.22 월요팅

tundercloud 2026. 6. 22. 19:02

🤖 Atani

⌨️ 코드카타

📊 기초 통계 라이브 세션 4회차

👨‍💻 머신러닝 심화 라이브 세션 1회차


🤖 Atani

분류 (데이터가 속할 범주를 예측) 회귀 (연속적인 수치형 값을 예측)
DecisionTreeClassifier(범주형 결과를 예측), 랜덤 포레스트, 로지스틱 회귀 LinearRegression, Ridge, Lasso, RandomForestRegressor


지도학습

- '양품'과 '불량'이라는 명확한 범주형 레이블이 존재하고, 과거 데이터가 레이블링되어 있을 때 적합함.

- 로지스틱 회귀, 의사결정나무, 랜덤포레스트, SVM 등

- KNeighborsClassifier : 분류 알고리즘이므로 예측 대상 데이터가 필요하며, 군집화 목적에는 적합하지 않음.

비지도학습

- K-Means& DBSCAN(군집 알고리즘), 선형회귀(연속형 값 예측에 사용), PCA(차원 축소 기법), 

- KMeans : fit()와 같이 특정 데이터만 입력하여 학습을 진행함.


⌨️ 코드카타

 

82번 멀리뛰기

 

효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다.

제한 사항
 ● n은 1 이상, 2000 이하인 정수입니다.

 

- 마지막 이동은 항상 1칸 또는 2칸

- 따라서 n번째 방법 수는 : 

n-1에서 1칸 이동

n-2에서 2칸 이동

점화식

dp[n] = dp[n-1] + dp[n-2]

 

def solution(n):
    # dp[i] = i칸까지 도달하는 방법의 수
    dp = [0] * (n + 1)

    # 초기값 설정
    dp[1] = 1

    if n >= 2:
        dp[2] = 2

    # 점화식 적용
    for i in range(3, n + 1):
        dp[i] = (dp[i-1] + dp[i-2]) % 1234567

    return dp[n]

83번 귤 고르기

 

경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 'k'개를 골라 상자 하나에 담아 판매하려고 합니다. 

그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.

예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 

경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.

경화가 한 상자에 담으려는 귤의 개수 k와 귤의 크기를 담은 배열 tangerine이 매개변수로 주어집니다. 

경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항
1 ≤ k ≤ tangerine의 길이 ≤ 100,000
1 ≤ tangerine의 원소 ≤ 10,000,000

 

- 귤 종류를 최소화하려면 작은 개수의 귤을 제외하고, 많이 존재하는 크기부터 선택해야 한다.
- 따라서 딕셔너리로 크기별 개수를 세고, 값들을 내림차순 정렬한 뒤 k개를 채울 때까지 선택한다.

dict : 귤 크기별 개수 저장

values() : 딕셔너리 값 가져오기

sorted(reverse=True) : 내림차순 정렬

→ 그리디 알고리즘 : 현재 가장 좋은 선택(많은 귤부터 선택)을 반복하는 방식

def solution(k, tangerine):
    
    # 귤 크기별 개수 저장
    count = {}

    for size in tangerine:
        if size in count:
            count[size] += 1
        else:
            count[size] = 1
            
    # 개수만 가져와서 큰 순서대로 정렬
    kinds = sorted(count.values(), reverse=True)

    answer = 0  # 선택한 귤 종류 개수
    total = 0   # 지금까지 선택한 귤 개수
    
    # 많은 종류부터 선택
    for num in kinds:
        total += num
        answer += 1
        
        # k개 이상 선택하면 종료
        if total >= k:
            break
            
    return answer

 

 


84번 괄호 회전하기

 

다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.

● (), [], {} 는 모두 올바른 괄호 문자열입니다.
● 만약 A가 올바른 괄호 문자열이라면, (A), [A], {A} 도 올바른 괄호 문자열입니다. 

예를 들어, [] 가 올바른 괄호 문자열이므로, ([]) 도 올바른 괄호 문자열입니다.
● 만약 A, B가 올바른 괄호 문자열이라면, AB 도 올바른 괄호 문자열입니다. 

예를 들어, {} 와 ([]) 가 올바른 괄호 문자열이므로, {}([]) 도 올바른 괄호 문자열입니다.

 

대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 s가 매개변수로 주어집니다. 
이 s를 왼쪽으로 x (0 ≤ x < (s의 길이)) 칸만큼 회전시켰을 때 s가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.

제한사항
s의 길이는 1 이상 1,000 이하입니다.

 

- 괄호 문제는 Stack 자료구조를 사용한다.
- 여는 괄호는 stack에 저장하고 닫는 괄호가 나오면 마지막 값과 비교한다.
- 문자열 회전은 s[x:] + s[:x] 로 구현한다.
- 모든 회전 경우를 확인하며 올바른 괄호 문자열 개수를 계산한다.

def solution(s):
    answer = 0
    
    # 닫는 괄호 : 짝이 되는 여는 괄호
    pair = {
        ')': '(',
        ']': '[',
        '}': '{'
    }
    
    # 문자열을 회전시키기
    for x in range(len(s)):
        
        # 왼쪽으로 x칸 회전
        rotated = s[x:] + s[:x]
        
        stack = []
        is_correct = True
        
        
        # 괄호 검사
        for bracket in rotated:
            
            # 여는 괄호면 저장
            if bracket in "([{":
                stack.append(bracket)
            
            # 닫는 괄호면 검사
            else:
                # 스택이 비어있거나 짝이 다르면 실패
                if len(stack) == 0 or stack[-1] != pair[bracket]:
                    is_correct = False
                    break
                
                # 짝이 맞으면 제거
                stack.pop()

        # 모든 괄호 처리 후 스택이 비어있으면 성공
        if is_correct and len(stack) == 0:
            answer += 1

    return answer

85번 연속 부분 수열 합의 개수

 

철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.

원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.


제한사항
3 ≤ elements의 길이 ≤ 1,000
1 ≤ elements의 원소 ≤ 1,000

 

원형 수열 문제는 배열을 2배로 늘려 일반 배열처럼 처리한다.

모든 시작 위치에서 부분 수열 길이를 1~n까지 증가시키며 누적 합을 구하고,
set 자료구조를 이용해 중복되는 합을 제거한다.

핵심:
- 원형 → 배열 2배 확장
- 연속 부분 수열 → 누적합 사용
- 중복 제거 → set 사용

def solution(elements):
    answer = set()  # 중복 없는 합 저장
    
    n = len(elements)

    # 원형 수열처럼 만들기 위해 배열 두 배 확장
    elements = elements * 2

    # 시작 위치
    for start in range(n):
        
        total = 0  # 현재 부분 수열 합
        
        # 부분 수열 길이 1 ~ n
        for length in range(n):
            
            # 오른쪽으로 하나씩 추가
            total += elements[start + length]
            
            # 합 저장 (set이라 중복 제거)
            answer.add(total)

    # 만들 수 있는 서로 다른 합의 개수
    return len(answer)

📊 기초 통계 라이브 세션 4회차

 

ANOVA

- 세개 이상의 집단 간의 평균에 통계적으로 유의미한 차이가 있는지를 검증하는 데 사용되는 통계 기법

- 분산의 두 가지 종류를 비교하여 결론을 내림.

 

F-값 (F-statistic)

- 집단 간 분산 : 각 그룹의 평균이 전체 데이터의 평균과 얼마나 다른지 나타냄.

→ 그룹 간 차이가 클수록분산이 커진다.

- 집단 내 분산 : 각 그룹 내부의 데이터가 얼마나 흩어져 있는지 나타냄.

그룹 내 데이터가 비슷할수록분산이 작아진다.

- F-값이 클수록 →집단 간 차이가 집단 내 변동보다 크다 → 그룹 간 평균 차이가 통계적으로 유의하다고 판단할 수 있다.

 

기본 가정

1. 정규성 : 각 그룹의 데이터는 정규분포를 따라야한다. (Shapiro-Wilk 검정으로 확인)

2. 등분산성 : 각 그룹의 분산은 서로 동일해야 한다. (Levene 검정으로 확인)

3. 독립성 : 각 그룹의 데이터는 서로 독립적이어야 한다.

 

일원 분산분석 (One-Way ANOVA)

- 하나의 범주형 독립변수하나의 연속형 종속변수에 미치는 영향을 분석할 때 사용한다.

 

 

사후 분석 (Post-Hoc Analysis)

- ANOVA 이후에 구체적으로 어떤 그룹 쌍이 다른지를 알아보기 위해 수행하는 추가적인 검정이다.

- 투키의 HSD, 던 검정, 더넷 검정, 셰페 검정, 본페로니 교정, 피셔의 LSD, 뉴먼-컬스 검정

 

모수 사후 분석 : 투키의 정직 유의차 검정

- 일원 분산분석(ANOVA)을 수행한 결과, p-value가 유의수준보다 작아 "그룹 간평균에 유의미한 차이가 있다"는 결론을 얻었을 때 사용하는 대표적인 사후 분석 방법

ANOVA 투키의 HSD
정확히 어떤 그룹과 어떤 그룹 사이에 차이가 있는지 알려주지 않음
전체 그룹 중 적어도 하나는 평균이 다르다는 신호만 줌.
모든 가능한 그룹 쌍에 대해 다중 비교를 수행하여 알려줌

 

비모수 사후 분석 : 던 검정

- ANOVA의 기본 가정을 만족하지 못할 경우, 비모수 검정인 크루스칼-왈리스검정을 사용한다. (검정 결과가 유의하면)

→ 정확히 어떤 그룹끼리 차이가 나는지를 밝혀내기 위한 추가적인 사후 분석이 필요할 때 사용한다.

- 데이터의 실제 값이 아닌 순위를 기반으로 여러 그룹을 짝지어 비교하며, 다중 비교에 따른 1종 오류를 보정해주는 신뢰성 높은 방법이다.

 

모수적 분석 경로 ANOVA → 결과가 유의하면  → Tukey's HSD
비모수적 분석 경로 Kruskal-Wallis Test → 결과가 유의하면 → Dunn's Test

 

 

이원 분산분석

- 두개의 범주형 독립변수하나의 연속형 종속변수에 미치는 영향을 분석할 때 사용한다.

- 각 독립변수가 종속변수에 미치는 주효과뿐만 아니라, 두 독립 변수가 결합했을 때 나타나는 상호작용효과까지 확인할 수 있다.

 

 

상관계수

 

+1 에 가까울수록 양의 선형관계

-1에 가까울수록 음의 선형관계

0이면 선형 관계 없음 (독립적일 가능성 ↑)

 

종류

종류 특징 사용 상황
피어슨 상관계수 연속형 변수 간 선형관계 분석, 정규성 가정 온도와 결함률
스피어만 순위 상관계수 서열형 변수나 비선형 관계에 사용, 정규성 불필요 만족도 순위, 등급 평가
켄달 타우 소규모 데이터나 순위 일관성 평가에 적합 순위 데이터의 신뢰성 검토

 

 

회귀분석

- 어떤 변수(종속변수)하나 이상의 변수(독립변수)예측하거나 설명하는 방법

- 변수 간 인과관계를 파악하고자 할 때 활용되며, 상관관계와는 구분된다.

 

단순 선형회귀

- 독립변수 1개, 종속변수 1개로 구성된 가장 기본적인 회귀분석 형태

- 결과는 직선 형태의 회귀식 ( Y = β₀ + β₁X + ε )으로 도출된다.

● 회귀계수

 ○ β₀ (Y 절편): X=0일 때 Y의 값

  β₁ (기울기): X가 1 증가할 때 Y의 변화량

 ○ 잔차(residual): 관측값과 예측값 사이의 차이

  R² (결정계수): 회귀모형의 설명력을 나타냄 (0~1)

 

다중 선형회귀

- 독립변수가 2개 이상인 회귀분석

- 회귀식: Y = β₀ + β₁X₁ + β₂X₂ + ... + βₙXₙ + ε

 

 

다중공선성 (Multicollinearity)

- 독립변수들 간에 강한 상관관계가 있으면 회귀계수의 신뢰성이 낮아진다.

→ 다중공선성 문제

VIF (Variance Inflation Factor)를 사용해 진단한다.

from statsmodels.stats.outliers_influence import variance_inflation_factor

# VIF 계산
vif_data = pd.DataFrame()
vif_data['feature'] = X.columns
vif_data['VIF'] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
print(vif_data)

VIF > 10 이면 다중공선성 의심!

VIF값 기준 해석
1 ~ 5 보통 수준 (문제 x)
5 ~ 10 다중공선성 주의
10 이상 심각한 다중공선성 (제거 검토)

 


👨‍💻 머신러닝 심화 라이브 세션 1회차

 

Feature Importance

- 모델의 해석력 확보

변수 중 모델의 의사결정에 가장 큰 영향을 미친 변수의 순위를 매긴다.

AI의 논리와 내부 과정을 이해할 수 있다.

- 비즈니스 인사이트 도출

알려지지 않았던 새로운 불량 요인이나 핵심 지표를 발견할 수 있다.

현장의 업무 프로세스를 근본적으로 개선할 수 있다.

- 데이터 경량화

중요도가 낮은 쓸모 없는 변수들을 과감히 제거하여 추후 모델링을 경량화 시킬 수 있다.

연산 효율을 높이고 과적합을 방지할 수 있다.

 

산출 원리

1) 선형 모델

- 선형 회귀, 로지스틱 회귀 등 선형 모델

- 회귀 계수를 가장 기본적인 feature importance로 사용한다.

 

2) 트리 기반 모델

- Random Forest, XGBoost 등 트리 기반 모델

- 핵심 원리 : 불순도 감소

  ● 데이터를 분할할 때, 정상과 이상을 가장 확실하게 갈라 놓는 변수에 높은 점수를 준다.

    ○ ex) '습도' 기준 분할 → 여전히 정상/이상이 섞여있으면 → 낮은 종요도

    ○ ex) '압력' 기준 분할 → 여전히 정상/이상이 완벽히 분리됨 → 높은 종요도