본캠프/TIL ♨

[42일차] 통계와 파이썬 학습, 머신러닝 1주차 학습, 주기적복습

yssummer 2025. 4. 10. 15:23

250410

🐱‍👤 하루 요약

  • <오전일정>
  • 9:00~10:00 (포모도로 1,2): 학습 계획 작성, 10분 팀 오전스크럼 작성 ㅇ
  • 10:00~11:00 (포모도로 3,4): 통계 라이브세션 듣기 ㅇ
  • 11:00~11:30 (포모도로 5): 통계 라이브세션 복습 ㅇ
  • 11:30~11:50 (포모도로 6): 주기적 복습(통계), 일정표 수정 ㅇ
  • 11:50~1:30 : 점심, 운동, 집정리 ㅇ
  • 1:30~2:30 (포모도로 7,8): 주기적 복습(파이썬) ㅇ
  • <오후일정>
  • 14:40~15:05 (포모도로 1): 통계 라이브세션 복습 TIL 작성 - 다 TIL 에다가 쓰기. ㅇ
  • 15:10~15:35 (포모도로 2): QCC 1문제 풀이 25분 ㅇ
  • 15:40~16:00 (포모도로 3): 해설 20분 ㅇ
  • 16:00~17:00 (포모도로 4,5): 아티클 스터디 ㅇ
  • 17:10~17:35 (포모도로 6): QCC 1문제 풀이 25분 x 앞 문제 ing
  • 17:40~18:05 (포모도로 7): 해설 25분  x 앞 문제 ing
  • 18:05~18:40 : 저녁식사  ㅇ
  • 18:45~19:00 (포모도로 8): 베이직반 세션6 강의록 예습 15분 ㅇ
  • 19:00~20:00 (포모도로 9,10): 베이직반 세션6 들으면서 암기 ㅇ
  • 20:10~20:30 (포모도로 11): 베이직반 백지복습 10분, 도식화 10분 pass
  • 20:30~21:00 (포모도로 12): 오후스크럼 20분, TIL 10분 마무리 ㅇ

+ 추가학습 9:40~10:20 qcc 오답 풀이연습


 


😊공부메모

  🔵1. 통계야 놀자 라이브세션 5회차 약2시간

    🧶강의듣기, 백지복습

      🐬 회귀와 예측 - 실습 파트 했는데 회귀 시각화 그린 후 회귀 선도 추가해보고, 결과 해석인

        # 회귀분석 결과 해석하기 # 주요 해석포인트 # 결정계수 R-squared 확인, 모형의 적합도 Prob(F-statistic) 확인, P>|t| 확인       

         import statsmodels.api as sm

        results = sm.OLS(y, sm.add_constant(X)).fit()

        results.summary()  까지 할 줄 알아야 한다.

 

      🐬 <복습할 내용들 정리>

import pandas as pd

import numpy as np
# 데이터 분포 확인을 위한 plt 라이브러리 import
import matplotlib.pyplot as plt
import seaborn as sns
#sklearn 에서 제공하는 데이터 셋 중 하나인 diabetes 불러오기
from sklearn.datasets import load_diabetes
#회귀분석 라이브러리 import
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
from PIL import Image
# 데이터를 가져오고, 이름을 df 로 받아주겠습니다.
diabetes = load_diabetes()

 

# 자료구조 확인 - sklearn.utils._bunch.Bunch 입니다.
# key 와 value 값으로 나뉘어 저장되어 있고, dictionary 구조와 유사합니다.
type(diabetes), diabetes

 

# key 를 확인해 보겠습니다. 각각의 key 값에 값이 존재합니다.
diabetes.keys()
dict_keys(['data', 'target', 'frame', 'DESCR', 'feature_names', 'data_filename', 'target_filename', 'data_module'])

 

# 키값을 바탕으로, pandas dataframe 을 만들어 주겠습니다.
#np.c_ 는 두 배열을 가로 방향으로 합치는 함수입니다.
df= pd.DataFrame(data=np.c_[diabetes.data, diabetes.target], columns=diabetes.feature_names + ['target'])

 

# 총 442 명에 대한 나이, 성별, bmi(체질량지수).. 등을 가져왔습니다.
df

age sex bmi bp s1 s2 s3 s4 s5 s6 target 

