KT 에이블스쿨 8일차(1)

박기범·2023년 2월 9일
0

에이블스쿨

목록 보기
12/95

8일차는 다양한 시각화 수치화 도구들과 함께 데이터의 해석력을 기르는 공부를 했습니다.



두 변수의 관계 분석(이변량분석)_숫자 -> 숫자

x와 y의 관계에 대해 그래프로 분석하기 위한 도구가 많이 있습니다. 하지만 도구들마다 한계가 있으니 꼭 그래프가 정답이라고 생각해서는 안됩니다.

x가 숫자형이고 y가 숫자형일 경우의 시각화와 수치화

시각화하는 방법을 먼저 알아보겠습니다.

▶scatter(산점도)
산점도란 수치를 그대로 점으로 찍어서 그래프로 나타내는 것을 산점도라고 합니다. 이때 중요한 것은 얼마나 직선모양에 가까운지가 중요합니다.

문법은 아래와 같습니다.

	plt.scatter(데이터프레임명['컬럼명1'], 데이터프레임명['컬럼명2'])
	plt.show()

데이터프레임의 컬럼명1, 2의 관계를 알 수 있습니다. x축은 컬럼명1, y축은 컬럼명2로 설정해주었습니다.


※강한 관계와 약한 관계※
만약 더 강한 관계의 변수이면 산점도의 그래프 모양이 직성 모양에 가깝습니다. 약한 관계일 경우에는 직선에 비해 더 퍼진 모양의 그래프로 나타납니다.


▶pairplot
데이터프레임을 통으로 집어넣으면 숫자형 변수에 대한 모든 산점도를 보여주는 시각화 도구입니다.

	sns.pairplot(데이터프레임명)

하지만 시간이 걸린다는 단점이 있고 일일이 확인하기 어렵다는 단점이 있어 실전에서는 잘 사용하지 않습니다.

▶joinplot
joinplot은 산점도와 히스토그램을 같이 보여주는 시각화 도구입니다.

	sns.jointplot(x='컬럼명1', y='컬럼명2', data = 데이터프레임명)
	plt.show()

위와 같이 사용하면 산점도뿐 아니라 히스토그램도 같이 보여줍니다.

▶regplot
산점도와 직선을 같이 보여주는 시각화 도구입니다.

    sns.regplot(x='컬럼명1', y='컬럼명2', data = 데이터프레임명)
    plt.show()



수치화하는 방법을 알아보겠습니다.
수치화란 눈으로 그래프를 살펴보면 관계를 한번에 파악하기 어렵다는 단점이 있습니다. 그래서 관계를 숫자로 계산해서 비교합니다.
관계를 수치화하는 것은 상관계수 상관계수가 유의미한지를 검사하는 것이 상관분석ㅇㅂ니다.

▶covariance(공분산), correlation coefficient(상관계수)
각 점들이 얼마나 직선에 모여있는지를 계산합니다.

▶상관계수
상관계수는 'r'로 표현이 됩니다. -1 에서 1사이의 값이며 상관계수끼리 비교가 가능합니다. -1 또는 1에 가까울수록 강한 상관관계를 의미합니다. 상관계수의 크기로 판단할 수는 없지만 상관분석을 통해서 test(검증)가 가능합니다.

▶상관분석
scripy.stats를 이용하여 상관분석을 할 수 있습니다.
사용환경 세팅은 아래와 같습니다.

	import scipy.stats as spst

scripy.stats를 사용하면 상관계수와 p-value를 구할 수 있습니다.
문법은 아래와 같습니다.

spst.pearsonr(데이터프레임['컬럼명'], 데이터프레임['컬럼명'])

위 코드를 실행하면 검색결과가 튜플형태로 나오는데 첫번째 값은 상관관계의 수치를 알려주고 두번째 값은 p-value를 알려줍니다.

상관관계가 어느정도면 강한관계인지 중간인지 약한인지 궁금할 수 있습니다. 아래의 기준은 절대적인 기준이 아닌 대략적인 기준이므로 그냥 참고만 하면 됩니다.
절대값 상관계수를 기준으로 0.5에서 1 사이이면 강한관계 0.2에서 0.5사이이면 중간 0.1에서 0.2면 약한 0에서 0.1이면 거의 관계가 없다고 참고만 하시면 됩니다.

p-value란 관계를 수치화한 값(상관계수)이 유의미한지 판단하는 숫자가 바로 p-value입니다.
만약 p-value의 값이 0.05보다 작다면 두 변수간의 관계가 있다고 판단하고 0.05보다 크거나 같다면 두 변수간의 관계는 없다고 판단합니다.


▶corr
데이터프레임의 수치형 변수들을 한번에 비교하여 상관계수를 구해줍니다.

	데이터프레임명.corr()

