티스토리 뷰

통계학 기초) 챕터 1: 데이터 분석과 통계

통계를 알면 데이터 기반의 의사결정을 내릴 수 있다! 통계를 모르는 데이터 분석가는 없다!

1-2. 기술통계와 추론통계

통계의 양대산맥! 기술통계 vs 추론통계

 

1) 기술통계 : 데이터를 요약하고 설명하는 통계 방법

  • 평균, 중앙값, 분산, 표준편차 등
  • 데이터를 특정 대표 값으로 요약
  • 통계라고 했을 때 바로 생각나는 수치들
  • 이상치가 존재할 수 있다는 것을 명심하기!

평균과 중앙값
분산과 표준편차

분산은 데이터 값과 평균의 차이를 제곱하여 평균을 낸 값이기 때문에 제곱 단위로 표현되지만,
표준편차는 다시 제곱근을 취하여 원래 데이터 값과 동일한 단위로 변환한다

→ 표준편차가 분산에 비해 훨씬 직관적이다!

2) 추론통계 : 표본 데이터를 통해 모집단의 특성을 추정하고 가설을 검정하는 통계 방법

  • 신뢰구간, 가설검정 등을 사용
  • 데이터의 일부로 전체를 추정!
  • 추론이 어렵지만 결과는 강력할 수 있다!

- 신뢰구간: 모집단의 평균이 특정 범위 내에 있을 것이라는 확률(주로 95%, 99% 사용)

신뢰구간

- 가설검정: 모집단에 대한 가설을 검증하기 위해 사용

  • 귀무가설(H0): 검증하고자 하는 가설이 틀렸음을 나타내는 기본 가설(변화가 없다, 효과가 없다 등)
  • 대립가설(H1): 귀무가설의 반대 가설로 주장하는 바를 나타냄(변화가 있다, 효과가 있다 등)
  • p-value를 사용해 귀무가설을 기각할지 여부 결정! (p-value는 보통 0.05 사용)
가설이 맞다는 것을 검정하려면 귀무가설은 틀리고, 대립가설이 맞기를 바라야 한다!

1-3. 다양한 분석 방법

1) 위치 추정: 데이터의 중심을 확인하는 방법 (평균, 중앙값)

 

2) 변이 추정: 데이터들이 서로 얼마나 다른지 확인하는 방법 (분산, 표준편차, 범위)

범위(R) = 최대값 - 최소값

 

3) 데이터 분포 탐색: 데이터 값들이 어떻게 이루어져 있는지 확인하는 방법 (히스토그램, Box Plot)

히스토그램, Box Plot
Box Plot 설명 (한글 변환이 틀린 부분도 있으니 참고)


4) 이진 데이터와 범주 데이터 탐색: 데이터들이 서로 얼마나 다른지 확인하는 방법 (파이 그림, 막대 그래프)

  • 최빈값을 주로 사용
  • 범주형 데이터: 막대 그래프, 수치형 데이터: 히스토그램 ← 차이 기억하기!

범주 데이터 안에 이진 데이터가 있음!


5) 상관관계: 데이터들끼리 서로 관련이 있는지 확인하는 방법

  • 상관계수: 두 변수 간의 관계를 측정하는 방법
  • -1 ≤ 상관계수 ≤ 1, -1이나 1에 가까워지면 강력한 상관관계를 가진다!


correlation = np.corrcoef(study_hours, exam_scores)[0, 1]

이 한 줄에 넘파이의 핵심 개념이 숨어 있다.

여기에서 [0, 1]이 왜 필요한지 차근차근 정리해보자.


1️⃣ np.corrcoef()는 무엇을 돌려줄까?

np.corrcoef(study_hours, exam_scores)

이 함수는 상관계수 하나만 주는 게 아니라, 상관계수 행렬(2×2 매트릭스)를 반환한다!

 

예를 들어,

np.corrcoef(study_hours, exam_scores)

결과는 이런 형태야 👇

[[ 1. , -1. ], [ -1. , 1. ]]

 

이게 의미하는 건

