codestates / codestates/ds-blog

Iris 데이터 주성분 분석

Open
#134 1 comment 0 reactions 0 assignees View on GitHub
Dominant language
No language data
Stars
2
Forks
4
PR merge metrics
No merged PRs in 30d

Description

# Iris 데이터 주성분 분석


## 소개
~~이 포스트는 파이썬으로 데이터를 분석할 때 전체 데이터의 특징을 잘 설명할 수 있는 특징적인 몇 가지 요소를 찾아내는 일명 **주성분 분석**에 대해 소개하는 글이다.~~


## PCA(Principal Component Analysis, 주성분 분석)

주성분 분석은 통계적인 의미에서 **적은 수의 특징으로 특정 현상을 설명** 하려고 할 때 주로 사용한다. 간단하게 다양한 특징들 중에 어떤 현상을 가장 잘 설명하거나 표현할 수 있는 것 - **주성분을 찾는 일** 이라고 생각하자. 머신러닝에서 주성분 분석의 목적은 모델의 성능 강화이다. 주성분을 찾아 데이터간의 관계나 해석을 용이하게 하는데 그 목적이 있다.

특징이라는 것이 데이터 분석에서는 **feature** 라고 표현되며 feature가 많을수록 고차원의 데이터라고 한다. 다르게 표현하면 주성분 분석은 **차원을 축소** 하기 위해 사용된다. 차원을 축소하는 방법에는 1) Feature Selection과 2) Feature Extraction이 있고, PCA는 Feature Extraction에 해당한다.

>
> Feature Selection과 Feature Extraction에 대해 궁금한 분은 아래의 영상을 참고하기 바란다.
>
> [Feature Selection vs Feature Extraction](https://www.youtube.com/watch?v=pr5LXi4U10c)
>


## 주성분(Principal Componenet)
>
> 특징적인 몇 개의 주성분으로 전체(정확하게는 대부분)를 설명하는 다변량분석법 활용
>

여러 개의 Quantiative Variable(양적 변수)들 사이의 관계를 분산-공분산 관계를 이용해 변수들의 선형결합(Linear Combination)으로 보이는 것(주성분)을 찾아낸다. 원리는 **직교 관계의 표준선형 결합** 집합을 찾는 것인데 말이 조금 어렵다. 전체 분산의 대부분을 설명하는 몇 개의 특징을 찾는데, 이때 원본 데이터의 손실을 최소화하면서 전체 데이터를 잘 설명할 수 있는 변수들의 선형조합을 찾는 것이라고 이해하자.


🚨 **주의**
원본 데이터의 손실을 최소화한다는 것에 대해 간단히 설명을 덧붙이면 여기에는 두 가지 정도의 의미가 포함되어 있다. 1) 결과적으로 feature의 수를 줄이기 때문에 물리적으로 데이터의 양이 줄어든다. 2) PCA를 좀 더 정확하게 이해하면 가지고 있는 데이터에서 주성분이 될만한 데이터를 찾아 어떠한 형태로 변환을 시키기 때문에 원본 데이터와는 엄연히 다른 형태의 데이터이다. 여기서 **변환**이라는 것을 이해하기 위해 고유값, 고유벡터, 직교 등의 선형대수학 개념이 필요하다. 관련 자료는 [여기](https://angeloyeo.github.io/2019/07/27/PCA.html)를 참고하세요.


파이썬에서 주성분 분석이라 함은 가지고 있는 데이터 간의 관계를 파악하여 전체 데이터를 잘 설명하는 몇 가지의 feature를 추출하는 것이다.

>
> 주성분 분석의 목적은 데이터의 탐색적 분석(EDA)이다.
>


## 주성분 분석 예시
>
> - 파이썬으로 `Iris` 데이터 주성분 분석하는 과정
> - 데이터셋은 `seaborn` 라이브러리에서 제공되는 데이터를 활용
>

**Iris 데이터 특징**
- 꽃받침(Sepal)과 꽃잎(Petal)의 길이(length)와 폭(width)으로 세 종류(species)의 붓꽃을 분류

**Iris 데이터 PCA 목적**
- 붓꽃의 특징 4가지 중 2가지로 붓꽃의 종류를 예측


1. 데이터 불러오기
```python
import seaborn as sns # seaborn 라이브러리

iris = sns.load_dataset('iris')
iris.head(3)
```

![iris-data](https://images.velog.io/images/seonj102/post/94061fd4-725f-418e-b9b1-1c50e2c724f9/image.png)


2. 데이터 분리하기
- target : species
- other features : sepal_length, sepal_width, petal_length, petal_width

```python
target = iris[['species']]
features = iris.iloc[:, :-1]
```

`targets`
![target](https://images.velog.io/images/seonj102/post/98234189-06f4-4c21-af0e-b2dc2cc5ea74/image.png)

`other_features`
![features](https://images.velog.io/images/seonj102/post/8d4794b6-55ac-42dc-bd17-a0fe82385dca/image.png)

3. 데이터 스케일링

>
> 데이터 스케일링은 데이터 전처리 과정에서 진행하는데, **각 특성의 평균을 0, 분산을 1로 스케일링**하는 것이다. 간단하게 데이터를 정규분포로 만드는 작업이다(모든 특성들이 같은 스케일을 갖게됨).
>

**PCA를 진행하기 전에 데이터 스케일링을 하는 이유**
데이터의 스케일에 따라 주성분의 설명 가능한 분산량이 달라지기 때문이다. 간단하게 값이 아주 크거나 적은 데이터 등 특정값의 영향력을 분산시키기 위함이라고 생각하자.

**StandardScaler**
데이터 스케일링을 위해 `scikit-learn` 모듈의 `StandardScaler` 을 활용했다.

```python
from sklearn.preprocessing import StandardScaler # 데이터 표준화 패키지
```

(to be continued)

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.