데이터 분석 part

통계의 기본개념

bleufonce 2025. 2. 21. 15:40

 

통계의 기초

- 현상을 기호로 바꾸고 그다음 코드로 바꾸고...

현상을 기호로 바꾸는 도구가 통계이다. 

 

통계학은 데이터를 수집, 정리, 분석, 해석하여 의미있는 정보를 도출하는 학문.

수집 - API,CSV,SQL

정리 - Pandas / DB

분석 - 그래프 (행, 컬럼, 통계)

>>>>>>특징을 도출하여 해석가능하게 함.

 

데이터를 통해 특정 현상의 패턴을 이해하고, 이를 기반으로 예측하거나 의사결정을 지원

통계학은 기술통계, 추론통계로 구분됨.

 

 

1. 기술통계

- 데이터를 요약하고 정리하여 쉽게 이해할 수 있도록 표현하는 방법을 다룸

 

(1) 중심 경향 측정

- 데이터의 중심 값을 찾는 방법

- 대표적인 지표 : 평균, 중앙값, 최빈값

 

 # 평균 - 데이터 값들의 총합을 데이터 개수로 나눈 값. 데이터가 정규분포를 따를 때 대표적인 값이 된다.

ex) 60, 70, 80, 90, 100 데이터가 있다면 평균은 (60+70+80+90+100) ÷ 5 = 80

장점 - 전체적인 흐름을 쉽게 파악 가능

단점 - 이상치에 민감하여 왜곡될 가능성이 있음

 

# 중앙값 - 데이터를 크기순으로 정렬했을 때, 중앙에 위치하는 값

ex) 60, 70 ,80 ,90, 100 데이터가 있다면 중앙값은 중앙에 위치하는 값인 80이다.

장점 - 이상치의 영향을 받지 않음

단점 - 데이터의 전체적인 특성을 나타내기에는 부족할 수 있음

 

# 최빈값(빈번하게) - 데이터에서 가장 자주 등장하는 값

ex) 60, 70, 80, 80, 90, 100 데이터가 있다면 최빈값은 80

장점 - 범주형 데이터에서 유용하게 사용됨

단점 : 데이터에 따라 최빈값이 없거나, 여러개가 존재할 수 있음.

 

범주형 데이터란?

숫자로 연산(더하기, 빼기 등)할 수 없는 데이터.

각 값이 숫자가 아니라 "이름"이나 "분류"로 되어 있는 데이터.

숫자로 평균을 낼 수 없는 범주형 데이터에서는, 최빈값을 보면 사람들이 가장 많이 선택한 항목이 뭔지 바로 알 수 있기 때문에 유용

 

(2) 산포도 측정

- 산포도는 데이터가 얼마나 흩어져 있는지를 나타내는 개념.

- 데이터가 평균을 중심으로 얼마나 퍼져 있는지를 분석

 

# 범위

- 데이터의 최댓값과 최솟값의 차이를 의미. (Min - Max)

ex) 100(최댓값) - 60(최솟값) = 40

 

# 분산

- 데이터 값들이 평균에서 얼마나 떨어져 있는지를 나타내는 지표

- 표준편차의 제곱 

- 값이 클수록 데이터의 변동성이 크다는 것을 의미한다.

- ex) 시험 점수가 모두 비슷하게 나왔다면 분산이 작고, 점수가 크게 차이 난다면 분산이 커진다.

분산 구하는 계산식

 

분산 구하는 방법

분산을 구할 때 각 데이터가 평균과 얼마나 차이 나는지를 알기 위해 두 가지를 해야 한다.

  1. 각 데이터에서 평균을 빼고
  2. 그 값을 제곱한 후 (왜냐하면, 음수는 없애야 하니까)
  3. 그 값들을 모두 더한 후
  4. 데이터 개수로 나누는 것 (※ 모집단은 전체 개수, 표본은 한 개 적게)

 

※ 모집단 분산에서는 전체 데이터를 다 사용하니까, '데이터 개수'로 나누면 정확한 분산을 구할 수 있다.

하지만 표본 분산에서는 일부 데이터만 사용하므로, 전체 모집단의 분산을 정확하게 알 수 없기 때문에 조금 더 큰 값으로 보정할 필요가 있음. 그래서 n-1로 나눈다. ( 정확한 계산은 아니지만 가능한 한 정확하게 추정하려는 과정 : 자유도 보정)

 

 

예시)

  • 데이터: 1, 3, 5, 7
  • 평균: (1+3+5+7) / 4 = 4

분산 구하기:

 

1. 각 데이터에서 평균(4)을 뺀다:

  • 3 − 4= −1
  • 5 − 4 = 1
  • 7 − 4 = 3

2. 그 값들을 제곱 한다:

 

 

 

 

 

 

3. 그 제곱값들을 모두 더한다:

  • 9 + 1 + 1 + 9 = 20

4. 데이터 개수(4개)로 나눈다:

  • 20 / 4 = 5

결과: 분산 = 5

 

 

※ 분산은 차이의 제곱을 합한 것이고, 퍼짐 정도를 알 수 있지만 직관적으로 이해하기 어렵다.

표준편차는 분산의 제곱근으로, 퍼짐 정도를 원래 데이터 단위로 되돌려서 더 직관적으로 알 수 있도록 도와준다.

 

# 표준편차

- 분산의 제곱근을 구한 값으로, 데이터가 평균에서 얼마나 떨어져 있는지를 쉽게 해석할 수 있도록 변환한 값.

표준편차 구하는 계산식

 

 

값이 클수록 데이터가 퍼져있고, 작을수록 데이터가 평균에 가까운 값으로 모여있음을 의미.

 

분산표준편차를 구하는 이유 - 데이터를 좀 더 정확하게 이해하고, 변동성과 불확실성을 예측하기 위해서.

  • 분산은 데이터를 평균과의 차이를 구하는 데 중요한 역할
  • 표준편차는 이를 직관적이고 실제적으로 이해하기 쉽게 만들어줌.

 

# 사분위 범위 - 데이터의 1사분위(Q1)와 3사분위(Q3) 사이의 범위를 의미하며, 이상치를 판별하는 데 유용.

 

※ 사분위수는 데이터를 정렬했을 때, 전체 데이터를 4개의 같은 비율로 나누는 값들이다.

  • 1사분위수(Q1): 데이터의 하위 25% 지점, 즉 전체 데이터에서 '가장 작은 25%'에 해당하는 값.
  • 2사분위수(Q2): 중앙값, 전체 데이터를 두 개로 나누는 값. (50 %)
  • 3사분위수(Q3): 데이터의 상위 25% 지점, 즉 전체 데이터에서 '가장 큰 25%'에 해당하는 값. (75%)

 

