본문 바로가기
마케팅 정보방/비밀 공부방

데이터 과학을 위한 통계 Part 2

by 그로스마케터 제시 2022. 3. 16.
반응형

part2 에서는 코드보다는 통계 지식들 위주로 알려준다. 
어떤 편향들이 있고, 상황에 따라 어떤 검정 방법들을 쓰면 좋을지 알려준다. 2장에서 강조한 것은 부트스트랩! 
기초 통계 책을 읽으면서 가볍게 봤던 이론들을 한번 더 꼼꼼히 점검할 수 있어서 좋았다. 
2장까지 공부하고나서 느낀건, 문과생 특성상 외우라고 해서 ㅇㅋㅇㅋ하면서 슥슥 대강 이해하면서 외우고 이런건 가능할지언정... 머릿속에 완벽하게 때려넣는건 안 된다는 것...? 공부하고 집오면 또 까먹음.. 이번주는 러프하게 모든 내용을 쭉 훑고, 책을 n번 반복해서 읽고, 또 공부하다 모를때마다 책을 참고하는 식으로 해야겠다...
 
 

Part 2. 데이터와 표본분포

*표본(sample), 모집단(population), 임의표본추출(random sampling)로 추출된 표본: 단순임의표본
추첨 후 다시 모집단에 넣기: 복원추출 <-> 비복원추출
*층화표본추출(stratified sampling): 모집단을 층으로 나눈 뒤, 각 층에서 무작위로 표본 추출
(특정 계층의 수가 적으면 가중치를 부여)
*계층(stratum): 공통된 특징을 가진 모집단의 동종 하위그룹
*표본편향(sample bias): 모집단을 잘못 대표하는 표본
*비임의(nonrandom): 아무리 랜덤이라도 어떤 표본도 완벽히 대표하는 것은 불가능하다 
 
*자기선택편향: 리뷰를 남길 때 편향 발생 -> 상황을 정확히 파악하기 위한 지표로는 어렵지만, 다른 시설과 단순 비교할 때 신뢰할 만 하다. 
*통계적 편향: 측정 과정에서 발생하는 계통적인 오차 (임의표본추출로 인한 오류와는 다르다)
 
대량의 데이터 필요할 경우? 데이터가 크고 희소할 때 ex. 검색어
실제 연관된(pertinent) 레코드의 수는 수천개 정도만 해도 효과적임 (이 경우는 임의표본추출은 도움되지 않음)
 
*선택편향(selection bias): 관측 데이터를 선택하는 방식 때문에 결국 오해의 소지가 있거나 단편적인 결론을 얻게 됨 
데이터 스누핑: 흥미로운 것을 찾아 광범위하게 데이터를 살피는 것
방대한 검색 효과: 중복 모델링이나 너무 많은 예측변수를 고려하는 모델링에서 비롯되는 편향
 
성능 검증하기 위해 둘이상의 홀드아웃세트 이용하거나, 목푯값 섞기(순열 검정)를 하면 된다. 
이외에 통계에서 나타나는 선택편향: 비임의표본추출, 데이터 체리 피킹(선별), 특정한 통계적 효과를 강조하는 시간 구간 선택, 흥미로운 결과가 나올 때 실험을 중단하는 것. 
 
*평균으로의 회귀(regression to the mean): 연속적으로 측정했을 때 나타나는 현상. 예외 관찰되면 그 다음엔 중간 정도 경우가 관찰되기에 예외를 너무 특별히 생각하게 되면 선택편향으로 이어질 수 있다. 
(선형회귀와 구분. 예측변수와 결과변수 사이의 선형적 관계 추정법)
 
*표본통계량: 더 큰 모집단에서 추출된 표본 데이터들로부터 얻은 측정 지표
*데이터분포: 어떤 데이터 집합에서의 각 개별값의 도수분포
*표본분포: 어떤 표본들로부터 얻은 표본통계량의 도수분포
*중심극한정리: 표본 크기가 커질수록 정규분포를 따르는 경향
중심극한정리 덕분에, 추론을 위한 표본분포의 신뢰구간이나 가설검정 계산에 t분포 사용
 
*표준오차: 여러 표본들로부터 얻은 표본 통계량의 변화
*표본의 변동성: 다른 표본 뽑으면 결과가 다를 수 있음 
-표본이 클수록 표본 통계량의 분포는 적어진다. 
 
