header-img
Info :
๋ฐ€๋„
denseยน
์žฅ๋ž˜ํฌ๋ง : ๋‹จ์œ„ ๋ถ€ํ”ผ ๋‹น ์งˆ๋Ÿ‰์ด ๋ณด๋‹ค ๋นฝ๋นฝํ•œ ์‚ฌ๋žŒ ๋˜๊ธฐ
TOOLS/Python 2
list_img
Python ๋ชจ๋ธ๋ง: ํšŒ๊ท€(Regression) / 2step. Data Readiness Check, Feature Engineering
2024.02.02
์ด์ „ ํฌ์ŠคํŠธ ์š”์•ฝ ์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” A์‚ฌ์˜ ์ธ์‚ฌ ํšจ์œจํ™”๋ฅผ ์œ„ํ•ด ๊ธ‰์—ฌ ์ฒด๊ณ„ ๊ด€๋ จํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„ ๋‚ด๊ณ  ์ผ์ฐจ์ ์ธ ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๋ชจ์•„์„œ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๊ณตํ•ด ์คฌ๋‹ค. null ๊ฐ’, ์ค‘๋ณต ๊ฐ’, outlier(์ •์ƒ ์ˆ˜์น˜๋ฅผ ๋„˜์–ด์„  ๋ฐ์ดํ„ฐ)๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด ์คฌ์œผ๋ฉฐ numeric(์ˆซ์žํ˜•)๊ณผ catergorical(๋ฒ”์ฃผํ˜•) ๋ณ€์ˆ˜์˜ ๋ณ€๋ณ„๋ ฅ์„ ์œ„ํ•ด ๊ฐ ๋ณ€์ˆ˜์˜ ํ˜•ํƒœ๋ฅผ ์ฒดํฌ ํ›„ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•ด ์คฌ๋‹ค. ์ด๋Ÿฐ ์ „์ฒ˜๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ฒดํฌ ๊ณผ์ •์€ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ๊นŠ๊ฒŒ ์ง„ํ–‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค. ์ข‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ธํ’‹ํ•ด์•ผ ์ข‹์€ ์•„์›ƒํ’‹์ด ๋‚˜์˜จ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ฐ€๊ณตํ•ด์ฃผ๋Š” y = f(x)๋ผ๋Š” ๋ฐฉ์ •์‹์—์„œ f๋ผ๋Š” ์‹๊ณผ x๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ์˜ณ์•„์•ผ๋งŒ ์˜ฌ๋ฐ”๋ฅธ y..
list_img
Python ๋ชจ๋ธ๋ง: ํšŒ๊ท€(Regression) / 1step. ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ๋ฐ ํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„(EDA)
2024.02.01
์ƒํ™ฉ ์„ค์ • A์‚ฌ๋Š” ์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ ํšŒ์‚ฌ๋ฅผ ๋Ÿฐ์นญํ•˜๊ฒŒ ๋˜์–ด ๊ธ‰์—ฌ ์ฒด๊ณ„๋ฅผ ์ƒˆ๋กœ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ์›ํ™œํ•œ ์šด์˜์„ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ์ฑ„์šฉ์„ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ด๋ฉฐ, ์ด์— ๋”ฐ๋ผ ์ง๊ธ‰๋ณ„/ ์ง๋ฌด๋ณ„ ๊ธ‰์—ฌ Band๋ฅผ ์ˆ˜๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด ์ง€์›์ž๋“ค์˜ ํ”„๋กœํ•„ ์ •๋ณด์™€ ์ž์‚ฐ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ๊ธ‰์—ฌ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  ๊ธ‰์—ฌ Band ์„ค์ •์— ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ธฐ์— ์•ž์„œ, A์‚ฌ์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€์ธ ๋‚˜๋Š” ๋ฌธ์ œ ์ƒํ™ฉ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ฑ๋‚ฑ์ด ์‚ดํŽด๋ณด๊ณ  ์œ ์˜๋ฏธํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ™˜๊ฒฝ๊ณผ ๋ถ„์„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ–์ถ”๊ณ ์ž ํ•˜๊ณ  ์žˆ๋‹ค. ๋ฌธ์ œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค ์ •์˜ ๋‚ด๊ฐ€ ์ด ๋ฐ์ดํ„ฐ ์˜ˆ์ธก ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ A์‚ฌ ๋‚ด๋ถ€์˜ ์ธ๋ ฅ ์šด์˜ ํšจ์œจ์˜ ์‹ค์งˆ์ ์ธ ๊ฐœ์„ ์„ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ˜„์žฌ A์‚ฌ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์ •์˜ํ•ด์•ผ ํ•˜๊ณ , ์ด ๋ชจ๋ธ..

 

 

์ด์ „ ํฌ์ŠคํŠธ ์š”์•ฝ

 

์ง€๋‚œ ํฌ์ŠคํŠธ์—์„œ ์šฐ๋ฆฌ๋Š” A์‚ฌ์˜ ์ธ์‚ฌ ํšจ์œจํ™”๋ฅผ ์œ„ํ•ด ๊ธ‰์—ฌ ์ฒด๊ณ„ ๊ด€๋ จํ•œ ๋ฌธ์ œ๋ฅผ ์ฐพ์•„ ๋‚ด๊ณ  ์ผ์ฐจ์ ์ธ ์‹คํ–‰ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์ถ•ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž˜ ๋ชจ์•„์„œ ์ปดํ“จํ„ฐ๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๊ณตํ•ด ์คฌ๋‹ค. null ๊ฐ’, ์ค‘๋ณต ๊ฐ’, outlier(์ •์ƒ ์ˆ˜์น˜๋ฅผ ๋„˜์–ด์„  ๋ฐ์ดํ„ฐ)๊ฐ€ ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด ์คฌ์œผ๋ฉฐ numeric(์ˆซ์žํ˜•)๊ณผ catergorical(๋ฒ”์ฃผํ˜•) ๋ณ€์ˆ˜์˜ ๋ณ€๋ณ„๋ ฅ์„ ์œ„ํ•ด ๊ฐ ๋ณ€์ˆ˜์˜ ํ˜•ํƒœ๋ฅผ ์ฒดํฌ ํ›„ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•ด ์คฌ๋‹ค.

 