사분위 범위(IQR)**는 Q3 - Q1으로 계산된다. 즉, 데이터의 '중간 50%'가 얼마나 퍼져 있는지를 나타내는 지표임.

 

 

※ IQR을 이용한 이상치 판별 방법

  1. IQR을 구한 후:
    • 상한값 = Q3 + 1.5 * IQR
    • 하한값 = Q1 - 1.5 * IQR
  2. 이 상한값보다 크거나, 하한값보다 작은 데이터는 이상치로 간주함.

ex)

데이터가 1, 3, 5, 7, 9, 11, 15일 때:

  1. Q1 = 3, Q3 = 11
  2. IQR = 11 - 3 = 8
  3. 상한값 = Q3 + 1.5 * IQR = 11 + 1.5 * 8 = 11 + 12 = 23
  4. 하한값 = Q1 - 1.5 * IQR = 3 - 1.5 * 8 = 3 - 12 = -9

이 값보다 크거나 작은 데이터는 이상치로 판단할 수 있다. 예를 들어, 23보다 큰 값이나 -9보다 작은 값이 있다면, 그것은 이상치로 간주된다.

 

IQR을 사용하면, 데이터의 중간 50% 범위를 알 수 있고, 이를 통해 이상치를 쉽게 찾아낼 수 있다. 평균값이나 범위(최대값과 최소값)만 보면 이상치를 정확히 찾기가 어려울 수 있지만, IQR을 쓰면 이상치를 좀 더 객관적으로 찾을 수 있다.

 

 

(3) 데이터 시각화

# 히스토그램 : 데이터의 분포를 막대 그래프로 표현

# 박스플롯 : 사분위수와 이상치를 한눈에 볼 수 있도록 정리

# 산점도 : 두 변수 간의 관계를 나타내는 그래프

 

 

 

 

2. 추론통계

- 표본 데이터를 이용하여 모집단의 특성을 추정하는 방법

(표본을 이용해 모든 데이터를 대표하는 결론을 내리는 방법)

- 일부 데이터(표본)를 분석하여 전체 데이터(모집단)를 예측 (모든 데이터를 직접 수집하기 어렵기 때문)

 

ex) 한국에 사는 사람들의 평균 키를 알고 싶다고 하자. 그런데 한국에 사는 모든 사람의 키를 측정하는 건 불가능. 그래서 무작위로 1,000명의 키를 조사(표본) 해서, 그들의 평균 키를 계산한 후, 이를 전체 한국인의 키를 추측하는 데 사용한다.

이처럼 일부 데이터를 보고 전체를 예측하는 것이 추론통계이다.

 

(1) 가설검정 

- 주어진 데이터가 특정 가설을 뒷받침하는지 여부를 판단하는 과정

- 어떤 주장이 맞는지 통계적으로 판단하는 과정

 

# 귀무가설 : "차이가 없다" 는 기본가설

# 대립가설 : "차이가 있다" 는 가설

# 유의수준

- 귀무가설과 대립가설을 구분하기 위해 씀

- ☆ p-value ☆

  • "이 결과가 우연히 나왔을 확률"을 계산
  • 보통 p-value가 0.05(5%)보다 작으면 귀무가설을 기각
  • 예: p-value = 0.03 → "우연히 나올 확률이 3%밖에 안 되므로, 이 약은 효과가 있다고 볼 수 있다."

※ 가설검정의 과정

1) 귀무가설(H₀)과 대립가설(H₁)을 설정

  • 예:
    • 귀무가설 H₀: "이 약은 체중 감량 효과가 없다"
    • 대립가설 H₁: "이 약은 체중 감량 효과가 있다"

2) 표본을 수집하고 분석

  • 다이어트 약을 100명에게 먹여서 체중 변화를 측정

3) 유의확률(p-value) 계산

  • "이 결과가 우연히 나왔을 확률"을 계산
  • 보통 p-value가 0.05(5%)보다 작으면 귀무가설을 기각
  • 예: p-value = 0.03 → "우연히 나올 확률이 3%밖에 안 되므로, 이 약은 효과가 있다고 볼 수 있다."

4) 결론 내리기

  • p-value가 0.05보다 작으면 → 귀무가설 기각 → 대립가설 채택 (즉, "이 약은 효과가 있다")
  • p-value가 0.05보다 크면 → 귀무가설 채택 (즉, "이 약은 효과가 없다")

 

(2) 신뢰구간

- 신뢰구간은 표본 데이터를 기반으로 모집단의 평균이나 비율이 포함될 범위를 추정하는 방법이다.
즉, "우리가 원하는 값이 이 범위 안에 있을 것이다."라고 예측.

 

ex) 쉽게 이해하는 신뢰구간

어떤 학교 학생들의 평균 키를 알고 싶다. 하지만 모든 학생의 키를 측정할 순 없으니, 100명의 표본을 뽑아서 평균 키를 계산했다.

  • 표본 평균 = 167cm
  • 신뢰구간 = [165cm, 169cm] (95% 신뢰수준)

이 의미는?
"우리가 조사한 100명의 평균 키가 167cm인데, 실제 전체 학생들의 평균 키는 95% 확률로 165cm ~ 169cm 사이에 있을 것이다!" 즉, 신뢰구간은 전체(모집단)의 값이 포함될 가능성이 높은 범위를 말하는 것.

 

※ 신뢰구간의 핵심 개념

신뢰구간(Confidence Interval, CI)

  • 모집단의 평균(또는 비율)이 포함될 가능성이 높은 범위
  • 예: "전체 한국인의 평균 키는 95% 확률로 165~175cm 사이에 있다"

신뢰수준(Confidence Level, CL)

  • 우리가 얼마나 확신하는지를 나타냄
  • 보통 **90%, 95%, 99%**를 사용
  • 95% 신뢰수준이면 → "100번 조사하면 95번은 이 범위 안에 있을 것이다"

표본이 많을수록 신뢰구간이 좁아짐

  • 표본이 작으면 오차가 커서 범위가 넓어짐
  • 표본이 크면 더 정확해져서 범위가 좁아짐

신뢰구간 공식

 

신뢰구간 = 표본 평균 ± (임계값 × 표준오차)

  • 표본 평균: 우리가 계산한 평균
  • 임계값(z값): 신뢰수준에 따라 달라짐 (95% → 약 1.96)
  • 표준오차(SE): 표본 데이터의 변동성

