본문 바로가기

Data Analysis

[Python] iris dataset load & pre-processing

728x90
반응형

이번 글에서는 iris dataset을 sklearn 라이브러리를 이용해 불러오고,

데이터 분석에 사용하기 적절한 형태인 판다스 데이터 프레임형태로 바꾸어 주는 코드에 대해 소개합니다.

 

iris 는 붓꽃인데요 iris dataset은 이 150 송이의 꽃받침과 꽃잎의 길이를 정리한 데이터입니다. 자세한 설명은 다음과 같습니다.

아이리스는 통계학자인 피셔 Fisher 가 소개한 데이터로, 붓꽃의 3가지 종(setosa, versicolor, virginica)에 대해 꽃받침 sepal과 꽃잎 petal의 길이를 정리한 데이터다. (중략) 이 데이터는 이해하기 쉬우며 크기가 작고 기계 학습에서 인기 있는 분야 중 하나인 분류 Classification에 적합한 데이터다.

출처 : R을 이용한 데이터 처리 & 분석 실무

 

출처 : https://www.kaggle.com/sunaysawant/iris-eda-k-means-clustering

 

 

먼저, 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
반응형