์ด๋Ÿฐ ์ „์ฒ˜๋ฆฌ์™€ ๋ฐ์ดํ„ฐ ์ฒดํฌ ๊ณผ์ •์€ ์‹œ๊ฐ„์„ ๋“ค์—ฌ ๊นŠ๊ฒŒ ์ง„ํ–‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค. ์ข‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ธํ’‹ํ•ด์•ผ ์ข‹์€ ์•„์›ƒํ’‹์ด ๋‚˜์˜จ๋‹ค. ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ฐ€๊ณตํ•ด์ฃผ๋Š” y = f(x)๋ผ๋Š” ๋ฐฉ์ •์‹์—์„œ f๋ผ๋Š” ์‹๊ณผ x๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ ๋ชจ๋‘ ์˜ณ์•„์•ผ๋งŒ ์˜ฌ๋ฐ”๋ฅธ y๊ฐ’์„ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ๋“ฏ์ด.

 

์ด๋ฒˆ ์Šคํ…์—๋Š” ๊ธฐ์กด ์ „์ฒ˜๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด 'ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ค€์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ ๊ฒ€'ํ•˜๊ณ  '๋ชจ๋ธ๋ง์ด ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ฐ ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ฒŒ ๊ฐ€๊ณต/ ์„ ๋ณ„ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ'ํ•˜๋Š” Data Readiness Check์™€ Feature Engineering ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

Data Readiness Check

 

์„œ๋ก ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, Data Readiness Check๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ์˜ ์ˆ˜์ค€์œผ๋กœ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•˜๋Š” ํŒŒํŠธ๋‹ค. ์ด ๊ณผ์ •์—์„œ, ์šฐ๋ฆฌ๋Š” Target label๊ณผ Target Ratio๋ฅผ ์ ๊ฒ€ํ•ด ์ฃผ๊ณ  ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ํ† ๋Œ€๋กœ ๋ถ„์„ ๋ฐฉํ–ฅ์„ฑ์„ ์œ ์ง€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๊ฒƒ์ด๋‹ค. 

 

 

์ด ๊ณผ์ •์€ ์—ฌ๋Ÿฌ ๊ด€์ ์—์„œ ์œ ์˜๋ฏธํ•˜๋‹ค. ๋ฌธ์ œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ •์˜ํ–ˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„, ์ง€๊ธˆ ์ง„ํ–‰ ๋‹จ๊ณ„์—์„œ Target label์ด ๋‚˜์˜ค์ง€ ์•Š์€ ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ปค๋จธ์Šค์‚ฌ์—์„œ ์ฒซ ๊ตฌ๋งคํ•œ ๊ณ ๊ฐ์˜ ์žฌ๊ตฌ๋งค ๋น„์œจ์„ ์ธก์ •ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ํ•ด๋‹น ๋‹จ๊ณ„์—์„œ๋Š” ์ฒซ ๊ตฌ๋งค ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋งŒ ๋‚˜์™€ ์žˆ๊ณ  ์žฌ๊ตฌ๋งค ๋ฐ์ดํ„ฐ๋Š” ์•„์ง ๋‚˜์™€ ์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๋ถ€ํ„ฐ ์งš๊ณ  ๊ฐ€์•ผ ํ•œ๋‹ค.

 

 

์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์—์„œ Target Ratio ์ž์ฒด๋Š” ์ ์ง€๋งŒ ์ˆ˜์ง‘ ๋ฐ์ดํ„ฐ ์ˆ˜๋Ÿ‰ ์ž์ฒด๋Š” ๋งŽ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ๊ธˆ 'ํฌ๊ธฐํ•˜๊ณ ' ์ผ๋ถ€ ์ง‘๋‹จ์œผ๋กœ ํ•„ํ„ฐ๋ฅผ ๊ฑธ์–ด์„œ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ค„์ด๋˜ Target Ratio๋ฅผ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ด๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค. ์ฃผ ํƒ€๊ฒŸ์ธต์ด 30~40๋Œ€๋ผ๋ฉด 20๋Œ€๋Š” ๋ฐ์ดํ„ฐ์—์„œ ๋นผ๋ฒ„๋ฆฌ๊ณ  ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

๋˜ ๋ฐ์ดํ„ฐ ๊ฐ’์ด ์ผ๋ถ€๋ถ„์—๋งŒ ์ง€๋‚˜์น˜๊ฒŒ ๋ชฐ๋ ค ์žˆ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ๋ถ„์„์ด ๋ฌด์˜๋ฏธํ•˜๋‹ค. Data Readiness Check๋Š” ํƒ€๊ฒŸ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ํ•œ ๋ฒˆ ๋” ๊ฒ€์ˆ˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์šฐ๋ฆฌ๋กœ ํ•˜์—ฌ๊ธˆ ์ด๋Ÿฐ ๋…ผ๋ฆฌ์ƒ์˜ ํ—ˆ์ ์„ ๋ณด๊ฐ•ํ•˜๊ฒŒ ํ•ด ์ค€๋‹ค.

 

 

๋ณธ๊ฒฉ์ ์œผ๋กœ ํ•ด๋‹น ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•ด ๋ณด์ž. ์ผ๋‹จ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด๋ฉด,

 

 

df.head()

 

 

 

 

์—ฌ๋Ÿฌ ์ง€ํ‘œ๋“ค์ด ๋‚˜์˜จ๋‹ค. ์ด ์ค‘์— ํƒ€๊ฒŸ ์ง€ํ‘œ๊ฐ€ ๋˜๋Š” WAGE๋ฅผ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๋ณด์ž.

 

 

import seaborn as sns
display(pd.DataFrame(df['WAGE'].describe()))
sns.distplot(df['WAGE']);

 

 

describe() ๋กœ ๊ธฐ์ดˆ์ ์ธ ๋ณ€์ˆ˜์˜ ๊ธฐ์ˆ  ํ†ต๊ณ„ ์ž๋ฃŒ๋ฅผ ์—ด๋žŒํ•  ์ˆ˜ ์žˆ๋‹ค. distplot ๊ทธ๋ž˜ํ”„์™€ ํ•จ๊ป˜ ํ‘œ๋ฅผ ํ•œ๋ฒˆ ๋‚˜์—ดํ•˜๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ถœ๋ ฅ๋œ๋‹ค.

 

 

 

 

