# 다중공선성
# 다중공선성은 회귀분석에서 독립변수들 간에 강한 상관관계가 나타나는 문제로, 정확한 회귀계수 추정에 어려움이 됨
# 다중공선성이 발생하면, 변수를 제거하거나, 주성분분석을 진행하거나, ridge, lasso 등과 같은 정규화된 회귀분석 진행

# 독립변수들 간의 상관계수 : 0.9 이상이면 다중공선성이 있다고 판단
# 허용 오차(1-r^2)를 구했을 때, 0.1 이하면 다중공선성 문제가 심각하다고 판단
# 즉, 그 값이 작을수록 공선성이 높다고 볼 수 있음
# 분산팽창요인(VIF) : 허용오차의 역수로, VIF가 10 이상이면 공선성이 문제가 심각하다고 봄

import pandas as pd
Cars = pd.read_csv('../data/Cars93.csv')
Cars.info()

# 일단 상관계수를 보고, 0.9 이상인 것이 있는지 확인

from patsy import dmatrices
from statsmodels.stats.outliers_influence import variance_inflation_factor
Y, X = dmatrices('Price ~ EngineSize + RPM + Weight + Length', data = Cars, return_type = 'dataframe')


vif_list = []
for i in range(1, len(X.columns)):
	vif_list.append([variance_inflation_factor(X.values, i), X.columns[i]])

pd.DataFrame(vif_list, columns = ['vif', 'variable'])
# 변수선택법
# 유의미한 독립변수들을 선택하여 최적의 회귀방정식 도출하는 것이 필요
# AIC 값이 낮다는 것은 모형의 적합도 높음을 의미

# 전진선택법
# 후진소거법
# 단계적선택법

'ADP > 실기' 카테고리의 다른 글

계층적 군집분석  (1) 2024.01.28
로지스틱 회귀분석  (1) 2024.01.27
회귀분석  (0) 2024.01.25
교차분석  (1) 2024.01.25
분산분석 ANOVA  (1) 2024.01.24

 

# 회귀분석
# 선형회귀분석의 가정
# 독립변수와 종속변수 간의 선형성
# 오차의 정규성 : q-q plot, shaprio-wilk 검정
# 오차의 등분산성
# 오차의 독립성

# 회귀분석 시 검토사항
# 모형이 데이터를 잘 적합하고 있는가
# 회귀모형이 통계적으로 유의한가 : F-통계량
# 모형은 데이터를 얼마나 설명할 수 있는가 : 설명계수 R-square
# 모형 내의 회귀계수가 유의한가 : t-통계량

# kc_house_data에서 sqft_living을 독립변수, price를 종속변수로 설정하여 단순 선형 회귀분석 진행
import pandas as pd
import numpy as np
house = pd.read_csv('../data/kc_house_data.csv')

house = house[['price', 'sqft_living']]
# 독립변수와 종속변수의 선형 가정
house.corr()

y = house['price'] # 시리즈 형태
X = house[['sqft_living']] # 데이터프레임 형태

from statsmodels.formula.api import ols
lr = ols('price ~ sqft_living', data = house).fit()

# 회귀계수
lr.params

y_pred = lr.predict(X)

resid = y - y_pred

# mse
(resid**2).sum()/len(y)

# rmse
np.sqrt((resid**2).sum()/len(y))

lr.summary()
# 회귀모형의 시각화
import matplotlib.pyplot as plt
plt.scatter(X, y)
plt.plot(X, y_pred, color = 'red')

plt.xlabel('sqft_living', fontsize = 10)
plt.ylabel('price', fontsize = 10)
plt.title('Linear Regression Result')
plt.show()

# Q-Q plot
# 잔차가 정규분포를 따르는지 확인
import statsmodels.api as sm
sm.qqplot(resid, line = 'r', alpha = 0.4)
plt.show()
# scikit-learn 머신러닝 이용한 방법
sklearn.linear_model.LinearRegression().fit()

# 설명변수 차원 조정해야함
# R의 summary()와 같은 기능 없음
# 기울기와 절편 따로 호출해야함
# 잔차 자동 계산 기능 없음

from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X, y)
# 다중선형회귀분석
# 두 개 이상의 독립변수가 종속변수에 미치는 영향을 추정하는 통계 기법

import pandas as pd
import numpy as np
house = pd.read_csv('../data/kc_house_data.csv')
house.head()
house.info()

house = house.drop(['id', 'date'], axis = 1)
house = pd.get_dummies(house, columns = ['waterfront'])

ols_str = 'price ~ '
for i in house.columns.drop('price'):
	ols_str = ols_str + i + '+'
    