위치 의미
[0,0] study_hours 와 study_hours 의 상관계수 (= 1)
[1,1] exam_scores 와 exam_scores 의 상관계수 (= 1)
[0,1] study_hours 와 exam_scores 의 상관계수
[1,0] exam_scores 와 study_hours 의 상관계수

 

2️⃣ 왜 [0, 1]을 쓰는 걸까?

우리는 두 변수 사이의 상관계수만 필요하니까!

[0, 1]은 첫 번째 변수(study_hours)와 두 번째 변수(exam_scores) 사이의 상관계수를 꺼내는 인덱스이므로 사용한다.
np.corrcoef()는 상관계수 하나가 아니라 행렬을 주기 때문에,
두 변수 사이 값만 꺼내려고 [0,1]을 쓰는 것!

6) 인과관계와 상관관계의 차이: 인과관계는 상관관계와는 다르게 원인, 결과가 분명해야 함!

ex) 아이스크림 판매량과 익사 사고 수 간의 상관관계는 높지만, 인과관계는 아님

     (여름이라는 원인이 있고 각각의 결과가 나오는 것이기 때문에 상관관계는 있을 수 있으나 인과관계는 X) 


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()

pairplot, heatmap


Q1. 데이터 분석에서 통계가 중요한 이유는 무엇인가요? 다음 보기 중에서 옳지 않은 것을 고르세요.
1) 통계는 데이터를 이해하고 해석하는 데 도움을 준다.
2) 통계는 데이터에서 패턴을 발견하고 미래를 예측하는 도구를 제공한다.
3) 통계는 모든 데이터 분석 결과가 항상 정확하고 확실하다는 것을 보장한다.
4) 통계는 복잡한 데이터를 간단한 요약 정보로 변환할 수 있다.

 

Q2. 다음 중 기술통계(Descriptive Statistics)에 해당하는 것은 무엇인가요?
1) 모집단의 평균을 추정하는 것
2) 데이터의 중앙값을 계산하는 것
3) 표본을 통해 모집단의 특성을 추론하는 것
4) 가설을 검증하는 것

모집단이라는 말이 나오면 추론통계!

 

Q3. 다음 중 추론통계(Inferential Statistics)에 해당하는 것은 무엇인가요?
1) 데이터의 범위를 계산하는 것
2) 데이터의 분산을 계산하는 것
3) 표본을 기반으로 모집단의 평균을 추정하는 것
4) 데이터의 최빈값을 계산하는 것

 

Q4. 학생들의 수학 점수와 영어 점수가 각각 다음과 같을 때, 두 변수 간의 상관관계가 양의 상관관계인지, 음의 상관관계인지, 상관관계가 없는지 설명하고 그 이유를 얘기하세요.
수학 점수: 78, 82, 85, 88, 90, 92, 94, 96, 98, 100.
영어 점수: 70, 75, 80, 85, 85, 90, 90, 95, 95, 100.

 

→ 상관계수 = 0.99 로 수학 점수와 영어 점수 간 매우 강력한 양의 상관관계를 가진다!

 

Q5. 다음 중 인과관계(Causation)와 상관관계(Correlation)의 차이에 대한 설명으로 옳은 것은 무엇인가요?
1) 상관관계는 두 변수 간의 원인과 결과를 나타내고, 인과관계는 단순한 관계를 나타낸다.
2) 인과관계는 두 변수 간의 원인과 결과를 나타내고, 상관관계는 두 변수 간의 관계가 있지만 원인과 결과를 나타내지 않는다.
3) 상관관계와 인과관계는 동일한 개념이다.
4) 인과관계는 두 변수 간의 단순한 관계를 나타내고, 상관관계는 두 변수 간의 원인과 결과를 나타낸다.


통계학 기초) 챕터 2: 데이터의 분포

2-1. 모집단과 표본

1) 모집단(Population): 관심의 대상이 되는 전체 집단 (ex. 한 국가의 모든 성인)

2) 표본(Sample): 모집단에서 추출한 일부 (ex. 그 국가의 성인 중 일부를 조사)

