기타/통계, 머신러닝

250701_기초 통계학(선형회귀, 다중선형회귀), 파이썬(클래스)

baektree 2025. 7. 1. 21:00

요약/나만의 인사이트

  • 통계를 배우는 자세 : 싹 다 외운다 (x) →어떤 식으로 굴러가는지 대략적으로 이해한다. (o)
  • 가설검정 시 양측검정(A,B의 차이가 있다.) 단측검정(A가 B보다 낫다)이 있는데 보통 실무에서는 양측검정을 사용한다. 사전 지식없이 A가 B보다 낫다고 주장하는 건 위험할 수 있기 때문
  • P-VALUE는 우연히 발생할 확률이다. 따라서 귀무가설(차이가 없다.)이 맞다고 가정했을 때, 우연히 발생할 확률이 적다는 건, 통계적으로 유의미하다는얘기이다.
  • 신뢰구간 — 표본평균 등에 대한 범위로 구간 추정, 95% 가설검정 — P-value, 유의성을 설명
  • 검정방법의 2가지 모수검정 — 정규 분포 가정 비모수검정 — 분포 가정 없음

 

새롭게 알게 된 것

파이썬 클래스 복습

  • 클래스 : 객체 지향 설계도 공장
    • 클래스 변수: 클래스 안에 할당된 변수
    • 클래스 매서드: cls를 첫번째 인자로 받고 @classmethod 데코레이터를 사용한다.
    • 클래스 변수와 매서드는 클래스 전체에 영향을 준다.
  • 인스턴스 : 클래스에서 만들어진 실제 객체
    • 클래스에서 객체를 찍으면 **init함수(=생성자 함수)**가 자동으로 호출된다.
    • 인스턴스 변수 : 객체의 특성 (ex 창문, 클락션 등등) ex def __ init __(self, name)
    • 인스턴스 매서드 : 객체의 기능 (ex 주행, 정지 등등) ex def bark(self)

정적 메서드 (@staricmethod)

  • 클래스, 인스턴스와 무관하게 동작하는 일반 함수
  • self나 cls를 받지 않음.
  • 자동차의 라디오와 같은 옵션 기능, 따라서 라디오 기능 자체만 따로 편하게 다루기 위해 미리 정의해 두는 것이라 할 수 있다.
  • 유틸성 기능(편리성 기능)을 클래스 내부에서 분리해 관리하고 싶을 때 사용

매직 메서드

  • 객체 자체를 편하게 다루기 위해서 미리 정의해 놓은 것
  • 연산, 문자출력등 기존의 객체라면 기능 구현 못했는데 매직 매서드를 통해 가능하다.
  • __ repr__ ()은 디버깅 시 유용하며, 가능한 한 해당 객쳋를 재생성할 수 있는 코드처럼 만드는 것이 좋음.
  • 리스트나 딕셔너리 안에 객체를 넣고 출력하면 __repr__()이 호출됩니다.

@property

  • 함수(매서드)지만 속성처럼 사용 가능한 것
  • getter - 값을 가져오기
  • setter - 값을 세팅하기
  • 이를 통해 클래스 내부 변수 값을 직접 변경하지 않고 우회적으로 값에 접근 혹은 수정 가능
class Person:
  def __init__(self, birth_year):
    self.birth_year = birth_year
  
  @property #getter이며 값을 가져오는 것
  def age(self):
    return 2025 - self.birth_year

  @age.setter #값을 세팅하기 
  def age(self, value):
    self.birth_year = 2025 -value

p = Person(2000) #2000년도에 태어났다며 값을 입력
print(p.age) # 25 (매서드로 정의했지만 ()없이 속성처럼 사용)

p.age = 30 #setter age를 통해 birth_year값을 수정
print(p.birh_year) #1995
print(p.age) # 30 우회적으로 값에 접근해서 바꿈.

 

기초 통계학 4회차

회귀(regression) - 가지고 있는 데이터를 바탕으로 예측한다.

  • 어떤 x가 들어갔을 때, 어떤 y가 나올 것 인가
  • y = f(x)라는 함수를 통해 변수 사이의 관계를 공식화 하는 것
  • f(x)는 직선, 곡선 등 다양하게 나타날 수 있다.
  • 앱실론 : 오차항, 예측하지 못한 요인들
    • 공부시간으로 시험성적을 예측하고 싶을 때 컨디션 등 영향을 미치는 다른 요인 등

방정식을 세우는 것 = 회귀모형을 만드는 것

회귀분석 실행시 주의 점

  • 선형, 비선형 등 어떤 형태가 데이터를 잘 설명할까? (무엇을)
  • 기울기와 절편은 어떻게 구할까? (어떻게)
  • 회귀모형의 성능은 괜찮은지? 과적합은 아닌지? (평가)

선형회귀

  • 독립변수가 변할 때 종속변수가 어떻게 변하는지 선형관계로 설명하는 모델
  • 선형성, 등분산성, 오차의 독립성, 오차의 정규성이 가정되어야 선형회귀를 사용할 수 있다.
  • 잔차 제곱합(SSS)를 최소화하는 방식으로 회귀식을 업데이트 해간다.

회귀모형의 평가

  • 회귀모형의 평가는 인간의 몫
  • 회귀분석의 목적 : 데이터가 전체적으로 어떤 패턴을 보이는가
  • RSS - 오차의 제곱합이기 때문에 데이터 단위와 크기에 따라 커지거나 작아질 수 있음.
  • 잔차표준오차 - 각각이 평균적으로 얼마나 벗어났는지?
  • 결정계수 - 회귀식이 우리가 가지고 있는 데이터를 얼마나 잘 설명하고 있나?