ols_str = ols_str[:-3]
import statsmodels.api as sm
import statsmodels.formula.api as smf

model = smf.ols(formula = ols_str, data = house)
result = model.fit()
result.summary()

'ADP > 실기' 카테고리의 다른 글

로지스틱 회귀분석  (1) 2024.01.27
다중공선성 확인 및 변수선택법  (0) 2024.01.25
교차분석  (1) 2024.01.25
분산분석 ANOVA  (1) 2024.01.24
t-test  (0) 2024.01.24

 

# 카이제곱 검정
# 카이제곱 분포에 기초한 통계 방법
# 기본 가정 : 각 범주의 기대빈도가 5 이상이어야 함

# 적합성검정
# 각 범주에 따른 데이터의 빈도분포가 이론적으로 기대하는 분포를 따르는지 검정

# 독립성검정
# 두 개 이상의 범주형 변수에 대해서, 그 변수들의 관계에 따라 값들의 분포가 유의미한 차이를 보이는지 검정

# 동질성검정
# 부모집단의 관측값들이 정해진 범주 내에서 서로 비슷하게 나타나고 있는지 검정
# 적합성검정
# 실험에서 얻어진 관측치들이 예상한 이론과 일치하는지 아닌지를 검정
scipy.stats.chisquare(f_obs, f_exp = None)

# 귀무가설 : 전체 응답자 중 남자의 비율이 50%, 여자의 비율이 50%이다
# 대립가설 : 전체 응답자 중 남자의 비율이 50%, 여자의 비율이 50%라고 할 수 없다

import pandas as pd
df_t = pd.read_csv('../data/titanic.csv')
df_t.info()

table = df_t[['sex']].value_counts()
len(df_t['sex'])/2

# 적합도 검정 수행
from scipy.stats import chisquare
chi = chisquare(tabel, f_exp = [445.5, 445.5])
# p-value가 유의수준보다 작으므로 귀무가설을 기각
# 독립성 검정
# 두 범주형 변수들 사이의 관계가 독립인지 아닌지를 검정
# 교차표를 활용

# 귀무가설 : class와 survived는 독립이다
# 대립가설 : class와 survived는 독립이 아니다

table = pd.crosstab(df_t['class'], df_t['survived'])

# 카이제곱 검정을 통한 독립성 검정 수행
from scipy.stats import chi2_contigency
chi, p, df, expect = chi2_contigency(table)
# p-value가 유의수준보다 작으므로 귀무가설 기각
# 좌석 등급과 생존은 독립이 아니라고 할 수 있음
# 동질성 검정
# r개의 부분 모집단에서 추출한 표본이 c개의 범주화된 집단의 분포가 서로 동일한지 검정
# 교차표 활용하며, 계산법과 검증법은 모두 독립성 검정과 같은 방법으로 진행됨

# 귀무가설 : class의 분포는 survived에 관계 없이 동일하다
# 대립가설 : class의 분포는 survived에 관계 없이 동일하지 않다

'ADP > 실기' 카테고리의 다른 글

다중공선성 확인 및 변수선택법  (0) 2024.01.25
회귀분석  (0) 2024.01.25
분산분석 ANOVA  (1) 2024.01.24
t-test  (0) 2024.01.24
변수 축소  (1) 2024.01.24
# 일원배치 분산분석(one-way ANOVA)
# 분산분석은 두 개 이상의 다수 집단 간 평균을 비교하는 통계분석
# 일원배치 분산분석은 반응값에 대한 하나의 범주형 변수의 영향을 알아보기 위해 사용되는 검증 방법
# 모집단의 수에 제한 없으며, 각 표본의 수가 같지 않아도 됨
# F 검정 통계량 이용

# 각 집단의 측정치는 서로 독립적이고, 정규분포를 따르며, 각 집단 측정치의 분산은 같다고 가정

# 귀무가설 : k개의 집단 간 모평균에는 차이가 없다
# 대립가설 : k개의 집단간 모평균이 모두 같다고 말할 수 없다

# 사후검정
# 귀무가설이 기각되어, 적어도 한 집단에서 평균의 차이가 있음이 통계적으로 증명되었을 경우, 어떤 집단들에 대해 평균의 차이가 존재하는지 알아보기 위해 실시하는 분석
# Iris data 에서 종(Species)별로 꽃받침의 폭(Sepal.Width)의 평균이 같은지 혹은 차이 있는지 확인

import pandas as pd
import numpy as np

iris_data = pd.read_csv('../data/iris.csv')
iris_data.head(100)

iris_data.target.value_counts()

