통계학 기초 완강이다-!
(배속으로 들었지만...ㅎ)
1주차 데이터 분석과 통계
[수업목표]
- 데이터 분석에 있어서 통계가 중요한 이유
- 기술통계와 추론통계에 대한 개념과 차이점
- 통계분석 방범의 다양한 종류
[목차]
- 데이터 분석에 있어서 통계가 중요한 이유
- 기술통계와 추론통계
- 다양한 분석 방법
1. 데이터 분석에 있어서 통계가 중요한 이유
- 데이터를 이해하고 해석하는 데 중요한 역할을 함
- 데이터를 요약하고 패턴을 발견할 수 있음
- 추론을 통해 결론을 도출하는 과정을 도움
- 데이터 기반의 의사결정을 내릴 수 있음
2. 기술 통계와 추론 통계
[기술통계]
- 데이터를 요약하고 설명하는 통계 방법
- 주로 평균, 중앙값, 분산, 표준편차 등을 사용
- 데이터를 특정 대표값으로 요약
평균(Mean):
평균은 모든 데이터를 더한 후, 데이터의 개수로 나누어 계산
ex) 다섯 명의 학생이 받은 시험 점수가 70, 80, 90, 100, 60이라면, 평균은 (70 + 80 + 90 + 100 + 60) / 5 = 80
중앙값(Median):
중앙값은 데이터 셋을 크기 순서대로 정렬했을 때 중앙에 위치한 값
ex) 시험 점수가 60, 70, 80, 90, 100일 때, 중앙값은 80 / 짝수 개수라면, 중앙에 있는 두 값의 평균을 중앙값
분산(Variance):
데이터 값들이 평균으로부터 얼마나 떨어져 있는지를 나타내는 척도, 데이터의 흩어짐 정도
분산이 크면 데이터가 넓게 퍼져 있고, 작으면 데이터가 평균에 가깝게 모여 있음
각 데이터 값에서 평균을 뺀 값을 제곱한 후, 이를 모두 더하고 데이터의 개수로 나누는 것
ex) 네 명의 학생이 받은 시험 점수가 70, 80, 90, 100이라면, 평균은 (70 + 80 + 90 + 100) / 4 = 85,
분산 = (225 + 25 + 25 + 225) / 4 = 125
표준편차(Standard Deviation):
데이터 값들이 평균에서 얼마나 떨어져 있는지를 나타내는 통계적 척도, 분산의 제곱근
표준편차가 크면 데이터가 평균으로부터 더 넓게 퍼져 있음을 의미
ex) 분산이 125라면, 표준편차는 분산에 루트를 씌워 약 11.18
[추론통계]
- 표본 데이터를 통해 모집단의 특성을 추정하고 가설을 검정하는 통계방법
- 주로 신뢰구간, 가설검정 등을 사용
- 데이터의 일부를 가지고 데이터의 전체를 추정
신뢰구간(Confidence Interval):
모집단의 평균이 특정 범위 내에 있을 것이라는 확률
일반적으로 95% 신뢰구간이 사용되며, 이는 모집단 평균이 95%의 확률로 이 구간 내에 있음을 의미
ex) 어떤 설문조사에서 평균 만족도가 75점이고, 신뢰구간이 70점에서 80점이라면, 우리는 95% 확률로 실제 평균 만족도가 이 범위 내에 있다
가설검정(Hypothesis Testing):
모집단에 대한 가설을 검증하기 위해 사용
귀무가설(H0)-검증하고자 하는 가설이 틀렸음을 나타내는 기본가설(변화가 없다, 효과가 없다)이고,
대립가설(H1)-그 반대 가설로 주장하는 바를 나타냄(변화가 있다, 효과가 있다)
ex) , 새로운 교육 프로그램이 학생들의 성적에 영향을 미치는지 알고 싶다면, 귀무가설은 "프로그램이 성적에 영향을 미치지 않는다"이고, 대립가설은 "프로그램이 성적에 영향을 미친다"
3. 다양한 분석 방법
1) 위치추정
- 평균, 중앙값이 대표적인 위치 추정 방법!
# 데이터 분석에서 자주 사용되는 라이브러리
import pandas as pd
# 다양한 계산을 빠르게 수행하게 돕는 라이브러리
import numpy as np
# 시각화 라이브러리
import matplotlib.pyplot as plt
# 시각화 라이브러리2
import seaborn as sns
# 이 data는 아래에서도 계속 사용
data = [85, 90, 78, 92, 88, 76, 95, 89, 84, 91]
mean = np.mean(data)
median = np.median(data)
print(f"평균: {mean}, 중앙값: {median}")
2) 변이추정
- 분산, 표준편차, 범위 등을 사용
variance = np.var(data)
std_dev = np.std(data)
data_range = np.max(data) - np.min(data)
print(f"분산: {variance}, 표준편차: {std_dev}, 범위: {data_range}")
3) 데이터 분포 탐색
- 대표적인 방법은 히스토그램, Box plot
plt.hist(data, bins=5)
plt.title('histogram')
plt.show()
plt.boxplot(data)
plt.title('boxplot')
plt.show()
4) 이진 데이터와 범주 데이터 탐색
- 이진 데이터: 기본 단위가 2개의 상태만 가지는 데이터 ex) satisfaction과 dissatisfaction
- 범주 데이터: 일정한 범주 안에서 측정된 데이터/ 쉽게 말해, 카테고리나 그룹으로 나눌 수 있는 데이터
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()
5) 상관관계( -1 ~ 1 )
- 상관관계는 두 변수 간의 관계를 측정하는 방법
- 상관계수가 -1이나 1에 가까워지면 강력한 상관관계를 가짐
- -0.5나 0.5를 가지면 중간정도의 상관관계를 가짐
- 0에 가까울 수록 상관관계가 없음
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()
6) 인과관계 VS. 상관관계
- 인과관계는 한변수가 다른 변수에 미치는 영향을 나타냄(원인, 결과가 분명해야함)
- 상관관계는 두 변수 간의 관계를 나타냄
7) 두 개 이상의 변수
- 다변량 분석은 여러 변수 간의 관계를 분석하는 방법
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())
2주차 데이터의 분포
[수업 목표]
- 모집단과 표본에 대해서 이해
- 각각의 분포에 대한 개념과 특징
- 표본오차와 신뢰구간
[목차]
- 모집단과 표본
- 표본오차와 신뢰구간
- 정규분포
- 긴 꼬리 분포
- 스튜던트 t 분포
- 카이제곱분포
- 이항분포
- 푸아송 분포
- 분포 정리하기
1. 모집단과 표본
- 모집단 : 관심의 대상이 되는 전체 집단
- 표본: 모집단에서 추출한 일부(sample)
- 전수조사: 모집단 전체를 조사
- 표본조사: 표본만을 조사
2. 표본오차와 신뢰구간
[표본오차]-Sampling Error
- 표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이
- 표본 크기가 클수록 표본오차는 작아짐
- 표본 크기와 표본 추출 방법에 따라 달라질 수 있음
[신뢰구간]-Confidence Interval
- 모집단의 특정 파라미터에 대해 추정된 값이 포함될 것으로 기대되는 범위
- 신뢰구간 계산 방법 : 신뢰구간 = 표본평균 ± z ×표준오차
- 95%신뢰구간: z값은 1.96
3. 정규분포
- 가장 대표적!
- 정규분포는 종 모양의 대칭 분포로, 대부분의 데이터가 평균 주위에 몰려 있는 분포
- 평균을 중심으로 좌우 대칭이며, 평균에서 멀어질수록 데이터의 빈도가 감소
- 표준편차는 분포의 퍼짐 정도를 나타냄
# 정규분포 생성
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()
4. 긴 꼬리 분포
- 데이터가 비대칭적으로 꼬리 형태로 분포할 때 사용
- 대부분의 데이터가 분포의 한쪽 끝에 몰려있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포
- 대칭적이지 않고 비대칭
# 긴 꼬리 분포 생성 (예: 소득 데이터)
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()
5. 스튜던트 t분포
- t분포는 모집단의 표준편차를 알 수 없고, 표본의 크기가 작은 경우에 사용(일반적으로 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()
6. 카이제곱분포
- 범주형 데이터의 독립성 검정이나 적합도 검정에 사용
- 자유도에 따라 모양이 달라짐, 상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 완벽하게 서로 다른 질적 자료일때 활
# 카이제곱분포 생성
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()
7. 이항분포
- 연속된 값을 가지지 않고, 특정한 정수 값만을 가짐
- 이산형분포라고 지칭하기도 함
- 실험횟수(n)와 성공 확률(p)로 정의됨
# 이항분포 생성 (예: 동전 던지기 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()
8. 푸아송 분포
- 희귀한 사건이 발생할 때 사용하는 분포
- 이항 분포처럼 연속된 값을 가지지 않기 때문에 이 분포도 이산형 분포에 해당
- 평균 발생률 (λ) 이 충분히 크다면 정규분포에 근사
- 단위 시간 또는 단위 면적 당 발생하는 사건의 수를 모델링
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()
9. 정리
'QCQA_1기' 카테고리의 다른 글
TIL_6W1D_머신러닝 기초(1) (0) | 2025.01.20 |
---|---|
TIL_5W5D_통계학 기초 정리(3-6주차) (0) | 2025.01.20 |
TIL_5W2D_첫번째 프로젝트 시작과 끝 (0) | 2025.01.15 |
TIL_5W1D_지금까지 푼 데일리 루틴 정리(알고리즘_프로그래머스) (0) | 2025.01.13 |
TIL_4W4D~4W5D_프로젝트, 아티클 스터디 (0) | 2025.01.10 |