데이터분석 3주차 숙제 - 📄 붓꽃 데이터의 탐색적 데이터 분석을 진행하고, 여러가지 차트들을 그려주세요.
>> 붓꽃 데이터 로드하기
sklearn은 머신 러닝 패키지로 각종 머신 러닝 데이터셋도 제공하고 있습니다.
이번 과제에서 사용할 머신 러닝 데이터셋은 iris data(붓꽃 데이터)입니다.
# 과제에 필요한 패키지는 아래의 두 가지가 전부가 아닙니다.
# 여러분들의 필요에 따라서 패키지를 지속 추가하셔도 됩니다.
import pandas as pd
from sklearn import datasets
# 붓꽃 데이터 로드
iris_data = datasets.load_iris()
iris 데이터셋의 각 열은 다음과 같습니다.
- Sepal Length : 꽃받침의 길이 정보
- Sepal Width : 꽃받침의 너비 정보
- Petal Length : 꽃잎의 길이 정보
- Petal Width : 꽃잎의 너비 정보
이러한 4개의 특성을 알려줄테니
꽃의 종류를 예측해보라는 것이 iris 데이터셋이 제시하는 머신러닝 문제입니다.
- Species 꽃의 종류 정보 : setosa / versicolor / virginica 의 3종류.
우선 4개의 특성에 해당되는 데이터를 df_data에 로드합니다.
df_data = pd.DataFrame(iris_data['data'], columns=iris_data['feature_names'])
# 랜덤으로 5개의 샘플 출력
df_data.sample(5)
4개의 열이 출력되는데, 각각 꽃받침의 길이 정보, 꽃받침의 너비 정보, 꽃잎의 길이 정보, 꽃잎의 너비 정보에 해당됩니다. iris 데이터(붓꽃 데이터)는 이 4개의 특성만 보고 이 꽃이 어떤 품종의 붓꽃인지를 예측해야하는 머신 러닝 문제를 위한 데이터셋입니다.
정답에 해당되는 레이블을 df_target에 로드합니다.
df_target = pd.DataFrame(iris_data['target'], columns=['species'])
df_target.sample(5)
이 시리즈에는 어떤 값들이 있는지 출력해봅시다.
# 값의 종류를 전부 출력
df_target['species'].unique()
array([0, 1, 2])
숫자가 0, 1, 2가 나오는데 각각이 의미하는 품종은 다음과 같습니다.
- 0 = setosa
- 1 = versicolor
- 2 = virginica
pd.concat()을 사용하면 위 데이터프레임과 시리즈를
하나의 데이터프레임으로 합치는 것이 가능합니다.
df = pd.concat([df_data, df_target], axis=1)
df
이렇게 150개의 행과 5개의 열을 가진 붓꽃 데이터가 데이터프레임에 로드된 상태입니다.
총 150개의 붓꽃이 있는데, 종류는 3개였고,
각 붓꽃의 꽃받침의 길이와 너비, 꽃잎의 길이와 너비를 기록한 데이터셋인 것이죠.
여러분들의 과제는 이 붓꽃 데이터를 가지고 데이터프레임의 기능(조건부 필터링, 상관 계수 분석 등),
Matplotlib, Seaborn을 사용하여 각종 통계 정보를 구하고, 시각화를 해보는 것입니다. 이번 과제는 누가 더 잘하고 못함은 분명히 존재합니다. 하지만 단 하나의 정답이 존재하는 것은 아닙니다. 여러분들이 배운 내용들을 복습하여 최대한 성실하게 과제를 제출해주세요. 단, 차트는 세 종류 이상을 출력해보세요!
이번 과제에서 사용할 머신 러닝 데이터셋은 iris data(붓꽃 데이터)입니다.
3주차 숙제 정답 코드
# 본격적인 시각화를 위한 패키지 임포트
import seaborn as sns
import matplotlib.pyplot as plt
모든 열에 대해서 수치정보를 얻습니다. 이번에는 모든 열에 대해서 상관 계수를 구해봅시다.
corr()을 사용하면 모든 열의 조합에 대한 상관 계수 결과를 얻습니다.
df.corr()
species는 예측 대상이므로 species는 제외하고 다시 상관 계수를 구해봅시다.
df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']].corr()
plt.figure(figsize=(5, 5))
sns.heatmap(df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']].corr(), annot=True)
시리즈의 이름.plot()을 통해서 많은 차트를 그릴 수 있습니다.예를 들어서 kind에 'hist'를 기재하면 히스토그램 차트를 그려줍니다.
petal width(꽃잎의 너비 정보)에 대해서 히스토그램을 그려봅시다.
df['petal width (cm)'].plot(kind='hist')
plt.title('Iris Petal Width', fontsize=14, y=1.01)
plt.ylabel('Value')
plt.xlabel('Width')
그 외에도 'line', 'bar', 'barh', 'box', 'kde', 'density', 'area', 'pie'와 같은 값들이 가능합니다.
이에 대해선 아래의 Pandas Series의 공식 문서에서 확인할 수 있습니다.
https://pandas.pydata.org/pandas-docs/version/0.24.2/reference/api/pandas.Series.plot.html
종(species)에 대한 파이 차트를 그려봅시다. 우선 각 종에 대한 값을 리스트로 변환할 수 있습니다.
앞서 언급했듯이 숫자가 0, 1, 2가 나오는데 각각 0 = setosa, 1 = versicolor, 2 = virginica를 의미합니다.0, 1, 2를 각각 원래의 이름으로 복원해봅시다. 이는 replace라는 함수를 통해 가능합니다.
df['species'].replace({0: "setosa", 1: "vesicolor", 2:'virginica'}, inplace=True)
df['species'].unique()
각 종에 대한 카운트를 출력해봅시다.
df['species'].value_counts()
pie_labels = df['species'].value_counts().index.tolist()
pie_values = df['species'].value_counts().values.tolist()
print(pie_labels)
print(pie_values)
이제 파이 차트를 그리기 위해 필요한 두 가지를 얻었습니다. 파이 차트를 그리는 방법은 Matplotlib의 pyplot을 plot로 임포트하였다면, plt.pie()를 사용합니다.
사용 방법은 다음과 같습니다.
plt.pie(데이터의 실질적인 값, labels=데이터의 레이블 리스트)
plt.pie(pie_values, labels=pie_labels, autopct='%.02f%%')
plt.title('Percentage of each species')
plt.show()
바 차트를 이용해서 species를 출력해볼 수도 있을 겁니다.
df['species'].value_counts().plot(kind='bar')
3개의 값이 동일한 개수로 있습니다.
seaborn을 이용해서 산점도를 그려봅시다.
sns.pairplot(df, hue="species")
pairplot은 데이터프레임을 인수로 받아 데이터프레임의 각 열의 조합에 따라서 산점도(scatter plot)을 그립니다. 쉽게 말해 4개의 특성에 해당하는 sepal length, sepal width, petal length, petal width에 대해서 모든 쌍(pair)의 조합인 16개의 경우에 대해서 산점도를 그립니다. 만약 같은 데이터의 쌍일 경우에는 히스토그램으로 나타납니다.
seaborn을 통해 bar 차트를 그리는 bar plot에 x축과 y축의 값을 다음과 같이 입력하여 바 차트를 그릴 수도 있습니다.
sns.barplot(df['species'], df['sepal width (cm)'], ci=None)
다음과 같이 subplots() 이라는 기능을 사용하면 한 번에 다수의 차트를 그리는 것도 가능합니다.
이에 대해서는 3강 자전거 수요 예측하기에서 다룰 예정입니다.
여기서는 이런 기능도 있다는 것 정도만 보고 넘어가겠습니다.
fig, ax = plt.subplots(2,2, figsize=(6,4))
ax[0][0].hist(df['petal width (cm)'], color='black');
ax[0][0].set_ylabel('Count', fontsize=12)
ax[0][0].set_xlabel('Width', fontsize=12)
ax[0][0].set_title('Iris Petal Width', fontsize=14, y=1.01)
ax[0][1].hist(df['petal length (cm)'], color='black');
ax[0][1].set_ylabel('Count', fontsize=12)
ax[0][1].set_xlabel('Lenth', fontsize=12)
ax[0][1].set_title('Iris Petal Lenth', fontsize=14, y=1.01)
ax[1][0].hist(df['sepal width (cm)'], color='black');
ax[1][0].set_ylabel('Count', fontsize=12)
ax[1][0].set_xlabel('Width', fontsize=12)
ax[1][0].set_title('Iris Sepal Width', fontsize=14, y=1.01)
ax[1][1].hist(df['sepal length (cm)'], color='black');
ax[1][1].set_ylabel('Count', fontsize=12)
ax[1][1].set_xlabel('Length', fontsize=12)
ax[1][1].set_title('Iris Sepal Length', fontsize=14, y=1.01)
plt.tight_layout()
답안해설 영상 보면 써내려간 코드 # 설명
**3주차 숙제
📄 붓꽃 데이터의 탐색적 데이터 분석을 진행하고, 여러가지 차트들을 그려주세요.**
# 과제에 필요한 패키지는 아래의 두 가지가 전부가 아닙니다.
# 여러분들의 필요에 따라서 패키지를 지속 추가하셔도 됩니다.
import pandas as pd
from sklearn import datasets
# 붓꽃 데이터 로드
iris_data = datasets.load_iris()
df_data = pd.DataFrame(iris_data['data'], columns=iris_data['feature_names']) # data 부분만 데이터프레임으로
df_target = pd.DataFrame(iris_data['target'], columns=['species']) # target 부분만 데이터프레임으로
df_data.sample(5) # 랜덤으로 5개의 샘플 출력
df_target = pd.DataFrame(iris_data['target'], columns=['species'])
df_target.sample(5)
df_target['species'].unique()
df = pd.concat([df_data, df_target], axis=1) # 두 데이터프레임 결합
df
df.corr() # 모든 열에 대해서 상관관계 분석
import seaborn as sns
import matplotlib.pyplot as plt
df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']].corr() # 길이/너비 부분에 대해서만 상관관계 분석
plt.figure(figsize=(5, 5)) # 표시되는 차트 크기 조정
sns.heatmap(df[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']].corr(), annot=True)
df['petal width (cm)'].plot(kind='hist') # kin='hist' 추가하면 히스토그램 생성 가능 (범위별 빈도수 그래프)
plt.title('Iris Petal Width', fontsize=14, y=1.01) # 제목 설정
plt.ylabel('Value')
plt.xlabel('Width')
df['species'].replace({0: "setosa", 1: "vesicolor", 2:'virginica'}, inplace=True) # 0, 1, 2라고 종류가 표시되어있는데, 이것을 단어로 변경
df['species'].value_counts()
pie_labels = df['species'].value_counts().index.tolist() #레이블 만들기
pie_values = df['species'].value_counts().values.tolist() # 값 만들기
plt.pie(pie_values, labels=pie_labels, autopct='%.02f%%')
plt.title('Percentage of each species') # 제목 지정
plt.show()
df['species'].value_counts().plot(kind='bar') # kind='bar' 명시하면 쉽게 바차트도 생성 가능! (종류별 개수를 막대그래프로 표시)
sns.pairplot(df, hue="species") # 산점도 ( 상관관계를 직접적으로 보기 위함) // hue="species" 색을 입힘
sns.barplot(df['species'], df['sepal width (cm)'], ci=None)
fig, ax = plt.subplots(2,2, figsize=(6,4))
ax[0][0].hist(df['petal width (cm)'], color='black');
ax[0][0].set_ylabel('Count', fontsize=12)
ax[0][0].set_xlabel('Width', fontsize=12)
ax[0][0].set_title('Iris Petal Width', fontsize=14, y=1.01)
ax[0][1].hist(df['petal length (cm)'], color='black');
ax[0][1].set_ylabel('Count', fontsize=12)
ax[0][1].set_xlabel('Lenth', fontsize=12)
ax[0][1].set_title('Iris Petal Lenth', fontsize=14, y=1.01)
ax[1][0].hist(df['sepal width (cm)'], color='black');
ax[1][0].set_ylabel('Count', fontsize=12)
ax[1][0].set_xlabel('Width', fontsize=12)
ax[1][0].set_title('Iris Sepal Width', fontsize=14, y=1.01)
ax[1][1].hist(df['sepal length (cm)'], color='black');
ax[1][1].set_ylabel('Count', fontsize=12)
ax[1][1].set_xlabel('Length', fontsize=12)
ax[1][1].set_title('Iris Sepal Length', fontsize=14, y=1.01)
plt.tight_layout()
정말 많이 해보는 수 밖에 없을것같다