import seaborn as sns
import matplotlib.pyplot as plt

# scatter plot by groups
sns.scatterplot(x = 'target', y = 'sepal width', hue = 'target', style = 'target', s = 100, data = iris.data)
plt.show()
target_list = iris_data['target'].unique()

# 3개의 집단 시리즈 형태로 만들어주기
setosa = iris_data[iris_data['target'] == target_list[0]]['sepal width']
versicolor = iris_data[iris_data['target'] == target_list[1]]['sepal width']
virginica = iris_data[iris_data['target'] == target_list[2]]['sepal width']

# 정규성 확인
print(stats.shaprio(setosa))
print(stats.shaprio(versicolor))
print(stats.shaprio(virginica))
# 각각 집단은 정규성 만족

# 등분산성 확인
stats.levene(setosa, versicolor, virginica)
# 세 집단간 분산 같다고 결론

# ANOVA 분석
stats.f_oneway(setosa, versicolor, virginica)
# p-value가 유의수준보다 작아 귀무가설 기각
# 적어도 세 집단 중 하나는 평균이 다르다고 말할 수 있음
# 사후검정
# 특히 어떤 종들 간에 꽃받침의 폭 차이가 있는지

from statsmodels.stats.multicomp import pairwise_tukeyhsd
from statsmodels.stats.multicomp import MultiComparison

mc = MultiComparison(data = Iris_data['sepal width'], groups = Iris_data['target'])
tuekeyhsd = mc.tukeyhsd(alpha = 0.05)
tuekeyhsd.summary()
# 각각에 대해 모두 t-test 진행했다고 이해하면 됨

fig = tuekeyhsd.plot_simultaneous()

# diff는 오른쪽 집단 - 왼쪽 집단 값을 나타낸다
# 추가 함수 사용방법 예시

# 정규성을 만족하지 않을 때
stats.kruskal(setosa, versicolor, virginica)

# 등분산성을 만족하지 않을 때
import pingouin as pg
pg.welch_anova(data = iris_data, dv = 'sepal width', between = 'target')
# 이원배치 분산분석 two-way ANOVA
# 분산분석에서 반응값에 대해 두 개의 범주형 변수의 영향을 알아보기 위해 사용되는 검증 방법

# 각 집단의 측정치의 분포는 정규분포여야 한다 -> 정규성
# 각 집단의 분산은 같다 -> 등분산성

# 주효과와 교호작용효과
# 교호작용 효과는 한 독립변수가 종속변수에 미치는 영향이 다른 독립변수의 수준에 따라서 달라지는지를 분석
# 교호작용이 없을 시에 주효과를 분석한다
# 교호작용이 있을 시는 검정이 무의미함

# 변속기 종류(am 변수)와 실린더 개수(cyl)에 따라 주행거리(mpg 변수) 평균에 유의미한 차이가 있는지 분석

# 상호작용효과 검정에 대한 가설
# 귀무가설 : 변속기 종류와 실린더 개수 간에는 상호작용 효과가 없다
# 대립가설 : 변속기 종류와 실린더 개수 간에는 상호작용 효과가 있다

# 주효과 검정에 대한 가설
# 귀무가설 : 실린더 개수에 따른 주행거리의 차이는 존재하지 않는다
# 대립가설 : 실린더 개수에 따른 주행거리의 차이는 존재한다
# 귀무가설 : 변속기 종류에 따른 주행거리 차이는 존재하지 않는다
# 대립가설 : 변속기 종류에 따른 주행거리 차이는 존재한다
import pandas as pd
import numpy as np

mtcars = pd.read_csv('mtcars.csv')
mtcars.info()

mtcars.cyl.value_counts()
mtcars.am.value_counts()

# 독립변수와 종속변수 Series 형태로 변경
cyl = mtcars['cyl']
am = mtcars['am']
mpg = mtcars['mpg']

mtcars = mtcars[['mpg', 'cyl', 'am']]

# 분산분석 수행
from statsmodels.formula.api import ols
from statsmodels.stats.anova import anova_lm

# formula 작성시, 컬럼명이 꼭 데이터셋 내에 있는 명과 같아야 함
formula = 'mpg ~ C(cyl) * C(am)'
model = ols(formula, mtcars).fit()
aov_table = anova_lm(model, typ=2)
# 상호작용 효과에 대한 검정결과, p-value 값이 유의수준보다 크므로 귀무가설을 기각하지 않는다

