멋사 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) # 자유도
위의 데이터를 집어넣어 보면, 음수와 양수로 출력된다.
- 공분산의 한계 : 방향성은 보여줄수 있으나 강도를 나타내기 어렵다.
- 표본데이터의 크기에 따라서 값의 차이가 큰 단점이 있습니다.
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를 고를지 확인할 수 있음
- 수치가 클수록 회기분석을 통해 예측할수 있는 수치의 정도가 더 정확
공분산 : 방향성 O, 강도 X
상관계수 : 방향성 O, 강도 O
결정계수 : 방향성 X, 강도 O
여기까지 배워봤었다.
TIL 소감
처음에는 신기했는데, 파이썬도 깊이 배울수록 원리를 확실히 습득하는 것이 어렵게 느껴졌다. 시간이 필요할 것 같다.
강사님이 강의를 끝내시며, 테니스 비유를 드셨는데, 하루하루 비교하면 잘할 때도 있고 못할 때도 있다. 그런데 1년을 돌아보니, 분명 실력이 늘어 있다고 하셨다. 이제 시작하는 단계이니 하나씩 차근차근, 꾸준히 공부해봐야겠다.
특별히, , , 데이터사이언티스트는 배울게 많아 보이는데,, 늦게 시작한만큼 한 시간이라도 더 공부해야겠다.
그리고.. 통계 공부를 시작해야겠다. 추가로 공부할 게 많다...ㅎㅎㅎㅎㅎ
오늘도 어질어질,, 다음주엔 새로운 강사님이 오시는데, 어떠실지, 그리고 난 잘 따라갈 수 있을지 걱정 반 기대 반...^_^