정리
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) 두 그룹의 평균비교
- 독립 표본 t-검정을 실시하여 t 통계량을 구하세요.
- 독립 표본 t-검정을 실시하여 p-값을 구하세요.
- ANOVA F-검정을 실시하여 F 통계량을 구하세요.
- 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) 적합도 검정
- 검정 통계량?
- p-value?
- 유의수준 하 귀무가설 기각 또는 채택?
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 |