오늘까지 알차게 수업을 들었다. 이제 주말이다!
수업이 점점 깊어지는 게 느껴진다. 내가 아는 부분은 쉽지만 모르는 분야나 부분은 어렵다.
데이터 분석 및 의미찾기
< 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' - 비율을 비교해 볼 수 있다.
수업에서 몰랐던 부분들을 많이 알게 되어서 좋다. 특히 시각화와 수치화를 배우며 그것으로 상관관계를 분석해 보는 중요한 시간을 가져서 분석지식이 올라간 것 같다.
'kt aivle' 카테고리의 다른 글
| kt_aivle7_웹크롤링 (0) | 2023.08.29 |
|---|---|
| kt_aivle6_클래스 (1) | 2023.08.28 |
| kt_aivle4 (0) | 2023.08.18 |
| kt_aivle3 (0) | 2023.08.11 |
| kt aivle_2 (0) | 2023.08.10 |