내용이 길어져서
https://justdata.tistory.com/45
TIL_24.08.05_데이터 분석과 통계
데이터 분석과 통계데이터를 분석하고 이를 바탕으로 결정을 내릴 수 있다.데이터를 요약하고 패턴을 발견할 수 있다.추론을 통해 결론을 도출하는 과정을 돕는다.데이터 기반의 의사결정을 내
justdata.tistory.com
위에 글에 이어서 나눠서 글을 작성했다.
2.1 모집단과 표본
모집단
- 관심의 대상이 되는 전체 집단
표본
- 모집단에서 추출한 일부
왜 표본을 사용하는 걸까?
- 비용과 시간을 절약
- 전체 모집단을 조사하는 것은 불가능하거나 비효율적이다, 표본 조사는 이러한 자원을 절약하면서도 유의미한 결과를 도출할 수 있는 방법
- 접근성
- 모든 데이터를 수집하는 것이 물리적으로 불가능한 경우가 많다.
- 표본의 대표성
- 잘 설계된 표본은 모집단의 특성을 반영할 수 있다.
- 데이터 관리
- 데이터처리와 분석이 훨씬 용이
- 작은 표본에서는 데이터 품질을 더 쉽게 관리하고, 오류나 이상값을 식별하여 수정할 수 있다.
- 모델 검증 용이
- 표본 데이터를 사용하여 통계적 모델을 검증할 수 있다. 모델이 표본 데이터에 잘 맞는다면, 모집단에도 잘 맞을 가능성이 높다.
모집단 생성 및 표본 추출
import numpy as np
import matplotlib.pyplot as plt
# 모집단 생성
population = np.random.normal(170, 10, 1000)
# 170은 평균, 편차 10, 1000개의 데이터
# 표본 추출
sample = np.random.choice(population, 100)
# 100개의 샘플데이터를 뽑아내겠다.
plt.hist(population, bins=50, alpha=0.5, label='population', color='blue')
plt.hist(sample, bins=50, alpha=0.5, label='sample', color='red')
plt.legend()
plt.title('population and sample distribution')
plt.show()
난수 : 정의된 범위 내에서 무작위로 추출된 수
np.random 다양한 확률 분포에 따라 난수를 생성하는 기능
np.random.normal 함수는 정규분포(가우시안 분포)를 따르는 난수를 생성
정규분포는 평균과 표준편차를 중심으로 데이터가 대칭적으로 분포하는 분포이다.
numpy.random.normal(loc = 0.0, scale=1.0, size = None)
- loc(float) : 정규분포의 평균(기본값:0.0)
- scale(float) : 정규분포의 표준편차(기본값:1.0)
- size(int 또는 tuple of ints): 출력 배열의크기 (기본값: None, 즉 스칼라 값 반환), 즉 데이터의 개수
np.random.choice
- 주어진 배열에서 임의로 샘플링하여 요소를 선택
np.random.choice(a, size = None, replace=True, p=None)
- a : 샘플링할 원본 배열, 정수인 경우 np.arange(a)와 동일하게 간주
- size : 출력 배열의 크기 (기본값 : None, 즉 단일값 반환)
- replace (boolean) : 복원 추출 여부를 나타냄, True면 동일한 요소가 여러 번 선택될 수 있다.(기본값 : True)
- p : 각 요소가 선택될 확률. 배열의 합은 1이어야 한다.
plt.hist
- alpha : 히스토그램 막대의 투명도를 지정 0(투명)에서 1(불투명) 사이의
- label : 범례 지정
표본오차(sampling Error)
표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이
표본 크기가 클수록 표본오차는 작아짐
표본의 크기와 표분 추출 방법에 따라 달라짐
- 표본의 크기 : 표본의 크기가 클수록 표본오차는 줄어든다. 더 많은 데이터를 수집할수록 모집단을 더 잘 대표하게 된다.
- 표본 추출 방법 : 무작위 추출 방법을 사용하면 표본오차를 줄일 수 있다. 모든 모집단 요소가 선택될 동등한 기회를 가지게 해야 한다.
신뢰구간(Confidence interval)
모집단의 특정 파라미터(예 : 평균,비율)에 대해 추정된 값이 포함될 것으로 기대되는 범위를 나타낸다.
신뢰구간 계산 방법
- 신뢰구간 = 표본평균± z x 표준오차
- 여기서 z는 선택된 신뢰수준에 해당하는 z- 값이다. 예를 들어, 95% 신뢰 수준의 z-값은 1.96이다.
- 일반적으로 95% 신뢰수준을 많이 사용
import scipy.stats as stats
# 표본 평균과 표본 표준편차 계산
sample_mean = np.mean(sample)
sample_std = np.std(sample)
# 95% 신뢰구간 계산
conf_interval = stats.t.interval(0.95, len(sample)-1, loc= sample_mean, scale = sample_std/np.sqrt(len(sample)) )
print(f"표본 평균 : {sample_mean}")
print(f"95% 신뢰구간 : {conf_interval}")
# 95% 신뢰도를 가지고 신뢰구간 안에 모집단 평균이 들어가야 한다.
# 표본 평균 : 171.67
# 95% 신뢰구간 : (169.81, 173.53)
scipy.stats.t.interval 함수
- 주어진 신뢰 수준에서 t-분포(student t 분포)를 사용하여 신뢰구간을 계산하는데 사용
- stats.t.interval(alpha, df, loc = 0, scale = 1)
- alpha : 신뢰수준, 예를 들어 95% 신뢰 구간을 원하면 alpha를 0.95로 설정
- df : 자유도(degrees of freedom)를 나타냄, 일반적으로 표본크기에서 1을 뺀 값으로 설정
- loc : 위치로, 일반적으로 표본 평균을 설정
- scale : 일반적으로 표본 표준 오차를 설정, 표본 표준 오차는 표본 표준편차를 표본크기의 제곱근으로 나눈 값
정규분포
평균이 0, 분산이 1인 형태를 표준 정규 분포라 한다.
종모양의 대칭 분포, 데이터 평균 주위에 몰려 있는 분포
평균에서 멀어질수록 데이터의 빈도가 감소
표준 편차는 분포의 퍼짐 정도를 나타냄
핵심적인 특징은 대부분의 데이터가 평균 주변에 몰려 있으며, 평균에서 멀어질수록 빈도가 줄어든다.
# 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)
#히스토그램으로 시각화
plt.hist(normal_dist, bins=30,density = True,alpha=0.6, color='g')
# density = True 이면 y축이 상대도수값이 된다. False 면 데이터의수로 그래프를 그린다.
# 상대도수는 전체 도수에 대한 각 계급(구간)내 도수 비율
# 각 구간별 비교를 쉽게 하기 위하여 백분로 나타냄
# 상대도수의 전체 합은 1
# 정규분포 곡선 추가
xmin, xmax = plt.xlim()
x = np.linspace(xmin, xmax, 100)
p = stats.norm.pdf(x, 170, 10)
plt.plot(x, p, 'k', linewidth=2)
plt.title('normal distribution histogram')
plt.show()
긴 꼬리 분포
대부분의 데이터가 분포의 한쪽 끝에 몰려있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포
정규분포와 달리 대칭적이지 않고 비대칭적
특정한 하나의 분포를 의미하지 않으며 여러 종류의 분포(예: 파레토 분포(경제학에서 많이 사용), 지프의 법칙, 멱함수)를 포함할 수 있다.
특징 : 소득 분포, 웹사이트 방문자 수 등에서 관찰 됨(소수가 엄청난 영향을 발휘하는 분포)
데이터가 아무리 많아져도 정규분포가 될 수 없다.
# 긴 꼬리 분포 생성(예 : 소득 데이터)
long_tail = np.random.exponential(1,1000)
# exponential은 np.random 모듈에서 지수분포로부터 얻은 임의의 샘플을 반환
# 지수분포 : 사건이 발생하기 까지의 경과시간에 대한 연속확률 분포
# 사건이 일어나고 다음 사건이 일어나기까지 걸리는 시간을 나타내는 분포
# 히스토그램으로 시각화
plt.hist(long_tail, bins=30, density=True, alpha=0.6, color='b')
plt.title('long tail distribution histogram')
plt.show()
스튜던트 t 분포
표본이 작을 때, 정규분포 대신 사용!
자유도가 커질 수록 정규분포에 가까워짐(여기서 자유도랑 표본의 크기와 관련이 있는 값이라고 이해!)
- degree of freedom(자유도) = 표본의 크기(샘플데이터개수) -1
모집단의 표준편차를 알 수 없고, 표본의 크기가 작은 경우(일반적으로 30개 미만)에 사용되는 분포
정규분포와 유사하지만, 표본의 크기가 작을수록 꼬리가 두꺼워지는 특징
핵심특징 : 표본의 크기가 커지면 정규 분포에 가까워진다.
#스튜던트 t 분포 생성
t_dist = np.random.standard_t(df=10, size=1000)
# 히스토그램으로 시각화
plt.hist(t_dist, bins=30, density=True, alpha=0.6, color='r')
# 스튜던트 t 분포 곡선 추가
x = np.linspace(-4, 4, 100)
p = stats.t.pdf(x, df=10)
plt.plot(x, p, 'k', linewidth=2)
plt.title('student t distribution histogram')
plt.show()
카이제곱분포
범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포
특징:
- 자유도에 따라 모양이 달라짐
- 상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 '완벽하게 서로 다른 질적 자료'일때 활용 ( ex) 성별이나 나이에 따른 선거 후보 지지율)
- 범주형 데이터 분석에 사용
- 자유도가 높아질수록 정규분포에 가까워진다.
- 왜냐하면 자유도가 높아진다는 것은 데이터의 크기가 커진다는 것
독립성 검정이나 적합도 검정이 필요할 때
- 예를 들어, 성별과 직업 선택간의 독립성을 검토
- 혹은, 성별이 후보 지지율에 영향을 끼치는지? 검토할 수도 있다.
적합도 검정
- 관측한 값들이 특정 분포에 해당하는지? 검정할 때 사용
- 예를 들어, 주사위의 각 면이 동일한 확률로 나오는지 검토
- 노란색 완두와 녹색완두가 3:1 비율로 나와야 하는데 실험적으로 측정한 데이터가 그렇게 나오는지?
#카이제곱분포 생성
chi2_dist = np.random.chisquare(df=2, size=1000)
# 히스토그램으로 시각화
plt.hist(chi2_dist, bins=30, density=True, alpha=0.6, color='y')
# 카이제곱분포 곡선 추가
x = np.linspace(0,10,100)
p = stats.chi2.pdf(x, df=2)
plt.plot(x, p, 'k', linewidth=2)
plt.title('chi2 distribution histogram')
plt.show()
이항분포
결과가 두개가 나오는 상황일 때 사용하는 분포!
연속된 값을 가지지 않아 이산형 분포에 해당
이항분포도 데이터의 개수가 많아질 수록 정규 분포에 가까워진다.
성공/실패와 같은 두 가지 결과를 가지는 실험을 여러 번 반복했을 때 성공 횟수의 분포
독립적인 시행이 n번 반복되고, 각 시행에서 성공과 실패 중 하나의 결과만 가능한 경우를 모델링하는 분포
성공확률을 p라 할 때, 성공의 횟수를 확률적으로 나타낸다.
핵심은 실험횟수(n)와 성공 확률(p)로 정의됨
결과가 2개만 나오는 상황을 여러번 하는 경우
- 동전을 10번 던졌을 때, 앞면이 나오는 횟수는 이항 분포를 따른다.
- 품질관리 : 제조업체가 제품의 불량들을 모니터링할 때, 무작위로 선택된 100개의 제품 중 불량품의 수는 이항분포를 따른다
# 이항분포 생성(예 : 동전 던지기 10번 중 앞면이 나오는 횟수)
binom_dist = np.random.binomial(n=10, p = 0.5, size = 1000)
# 히스토그램으로 시각화
plt.hist(binom_dist, bins = 10, density = True, alpha = 0.6, color = 'y')
plt.title('binomial distribution histogram')
plt.show()
푸아송 분포
평균 발생률 ⋋ (람다) = 발생률
평균 발생률 ⋋(람다)가 충분히 크다면 정규분포에 근사
평균 발생률이란 주어진 시간이나 공간에서 사건이 몇 번 발생했는지?
이항분포처럼 연속된 값을 가지지 않기 때문에 이 분포도 역시 이산형 분포에 해당
단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링할 때 사용하는 분포
특정 공간이나 특정 시간에 사건이 발생하는 경우
- 콜센터 : 특정 시간동안 콜센터에 도착하는 전화 통화의 수
- 교통사고 : 특정 도로 구간에서 일정 기간 동안 발생하는 교통사고의 수
- 문자메시지 : 특정시간 동안 수신되는 문자 메시지의수
- 웹사이트 트래픽: 특정 시간 동안 웹사이트에 도착하는 방문자의 수
from scipy.stats import poisson
# 푸아송 분포 파라미터 설정
lambda_value = 4 # 평균 발생률
x = np.arange(0, 15) # 사건 발생 횟수 범위
# 푸아송 분포 확률 질량 함수 계산
poisson_pmf = poisson.pmf(x, lambda_value)
# 그래프로 그리기
plt.figure(figsize=(10,6))
plt.bar(x, poisson_pmf, alpha=0.6, color='b', label = f'Poisson PMF(lambda = {lambda_value})')
plt.xlabel('Number of Events')
plt.ylabel('Probability')
plt.title('Poisson Distribution')
plt.legend()
plt.grid(True)
plt.show()
'데이터분석 study > 통계학 기초' 카테고리의 다른 글
TIL_24.08.07_ 가설검정의 주의점 (0) | 2024.08.07 |
---|---|
TIL_24.08.07_상관계수 (0) | 2024.08.07 |
TIL_24.08.06_회귀 (0) | 2024.08.06 |
TIL_24.08.06_ 유의성 검정 (0) | 2024.08.06 |
TIL_24.08.05_데이터 분석과 통계 (0) | 2024.08.05 |