ํฌ๊ฒŒ ๋ญ‰์ณ ์žˆ๋Š” ๋ถ€๋ถ„ ์—†์ด ์—ฐ์† ๋ณ€์ˆ˜์Šค๋Ÿฌ์šด ๊ทธ๋ž˜ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์ด์   ๊ฐ ๋ณ€์ˆ˜์™€ WAGE ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ์กฐ๊ธˆ ํŒŒ์•…ํ•ด๋ณผ ์‹œ๊ฐ„์ด๋‹ค. groupby๋กœ OCCUPATION์˜ ๊ฐ ๊ฐ’๋ณ„ WAGE์˜ ํ‰๊ท ์„ ๋‚ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ด์™ธ์—๋„ ์—ฌ๋Ÿฌ ๊ฐœ ์ž…๋ ฅํ•ด๋ณด๋ฉด์„œ ๊ด€๊ณ„๋ฅผ ์ฐพ์•„ ๋ณธ๋‹ค.

 

 

eda_df1 = df.groupby('OCCUPATION')['WAGE'].agg(WAGE_mean =('mean')).reset_index()
eda_df1

 

 

 

์ง€๊ธˆ๊นŒ์ง€ ํŒŒ์•…ํ•œ ์ •๋ณด๊ฐ’์œผ๋กœ ๋ณด๋ฉด, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋กœ ๋ถ„์„์„ ์ง„ํ–‰ํ•ด๋„ ๋ฌธ์ œ ์—†์–ด ๋ณด์ธ๋‹ค. ๋ถ„ํฌ๊ฐ€ ๊ฝค ๋„“๊ฒŒ ํผ์ ธ ์žˆ๊ณ , ์œ ์˜๋ฏธํ•œ ๋ณ€์ˆ˜๋„ ๋ช‡ ๋ฝ‘์•˜์œผ๋‹ˆ๊นŒ. ๋‹ค๋งŒ ์‚ด์ง ๊ฑฑ์ •๋˜๋Š” ์ ์€ ๊ฐ’์ด 534๊ฐœ๋ฐ–์— ์—†๋‹ค๋Š” ์ ์ด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ ์ž๋ฃŒ๋ฅผ ๋” ์ˆ˜์ง‘ํ•  ํ•„์š”๋Š” ์žˆ๋‹ค.

 

 

 

 

 

Feature Engineering: ๊ฐœ์š”

 

์•ž์„œ ์ •์˜ํ•œ ๋Œ€๋กœ Feature Engineering์€  '๋ชจ๋ธ๋ง์ด ์ข‹์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ๊ฐ ๋ณ€์ˆ˜ ์‚ฌ์ด์˜ ๊ด€๊ณ„๊ฐ€ ๋ช…ํ™•ํ•ด์ง€๊ฒŒ ๊ฐ€๊ณต/ ์„ ๋ณ„ํ•˜๊ฑฐ๋‚˜ ๋ฌธ์ œ ํ•ด๊ฒฐ์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ'ํ•˜๋Š” ๊ณผ์ •์ด๋‹ค. ์ฆ‰, ์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ๋ฉ”์ธ์ด ๋˜๋Š” ๋ถ€๋ถ„์€ ์–ผ๋งˆ๋‚˜ ๋‚ ์นด๋กœ์šด Feature, ์ฆ‰ ํƒ€๊ฒŸ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ๊ฐ€๊ณตํ•˜๋А๋ƒ๋‹ค. ๊ทธ๋Ÿผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ด Feature๋ฅผ ๋‹ค๋“ฌ์–ด์ค„ ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

 

 

* Classification(๋ถ„๋ฅ˜) : bin(ํ†ต)์œผ๋กœ ๊ตฌ๋ถ„ ํ›„ Target ๋ณ€์ˆ˜์™€์˜ ๊ด€๊ณ„ ํŒŒ์•…
* Regression(ํšŒ๊ท€) : Target ๋ณ€์ˆ˜์™€์˜ correlation์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ bin(ํ†ต)์œผ๋กœ ๊ตฌ๋ถ„ ํ›„ Target ๋ณ€์ˆ˜์™€์˜ ๊ด€๊ณ„ ํŒŒ์•…

 

 

์ด์ค‘ Classification, ๋ถ„๋ฅ˜ ๋ฐฉ์‹์€ OCCUPATION๊ณผ WAGE ๊ฐ’์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ’ ๋ณ„(bin)๋กœ ํ‘œ๋กœ ์ •๋ฆฌํ–ˆ๋˜ ๊ทธ ๋ฐฉ์‹์ด๋‹ค. OCCUPATION์ด ๋ฌธ์ž์—ด ๋ณ€์ˆ˜์ด๊ณ  WAGE์ด ์—ฐ์†ํ˜• ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๊นŠ๊ฒŒ ๋ถ„์„ํ•ด๋ณผ ์ˆ˜ ์—†์—ˆ๋‹ค. ์•„๋ž˜์„œ๋Š” ์—ฐ์†ํ˜• ๋ณ€์ˆ˜์™€ ์—ฐ์†ํ˜• ๋ณ€์ˆ˜์™€์˜ ๋น„๊ต๋ฅผ Regression, ํšŒ๊ท€ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ด ๋ณด๊ฒ ๋‹ค.

 

 

 

 

 

Feature Engineering: Numerical features

 

 

Numerical feature๋ถ€ํ„ฐ ๋‹ค๋ค„ ๋ณธ๋‹ค. ์šฐ์„  ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๊ณ ,

 

!pip install optbinning
# ํŒจํ‚ค์ง€ ์„ค์น˜

 

 

seaborn ํŒจํ‚ค์ง€์˜ heatmap plot์œผ๋กœ x์™€ y๊ฐ€ ๊ฐ๊ฐ ๋งŒ๋‚˜๋Š” ์ง€์ ์—์„œ ์ƒ๊ด€๊ณ„์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ผ ์žˆ๋Š”์ง€ ์‹œ๊ฐํ™”๋œ ํ˜•ํƒœ๋กœ ํŒŒ์•…ํ•ด ๋ณด๊ฒ ๋‹ค. 

# โ–ถ heatmap plot
 
import seaborn as sns
import matplotlib.pyplot as plt
 
# โ–ถ ๋ชจ๋“  ์กฐํ•ฉ, ์ƒ๊ด€๊ณ„์ˆ˜ ํ‘œํ˜„
df_pair = df[numerical_list]
mask = np.triu(np.ones_like(df_pair.corr(), dtype=np.bool))
sns.heatmap(df_pair.corr(), vmin = -1, vmax = +1, annot = True, cmap = 'coolwarm', mask = mask);
plt.gcf().set_size_inches(10, 5)

 

 

corr ๋Š” ์ฝ”๋Ÿด๋ ˆ์ด์…˜์ด๋‹ค. ์ƒ๊ด€ ๊ณ„์ˆ˜๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ๊ฐ’์ด๊ณ  ์—ฐ์ด์–ด ๋‚˜์˜ค๋Š” ๊ฒƒ๋“ค์€ ์‹œ๊ฐํ™” ์˜ต์…˜๋“ค์ด๋‹ค. 