from statsmodels.graphics.factorplots import interaction_plot
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize = (6,6))
fig = interation_plot(cyl, am, mpg, colors = ['red', 'blue'], markers = ['D', '^'], ms = 10, ax = as)
# 일반적으로 두 선이 서로 교차하고 있으면, 상호작용이 존재한다고 해석
# 여기서는 두 선이 교차하고 있지 않으므로, 상호작용 효과가 없다고 결론

'ADP > 실기' 카테고리의 다른 글

회귀분석  (0) 2024.01.25
교차분석  (1) 2024.01.25
t-test  (0) 2024.01.24
변수 축소  (1) 2024.01.24
범주형 데이터 전처리  (0) 2024.01.23

 

# 일표본 t-검정(one sample t-test)
# 단일모집단에서 관심이 있는 연속형변수의 평균값을 특정 기준값과 비교

# 고양이들의 평균 몸무게가 2.6kg인지 아닌지 통계적 검정 수행(양측검정, 유의수준 = 0.05)
import pandas as pd
cats = pd.read_csv('cats.csv')
cats.info()

# cats의 Bwt 정규성 검정 : Shaprio test
# 귀무가설 : 정규성을 가진다
# 대립가설 : 정규성을 가지지 않는다
import scipy.stats as stats
from scipy.stats.import shaprio
mu = 2.6
shaprio(cats['Bwt'])
# p-value 값이 유의수준보다 작아, 귀무가설을 기각
# Bwt 변수는 정규분포를 따르지 않는다고 결론
# 따라서 wilcox test로 t검정 진행
# cats의 Bwt t-test(wilcox test)
stats.wilcoxon(cats.Bwt - mu, alternative = 'two-sided')
# 유의수준보다 작아, 고양이들의 평균 몸무게는 2.6kg 이다라는 귀무가설 기각
# 고양이들의 평균 몸무게는 2.6kg가 아닌 것으로 결론

import matplotlib.pyplot as plt
cats_Bwt_cnt = pd.value_counts(cats['Bwt'].values, sort=False)

width = 0.4
plt.bar(cats_Bwt_cnt.index, cats_Bwt_cnt.values, width)
plt.title('Bwt')
plt.ylabel('Count')
# 대응표본 t검정(Paired Sample T-test)
# 단일 모집단에 대해 두 번의 처리를 가했을 때, 두 개의 처리에 따른 평균의 차이 비교
# 모집단의 관측값이 정규성을 만족해야함

# 10명의 환자 대상 수면영양제 복용 전과 후의 수면시간 측정
# 영양제의 효과가 있는지 판단
# 표본이 정규성을 만족한다는 가정 하에 단측검정 수행, 유의수준 = 0.05

import pandas as pd
data = {'before' : [7,3,4,5,2,1,6,6,5,4], 'after' : [8,4,5,6,2,3,6,8,6,5]}
data = pd.DataFrame(data)

data.mean()

stats.ttest_rel(data['after'], data['before'], alternative = 'greater')
# 앞에 오는 것이 기준이 됨

# 유의수준보다 작으므로, 수면영양제를 복용하기 전과 후의 평균 수면시간 차이 통계적 유의
# 영양제를 복용한 후, 수면 시간이 늘었다고 말할 수 있음
# 독립표본 t-검정(Independent Sample t-test)
# 두 개의 독립된 모집단 평균 비교
# 모집단, 모수, 표본이 모두 두 개씩 존재

# 두 모집단은 정규성 만족해야함
# 두 모집단의 분산이 서로 같아야 함 -> 등분산성
# 독립변수는 범주형, 종속변수는 연속형

# 정규성 검정
import scipy.stats as stats
from scipy.stats import shapiro
stats.shapiro(cats.Bwt)
# 귀무가설 기각, 정규 분포 따르지 않음

# 등분산성 검정
female = cats.loc[cats.Sex == 'F', 'Bwt']
male = cats.loc[cats.Sex = 'M', 'Bwt']
stats.levene(female, male)
# 귀무가설 기각, 등분산성 만족하지 않음

stats.ttest_ind(female, male, equal_var = False)
# 이 안에 시리즈 형태로 들어가야 함
# 귀무가설 기각, 통계적으로 유의

print(female.mean())
print(male.mean())

'ADP > 실기' 카테고리의 다른 글

교차분석  (1) 2024.01.25
분산분석 ANOVA  (1) 2024.01.24
변수 축소  (1) 2024.01.24
범주형 데이터 전처리  (0) 2024.01.23
결측치 , 이상치 처리하기  (0) 2024.01.23

 

# 주성분분석
# 주성분분석이란 데이터에 여러 변수들이 있을 때,
# 서로 상관성이 높은 변수들을 선형 결합으로 이루어진 주성분이라는 새로운 변수를 만들어
# 변수들을 요약하고 축소하는 기법

