카테고리 없음

[내일배움 부트캠프] 06. 18

tundercloud 2026. 6. 18. 20:31

🤖 Atani

⌨️ 코드카타

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

🖥️ 통계학 기초 (챕터 2-4 ~)

👨‍💻 머신러닝 기초 라이브 세션 2회차


🤖 Atani

드릴다운

- 요약된 정보에서 시작하여 더 상세한 정보로 단계적으로 깊이 들어가는 계층적 탐색 방식

 

SUM (합계)

- 모든 값을 더한 총량을 반환한다. 

ex) 진도율의 합계는 전체 누적 진도를 나타냄.

 

AVG (평균)

- 값의 평균을 반환한다.

ex) 진도율의 평균은 개인당 평균 진도율을 나타냄.

 

groupby (집계)

- 특정 기준(컬럼)으로 데이터를 그룹화하여 각 그룹별 집계 결과를 비교 분석

 

데이터 전처리

- 데이터의 정확성일관성을 확보함.

- 잘못된 데이터 타입, 결측치, 이상치 등은 시각화 결과를 왜곡시켜 잘못된 인사이트를 도출하게 만듬.


⌨️ 코드카타

- 76번 JadenCase 문자열 만들기 -

문제 설명 

JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 

단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)

문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.

제한 조건

  • s는 길이 1 이상 200 이하인 문자열입니다.
  • s는 알파벳과 숫자, 공백문자(" ")로 이루어져 있습니다.
    • 숫자는 단어의 첫 문자로만 나옵니다.
    • 숫자로만 이루어진 단어는 없습니다.
    • 공백문자가 연속해서 나올 수 있습니다.

입출력 예

s return
"3people unFollowed me" "3people Unfollowed Me"
"for the last week" "For The Last Week"

 

1. split () 사용 x

split ()은 연속된 공백을 제거하므로 원본 문자열을 유지할 수 없다.

→ 문자열을 한 글자씩 순회해야 됨.

2. 단어의 시작 여부를 저장

True : 현재 문자가 단어의 첫 글자 / False : 현재 문자가 단어의 첫 글자가 아님

3. upper (), lower ()

upper () : 문자를 대문자로 변환

lower () : 문자를 소문자로 변환

def solution(s):
    
    answer = ""          # 결과를 저장할 문자열
    is_first = True      # 현재 문자가 단어의 첫 글자인지 확인
    
    # 문자열을 처음부터 끝까지 한 글자씩 확인
    for ch in s:
        
        # 공백을 만나면
        if ch == " ":
            answer += ch
            is_first = True      # 다음 문자는 새로운 단어의 시작
         
        # 단어의 첫 글자인 경우
        elif is_first:
            answer += ch.upper() # 대문자로 변환
            is_first = False
         
        # 첫 글자가 아닌 경우
        else:
            answer += ch.lower() # 소문자로 변환
    
    return answer

- 77번 이진 변환 반복하기 -

문제 설명

0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다

  1. x의 모든 0을 제거합니다.
  2. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.

예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.


0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • s의 길이는 1 이상 150,000 이하입니다.
  • s에는 '1'이 최소 하나 이상 포함되어 있습니다.

입출력 예 

s result
"110010101001" [3,8]
"01110" [3,3]
"1111111" [4,1]


입출력 예 설명
입출력 예 #1

  • "110010101001"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0개의 개수 0 제거 후 길이 이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 8개의 0을 제거했으므로, [3,8]을 return 해야 합니다.

입출력 예 #2

  • "01110"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0개의 개수 0 제거 후 길이 이진 변환 결과
1 "110010101001" 6 6 "110"
2 "110" 1 2 "10"
3 "10" 1 1 "1"
  • 3번의 이진 변환을 하는 동안 3개의 0을 제거했으므로, [3,3]을 return 해야 합니다.

입출력 예 #3

  • "1111111"이 "1"이 될 때까지 이진 변환을 가하는 과정은 다음과 같습니다.
회차 이진 변환 이전 제거할 0의 개수 0 제거 후 길이 이진 변환 결과
1 "1111111" 0 7 "111"
2 "111" 0 3 "11"
3 "11" 0 2 "10"
4 "10" 1 1 "1"
  • 4번의 이진 변환을 하는 동안 1개의 0을 제거했으므로, [4,1]을 return 해야 합니다.

1. 문자열에서 0 제거

2. 제거한 0 개수 누적

3. 남은 문자열 길이를 2진수 문자열로 변환

그리고 문자열이 "1"이 되면 종료