ex)
어떤 학교 학생 100명의 평균 키가 167cm, 표준편차가 5cm라고 해보자.
이때 95% 신뢰구간을 구하면?

즉, 신뢰구간 = [166cm, 168cm]
→ "이 학교 학생 전체의 평균 키는 95% 확률로 166~168cm 사이에 있다."

 

※ 신뢰구간을 왜 사용할까?

- 모집단의 값을 정확히 알 수 없기 때문

  • 모든 데이터를 조사할 수 없어서, 표본을 사용해 모집단을 추정.

- 단순한 평균보다 더 신뢰할 수 있는 정보 제공

  • "평균 키가 167cm입니다"보다 "평균 키는 95% 확률로 166~168cm 사이입니다"가 더 신뢰할만 함.

- 과학 연구, 여론 조사, 마케팅 등 다양한 분야에서 사용

  • 선거 여론 조사: "후보 A의 지지율은 45% ± 3%"
  • 의료 연구: "이 약을 먹으면 평균 체중이 2kg 감소할 가능성이 95%다"

 

(3) 회귀분석

- 두 개 이상의 변수 사이의 관계를 분석하는 방법. 어떤 변수(원인)가 다른 변수(결과)에 어떻게 영향을 주는지를 알아본다.

- 어떤 원인(X)이 결과(Y)에 어떤 영향을 주는지

- 내가 알고 싶은 것을 Y(종속변수)로 둔다.

 

# 단순 선형 회귀

가장 기본적인 형태로, 한 개의 원인(X)과 한 개의 결과(Y) 사이의 관계를 분석

 

단순선형회귀 공식

  • Y: 종속변수, 결과 변수 (시험 점수)
  • X: 독립변수, 설명변수, 원인 변수 (공부 시간)
  • a: X가 증가할 때 Y가 얼마나 변하는지 나타내는 기울기(회귀계수) (공부 시간이 늘어날 때 점수가 얼마나 오르는지)
  • b: X가 0일 때 Y의 값(절편) (공부를 0시간 했을 때 예상되는 점수. X(원인)가 0일 때 Y(결과)의 값)
  • 공부 시간이 늘어나면 점수가 증가하는 직선이 만들어짐.

# 다중 선형 회귀

- 여러개의 독립변수가 종속변수에 영향을 미치는지 분석.

- 원인(X)이 여러 개일 때 사용하는 회귀분석

- ex)

시험 점수는 공부 시간(X1)뿐만 아니라 수면 시간(X2), 학원 다니는 여부(X3) 등 여러 가지 요인에 영향을 받을 수 있음.

시험 점수(Y) = 공부 시간(X1) + 수면 시간(X2) + 학원 여부(X3) …

이렇게 여러 개의 원인(X)이 있을 때는 단순한 직선이 아니라 '입체적인 면(평면, 다차원 그래프)'으로 나타남.

  • X1: 공부 시간
  • X2: 수면 시간
  • X3: 학원 여부 (다니면 1, 안 다니면 0)
  • a1, a2, a3: 각각의 원인이 결과(Y)에 미치는 영향력
  • b: 절편 ( X(원인)가 0일 때 Y(결과)의 값,  아무런 영향도 없을 때 기본적으로 나타나는 값. 수식적으로 Y 값이 어디서 시작하는지를 의미, 절편 b모든 X 값이 0일 때 Y 값을 의미.)

* 상관관계 (상관계수 값은 -1에서 1 사이)

- 양의 상관관계

X가 증가할수록 Y도 증가하는 긍정적 관계. 그래프가 오른쪽 위로 올라감.

(1에 가까울수록 강한 양의 상관관계)

- 음의 상관관계

X가 증가할수록 Y는 감소하는 부정적인 관계. 그래프가 오른쪽 아래로 내려감.

(-1에 가까울수록 강한 음의 상관관계)

※ 0에 가까울수록 상관관계가 없음.

 

 

예제 1 : A/B 테스트 (T-검정 활용)

- 두 그룹의 평균이 서로 유의미하게 다른지 확인하는 통계 방법이다. 이 두 그룹은 정말 차이가 있는 건지, 아니면 우연일지.

- T-검정을 하면 '우연이 아닐 확률'을 계산할 수 있음.

 

# 독립표본 T-검정 (두 그룹 비교)

- 두 개의 서로 다른 그룹을 비교할 때 사용.

  • 남학생 vs 여학생 평균 키 차이
  • 신약을 먹은 그룹 vs 안 먹은 그룹 혈압 차이
  • 광고 A vs 광고 B의 매출 차이

- T-검정을 하면 p-value(유의확률) 값이 나옴.

  • p-value < 0.05 → 유의미한 차이가 있다. (그룹 차이가 우연이 아닐 확률이 높음)
  • p-value ≥ 0.05 → 차이가 별로 없는듯하다. (우연일 가능성이 큼)

예제1 시나리오

  • 이메일 마케팅 캠페인에서 제목을 다르게 설정하여 두 그룹(A/B)으로 테스트함.
  • A 그룹(기존 제목)과 B 그룹(새로운 제목)에서 이메일을 연 클릭률(CTR)을 비교하여 어떤 제목이 더 효과적인지 확인.

코드 (독립표본 T-검정)

# numpy와 scipy.stats 라이브러리를 불러와서 수학적 계산과 T-검정 함수를 사용 가능하게 함.
import numpy as np
from scipy import stats


# A/B 테스트 데이터 (CTR %)
# A 그룹과 B 그룹의 CTR 데이터를 리스트로 저장함.
group_A = [12, 15, 14, 10, 16, 14, 13, 15]  # 기존 제목
group_B = [18, 21, 19, 22, 20, 23, 21, 22]  # 새로운 제목


# 독립표본 T-검정 수행
# ttest_ind() 함수는 독립된 두 그룹의 평균을 비교하는 T-검정을 실행.
# t_stat → T-검정 통계량 (두 그룹의 차이를 숫자로 표현한 값)
# p_value → p-값 (두 그룹이 우연히 차이가 날 확률)
t_stat, p_value = stats.ttest_ind(group_A, group_B)


# t_stat와 p_value 값을 출력해서 두 그룹이 유의미하게 다른지 확인
print(f"T-검정 통계량: {t_stat}")
print(f"P-값: {p_value}")


# p-value < 0.05 → 두 그룹이 정말 다르다. 즉, B 제목이 A 제목보다 CTR이 높다는 것이 통계적으로 유의미하다.
# p-value ≥ 0.05 → 두 그룹 차이는 그냥 우연일 가능성이 높음.
if p_value < 0.05:
    print("귀무가설 기각: 새로운 제목(B)이 기존 제목(A)보다 유의미하게 CTR이 높음")