vmin/ vmax๋Š” ๋ฒ„ํ‹ฐ์ปฌ ๋ ˆ์ธ์ง€๋ฅผ ์ •ํ•ด ์ฃผ๋Š” ๊ฐ’์ด๋‹ค. ์ƒ๊ด€๊ณ„์ˆ˜์˜ ๋ ˆ์ธ์ง€๋ฅผ -1๋ถ€ํ„ฐ 1๊นŒ์ง€ ์„ค์ •ํ•˜๋Š” ๊ฒƒ.

annot์€ annotation true๋กœ ์‹ค์ œ ์ƒ๊ด€๊ณ„์ˆ˜์— ๋Œ€ํ•œ ์ˆซ์ž๋ฅผ ๊ทธ๋ž˜ํ”„ ์œ„์— ์“ธ ๊ฑฐ๋ƒ ๋ง ๊ฑฐ๋ƒ” ๋œป์ด๋‹ค. ์“ฐ๋Š” ๊ฒŒ ๋” ์ง๊ด€์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ๋Š” ํ‘œ์‹œํ–ˆ๋‹ค.

mask = mask๋Š” ์ค‘๋ณต ๊ฐ’์„ ๊ทธ๋ž˜ํ”„์—์„œ ์ œ๊ฑฐํ•˜๋Š” ์‹์ด๋‹ค. ๋งŒ์•ฝ์— ์ œ๊ฑฐํ•˜์ง€ ์•Š์œผ๋ฉด ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋™์ผํ•œ ๊ฐ’์ด ๋ฐ์นผ์ฝ”๋งˆ๋‹ˆ์ฒ˜๋Ÿผ ๊ธฐ์ž…๋œ๋‹ค.

 

 

 

 

ํ‘œ๋ฅผ ๋ณด์ž. 0.2 ์ด์ƒ์ด๋ฉด ๋ณดํ†ต ์–ด๋А ์ •๋„ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค๊ณ  ๋ณธ๋‹ค. ์ด๋ฅผ ๋„˜๊ธด ๊ฐ’์ด ๋‘ ๊ฐœ, ์‚ด์ง ๋œ ๋„๋‹ฌํ•œ ๊ฐ’ ํ•˜๋‚˜๊ฐ€ ๋ณด์ธ๋‹ค. ๋นจ๊ฐ›๊ฒŒ ๋“ค์–ด๊ฐ„ ๋ถ€๋ถ„์„ ๋ณด๋ฉด AGE์™€ EXPERIENCE์˜ ๊ด€๊ณ„๋‹ค. ๋‚˜์ด๊ฐ€ ๋งŽ์„ ์ˆ˜๋ก ๊ฒฝ๋ ฅ์ด ๋งŽ๋ƒ” ๊ฒƒ์ธ๋ฐ ์ถ”๊ฐ€์ ์ธ ํ•ด์„์„ ์š”ํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ์ •๋ณด๊ฐ’์ด๋‹ค. ์กฐ๊ธˆ ๋” ๋ณผ๋งŒํ•œ ์ •๋ณด๋Š” AGE์™€ WAGE ๊ฐ’์ด๋‹ค. ๋‚˜์ด์— ๋”ฐ๋ผ ๊ฒฝ๋ ฅ์ด ๋งŽ๋‹ค๋ฉด ๋‚˜์ด์™€ ์—ฐ๋ด‰๋„ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์„ ๊ฒƒ ๊ฐ™์•˜๋Š”๋ฐ ์œ ์˜๋ฏธํ•œ ๊ฐ’์— ๋„๋‹ฌํ•˜์ง„ ๋ชป ํ–ˆ๋‹ค. ์–ด๋ฆฌ๊ณ  ์‹ค๋ ฅ ์ข‹์€ ์‚ฌ๋žŒ๋“ค์ด ๋งŽ์€ ๋ˆ์„ ๋ฐ›๊ณ  ์žˆ๋‹จ ์‚ฌ์‹ค์˜ ์ฆ์ฏค ๋˜๊ฒ ๋‹ค. ๋‹ค์Œ์€ EDUCATION๊ณผ WAGE์˜ ๊ด€๊ณ„. ์ด๊ฑด ํ™•์‹คํžˆ ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ์–ด ๋ณด์ธ๋‹ค. ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๋ณผ๊นŒ.

 

 

# โ–ถ scatter plot(Followers & Followers_gained)
sns.scatterplot(data = df, x='EDUCATION', y='WAGE');

 

 

 

 

scatter plot, ์‚ฐ์ ๋„ ํ˜•์‹์œผ๋กœ EDUCATION๊ณผ WAGE์˜ ๊ด€๊ณ„๋ฅผ ๊ทธ๋ ค ๋ดค๋‹ค. EDUCATION์ด ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ์ „์ฒด ๊ฐ’์ด ์šฐ์ƒํ–ฅํ•˜๊ณ  ์žˆ๋Š” ์ ์ด ๋ณด์ธ๋‹ค. ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ถ„์„์— ์œ ์˜๋ฏธํ•œ ๋ณ€์ˆ˜๋ผ ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. quantile๋กœ ํ‘œ๋กœ๋„ ๋ด ๋ณด์ž.

 

 

 

 

๊ฐ’์ด ์ ํ•‘ํ•˜๋Š” ๊ตฌ๊ฐ„์ด ๋ช‡ ์žˆ๋‹ค. 3๊ฐœ ์ •๋„์˜ ๊ตฌ๊ฐ„์œผ๋กœ ๋‚˜๋ˆ  ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์›๋ณธ์€ ๊ทธ๋Œ€๋กœ ๋‘๊ณ  ๋ฐ์ดํ„ฐ ๋งˆํŠธ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ตฌ๊ฐ„ํ™”ํ•ด ๋ณด์ž.

 

 

# โ–ถ Binning
df_mart = df.copy()
val = 'EDUCATION'

quantile  = df_mart[val].quantile(q=list(np.arange(0.05,1,0.05)), interpolation = 'nearest')
# quantile

# โ–ถ ๊ทธ๋ฃน ์ดˆ๊ธฐํ™”
df_mart['grp'] = 0

