๊ฐ์ฅ ๋จผ์ ๋ถ์์ ์์ํ๋ ค๊ณ , ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ ๋ค์์ ๋ฌด์์ ํด์ผํ ๊น?
์ง๋ ์๊ฐ์ pandas_profiling์์ ์ดํด๋ณธ ๋ฐ์ ๊ฐ์ด ๊ฐ ํผ์ณ์ ํผ์ณ๊ฐ ๊ด๊ณ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ถ์์ ์์ํด์ผํ๋ค.
์ ์ฒด์ ์ธ EDA์ ํ๋ฆ์ ๊ฑฐ๋ญ ์ตํ๋ณด์.
๐ EDA์ ์์์ ํผ์ณ ์ดํด
โ 1. Feature ์ฒดํฌ
- id : ์ํ ์์ด๋ | title : ์ ์กฐ์ฌ ๋ชจ๋ธ๋ช | odometer : ์ฃผํ ๊ฑฐ๋ฆฌ
- location : ํ๋งค์ฒ(๋์ด์ง๋ฆฌ์ ๋์) | isimported : ํ์ง ์ฌ์ฉ ์ฌ๋ถ
- engine : ์์ง ์ข ๋ฅ | transmission : ํธ๋์ค๋ฏธ์ ์ข ๋ฅ
- fuel : ์ฐ๋ฃ ์ข ๋ฅ | paint : ํ์ธํธ ์์ | year : ์ ์กฐ๋ ๋ | target : ์๋์ฐจ ๊ฐ๊ฒฉ
- ํผ์ณ์ ๊ตฌ์ฑ๊ณผ ๊ฐ ํญ๋ชฉ์ ์๋ฏธ๋ฅผ ์ ํ์ ํด์ผ ๋ค์ ๋จ๊ณ์ ๋ถ์์ด ์์ํ๋ค(๋น์ฐํ ์ด์ผ๊ธฐ)
- ํนํ, ๊ฐ์ฅ ์ฒ์์๋ ๋ฐ์ดํฐ ํ์ ์ ๊ธฐ์ค์ผ๋ก ์์นํ / ๋ฒ์ฃผํ ๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๊ฒ์ด ์ค์ํ๋ค
โ 2. ๋ฐ์ดํฐ ํ์ ์ฒดํฌ
- numeric(4): id, odometer, year, target
- categorical(7):title, location, isimported, engine, transmission, fuel, paint
โ 3. ๊ฒฐ์ธก์น ์ฒดํฌ
โ 4. ์ด์์น(outlier) ์ฒดํฌ : ์๊ฐํ
- ์ฌ๊ธฐ์๋ ์ด์์น ํ์ ์ ์ํด Skewness(๋น๋์นญ๋, ์๋)๋ฅผ ์ดํด๋ณธ๋ค.
- Skewness๋ ํ๋ฅ ๋ถํฌ์ ๋น๋์นญ์ฑ์ ๋ํ๋ด๋ ํต๊ณ์ ์ธก๋์ด๋ค.
- ๋ฐ์ดํฐ ๋ถํฌ๊ฐ ์ด๋ป๊ฒ ์ผ์ชฝ์ด๋ ์ค๋ฅธ์ชฝ์ผ๋ก ์น์ฐ์ณ์ ธ ์๋์ง๋ฅผ ์ค๋ช ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- Skewness๋ ๋ฐ์ดํฐ ๋ถํฌ์ ๋์นญ์ฑ์ ํ๊ฐํ๊ณ , ๋ถํฌ๊ฐ ์ด๋ป๊ฒ ์น์ฐ์ณ์ ธ ์๋์ง๋ฅผ ์๋์ ์ผ๋ก ์ธก์ ํ๋ ๊ฒ์ผ๋ก,
- 0์ผ ๊ฒฝ์ฐ, ๋์นญ์ด๋ฉฐ, ์์๋ฉด ์ค๋ฅธ์ชฝ์ผ๋ก ์น์ฐ์น๊ณ , ์์๋ฉด ์ผ์ชฝ์ผ๋ก ์น์ฐ์น๋ค
df_train = train.copy()
df_test = test.copy()
fig, ax = plt.subplots(1, 2, figsize = (18, 5))
g = sns.histplot(df_train['odometer'], color = 'b', label = 'Skewness:{:.2f}'.format(df_train['odometer'].skew()), ax = ax[0])
g.legend(loc = 'best', prop={'size':16})
g.set_xlabel('Odometer', fontsize = 16)
g.set_ylabel('Count', fontsize = 16)
g = sns.histplot(df_train['year'], color = 'b', label='Skewness:{:.2f}'.format(df_train['year'].skew()), ax=ax[1])
g.legend(loc='best', prop={'size':16})
g.set_xlabel('Year', fontsize = 16)
g.set_ylabel('Count', fontsize = 16)
plt.show()
๐ ์ฌ๊ธฐ์๋ ๋ ๊ฐ์๋ ์์นํ ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ์๊ฐํํ๊ณ , skewness๋ฅผ ์์น๋ก ํ์ธํ๋ค.
๐ ์๋๊ฐ ํฐ ์์ ๋ ํผ์ณ์ ์ด์์น๋ฅผ ์ ๊ฑฐํด๋ณด์.
numeric_fts = ['odometer', 'year']
outlier_ind = []
for i in numeric_fts:
Q1 = np.percentile(df_train[i], 25)
Q3 = np.percentile(df_train[i], 75)
IQR = Q3 - Q1
outlier_list = df_train[(df_train[i]<Q1-1.5*IQR) | (df_train[i]>Q3+1.5*IQR)].index
outlier_ind.extend(outlier_list)
- ์์นํ ์ปฌ๋ผ์ ๋ฆฌ์คํธ์ ๋ฐ๋ก ์ ์ฅํด๋๋ค.
- ์ด์์น ์ธ๋ฑ์ค๋ง ์ ์ฅํ ๋น ๋ฆฌ์คํธ๋ฅผ ์ ์ฅํ๋ค.
- ์์นํ ์ปฌ๋ผ ๊ฐ๊ฐ์ ๋ํด, IQR์ ๊ณ์ฐ(Numpy ์ด์ฉ)
- ์ด์์น์ ํด๋นํ๋ ์ธ๋ฑ์ค๋ฅผ outlier_list์ ์ ์ฅํ๊ณ ,
- outlier_ind.extend() ํ๋ฉด ์ด์์น๊ฐ ์๋ row์ ์ธ๋ฑ์ค ๊ฐ์ด ์ด์ด์ ์ ์ฅ๋๋ค
train_df = df_train.drop(outlier_ind, axis = 0).reset_index(drop=True)
train_df
- ์์์ ์ ์ฅ๋ ์ต์ข ์ด์๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์ ์ฅ๋ ๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ์ด์๊ฐ์ด ์๋ ํ์ ์ ๋ถ ์ญ์ ํ๋ค
- ๊ฒฐ๊ณผ ํ์ธ
๐ ํ์คํ ๊ทธ๋จ์ ๋ค์ ํ ๋ฒ ๊ทธ๋ ค, ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณธ๋ค ==>>> ํ์คํ ์๋๊ฐ ๊ฐ์ ๋์๋ค
โ 5. ๋ฒ์ฃผํ ์ปฌ๋ผ๊ฐ ์๊ด๊ด๊ณ ํ์ธ & ์ธ์ฝ๋ฉ(LabelEncoder)
๐ ๋ฒ์ฃผํ ์ปฌ๋ผ์ ๊ฐ๊ฐ ๋ผ๋ฒจ์ธ์ฝ๋ฉ
# ๋ฒ์ฃผํ ์ปฌ๋ผ ์ฒดํฌ
cat_fts = ['title', 'location', 'isimported', 'engine', 'transmission', 'fuel', 'paint']
# ๋ผ๋ฒจ์ธ์ฝ๋ฉ
la_train = train_df.copy()
for i in range(len(cat_fts)):
encoder = LabelEncoder()
la_train[cat_fts[i]] = encoder.fit_transform(la_train[cat_fts[i]])
๐ ํํธ๋งต์ผ๋ก ์๊ฐํ
plt.figure(figsize = (10, 8))
sns.heatmap(la_train[['odometer', 'year', 'paint', 'fuel', 'transmission', 'engine', 'target']].corr(), annot=True)
plt.show()
์ฌ๊ธฐ๊น์ง ๊ธฐ๋ณธ์ ์ธ EDA๋ฅผ ํตํด, ์ปฌ๋ผ์ ํน์ง๊ณผ ํํฉ์ ํ์ธํ๊ณ
์ด์์น ์ ๊ฑฐ, ์ปฌ๋ผ ์ธ์ฝ๋ฉ ๋ฑ์ ์ํํ๋ค. ๋ค์ ํฌ์คํ ์์๋ ๊ตฌ์ฒด์ ์ธ ํผ์ณ ์์ง๋์ด๋ง์ผ๋ก ๋ค์ด๊ฐ๋ณด์!
728x90