# 스케일 큰 변수가 주성분에 영향을 많이 줄 수 있으므로, 표준화나 정규화 시켜주어야 함

import pandas as pd
Iris_data = pd.read_csv('../../data/iris.csv')

# 수치형 데이터만 추출
features = ['sepal length', 'sepal width', 'petal length', 'petal width']
x = Iris_data.loc[:, features].values

# 수치형 변수 정규화
from sklearn.preprocessing import StandardScaler
x = StandardScaler().fit_transform(x)
from sklearn.decomposition import PCA
# screeplot으로 주성분 개수 정하는 방법
pca= PCA(n_components = 4)
pca_fit = pca.fit(x)

# 분산설명력
pca_fit.explained_variance_ration_

# 고유값
pca.singular_values_

# Screeplot
import matplotlib.pyplot as plt
plt.title('Scree Plot')
plt.xlabel('number of components']
plt.ylabel('culmulative explained variance')
plt.plot(pca.explained_variance_ration_, 'o-')
pca = PCA(n_components = 2)
principalComponents = pca.fit_transform(x) # array 형태
principalDF = pd.DataFrame(data = principalComponents, columns = ['principal component1', 'principal component2'])
pca.explained_variance_ratio_

'ADP > 실기' 카테고리의 다른 글

분산분석 ANOVA  (1) 2024.01.24
t-test  (0) 2024.01.24
범주형 데이터 전처리  (0) 2024.01.23
결측치 , 이상치 처리하기  (0) 2024.01.23
데이터 표준화, 정규화  (0) 2024.01.23
# 범주형 변수를 표현하는데 가장 널리 쓰이는 방법 : 원핫 인코딩(one-hot encoding)
pd.get_dummies('범주형변수')
pd.get_dummies(data, columns = ['범주형1', '범주형2']

# 원본 데이터에서 범주형 변수 대체
df_dum = pd.get_dummies(df, columns = ['주구매상품', '주구매지점'])

 

# train과 test dataset의 컬럼 개수는 무조건 같아야 함
# 즉, one-hot encoding 고유값 항목이 같아야 함

df.dum.columns[df_dum.columns.isin(df_dum2.columns)==False]

'ADP > 실기' 카테고리의 다른 글

t-test  (0) 2024.01.24
변수 축소  (1) 2024.01.24
결측치 , 이상치 처리하기  (0) 2024.01.23
데이터 표준화, 정규화  (0) 2024.01.23
데이터 샘플링  (0) 2024.01.21

 

import pandas as pd
import numpy as np

air = pd.read_csv('../../data/airquality.csv')
air.info()

air.isna().sum()
air['Ozone'].isna()

tb = air['Ozone'].isna().value_counts()
# 결측치 대치
# 해당 열의 평균 값으로 대치
air['Ozone'] = air['Ozone'].fillna(air['Ozone'].mean())

# 사이킷런을 활용한 결측치 대치 - KNN
from sklearn.impute import KNNImputer
imputer = KNNImputer(n_neighbors = 2)
air_filled = imputer.fit_fransform(air)
pre_air = pd.DataFrame(air_filled, columns = air.columns)
# 이상치 인식
# Ozone 변수에서 이상치를 박스 플롯으로 확인
import seaborn as sns
sns.boxplot(x = 'Ozone', data = air)

# IQR을 이용한 이상치 탐색 함수
def detect_outliers(df=None, column=None, weight = 1.5):
	Q1 = df[column].quantile(0.25)
    Q3 = df[column].quantile(0.75)
    
    IQR = Q3 - Q1
    IQR_weight = IQR * weight
    
    outlier_idx = df[(df[column] < Q1 - IQR_weight)|(df[column] > Q3 + IQR_weight).index
    
    return outlier_idx
out_index = detect_outliers(df=air, column='Ozone')

air.loc[out_index, 'outlier'] = True
air[air['outlier']==True]

# outlier 대체 (중위 값 혹은 평균 값으로)
air.loc[out_index, 'Ozone'] = air['Ozone'].median()

# 기존의 평균, 중앙값 바뀌면서 outlier 다시 발생
# 이때는 outlier 제거

'ADP > 실기' 카테고리의 다른 글

변수 축소  (1) 2024.01.24
범주형 데이터 전처리  (0) 2024.01.23
데이터 표준화, 정규화  (0) 2024.01.23
데이터 샘플링  (0) 2024.01.21
날짜 데이터 핸들링  (0) 2024.01.21

+ Recent posts