else:
    print("귀무가설 채택: 두 제목 간 CTR 차이가 없음")

결과 : 

T-검정 통계량은 두 그룹 간 평균 차이가 얼마나 큰지, 그리고 그 차이가 얼마나 우연일 가능성이 적은지를 나타내는 값.
값이 음수인 이유는 B 그룹(새로운 제목)이 A 그룹(기존 제목)보다 평균이 높기 때문.
절댓값이 커질수록 두 그룹 간 차이가 크다는 의미.

즉, -7.92라는 값은 A와 B 그룹 간의 차이가 꽤 크다는 의미.

 

p-값은 '두 그룹이 우연히 차이가 났을 확률'
p-값이 아주 작은 값(여기서는 1.5496e-06, 즉 0.0000015496)이라는 건, 두 그룹 간에 차이가 우연히 발생했을 확률이 매우 낮다는 뜻.
일반적으로 p-값이 0.05보다 작으면, 두 그룹 간의 차이가 유의미하다고 판단.

 

 

예제 2: 고객 유지율 분석 (카이제곱 검정 활용)

- 카이제곱 검정범주형 데이터에서 주로 사용되며, 관찰된 값과 기대값 간의 차이를 계산해 통계적 유의미성을 판단하는 방법. 주로 적합도 검정독립성 검정에 사용.

- 카이제곱 검정은 집단(범주형 데이터) 간의 비율 차이를 비교하는 분석 방법

  • 적합도 검정 : 관찰된 데이터가 특정 이론적 분포와 얼마나 잘 맞는지 평가하는 방법.
  • 독립성 검정 : 두 범주형 변수 간에 상관관계가 있는지를 확인하는 방법.

- 카이제곱 통계량은 두 개의 값, '관찰된 값(observed values)'기대값(expected values) 간의 차이를 바탕으로 계산.

 

※ 카이제곱 검정 절차:

  • 귀무가설 설정:
    • 적합도 검정: "관찰된 데이터는 기대값과 차이가 없다."
    • 독립성 검정: "두 변수는 서로 독립적이다."
  • 기대값 계산:
    • 기대값은 이론적으로 예상되는 값이나, 두 변수 간의 독립성을 가정했을 때의 예상 값.
  • 카이제곱 통계량 계산:
    • 위의 공식에 따라 계산한 후, 이 값을 자유도(df)와 유의수준(α)을 바탕으로 p-value를 계산.
  • 결과 해석:
    • p-value가 유의수준(α)보다 작으면 귀무가설을 기각하고, 두 변수 간에 유의미한 관계가 있다고 결론.
    • p-value가 유의수준(α)보다 크면 귀무가설을 채택하고, 두 변수 간에 유의미한 관계가 없다고 결론.

 

예제2 시나리오

  • 신규 고객 중 30일 후에도 서비스를 사용하는 고객과 그렇지 않은 고객을 분석.
  • 가입한 고객 중에서 지속 사용 여부가 광고 유형에 따라 차이가 있는지 검증.

코드 ( 광고 유형(A, B, C)에 따라 고객 유지율(Yes/No)이 유의미한 차이가 있는지를 확인하는 카이제곱 독립성 검정 수행)

# Numpy와 Scipy 라이브러리를 가져온다.
# numpy는 데이터를 다루는데에, scipy는 통계분석에 사용됨.
import numpy as np
import scipy.stats as stats


# 광고 유형별 고객 유지(Yes)와 이탈(No)수를 배열로 저장.(np.array 사용)
# 광고 유형별 고객 유지 여부 (예: 유지(Yes), 이탈(No))
# [유지, 이탈]
data = np.array([[200, 300],  # 광고 A
                 [250, 250],  # 광고 B
                 [150, 350]]) # 광고 C
                 
                 
#stats.chi2_contingency(data) 함수 - 카이제곱 검정(Chi-Square Test)수행 (리턴값이 4개)
# chi2: 카이제곱 검정 통계량
# p_value: p-값 (유의확률, 귀무가설 기각 여부 판단)
# _: 기대값 등 다른 결과값 (여기선 필요없어서 _로 처리)(리턴값 두개만 사용하겠다.)
# 카이제곱 검정 수행
chi2, p_value, _, _ = stats.chi2_contingency(data)


# 카이제곱 검정통계량, P_value값 출력
print(f"카이제곱 검정 통계량: {chi2}")
print(f"P-값: {p_value}")

# P_value값이 0.05보다 작은지 아닌지에 따라 귀무가설 기각 혹은 채택
if p_value < 0.05:
    print("귀무가설 기각: 광고 유형에 따라 고객 유지율이 다름")
else:
    print("귀무가설 채택: 광고 유형과 고객 유지율 간 유의미한 차이가 없음")

결과 : p-값이 8.96e-10(=0.000000000896)인데, 이 값은 매우 작은 값(0.05보다 훨씬 작음)이다.
즉, 광고 유형(A, B, C)에 따라 고객 유지율이 유의미하게 다름. (p-값 해석이 가장 중요!)

카이제곱 검정 통계량 숫자가 클수록 그룹간 차이가 크다는 뜻.

(광고 유형에 따른 유지/이탈 분포차이가 크다는 뜻)
즉, 광고 유형(A, B, C)별 고객 유지율 차이가 크다.

 

 

※ T-검정 vs. 카이제곱 검정

구분 T-검정 (t-test) 카이제곱 검정 (chi-square test)
사용 목적 두 그룹의 평균을 비교할 때 사용 두 개 이상의 범주형 데이터의 분포 차이를 비교할 때 사용 (비율 비교)
데이터 유형 연속형 데이터 (예: 점수, 클릭률, 키, 몸무게 등) 범주형 데이터 (예: "예/아니오", "성별", "구독/미구독" 등)
예제 이메일 마케팅에서 A/B 테스트를 진행하여 클릭률(%) 비교 광고 유형 A, B, C 그룹별 고객 유지율 비교
가설 설정 귀무가설: 두 그룹의 평균이 같다
대립가설: 두 그룹의 평균이 다르다
귀무가설: 범주별 비율이 같다
대립가설: 범주별 비율이 다르다
통계량 T-값 (t-statistic) 카이제곱 값 (χ²-statistic)
출력 결과 p-value가 0.05보다 작으면 → 평균 차이가 유의미함 p-value가 0.05보다 작으면 → 범주별 비율 차이가 유의미함

 

 

 