다중선형회귀

  • 독립변수가 여러개 일 때 사용하는 선형회귀 식
  • ESS RSS

불필요한 변수 제거하고, 서로 겹치는 정보는 제거한다.

  • 과적합
    • 너무 많은 변수를 넣으면 예측 성능이 떨어지거나 해석이 어려울 수 있다.
    • EX 모의고사의 답안을 외웠다고 해서 다음 모의고사를 잘 맞을 확률은 적다.
  • 차원의 저주
    • X값이 많아질수록 모델 학습이 점점 더 어려워지고, 성능이 나빠지는 현상
    • 변수가 50개나 있으면 표현하기도 설명하기도 어려워진다.

다중공선성 진단

  • 상관관계가 너무 높은 변수 (공부시간, 수업시간에 따른 시험성적 차이에서 고부시간, 수업시간은 높은 상관관계)

 

특히 어려웠던 것

파이썬 - 하나 이상의 공백문자로 구분된 문자열
  • 문제
    • 문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
    • 단어별로 짝/홀수 인덱스를 판단하세요.
    • 공백은 한칸이든, 두칸이든 유지하세요.
  • 나의 풀이
  • def solution(s):
        answer = '' #반환할 빈 문자열 만들기
        words = s.split() # 공백 기준으로 단어 리스트 만들기
        for i in range(len(words)): #문자열을 공백을 기준으로 나누기, 길이만큼 순회하기
            word = words[i]
            for j in range(len(word)):
                if j % 2 == 0: #짝수번째 있으면 대문자로
                    answer += word[j].upper()
                else: #홀수번째 있으면 소문자로
                    answer += word[j].lower()
            if i != len(words) -1: #i가 미자막 단어가 아니면 공백을 중간에 추가
                answer += ' ' 
        return answer
    
  • 틀린이유
    • 하나 이상의 공백문자로 구분되어 있다는 점을 간과했다.
    • 그래서 split()을 사용하여 오류가 났다.
    • 왜냐하면 split()은 기본적으로 연속된 모든 공백을 하나로 간주해서 분리하기 때문이다. 예를 들어 ”hello world”나 “hello world”나 똑같이 [’hello’, ‘world’]가 된다.
  • 문제가 요구하는 부분
    • 공백은 그대로 유지할 것
    • 입력된 문자열 모두가 아니라 각 단어별로 인덱스를 셀 것
    • 인덱스가 짝수면 대문자, 홀수면 소문자로 변환할 것
    • 공백이 나오면 인덱스는 다시 0으로 초기화 할 것
  • 정답
    • 문자를 하나씩 돌아가며 순회한다.
    • 이때 공백을 만나면 다시 인덱스 변수가 0으로 초기화된다.
    • 인덱스 변수는 문자열 안에서 단어별 위치(몇번째 문자냐) 구분하는 용도로만 사용하는 변수
  • def solution(s):
    	answer = '' #정답을 반환활 빈 문자열 
    	index = 0  #첫번째 단어에서 사용할 인덱스 0으로 초기화
    	for char in s: # 전체 문자열을 문자 하나씩 돌아가며 순회 try hello world
    	    if char = ' ': #char가 공백이면 공백을 그대로 추가
    		      answer += char 
    					index = 0 #공백 다음 새로운 단어 시작하므로 인덱스 0으로 초기화 
    	    else:  #공백이 아니면 대문자 소문자 변환
    			    if index % 2 == 0:
    			        answer += char.upper()
    			    else:
    				      answer += char.lower()
    				  index += 1 #단어 내에서 문자를 처리할 때마다 인덱스를 1씩 증가
    	return answer 
    
  • 논리흐름
    • s = “try hello world”
      인덱스변수 char 공백 인덱스(짝수) → 대문자 인덱스(홀수) → 소문자
      0 t   T   T
      1 r     r Tr
      2 y   Y   TrY
      3   ‘ ‘     TrY (인덱스 초기화)
      0 h   H   TrY H
      1 e     e TrY He
파이썬 - 3진법 → 10진법
  • 문제
    • 자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.
  • 요구사항
    • n을 3진법 상에서 뒤집은 후
    • 다시 10진법으로 표현
  • 핵심개념
    • 10진법 → 3진법 :
      • 몫이 0이 될때까지 3으로 나눔. 이때 3으로 나눈 나머지를 거꾸로 읽으면 3진법으로 변환 할 수 있음.
      • 5(10진법) → 12(3진법)
    • int('문자열숫자', 진법) ⭐첫번째 인자가 반드시 문자열이어야 함.
      • int(’0021’, 3) #7
      • 문자열 ‘0021을 3진법(3을 밑으로 하는 진수)으로 해석해서 10진법 정수로 변환
  • 풀이
def solution(n):
	answer = ''  #정답을 담을 빈 문자열
	while n > 0: #몫이 0이 되기 전까지 나누기, 즉 0이면 반복문 멈추기
		 answer += n % 3 #n을 3으로 나눈 몫을 차근차근 담기 (3진법 상에서 뒤집으라고 했으니까 그대로 두면 됨)
		 n = n // 3 #n을 3으로 나눈 몫으로 갱신해줌 #0021이 나옴
	return int(answer, 3)

다음에 적용해 볼 것

  • [ ] 통계학 복습 계속해서!
  • [ ] 머신러닝 학습 시작!!