kt aivle

kt_aivle5

rainsky 2023. 8. 19. 01:44

오늘까지 알차게 수업을 들었다. 이제 주말이다!

수업이 점점 깊어지는 게 느껴진다. 내가 아는 부분은 쉽지만 모르는 분야나 부분은 어렵다.

 

데이터 분석 및 의미찾기

 

< x(feature), y(target)이 둘 다 연속형(숫자형) >

 

  • 그래프(시각화) : 산점도

숫자 vs 숫자를 비교할 중요한 관점이 '직선'(Linearity)이다.

sns.scatterplot(x='x변수',y='y변수',data=dataframe이름)

 

pairplot

한 번에 모든 산점도 그리기 : 시간이 오래 걸린다.

sns.pairplot(dataframe이름)

 

jointplot

산점도와 각각의 히스토그램을 함께 보여준다.

sns.jointplot(x='x변수', y='y변수', data = dataframe이름)

 

regplot

직선을 함께 그어준다. 관련성 보기가 좋지만, 관련이 없어도 직선을 그어줘서 헷갈릴 수도 있다.

sns.regplot(x='a', y='b', data = df)

 

 

  • 상관분석: 공분산, 상관계수

- 상관계수 𝑟

공분산을 표준화한 값이다.

-1~1 사이의 값인데 -1,1에 가까울수록 강한 상관관계를 나타낸다.

보통은 0.5 이상이 되면 강하다고 볼 수 있다.

0에 가까우면 거의 관계가 없음

import scipy.stats as spst

# 상관계수와 p-value

spst.pearsonr(df['a'], df['b'])

 실행했을 때 튜플이 나오는데 그때 첫 번째 값이 상관계수이고, 두 번째 값이 p-value

이때 값에 NaN이 있으면 계산이 안되므로 .notnull()로 제외해야 한다.

 

대립가설: 차이가 있다.(상관 관계가 있다 : 상관계수가 0이 아니다.)

귀무가설: 차이가 없다.(상관관계가 없다 : 상관계수가 0이다.)

대체적으로 p-value는 작을수록 좋다.

 

단점: 상관계수는 직선의 관계(선형관계)만 수치화해 준다.

직선의 기울기, 비선형 관계는 고려하지 않는다는 단점

 

한꺼번에 상관계수 구하기 - df.corr()

 

heatmap으로 상관계수를 시각화

plt.figure(figsize = (8, 8))

sns.heatmap(df.corr(),
            annot = True,            # 숫자(상관계수) 표기 여부
            fmt = '.4f',             # 숫자 포멧 : 소수점 4자리까지 표기
            cmap = 'RdYlBu_r',       # 칼라맵
            vmin = -1, vmax = 1)     # 값의 최소, 최대값값

plt.show()

 

이변량 분석

< x(feature)가 범주형이고, y(target)가 연속형(숫자형) >

 

  • 시각화: barplot
sns.barplot(x="a", y="b", data=df)

바차트했을 때 나오는 검은 막대기가 신뢰구간, 그게 안 겹치면 차이가 있다.

 

신뢰구간(오차범위)은 좁을수록 믿을만하다.

데이터가 많을수록, 편차가 적을수록 신뢰구간은 좁아 짐.

두 평균에 차이가 크고, 신뢰구간은 겹치지 않을 때 대립가설이 맞다고 볼 수 있다.

 

  • 수치화 : t-test, ANOVA

t 통계량 (두 개의 범주에서만 사용 가능)

두 평균의 차이를 표준오차로 나눈 값

보통, t 값이 -2보다 작거나, 2보다 크면 차이가 있다고 본다.

 

두 그룹으로 데이터를 저장 후 t-test를 한다.

spst.ttest_ind(a1, a2)

ANOVA - 셋 이상 집단(범주) 일 때 사용

분산분석

F 통계량 값이 대략 2~3 이상이면 차이가 있다고 판단

 

분산분석을 하기 위해 범주를 여러 개로 쪼갠다.

spst.f_oneway(a1, a2, a3)

 

< x(feature), y(target)이 둘 다 범주형 >

범주와 범주 비교하고 분석하기 위해서는 먼저 교차표(pd.crosstab) 만들어야 한다.

cross = pd.crosstab(행, 열, normalize = )
# normalize = 'columns', ‘index’, ‘all’

 

  • 시각화: mosaic

예)

mosaic(dataframe, [feature, target])
plt.axhline(1- df['a'].mean(), color = 'r')
plt.show()

 

  • 수치화: 카이제곱검정

범주형 변수들 사이에 어떤 관계가 있는지, 수치화 하는 방법

클수록 기대빈도로부터 실제 값에 차이가 크다는 의미(기대빈도와 실제 데이터의 차이)

보통, 자유도의 2~3배 보다 크면, 차이가 있다고 본다.

 

범주형 변수의 자유도 : 범주의 수 - 1

카이제곱검정에서는 (x 변수의 자유도) × (y 변수의 자유도)

(x 변수의 자유도) × (y 변수의 자유도) * (2~3배)보다 카이제곱 통계량이 크면 차이가 있다고 본다.

 

카이제곱 통계량을 구하기 위해서는 먼저 교차표를 집계한 후 카이제곱검정을 해준다.

df = pd.crosstab(d['a'], d['b'])
spst.chi2_contingency(df)

 

< x(feature)가 연속형(숫자형)이고, y(target)가 범주형 >

 

  • 시각화 : kdeplot
sns.kdeplot(x='a', data = df, hue ='b', 
            common_norm = False)
# common_norm = False면 각각 면적이 1이라는 뜻
# common_norm = True (기본값) : 둘의 면적을 합쳐서 1이라는 뜻

# 그래프가 겹치는 부분은 전체 평균이다.

sns.kdeplot(x='a', data = df, hue ='b'
            , multiple = 'fill')
# multiple = 'fill' - 비율을 비교해 볼 수 있다.

 

수업에서 몰랐던 부분들을 많이 알게 되어서 좋다. 특히 시각화와 수치화를 배우며 그것으로 상관관계를 분석해 보는 중요한 시간을 가져서 분석지식이 올라간 것 같다.