이번 글에서는 iris dataset을 sklearn 라이브러리를 이용해 불러오고,
데이터 분석에 사용하기 적절한 형태인 판다스 데이터 프레임형태로 바꾸어 주는 코드에 대해 소개합니다.
iris 는 붓꽃인데요 iris dataset은 이 150 송이의 꽃받침과 꽃잎의 길이를 정리한 데이터입니다. 자세한 설명은 다음과 같습니다.
아이리스는 통계학자인 피셔 Fisher 가 소개한 데이터로, 붓꽃의 3가지 종(setosa, versicolor, virginica)에 대해 꽃받침 sepal과 꽃잎 petal의 길이를 정리한 데이터다. (중략) 이 데이터는 이해하기 쉬우며 크기가 작고 기계 학습에서 인기 있는 분야 중 하나인 분류 Classification에 적합한 데이터다.
출처 : R을 이용한 데이터 처리 & 분석 실무
먼저, iris dataset 로드와 데이터프레임 사용을 위한 라이브러리를 불러옵니다.
import pandas as pd # 데이터프레임 조작을 위한 pandas 라이브러리 로드
from sklearn.datasets import load_iris # scikit-learn iris 데이터셋 로드
불러온 load_iris 함수를 이용해 샘플 데이터를 불러오고, 형태를 살펴봅니다.
# =============================================================================
# iris data set 준비
# =============================================================================
iris = load_iris() # sample data load
# label
print(iris.target)
print(iris.target_names)
# [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
# 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# 2 2]
# ['setosa' 'versicolor' 'virginica']
그러나 지금 형태로는 우리가 평소에 보던 표 형태의 데이터가 아닙니다.
그래서 pd.DataFrame 함수를 이용해 data에 iris.data를, columns에 iris.feature_names를 입력하여 데이터프레임 형태로 바꾸어주고,
target(꽃의 종류) 또한 0, 1, 2 3가지 숫자로 인코딩 되어 있어 직관적으로 구분하기 어려운 상태이므로
숫자 0, 1, 2 각각을 ['setosa' 'versicolor' 'virginica']으로 바꾸어 줍니다.
# feature_names 와 target을 레코드로 갖는 데이터프레임 생성
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['group'] = iris.target
# 0.0, 1.0, 2.0으로 표현된 label을 3개의 그룹 문자열로 매핑
df['group'] = df['group'].map({0:"setosa", 1:"versicolor", 2:"virginica"})
print(df)
# sepal length (cm) sepal width (cm) ... petal width (cm) group
# 0 5.1 3.5 ... 0.2 setosa
# 1 4.9 3.0 ... 0.2 setosa
# 2 4.7 3.2 ... 0.2 setosa
# 3 4.6 3.1 ... 0.2 setosa
# 4 5.0 3.6 ... 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 ... 2.3 virginica
# 146 6.3 2.5 ... 1.9 virginica
# 147 6.5 3.0 ... 2.0 virginica
# 148 6.2 3.4 ... 2.3 virginica
# 149 5.9 3.0 ... 1.8 virginica
마지막으로, 데이터 프레임의 컬럼명에 공백이나 괄호가 있으면 가독성이 떨어지므로 공백은 '_'로 바꾸고, 단위(cm) 문자를 지운 열이름을 df.columns 인자에 입력합니다.
그 결과 최종적으로 150 행, 5개 열을 갖는 표 형태의 데이터로 iris 데이터셋이 변환된 것을 확인 할 수 있습니다.
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'group'] # 데이터 프레임 컬럼명 수정
print(df)
# [150 rows x 5 columns]
# sepal_length sepal_width petal_length petal_width group
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
마지막으로, 데이터 프레임에서 수치형 값으로 이루어진 컬럼 별 값의 분포를 개략적으로 확인하기 위해 df.describe 함수를 이용합니다.
예를 들면 sepal_length는 150개의 데이터 값으로 이루어져있고, 평균은 5.843333, 최솟값 4.3, 최댓값 7.9 인것을 확인할 수 있습니다.
print(df.describe())
# sepal_length sepal_width petal_length petal_width
# count 150.000000 150.000000 150.000000 150.000000
# mean 5.843333 3.057333 3.758000 1.199333
# std 0.828066 0.435866 1.765298 0.762238
# min 4.300000 2.000000 1.000000 0.100000
# 25% 5.100000 2.800000 1.600000 0.300000
# 50% 5.800000 3.000000 4.350000 1.300000
# 75% 6.400000 3.300000 5.100000 1.800000
# max 7.900000 4.400000 6.900000 2.500000
최종 코드 (전체 코드) 입니다.
import pandas as pd
from sklearn.datasets import load_iris # scikit-learn iris 데이터셋 로드
# =============================================================================
# iris data set 준비
# =============================================================================
iris = load_iris() # sample data load
# label
print(iris.target)
print(iris.target_names)
# feature_names 와 target을 레코드로 갖는 데이터프레임 생성
df = pd.DataFrame(data=iris.data, columns=iris.feature_names)
df['group'] = iris.target
# 0.0, 1.0, 2.0으로 표현된 label을 3개의 그룹 문자열로 매핑
df['group'] = df['group'].map({0:"setosa", 1:"versicolor", 2:"virginica"})
print(df)
df.columns = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'group'] # 데이터 프레임 컬럼명 수정
print(df)
# [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
# 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
# 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
# 2 2]
# ['setosa' 'versicolor' 'virginica']
# sepal length (cm) sepal width (cm) ... petal width (cm) group
# 0 5.1 3.5 ... 0.2 setosa
# 1 4.9 3.0 ... 0.2 setosa
# 2 4.7 3.2 ... 0.2 setosa
# 3 4.6 3.1 ... 0.2 setosa
# 4 5.0 3.6 ... 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 ... 2.3 virginica
# 146 6.3 2.5 ... 1.9 virginica
# 147 6.5 3.0 ... 2.0 virginica
# 148 6.2 3.4 ... 2.3 virginica
# 149 5.9 3.0 ... 1.8 virginica
# [150 rows x 5 columns]
# sepal_length sepal_width petal_length petal_width group
# 0 5.1 3.5 1.4 0.2 setosa
# 1 4.9 3.0 1.4 0.2 setosa
# 2 4.7 3.2 1.3 0.2 setosa
# 3 4.6 3.1 1.5 0.2 setosa
# 4 5.0 3.6 1.4 0.2 setosa
# .. ... ... ... ... ...
# 145 6.7 3.0 5.2 2.3 virginica
# 146 6.3 2.5 5.0 1.9 virginica
# 147 6.5 3.0 5.2 2.0 virginica
# 148 6.2 3.4 5.4 2.3 virginica
# 149 5.9 3.0 5.1 1.8 virginica
print(df.describe())
# sepal_length sepal_width petal_length petal_width
# count 150.000000 150.000000 150.000000 150.000000
# mean 5.843333 3.057333 3.758000 1.199333
# std 0.828066 0.435866 1.765298 0.762238
# min 4.300000 2.000000 1.000000 0.100000
# 25% 5.100000 2.800000 1.600000 0.300000
# 50% 5.800000 3.000000 4.350000 1.300000
# 75% 6.400000 3.300000 5.100000 1.800000
# max 7.900000 4.400000 6.900000 2.500000
'Data Analysis' 카테고리의 다른 글
[번역] 당신은 Train, Validation & Test Set을 올바르게 사용하고 있습니까? (0) | 2023.11.28 |
---|---|
Over Sampling for Regression (0) | 2023.11.01 |
[Python] Lambda 함수 사용법(for 데이터분석가) (0) | 2023.03.15 |
PCA(주성분분석) vs LDA(선형판별분석) 비교 (0) | 2023.01.27 |
분류 문제의 평가지표 (PRECISION, RECALL, ACCURACY 등) (0) | 2022.04.12 |