출처: 위키백과

 

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, 즉 스칼라 값 반환)

population = np.random.normal(170, 10, 1000)
평균이 170이고, 표준편차가 10인 랜덤 데이터를 1000개 만들어라!
np.random.choice 함수
: 주어진 배열에서 임의로 샘플링하여 요소를 선택

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이어야 함

sample = np.random.choice(population, 100)
population 배열 중에서 100개만 랜덤으로 추출해라 (복원 추출 = 중복 가능)
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()


2-2. 표본오차와 신뢰구간

1) 표본오차: 표본에서 계산된 통계량과 모집단의 진짜 값 간의 차이

  • 표본 크기가 클수록 표본오차는 작아짐
  • 무작위 추출 방법을 사용하면 표본오차를 줄일 수 있음

2) 신뢰구간: 모집단의 특정 파라미터(ex. 평균, 비율)에 대해 추정된 값이 포함될 것으로 기대되는 범위

신뢰구간=표본평균±z×표준오차

z는 선택된 신뢰수준에 해당하는 z-값
예를 들어, 95% 신뢰수준의 z-값은 1.96

 

scipy.stats.t.interval 함수
: 주어진 신뢰 수준에서 t-분포(밑에서 얘기하는 student t 분포)를 사용하여 신뢰 구간(confidence interval)을 계산

scipy.stats.t.interval(alpha, df, loc=0, scale=1)

- alpha: 신뢰 수준(confidence level)을 의미. 예를 들어, 95% 신뢰 구간을 원하면 alpha를 0.95로 설정
- df: 자유도(degrees of freedom)를 의미. 일반적으로 표본 크기에서 1을 뺀 값으로 설정 (df = n - 1)
- loc: 위치(parameter of location)로, 일반적으로 표본 평균을 설정
- scale: 스케일(parameter of scale)로, 일반적으로 표본 표준 오차(standard error)를 설정
             표본 표준 오차는 표본 표준편차를 표본 크기의 제곱근으로 나눈 값 (scale = sample_std / sqrt(n))

conf_interval = stats.t.interval(0.95, len(sample)-1, loc=sample_mean,
                                                   scale=sample_std/np.sqrt(len(sample)))

95% 표본 신뢰구간을 구해라! 신뢰구간 안에 표본 평균이 들어와야 함!

 

2-3. 정규분포 (Normal)

: 종 모양의 대칭 분포로, 대부분의 데이터가 평균 주위에 몰려 있는 분포

  • 데이터 수가 많아질수록 정규분포에 가까워질 수 있다!

출처: 위키백과

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# 정규분포 생성
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()

 


2-4. 긴 꼬리 분포 (Long Tail Distribution) → 유일하게 정규분포랑 관련 없음

: 긴 꼬리 분포는 대부분의 데이터가 분포의 한쪽 끝에 몰려 있고, 반대쪽으로 긴 꼬리가 이어지는 형태의 분포

  • 특정한 하나의 분포를 의미하지 않으며 여러 종류의 분포(예: 파레토 분포, 지프의 법칙, 멱함수)를 포함
  • 소득 분포, 웹사이트 방문자 수, 도서 판매량(소수의 베스트셀러가 전체 판매량의 대부분을 차지) 등

긴 꼬리 분포

# 긴 꼬리 분포 생성 (예: 소득 데이터)
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()


2-5. 스튜던트 t 분포 (Student-T) → 표본이 작을 때 정규분포 대신 사용!

: 모집단의 표준편차를 알 수 없고 표본의 크기가 작은 경우(일반적으로 30미만)에 사용되는 분포

  • 정규분포와 유사하지만, 표본의 크기가 작을수록 꼬리가 두꺼워짐
  • 시험 점수 비교, 임상 시험 비교 등
자유도가 커질수록(= 표본이 커질수록) 정규분포에 가까워진다!
(일반적으로, 자유도 = 표본 크기 - 1 이니까)

출처: 위키백과

# 스튜던트 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()


2-6. 카이제곱분포 (Chi-Square) → 독립성 검정이나 적합도 검정에 사용되는 분포!

