-
05-4 회귀선 그리기 : matplotlib를 활용한 데이터 시각화데이터 분석/파이썬으로 배우는 데이터 분석을 위한 통계학 2022. 3. 30. 14:34
저번 시간에 이어서!
회귀 방정식을 구했다면 실제 회귀선을 그려봐야겠지? 회귀 방정식은 간단한 일차방정식이니 matplotlib을 활용하면 쉽게 그릴 수 있을거야. 데이터가 넘 많으면 보기 어려우니까 저번처럼 다섯명의 SAT 점수와 GPA를 가지고 회귀방정식을 구하고 회귀선을 그려볼게. 다섯명의 SAT 점수와 GPA를 가지고 구한 회귀방정식의 코드는 아래와 같아.
저번 시간에 했던 내용이기 때문에 기억하고 있지? 대신 변수 Yh에 회귀방정식을 문자열로 정리해서 넣어주었어. 이 땐 '+' 연산자를 활용하면 문자들끼리 합칠 수 있는데, a와 b가 숫자이기 때문에 'str()' 함수로 감싸서 문자열로 변환해 주었어. 이제 이 일차방정식을 가지고 회귀선을 그리면 되겠네!
-
회귀선 그리기
먼저 다섯명의 점수를 그래프에 출력해 줄 필요가 있을거야. scatter() 함수로 점을 찍어주면 되겠지? 그리고 회귀선을 그려 줄건데, 일차방정식의 그래프를 그리는 방법 또한
https://kimhaksung.tistory.com/entry/pytong05-2
에서 미리 배우고 왔지! plot() 함수에서 Y자리에 우리가 구한 회귀방정식을 대입하기만 하면 돼. 그렇다면?!
짜잔! 우리가 구한 회귀방정식으로 회귀선을 그었어! 어때?! 멋있지 않아?! 크으..
이제 다섯명의 데이터로 연습을 했으니 40명의 데이터를 넣어볼까? SAT 리스트와 GPA 리스트의 항목들만 40명의 데이터로 바꿔주면 될거야.
코드를 실행해보면 40명의 데이터로도 회귀선이 잘 그려지는 것을 확인할 수 있어. 회귀선을 잘 보니까 저번 시간에 내가 대충 그었던 초록색 선이랑 비슷한거 같네.
암튼 이제 우리는 회귀방정식을 구하고, 회귀선을 그릴 수 있게 되었어! 대단한데?!
-
Y 평균선과의 관계
여기서 끝나면 아쉽잖아. 한 걸음 더 나아가보는게 어때?
우선 우리가 회귀선을 그을 때 어떤 기준으로 그렸는지 다시 생각해 볼게. X 변인으로부터 Y 변인을 예측하기 위해 회귀분석을 하고 있으니 Y 변인을 기준으로 잡자고 했잖아? 그래서 점수치들의 Y값과 제일 편차가 적은 선을 그리자! 했던 거였어. 기억나지? 그런데 길이는 양수도 나오고 음수도 나오니 다 더해서 비교하기가 어렵기 때문에 제곱해서 면적을 비교하자 했던 것이고! 이 방법이 회귀방정식을 도출하기 위한 것이었고 우리는 공식을 통해 쉽게 회귀상수를 계산해서 회귀방정식을 구할 수 있었어. 그치?
그럼 이제 회귀선이 얼마나 점수들을 잘 대표하고 있는지, 즉, 회귀선이 얼마나 점수들을 잘 예측하고 있는지 알아볼 차례야. 어떻게 하면 좋을까?
우리는 이번에 회귀에 대해 처음 배웠잖아. 아직 잘 모르지. 하지만 우리가 아주 어렸을 때 부터 점수들을 대표하는 지표가 있었어! 저번 시간에도 등장했던 평균이지! 왜 평균이 등장할까?
회귀는 변인이 하나가 아니기 때문에 평균을 내기가 애매했는데, Y 변인만 놓고 보려고 하니까 가능할거 같아. Y 변인들의 평균을 내는 것은 누워서 떡먹기잖아. 그리고 이미 회귀상수를 구할 때 Y의 평균은 계산해 놓은 상태이기도 하고. 그럼 그래프에 Y의 평균값을 그려볼까? 대신 Y의 평균값은 Y값이 고정되어 있어야 할거야. 하나의 상수니까!
Y축의 값이 상수일 땐 X축과 일대일 대응을 하지 않겠지. 그래서 plot() 함수를 쓰기가 애매해! 그럴땐,
① 상수가 N개 들어있는 리스트를 만든다.
② 그냥 X의 첫 번째 항목에서 바로 마지막 항목까지 선을 긋자.
③ X 점수치들에 0을 곱하다음 상수를 더해서 쓰자.
등 여러가지 방법이 있을거야. 코드로 표현하면,
① Ym_list = [Ym*N] ② plot([[X0], X[N-1]], [Ym, Ym]) ③ plot(X, 0*X+Ym)
위와 같은 코드로 구현할 수 있을텐데, 어느 방법을 쓰던지 상관 없어. 다만 내가 보기에는 세 번째 방법이 회귀선을 그릴 때와 맥락이 같기 때문에 통일성도 있고, 코드 길이도 짧아서 더 좋아 보이네! 다만 기울기를 억지로 0으로 줘서 X를 없애 버렸다는게 좀 더럽긴 해. 제일 깔끔한 것은 두 번째 방법이겠지만.. 코드가 길고 리스트 안에 리스트가 들어있는 형태라서 지저분해 보이잖아! 정답이 정해진 것은 아니니 여러분들은 여러분들이 맘에 드는 방법으로 Y 평균선을 그려봐!
평균선을 그리는 31번 라인을 잘 보면 못 보던 놈이 있어. 바로 'format()'이라는 놈인데! 이 놈은 문자열 중간에 값을 넣을 수 있게 해주는 놈이야.
아래의 코드를 보면 쉽게 이해할 수 있어.
format() 함수는 반드시 중괄호와 같이 사용해야 돼. 중괄호 안에 값을 넣기 위한 함수니까! 만약 pi와 같은 실수를 내가 원하는 자리수만큼 출력하고 싶다면 아래의 문법대로 작성하면 돼.
'{index(생략가능):.자리수f}'.format(실수)
이런걸 '문자열 포맷팅(string formatting)'이라고 하는데.. 문자열 포맷팅만 따로 배우기 보다는 이런 기회를 빌려 배우고 넘어가는게 나을거 같아. 가끔 써먹을 거니까 기억해 둬! 문자열 포맷팅을 사용한다면 회귀방정식을 구하는 코드에서 21번 줄을 더 간단하게 바꿀 수 있어. 아래처럼 말야.
문자열을 다룰 때 유용하겠지? 암튼 우리는 Y평균선도 그릴 수 있게 되었어. 우리가 회귀선을 배우기 전에 Y값들을 가장 잘 대표한다고 생각했던 선이었지.
이렇게 그려놓고 보니 Y 평균선보다는 확실히 회귀선이 훨씬 점수치들을 잘 대표한다고볼 수 있겠지? 흐흐 참 뿌듯하단 말야!
다음 시간에는 이 회귀 방정식이 과연 얼마나 점수치들을 잘 대표한다고 볼 수 있을지에 관해 수치적 해석을 해 볼게! 안뇽!
'데이터 분석 > 파이썬으로 배우는 데이터 분석을 위한 통계학' 카테고리의 다른 글
05-6 추정 표준오차와 신뢰구간의 계산 (0) 2022.04.01 05-5 추정 표준오차 그리고 자유도 (0) 2022.03.31 05-3 회귀상수와 회귀선 (0) 2022.03.29 05-2 회귀 분석 시각화를 위한 matplotlib (0) 2022.03.28 05-1 회귀 : 선형적 관계성 (0) 2022.03.23