0.038076 0.050680 0.061696 0.021872 -0.044223 -0.034821 -0.043401 -0.002592 0.019907 -0.017646 151.0
-0.001882 -0.044642 -0.051474 -0.026328 -0.008449 -0.019163 0.074412 -0.039493 -0.068332 -0.092204 75.0
0.085299 0.050680 0.044451 -0.005670 -0.045599 -0.034194 -0.032356 -0.002592 0.002861 -0.025930 141.0
-0.089063 -0.044642 -0.011595 -0.036656 0.012191 0.024991 -0.036038 0.034309 0.022688 -0.009362 206.0
0.005383 -0.044642 -0.036385 0.021872 0.003935 0.015596 0.008142 -0.002592 -0.031988 -0.046641 135.0
... ... ... ... ... ... ... ... ... ... ...
# 히스토그램을 통한 데이터 분포 살펴보기
df.hist(bins=20, figsize=(12, 6), color='green')
plt.tight_layout()
plt.show()

# 특성 간 상관 관계 확인하기
corr_matrix = df.corr()
plt.figure(figsize=(10, 8))
# 삼각형 형식으로 보여주기
mask = np.triu(np.ones_like(corr_matrix, dtype=bool))
sns.heatmap(corr_matrix,annot=True, cmap='BrBG', linewidths=0.5, mask=mask, fmt=".2f")
plt.title("Heatmap -Using Seaborn Library")
plt.show()

 

# 종속변수와 독립변수 관계
sns.scatterplot(x='bmi', y='target', data=df, color='green', marker='*')
plt.xlabel("BMI")
plt.ylabel("Progression of Diabetes") # 당뇨병 진행 정도
plt.title("Relationship between Progression of Diabetes & BMI")
plt.show()

# Diabetes(당뇨병) 데이터셋 로드
diabetes = load_diabetes()
X = df.bmi.values
y = df.target.values
# 단순선형회귀 모델 선언
model = LinearRegression()
# 1차원 -> 2차원 변경
X = X.reshape(-1, 1)
# 모델 학습. FIT 을 사용합니다.
model.fit(X, y)


회귀식: y= 152.133 + 949.435*x 이 되겠습니다.
# coef 가 기울기를, intercept_가 Y 절편을 의미합니다.
model.coef_[0], model.intercept_
# 회귀선 추가하기
plt.scatter(X, y, alpha=0.5, color='green', marker='*')
plt.plot(X, model.predict(X), color='red', linewidth=2)
plt.xlabel("BMI")
plt.ylabel("progression of diabetes") # 당뇨병 진행 정도
plt.title("The example of Linear Regression")
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 정도로 이해해주세요)

 

A. R제곱값이 0.34정도로 이는 34%만큼의 설명력을 가진다고 판단할 수 있습니다.

keyboard_arrow_down

0에 가까울 수록 예측값을 믿을 수 없고 1에 가까울 수록 믿을 수 있다고 판단합니다.

B. Prob(F-statistic)
도출된 회귀식이 회귀분석 모델 전체에 대해 통계적으로 의미가 있는지 파악합니다.
-> F-statistic의 p-value 값은 Prob(F-statistic)으로 표현되는데,
이는 3.47e-42로 0.05보다 작기에 이 회귀식은 회귀분석 모델 전체에 대해 통계적으로 의미가 있다고 볼 수 있습니다.

C. P>|t|
각 변수가 종속변수에 미치는 영향이 유의한지 파악합니다.
x1과 const에 대한 p-value가 0.000으로 표기 되어 있기에 0.05보다 작으므로 target을 설명하는데 유의하다고 볼 수 있습니다.

 

  • OLS(Ordinary Least Squares) 해석하기
  • OLS 는 선형 회귀 모델의 결과를 나타내는 회귀 결과 표입니다. ols에서는 summary 라는 함수를
  • 지원해주는데 summary를 통해 아래와 같은 결과표를 얻을 수 있습니다.

