통계
- 통계의 필요성
- 전문가의 판단 vs 통계적 예측
- 루이스 골든버그: 전문가를 예측하는 모형이 전문가 자신보다 정확
- 통계는 항상 일정하지만 전문가(사람)의 판단은 내부/외부적 잡음에 영향을 받음
- 대상에 대한 전문가의 판단보다 전문가의 판단을 예측하는 통계적 모델이 더 정확
- 전문가의 판단을 예측하는 통계적 모델은 잡음에 영향 x
- 왜 통계적 예측은 충분히 사용되지 않는가?
- 판단을 직접 내릴 때 얻는 만족감(퍼즐이 맞춰지는 느낌)이 보상으로 작용
- 통계적 지식의 부족과 반감
- 부분을 통해 전체 추측 -> 대부분의 경우 우리는 대상의 일부만 관찰 -> 현실에서는 우연과 불확실성이 존재 => 부분을 통해 전체를 합리적으로 추측하는 것이 중요
변수의 종류
- 행(row)
- 표에서 가로 방향 한 줄
- 하나의 사례
- 열(Column)
- 표에서 세로 방향 한 줄
- 하나의 변수
열 | column | 변수 | |
행 | |||
row | |||
사례 |
- 범주형 변수 categorical variable
- 종류, 이름
- 숫자로 표시하더라도 양적인 개념이 아님
- 덧셈 등 대부분의 연산이 의미가 없음
- 순서가 있을 수도 있으나 간격이 일정하지 않음 (지역 번호)
- 주거 형태, 고향, 학력, 출석(왔느냐, 안 왔느냐) 등
- 연속형 변수 continuous variable
- 연속적인 형태
- 간격이 일정하고 덧셈, 뺄셈 등의 계산이 의미가 있음
- 무게, 나이, 시간, 거리, 자녀의 수(정확히 말해서는 아니긴 함 아이가 3.1명 있다?) , 시험 점수(정확히 연속적이지는 않아도 대략 간격이 일정하고 덧셈 뺄셈이 가능하면 연속형 변수라고 생각하면 됨) 등
-> 국적은 범주형? 연속형? => 범주
만족도는 범주형? 연속형 => 연속(엄밀히 말하면 범주와 연속 사이)
- 데이터 모으기
- 공공 데이터
- 인터넷 스크래핑
- 기업 등 내부 자료
- 설문 / 관찰 / 실험
- 타당도와 신뢰도
- 타당도(validity): 측정하고자 하는 것을 잘 측정
- 신뢰도(reliability): 측정 결과가 일정
타당도 높은 것 -> 쏠려고 한건 아닌데 어딘가에 일정하게게 맞음
=> 기본적으로 타당도가 높아야 하고 신뢰도는 두 번째 문제 -> 타당도 정확하게 알기 어려운 경우가 많음
확률 분포
확률 분포 probability distribution
- 확률 분포: 확률 변수가 특정한 값을 가질 확률을 나타내는 함수 (주사위를 던져서 3이 나올 확률)
- 이산확률분포: 가질 수 있는 값이 정수
- 연속 확률분포: 가질 수 있는 값이 실수(사람의 키 -> 169.4, 185.2) - 데이터가 나온 확률 분포를 추론하는 것이 통계 분석
- 분석을 쉽게 하기 위해 수학적으로 단순화, 추상화된 확률 분포들을 많이 사용
베르누이 분포 Bernoulli distribution
- 동전 던지기와 같이 둘 중에 한 가지 결과만 나올 수 있는 경우
- 고객의 구매 / 미구매, 이탈 / 유지
- 기계의 작동 / 고장
- 시험의 합격 / 불합격
이항 분포 binomial distribution
- 0과 1만 나오는 시행을 n 번했을 때 합계의 분포
- 고객의 구매율이 30%일 때 100명의 고객이 방문하면 그 중에 몇명이 구매? 한명한명 확률은 30이지만 여러명이 모이면 들쭉날쭉
from scipy.stats import binom
import matplotlib.pyplot as plt
data = binom.rvs(n=100, p=0.3, size=365)
plt.hist(data, bins=40, range=[10, 50])
-> 30%의 구매율을 가진 100명이 고객이 오는 것을 100일로 시뮬레이션
: 40명 이상 오는 날이 그림과 같은데 그 날들을 위해 우리는 대비해야할까?(알바 늘려 …)
binom.pmf(k=30, n=100, p=0.3)
>> 0.08678386475342813
-> 구매율이 30%인 고객 100명이 방문하고 그 중에 딱 30명이 구매 할 확률은 => 약 8.6%
binom.cdf(k= 30, n=100, p=0.3)
>> 0.5491236007687914
-> 0~30명까지 누적 , 아무도 안 사는날(한명, 두명~30명까지) 다 누적하면 => 약 54.9%
0.5491236007687914 * 365
>> 200.43011428060888
-> 200일은 30명이 구매한다는(그럼 직원 3명이서 200일까지는 커버 가능)
-> 10명 중에 평균적으로 3명이 사지만 4명이 살 수도 5명이 살 수도 있음
고객이 100명이 온다 -> 직원 한 명이 10명의 고객(오로지 사겠다는 고객만)을 감당할 수 있다고 가정! -> 넘으면 매장이 엉망진창이 된다
구매 고객이 0명인 경우 / 100명은 구경만 하고 떠남 -> 직원 필요 없음
구매 고객이 1명인 경우 / 99명 구경 하고 떠남 -> 직원 1명 필요
구매 고객이 2명인 경우 / 98명 구경 하고 떠남 -> 직원 1명 필요
구매 고객이 10명인 경우 / 90명 구경 하고 떠남 -> 직원 1명 필요
구매 고객이 11명인 경우 / 89명 구경 하고 떠남 -> 직원 2명 필요
근데 구매 확률이 30%임 -> 그럼 직원이 몇 명이 필요한가?
매일 일정하게 100명 오는데 어떤 사람은 구매, 어떤 사람은 구경, 구매 확률은 30%인데 그렇다고 맨날 맨날 30명이 구매하냐? 아님 주사위 처럼 어떤 날은 5명만 구매하는 날이 있고 -> 한 명 한 명 확률은 30%라도 여러명이 있으면 아닐 수 있다는 것임
30명이 구매할 확률이 가장 높은데 40명도 가능하긴 함 -> 60명은 거의 없음
그럼 직원이 몇명이 필요한가?
단순하게 생각하면 한명이 10명 처리할 수 있으니까 직원 3명만 있으면 되겠다
그런데 ! 누적으로 보면
절반정도 밖에 커버 못함
---
다른 예시
binom.cdf(k=200, n=10000, p =0.01)
카카오톡 서버 10,000대 -> 서버 뻗을 확률 1% -> 직원이 고치면 되는데 장애가 없으려면 최소 서버가 9800대는 돌아가야 함
고장이 200대 이내로 발생할 확률(0대, 1대, 2대 ... 199대, 200대) -> 괜찮은 범위 내 있을 확률이 100%다
binom.cdf(k=140, n=9940, p =0.01)
>> 0.9999549723425907
0.9999549723425907 * 3650
>> 3649.835649050456
- 10년 서비스하면 3649일은 ㄱㅊ 하루정도는 고장
정규 분포
- 𝜇(뮤)와 𝜎 2 (시그마)에 따라 모양이 달라짐
- 𝜇의 확률이 가장 높고, 멀어질 수록 확률이 낮아짐
- 𝜇를 기준으로 좌우대칭
- 𝜎 2이 클 수록 넓게 퍼짐
중심극한정리 Central Limit Theorem
- 어떤 확률분포에서 값을 n개 독립적으로 뽑아서 더하여 합계 s를 구할 경우
- n이 커질 수록, s의 분포는 정규분포와 점점 비슷해짐
6면체 주사위를 20개를 굴리고 이걸 다 더한 것은 s -> 이걸 반복 -> 주사위 하나 하나는 1~6 고르게 나옴 -> 합계는 대략 70 언저리에서 일정하게 몰려서 나옴(주사위 하나는 1도 나오고 6도 나오고 골고루 나오는데) , 20~120까지 나올 수 있는데 -> 집중적으로 몰려서 나옴 -> 어떤건 1이고 어떤건 6이고 하니까 더하면 70근처에 나올 수 밖에 -> 정규분포와 비슷한 모양이 나옴
=> 어떤 분포라도 모두 합계를 구하면 이것들의 분포는 정규분포와 점점 비슷해짐 -> 정규분포 쓸일 많다~
- 이항분포도 위에서 한 구매(마음 속에 주사위 있어서 구매 / 구경) -> 점점 정규분포와 비슷해짐
from scipy.stats import norm
import numpy as np
m = 30
s = np.sqrt(21)
data = norm.rvs(loc=m, scale=s, size=365)
plt.hist(data, bins=40, range=[10, 50])
m = 100 * 0.3
s = np.sqrt(100 * 0.3 * 0.7) # 루트 21
data = norm.rvs(loc=m, scale=s, size=365)
plt.hist(data, bins=40, range=[10, 50])
s = np.sqrt(100 * 0.3 * 0.7)
-> 표준편차 = sqrt(분산)
var(분산) = ( n * (일어날 확률)*(일어나지 않을 확률)) -> 그래서 n * p * (1-p)
-> 이 부분
정규분포의 확률밀도함수와 누적분포함수
- 확률밀도함수
- 연속확률분포에서 한 점의 확률은 0
- 대신 확률밀도를 구함
- norm.pdf(x=30, loc=m, scale=s) - 누적분포함수
- 0~30명이 구매할 확률의 합
- norm.cdf(x=30, loc=m, scale=s)
왜 사람의 키의 분포는 정규분포와 비슷할까
키에는 유전자가 크게 관여
키에 관여하는 유전자는 여러개
유전자들이 독립적으로 유전된다고 가정하면 중심극한정리에 따라 키에 대한 유전자의 효과는 정규분포를 따르게 됨
실제로는 정규분포와 조금은 맞지 않음
• 아마도 유전자들의 분포가 다르고, 서로 독립적이지 않고 정규분포로 예상되는 것보다 더 크거나 작은 사람들이 있음
-> 역으로 정규분포를 따른다고 해서 반드시 유전자 때문은 아님
기술 통계
통계의 종류
- 기술 통계: 데이터를 묘사, 설명
- 추론 통계: 데이터를 바탕으로 추론, 예측
기술 통계
- 중심 경향치: 데이터가 어디에 몰려있는가?
- 평균
- 중간값 - 분위수: 데이터에서 각각의 순위가 어느정도인가?
- 변산성 측정치: 데이터가 어떻게 퍼져있는가?
- 범위, IQR
- 분산, 표준편차
평균
- n개의 값이 있을 때, 그 합계를 n으로 나눈 것
- 평균은 극단값에 따라 영향을 크게 받음 -> 10, 20, 30, 40, 5000 => 평균 120
중간값
- 값들 크기 순 정렬했을 때 딱 중앙 -> 10, 20, 30, 40, 500 => 30 (극단값의 영향을 덜 받음)
- 극단값 영향을 덜 받는다고 이게 평균보다 낫다? 그건 아님 - '중위수'라는 표현도 많이 사용(중위 소득, 중위 가격 등)
- df.median()
분위수 quantile
- 크기순으로 정렬된 데이터를 q개로 나누는 위치의 값
- 대표적으로 사분위수, 백분위수
사분위수 quartile
- 데이터를 4등분 하는 위치
- 제1사분위수 -> 1/4 지점
- 제2사분위수 -> 2/4 지점
- 제3사분위수 -> 3/4 지점 - 상위 10%에 들어가는
df['mileage'].quantile(.9)
백분위수 percentile
- 데이터에서 순위를 퍼센트로 표현
- percentile: 위치로 말할 때
- 최소값 = 0퍼센타일
- 제1사분위수 = 25퍼센타일
- 제2사분위수 = 중간값 = 50퍼센타일
Python 최소, 최대, 퍼센타일
- df.price.min()
- df.price.max()
- df.price.quantile(.25)
범위 range
- 최대값 - 최소값
- 극단값이 있으면 커짐 ex) 10, 20, 30, 40, 500의 경우 490
print(df.price.min(), df.price.max()) # (일상적인 의미에서) 범위
print(df.price.max() - df.price.min()) # (통계적인 의미에서) 범위
사분위간 범위 InterQuartile Range
- 줄여서 IQR
- 제3사분위수 - 제1사분위수 (너무 크거나 너무 작은 수 빼고)
- 극단값은 최소값 또는 최대값 근처에 있으므로 극단값의 영향이 적음
print(df.price.quantile(.75) - df.price.quantile(.25)) # 사분위간 범위(IQR)
상자 수염 그림 box - whisker plot
- 제1사분위수~제3사분위수를 상자로 표현
- 중간값은 상자의 가운데 굵은 선으로 표시
- 최소값과 최대값은 수염으로 표시
- 수염의 최대 길이는 IQR의 1.5배까지, 넘어가는 경우는 점으로 표시
plt.figure(figsize=(12, 6))
sns.boxplot(x='price', data=df)
plt.figure(figsize=(12, 6))
sns.boxplot(x='price', y='model', data=df)
편차 deviation
값 - 평균
분산 variance
편차 제곱의 평균 -> 부호를 떼기 위한건데 왜 제곱? 절대값이 아니라? => 평균 절대 편차 MAD
평차 제곱 평균 => 분산
분산: df.price.var()
표준편차: df.price.std()
기술통계 한 번에 구하기: df.price.describe()
print(df['mileage'].var())
print(df['mileage'].std())
>>
1850358572.437435
43015.79445317075
히스토그램 histogram
데이터를 구간별로 나눠 각 구간의 사례 수를 막대 그래프로 그린 것
sns.histplot(x='price', data=df)
bins = 으로 구간 나눌 수 있음
import matplotlib.pyplot as plt
xs = list(range(100, 2100, 200))
sns.histplot(x='price', data=df, bins=xs)
plt.xticks(xs)
plt.xticks(xs) -> x 간격 정렬 -> bins
커널 밀도 추정 kernel density estimation
- 데이터의 밀도를 추정하여 그린 곡선
sns.histplot(x='price', data=df, kde=True)
모집단과 표본
모집단 population
: 연구의 관심이 되는 집단 전체 -> 무한, 실제로 다 보는 것은 불가능(전수조사할 때만 가능 but, 거의 불가능)
표본 sample
: 특정 연구에서 선택된 모집단의 부분 집합
표집 sampling
: 모집단에서 표본을 추출하는 절차. '표본 추출'이라고도 함
-> 대부분의 경우 집단 전체를 전수조사하기는 어려우므로 무작위로 표본 추출하여 모집단에 대해 추론
모수
파라미터: 어떤 시스템의 특성을 나타내는 값
모수: 모집단의 파라미터 -> 모집단의 특성을 나타내는 값
-> 모수를 구하기 위해서는 전수조사가 필요 (사실상 어려움) / 표본의 크기를 모수라고 하는 경우도 있으나 잘못된 표현!
통계량
표본에서 얻어진 수로 계산한 값(= 통계치)
'모집단의 통계랑'이라는 표현은 없음 -> 통계량은 표본에서 구한 값
'표본의 모수'라는 말은 없음 -> 모수는 모집단에서 구한 값
추론통계 inferential statistics
: 표본 통계량을 일반화하여 모집단에 대해 추론하는 것
'AI SCHOOL' 카테고리의 다른 글
[ML] Clustering (0) | 2023.03.12 |
---|---|
[통계분석] 상관분석 / 회귀분석 (0) | 2023.02.16 |
[통계분석] (0) | 2023.02.15 |
[WIL] 4주차 (0) | 2023.01.19 |
[WIL] 3주차 (0) | 2023.01.12 |