TIL

2024-06-10

여연찌 2024. 6. 10. 20:48
  • 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