어려운 문제로 약 한시간 동안 골머리를 앓다가 튜터님께 도움의 손길을 요청했다.
문제에 요구되는 중요한 개념을 전해 듣고, 후속 풀이의 실마리를 받아냈다.
마침내 1시간의 추가 고뇌 시간을 거친쳐 해결할 수 있었다. 감사한 마음을 담아 메시지를 보내니 아래와 같이 답신주셨다.

머리 끙끙 풀어낸 문제가 큰 성장에 도움이 된다란 말... 정말 감격스러웠다.
SQL, 파이썬을 공부하며 재미는 있었지만, 개념을 숙지했는데도 도통 문제가 풀리지 않아 좌절했던 나날이 있었다.
주말 모두를 할애하여 보충학습을 했는데도 나의 학습 상향 속도는 미진했다.
퇴사 후 호기롭게 선택한 이 길에서 난 노력했는데도 안되다며 절망스런 시간들이었다.
고개를 축 늘어뜨린채 한숨을 내쉬었지만 포기할 순 없었다.
마음을 다잡아보았다.
"아직 배운지 얼마 안되었잖아? 한달쯤 되었나?"
"물론 지금은 실력이 저조할지라도, 분명한 건 난 계속해서 정진할 거란 점, 그 점만 확실하다면 난 실력은 분명 나아질 것이다."
오늘, 튜터님이 주신 메시지 덕분에 그간 엉크러졌던 내 마음을 잘 정돈할 수 있었다.
지금은 학습의 초반 단계이고 난 앞으로도 수없이 많은 실패와 좌절 절망을 겪겠지만
그럼에도 불구하고 꾸준히 정진하는 나, 나아질거란 믿음 이 2가지로 하루하루 성실히 임할 것이다.
요약/나만의 인사이트
- 2차원리스트를 행렬이라고 부른다. ex) [[1,2],[2,3]]
- 행렬의 합산은 이중 for문이 필요하다.
- 이때 for문을 마친 후 결과를 담을 변수를 미리 정의해 놓아야 한다.
- range는 숫자 시퀀스를 만들어주는 함수다. 0부터 시작한다.
- 함수는 통로를 통과할 때 값이 변하는 것이다. 함수엔 값을 받을 매개변수가 필요하다.
- A/B검정은 통계적으로 유의미한지 확인하는 테스트이다. 이때 P-value가 중요하다.
- P-value가 유의수준(대개 0.05)보다 작의면 통계적으로 유의미하다고 한다.
새롭게 알게 된 것
- 유의성 검정
- A/B검정
- A와 B 중 어느 것이 더 효과적인지 평가하기 위해 사용되는 검정 방법
- 사용자를 두 그룹으로 나누고 각 그룹에 A,B를 제공한 후 반응을 비교
- 두 그룹간의 변화가 우연이 아니라 통계적으로 유의미한지 확인
- t-통계량 (statistic): t-검정 통계량. 두 집단 간 평균 차이의 크기와 방향을 나타냄.
- p-값 (pvalue): 유의수준보다 작으면 귀무 가설을 기각하고 유의수준보다 크면 귀무 가설을 기각하지 않는다.
- 가설검정 ⭐⭐⭐
- 표본 데이터를 통해 모집단의 가설을 검증하는 과정
- 귀무가설과 대립가설을 설정하고 귀무가설을 기각할지 결정한다.
- 데이터 분석시 확증적 자료분석(선가설 수립 후 검증), 탐색적 자료분석(선탐색 후 가설 수립)
- 가설검정의 단계
- 귀무가설과 대립가설 설정
- 유의수준 결정
- 검정통계량 계산
- p-값과 유의수준 비교
- 결론 도출
- 가설검정의 예시
- 새로운 약물이 기존 약물보다 효과가 있는지 검정
- 효과가 없다 = 귀무가설
- 효과가 있다 = 대립가설
# 기존 약물(A)와 새로운 약물(B) 효과 데이터 생성 A = np.random.normal(50, 10, 100) B = np.random.normal(55, 10, 100) # 평균 효과 계산 mean_A = np.mean(A) mean_B = np.mean(B) # t-검정 수행 t_stat, p_value = stats.ttest_ind(A, B) print(f"A 평균 효과: {mean_A}") print(f"B 평균 효과: {mean_B}") print(f"t-검정 통계량: {t_stat}") print(f"p-값: {p_value}") # t-검정의 p-값 확인 (위 예시에서 계산된 p-값 사용) print(f"p-값: {p_value}") if p_value < 0.05: print("귀무가설을 기각합니다. 통계적으로 유의미한 차이가 있습니다.") else: print("귀무가설을 기각하지 않습니다. 통계적으로 유의미한 차이가 없습니다.")
- p-값
- p값이 0.05보다 작으면 통계적으로 의미가 있다. 귀무가설은 기각되고 대립가설은 채택된다는 의미
- 이때 0.05는 유의수준으로 많이 사용되는 값을 의미. 즉 일이 발생할 확률로 5%밖에 안된다는 뜻
- t-검정
- 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 방법
- 독립표본 t검정 - 두 그룹의 평균 비교
- 대응표본 t검정 - 한 그룹의 사전/사후 비교
- 두 집단 간의 평균 차이가 통계적으로 유의미한지 확인하는 방법
- 다중검정
- 여러 가설을 동시에 검정하는 것
- 그러나 각 검정마다 유의수준을 조정하지 않으면 1종 오류 발생 확률이 증가
import numpy as np import scipy.stats as stats # 세 그룹의 데이터 생성 np.random.seed(42) group_A = np.random.normal(10, 2, 30) group_B = np.random.normal(12, 2, 30) group_C = np.random.normal(11, 2, 30) # 세 그룹 간 평균 차이에 대한 t검정 수행 p_values = [] p_values.append(stats.ttest_ind(group_A, group_B).pvalue) p_values.append(stats.ttest_ind(group_A, group_C).pvalue) p_values.append(stats.ttest_ind(group_B, group_C).pvalue) # 본페로니 보정 적용 alpha = 0.05 adjusted_alpha = alpha / len(p_values) # p-value의 개수로 나눠줌 # 결과 출력 print(f"본페로니 보정된 유의 수준: {adjusted_alpha:.4f}") #숫자를 포맷팅하는데 :. 소수점 아래 4자리까지 float형식으로 for i, p in enumerate(p_values): #enumerate(열거하다) 파이썬에서 반복문을 돌릴 때 인덱스와 값을 함께 가져오는 함수 if p < adjusted_alpha: print(f"검정 {i+1}: 유의미한 차이 발견 (p = {p:.4f})") else: print(f"검정 {i+1}: 유의미한 차이 없음 (p = {p:.4f})") - 카이제곱검정
- 범주형 데이터의 표본 분포가 모집단 분포와 일치하는지 검정하거나 (적합도 검정)
- 내가 주사위 던졌을 때와 실제 주사에서 특정 눈이 나올 확률
- 두 범주형 변수 간의 독립성을 검정(독립성 검정)
- 성별과 직업만족도 간의 관계
- 범주형 데이터의 표본 분포가 모집단 분포와 일치하는지 검정하거나 (적합도 검정)
- 1종 오류와 2종 오류
-
귀무가설 참 거짓 기각 1종 오류 correct 채택 correct 2종 오류 - 1종 오류
- 귀무가설이 참인데 기각하는 오류
- 즉 아무런 효과가 없는데 효과가 있다고 하는 것
- 한마디로 위양성
- 2종 오류
- 귀무가설이 거짓인데 채택하는 오류
- 영향이 있는데 없다고 하는 것
- 한마디로 위음성
- 정리하자면 1종오류는 귀무가설이 참인데도 불구하고 기각하는 오류이며, 2종 오류는 대립가설이 참인데도 불구하고 기각하는 오류입니다.
- 1종 오류
- A/B검정
- 회귀(Regression)
- 단순선형회귀
- 정의
- 하나의 독립변수와 하나의 종속변수간의 관계를 직선으로 모델링 하는 방법
- 독립 변수의 변화에 따라 종속 변수가 어떻게 변화하는지 설명하고 예측
- 회귀식
- Y = β0 + β1X, 여기서 β0는 절편, β1는 기울기
- 1차 함수 y = ax +b 를 떠올리면 됨!
- intercept : 절편 (x가 0일 때 y 값)
- coefficient: 기울기 (x가 1증가할 때 y가 얼마나 변하는지)
- 예시
- 광고비와 매출간의 관계 분석
- 정의
- 다중선형회귀
- 정의
- 두 개 이상의 독립변수와 하나의 종속 변수간의 관계를 모델링
- 회귀식
- Y = β0 + β1X1 + β2X2 + ... + βnXn
- 특징
- 종속변수에 영향을 미치는 여러 독립변수가 있을 때 사용한다.
- 여러 변수의 영향을 동시에 분석할 수 있다.
- 변수들간의 다중공선성 문제가 있을 수 있다.
- 다중공선성: 독립변수들간의 높은 상관관계가 있는 경우를 말한다. 각 변수의 개별적인 효과를 분리해내기 어려워져 회귀의 해석을 어렵게 만든다. 상관계수를 계산하여 상관계수가 높은 (약 0.7) 변수들이 있는지 확인해볼 수 있다.
- 예시
- 다양한 광고채널(tv, 라디오, 신문)과 매출 간의 관계 분석
- 현재의 광고비를 바탕으로 예상되는 매출을 예측 가능
- 정의
- 범주형 변수
- 정의
- 수치형 데이터가 아닌 주로 문자형 데이터로 이뤄져 있는 변수가 범주형 변수
- 예시
- 성별, 근무 경력과 연봉 간의 관계
- 성별과 근무 경력이라는 요인변수 중 성별이 범주형 요인변수에 해당
- 해당 변수를 더미 변수로 변환
- 회귀 수행
- 특징
- 순서가 없는 변수 (ex 지역)은 무조건 원-핫 인코딩(하나만 1이고 나머지는 0인 벡터)변환을 해주어야 한다.
- ex) 부산 = [1,0,0,0], 대전 = [0,1,0,0], 대구 = [0,0,1,0], 광주 = [0,0,0,1]
- 정의
- 단순선형회귀
특히 어려웠던 것
- 코드타카 이차원 리스트, 행렬의 덧셈
- 문제: https://school.programmers.co.kr/learn/courses/30/lessons/12950
- 행렬의 덧셈은 행과 열의 크기가 같은 두 행렬의 같은 행, 같은 열의 값을 서로 더한 결과가 됩니다. 2개의 행렬 arr1과 arr2를 입력받아, 행렬 덧셈의 결과를 반환하는 함수, solution을 완성해주세요.
- 틀렸던 이유
- 이차원 리스트의 개념을 잘 몰랐다.
- 이중 for문을 사용해야 한다는 점을 몰랐다.
- 풀이
-
# 이차원 리스트 (리스트 안에 리스트가 있는 구조) # 인덱스끼리 더하는데 0행일 때 0,1열 / 1행일 때 0,1열이다. # arr1[0][0] + arr2[0][0] #4 # arr1[0][1] + arr2[0][1] #6 # arr1[1][0] + arr2[1][0] #7 # arr1[1][1] + arr2[1][1] #9 # 따라서 for문을 행에서 0~1, 열에서 0~1도는 두가지로 가져가야 한다 # 참고 range()는 파이썬에서 숫자 시퀀스를 만들 때 자주 쓰이는 함수, 0부터 시작해서 끝숫자 직전까지 반복 # 참고 range(len(arr1))을 한 경우 arr1과 arr2의 길이가 같기 때문에 그런것 그 다음으로 작은 for문에 len(arr1[0])한 경우 열이 하나인 경우가 있기 때문 arr1 = [[1,2],[2,3]] arr2 = [[3,4],[5,6]] def solution(arr1, arr2): result = [] #최종 값을 담을 큰리스트 만들기 (2차원) for i in range(len(arr1)): #행 0, 1이 순회하게 한다. answer = [] # 큰 리스트에 넣을 작은리스트 만들기 (1차원) for j in range(len(arr1[0])): #만약 range(1)이면 0만 생김 answer.append(arr1[i][j] + arr2[i][j]) #[4, 6]이 생성되면 다시 처음 for문으로 돌아가 또 [7, 9]가 생성됨 result.append(answer) # 안쪽 for문이 끝나면 큰 리스트에 담기 return result solution(arr1, arr2) - 핵심 포인트
-
유념해야 할 부분 설명 행렬 = 2차원 리스트
ex arr1 = [[1,2],[2,3]]
**행: arr1[0], arr[1]
**열: arr1[0][0], arr1[0][1]2차원 리스트의 일반적인 표현, 수학에서의 행렬과 구조가 같음. 인덱스끼리 더해야 한다.
arr1[0][0], arr[0][1] : 행이 0일 때 열이 0, 1
arr1[1][0], arr[1][1] : 행이 1일 때 열이 0, 1이중 for문이 필요하다.
- 행을 순회할 바깥의 for문
- 열을 순회할 안의 for 문answer.append(arr1[i][j] + arr2[i][j]) [4, 6]
4 먼저 담고, 그 다음 안에 있는 for문 순회할 때 6추가로 담기result.append(answer) 안의 for문이 모두 끝나고 result에 또 추가하면 [[4,6]]이 된다. 그 다음은 행이 [1]일일때 똑같이 수행하며 다음에 [6. 9]도 담긴다.
따라서 결과는 [[4, 6], [7,9]]
- 문제: https://school.programmers.co.kr/learn/courses/30/lessons/12950
다음에 적용해 볼 것
- [ ] 통계는 이해와 암기를 순환하며 계속해서 정진하며 공부하자
'기타 > 통계, 머신러닝' 카테고리의 다른 글
| 250701_기초 통계학(선형회귀, 다중선형회귀), 파이썬(클래스) (1) | 2025.07.01 |
|---|---|
| 250630_기초 통계학(모수 추정, 중심극한 정리, 표본오차와 표준편차) (7) | 2025.06.30 |
| 250627_기초 통계학(다양한 상관계수, 가설검정 시 주의점), 파이썬(map, split, strip 내장함수) (0) | 2025.06.28 |
| 250625_기초 통계학(다양한 분포들) (2) | 2025.06.25 |
| 250624_기초 통계학(상관관계, 기술통계, 추론통계) , SQL 파이썬 코드카타 (0) | 2025.06.24 |