- Today
1. 통계학 3회차 수강 및 복습
2. SQL 코드카타
3. 대시보드
- Today I Learned
통계학 세션
회귀분석
y = a+bx
우리가 가진 데이터셋에 해당 값이 없을 때, 이를 예측하기 위해 회귀분석의 개념이 도입됨
추세선 = 우리가 이미 가지고 있는 데이터들을 가장 잘 설명해주는 선
정의: 독립변수로 종속변수를 예측하는 분석기법
프로세스:
1. 독립변수, 종속변수 설정
: 변수 및 가설 설정
2. 데이터 경향성 확인
: 독립변수와 종속변수 간 산점도 분석 및 상관
3. 적합성 검증 & 결과 해석
+회귀모델이 얼마나 설명력을 갖는지?
결정계수를 확인(R_squared(R^2))
설명력은 전체오류중 회귀를 함으로써 얼마나 개선되었는가를 의미
1에 가까울 수록 모델의 성능이 좋다는 것을 의미
+회귀모델이 통계적으로 유의한지?
회귀식에 대한 F검정 시행
p-value 로 유의성을 판단(유의수준 0.05 를 넘냐 안넘냐) > 0.05보다 작으면 우연이 아니야> 대립가설 채택
+독립변수와 종속변수 간 선형관계가 있는지?
회귀식의 기울기에 대한 t 검정 시행
귀무가설: 연관이 없다.
대립가설: 연관이 있다.
p-value 값이 0.05보다 작다면 대립가설 채택
ex) 게임시간이 1000시간이면, 전기세는 얼마일까요?
x: 독립변수(게임시간)
y: 종속변수(전기세)
a: 절편
b: 기울기
귀무가설: 게임시간은 전기세와 관련이 없을 것이다.
대립가설: 게임시간은 전기세와 관련이 있을 것이다.
선형회귀 (단순,다중)
: 연속형
: 예측
ex) 공부시간(독립변수)에 따른 시험 점수(종속변수)
로지스틱회귀 (이진,다중)
: 연속형, 범주형
: 분류, 예측
이진 로지스틱 회귀 - 종속변수가 두가지 중 하나의 값, 결과가 둘 중에 하나
다중 로지스틱 회귀 - 종속변수가 순서가 없는 3개이상일 경우
A/B 테스트
: 두 집단간의 차이가 없을 것이다.
회귀분석
: 독립변수와 종속변수 간 선형적인 연관이 없을 것이다.
코드
# 단순선형회귀분석
# 당뇨병의 수치(target)와 bmi(체질량지수) 간 회귀분석 시행
# 종속변수: 당뇨병수치
# 독립변수: bmi(체질량지수)
Y = df.index.values
X = df.bmi.values
#분포 확인
import matplotlib.pyplot as plt
plt.scatter(X, Y)
# 회귀분석을 위한 2d array로 변황
# 선형회귀 는 2차원을 넣어야 돌아가기 때문에 2차원으로 바꿔줌!
X = X.reshape(-1,1)
Y = Y.reshape(-1,1)
# 데이터 갯수가 맞지 않다면 에러가 발생하기 때문에 지정을 해주어야 하는데
# -1을 넣으면 알아서 그 열만큼 지정하도록 하는 것
# (1,-1) 1 행에 다 담을 꺼야, 열이 몇개인지 모르겠어
# (-1,1) 하나의 열씩만 담을 꺼야 몇개의 행이 나올지는 모르겠어
# 회귀분석 시행
# 회귀계수를 확인할 수 있습니다.
# 이를 통해, 회귀식을 도출할 수 있게 됩니다.
# y= b0 +b1x
# b0, b1(y절편, 기울기)
b0=lr.fit(X, Y).intercept_
b1=lr.fit(X, Y).coef_[0]
b0,b1
# intercept 절편(편향), coef 기울기(가중치)
# 회귀식: y= 152.133 + 949.435*x
# 회귀선 추가하기
# 그래프 그리기 위해 다시 X,Y 선언
Y = df.index.values
X = df.bmi.values
#numpy 에서 제공하는 plotfit 함수를 통해 회귀선 구하기
# b0, b1 = np.polyfit(X, Y, 1) # 가중치가 먼저 그다음 편향값
plt.scatter(X,Y)
plt.plot(X,b0+b1*X,color='red') # 하나 더 그린다
plt.show()
# 회귀분석 시행
# 회귀계수를 확인할 수 있습니다.
# 이를 통해, 회귀식을 도출할 수 있게 됩니다.
# y= b0 +b1x
# b0, b1(y절편, 기울기)
lr.fit(X, Y).intercept_,lr.fit(X, Y).coef_[0]
# intercept 절편(편향), coef 기울기(가중치)
# 회귀식: y= 152.133 + 949.435*x
# 회귀선 추가하기
# 그래프 그리기 위해 다시 X,Y 선언
Y = df.index.values
X = df.bmi.values
#numpy 에서 제공하는 plotfit 함수를 통해 회귀선 구하기
b0, b1 = np.polyfit(X, Y, 1) # 가중치가 먼저 그다음 편향값
plt.scatter(X,Y)
plt.plot(X,b1+b0*X,color='red') # 하나 더 그린다
plt.show()
# 회귀분석 결과 해석하기
# 해석순서
# 결정계수 R-squared 확인 -> 모형의 적합도 Prob(F-statistic) 확인 -> P>|t| 확인
import statsmodels.api as sm
results = sm.OLS(Y, sm.add_constant(X)).fit()
# 그래프 결과 불러오기
results.summary()
# 메시지
# Standard Errors assume that the covariance matrix of the errors is correctly specified.
# 메시지 해석 데이터 관측치의 부족으로 첨도 테스트에 문제가 있다는 경고
# (common notice 정도로 이해해주세요)
OLS 해석하기
<주요지표>
R-squared: 0.344
#
34% 만큼의 설명력을 가진다고 판단할 수 있다.
0에 가까울 수록 예측값을 믿을 수 없고 1에 가까울 수록 믿을 수 있다고 판단한다.
* 아주 잘 나오면 65%
Prob(F-statistic): 3.47e-47
#
회귀분석 모델 전체에 대해 통계적으로 의미가 있는지 파악
0.05보다 작기 때문에 이 회귀식은 모델 전체에 대해 통계적으로 의미가 있다고 볼 수 있다.
P>|t|: 0.000
#
각 변수가 종속변수에 미치는 영향이 유의한지 파악
0.05보다 작으므로 유의하다고 볼 수 있다.
1. 분포확인
2. 회귀식
3. 회귀선그리기
4. 결과 해석
> 결정계수
> 모형의 적합도 Prob
> P 밸류 확인
Python 대시보드
2주째 끙끙거렸던 대시보드를 드디어 완성!
report = dp.Blocks(
## 1 페이지 시작
dp.Page(
## 페이지 이름
title="User",
## 최상단 블록 만들기 3개
blocks=[
dp.Group(
dp.BigNumber(heading="Total Users", value="3,900 명"),
dp.BigNumber(heading="Avg Age", value="약 44세"),
dp.BigNumber(heading="Subscribe Users", value="1,053명"),
columns=3,
),
dp.Group(
dp.BigNumber(heading="Total Amount", value="약 3.1 억원"),
dp.BigNumber(heading="ARPPU", value="81,000 원"),
columns=2,
),
dp.Group(
dp.Select(
dp.Group(
dp.Group(dp.Plot(dplot1), columns=1),
dp.Group(dp.Plot(dplot2), dp.Plot(dplot3), columns=2),
dp.Group(dp.Plot(dplot4), dp.Plot(dplot5), columns=2),
label="USER"),
dp.Group(dp.Plot(dplot6),dp.Plot(dplot7),columns=2,label="Subscription Status")))
],
),
### 2 페이지 시작
dp.Page(title="Data", blocks=[dp.DataTable(source, label="Data")]),
)
dp.save_report(report, path='report21.html')
대시보드의 코드는 위와 같다
튜터님의 코드를 그대로 따라 쳤는데, 해결이 되지 않아서 몇번이고 트러블슈팅을 했고 결국 성공!
- Next
1. SQL 코드카타
2. 통계학 4회차 라이브 세션
3. 머신러닝 개인과제 풀이
+ 파이썬 챌린지 1회차 수강
'TIL' 카테고리의 다른 글
2024-06-12 (1) | 2024.06.12 |
---|---|
2024-06-11 (1) | 2024.06.11 |
2024-06-07 (0) | 2024.06.07 |
2024-06-05 (1) | 2024.06.05 |
2024-06-04 (0) | 2024.06.04 |