<seabon 추출하기: import seaborn as sns>
표본 1000개 추출: income: loans.sample(1000)
5개의 평균 1000개 추출: income: [loans.sample(5).mean() for _ in range(1000)]
모두 보여줘라 results =pd.concat([_,_,_])
 
표준오차: 통계에 대한 표본분포의 변동성을 말해주는 단일 측정지표 s/√n 
표본크기 클수록, 표준오차 작음. 둘의 관계를 n제곱근의 법칙이라고 함. 
=표준오차 2배 줄이려면 표본 크기를 4배 증가시켜야 함. 
-> 매번 새 샘플 수집하기 어려우므로, 부트스트랩 사용
 

<bootstrap>

현재 있는 표본에서 추가적으로 복원추출하고, 각 표본의 통계량과 모델을 다시 계산하는 것. 
재표본추출(resampling): 관측 데이터로부터 반복해서 표본추출하는 과정. 부트스트랩과 순열과정 포함
 
<절차>
1. 샘플 하나 뽑아서 기록하고 다시 제자리에 놓는다
2. 이를 n번 반복
3. 재표본추출된 값의 평균 기록
4. 1~3을 R번 반복 (반복횟수 많을수록 추정 정확)
5. R개 결과로 표준편차 계산, 히스토그램 그리기, 신뢰구간 찾기 
 
->표본통계량 or 추정한 모델 파라미터의 부트스트랩 집합을 얻게 되고, 이 집합이 얼마나 변하는지 조사 가능

results =[]
for nrepeat in range(1000):
	sample = resample(loan_income)  #재표본추출
    results.append(sample.median())  #통계값 넣기
results = pd.series(results)
   
print(f'original:{loans_income.median()}')
print(f'bias:{results.mean()-loans_income.median()}')
print(f'std.error:{results.std()}')

 
*다변량 데이터에 적용: 각 행은 여러 변수들의 값을 포함하는 하나의 샘플을 의미. 
모델 파라미터의 안정성(변동성) 추정, 예측력 높이기 위해 부트스트랩 사용.
*배깅: 분류 및 회귀트리(의사결정트리) 사용할 때, 여러 부트스트랩 샘플로 트리를 여러개 만들고, 각 트리에서의 예측값을 평균냄
 
크기 n에 따라 표본분포가 어떻게 달라지는지 알아보기 위한 실험을 통해, 표본 크기를 결정하는 데에 부트스트랩 사용 가능
 

<신뢰구간>

*신뢰수준(confidense level): 같은 모집단으로부터 같은 방식으로 얻은, 관심 통계량을 포함할 것으로 예상되는, 신뢰구간의 백분율
* 구간끝 점(interral endpoint): 신뢰수준의 최상위, 최하위 끝점
 
(부트스트랩 신뢰구간 구하는 법)
1. 크기 n인 표본 복원추출
2. 재표본추출한 표본의 원하는 통계량 기록
3. 1~2를 R번 반복
4. x% 신뢰구간을 구하기 위해, 분포 양측에서 [(100-x)/2]% 만큼 잘라냄
5. 절단한 점들은 x% 부트스트랩 신뢰구간의 양끝점임 
 
신뢰수준 높을수록, 구간 넓다. 표본이 작을수록 구간 넓다. 
-> 추정에 대한 잠재적 오류 알려주거나, 더 큰 표본이 필요한지 여부 파악
 

<정규분포>

정규화하다(standardize): 평균을 빼고, 표준편차로 나누다. 
z-score: 개별 데이터 포인트를 정규화한 결과 (정규분포=z분포)
QQ-plot: 표본분포가 특정분포에 얼마나 가까운지 보여주는 그림 (z 정수 오름차순 정렬하여 y축에 표시. x축: 정규분포에서의 해당 분위 수)
->scipy.stats.probplot 사용
 

긴꼬리분포:

꼬리- 적은 수의 극단값이 주로 존재
왜도- 한쪽 꼬리가 반대쪽보다 긴 정도
흑고니 이론: 이례적인 사건이 정규분포로 예측되는 것보다 훨씬 자주 일어날 수 있다. 
QQ plot에서 대각선과 일치하면 정규분포에 가깝다. 
 
 

T분포:

- 정규분포와 비슷하지만 꼬리 부분이 약간 더 두껍고 길다. 
- 표본 통계량의 분포 설명. 표본평균 분포는 일반적으로 t분포와 같은 모양. 표본 클수록 정규분포를 닮은 t분포 형성. 
-자유도: 다른 표본크기, 통계량, 그룹의 수에 따라 t분포를 조절하는 변수
- t분포의 정확도: 표본에 대한 통계량의 분포가 정규분포 따른다는 조건 필요로 함
(모집단이 정규분포가 아니어도, 보통 표본통계량은 정규분포 따름) = 중심극한정리
 