def solution(s):

    # 이진 변환 횟수 저장
    transform_count = 0

    # 제거된 0의 총 개수 저장
    zero_count = 0

    # 문자열이 "1"이 될 때까지 반복
    while s != "1":

        # 0 제거 전 문자열 길이
        before_length = len(s)

        # 문자열에서 모든 0 제거
        s = s.replace("0", "")

        # 0 제거 후 문자열 길이
        after_length = len(s)

        # 제거된 0 개수 계산
        removed_zero = before_length - after_length

        # 제거된 0 개수 누적
        zero_count += removed_zero

        # 남은 문자열 길이를 2진수 문자열로 변환
        s = bin(after_length)[2:]

        # 이진 변환 횟수 증가
        transform_count += 1

    # [변환 횟수, 제거한 0 개수] 반환
    return [transform_count, zero_count]

- 78번 피보나치 수 -

문제 설명

피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.
예를들어

  • F(2) = F(0) + F(1) = 0 + 1 = 1
  • F(3) = F(1) + F(2) = 1 + 1 = 2
  • F(4) = F(2) + F(3) = 1 + 2 = 3
  • F(5) = F(3) + F(4) = 2 + 3 = 5

와 같이 이어집니다.

2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.


제한 사항

  • n은 2 이상 100,000 이하인 자연수입니다.

입출력 예

s return
3 2
5 5

 

입출력 예 설명
피보나치수는 0번째부터 0, 1, 1, 2, 3, 5, ... 와 같이 이어집니다.

 

1. 피보나치 수는 이전 두 수의 합으로 다음 수가 결정된다.

2. 처음에는 재귀를 생각했지만, 같은 값을 여러번 계산하여 n=100000 에서는 시간 초과가 발생한다.

3. 이미 계산한 값을 활용하는 DP(동적 계획법)를 사용했다. 

4. 점화식을 그대로 반복문으로 구현했다.

dp [ i ] = ( dp [ i - 1 ] + dp[ i - 2 ] ) % 1234567

5. 문제에서 나머지만 요구하므로 계산 과정마다 % 1234567 을 적용해 숫자가 커지는 것을 방지했다.

def solution(n):
    # 피보나치 수를 저장할 리스트 생성
    dp = [0] * (n + 1)

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

    # 2부터 n까지 피보나치 수 계산
    for i in range(2, n + 1):
        # 문제에서 요구한 대로 1234567로 나눈 나머지 저장
        dp[i] = (dp[i - 1] + dp[i - 2]) % 1234567

    return dp[n]

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

 

68 - 95 - 99.7 법칙

정규분포에서는 다음과 같은 확률 분포 범위가 존재한다.

● 평균 ± 1σ: 약 68.3%의 데이터 포함

● 평균 ± 2σ: 약 95.4%의 데이터 포함

● 평균 ± 3σ: 약 99.7%의 데이터 포함

→ 이 특성을 3시그마 법칙 또는 68 -95 - 99.7 규칙이라고 부름.

 

식스시그마

품질관리에서 프로세스가 ±6σ 범위 안에 거의 모든 데이터가 포함되도록 관리함

- 식스시그마는 ±6σ 범위 안에 99.99966% 포함 → 불량률 3.4ppm 목표

→ 제조 현장에서 매우 높은 품질 수준을 요구할 때 사용됨.

 

Cp

공정능력지수 (Cp, Process Capability Index)를 이용해서 현재 생산 공정이 규격 내에서 얼마나 안정적으로 제품을 생산하는지 평가하는 기준표

 

Cp 값이 클수록 공정이 안정적이고 품질 수준이 높다.

Cp > 1.33 : 양호

Cp > 1.67 : 매우 우수

Cp = 1.00 : 규격과 공정 변동폭이 동일

Cp < 1.00 : 불량 발생 가능성 증가

 

Cpk (공정 성능 지수, Process Capability Performance)

실제 공정 평균이 허용 기준 내에서 얼마나 중앙에 위치해 있는지를 반영. 공정의 평균이 중심에서 얼마나 치우쳐 있는지 고려함.

Cp는 중심에서 얼마나 벗어났는지 고려하지 않음.

 

 

정규화 vs 표준화

 

- 차이점

구분 정규화 (Normalization) 표준화 (Standardization)
목적 값의 범위를 0~1로 압축 평균 중심으로 데이터 표준화
공식 (x - min) / (max - min) (x - mean) / std
특징 극단값에 민감함 이상치에 상대적으로 강건함
주 사용처 KNN, SVM 등 거리 기반 알고리즘 선형회귀, 로지스틱 회귀 등 통계 기반 모델

🖥️ 통계학 기초 (챕터 2-4 ~)

 