# โ–ถ 40%, 75% ๊ธฐ์ค€์œผ๋กœ ์ด 3๊ฐœ ๊ตฌ๊ฐ„ํ™” ์ง„ํ–‰
for i in  range(len(df_mart[val])) :
  if df_mart.loc[i, val] <= quantile.iloc[7] : # 40%
    df_mart.loc[i, 'grp'] = 1
  elif df_mart.loc[i, val] <= quantile.iloc[14] : # 75%
    df_mart.loc[i, 'grp'] = 2
  else : df_mart.loc[i, 'grp'] = 3

 

 

์„ธ ๊ทธ๋ฃน์˜ ๋น„์œจ์„ ๋ณด์ž.

 

# ๊ทธ๋ฃน ๋น„์œจ

display(df_mart['grp'].value_counts())
display(df_mart['grp'].value_counts(normalize=True))

 

 

 

 

# ์—ฐ๋ด‰ ํ‰๊ท ๊ฐ’

pd.options.display.float_format = '{:.5f}'.format
df_mart.groupby('grp')['WAGE'].mean()

 

 

 

 

0.38์ด๋ผ๋Š” ์ƒ๊ด€๊ณ„์ˆ˜๋กœ๋Š” ์–ผ๋งˆ๋‚˜ ์˜ค๋ฅด๋Š”์ง€ ๊ฐ์ด ์•ˆ ์™”๋˜ ๋ถ€๋ถ„๋„ ๊ทธ๋ฃนํ•‘ํ•ด์„œ ๋ฝ‘์•„ ๋ณด๋ฉด ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ธ๋‹ค. ๊ทธ๋Ÿผ, ์ƒ๊ด€๊ด€๊ณ„๊ฐ€ 0.18์ •๋„์˜€๋˜ AGE์™€ WAGE์˜ ๊ด€๊ณ„๋„ ๊ถ๊ธˆํ•ด์ง„๋‹ค. ํ•œ ๋ฒˆ๋งŒ ๋” ํ•ด๋ณด์ž.

 

 
# โ–ถ scatter plot(Followers & Followers_gained)
sns.scatterplot(data = df, x='AGE', y='WAGE');

 

 

 

 

 

# โ–ถ Binning
df_mart = df.copy()
val = 'AGE'

quantile  = df_mart[val].quantile(q=list(np.arange(0.05,1,0.05)), interpolation = 'nearest')
# quantile

# โ–ถ ๊ทธ๋ฃน ์ดˆ๊ธฐํ™”
df_mart['grp'] = 0

# โ–ถ 40%, 75% ๊ธฐ์ค€์œผ๋กœ ์ด 3๊ฐœ ๊ตฌ๊ฐ„ํ™” ์ง„ํ–‰
for i in  range(len(df_mart[val])) :
  if df_mart.loc[i, val] <= quantile.iloc[3] : # 40%
    df_mart.loc[i, 'grp'] = 1
  elif df_mart.loc[i, val] <= quantile.iloc[14] : # 75%
    df_mart.loc[i, 'grp'] = 2
  else : df_mart.loc[i, 'grp'] = 3

 

 

# โ–ถ bin๋ณ„ ๋น„์ค‘ ๋น„๊ต
display(df_mart['grp'].value_counts())
display(df_mart['grp'].value_counts(normalize=True))

 

 

 

 

# โ–ถ bin๋ณ„ Target ๋ณ€์ˆ˜์™€์˜ ๊ด€๊ณ„
pd.options.display.float_format = '{:.5f}'.format
df_mart.groupby('grp')['WAGE'].mean()

 

 

 

 

์œ ์˜๋ฏธํ•œ ๊ด€๊ณ„๊ฐ€ ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ด์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•๋“ค๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐพ์•„๋‚ด๊ฑฐ๋‚˜ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ฑธ๋Ÿฌ ์ฃผ๋Š” ์ž‘์—…์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ํ€„๋ฆฌํ‹ฐ๋ฅผ ๋ณด๊ฐ•ํ•˜๊ฑฐ๋‚˜ ๋ถ„์„ ๋ฐฉํ–ฅ์„ฑ์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

 

 

 

Feature Engineering: Catergorical features

 

Catergorical feature๋„ (Numerical feature๋งŒํผ ๋ณผ๋ฅจ์ด ํฌ์ง„ ์•Š์ง€๋งŒ) ๊ทธ๋ž˜ํ”„, ํ‘œ ๋“ฑ์œผ๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๋ถ„์„ ๋ชฉ์ ๋ณด๋‹ค๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์—ฐ์†ํ˜• ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋ณด๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด ๋” ํฌ๋‹ค.

 

 

df[categorical_list].head()

 

 

 

 

meta

 

 

 

 

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
plt.style.use(['dark_background'])

# โ–ถ target ๊ธฐ์ค€(hue,์ƒ‰์ƒ)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ Plot
sns.catplot(x="SECTOR", kind="count",palette="pastel", edgecolor=".6",data=df);
# plt.xticks(rotation=-20)
plt.gcf().set_size_inches(25, 3)

# โ–ถ sample col eda
eda_df = df.groupby('SECTOR')['WAGE'].agg(mean =('mean')).reset_index()
display(eda_df)

 

 

 

 

*ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” ํŒจ์ŠคํŠธ์บ ํผ์Šค์˜ ๋ฐ”์ดํŠธ ๋””๊ทธ๋ฆฌ EXPORT ๊ฐ•์˜์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ์…‹ ๋ฐ ์ž๋ฃŒ๋กœ ์ž‘์„ฑ๋๋‹ค.

๋”๋ณด๊ธฐ
TOOLS/Python

 

 

 

์ƒํ™ฉ ์„ค์ •

 

A์‚ฌ๋Š” ์ด๋ฒˆ์— ์ƒˆ๋กญ๊ฒŒ ํšŒ์‚ฌ๋ฅผ ๋Ÿฐ์นญํ•˜๊ฒŒ ๋˜์–ด ๊ธ‰์—ฌ ์ฒด๊ณ„๋ฅผ ์ƒˆ๋กœ ์ˆ˜๋ฆฝํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ์›ํ™œํ•œ ์šด์˜์„ ์œ„ํ•ด ๋Œ€๊ทœ๋ชจ ์ฑ„์šฉ์„ ์ง„ํ–‰ํ•  ์˜ˆ์ •์ด๋ฉฐ, ์ด์— ๋”ฐ๋ผ ์ง๊ธ‰๋ณ„/ ์ง๋ฌด๋ณ„ ๊ธ‰์—ฌ Band๋ฅผ ์ˆ˜๋ฆฝํ•˜๊ธฐ ์œ„ํ•ด ์ง€์›์ž๋“ค์˜ ํ”„๋กœํ•„ ์ •๋ณด์™€ ์ž์‚ฐ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•ด ๊ธ‰์—ฌ๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ  ๊ธ‰์—ฌ Band ์„ค์ •์— ๋ฒ ์ด์Šค ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถ„์„์„ ์ง„ํ–‰ํ•˜๊ธฐ์— ์•ž์„œ, A์‚ฌ์˜ ๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€์ธ ๋‚˜๋Š” ๋ฌธ์ œ ์ƒํ™ฉ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ฑ๋‚ฑ์ด ์‚ดํŽด๋ณด๊ณ  ์œ ์˜๋ฏธํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ํ™˜๊ฒฝ๊ณผ ๋ถ„์„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ–์ถ”๊ณ ์ž ํ•˜๊ณ  ์žˆ๋‹ค.

 

 

 

 

 

