๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Machine Learning/Case Study ๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป

[์ค‘๊ณ ์ฐจ ๊ฐ€๊ฒฉ ์˜ˆ์ธก(2)] EDA

by ISLA! 2023. 9. 17.

 

๊ฐ€์žฅ ๋จผ์ € ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๋ ค๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•œ ๋‹ค์Œ์—” ๋ฌด์—‡์„ ํ•ด์•ผํ• ๊นŒ?

์ง€๋‚œ ์‹œ๊ฐ„์— 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