긴 꼬리 분포

● 대부분의 데이터가 분포의 한쪽 끝에 몰려 있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포

● 정규분포와 달리 대칭적이지 않고 비대칭적이다.

● 소득 분포, 웹사이트 방문자 수 등에서 관찰된다.

 

스튜던트 t 분포

● 표본이 작을 때 정규분포 대신 사용함.

자유도가 커질 수록 정규분포에 가까워짐.

자유도 : 표본의 크기와 관련이 있는 값

 

● 모집단의 표준편차를 알 수 없고 표본의 크기가 작은 경우 (보통 30미만)에 사용됨

● 정규분포와 유사하지만, 표본의 크기가 작을수록 꼬리가 두꺼워짐.

 

카이제곱분포

K = 자유도 ( 자유도 : 표본의 크기와 관련이 있는 값 ) 

● 범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포

● 자유도에 따라 모양이 달라짐.

● 상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 완벽하게 서로 다른 질적 자료일 때 활용 

ex) 성별이나 나이에 다른 선거 후보 지지율

● 범주형 데이터 분석에 사용

 

이항분포

● 연속된 값을 가지지 않고, 특정한 정수 값만을 가질 수 있다.

ex) 동전을 10번 던질 때 얖면이 나오는 횟수는 0, 1, 2, ..., 10과 같은 정수이다. 

→ 연속적으로 그려지지 않는다.

성공/실패와 같은 두가지 결과를 가지는 실험을 여러번 반복했을 때 성공 횟수의 분포이다.

독립적인 시행이 n번 반복되고, 각 시행에서 성공과 실패 중 하나의 결과만 가능한 경우를 모델링하는 분포라고도 할 수 있음.

● 성공 확률을 p라고 할 때, 성공의 횟수를 확률적으로 나타냄.

실험 횟수 (n), 성공확률 (p)

 

푸아송분포

● 희귀한 사건이 발생할 때 사용

● 연속된 값을 가지지 않기 때문에 이산형 분포에 해당됨.

평균 발생률 λ가 충분히 크다면 정규분포에 근사

● 평귤 발생률이란 주어진 시간이나 공간에서 사건이 몇번 발생했는지?

ex) 한 시간 동안 콜센터에 전화오는 건수가 10건이면 λ는 10

단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링할 때 사용하는 분포

● 평균 발생률 λ를 가진 사건이 주어진 시간 또는 공간내에서 몇번 발생하는지를 나타냄.

 


👨‍💻 머신러닝 기초 라이브 세션 2회차

https://colab.research.google.com/drive/17z2lrx1Qe1tz52MEsCAu-fDmSeOtuVq3?usp=sharing

 

머신러닝_오프닝_2회차.ipynb

Colab notebook

colab.research.google.com

 

인코딩 (Encoding)

범주형 데이터를 숫자로 변환하는 과정

머신러닝 모델은 숫자만 입력받을 수 있음.

문자열 그대로 넣으면 모델이 학습하지 못함.

 

OneHotEncoding

성별, 혈액형처럼 숫자가 없는 범주형 변수

범주의 개수가 너무 많지 않을 때 사용

ex) A~Z

→ 각 범주를 새로운 열로 만들어 0과 1로 표시

 

Label Encoder

low < medium < high, 초급 < 중급 < 고급 처럼 순서가 있는 범주형 변수

범주는 있지만 One-hot을 쓰기엔 너무 많은 경우에 사용

→ 고유한 정수값을 할당함. 만족도(만족, 보통, 불만) → 만족 : 2, 보통 : 1, 불만 : 0

 

스케일링 (Scaling)

● 수치형 데이터의 단위(스케일)를 맞추는 전처리 과정

머신러닝 모델은 입력 변수들의 크기 차이에 민감함.

스케일이 크거나 단위가 다른 변수는 모델이 편향되게 학습할 수 있음.

 

● 표준화 (StandardScaler)

각 값을 평균 0, 표준편차 1로 변환

데이터가 정규분포에 가깝거나 대칭적일 때 사용

값의 분포 자체를 보존하고 싶을 때 → 데이터의 모양(분포 곡선)은 유지하면서, 중심만 0으로 옮기고 크기만 1로 맞춘다는 의미

⚠️ 이상치가 있으면 평균과 표준편차가 흔들릴 수 있음.

 

● 정규화 (MinMaxScaler)

각 값을 0 ~ 1 사이로 변환

값의 볌위를 일정한 크기로 맞춰야 할 때 사용

데이터 분포가 비정규형 일 때 사용

⚠️ 이상치가 하나라도 있으면 전체 범위가 압출될 수 있음.