๋ฌธ์ œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค ์ •์˜

 

๋‚ด๊ฐ€ ์ด ๋ฐ์ดํ„ฐ ์˜ˆ์ธก ๋ชจ๋ธ์„ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ A์‚ฌ ๋‚ด๋ถ€์˜ ์ธ๋ ฅ ์šด์˜ ํšจ์œจ์˜ ์‹ค์งˆ์ ์ธ ๊ฐœ์„ ์„ ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ํ˜„์žฌ A์‚ฌ์˜ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ •ํ™•ํžˆ ์ •์˜ํ•ด์•ผ ํ•˜๊ณ , ์ด ๋ชจ๋ธ ๊ฐœ๋ฐœ์„ ํ†ตํ•ด ์–ป๊ฒŒ ๋  ์ด๋“๊ณผ ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๋ฐฉ์•ˆ์— ๋Œ€ํ•ด์„œ๋„ ์ˆ™๊ณ ํ•ด๋ด์•ผ ํ•œ๋‹ค. ๋ชจ๋ธ ๊ตฌ์ถ• ์ดํ›„์—๋Š” ํ•ด๋‹น ๋ชจ๋ธ๋ง์„ ํ†ตํ•ด ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ์ดํ„ฐ๋กœ ๋‚จ๋Š” ์‹œ์Šคํ…œ์„ ์„ ๊ตฌ์ถ•ํ•ด ๋†“์•„์•ผ ํ•˜๋ฉฐ ์ด ๋ชจ๋ธ์ด ๋ณธ๋ž˜ ๋ชฉ์ ์ธ ๋ฌธ์ œ ์ƒํ™ฉ์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์–ผ๋งˆ๋‚˜ ๊ธฐ์—ฌํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ธฐ์ค€๋„ ๋ช…ํ™•ํžˆ ์„ธ์›Œ ๋†“์•„์•ผ ํ•œ๋‹ค. ๋‚˜๋Š” ์œ„์™€ ๊ฐ™์€ ์˜๋ฌธ์„ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•œ ์‹œํŠธ๋ฅผ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ๋‘๊ณ  ์ž‘์—…ํ•˜๊ณ ์ž ํ•œ๋‹ค. ๊ทธ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

๋ฌธ์ œ์ •์˜

โ–ถ ํ˜„์ƒ : ์‹ ๊ทœ ๋น„์ง€๋‹ˆ์Šค ์ง„์ถœ๋กœ ์ธํ•œ ๊ธ‰์—ฌ Band ๋ถ€์žฌ
โ–ถ ๋ฆฌ์Šคํฌ : ํ•œ์ •๋œ ์ฑ„์šฉ ๋น„์šฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ , ๋ชฉํ‘œํ•œ ์ธ์›์ˆ˜์˜ ์ฑ„์šฉ์ด ์–ด๋ ค์›Œ์ง, ์—ฐ๋ด‰์ด ๊ณผ๋„ํ•˜๊ฒŒ ์„ค์ •๋˜์–ด ๊ด€๋ฆฌ ๋น„์šฉ์˜ ์ฆ๊ฐ€

๊ธฐ๋Œ€ํšจ๊ณผ
โ–ถ ๊ธ‰์—ฌ Band ์‹ ์„ค๋กœ ์ฑ„์šฉ ๊ธฐ๋ฐ˜ ์ค€๋น„
โ–ถ ๊ธ‰์—ฌ Band ํ™œ์šฉ ์ฑ„์šฉ ์ง„ํ–‰์œผ๋กœ, ์ฑ„์šฉ ๋น„์šฉ ํšจ์œจํ™”

ํ•ด๊ฒฐ๋ฐฉ์•ˆ
โ–ถ ๊ธ‰์—ฌ(Wage) ์˜ˆ์ธก ๋ชจ๋ธ ๊ฐœ๋ฐœ
โ–ถ ์‹ ์ž… ์ง์› ์ง€์› ์‹œ ์ด๋ ฅ์„œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ ์ •๋ณด๋“ค์„ ์ˆ˜์ง‘
โ–ถ ์ˆ˜์ง‘๋œ Data๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ง€์›์ž์˜ ์—ฐ๋ด‰ Band ํŒ๋‹จ

 

์„ฑ๊ณผ์ธก์ •
โ–ถ As-is : X
โ–ถ To-be : ์ฃผ์–ด์ง„ ์ฑ„์šฉ ๋น„์šฉ์•ˆ์— ๋ชฉํ‘œํ•œ ์ธ์› ์ฑ„์šฉ ๋‹ฌ์„ฑ ์—ฌ๋ถ€


๋ชจ๋ธ์šด์˜ 
โ–ถ ์‹ ์ž… ์ง์› ์ง€์› ์‹œ ์ด๋ ฅ์„œ๋ฅผ ํ†ตํ•ด ๊ธฐ๋ณธ์ •๋ณด๋“ค์„ ์ˆ˜์ง‘
โ–ถ ์ˆ˜์ง‘๋œ Data๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ง€์›์ž์˜ ์—ฐ๋ด‰ Band ํŒ๋‹จ
โ–ถ ์ง€์›์ž ๋ฐœ์ƒ ์‹œ์ ๋งˆ๋‹ค ๋ชจ๋ธ๋ง ์ˆ˜ํ–‰ ํ›„ ๊ฒฐ๊ณผ ์ถœ๋ ฅ


 

 

 

Data Info Check : ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ

 