전체 해석은 아래와 같습니다. 주요 지표는 파란 글씨를 참고해주세요!

    1. Dep. Variable (y): 종속 변수, 즉 회귀분석에서 설명하고자 하는 변수입니다.
    2. R-squared (0.344): 결정계수로, 회귀 모델이 종속 변수의 변동성을 얼마나 설명하는지를 나타냅니다. 이 값은 0에서 1 사이에 위치하며, 0.344는 약 34.4%의 변동성이 설명된다는 것을 의미합니다.
    3. Adj. R-squared (0.342): 수정된 결정계수로, 설명 변수의 개수를 고려하여 R-squared 값을 조정한 것입니다. 변수의 수가 늘어날 때 발생하는 과적합을 방지하기 위해 사용됩니다. 0.342는 모델이 적절하게 조정되었음을 나타냅니다.
    4. Method (Least Squares): 사용된 회귀 방법이 최소제곱법임을 나타냅니다.
      1. 최소제곱법: 근사적으로 구하려는 해와 실제 해의 오차의 제곱의 합이 최소가 되는 해를 구하는 방법
    5. F-statistic (230.7): 회귀 모형의 전체 유의성을 검정하는 F-통계량입니다. 값이 클수록 모형이 유의미할 가능성이 높습니다.
    6. Prob (F-statistic) (3.47e-42): F-통계량의 p-값으로, 이 값이 매우 작으면 (예: 0.05 이하) 대립가설을 채택할 수 있습니다. 이 경우 p-값이 거의 0에 가까우므로, 회귀 모형이 통계적으로 유의미하다고 볼 수 있습니다.
    7. Log-Likelihood (-2454.0): 회귀 모형의 로그 우도(likelihood)입니다. 값이 클수록 모형이 데이터에 더 잘 맞는다는 것을 의미합니다.
    8. No. Observations (442): 사용된 관측치(데이터 포인트)의 수입니다.
    9. Df Residuals (440): 잔차의 자유도, 즉 전체 데이터 포인트 수에서 회귀 계수의 수를 뺀 값입니다.
    10. Df Model (1): 모델에 포함된 설명 변수의 수입니다.
    11. Covariance Type (nonrobust): 공분산 추정의 유형을 나타냅니다. nonrobust는 기본 공분산 추정이 사용되었음을 의미합니다.
    12. coef (coefficients):
      • const (152.1335): 상수항(절편)으로, 독립변수가 0일 때 종속 변수의 예측값입니다.
      • x1 (949.4353): 설명 변수 x1의 회귀 계수로, 독립변수가 1 단위 증가할 때 종속 변수가 평균적으로 949.4353 단위 증가한다는 의미입니다.
    13. Dep. Variable (y): 종속 변수, 즉 회귀분석에서 설명하고자 하는 변수입니다.
    14. std err (Standard Error): 회귀 계수 추정치의 표준 오차입니다. 상수항과 x1에 각각 2.974, 62.515가 있습니다.
    15. t (t-statistic): 회귀 계수가 0인지 검정하는 t-값입니다. 절대값이 클수록 해당 계수가 유의미할 가능성이 높습니다. x1의 t-값은 15.187로 매우 크며 유의미함을 나타냅니다.
    16. P>|t| (P-value): 각 계수에 대한 p-값입니다. 일반적으로 0.05보다 작으면 해당 계수는 유의미하다고 판단됩니다. x1과 상수항의 p-값은 모두 0으로, 매우 유의미합니다.
    17. [0.025 0.975] (Confidence Interval): 회귀 계수에 대한 95% 신뢰구간입니다. 예를 들어, x1의 신뢰구간은 [826.570, 1072.301]로, 이 범위 내에서 실제 계수가 있을 가능성이 95%입니다.
    18. Omnibus (11.674): 잔차의 정규성을 검정하는 Omnibus 검정 통계량입니다. 값이 작을수록 잔차가 정규분포에 가깝다는 의미입니다.
    19. Prob(Omnibus) (0.003): Omnibus 검정의 p-값입니다. 0.05보다 작으므로 잔차가 정규분포에서 벗어날 가능성이 있습니다.
    20. Skew (0.156): 잔차의 왜도(skewness)입니다. 값이 0에 가까울수록 대칭적입니다.
    21. Kurtosis (2.453): 잔차의 첨도(kurtosis)입니다. 3에 가까울수록 정규분포에 가깝습니다. 2.453은 정규분포보다 조금 더 평평함을 의미합니다.
    22. Durbin-Watson (1.848): 잔차의 자기상관을 검정하는 통계량입니다. 2에 가까우면 자기상관이 없음을 의미합니다.
    23. Jarque-Bera (JB) (7.310): 잔차의 정규성을 검정하는 Jarque-Bera 검정 통계량입니다.
    24. Prob(JB) (0.0259): Jarque-Bera 검정의 p-값입니다. 0.05보다 작아 잔차가 정규성을 만족하지 않을 가능성이 있습니다.
    25. Cond. No. (21.0): 설명 변수의 다중공선성을 나타내는 조건수입니다. 값이 높으면 다중공선성 문제가 있음을 시사합니다.

 


  🔵2. 주기적 복습(3일 1주일 1달) 약1시간

    🧶해당 날짜 노션메모, TIL 찾아서 읽기

      🐬했음....

 

  🔵3. Qcc 문풀 연습 약2시간

    🧶풀기, 해설강의 듣기

      🐬카운트 기준으로 또 카운트하는 거는 실무에서도 많이 나온다. 

        주문을 몇개 했는지 사람별로 구한다. 3개월동안 5번 주문한 고객은 몇명인가? 같은 문제를 해결하게 된다.

 

 

여기까지가 문제고 아래부터는 풀이

1번 문제 내가 풀이했던건데 저번 시험때 아마 이런식으로 썼던듯

