반응형
1. 통계학 기초 강의
1) 중심극한정리
독립적이고 동일한 분포를 갖는 확률분포의
확률변수는 그 표본의 수가 충분히 커지면
표본평균의 분포가 정규 분포를 따른다.
따라서 정규분포를 이용하면 원래의 분포와 상관없이
평균에 대한 통계 모델 제작 가능.
그러나 현실에서는 데이터마다
정규분포에 수렴하게 해주는 표본수(N)가 다르거나
독립적이고 동일한 분포를 가지지 않음.
1. 독립성 깨짐 : 주가, 날씨(AR model?).
2. 동일성 깨짐 : 성별 구분 없는 신장 집계.
2) t-분포
모평균, 모분산 등.
모집단에 대한 정보를 모르기 때문에
t-분포를 대신 사용.
3) 가설 검정
귀무가설(영가설).
대립가설(우리가 원하는 결과 보통).
1종 오류 : 귀무가설이 맞았는데 기각하는 것.
2종 오류 : 귀무가설이 틀렸는데 기각하지 않는 것.
예전에 공부할 때는 채택이란 말을 썼던 거 같은데
지금은 기각한다 기각할 수 없다.
고로 두 집단 간 차이가 난다고 할 수 있다.
차이가 난다고 할 수 없다.
등으로 약간의 여지를 주는 방향으로 바뀐 듯 하다.
어찌보면 통계학적으로 더 올바른 해답일지도어디까지나 확률이니까
4) 다양한 t-test
(1) One sample t-test
: 한 집단의 평균이 특정값과 크게 차이나는지.
(2) Two sample t-test
: 두 집단의 평균 차이 검정.
집단이 정규성을 가지냐, 등분산이냐에 따라
여러가지 메서드 존재.
정규성 검정 - shapiro.
등분산 검정 - leneve.
모두 정규성 ㅇ, 등분산 ㅇ = ttest_ind(df1, df2, equal_var=True).
모두 정규성 x, 등분산과 상관없이 비모수 검정 실시 = mannwhitneyu(df1, df2), ranksums(df1, df2).
모두 정규성 ㅇ, 등분산 x = ttest_ind(df1, df2, equal_var=False).
(3) Paired t-test
: 대응표본 t- test
일반적으로 동일 집단의 사전 사후 비교를 할 때 사용.
정규성 검정 - shapiro.
등분산 검정 - leneve.
등분산은 대응표본 시 영향을 주지 않음.
모두 정규성ㅇ = ttest_rel(before,after).
모두 정규성 x 고로 비모수검정 = wilcoxon(before,after).
5) ANOVA
분산 분석(ANalysis Of Variance)
한 번에 여러 평균 검사하기.
귀무가설 : 모든 집단의 평균이 같다.
대립가설 : 귀무가설이 아무튼 아님. 어디가 다른지는 몰라도 아무튼 아님.
형태
= 집단 간 평균의 분산 / 집단 내 평균의 분산.
여기서 분모 분자가 분산의 형태여서
각각이 카이제곱분포를 따른다고 이해했다.
anova 에 대해서는 조금 더 많이 공부해야겠다
2. 데이터 분석 기초 개인 과제
1) 2) 3) 은 어제 글을 참조.
4) 아웃라이어 제거.
아웃라이어 제거 함수를 짜고,
제거 함수를 통해 나온 df를 리스트에 저장.
마지막에 리스트에 모인 df를
concat을 통해 이어 붙여준다.
사실 4번에서의 함수 정의까지만 과제였고
아래부터는 손댈 것이 없었다
요일별로 반복문을 통해 이상치를 제거하고
그것을 기반으로 ANOVA를 한다
아래의 Assumption test는
아직 통계 강의를 마치지 못하여
조금 더 살펴봐야겠다
## 함수 기반으로 z score 기반의 이상치 탐지
def z_score_outlier_remover(df:pd.DataFrame, threshold:float) -> pd.DataFrame:
"""
z-score가 Threshold가 넘는 값들을 이상치로 판단하고 제거.
단, 이상치가 제거될 때마다 평균과 분산이 바뀌므로
이상치가 존재하지 않을 때까지 무한 반복
"""
total_outlier_count = 0
if threshold <= 0:
raise ValueError("Threshold must larger than zero")
while True:
## 평균과 표준 편차를 집계
## numpy 함수 사용
m = np.mean(df['push_count'])
s = np.std(df['push_count'])
## num_list의 각 요소가 이상치인지를 나타내는 Boolean series 생성
## 너무 높은 이상치든 낮은 이상치든 잡아내기 위해 절댓값 처리
## True면 이상치
ser_outlier_bool = abs((df['push_count'] - m) / s) > 3
## 이상치의 숫자를 집계
## True 값 갯수만 구하기 위해 sum()
outlier_count = ser_outlier_bool.sum()
## 이상치가 존재한다면 그 숫자를 세고, 제거
## 위의 boolean series에서 True는 이상치 이므로
## False로 df를 대체
if outlier_count > 0:
total_outlier_count += outlier_count
df = df[ser_outlier_bool == False]
## 이상치가 존재하지 않으면
else:
## 제거한 이상치가 1개 이상이라면 출력하고 종료
if total_outlier_count > 0:
print(f"The number of outliers(z-score > {threshold}): {total_outlier_count}")
break
return df
반응형
'TIL' 카테고리의 다른 글
내배캠 TIL 29일차 (0) | 2024.01.29 |
---|---|
내배캠 TIL 28일차 (0) | 2024.01.26 |
내배캠 TIL 26일차 (1) | 2024.01.24 |
내배캠 TIL 25일차 (1) | 2024.01.23 |
내배캠 TIL 24일차 (1) | 2024.01.22 |