<이항분포>

*시행(trial): 독립된결과를 가져오는 하나의 사건
*성공: 시행에 대한 관심의 결과 =이진결과
*이항식(binomial): 두가지 결과를 갖는다. 
*이항시행: 두가지 결과를 가져오는 시행 ex.베르누이 시행
*이항분포: n번 시행에서 성공한 횟수에 대한 분포=베르누이 분포
   (확률의 합이 1이 되면 됨. 덜 나오는 결과에 1을 지정하는 게 일반적)
   -성공확률 p가 정해져 있을 때, n 중에서 성공한 횟수 x의 도수분포
   -이항분포의 평균:np. 분산:n*p(1-p). n이 크고, p가 0,1에 너무 가깝지 않은 경우, 이항분포는 정규분포로 근사할 수        있음. 
 
ex. 한번의 클릭이 판매로 이어질 확률이 0.02일 때, 200회 클릭으로 0회 매출을 관찰할 확률은 얼마인가?
stats.binom.pmf(2,n=5,p=0.1)
 

<카이제곱분포>

:범주의 수에 대해 기댓값에서 이탈하는 것이 있냐 => 귀무가설
카이제곱이 작을수록 기대분포 따르고, 카이제곱이 클수록 기대한 것과 다르다. 
*카이제곱 통계량: 검정결과가 독립성에 대한 귀무 기댓값에서 벗어난 정도를 측정 
-관측 데이터가 특정분포에 적합한정도를 나타내며, 여러 처리의 효과가 서로 다른지 여부를 결정하는 데 유용함.
-> 귀무모델에서 반복적으로 재표본추출
 

<F분포>

-여러 그룹에 걸쳐 서로 다른 처리를 테스트할 때, 연속된 관측값 처리.
그룹 평균간 차이가 정규 무작위 변동에서 예상할 수 있는 것보다 얼마나 큰지
-각 그룹 내 변동성에 대한 그룹 평균간 변동성 비율 = 분산분석(ANOVA)
F통계량의 분포 => 모든 그룹의 평균이 동일한 경우(=귀무모델) 무작위 순열 데이터에 의해 생성되는 모든 값의 빈도 분포
 
<푸아송분포>
*람다: 단위시간이나 단위 면적당 사건이 발생하는 비율
*푸아송분포: 표집된 단위 시간이나 단위 공간에서 발생한 사건의 도수분포
*지수분포: 한 사건에서 그다음 사건까지의 시간이나 거리에 대한 도수분포
*베이불 분포: 사건 발생률이 시간에 따라 변화하는,지수 분포의 일반화된 버젼
 
1. 푸아송분포
ex. 5초동안 서버에 도착한 인터넷 트래픽을 95% 확률로 완벽하게 처리하는 데 필요한 용량은 얼마일까?
핵심 파라미터: 람다 (일정 시간/공간에서 발생한 평균 사건 수)
stats.poisson.rvs(2,size=100)
ex. cs가 1분달 평균 2개면, 100분 시뮬레이션 하여 100분당 cs갯수 알려줌
 
2. 지수분포
: 사건과 사건간의 시간분포 모델링 ex. 고장이 발생하는 시간
stats.expon.rvs(scale=(1/0.2),size=100)
=주기별 평균 사건 수가 0.2인 지수분포에서 난수 100개 생성
분당 평균 0.2개 cs 걸려올 때, 100분 동안의 cs 전화시간 알 수 있음
가정: 람다가 해당 기간동안 일정하게 유지된다는 가정
 
3. 고장률 추정
-> 드물게 발생하는 사건. 20시간 후에도 아무일 안 일어나면 시간당 발생율이 1이 아니라는 것을 알 수 있음 (그 이하로 떨어지지 않을 임곗값 추산하여 구함)
 
4. 베이불 분포
:사건 발생률이 시간에 따라 지속적으로 변할 때 
B>1 이면 발생율이 시간에 따라 증가, B<1이면 감소
stats.weibull_min.rvs(1.5,scale=5000,size=100)
=1.5의 형상 파라미터, 5000개의 특성 수명, 난수가 100개
 
*부트스트랩 = 표본추정에서 잠재적 오차를 판별할 때 유용한 모든 문제에 적용 가능한 방법 
 

반응형

댓글