๋ฌธ์ œ ํ•ด๊ฒฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ตฌ์ฒดํ™”๋๋‹ค. ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๋‚˜๋Š” ๋‹ค๋ฃฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒœ์ฒœํžˆ ์‚ดํŽด๋ณด๋ฉด์„œ ๋ฐ์ดํ„ฐ์˜ ๊ณจ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ณ , ๋™์‹œ์— ์ „์ฒ˜๋ฆฌ๋„ ์ง„ํ–‰ํ•ด ์ฃผ๊ธฐ๋กœ ํ–ˆ๋‹ค. ๊ธฐ์กด ํฌ์ŠคํŠธ์—์„œ ๋‹ค๋ค˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, Tidy data๋กœ ๋งŒ๋“ค์–ด ์ค˜์•ผ ํ•˜๊ฒ ๊ณ , ๋ฌธ์žํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ˆซ์žํ˜• ๋ฐ์ดํ„ฐ๋กœ ์ธ์ฝ”๋”ฉํ•ด์ฃผ๋Š” ๊ณผ์ •๋„ ํ•„์š”ํ•  ๊ฒƒ์ด๋‹ค. ์ด๋ฒˆ ์ฑ•ํ„ฐ์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋‹ค์„ฏ ๊ฐœ ๋ถ€๋ถ„์—์„œ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์‚ดํŽด ๋ณด๊ณ  ๋™์‹œ์— ์ „์ฒ˜๋ฆฌ ์ง„ํ–‰ํ•ด ์ค„ ๊ฒƒ์ด๋‹ค.

 

  (1) Data shape(ํ˜•ํƒœ) ํ™•์ธ
  (2) Data type ํ™•์ธ
  (3) Null๊ฐ’ ํ™•์ธ (โ€ป ๋นˆ ๊ฐ’์˜ Data)
  (4) ์ค‘๋ณต ๋ฐ์ดํ„ฐ ํ™•์ธ
  (5) Outlier ํ™•์ธ (โ€ป ์ •์ƒ์ ์ธ ๋ฒ”์ฃผ๋ฅผ ๋ฒ—์–ด๋‚œ Data)  

 

 

 

 

df.shape
(534, 11)

 

์šฐ์„  shape๋กœ ๋ฐ์ดํ„ฐ์˜ ํ˜•ํƒœ๋ฅผ ํ™•์ธํ•ด ์ค€๋‹ค. ์ฒ˜์Œ์— ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ๋กœ์šฐ ๊ฐ’, ๋’ค์ด์–ด ๋‚˜์˜ค๋Š” ๊ฒƒ์ด ์ปฌ๋Ÿผ ๊ฐ’์ด๋‹ค.

 

 

 

 

df.info()

 

์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ถœ๋ ฅ๋œ๋‹ค. 11๊ฐœ์˜ ์ปฌ๋Ÿผ์ด ์ค„์ง€์–ด ์žˆ๊ณ , ์ „์ฒด 534๊ฐœ์˜ ๋กœ์šฐ ์ค‘ null ๊ฐ’์€ ์—†๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ int์ง€๋งŒ, WAGE๋Š” float ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ์‹œ๊ฐ„๋‹น ๋‹ฌ๋Ÿฌ ์ˆ˜์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์†Œ์ˆ˜์ ์ด ํฌํ•จ๋œ ๊ฐ’์ด ๋‚˜์™€์„œ ๊ทธ๋Ÿด ๊ฑฐ๋‹ค.

 

 

 

 

 

print(df.isnull().sum())

 

isnull๋กœ ์ „์ฒด null ๊ฐœ์ˆ˜๋ฅผ ์ฒดํฌํ•˜๊ณ  ๊ทธ ๊ฐ’์„ sum์œผ๋กœ ๋”ํ•˜๋ฉด ์ „์ฒด null ๊ฐœ์ˆ˜๊ฐ€ ๋‚˜์˜ฌ ๊ฑฐ๋‹ค. null ๊ฐ’์ด ๋„ˆ๋ฌด ๋†’์€(95% ์ด์ƒ) ์ปฌ๋Ÿผ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ด ์ฃผ๊ฑฐ๋‚˜ ์ถ”๊ฐ€์ ์œผ๋กœ ์ˆ˜์ง‘ ํ›„ ๋ถ„์„์„ ์ง„ํ–‰ํ•ด ์ฃผ๋Š” ๊ฒŒ ์ข‹๋‹ค. ๋ฌผ๋ก  ์ด ๋ฐ์ดํ„ฐ์…‹์—์„œ๋Š” ์œ„์—์„œ ๋กœ์šฐ ์ˆ˜๋กœ ํ•œ ๋ฒˆ ์ฒดํฌํ–ˆ๋“ฏ์ด, null๊ฐ’์ด ํฌํ•จ๋œ ์…€์€ ์—†๋‹ค. 

 

 

 

 

 

 

df.duplicated().value_counts()

 

duplicated๋กœ ์ค‘๋ณต์„ ์ฒดํฌํ•ด ์ฃผ๊ณ  ๊ทธ ๊ฐ’์„ ์„ผ๋‹ค. True์ธ ๊ฐ’์€ ์ค‘๋ณต๊ฐ’์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” False 534๊ฐœ๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ๋กœ์šฐ ์ค‘์— ์ค‘๋ณต๊ฐ’์ด ์—†๋‹ค๋Š” ๋œป์ด ๋˜๊ฒ ๋‹ค.

 

 

 

 

 

 

list_of_df = []

for i in df.columns :
 loof_df = pd.DataFrame({'val' : [i],
                         'zero_cnt': df[df[i] == 0][i].count()})
 list_of_df.append(loof_df)

df_merge  = pd.concat(list_of_df).reset_index(drop=True)
df_merge['zero_ratio'] = df_merge['zero_cnt'] / len(df)
df_merge.sort_values(by=['zero_ratio'], ascending = False)

 

null, ์ค‘๋ณต ๋ง๊ณ ๋„ 0 ๊ฐ’์˜ ๋น„์œจ๋„ ์ฒดํฌํ•ด ๋ณธ๋‹ค. 0์ด 98% ์ด์ƒ์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ๋ถ„๋ฅ˜ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ณ€๋ณ„๋ ฅ์ด ์—†๋‹ค๊ณ  ๋ด๋„ ๋ฌด๋ฐฉํ•  ํ…Œ๋‹ˆ๊นŒ. ์•„๋ž˜ ํ‘œ์—์„œ ๋ณด์ด๋“ฏ ์ง€์›Œ์ค„ ๋งŒํผ ๋ณ€๋ณ„๋ ฅ ์—†๋Š” ๋ฐ์ดํ„ฐ๋Š” ์—†์—ˆ๋‹ค.

 

 

 

 

 