: 범주형 데이터의 독립성 검정이나 적합도 검정에 사용되는 분포

  • 상관관계나 인과관계를 판별하고자 하는 원인의 독립변수가 ‘완벽하게 서로 다른 질적 자료’일 때 활용
  • 성별이나 나이에 따른 선거 후보 지지율 등
  • 범주형 데이터 분석에 사용 

1) 독립성 검정

: 두 범주형 변수 간의 관계가 있는지 확인할 때 사용

→ 숫자형 데이터는 상관관계를 분석하면 되는데, 범주형 데이터는 상관관계 분석을 못하므로

 

2) 적합도 검정

: 관측한 값들이 특정 분포에 해당하는지? 검정할 때 사용

→ 주사위의 각 면이 동일한 확률로 나오는지 검토

t 분포와 마찬가지로, 자유도가 커질수록(= 표본이 커질수록) 정규분포에 가까워진다!
(일반적으로, 자유도 = 표본 크기 - 1 이니까)

 

k = 자유도, 출처: 위키백과

# 카이제곱분포 생성
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-7. 이항분포 (=이산형분포, Binomial) → 결과가 2개가 나오는 상황일 때 사용하는 분포!

: 성공/실패와 같은 두 가지 결과를 가지는 실험을 여러 번 반복했을 때 성공 횟수의 분포

  • 동전 던지기(앞면/뒷면), 품질 관리(합격/불합격) 등

# 이항분포 생성 (예: 동전 던지기 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()


2-8. 푸아송분포 (Poisson) → 희귀한 사건이 발생할 때 사용하는 분포!

: 평균 발생률 λ를 가진 사건이 주어진 시간 또는 공간 내에서 몇 번 발생하는지

  • 콜센터(특정 시간 동안 전화 통화 수), 교통사고(특정 도로 구간에서 일정 기간 동안 발생하는 교통사고의 수), 문자 메시지, 웹사이트 트래픽 등
λ(평균 발생률)가 무한으로 가면 정규분포를 따른다!

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()


2-9. 분포 정리하기

☑️ 데이터 수가 충분하다 → (무조건) 정규분포에 근사

☑️ 데이터 수가 작다 → 스튜던트 t 분포

☑️ 일부 데이터가 전체적으로 큰 영향을 미친다 → 롱 테일 분포 (파레토 분포)

☑️ 범주형 데이터의 독립성 검정이나 적합도 검정 → 카이 제곱 분포

☑️ 결과가 두 개(성공 or 실패)만 나오는 상황 → 이항 분포

☑️ 특정 시간, 공간에서 발생하는 사건 → 푸아송 분포


라이브 세션) 통계 이론 1일차: 기본 개념 이해

데이터의 유형

1) 수치형/양적 데이터

  • 이산형: 셀 수 있는 정수 값 (고객 수, 불량품 개수, 클릭 횟수)
  • 연속형: 측정 가능한 실수 값 (키, 몸무게, 온도, 풍속)

2) 범주형/질적 데이터

  • 명목형: 순서 없는 범주 (성별, 혈액형, 지역)
  • 순서형: 순서 있는 범주 (수능 등급, 만족도 등급, 선호도 순위)
  • 이진형: 두 개의 값 (0/1 혹은 참/거짓)만을 갖는 범주형 데이터의 특수한 경우

오늘부터 데이터 분석 입문 주차에 들어섰다.
처음으로 통계를 배우게 되었는데, VOD 강의를 먼저 듣고 라이브 세션을 들으니 훨씬 이해가 잘 되었다.

이전에 통계를 배우려고 책까지 사두었지만 이런저런 이유로 계속 미루기만 했었다.
이번 주부터는 더 이상 미루지 말고, 꼭 제대로 읽어야겠다고 다시 한 번 다짐하게 됐다.

내일부터는 실습도 함께 진행될 예정인데, 통계는 중간 과정을 한 번 놓치면 뒤까지 따라가기 어려운 만큼 더 집중해서 임해야겠다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함