예제 3: 광고 ROI 예측 (회귀 분석 활용)

예제3 시나리오

  • 광고비 지출에 따라 웹사이트 방문자 수가 증가하는 패턴을 분석.
  • 선형 회귀 분석을 사용하여 광고비가 방문자 수에 미치는 영향을 예측.

 

코드 (광고비방문자 수간의 관계를 분석하는 단순 선형 회귀 모델을 만드는 코드. 광고비를 많이 쓰면 방문자가 얼마나 증가하는지를 예측.)

# 라이브러리 불러오기
# numpy : 숫자 데이터를 다룰 때 사용 (배열 연산)
# matplotlib.pyplot: 그래프를 그릴 때 사용
# LinearRegression: 선형 회귀 모델을 만들기 위한 라이브러리 (머신러닝)
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 광고비(ad_spend)와 방문자 수(visitors) 데이터를 배열로 저장.(np.array 사용)
# 독립변수: 광고비(ad_spend), 종속변수: 방문자수(visitors)
# reshape(-1, 1): 광고비 데이터를 2차원 배열로 변환 (기계 학습 모델에서 2차원 입력을 요구함)
# 광고비(x)와 방문자 수(y) 데이터 (단위: 만원)
ad_spend = np.array([10, 20, 30, 40, 50, 60, 70, 80]).reshape(-1, 1)
visitors = np.array([100, 200, 280, 350, 400, 500, 620, 700])

# 선형 회귀 모델 생성 및 학습
# LinearRegression(): 선형 회귀 모델을 생성
# fit(x, y): 광고비(x)와 방문자 수(y)를 학습하여 최적의 직선을 찾음
model = LinearRegression()
model.fit(ad_spend, visitors)

# 예측 수행
# predict(x): 광고비(x)를 입력하면 방문자 수(y)를 예측함
predicted_visitors = model.predict(ad_spend)

# 그래프로 시각화
# 파란 점(scatter) → 실제 데이터
# 빨간 선(plot) → 선형 회귀 모델이 예측한 값 (회귀 직선)
plt.scatter(ad_spend, visitors, color='blue', label='Actual Data')
plt.plot(ad_spend, predicted_visitors, color='red', linewidth=2, label='Regression Line')
plt.xlabel('Ad Spend (만원)')
plt.ylabel('Visitors')
plt.title('광고비와 방문자 수의 관계')
plt.legend()
plt.show()

# 회귀 계수와 절편 출력
# model.coef_: 기울기 (a값 : 광고비 증가에 따른 방문자 증가량)
# model.intercept_: 절편 (b값 : 광고비 0원일 때 예상 방문자 수)
print(f"회귀 계수 (광고비 영향): {model.coef_[0]}")
print(f"절편: {model.intercept_}")

 

fit(x, y)를 실행하면 계수값(a)와 절편(b)를 자동으로 계산해줌.

 

  • a (기울기, 회귀 계수) → 광고비가 방문자 수에 미치는 영향 (광고비 증가에 따른 방문자 증가량)

광고비가 1만원 증가할 때 방문자 수가 몇 명 증가하는지를 나타냄.

예를 들어, model.coef_ = 8.5라면, 광고비 1만원을 더 쓰면 방문자가 8.5명 증가한다는 의미.

  • b (절편, intercept) → 광고비가 0원일 때 예상 방문자 수

광고비가 0원일 때 예상 방문자 수.

예를 들어, model.intercept_ = 50이라면 광고비 없이도 50명 방문한다는 뜻.

 

결과

 

광고비(x)가 1만원 증가할 때마다 방문자 수(y)는 약 8.35명 증가하고,

광고비가 0원일 때 기본적으로 예상되는 방문자 수는 18명. 광고비와 방문자 수는 긍정적인 관계.

파란점은 실제 데이터 이고 빨간선은 선형회귀모델이 예측한 값(회귀직선)

회귀선이 실제 데이터와 거의 일치한다는 것은 모델이 데이터를 잘 설명하고 있다는 의미.

 

 

 

예제 3-1: 광고비와 매출관계분석 (회귀 분석 활용)

예제3-1 시나리오

  • 어떤 회사의 광고비가 매출에 미치는 영향을 분석하고자 한다. 아래 데이터를 사용하여 다중회귀분석을 수행하기.
SNS 광고비(만원) 검색 광고비(만원) 배너 광고비(만원) 매출(만원)
10 20 5 100
15 25 7 120
20 30 8 140
25 35 10 160
30 40 12 180

 

코드 (다중 선형 회귀를 사용하여 각 광고비(SNS, 검색, 배너)가 매출에 어떻게 영향을 미치는지를 분석하는 코드)

# numpy : 숫자 데이터를 다룰 때 사용 (배열 연산)
# LinearRegression: 선형 회귀 모델을 만들기 위한 라이브러리 (머신러닝)
import numpy as np
from sklearn.linear_model import LinearRegression

# 광고 유형별 광고비 데이터와 매출 데이터 (단위: 만원)
# 데이터를 배열로 저장.(np.array 사용)
# reshape(-1, 1): 광고비 데이터를 2차원 배열로 변환 (기계 학습 모델에서 2차원 입력을 요구함)
sns_ad = np.array([10, 15, 20, 25, 30]).reshape(-1, 1)     # SNS 광고비(만원)
search_ad = np.array([20, 25, 30, 35, 40]).reshape(-1, 1)  # 검색 광고비(만원)
banner_ad = np.array([5, 7, 8, 10, 12]).reshape(-1, 1)     # 배너 광고비(만원)
sales = np.array([100, 120, 140, 160, 180])                # 매출 (만원)

# 세가지 광고비 각각에 대해 단순 선형 회귀 학습 모델 생성
# LinearRegression()은 회귀 분석을 위한 모델
# 각 광고 유형에 대해 별도로 모델을 만들어서 학습
models = {
    "SNS 광고비": LinearRegression(),
    "검색 광고비": LinearRegression(),
    "배너 광고비": LinearRegression()
}

ads = {
    "SNS 광고비": sns_ad,       # 각 광고 유형별로 광고비 데이터를 저장한 딕셔너리
    "검색 광고비": search_ad,
    "배너 광고비": banner_ad
}

# 모델 학습
# 각 광고비에 대해 학습을 시키는 부분
coefficients = {}   # 광고 유형별 회귀 계수를 저장할 빈 딕셔너리 생성
intercepts = {}     # 광고 유형별 절편을 저장할 빈 딕셔너리 생성