Data Info Check : ํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„(EDA)

 

 

 

df.head()

 

 

์œ„์—์„œ ์ผ์ฐจ์ ์œผ๋กœ ํ˜•์‹์„ ์ ๊ฒ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ƒ˜ํ”Œ ์ž๋ฃŒ๋ฅผ ๋ฝ‘์•„ ๋ณด๋ฉด์„œ ๋ฐ์ดํ„ฐ ๊ฐ’ ์ž์ฒด๊ฐ€ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ •์ œ๋ผ ์žˆ๋Š”์ง€ ์ ๊ฒ€ํ•œ๋‹ค. ํŠนํžˆ numeric(์ˆซ์žํ˜•)๊ณผ catergorical(๋ฒ”์ฃผํ˜•) ๋ณ€์ˆ˜๋ฅผ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ  ๋‘๊ณ  ์ธ์ง€ํ•˜๊ณ  ์žˆ์–ด์•ผ๋งŒ ํ•œ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๋ฒ”์ฃผ ์•ˆ์—์„œ ์›€์ง์ด๊ณ  ์žˆ๋Š”์ง€ ๋Œ€๊ฐ• ํŒŒ์•…๋  ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

import numpy as np
import pandas as pd
# โ–ถ numeric, categorical value ๋‚˜๋ˆ„๊ธฐ
numerical_list=[]
categorical_list=[]

for i in df.columns :
  if df[i].dtypes == 'O' :
    categorical_list.append(i)
  else :
    numerical_list.append(i)
 
# โ–ถ %๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•
# for i in df.columns :
#   if df[i].nunique() < len(df)*0.05 :
#     categorical_list.append(i)
#   else :
#     numerical_list.append(i)
 
print("numerical_list:", numerical_list)
print("categorical_list:", categorical_list)

 

 

numeric๊ณผ catergorical ๋ณ€์ˆ˜๋ฅผ ๊ฐ๊ฐ ๋‚˜๋ˆ ์„œ ํ”„๋ฆฐํŠธํ•ด ๋ณธ๋‹ค. ๋ฌผ๋ก  ํŒ๋‹จ ๋ฐฉ์‹์ด ๋‹จ์ˆœํžˆ ๊ฐ’์ด ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€, ๋ฌธ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๊ณผ์ •์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋งน์‹ ํ•  ์ˆœ ์—†๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์„ฑ๋ณ„์ด๋‚˜ ๊ตญ๊ฐ€์ฒ˜๋Ÿผ ๋‹จ์ˆœํžˆ ๋ถ„๋ฅ˜๋ฅผ ์œ„ํ•œ ์ˆซ์ž๊ฐ’์€ catergorical์— ๋” ๊ฐ€๊น๋‹ค. ์ฃผ์„์€ ์œ„์™€ ๊ฐ™์€ ๋งฅ๋ฝ์—์„œ ์œ ๋‹ˆํฌํ•œ ๊ฐ’์ด 5% ๋ฏธ๋งŒ์ธ ์ปฌ๋Ÿผ์„ catergorical๋กœ ๋ฐ”๊ฟ” ๋†“๋Š” ์‹์ด๋‹ค. 

 

 

 

 

 

list_of_df = []

for i in numerical_list :
 loof_df = pd.DataFrame({'val' : [i],
              'nunique': df[i].nunique()})
 list_of_df.append(loof_df)

df_merge  = pd.concat(list_of_df).reset_index(drop=True)
df_merge.sort_values(by=['nunique'], ascending = False)

 

 

 

 

 

 

 

์œ„ ์‹์ฒ˜๋Ÿผ ์ „์ฒด ์ปฌ๋Ÿผ์„ ์ถœ๋ ฅํ•ด ๋ณด๋ฉด, ์ฃผ์„์˜ ๋ฐฉ์‹์„ ์ ์šฉ ์‹œ catergorical๋กœ ๋ถ„๋ฅ˜๋  ์ปฌ๋Ÿผ์ด ๊ฝค ๋งŽ์•„ ๋ณด์ธ๋‹ค. ์ฃผ์„๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ, catergorical ๋ณ€์ˆ˜๊ฐ€ ๋งŽ์ด ์†Œ์†๋˜๋Š” meta ํƒญ๊ณผ ๋น„๊ต๋ถ„์„ํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด catergorical ๋ณ€์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•ด ์ฃผ์ž.

 

meta

 

 

 

 

 

 

# โ–ถ meta col ํ™•์ธ
meta.columns[1:]

 

 

 

 

 

 

# โ–ถ categorical list ์ •์˜
categorical_list = meta.columns[1:]
print(categorical_list)

 

 

 

 

 

 

 

numerical์€ ์ด ๊ฒฝ์šฐ์— ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ์— ์†Œ์†๋˜์ง€ ์•Š์€ ์ปฌ๋Ÿผ์ด ๋œ๋‹ค.

for i in categorical_list :
  numerical_list.remove(i)
print(numerical_list)

 

 

 

 

 

 

Data Info Check: ์ข€๋งŒ ๋” ์กฐํšŒ

 

์•„๋ž˜๋กœ๋Š” ์กฐํšŒ์— ์ถ”๊ฐ€์ ์œผ๋กœ ํ™œ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ์‹์ด๋‹ค.

 
# โ–ถ categorical_list value unique ๊ฐ’ ํ™•์ธ (1)
list_of_df = []

for i in categorical_list :
 loof_df = pd.DataFrame({'val' : [i],
              'nunique': df[i].nunique()})
 list_of_df.append(loof_df)

df_merge  = pd.concat(list_of_df).reset_index(drop=True)
df_merge.sort_values(by=['nunique'], ascending = False)

 

 

 

 

 

 

 

df['EDUCATION'].value_counts()

 

 

 

 

ํ•ด๋‹น ํฌ์ŠคํŠธ๋Š” ํŒจ์ŠคํŠธ์บ ํผ์Šค์˜ ๋ฐ”์ดํŠธ ๋””๊ทธ๋ฆฌ EXPORT ๊ฐ•์˜์—์„œ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ์…‹ ๋ฐ ์ž๋ฃŒ๋กœ ์ž‘์„ฑ๋๋‹ค.

'TOOLS > Python' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Python ๋ชจ๋ธ๋ง: ํšŒ๊ท€(Regression) / 2step. Data Readiness Check, Feature Engineering  (0) 2024.02.02
๋”๋ณด๊ธฐ
TOOLS/Python