본문 바로가기
자격증/빅분기

[빅분기] 3유형

by kime2 2024. 6. 21.

정리

stats

  • 정규성검정(kstest: 데이터 많을 때  , shapiro : 데이터 50개 미만)
  • 등분산성 검정(levene)
  • 평균 검정(ttest_1samp : 한 집단 평균, ttest_ind : 두 집단 평균 , ttest_rel : 집단 전,후 비교)
  • 카이제곱 검정(chisquare : 적합성, chi2_contingency : 독립성)
  • 일원분산분석(f_oneway)
  • 분포(poisson:포아송분포, bnom:이항분포)
  • 신뢰구간( t.interval )
1.정규성 검정
from scipy import stats
# 데이터가 많을때
stats.kstest(df)
# 데이터 50개 미만
stats.shipiro(df)
# p-value >= 0.05 : 귀무가설 채택 - 정규분포와 동일
# p-value < 0.05 : 대립가설 채택  - 정규분포가 아님

2. 등분산성 검정
from scipy.stats import levene
stats.levene(df1, df2)
# p-value >= 0.05 : 귀무가설 채택 - 두 표본의 분산이 동일 = 등분산성 만족 
# p-value < 0.05 : 대립가설 채택  - 두 표본의 분산이 다름 = 등분산성 불만족

3. t-test
from scipy import stats
# 한 집단
stats.ttest_1smap(df, 비교할 평균)
# 두 집단
stats.ttest_ind(da1, da2, alternative = 대립가설 기준)
# 쌍 비교
stats.ttest_rel(da1, da2, alternative = 대립가설 기준)

4. 카이제곱 검정
from scipy import stats
# 적합성
stats.chisquare(df1, df2)
# 독립성
stats.chisquare_contigency(df)

5. 일원 분산분석 : 독립변수1개 > 2개 이상 집단의 평균 분포 비교
# p-value >= 0.05 : 귀무가설 채택 - 그룹간 평균이 차이가 없다
# p-value < 0.05 : 대립가설 채택  - 그룹간 평균이 차이가 있다
from scipy import stats
stats.f_oneway(df1,df2...)

6. 분포
# 포아송분포
from scipy.stats import poisson
# 정확히 n명이 할 확률 : 확률 질량 함수
poisson.pmf(n명, 평균x명)
# 적어도 m명이 할 확률 : 누적분포함수
1 - poisson.cdf(m-1명, 평균x명)

# 이항분포
from scipy.stats import binom
# 성공확률 : 성공횟수/시행횟수
binom.pmf(성공횟수, 전체시도, 성공확률)

7. 신뢰구간
from scipy import stats
# 신뢰수준, 샘플수(n), 평균, 표준편차
stats.t.interval(신뢰수준, 자유도(n-1), loc = 평균, scale = 표본편차/(샘플수**0.5)

 

1) 로지스틱 회귀 : 회귀계수구하기 

Pclass, Gender, sibsp, parch를 독립변수로 사용하여 로지스틱 회귀모형을 실시하였을 때,

parch변수의 계수값은? 단, Pclass는 범주형 변수이다

(반올림하여 소수 셋째 자리까지 계산)

import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/Titanic.csv")

# 로지스틱에서의 계수찾기
# 범주형 : Pclass
# 수치형 : Gender, sibsp, parch
# 예측 : Survived
from statsmodels.formula.api import logit

formula = "Survived ~ C(Pclass) + Gender + SibSp + Parch"
model = logit(formula, data=df).fit()
# 회귀계수
model.params

 

2) 두 그룹의 평균비교

  1. 독립 표본 t-검정을 실시하여 t 통계량을 구하세요.
  2. 독립 표본 t-검정을 실시하여 p-값을 구하세요.
  3. ANOVA F-검정을 실시하여 F 통계량을 구하세요.
  4. ANOVA F-검정을 실시하여 p-값을 구하세요
import pandas as pd
df = pd.DataFrame({
    'A':[77, 75, 82, 80, 81, 83, 84, 76, 75, 87],
    'B':[80, 74, 77, 79, 71, 74, 78, 69, 70, 72],
})

from scipy import stats
# 독립표본 t-검정
print(stats.ttest_ind(df['A'], df['B']))

# 다음으로 ANOVA F-검정을 수행합니다.
print(stats.f_oneway(df['A'], df['B']))

 

3) 적합도 검정

  1. 검정 통계량?
  2. p-value?
  3. 유의수준 하 귀무가설 기각 또는 채택?
from scipy.stats import chisquare

# 관측된 빈도
observed_frequencies = [30, 60, 50, 40, 20]

# 기대된 빈도 
expected_frequencies = [200 * 0.20, 200 * 0.30, 200 * 0.25, 200 * 0.15, 200 * 0.10]

# 카이제곱 검정
chisquare(f_obs=observed_frequencies, f_exp=expected_frequencies)

 