# model.fit(ads[ad_type], sales)는 주어진 광고비(ads[ad_type])와 매출(sales) 데이터를 사용해서 회귀 모델을 학습시키는 부분.
# model.coef_[0]는 해당 광고비의 회귀 계수(광고비의 영향력)
# model.intercept_는 절편(광고비가 0일 때 예상되는 매출)
for ad_type, model in models.items():
    model.fit(ads[ad_type], sales)           # fit : 학습
    coefficients[ad_type] = model.coef_[0]   # 회귀 계수 : y = aX + b 에서 a값
    intercepts[ad_type] = model.intercept_   # 절편 : b값

# 광고비 설정 (여기에서 원하는 광고비를 변경할 수 있음)
# 각 광고 유형별로 예상 광고비를 설정하고, 이를 바탕으로 예측된 매출을 구할 것.
sns_budget = 40  # SNS 광고비 (만원)
search_budget = 50  # 검색 광고비 (만원)
banner_budget = 13  # 배너 광고비 (만원)

# 예측된 매출 계산
# 각 광고비가 주어진 값에 대해, 앞서 구한 회귀 계수와 절편을 사용해서 매출을 예측하는 부분.
# sns_sales, search_sales, banner_sales는 각각 SNS, 검색, 배너 광고에 대한 예측 매출액.
sns_sales = coefficients["SNS 광고비"] * sns_budget + intercepts["SNS 광고비"]
search_sales = coefficients["검색 광고비"] * search_budget + intercepts["검색 광고비"]
banner_sales = coefficients["배너 광고비"] * banner_budget + intercepts["배너 광고비"]

# 예측된 매출의 평균 계산
# 각 광고비별로 예측된 매출을 합산하여 평균값을 계산
predicted_sales = (sns_sales + search_sales + banner_sales) / 3

# 예측 결과 출력
# 광고비 설정 및 예상 평균 매출액 출력, 각 광고 유형별로 예측된 매출도 출력
print(f"광고비 설정: SNS={sns_budget}만원, 검색={search_budget}만원, 배너={banner_budget}만원")
print(f"예상 평균 매출액: {predicted_sales:.2f} 만원")

print(f"SNS 광고비 : {sns_sales}")
print(f"검색 광고비 : {search_sales}")
print(f"배너 광고비 : {banner_sales}")
  • 회귀 계수는 각 광고비가 매출에 미치는 영향을 나타냄.
    • 예를 들어, SNS 광고비가 1만원 증가하면 매출이 얼마나 증가할지 알 수 있음.
  • 절편은 광고비가 0일 때 예상되는 매출.
    • 즉, 광고비가 없더라도 기본적으로 예상되는 매출을 알려줌.
  • 각 광고 유형별 회귀 계수를 분석하면, 광고비를 조절했을 때 매출이 얼마나 변하는지 예측 가능.
  • 다중 회귀 분석을 통해 각 광고비가 매출에 미치는 영향을 확인 가능.

결과

- 각 광고 유형별 예측 매출

SNS 광고로 기대되는 매출 220만원,

검색 광고로 기대되는 매출 220만원,

배너 광고로 기대되는 매출 193.56만원

예상 평균 매출액 (220 + 220 + 193.56) / 3 = 211.19만원

 

결과적으로 SNS 광고와 검색광고는 각각 220만원의 매출을 기대할 수 있지만 배너 광고는 193.56만원으로 상대적으로 낮은 매출 예상 (즉, 배너 광고는 효과가 상대적으로 떨어질 가능성이 있음)

 

- 최적의 광고비 배분 전략

SNS 광고와 검색광고는 효과가 비슷하므로 예산을 적절히 나누는 것이 좋음

배너 광고는 효과가 낮으므로 예산을 줄이고 SNS 또는 검색광고에 집중하는 것이 매출 상승에 유리할 수 있음.

 

 

예제 4: 고객 이탈 예측 (로지스틱 회귀 활용)

- 로지스틱 회귀란?

로지스틱 회귀는 어떤 결과가 특정 범주(예/아니오, 성공/실패, 합격/불합격 등)에 속할 확률을 예측하는 분석 기법.

ex)
환자가 질병에 걸릴 가능성이 있을까?
이메일이 스팸일까, 아닐까?

이런 식으로 결과가 '참/거짓' 또는 '1/0' 같은 이진(두 가지) 값으로 분류되는 문제를 해결할 때 사용.

(광고 클릭 여부, 이메일 스팸 여부, 고객 이탈 여부 분석 등)

비교 항목 선형 회귀 로지스틱 회귀
출력값 연속적인 숫자 (예: 매출, 온도) 0~1 사이의 확률값
예측목표 숫자 예측 (회귀 문제) 특정 클래스 분류 (분류 문제)
사용예시 광고비 → 매출 예측 광고 클릭 여부 (Yes/No)

 

예제4 시나리오

  • 고객의 서비스 사용 데이터를 기반으로 이탈 가능성을 예측.
  • 로지스틱 회귀를 사용하여 고객 유지(1) 또는 이탈(0) 여부를 분석.

코드 (고객의 사용기간이 증가할수록 이탈할 확률이 어떻게 변하는지 분석하는 로지스틱 회귀 모델)

# 라이브러리 가져오기
# numpy: 숫자 데이터 배열 다룰 때 사용
# matplotlib.pyplot: 그래프 그릴 때 사용
# sklearn.linear_model.LogisticRegression: 로지스틱 회귀 모델 만들 때 사용
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression

# 고객의 사용 기간(월)과 이탈 여부(1: 유지, 0: 이탈) 데이터를 만듦
usage_period = np.array([1, 3, 5, 7, 9, 11, 13, 15]).reshape(-1, 1)
churn_status = np.array([0, 0, 0, 1, 1, 1, 1, 1])

# 로지스틱 회귀 모델 생성 및 학습
# 고객의 사용기간을 기반으로 이탈 여부를 예측하는 로지스틱 회귀 모델을 학습함
# fit(사용 기간, 이탈 여부)를 하면 머신러닝 모델이 패턴을 학습
model = LogisticRegression()            # 모델 생성
model.fit(usage_period, churn_status)   # 모델 학습

# 고객 이탈 예측 확률 계산
# 각 사용 기간별 이탈 확률을 예측함
# predict_proba() → 확률을 출력함
# [:, 1] → 이탈(1)의 확률만 가져옴
predicted_probs = model.predict_proba(usage_period)[:, 1]

