티스토리 뷰
[에이블스쿨] 6일차 - 데이터 해석 및 의미찾기(중요) - 가설검정, 검정 통계량, 이변량 분석(숫자-숫자),상관분석
sikaro 2024. 2. 28. 15:03데이터 분석에서 가장 중요한 파트.
단변량 분석이든 다변량 분석이든 데이터와 비즈니스에 대해 더 잘 이해하기 위해 필요한 것이다.
가설 확인, 전처리 대상 정리
분포의 밀집과 희박한 정도를 보고 판단하는 데에는 한계가 있다.
그래서 현장에 간다.
제강 라인이 어떻게 흘러가는지 보고, 데이터가 어떤 상황에서 수집되었는지 알아야 한다.
불량이 어떤 과정에서 일어나는지를 알아야 한다.
eeg나 FFT도 다 공부해야한다.
결측치는 조치 대상이다.
이상치 영향을 받는 선형, 로지스틱 회귀
그 외에 알고리즘들은, KNN,결정 트리,앙상블 알고리즘 등 이상치 분류할 수 있기 떄문에 잘 관심을 두지 않는다.
피처 스케일링 대상인지에 대한 것도 배우게 된다.
전처리에 대한 관심이 조금 줄어들고 있다.
EDA & CDA의 목적은 데이터를 더 잘 이해하기 위한 것이다.
밀도함수는 사실 모집단 확률추정을 하기 위한 확률 추정 그래프이다.
전체를 계산하기 어려우므로, 모집단에서 표본을 추출하여 전체를 예측하기 위해 가설을 세운다.
IQR = 1.5를 곱하는 이유는 정규분포일때 이상치를 판정하는 기준
Z-score -2~2 정도의 95% 신뢰구간이랑 비슷해서 사용한다.
가설검정 (과학 연구 절차)
가설 수립, 데이터 수집
가설검정 P-value < 0.05? = 얼마나 데이터와 fit 한가?
yes면 대립가설 채택 전에 동료 검토
아니면 다시 가설 업데이트
모집단(Population)과 표본(Sample)
모집단 : 우리가 알고 싶은 대상 전체 영역(데이터)
표본 : 그 대상의 일부 영역(데이터)
항상 일부분으로 전체를 추정하고자 한다.
그래서 표본을 가지고 가설이 그런지에 대한 검증을 한다.
우리의 관심은 결국 모집단이다.
표본에서 만들어낸 결과가 얼마나 모집단에서 유의미한가를 검증하는 게 가설검정이다.
X->Y의 표현식 : 독립변수 X가 Y를 결정한다.
만약 분포를 안다면 판단이 가능하다.
귀무가설과 대립가설
Y에 영향을 주는 요인(X)들을 뽑아서 초기 가설을 수립한다.
이미 있는 주장 -> 귀무가설 H0 (X와 Y가 관련이 없다.)
나의 주장 -> 대립가설 H1 (X가 Y와 결정한다.)
표본으로부터 대립가설을 확인하고 모집단에서도 맞을 것이라 주장하는 것이다.
내가 세운 가설과의 차이의 값이 큰 지 작은 지는 어떻게 판단하는가?
판단 기준 : p-value
0.05% 혹은 좀 더 보수적인 기준으로 0.01%를 사용한다.
0.05보다는 p-value가 작아야 차이가 있다고 판단된다.
A매장 수요량과 B매장 수요량의 차이 분포를 세워놨을 때,
전체 면적이 1이고, 기준값인 x가 있다면, x 이상의 면적을 계산하는 것이 p-value이다.
즉, x이상의 면적의 크기가 작을수록 차이가 있다고 판단한다.
만약 x가 -값으로 나오면?
양측 검정을 한다.
1. A 매장과 B 매장 중 어디의 수요량이 더 큰가 -> 단측검정
2. 매장 간 수요량의 차이가 있는 것인가? -> 양측 검정
검정 통계량
검정(차이가 있는지 없는지 확인) 하기 위한 차이 값
- t 통계량
- x^2 (카이제곱) 통계량
- f 통계량
세 개의 특징은 차이 값이다. 어떤 기준에서 얼마나 차이가 있는지에 대한 개념이다.
이들은 기준 대비 차이로 계산 된다.
계산된 통계량 -> 각자의 분포를 가진다.
분포를 통해서 그 값이 차이가 큰지, 작은지 판단 가능하다.
이를 손쉽게 판단할 수 있게 계산한 것이 p-value이다.
따라서 가설검정은
1. 가설을 세운다
2. p-value를 구한다. 0.001이라면, 유의수준보다 작으므로 우리가 세운 가설이 맞을 것이라고 판단할 수 있다.
이게 가설 검정이다.
사실 독립성 정규성 등분산성을 전제해야 한다.
0.05 이상이면 대립가설로 설정한 사건이나 단서가 우연에 의해서 발생했을 확률이 크다고 판단한다.
이변량 분석 (숫자 -> 숫자)
1. 그래도 점을 찍어서 그래프를 그려 본다 -> 산점도(scatter)
2. 점들이 얼마나 직선에 모여 있는지를 계산한다 -> 공분산, 상관계수(covariance,corrleation)
선형적 증가면 양의 상관관계, 감소면 음의 상관관계
직선의 관계가 있는지를 살펴본다.
plt.scatterplot('x변수','타깃값',data=df)
sns.scatterplot(x='x변수',y='타깃값',data=df)
온도가 올라갈수록 범위가 spread된다.
이런 것들로 알 수 있다.
1. 가장 먼저 봐야 하는 것 => 직선의 관계가 있는가?
2. 여러가지 이변 그래프에서, 타깃값과 가장 강한 관계의 x변수는 무엇일까?
관계가 강하냐 아니냐는 해당하는 그래프(여기선 직선) 근처에 많이 모여있어야 한다.
Robust 해야 한다. 그 정도면 맞다 치고 넘어간다.
도구들도 각각 한계가 있다. 보이는 게 전부가 아님을 꼭 명심.
머신러닝 중에서 어떤 알고리즘은 NaN이 있어도 되나, 일단 NaN은 제거하는 방향으로 해야 한다.
그래프를 그렸으면 무엇이 보이는지 판단해야 한다.
무엇이 보이는가?
상호간의 산점도를 그려주는 pairplot도 있는데, 실전에는 잘 안쓴다.
sns.pairplot(df)
눈으로 보이는 건 한계가 있다. 따라서 숫자로 판단도 같이 해야한다.
jointplot, regplot
joinplot은 산점도와 각각의 히스토그램을 함께 보여준다.
sns.jointplot(x='독립변수', y='타깃값', data = df)
plt.show()
regplot은 직선을 scatterplot과 같이 그려주나, 직선 관계가 있다고 착각하게 만든다.
sns.regplot(x='독립변수', y='타깃값', data = df)
plt.show()
수치화 : 상관계수, 상관분석
눈으로 보는 건 쉽지 않다.
그래서 숫자로 계산해서 비교한다. 상관계수
상관계수가 유의미한지를 검정하는 걸 상관분석이라고 한다.(p-value로)
상관계수는 r로 표현된다. 공분산을 표준화한 값이다.
-1~1사이의 값이고, 상관계수 끼리 비교 가능하다.
-1,1에 가까울 수록 강한 상관관계를 나타낸다.
경험에 의한 대략의 기준(절대적인 기준이 절대 아니다. 어떤 곳은 0.7이라는 곳도 있다)
강한 : 0.5~1
중간: 0.2~0.5
약한 : 0.1~0.2
없음 : <=0.1
다양한 사람들이 다양한 의견을 한다. 그냥 적절하게 판단하는 기준으로만 알아둬라.
scipy.stats 모듈의, pearsonr 상관분석 함수를 사용한다.
결과는 (상관계수, p-value) 형태로 나온다.
상관계수는 p-value가 거의 0이 나오면,상관관계가 관계가 있다는 이야기이다.
주의 : NaN이 있으면 계산되지 않는다. 그래서 notnull로 계산한다.
상관계수가 크다 -> 관계가 강하다
p-value가 0에 가깝다 -> 관계가 있다.
scipy.pearsonr(df['x변수'], df['y변수'])
> PearsonRResult(statistic=0.6833717861490114, pvalue=2.197769800200284e-22)
x와 y의 관계가 강하며, 관계가 있다.
즉, 여기서 p-value의 귀무가설은 상관관계가 없다이고, 대립가설은 상관관계가 있다이다.
한꺼번에 상관계수를 구하려면 .corr()를 쓰면 된다.
df.corr()
여기는 상관관계만 나오기 때문에, p-value는 따로 구해야 한다.
상관이 있는지 아닌지에 대한 t 검정
=> 즉 여기서는 t 통계량에 대한 분포를 기반으로 p-value가 튀어나온 것이다.
가장 강한 상관관계는 누구냐? -> 절대값이 높은 것
heatmap으로 시각화
plt.figure(figsize = (8, 8))
sns.heatmap(air.corr(),
annot = True, # 상관계수 표기 여부
fmt = '.2f', # 소수점 3자리까지 표기
cmap = 'RdYlBu_r', # 컬러
vmin = -1, vmax = 1) # 최소, 최대
plt.show()
corr만 안쓰고 heatmap과 같이 쓴다.
NaN이 있을 때
df.isna().sum()
temp = df.loc[df['Solar.R'].notnull()] #전체 데이터 프레임에서, 해당하는 인덱스만 가져온다.
scipy.pearsonr(temp['S'],temp['O'])
0.28정도면 그냥 관계가 있다고 판단하면 된다.
판단과 해석
PearsonRResult(statistic=-0.4685359335677671, pvalue=5.637733627690444e-29)
#집단이 왜 구분이 되지? 650이상
#재산세는 높은데 집값은 낮게 형성
#더 강한 관계가 맞는가? -> 보이는 게 전부는 아니다. 그냥 관계까 있다는 것만 판단
PearsonRResult(statistic=-0.507786685537562, pvalue=1.6095094784727943e-34)
재밌는 그래프다.
수치형을 범주, 혹은 그룹별로 바꿔보려고 하면 비슷하다.
평균을 보면 계단식으로 만들어진다. 그래서 수치를 쪼개서 볼 수도 있다.
추가분석
1~14는 어떤 특징? -> 부촌
14~20은 어떤 특징? ->평범
25 이상은 어떤 특징? -> 아마도 슬럼가
많은 그래프를 보면서 시도할 때 그 특징이 나타난다.
상관계수의 한계
상관계수는 직선의 관계만 수치화해준다.
직선의 기울기, 비선형 관계를 고려하지 않는다.
상관계수가 주는 정보를 그냥 적절하게 받아들이는 게 좋다.
곡선의 관계이거나 그 외의 관계는 고려하지 못한다.
그나마 스피어맨 계수.
상관계수로는 0이 나오지만, 산점도는 원의 형태가 나올 수도 있다.
산점도를 보고 판단을 하지, 값을 잘 구하지는 않는다.
x와 y의 평균, 표준편차, 상관계수가 전부 거의 비슷해도 꼭 같은 그래프는 아니다.
종합실습
def all(data,var):
plt.figure(figsize=(12,3))
plt.subplot(1,2,1)
sns.scatterplot(x=var, y = target, data = data)
plt.subplot(1,2,2)
sns.regplot(x=var, y = target, data = data)
sns.jointplot(x=var, y = target, data = data)
plt.show()
중간 프라이스가 적다. 왜 적은가?
그걸 기준으로 둘을 나눠서 분석해도 가능할 것 같다.
p-value가 0.2다.
일단은 상관관계가 없다고 봐도 무방하다.
그래프와 p-value와 통계량은
전제 조건(독립성,정규성,등분산성) 이 충족되야 그 값이 믿을만 하다.
앙상블 학습에서 RFECV 활용?
RFE는 변수의 개수를 지정하면서 모델 학습
RFECV는 낮은 변수 중요도를 자동으로.
보통 모델학습은 상관계수를 포함해서 변수중요도를 구해서, 그 이후에 변수 선택을 한다.
이 단계는 변수선택법으로 상관분석을 하는 게 아니다.
너무 복잡하게 생각하지 말고, 일단 이 단계에서는 그냥 그렇구나 정도로 판단하고 넘어간다.
판단이 틀려도 모델링에서 전혀 큰일나지 않는다.
의문 : 그런데 왜 경쟁사 가격이 왜 별로 영향을 안 미치지?
제품을 구매할 떄 비교해본다. 성능, 가격 비교.
자사 가격만 보고 판매량을 살펴 볼 수는 없다.
가설이 틀린 것.
즉, 경쟁사 가격에 따라서 경쟁사 대비 우리 자사의 가격 경쟁력에 따라서 달라질 것이라는 게 맞다.
data['P_Diff']=data['CP'] -data['P']
data.head()
이걸로 그래프를 그리면?
상관계수 : 0.5979217124533921, p-value : 3.877120641788767e-40
실전에서는 이렇게 얼마나 의미있는 가설을 만들어내느냐에 따라서 가장 좋은 판단을 할 수 있다.
기초 단계는 구매할 수 있는 인구를 보아야 한다.
즉, 가설을 다시 분석하고 업데이트 해야 한다.
전문가들은 어떤 기술을 썼는지 관심이 없다.
어떻게 피드백을 했는지에 대한 게 궁금하다.
그래서, 데이터를 파악해보았느냐에 대한 걸 궁금해한다.
나이도 연령대별 인구수, 연령대별 인구 비율을 나타내야 한다.
그래서 스터디 하기 가장 좋은 게 데이터 분석이다.
여러 의견이 나와야 하므로.