일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 2023공빅데
- 공공빅데이터청년인재양성
- Kaggle
- decisiontree
- 공공빅데이터청년인턴
- Keras
- ADsP3과목
- 분석변수처리
- 공빅
- 데이터분석
- DL
- 2023공공빅데이터청년인재양성후기
- 클러스터링
- 데이터전처리
- 2023공공빅데이터청년인재양성
- machinelearning
- ADSP
- NLP
- data
- k-means
- datascience
- 오버샘플링
- 빅데이터
- DeepLearning
- ML
- 머신러닝
- textmining
- SQL
- 텍스트마이닝
- 공빅데
- Today
- Total
愛林
[Python/Data] 탐색적 데이터 분석(EDA) - 다변량 데이터 분석 본문
변량 (Variate)
변량이란 , 변수가 가지는 특징, 성질을 숫자 또는 문자로 나타낸 값을 의미한다 .
단변량, 이변량, 다변량이 있다.
단변량은 하나의 변수만을 측정해서 얻는 변수의 값이다. 데이터를 요약하거나 패턴을 확인하는 게 주 목적이고,
평균, 분산, 막대 그래프 등으로 표현할 수 있다.
이변량은 두 개의 변수를 측정하는 것으로, 보통 두 변수 간의 관계를 분석한다.
상관관계 분석, 산점도, 회귀분석 등이 대표적으로 이변량 데이터 분석의 방법이다.
다변량은 두 개 이상의 변수를 측정해서 얻어지는 값이다.
변수가 많은만큼 그 변수들 사이의 유사성과 근접성을 확인한다.
판별분석, 주성분분석(PCA) 등을 이용한다. 예를 들면 감기가 걸린 여성의 원인은
나이, 성별, 몸무게 등과 관계가 있을 지 살펴 보는 것이 있다.
우리는 여기서, 다변량 데이터를 분석하는 방법에 대해서 알아볼 것이다.
다변량 데이터 분석법은,
변수들 사이의 관계를 분석하고, 인과관계의 확인 및 많은 변수와 유사성을 확인해서 정보를 효과적으로
추출하기 위한 방법이다.
변수들간의 관계 확인법, 차원축소법, 개체 분류법이 있다.
변수들 간의 관계를 확인할 수 있는 방법으로는
다중회귀분석, 로지스틱회귀, 분산분석(ANOVA), 다변량분산분석, 상관관계분석, 교차표 분석들이 있다.
데이터의 차원축소법으로는
주성분분석 (PCA), 요인분석(FA), 정준상관분석이 있다.
개체 분류법으로는 정준판별분석, 로지스틱 판별분석, 군집분석, 다차원척도법이 있다.
실습을 통해 바로 알아보자.
상관관계 분석 실습
상관관계 분석은. 상관계수를 이용해서 통계적 유의성을 찾아낸다.
두 변수 간의 선형적관계(비례식)가 존재하는 지에 대해 분석한다.
상관관계 분석의 가정사항은
이변량 (비교 가능한 두 변수 존재) 변수 중 하나의 변수는 정규분포를 이루어야 하고,
연속형 두 변수 사이에는 선형적인 관계가 존재하는 것을 확인해야 한다.
관계의 크기는 상관계수 (Correlation coefficident) 로 확인한다.
상관계수에는 피어슨, 스피어만, 켄달 상관계수가 있는데, 보통은 피어슨 상관계수를 말한다.
피어슨 상관계수는 두 변수 X,Y 가함께 변하는 정도 (공분산) / X,Y가 각각 변하는 정도 (표준편차)
의 값으로 정의한다.
참고로 피어슨 상관계수는 공분산을 표준화한 값이다. (식을 보면 알겠지만)
바로 실습해보자.
import pandas as pd
import warnings
warnings.simplefilter(action = 'ignore', category = FutureWarning)
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
# 깨짐 방지를 위한 Font 지정
import os
if os.name =='nt' :
font_family = "Malgun Gothic"
else :
font_family = "AppleGothic"
# 값이 깨지는 문제 해결을 위해 파라미터값 설정
sns.set(font=font_family, rc = {"axes.unicode_minus" : False})
필요한 패키지 import.
## 데이터셋 준비
# iris 붓꽃 데이터 로드
from sklearn.datasets import load_iris
iris= load_iris()
# print(iris.DESCR) -> 붓꽃 데이터의 상세정보 확인 가능
# 붓꽃 데이터 특성 확인
columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width']
# 데이터 생성 및 준비
data = pd.DataFrame(iris.data, columns = columns)
sy = pd.Series(iris.target, dtype= 'category')
sy = sy.cat.rename_categories(iris.target_names)
data['species'] = sy
# 필터명 정의
cols = iris.feature_names
data.head()
우리는 오늘 iris 붓꽃 데이터를 이용해서 실습해볼 것이다.
우리가 만든 데이터프레임에 들어있는 iris 데이터이다.
cov() 를 이용해서 공분산을 알아보자.
df_cov = data.cov()
df_cov
공분산을 가지고 히트맵을 만들어보자.
ax = sns.heatmap(df_cov, annot = True)
ylim = ax.get_ylim()
ax.set_ylim(ylim[0]+0.5, ylim[1]-0.5)
plt.show()
양수라면 양의 상관관계,
음수라면 음의 상관관계를 가진다는 것을 알 수 있다.
0에 가깝다면 거의 상관이 없다는 것이다.
공분산은 선형적인 관계를 측정하기때문에 두 변수가 비선형적으로 함께 변하는
경우는 잘 측정하지 못 한다는 특징이 있다.
그리고 공분산은 상관관계의 크기를 알 수는 없다.
오직 상관관계의 방향만을 알려주는 특징이 있다.
상관관계의 크기를 알고 싶다면, 상관계수를 알아야 한다.
corr() 함수를 사용해서 상관계수를 구해보자.
correlation_matrix = data.corr()
correlation_matrix
상관계수가 절대값 1에 가까울수록 상관도가 높은 것이다.
- 라면 음의 상관관계,
+ 라면 양의 상관관계를 갖는다.
# 상관계수 히트맵
ax = sns.heatmap(correlation_matrix, annot=True)
ylim = ax.get_ylim()
ax.set_ylim(ylim[0] + 0.5, ylim[1]-0.5)
plt.show()
똑같이 히트맵을 만들어보았다.
petal_length 와 petal_width 는 상관관계가 아주 큰 것을 볼 수 있다. (0.96이니까)
이번엔 산점도 행렬을 통해서 시각화시켜보자.
산점도 행렬 (Scatter Matrix) 는 여러 변수들을 조합한 산점도와 데이터 분포 , 밀집도, 그리고
자료 분포에 존재하는 패턴들을 식별할 때 사용한다.
pairplot() 을 사용하면 산점도 행렬을 볼 수 있다.
sns.pairplot(data, diag_kind = 'hist')
plt.show()
확실히 산점도 행렬로 보았을 때 선형이 나오는 곳이 상관계수가 1에 가까웠던 곳임을 알 수 있다.
대각선 방향으로는 열의 히스토그램을 보여주고 있다.
개별 산점도도 볼 수 있다.
data.plot(kind = 'scatter', x='sepal_length', y='petal_width')
plt.show()
위랑 똑같이 잘 나왓다.
sepal width 와 petal width 데이터를 살펴보자.
상관계수와, p-value 를 알아보자.
import scipy.stats as sp
corr_values, pval = sp.pearsonr(data['sepal_length'], data['petal_width'])
print('상관계수 : ', corr_values)
print('p_value : ', format(pval, '.55f'))
상관계수 : 0.8179411262715757
p_value : 0.0000000000000000000000000000000000002325498079793166956
위에서 나온 것처럼 상관계수는 0.82 정도,
p-value 는 유의수준 0.05보다 작으니까, 기각역에 속하게 된다.
그러므로 귀무가설 (둘은 상관관계가 없다.) 을 기각한다.
아무튼 상관관계가 있다는 것이다.
교차분석 실습
교차분석 실습을 해보자.
cross_data = pd.DataFrame(
{'영양제' : ['복용','복용','복용','복용','복용','복용','복용','복용',
'복용','복용','복용','복용','복용','복용','복용','복용',
'복용','복용','복용','복용',
'미복용','미복용','미복용','미복용','미복용','미복용',
'미복용','미복용','미복용','미복용','미복용','미복용',
'미복용','미복용','미복용','미복용','미복용','미복용',
'미복용','미복용',],
'감기여부' : ['유','유','유','유','유','무','무','무','무','무',
'무','무','무','무','무','무','무','무','무','무',
'유','유','유','유','유','유','유','유','유','유',
'유','유','무','무','무','무','무','무','무','무'
]
}
)
cross_data.head(5)
필요한 데이터를 만들어주었다.
영양제 복용과 감기여부에 대한 데이터를 만들어준것이다.
## 계산하기 위한 교차표
data_crosstab = pd.crosstab(cross_data['영양제'], cross_data['감기여부'], margins=True)
교차표를 생성해주었다.
이제 교차표를 통해 상관관계를 알아볼 것이다.
카이제곱값을 구해보자.
from scipy.stats import chi2_contingency
카이제곱 통계량 계산을 위해 불러와주고,
result = chi2_contingency(observed=data_crosstab, correction=False)
print('1. 카이제곱 통계량 :', result[0])
print('2. p-value :', result[1])
print('3. df:', result[2]) # (행의 개수 -1) * (열의 개수 -1)
print('4. 기대값 행렬:')
pd.DataFrame(result[3]).rename(index = {0:'복용', 1:'미복용', 2:'합'}, columns = {0:'유', 1:'무', 2:'합'})
chi2_contingency() 함수를 가지고 오면,
카이제곱 통계량, p-value, 자유도, 기대값 행렬을 모두 가지고 올 수 있다.
95% 신뢰수준 통계량은 3.84인데 카이제곱 통계량이 5.0 으로 통계량보다 크므로,
채택역에 해당한다.
p-value 도 0.05 유의수준보다 훨씬 큰 0.29정도의 값을 가지고 있으므로,
귀무가설을 채택한다.
영양제 복용 그룹과 그렇지 않은 그룹은 차이가 없다.
영양제 효과가 없다. 라는 가설을 채택한다.