# 그래프로 시각화
# 실제 데이터와 예측된 확률을 그래프로 시각화
# 파란점: 실제 데이터 (고객이 유지(0)했는지, 이탈(1)했는지)
# 빨간선: 로지스틱 회귀가 예측한 이탈 확률 곡선
plt.scatter(usage_period, churn_status, color='blue', label='Actual Data')
plt.plot(usage_period, predicted_probs, color='red', linewidth=2, label='Logistic Regression')
plt.xlabel('Usage Period (Months)')
plt.ylabel('Churn Probability')
plt.title('고객 이탈 확률 예측')
plt.legend()
plt.show()

# 로지스틱 회귀의 계수(가중치)와 절편을 출력함
# model.coef_[0][0] → 사용 기간이 이탈 확률에 미치는 영향력(기울기)
# model.intercept_[0] → 절편(기본 이탈 확률)
print(f"회귀 계수: {model.coef_[0][0]}")
print(f"절편: {model.intercept_[0]}")

 

결과

사용 기간이 길어질수록 이탈 확률이 증가하는 걸 확인할 수 있음.

 

파란 점: 실제 데이터 (고객이 유지(0)했는지, 이탈(1)했는지),

7개월 이후부터 대부분의 고객이 이탈(1) 한 걸 확인할 수 있음.

빨간 선: 로지스틱 회귀가 예측이탈 확률 곡선

 

사용 기간이 길어질수록 이탈 확률이 증가하는 S자 형태

10개월 이후부터 이탈 확률이 거의 1에 수렴대부분 이탈한다는 의미

회귀 계수(0.9618)의 의미 : 

X(사용 기간)가 1개월 증가할 때, 이탈 확률이 증가하는 정도

값이 클수록 이탈 여부에 사용 기간이 더 강한 영향을 미친다는 의미

절편(-5.7687)의 의미 :

(사용 기간)가 0일 때(즉, 고객이 서비스를 처음 사용할 때) 이탈 확률이 매우 낮음

 

결론적으로 7개월 이전까지 이탈률이 낮으므로, 이 시기에 고객을 유지할 전략을 세워야 함.

 

 

 

 

예제 5: 할인 캠페인 효과 분석 (T-검정 활용)

- T-검정 이란?

두 그룹 간 평균 차이가 통계적으로 유의미한지 검정하는 통계 기법

두 그룹의 평균 차이가 우연히 발생한 것이 아니라 실제로 의미 있는 차이인가를 확인

독립 표본 T-검정(서로 다른 두그룹 비교),

대응 표본 T-검정(같은 그룹의 처리 전후 비교),

일표본T-검정(한 그룹의 평균이 특정 값과 차이 나는지 비교)이 있음.

p-value < 0.05면 유의미한 차이가 있다고 판단!

예제5 시나리오

 

  • 특정 할인 프로모션을 받은 고객과 받지 않은 고객의 평균 구매 금액 차이를 분석.
  • 두 그룹 간 평균 차이가 유의미한지 T-검정을 수행.

 

코드 (할인 프로모션이 고객의 평균 구매 금액에 유의미한 영향을 주는지를 검정하는 독립표본 T-검정 코드)

# scipy.stats : T-검정을 할 수 있게 도와주는 라이브러리 (통계 분석을 위한 모듈)
from scipy import stats

# 할인 프로모션을 받은 그룹 (평균 구매 금액)
discount_group = [50, 55, 60, 62, 65, 70, 75, 80]
# 할인 프로모션을 받지 않은 그룹 (평균 구매 금액)
no_discount_group = [40, 45, 48, 50, 52, 55, 57, 60]

# 독립표본 T-검정 수행
# stats.ttest_ind() → 서로 독립적인 두 그룹의 평균 차이를 비교하는 T-검정 함수
# t_stat → T-검정 통계량 (두 그룹의 차이가 얼마나 큰지 나타냄)
# p_value → p-값 (유의미한 차이가 있는지 확인하는 값)
t_stat, p_value = stats.ttest_ind(discount_group, no_discount_group)

# T-검정 통계량과, P-값 출력
print(f"T-검정 통계량: {t_stat}")
print(f"P-값: {p_value}")

# p-value가 0.05보다 작은지 아닌지에 따라 유의미한 차이가 있는지 여부를 결정
if p_value < 0.05:
    print("귀무가설 기각: 할인 캠페인이 평균 구매 금액 증가에 유의미한 영향을 줌")
else:
    print("귀무가설 채택: 할인 캠페인이 평균 구매 금액에 유의미한 차이를 만들지 않음")

T-검정 통계량 (T-statistic):
이 값은 두 그룹이 얼마나 차이가 나는지 나타내는데, 3.24라는 값은 두 그룹의 평균 차이가 꽤 크다는 것. 즉, 할인 프로모션을 받은 그룹과 받지 않은 그룹이 평균적으로 다르다는 것을 보여줌.

P-값 (P-value):

P-값은 결과가 우연히 발생할 확률.

0.0059로 나왔으므로 귀무가설을 기각.

할인 프로모션이 평균 구매 금액에 유의미한 영향을 미쳤다는 결론을 낼 수 있음.

 

 

 

 

 

 

기술통계 예제

1) 데이터 생성 및 요약

import numpy as np
import pandas as pd

# 가상의 데이터 생성
data = [60, 70, 80, 80, 90, 100, 95, 85, 75, 65]

# 데이터프레임 생성
df = pd.DataFrame(data, columns=["점수"])

# 기술통계 요약
print(df.describe())  # 평균, 표준편차, 최솟값, 중앙값, 최댓값 등 출력

 

2) 중심 경향 측정

mean_value = np.mean(data)  # 평균
median_value = np.median(data)  # 중앙값
mode_value = pd.Series(data).mode().values  # 최빈값

print(f"평균: {mean_value}")
print(f"중앙값: {median_value}")
print(f"최빈값: {mode_value}")

 

3) 산포도 측정

variance_value = np.var(data, ddof=1)  # 분산 (모표본 사용)
std_dev_value = np.std(data, ddof=1)  # 표준편차
range_value = np.max(data) - np.min(data)  # 범위
iqr_value = np.percentile(data, 75) - np.percentile(data, 25)  # 사분위 범위, IQR(사분위 범위) 계산 → 데이터의 중앙 50%가 차지하는 범위를 나타냄.

print(f"분산: {variance_value}")
print(f"표준편차: {std_dev_value}")
print(f"범위: {range_value}")
#IQR (Interquartile Range, 사분위 범위)는 데이터의 중앙 50%를 나타내는 범위로, 데이터 분포의 변동성을 측정하는 데 사용
print(f"사분위 범위: {iqr_value}")

 