4) 지지도, 신뢰도, 향상도

  • '빼빼로'와 '딴짓초코'가 함께 팔린 거래의 지지도를 계산하세요.
  • '빼빼로'가 팔린 거래 중에서 '빼빼로'와 '오징어칩'이 함께 팔린 거래의 신뢰도를 계산하세요.
  • 빼빼로'와 '양조위빵'의 향상도를 계산하세요.

지지도 : '빼빼로'와 '딴짓초코'가 함께 팔린 거래횟구 / 전체 거래 횟수

신뢰도 : '빼빼로'와 '딴짓초코'가 함께 팔린 거래횟구  / 빼뺴로가 팔린 거래 횟수

향상도 : 신뢰도 /지지도

# 지지도 : 빼빼로 + 딴짓 동시 구매 / 전체 거래
gg = len(df[(df['빼빼로']==1)&(df['딴짓초코']==1)])
total = len(df)
print(gg/total)

# 신뢰도 : '빼빼로'가 팔린 거래 중에서 '빼빼로'와 '오징어칩'이 함께 팔린 거래
ss = len(df[(df['빼빼로']==1)&(df['오징어칩']==1)])
pp = len(df[(df['빼빼로']==1)])
print(ss/pp)

#'빼빼로'와 '양조위빵'의 향상도를 계산하세요. = 신뢰/지지
gg = len(df[(df['빼빼로']==1)&(df['양조위빵']==1)])
total = len(df)
gg_final = gg/total
ss_final = len(df[(df['빼빼로']==1)&(df['양조위빵']==1)])/len(df[(df['빼빼로']==1)])
print(ss_final / gg_final)

 

5) 포아송분포 :확률론에서 단위시간안에 어떤 사건이 몇 번 발생할 것인지를 표현

  • 하루에 정확히 5명의 고객이 잡지를 구매할 확률은 얼마입니까? (%로 값을 정수로 입력하시오)
  • 하루에 적어도 2명의 고객이 잡지를 구매할 확률은 얼마입니까? (%로 값을 정수로 입력하시오)
from scipy.stats import poisson

# 평균 발생 횟수 (하루에 잡지를 구매하는 고객 수)
lambda_ = 3

# 하루에 정확히 5명의 고객이 잡지를 구매할 확률
print(poisson.pmf(5, lambda_))

# 하루에 적어도 2명의 고객이 잡지를 구매할 확률
print(1 - poisson.cdf(1, lambda_))

 

 

6) 독립성 검정 : 성별과 시험합격은 독립적인가를 검정하시오!

  • 1 검정 통계량?
  • 2 p-value?
  • 3 귀무가설 기준 (기각/채택)?
  • 4 남자의 합격 기대 빈도?
# 주어진 표처럼 데이터프레임 만들기
import pandas as pd
df = pd.DataFrame({'합격':[100,130],
                  '불합격':[200,170]},
                  index = ['남자','여자'])

# 카이제곱 검정 수행
from scipy import stats
result = stats.chi2_contingency(df)

# 원하는 값에따라 출력 : statistic, pvalue, dof, expected_freq
print(result.statistic)
print(result.pvalue)
print(result.dof)
print(result.expected_freq[0][0])

 

7) 베르누이분포와 이항분포

베르누이분포 : 결과가 두가지중 하나로만 나오는 시행의 분포

이항분포 : 베르누이시행을 n번 반복하는 분포

# 베르누이 분포
attempt = len(df)
success = len(df[df['Success']==1])
pro = success/attempt
print(pro)

from scipy.stats import binom
binom.pmf(60, 100, pro)
# 성공횟수, 전제시도, 성공할확률
# 이항분포 -> 확률질량 > pmf

 

8) 점추정 및 구간추정

 

# 점추정 : 데이터의 평균
dot = temperature_data['Daily Average Temperature'].mean()

# 구간추정 샘풀의 표준편차 및 신뢰구간
from scipy import stats

#신뢰수준
level = 0.95

#표준편차
std= temperature_data['Daily Average Temperature'].std()

#샘플수
n = len(temperature_data )

# 95% 신뢰구간
interval = stats.t.interval(level,  df = n-1, loc = dot, scale = std/(n**0.5))

print(dot, interval)

 


stats의 T-test

  • ttest_1samp : 단일표본 t검정 > 하나로 구성된 모집단의 평균값을 기준값과 비교
  • ttest_ind : 독립표본t검정(2표본 t검정) > 독립적인 두 집단간의 평균의 차이
  • ttest_rel : 대응(쌍체)표본 t검정 > 데이터 값이 서로 대응을 이룰때(예 : 사용자 그룹에 대한 이전-이후 측정값)

 

 

(1) t검정 : 쌍체(대응) t검정 : stats.ttest_rel

 (쌍체)표본 t-검정 : 데이터 값이 쌍체 측정값일때(예 : 사용자 그룹에 대한 이전-이후 측정값)

# (쌍체)표본 t-검정 : 데이터 값이 쌍체 측정값일때(예 : 사용자 그룹에 대한 이전-이후 측정값)
# 귀무가설 : post_mean-pre_mean >=0
# 대립가설 : post_mean-pre_mean <0

import pandas as pd
df = pd.read_csv("/kaggle/input/bigdatacertificationkr/high_blood_pressure.csv")