select unique_logins, employee_count
from (
	select employee_id, 
		login_result, 
		count(login_result) as unique_logins, 
		count(distinct employee_id) as employee_count
	from logins
	where login_result = 'SUCCESS'
	group by 1,2
) cnt_employees_login_succeeded
group by 1,2
order by unique_logins

중간중간 실행해서 체크해보면서 코드 쓰면 좋았을텐데

그렇지 않아가지고 쓰면서 뭔가 잘 나오는지 확인하고 싶지만 불가한 지점이 몇번 있었다 ㅋㅋ

아무래도 qcc 시험본거 복습하는거다보니깐 그럴 환경이 안돼서 좀 아쉽지만

튜터님이 보여주시는 화면도 충분하긴 함~

정답쿼리1 서브쿼리 스타일

select logins, count(1) employees
from (
	select employee_id, count(distinct login_id) logins -- 근데 이거 pk니까 count(1)라고 써도 무방
														-- 나는 로그인 아이디를 세지 않음. 
	from logins 
	where login_result = 'SUCCESS'
	group by employee_id
) a
group by logins
order by logins

정답쿼리2

with successful_logins as(
	select employee_id, count(distinct login_id) logins
	from logins 
	where login_result = 'SUCCESS'
    and date_format(sent_time, '%Y%m') between '202307' and '202309'
 -- and login_time >= '2023-07-01' and login_time < '2023-10-01' 이 부분 어느 형식으로도 괜찮
	group by employee_id
)
select logins, count(1) employees
	from successful_logins
group by logins
order by logins
limit 10
정답쿼리3


WITH success_logins AS (
    SELECT employee_id, COUNT(distinct login_id) AS unique_logins
    FROM qcc.logins
    WHERE login_result = 'SUCCESS'
      AND login_time >= '2023-07-01'
      AND login_time < '2023-10-01'
    GROUP BY employee_id
)
SELECT unique_logins, COUNT(1) AS employee_count
FROM success_logins
GROUP BY unique_logins
ORDER BY unique_logins

 

 

🔵4. 아티클 스터디 약 1시간

    🧶주제: A/B 테스트 설계하고 판단하는 법

      🐬내용: 신뢰기준 p value 보는 법을 알려줘서, 지금 배우고 있는 통계 내용과 겹쳤는데,

어떻게 판단하는건지 이해할 수 있었음!!! 

95%일때 5% 미만이면 우연이 거의 없고 이 실험의 결과로 나온거라고 보는 것이고

5% 초과면 우연이 넘 많다고 판단하여 그 ab테스트는 버리게 된다는 예시를 보니까 이해가 되었음.

 

  🔵5. 베이직반 라이브세션 5회차 약 1시간반

    🧶강의듣기, 백지복습

      🐬

실질적인 채용에 관한 이야기도 해주셔서 좋았다!

주니어레벨에서는 자격증 소지가 유의미하다는 말씀이 잘 이해되었다.

오후 스크럼때 이얘기가 나와서 자격증 시험 응시 이야기로 이어졌었다 ㅎ,ㅎ

 

[2:3] 

 

리스트에 추가하기

append

암기법: 쇼핑할 떄 서스펜더 추가 ㅎ..로 외우기.

 a.append()

 

정렬 sort()

a.sort()

a.sort(reverse=True)

 

제거하기

.remove()

a.remove(3)하면 하나의 3만 없어질까, 전체에 있는 모든 3이 없어질까?

---> 처음 나오는 3만 없어진다.

drop이라는 함수는 없음.

.drop() 없음. 

 

딕셔너리를 파일화한다면 앱에서 데이터가 파생될 때 json형태와 가장 가깝다고 한다. 

딕셔너리에서 추가하기

a = {1: 'a'}

 

a.keys() 하면 key값이 모두 호출된다.

a.values()하면 value값이 모두 호출된다.

 

판다스 빅분기 나왔던 문제 위주로 몇개 풀어보기.

가능한 만큼만 하고 다음 시간에 이어서 할 예정.

 

 



🐱‍👤생활관리

아침메모
 점심에 헬스장 다녀와서 컨디션 굿

오늘은 이번주 최초 (?) 도서관 안가고 집공했다

면학분위기는 아니지만 하다보면 또 면학분위기 되고... 

아무래도 모니터가 많아서 좋고 편했다


저녁메모
오늘은 일찍 잘 여지가 돼서 다행 ... 내일 큐씨씨니까 일자일일 해야지~~

공부하다보니까 큐씨씨 문제 많이 못풀어서 좀 아쉽 ㅠㅠ 낼 좀 더 풀꺼임

 

 

 

끝.