🍀 정리: 통계를 이용하여 데이터 기반의 의사결정을 내릴 수 있음!
-> 통계를 활용한 데이터 분석은 필수임
데이터를 요약하고 설명하는 통계 방법
평균 (Mean)
데이터의 대표값으로, 모든 데이터를 더한 후 데이터의 개수로 나누어 계산
-> 데이터의 일반적인 경향 파악에 유용
중앙값(Median)
데이터셋을 크기 순서대로 정렬했을 때 중앙에 위치한 값
-> 이상치에 영향을 덜 받기 때문에 데이터의 중심 경향을 나타내는 또 다른 방법
분산(Variance)
데이터 값들의 평균으로부터 얼마나 떨어져 있는지 나타내는 척도
(각 데이터 값에서 평균을 뺀 값을 제곱한 후, 모두 더해서 데이터 개수로 나눔)
-> 분산이 클수록 데이터가 넓게 분포, 분산이 작으면 데이터가 평균에 몰려 있음
표준편차(Standard Deviation)
데이터 값들이 평균에서 얼마나 떨어져 있는지 나타내는 척도, 분산의 제곱근을 취해서 계산
-> 분산과 데이터 분포도 사이의 관계 그대로 가짐
표준편차와 분산의 관계
분산은 데이터의 값과 평균의 차이를 제곱하여 평균을 낸 값
-> 제곱 단위
표준 편차는 분산에다가 다시 제곱근을 취함
-> 원래 데이터 단위
🍀 분산보다는 표준 편차가 데이터 단위와 동일하기 때문에 훨씬 직관적임
표본 데이터를 통해 모집단의 특성을 추정하고 가설을 검정하는 통계 방법
신뢰구간 (COnfidence Interval)
모집단의 평균이 특정 범위 내에 있을 것이라는 확률
일반적으로 95% 신뢰구간 사용 -> "모집단 평균이 95% 확률로 이 구간 내에 있음"
가설검정 (Hypothesis Testing)
모집단에 대한 가설을 검증하기 위해 사용
귀무가설(H0) : 검증하고자 하는 가설이 틀렸음을 나타내는 기본 가설 (변화가 없다, 효과가 없다 등)
대립가설(H1) : 귀무가설의 반대의 가설, 주장하는 바를 나타내는 가설(변화가 있다, 효과가 있다 등)
-> p.vaule를 통해 귀무가설을 기각할 지 여부를 결정함
기술통계 vs 추론통계 예시
- 기술통계 : 회사의 매출 데이터를 요약하기 위해 평균 매출, 매출의 표준편차 등을 계산
- 추론통계: 일부 고객의 설문조사를 통해 전체 고객의 만족도를 추정
ex) 학생들의 시험 점수에서 평균 점수, 중간 점수 계산
# 데이터 분석에서 자주 사용되는 라이브러리
import pandas as pd
# 다양한 계산을 빠르게 수행하게 돕는 라이브러리
import numpy as np
# 시각화 라이브러리
import matplotlib.pyplot as plt
# 시각화 라이브러리2
import seaborn as sns
data = [85, 90, 78, 92, 88, 76, 95, 89, 84, 91]
mean = np.mean(data)
median = np.median(data)
print(f"평균: {mean}, 중앙값: {median}")
ex) 매출 데이터의 변이를 분석하여 비즈니스의 안정성 평가
(위에 데이터 사용한다고 가정)
variance = np.var(data)
std_dev = np.std(data)
data_range = np.max(data) - np.min(data)
print(f"분산: {variance}, 표준편차: {std_dev}, 범위: {data_range}")
ex) 시험 점수의 분포를 히스토그램과 상자 그림으로 표현
plt.hist(data, bins=5)
plt.title('histogram')
plt.show()
plt.boxplot(data)
plt.title('boxplot')
plt.show()
ex) 고겍 만족도 설문에서 만족/불만족의 빈도 분석
satisfaction = ['satisfaction', 'satisfaction', 'dissatisfaction',
'satisfaction', 'dissatisfaction', 'satisfaction', 'satisfaction',
'dissatisfaction', 'satisfaction', 'dissatisfaction']
satisfaction_counts = pd.Series(satisfaction).value_counts()
satisfaction_counts.plot(kind='bar')
plt.title('satisfaction distribution')
plt.show()
ex) 공부 시간과 시험 점수 간의 상관관계 분석
study_hours = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
exam_scores = [95, 90, 85, 80, 75, 70, 65, 60, 55, 50]
correlation = np.corrcoef(study_hours, exam_scores)[0, 1]
print(f"공부 시간과 시험 점수 간의 상관계수: {correlation}")
plt.scatter(study_hours, exam_scores)
plt.show()
-> 강력한 양의 상관관계를 가짐
ex) 아이스크림 판매량과 익사 사고 수 간의 상관관계는 높지만, 인과관계는 아님
ex) 여러 마케팅 채널의 광고비와 매출 간의 관계 분석
data = {'TV': [230.1, 44.5, 17.2, 151.5, 180.8],
'Radio': [37.8, 39.3, 45.9, 41.3, 10.8],
'Newspaper': [69.2, 45.1, 69.3, 58.5, 58.4],
'Sales': [22.1, 10.4, 9.3, 18.5, 12.9]}
df = pd.DataFrame(data)
sns.pairplot(df)
plt.show()
df.corr()
# heatmap까지 그린다면
sns.heatmap(df.corr())
☑️ 전수조사
모집단 전체를 조사하는 방법. 대규모일 경우 비용과 시간이 많이 듦.
☑️ 표본조사
표본만을 조사하는 방법. 비용과 시간이 적게 들지만, 표본이 대표성을 가져야 함
- 도시 연구
한 도시의 모든 가구(모집단) 중 100가구(표본)를 조사하여 평균 전력 사용량
을 추정.- 의료 연구
특정 치료법의 효과를 알아보기 위해 전체 환자를 조사하는 대신, 표본을 통해
추정하고 이를 바탕으로 결론을 도출합니다.- 시장 조사
소비자 선호도를 파악하기 위해 모든 소비자를 조사하는 대신, 무작위로 선택된
표본을 통해 전체 시장의 트렌드를 추정합니다.- 정치 여론 조사
선거 전 여론 조사를 통해 전체 유권자의 투표 경향을 추정하여 선거 결과를 예
측합니다
ex) 국가의 모든 성인 키 데이터
import numpy as np
import matplotlib.pyplot as plt
# 모집단 생성 (예: 국가의 모든 성인의 키 데이터)
population = np.random.normal(170, 10, 1000)
# 표본 추출
sample = np.random.choice(population, 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()
-> 모집단과 표본이 비슷한 경향성을 보이는 것을 알 수 있음
코드 설명
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, 즉 스칼라 값 반환)
코드 설명
numpy.random.choice(a, size=None, replace=True, p=None)
a (1-D array-like or int): 샘플링할 원본 배열. 정수인 경우 np.arange(a) 와 동일하게 간주됩니다.
size (int 또는 tuple of ints): 출력 배열의 크기 (기본값: None, 즉 단일값 반환)
replace (boolean): 복원 추출 여부를 나타냅니다. True면 동일한 요소가 여러 번 선택될 수 있습니다 (기본값: True)
p (1-D array-like, optional): 각 요소가 선택될 확률. 배열의 합은 1
정수: 빈의 개수를 지정
리스트: 각 빈의 경계를 직접 지정 (140~150, 150~160 … 이
렇게 경계를 지정하고 싶으면 리스트로 작성)
☑️ 표본오차 (Sampling Error)
표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이
표본 크기가 클수록 표본오차는 작아짐
표본이 모집단을 완벽하게 대표하지 못하기 때문에 발생하며, 표본의 크기와 표본 추출 방법에 따라 달라질 수 있음
- 표본의 크기: 표본의 크기가 클수록 표본오차는 줄게 됨
-> 더 많은 데이터를 수집할수록 모집단을 더 잘 대표- 표본 추출 방법: 무작위 추출 방법을 사용하면 표본오차를 줄일 수 있음
-> 모든 모집단 요소가 선택될 동등한 기회를 가지게 해야 함
☑️ 신뢰구간 (Confidence Interval)
신뢰구간은 모집단의 특정 파라미터(예: 평균, 비율)에 대해 추정된 값이 포함될 것으로 기대되는 범위
신뢰구간 계산 방법
신뢰구간=표본평균±z×표준오차
여기서 z는 선택된 신뢰수준에 해당하는 z-값
ex) 95% 신뢰수준의 z-값은 1.96
일반적으로 95% 신뢰수준을 많이 사용
ex) 100명의 학생을 표본으로 추출하여 그들의 평균 수학 점수를 구하고, 이 점수의 신뢰구간을 계산
import scipy.stats as stats
sample_mean = np.mean(sample)
sample_std = np.std(sample)
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}")
<코드 설명>
scipy.stats.t.interval(alpha, df, loc=0, scale=1)
가장 대표적인 분포!
ex) 코드 예시
# 정규분포 생성
normal_dist = np.random.normal(170, 10, 1000)
# 히스토그램으로 시각화
plt.hist(normal_dist, bins=30, density=True, alpha=0.6, color='g')
# 정규분포 곡선 추가
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()
데이터가 비대칭적으로 꼬리 형태로 분포할 때 사용!
😀 일부가 전체적으로 큰 영향을 미치는 경우
ex) 코드 예시
# 긴 꼬리 분포 생성 (예: 소득 데이터)
long_tail = np.random.exponential(1, 1000)
# 히스토그램으로 시각화
plt.hist(long_tail, bins=30, density=True, alpha=0.6, color='b')
plt.title('long tail distribution histogram')
plt.show()
표본이 작을 때 정규분포 대신 사용!
자유도가 커질 수록 정규분포에 가까워짐 (여기서 자유도란 표본의 크기와 관련이 있는 값이라고 이해!)
😜 데이터가 적은 경우 사용
ex) 코드 예시
# 스튜던트 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()
독립성 검정이나 적합도 검정에 사용되는 분포!
여기서 K값은 자유도 (여기서 자유도란 표본의 크기와 관련이 있는 값이다 정도로 이해!)
👊🏻 독립성 검정이나 적합도 검정이 필요할 때
ex) 코드 예시
# 카이제곱분포 생성
chi2_dist = np.random.chisquare(df=2, size=1000)
# 히스토그램으로 시각화
plt.hist(chi2_dist, bins=30, density=True, alpha=0.6, color='m')
# 카이제곱분포 곡선 추가
x = np.linspace(0, 10, 100)
p = stats.chi2.pdf(x, df=2)
plt.plot(x, p, 'k', linewidth=2)
plt.title('카이제곱 분포 히스토그램')
plt.show()
결과가 2개가 나오는 상황일 때 사용하는 분포!
✋🏻 결과가 2개만 나오는 상황을 여러번 하는 경우
ex) 코드 예시
# 이항분포 생성 (예: 동전 던지기 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('이항 분포 히스토그램')
plt.show()
희귀한 사건이 발생할 때 사용하는 분포!
🌝 특정 공간이나 특정 시간에 사건이 발생하는 경우
ex) 코드 예시
import numpy as np
import matplotlib.pyplot as plt
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()
세상 많은 분포들이 존재하지만,,, 위에 설명한 분포들이 대표적인 데이터 분석에 필요한 분포들!
☑️ 데이터 수가 충분하다 → (무조건) 정규분포
☑️ 데이터 수가 작다 → 스튜던트 t 분포
☑️ 일부 데이터가 전체적으로 큰 영향을 미친다 → 롱 테일 분포 (파레토 분포)
☑️ 범주형 데이터의 독립성 검정이나 적합도 검정 → 카이 제곱 분포
☑️ 결과가 두 개(성공 or 실패)만 나오는 상황 → 이항 분포
☑️ 특정 시간, 공간에서 발생하는 사건 → 푸아송 분포