pre = df['bp_pre']
post= df['bp_post']
m = (post_mean-pre_mean).mean()

#𝜇의 표본평균은?(소수 둘째자리까지 반올림)
print(round(m,2))

# alternative 대립가설 기준임!!! : 대립가설은 post_mean-pre_mean <0(post가 작다less)
#검정통계량 값은?(소수 넷째자리까지 반올림)
# p-값은?(소수 넷째자리까지 반올림)
from scipy import stats

test = stats.ttest_rel(df['bp_post'], df['bp_pre'], alternative="less")
print(round(test.statistic,4))
print(round(test.pvalue,4))
print('귀무가설 기각')

 

(2) 독립표본 t검정 : stats.ttest_ind

import pandas as pd
from scipy import stats

# 가설 설정
# H0: 약물을 복용한 그룹과 복용하지 않은 그룹의 평균 체온은 유의미한 차이가 없다. : group1.mean()-group2.mean() =0
# H1: 약물을 복용한 그룹과 복용하지 않은 그룹의 평균 체온은 유의미한 차이가 있다. : group1.mean()-group2.mean() !=0

# 데이터 수집
group1 = [36.8, 36.7, 37.1, 36.9, 37.2, 36.8, 36.9, 37.1, 36.7, 37.1]
group2 = [36.5, 36.6, 36.3, 36.6, 36.9, 36.7, 36.7, 36.8, 36.5, 36.7]

# 가설검정 : 독립표본 t검정 > ttest_ind
ans = stats.ttest_ind(group1, group2)
print('검정통계량:',ans.statistic)
print('P-value:',ans.pvalue )

# 유의수준 지정
level = 0.05

if ans.pvalue < level :
    print('귀무가설을 기각합니다')
else:
    print('귀무가설을 채택합니다')

 

(3) 단일표본 t검정 : ttest_1samp

scores = [75, 80, 68, 72, 77, 82, 81, 79, 70, 74, 76, 78, 81, 73, 81, 78, 75, 72, 74, 79, 78, 79]

from scipy.stats import ttest_1samp

# 귀무 22명의 평균 =< 75보다 
# 대립 22명의 평균 > 75보다 

ans = stats.ttest_1samp( scores, 75, alternative ='greater')
print(ans.statistic)
print(ans.pvalue)
level = 0.05
if ans.pvalue < level :
    print('귀무가설을 기각한다')
else:
    print('귀무가설을 채택한다')

분산분석

일원분산분석 > scipy.stats > f_oneway

이원분산분석 > statsmodel

 

 

1) 일원 분산분석 : 독립변수1, 종속변수1 > scipy.stats > f_oneway

> 한 독립변수가 종속변수에 어떤 영향을 미치는 지

# 각 그룹의 데이터
groupA = [85, 92, 78, 88, 83, 90, 76, 84, 92, 87]
groupB = [79, 69, 84, 78, 79, 83, 79, 81, 86, 88]
groupC = [75, 68, 74, 65, 77, 72, 70, 73, 78, 75]


# 귀무가설 : 평균 차이 없음
# 대립가설 : 평균 차이 있음

from scipy import stats
ans = stats.f_oneway (groupA, groupB, groupC)
level = 0.05

print('f값:',round(ans.statistic,2))
print('p-value:',format(ans.pvalue,'.6f'))
if ans.pvalue < level :
    print('귀무가설 기각')
else:
    print('귀무가설 채택')

 

 

2) 이원 분산 분석 : 독립변수2, 종속변수1

> 한 변수의 변화가 종속변수에 미치는 영향이 다른 독립변수의 수준에 따라 달라지는 가

import pandas as pd
df =  pd.read_csv("/kaggle/input/bigdatacertificationkr/christmas_decoration_sales.csv")

import statsmodels.api as sm
from statsmodels.formula.api import ols

model = ols('Sales ~ C(Decoration_Type)*C(Region)', data=df).fit()
models = sm.stats.anova_lm(model)

print(models.iloc[0:3,3:])

stats의 적합성 검정(정규성 검정) :shpiro

from scipy import stats
data = [75, 83, 81, 92, 68, 77, 78, 80, 85, 95, 79, 89]

x = stats.shapiro(data)
print(x.statistic)
print(x.pvalue)
level = 0.05
if x.pvalue < level:
    print('정규분포를 따르지 않는다')
else:
    print('정규분포를 따른다')

 

 

 

 

stats의 카이제곱 검정 : chisquare

 

기타

1) 상관계수 구하기 : df.corr

iris에서 Sepal Length와 Sepal Width의 상관계수 계산하고 소수 둘째자리까지 출력하시오

import pandas as pd
from sklearn.datasets import load_iris

# iris 데이터셋 로드
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)

# your code
ans = df.corr()
format(ans.iloc[0,1],'.2f')

 

'자격증 > 빅분기' 카테고리의 다른 글

[빅분기] 2유형  (0) 2024.06.20
[빅분기]유형1 기출  (0) 2024.06.19
[빅분기] 판다스 전처리 100제  (0) 2024.06.18