위와 같이 코드를 작성해주면 한번에 데이터프레임의 모든 수치형 변수에 대해서 상관계수를 구해줍니다.


※NaN 결측치를 확인하는 방법※
데이터프레임명.info()를 사용해주면 각 변수의 데이터 건수를 보면 전체 행보다 적은 데이터 건수를 가지고 있는 변수들은 NaN 즉 결측치가 존재함을 알 수 있습니다. 또는 데이터프레임명.isna().sum()을 사용해주면 NaN만 몇 개가 있는지 알려줍니다.


※상관계수의 한계※
상관계수는 직선의 관계만 수치화 해주기 때문에 직선의 기울기와 비선형의 관계를 고려하지 않습니다.

두 변수의 관계 분석(이변량분석)_범주->숫자

x가 범주, y가 수치형인 데이터를 시각화하고 수치화해서 분석합니다. 범주와 숫자를 비교하는 방법으로는 평균비교가 있습니다. 평균비교에는 barplot이 있고 범주가 2개 있는 경우에는 두 평균의 차이를 비교하고 범주가 3개 이상인 경우에는 전체 평균과 각 범주의 평균을 비교합니다.

분산과 표준편차
한 집단을 설명하기 위해서 대푯값으로 평균을 계산했을 때 평균으로부터 얼마나 벗어났는지를 의미합니다.

표본을 뽑는 이유는 모집단을 추정하기 위한 목적입니다. 예를들어 표본을 가지고 평균을 냈다는 것은 모집단의 평균을 알고 싶어서 하는 것이라고 이해하면 됩니다.




시각화 도구에 대해 알아보겠습니다.

▶barplot
평균을 비교하는 barplot 시각화 도구입니다.
두 평균의 차이가 크고, 신뢰구간이 겹치지 않으면 대립가설이 맞다고 볼 수 있습니다.
신뢰구간은 오차범위라고도 하며 좁을수록 믿을 수 있습니다. 데이터가 많을수록 편차가 적을수록 신뢰구간은 좁아집니다.




수치화 도구에 대해 알아보겠습니다.

▶t-test와 anova
둘 다 범주형 x와 숫자형 y의 관계를 검정하는 도구입니다. 평균을 비교하여 차이를 testing합니다.

▶t-test
두 그룹간 평균에 차이가 있는지 비교합니다. t통계량은 두 그룹의 평균 간 차이를 표준오차로 나눈 값입니다. 두 평균의 차이라고 생각해도 됩니다.
t-test를 실행하면 t통계량과 p-value를 구할 수 있는데 p-balue가 0.05보다 잗으면 차이가 있다고 보면 됩니다.

	died = temp.loc[temp['Survived']==0, 'Age']
    survived = temp.loc[temp['Survived']==1, 'Age']
    spst.ttest_ind(died, survived)

예시로 타이타닉의 데이터를 사용했습니다. 자세히 살펴보면 died와 survived로 그룹을 나누어 생존인 경우의 나이와 죽은사람의 나이로 두 개의 그룹을 만들고 두 그룹에 대한 t-test를 하는 코드입니다.

▶분산 분석 (ANalysis Of VAriance 줄여서 ANOVA)
여러 집단 간의 차이를 비교할 때 사용합니다. 기준을 전체평균으로 잡습니다. 분포를 알면 판정을 할 수 있습니다. 만약 값이 2~3이상이면 차이가 있다고 판정할 수 있습니다.

분산 분석은 각 그룹간 차이가 있는 지 없는 지에 대해서만 알려주기 때문에 어느 그룹간에 차이가 있는지 알 수 없습니다. 따라서 사후분석을 진행해주어야 합니다.(사후분석은 각 그룹별로 t-test를 진행하는 것을 의미)

temp2 = titanic.loc[titanic['Embarked'].notnull()]
s = temp2.loc[titanic['Embarked'] == 'S', 'Fare']
c = temp2.loc[titanic['Embarked'] == 'C', 'Fare']
q = temp2.loc[titanic['Embarked'] == 'Q', 'Fare']
spst.f_oneway(s,c,q)

temp2는 타이타닉의 결측치를 제거한 데이터프레임입니다. 3개 이상의 변수이기 때문에 분산분석을 사용한 코드입니다. 3개 이상의 변수일 경우 f_oneway를 사용합니다.







이번 수업에는 다양한 도구들과 이변량 분석에 대해 배웠습니다. 익숙해야될 것이 점점 많아져서 너무 행복합니다.




※공부하고 있어 다소 틀린점이 있을 수 있습니다. 언제든지 말해주시면 수정하도록 하겠습니다.
※용어에 대해 조금 공부 더 해서 수정하겠습니다.

profile
개발자가 되기 위한 한걸음

0개의 댓글