4) 데이터 시각화

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 5))

# 히스토그램
plt.subplot(1, 2, 1)
sns.histplot(data, bins=5, kde=True)
plt.title("히스토그램")

# 박스플롯
plt.subplot(1, 2, 2)
sns.boxplot(y=data)
plt.title("박스플롯")

plt.show()

 

 

 

추론통계 예제

1) 가설검정 (T-검정)

from scipy import stats

# 두 집단 데이터 예시
group1 = [80, 85, 88, 90, 95]  # 첫 번째 집단 데이터
group2 = [70, 75, 78, 80, 85]  # 두 번째 집단 데이터

# 독립표본 T-검정 (두 집단 평균 비교)
t_stat, p_value = stats.ttest_ind(group1, group2)

print(f"T-검정 통계량: {t_stat}")
print(f"P-값: {p_value}")

if p_value < 0.05:
    print("귀무가설 기각: 두 집단 간의 평균 차이가 통계적으로 유의미함")
else:
    print("귀무가설 채택: 두 집단 간의 평균 차이가 없음")

 

※ T-검정을 사용할 때 주의할 점

  1. 정규성 검정(Normality Test) 필요
    • T-검정은 데이터가 정규 분포를 따른다고 가정하므로, 데이터를 분석하기 전에 정규성 검정(Kolmogorov-Smirnov test, Shapiro-Wilk test 등)을 수행하는 것이 좋다.
  2. 등분산성 검정(Homogeneity of Variance) 필요
    • 두 집단의 분산이 동일한지 확인해야 한다. 분산이 다를 경우 웰치의 T-검정(Welch's T-Test)을 사용하는 것이 적절.
  3. 샘플 크기 고려
    • 샘플 크기가 작을 경우 정규성 가정을 위반할 수 있으므로 비모수 검정(예: Mann-Whitney U Test)을 고려할 수 있다.

 

2) 신뢰구간

import scipy.stats as st

# 신뢰구간 95% 계산
confidence_level = 0.95
mean = np.mean(data)
std_error = stats.sem(data)  # 표준오차
margin_of_error = std_error * st.t.ppf((1 + confidence_level) / 2, len(data) - 1)

lower_bound = mean - margin_of_error
upper_bound = mean + margin_of_error

print(f"95% 신뢰구간: ({lower_bound:.2f}, {upper_bound:.2f})")

 

3) 회귀분석

import statsmodels.api as sm

# 독립변수(광고비)와 종속변수(판매량) 예제 데이터
X = np.array([1, 2, 3, 4, 5])  # 광고비(독립변수)
Y = np.array([3, 6, 7, 8, 11])  # 판매량(종속변수)

# 상수항 추가
X = sm.add_constant(X)

# 선형 회귀 모델 학습
model = sm.OLS(Y, X).fit() # OLS라는 모델이 따로 있음.(statsmodels 라이브러리에 있는 모델)

# 회귀 분석 결과 출력
print(model.summary())

- R-squared가 중요 (1이 최대값) : 성능을 보려면 얘를 보면 된다. 회귀일 경우에 예측 정확도를 본다.

 

 

4) 상관관계 분석

# 두 변수 간의 상관계수 계산
correlation_coefficient, p_value = stats.pearsonr(X[:, 1], Y)

print(f"상관계수: {correlation_coefficient}")
print(f"P-값: {p_value}")

if p_value < 0.05:
    print("두 변수 간 상관관계가 통계적으로 유의미함")
else:
    print("두 변수 간 상관관계가 통계적으로 유의미하지 않음")

 

5) 데이터 시각화 - 산점도

plt.figure(figsize=(6, 4))
plt.scatter(X[:, 1], Y, color='blue', label='실제 데이터')
plt.plot(X[:, 1], model.predict(X), color='red', label='회귀선')
plt.xlabel("광고비")
plt.ylabel("판매량")
plt.title("광고비와 판매량의 관계")
plt.legend()
plt.show()

 

 

확률분포 예제

1) 정규분포 시뮬레이션 ☆ - 평균을 중심으로 대칭적인 종모양의 분포

# 평균이 0, 표준편차가 1인 정규분포 데이터 생성
# np는 numpy
# random → 랜덤데이터
# (0, 1, 1000)은 순서대로 (평균, 표준편차, 데이터 개수)
normal_data = np.random.normal(0, 1, 1000)

# 히스토그램 그리기
sns.histplot(normal_data, bins=30, kde=True) # bin는 막대기 개수
plt.title("정규분포")
plt.show()

 

2) 이항분포 시뮬레이션 - 두가지 결과 (성공/실패)로 구성된 실험에서 성공 횟수를 나타내는 분포

# 성공 확률이 0.5인 베르누이 시행을 100번 반복
binomial_data = np.random.binomial(n=10, p=0.5, size=1000)

# 히스토그램 그리기
sns.histplot(binomial_data, bins=10, kde=False)
plt.title("이항분포")
plt.show()

 

3) 포아송 분포 시뮬레이션 - 일정한 시간동안 특정 사건이 발생하는 횟수를 모델링하는 분포

# 평균 발생 횟수가 3인 포아송 분포 데이터 생성
poisson_data = np.random.poisson(lam=3, size=1000)

# 히스토그램 그리기
sns.histplot(poisson_data, bins=10, kde=False)
plt.title("포아송 분포")
plt.show()

 

 

 

 

확률의 기본 개념

확률은 특정 사건이 발생할 가능성을 수학적으로 나타낸 값. 확률값은 0에서 1 사이의 값을 가지며, 1에 가까울수록 해당 사건이 발생할 가능성이 높음을 의미.

  • 확률(P): 사건이 일어날 가능성 (0 ≤ P(A) ≤ 1)
  • 표본 공간(Sample Space, S) ☆ : 가능한 모든 경우의 집합
  • 사건(Event, E): 관심 있는 결과들의 집합

확률 계산법

1) 고전적 확률 (Classical Probability)

  • 모든 경우가 동일한 확률을 가질 때 사용
  • 예: 동전을 던질 때 앞면이 나올 확률 = 1/2

2) 경험적 확률 (Empirical Probability) 

  • 실제 데이터를 기반으로 계산
  • 예: 과거 데이터를 통해 비 오는 날의 확률을 추정

3) 조건부 확률 (Conditional Probability) 

  • 특정 사건이 발생했을 때 다른 사건이 발생할 확률
  • 예: 어떤 사람이 감기에 걸렸을 때, 병원을 방문할 확률

이중에서 우리가 쓰는 것은 경험적 확률과 조건부 확률이다.