Knowledge๐ฆข/๋ฐ์ดํฐ ๋ถ์
[Pandas ๊ฐ์ธ๊ณผ์ ] Iris ๋ฐ์ดํฐ (์์ด๋ฆฌ์ค, ๋ถ๊ฝ ๋ฐ์ดํฐ)๋ฅผ ํ์ฉํ Pandas ํ์ฉ ๊ณผ์ !
ํ์นดํ์ค
2024. 5. 16. 16:09
< ๋ฒ ์ด์ง 10๋ฌธ์ >
1๋ฒ ๋ฌธ์ : ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ
- ๋ฌธ์ ) pandas๋ฅผ importํ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ์ธ์.
import pandas as pd
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data'
columns = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width', 'Species']
iris = pd.read_csv(url, header=None, names=columns)
iris
2๋ฒ ๋ฌธ์ : ๋ฐ์ดํฐ ๊ตฌ์กฐ ํ์ ํ๊ธฐ
- ๋ฌธ์ ) ๋ฐ์ดํฐ์ ์ ์ฒซ 5ํ์ ์ถ๋ ฅํ๊ณ , ๋ฐ์ดํฐ์ ๊ตฌ์กฐ๋ฅผ ํ์ ํ์ธ์.
iris.head(5)
3๋ฒ ๋ฌธ์ : ๋ฐ์ดํฐ ์์ฝ ์ ๋ณด ํ์ธํ๊ธฐ
- ๋ฌธ์ ) ๋ฐ์ดํฐ์ ์ ์์ฝ ์ ๋ณด๋ฅผ ํ์ธํ์ธ์.
iris.info()
4๋ฒ ๋ฌธ์ : ๊ธฐ์ด ํต๊ณ๋ ํ์ธํ๊ธฐ
- ๋ฌธ์ ) ๊ฐ ์ด์ ๊ธฐ์ด ํต๊ณ๋(ํ๊ท , ํ์คํธ์ฐจ, ์ต์๊ฐ, ์ต๋๊ฐ ๋ฑ)์ ์ถ๋ ฅํ์ธ์.
iris.describe()
5๋ฒ ๋ฌธ์ : ํน์ ์ด ์ ํํ๊ธฐ
- ๋ฌธ์ ) 'Sepal Length' ์ด๋ง ์ ํํ์ฌ ์ถ๋ ฅํ์ธ์.
iris['Sepal Length']
6๋ฒ ๋ฌธ์ : ์กฐ๊ฑด์ ๋ง๋ ๋ฐ์ดํฐ ํํฐ๋งํ๊ธฐ
- ๋ฌธ์ ) 'Species'๊ฐ 'Iris-setosa'์ธ ํ๋ค๋ง ์ ํํ์ฌ ์๋ก์ด ๋ฐ์ดํฐํ๋ ์์ ๋ง๋์ธ์.
cond1 = iris['Species'] == 'Iris-setosa'
iris.loc[cond1, :]
7๋ฒ ๋ฌธ์ : ๊ทธ๋ฃน๋ณ ํต๊ณ๋ ๊ณ์ฐํ๊ธฐ
- ๋ฌธ์ ) ๊ฐ ํ์ข ('Species')๋ณ๋ก 'Sepal Length'์ ํ๊ท ์ ๊ณ์ฐํ์ธ์.
iris.groupby('Species')['Sepal Length'].mean()
8๋ฒ ๋ฌธ์ : ์๋ก์ด ์ด ์ถ๊ฐํ๊ธฐ
- ๋ฌธ์ ) ๊ฐ ํ์ 'Sepal Length'์ 'Sepal Width'์ ํฉ์ ๊ณ์ฐํ์ฌ ์๋ก์ด ์ด 'Sepal Sum'์ ์ถ๊ฐํ์ธ์.
iris['Sepal Sum'] = iris['Sepal Length'] + iris['Sepal Width']
iris
9๋ฒ ๋ฌธ์ : ๋ฐ์ดํฐ ์ ๋ ฌํ๊ธฐ
- ๋ฌธ์ ) 'Petal Length' ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐํ๋ ์์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ์ธ์.
iris.sort_values('Petal Length', ascending=False)
10๋ฒ ๋ฌธ์ : ํน์ ๊ฐ ์ธ๊ธฐ
- ๋ฌธ์ ) ๊ฐ ํ์ข ('Species')๋ณ๋ก ๋ช ๊ฐ์ ์ํ์ด ์๋์ง ์ธ์ด๋ณด์ธ์.
iris['Species'].value_counts()
< ์ฑ๋ฆฐ์ง 10๋ฌธ์ >
๋ฌธ์ 11: ๋ฐ์ดํฐ ๊ฒฐํฉํ๊ธฐ
- ๋ฌธ์ ) 'Sepal Length'์ 'Petal Length'์ ํ๊ท ์ ๊ณ์ฐํ ํ, ์ด๋ฅผ ์๋ก์ด ๋ฐ์ดํฐํ๋ ์์ผ๋ก ๊ฒฐํฉํ์ธ์.
sepal_length_mean = iris['Sepal Length'].mean()
petal_length_mean = iris['Petal Length'].mean()
df1 = pd.DataFrame({
'sepal_length_mean' : [sepal_length_mean]
})
df2 = pd.DataFrame({
'petal_length_mean' : [petal_length_mean]
})
result_horizontal = pd.concat([df1, df2], axis=1)
result_horizontal
๋ฌธ์ 12: ํผ๋ฒ ํ ์ด๋ธ ๋ง๋ค๊ธฐ
- ๋ฌธ์ ) ๊ฐ ํ์ข ๋ณ 'Sepal Length'์ 'Petal Length'์ ํ๊ท ์ ํผ๋ฒ ํ ์ด๋ธ๋ก ๋ง๋ค์ด ๋ณด์ธ์.
# ๊ฐ ํ์ข
๋ณ๋ก 'Sepal Length'์ 'Petal Length'์ ํ๊ท ๊ณ์ฐ
pivot_table = iris.pivot_table(index='Species', values=['Sepal Length', 'Petal Length'], aggfunc='mean')
# ์ด ์ด๋ฆ ๋ณ๊ฒฝ
pivot_table.columns = ['Sepal Length Mean', 'Petal Length Mean']
pivot_table
๋ฌธ์ 13: ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ
- ๋ฌธ์ ) 'Sepal Width' ์ด์ ์์๋ก ๊ฒฐ์ธก๊ฐ์ 10๊ฐ ์ถ๊ฐํ๊ณ , ๊ฒฐ์ธก๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง ์ด์ ์ ์ฉํด ๋ณด์ธ์.
- ์ฐธ๊ณ ) ํ์ฌ ๋ฐ์ดํฐ์๋ ๊ฒฐ์ธก๊ฐ์ด ์์ผ๋ฏ๋ก ์๋์ ๊ฐ์ ์ฝ๋๋ฅผ ํตํด ์์์ ๊ฒฐ์ธก๊ฐ์ ๋ง๋ dataframe์ ์ฌ์ฉํ์ธ์. (numpy์ random ํจ์๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฌ๋๋ง๋ค ๊ฒฐ์ธก๊ฐ index์ ์์น๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค)
import numpy as np
# ์์๋ก ๊ฒฐ์ธก๊ฐ 10๊ฐ ์ถ๊ฐ
iris_with_nan = iris.copy()
iris_with_nan.loc[np.random.choice(iris_with_nan.index, 10), 'Sepal Width'] = np.nan
iris_with_nan
[ ์ ๋ต 1 ]
# 13๋ฒ (1)
iris_clean = iris_with_nan.copy()
selected = iris_clean['Sepal Width'].isna()
iris_clean.loc[selected, 'Sepal Width'] = '๊ฒฐ์ธก๊ฐ1'
iris_clean
[ ์ ๋ต 2 ]
# 13๋ฒ (2)
iris_clean2 = iris_with_nan.copy()
iris_clean2 = iris_clean2.fillna('๊ฒฐ์ธก๊ฐ2')
iris_clean2
๋ฌธ์ 14: ๋ฐ์ดํฐ ๋ณํ
- ๋ฌธ์ ) 'Sepal Length'์ 'Sepal Width'์ ๋น์จ์ ๊ณ์ฐํ์ฌ ์๋ก์ด ์ด 'Sepal Ratio'๋ฅผ ์ถ๊ฐํ์ธ์.
iris['Sepal Ratio'] = round(iris['Sepal Length'] / iris['Sepal Width'],2)
iris
๋ฌธ์ 15: ํน์ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ์๋ก์ด ์ด ์์ฑ
- ๋ฌธ์ ) 'Sepal Length'๊ฐ 5.0 ์ด์์ธ ๊ฒฝ์ฐ 'Large', ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ 'Small'์ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ์๋ก์ด ์ด 'Sepal Size'๋ฅผ ์์ฑํ์ธ์.
def big_small(data):
if data >= 5.0:
return 'Large'
else:
return 'Small'
iris2 = iris.copy()
iris2['Sepal Size'] = iris2['Sepal Length'].apply(big_small)
iris2
๋ฌธ์ 16: ๋ค์ํ ํต๊ณ๋ ๊ณ์ฐ
- ๋ฌธ์ ) ๊ฐ ํ์ข (Species)๋ณ๋ก 'Sepal Length'์ 'Sepal Width'์ ํฉ๊ณ, ํ๊ท , ํ์คํธ์ฐจ๋ฅผ ๊ณ์ฐํ์ธ์.
iris.groupby('Species')[['Sepal Length','Sepal Width']].agg(['sum', 'mean', 'std'])
๋ฌธ์ 17: ๋ณต์กํ ์กฐ๊ฑด ํํฐ๋ง
- ๋ฌธ์ ) 'Sepal Length'๊ฐ 5.0 ์ด์์ด๊ณ 'Sepal Width'๊ฐ 3.5 ์ดํ์ธ ๋ฐ์ดํฐ๋ง ์ ํํ๊ณ , ์ด ๋ฐ์ดํฐ์ 'Petal Length'์ 'Petal Width'์ ํฉ์ ์๋ก์ด ์ด 'Petal Sum'์ผ๋ก ์ถ๊ฐํ์ธ์.
selected = (iris['Sepal Length'] >= 5.0) & (iris['Sepal Width'] <= 3.5)
iris['Petal Sum'] = iris.loc[selected, 'Petal Length'] + iris.loc[selected, 'Petal Width']
iris
๋ฌธ์ 18: ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
- ๋ฌธ์ ) 'Sepal Length'์ 'Sepal Width'์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ์ฐ์ ๋๋ฅผ ๊ทธ๋ฆฌ์ธ์. ๊ฐ ํ์ข ๋ณ๋ก ๋ค๋ฅธ ์์์ ์ฌ์ฉํ์ธ์.
import seaborn as sns
import matplotlib.pyplot as plt
# ์ฐ์ ๋ ๊ทธ๋ฆฌ๊ธฐ
sns.scatterplot(data=iris, x='Sepal Length', y='Sepal Width', hue='Species')
# ๊ทธ๋ํ ์ถ๋ ฅ
plt.title('Sepal Length vs. Sepal Width')
plt.xlabel('Sepal Length')
plt.ylabel('Sepal Width')
plt.legend(title='Species')
plt.show()
๋ฌธ์ 19: ํ์คํ ๊ทธ๋จ ๊ทธ๋ฆฌ๊ธฐ
- ๋ฌธ์ ) 'Sepal Length'์ ๋ถํฌ๋ฅผ ๋ํ๋ด๋ ํ์คํ ๊ทธ๋จ์ ๊ทธ๋ฆฌ์ธ์. ๊ฐ ํ์ข ๋ณ๋ก ๋ค๋ฅธ ์์์ ์ฌ์ฉํ์ธ์.
import seaborn as sns
import matplotlib.pyplot as plt
# ํ์คํ ๊ทธ๋จ ๊ทธ๋ฆฌ๊ธฐ
sns.histplot(data=iris, x='Sepal Length', hue='Species')
# ๊ทธ๋ํ ์ถ๋ ฅ
plt.title('Distribution of Sepal Length')
plt.xlabel('Sepal Length')
plt.ylabel('Total')
plt.show()
๋ฌธ์ 20: ๋ฐ์คํ๋กฏ ๊ทธ๋ฆฌ๊ธฐ
- ๋ฌธ์ ) ๊ฐ ํ์ข ๋ณ๋ก 'Petal Length'์ ๋ถํฌ๋ฅผ ๋ํ๋ด๋ ๋ฐ์คํ๋กฏ์ ๊ทธ๋ฆฌ์ธ์.
import seaborn as sns
ax = sns.boxplot(data = iris, x = 'Petal Length', hue = 'Species')
# ๊ทธ๋ํ ์ถ๋ ฅ
plt.title('Distribution of Petal Length')
plt.xlabel('Petal Length')
plt.ylabel('Total')
plt.show()