멋사 AI스쿨8기

[멋사AI스쿨8기] TIL : 파이썬 문법 5일차

JJouni 2023. 1. 6. 17:46

오늘은 박두진 강사님의 마지막 강의였다. 

처음부터 어려운 수업이었는데 오후수업이 될수록 외계어를 듣는 것 같았다.. 

그래도 강의는 정말 대 만족! !

파이썬에 무지했던 나에게 큰 지도를 받은 느낌.. 

그러나 하나하나 채워가야할 게 더 많은 것 같다;;;;;

 

 

오늘 수업내용

  • class 2탄 : getter, setter에 대해서, 메서드의 종류(인스턴스, 클래스, 스태틱), 클래스 설계(is a, has a 개념)
  • 입출력 : 메모리에 있는 내용을 하드디스크에 저장하는 방법
    • 여기서 하드디스크에서 메모리로 가져오는 방법도 있는데 모델링을 할 때에는 주로 저장하는 방법을 많이쓴다.
    • 파이썬에서는 pickle을 사용해서 직렬화를 자동으로 하고, 입출력 속도도 빠르게 저장한다.
  • 모듈 : 변수, 함수, 클래스를 하나의 파일(.py)로 모아서 코드를 작성한 것
  • 패키지 : 여러개의 모듈 파일을 디렉토리로 구분하여 코드를 작성하는 방법 : tree 패키지를 설치해서 디렉토리 구조를 살펴보면서 직접 패키지를 만들고 설치해보았다.
  • 예외처리 : try, except, finally, raise

 

이미 getter와 setter에서 힘들기 시작했고.. 입출력에서 모듈까지는 어느정도 이해하다가 패키지에서 휘청거렸다.

그래서 일단, 오늘 자기주도학습 시간에 이해하지 못한 부분들을 차근차근 다시 공부했다.  

 

그 중에, 오늘은 지난 시간 배우고 정리하지 못했던 상관계수분석에 대해 정리해보고자 한다.

위의 내용은 차근차근 추가해나가야지.. 


 

상관계수분석방법

numpy를 이용하여 데이터의 상관계수를 구합니다.
python 코드와 numpy의 함수의 속도차이를 비교합니다.

 

1. 분산과 표준편차

  • 분산(variance) : 데이터가 펼쳐져 있는 정도

분산 수식

  • 표준편차 : 분산에 루트를 씌워주는 것 
    • 표준편차를 사용하는 이유는 분산의 data scale이 커지기 때문에 루트를 씌워 scale을 없앨 수 있다.

이를 코드로 구현하여 구할 수 있다.

# 샘플데이터 생성
data1 = [80, 85, 100, 90, 95]
data2 = [70, 80, 100, 95, 95]
data3 = [100, 90, 70, 90, 80]

def variance(data):
    var = 0
    x_ = sum(data) / len(data)
    for xi in data:
        var += (xi - x_) ** 2
    return var / len(data)

variance(data1), variance(data2), variance(data3)

# 표준편차
variance(data1) ** 0.5, variance(data2) ** 0.5, variance(data3) ** 0.5

# numpy함수를 이용해서 구하는 것
np.var(data1), np.var(data2), np.var(data3)

numpy함수를 이용해서 구하면 파이썬 속도가 많이 보완된다. 빨라짐!!

 

python 함수와 numpy 메서드의 퍼포먼스 비교

wall time을 확인해보면,, 거의 200배 가까이 차이가 난다.

 

 

2. 공분산, 상관계수, 결정계수

1) 공분산(covariance)

  • 2개의 데이터 집합이 어떤 관계를 가지고 있느냐를 파악하는 것이다.
  • 공분산 수식은 x데이터 집합과 y 데이터 집합이 있다.
  • 이를 사용하면 2개의 데이터가 어떤 관계를 갖는지 알 수 있다(양의 관계, 음의 관계)
  • 평균 편차곱

이를 코드로 구현해보자.

 # - 1 : 자유도
def covariance(x, y):
    cov = 0
    x_ = sum(x) / len(x)
    y_ = sum(y) / len(y)
    for xi, yi in zip(x, y):
        cov += (xi - x_) * (yi - y_)
    return cov / (len(x) - 1)          # 자유도

위의 데이터를 집어넣어 보면, 음수와 양수로 출력된다.

 

  • 공분산의 한계 : 방향성은 보여줄수 있으나 강도를 나타내기 어렵다.
    • 표본데이터의 크기에 따라서 값의 차이가 큰 단점이 있습니다.

data4,data5에 data1,data3의 10을 곱하여 공분산을 구했다. 스케일에 따라 크기가 달라져서 강도의 차이는 비교가 어려움.

 

2) 상관계수 (correlation coefficient)

  • 공분산의 한계를 극복하기 위해서 만들어집니다. (얼마나 강력한 관계를 갖는지 확인할 수 있음)
  • -1 ~ 1까지의 수를 가지며 0과 가까울수록 상관도가 적음을 의미합니다.
    • 1과 가까울수록 강한 양의 상관관계
    • -1과 가까울수록 강한 음의 상관관계
    • 0과 가까울수록 관계없음
  • x의 분산과 y의 분산을 곱한 결과의 제곱근을 나눠주면 x나 y의 변화량이 클수록 0에 가까워집니다.
  • 자유도 없는 공분산을 사용한다.

이를 구현해보자

# 공분산 구하기 : 분자에 넣어주어야하기 때문
def covariance(x, y):
    cov, x_, y_ = 0, sum(x) / len(x), sum(y) / len(y)
    for xi, yi in zip(x, y):
        cov += (xi - x_) * (yi - y_)
    return cov / len(x)
    
# 상관계수 구하기
def cc(x, y):
    cov = covariance(x, y)
    var = (variance(x) * variance(y)) ** 0.5
    return cov / var

앞서 만들었던 데이터를 활용하여 값을 구해보면 아래와 같다.

상관계수의 값을 알 수 있다.

 

3) 결정계수 (cofficient of determination: R-squared)

  • x로부터 y를 예측할수 있는 정도
  • 상관계수의 제곱 (상관계수를 양수화)
  • 효과 : 마이너스를 제거하여 모델링할 때 어떤 feature를 고를지 확인할 수 있음
    • 수치가 클수록 회기분석을 통해 예측할수 있는 수치의 정도가 더 정확

따라서 data1을 예측할 때는 data3을 feature로 고르는 것이 더 정확히 예측할 수 있다.

 

공분산 : 방향성 O, 강도 X
상관계수 : 방향성 O, 강도 O
결정계수 : 방향성 X, 강도 O
 
여기까지 배워봤었다.
 

 

TIL 소감

처음에는 신기했는데, 파이썬도 깊이 배울수록 원리를 확실히 습득하는 것이 어렵게 느껴졌다. 시간이 필요할 것 같다.
강사님이 강의를 끝내시며, 테니스 비유를 드셨는데, 하루하루 비교하면 잘할 때도 있고 못할 때도 있다. 그런데 1년을 돌아보니, 분명 실력이 늘어 있다고 하셨다. 이제 시작하는 단계이니 하나씩 차근차근, 꾸준히 공부해봐야겠다.
특별히, , ,  데이터사이언티스트는 배울게 많아 보이는데,, 늦게 시작한만큼 한 시간이라도 더 공부해야겠다.
그리고.. 통계 공부를 시작해야겠다. 추가로 공부할 게 많다...ㅎㅎㅎㅎㅎ
오늘도 어질어질,, 다음주엔 새로운 강사님이 오시는데, 어떠실지, 그리고 난 잘 따라갈 수 있을지 걱정 반 기대 반...^_^