๐Ÿ Python ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹: ๊นจ๋—ํ•œ ๋ฐ์ดํ„ฐ๋กœ ์ •ํ™•ํ•œ ๋ถ„์„ํ•˜๊ธฐ ๐Ÿงน

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ Python ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹: ๊นจ๋—ํ•œ ๋ฐ์ดํ„ฐ๋กœ ์ •ํ™•ํ•œ ๋ถ„์„ํ•˜๊ธฐ ๐Ÿงน

 

 

์•ˆ๋…•, ํŒŒ์ด์ฌ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์— ๊ด€์‹ฌ ์žˆ๋Š” ์นœ๊ตฌ๋“ค! ์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ ๋ถ„์„ํ•  ๋•Œ ์ •๋ง ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์— ๋Œ€ํ•ด ์žฌ๋ฏธ์žˆ๊ฒŒ ์–˜๊ธฐํ•ด๋ณผ ๊ฑฐ์•ผ. ๐Ÿ˜Š ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์ด ๋ญ๋ƒ๊ณ ? ๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด ๋”๋Ÿฌ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์–ด. ๋งˆ์น˜ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฉ ์ฒญ์†Œ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿงผ

๋ฐ์ดํ„ฐ ๋ถ„์„์€ ์š”์ฆ˜ ์ •๋ง ํ•ซํ•œ ๋ถ„์•ผ์ง€? ๊ทธ๋Ÿฐ๋ฐ ์•„๋ฌด๋ฆฌ ์ข‹์€ ๋ถ„์„ ๊ธฐ์ˆ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด๋„, ๋ฐ์ดํ„ฐ๊ฐ€ ์—‰๋ง์ด๋ฉด ์ œ๋Œ€๋กœ ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์–ด. ๊ทธ๋ž˜์„œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์ด ๊ผญ ํ•„์š”ํ•œ ๊ฑฐ์•ผ. ๋งˆ์น˜ ์š”๋ฆฌํ•  ๋•Œ ์‹ ์„ ํ•œ ์žฌ๋ฃŒ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ง์ด์•ผ! ๐Ÿฅ•๐Ÿ…

์ด ๊ธ€์—์„œ๋Š” Python์„ ์‚ฌ์šฉํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆฌ๋‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. Python์€ ๋ฐ์ดํ„ฐ ๋ถ„์„์— ์ •๋ง ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ธ๋ฐ, ํŠนํžˆ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์—๋„ ์•„์ฃผ ์œ ์šฉํ•ด. ๋งˆ์น˜ ๋งŒ๋Šฅ ์ฒญ์†Œ ๋„๊ตฌ ๊ฐ™์€ ๊ฑฐ์ง€! ๐Ÿงฐ

๊ทธ๋ฆฌ๊ณ  ๋ง์ด์•ผ, ์šฐ๋ฆฌ๊ฐ€ ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์Šคํ‚ฌ์„ ์ตํžˆ๋ฉด ์–ด๋–ค ์ ์ด ์ข‹์„๊นŒ? ๋ฐ”๋กœ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ์šฐ๋ฆฌ์˜ ์‹ค๋ ฅ์„ ๋ฝ๋‚ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์•ผ! ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ „๋ฌธ๊ฐ€๋กœ ํ™œ๋™ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ๋ฐ์ดํ„ฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์ค„ ์ˆ˜ ์žˆ๊ฒ ์ง€? ๐Ÿ˜Ž

์ž, ๊ทธ๋Ÿผ ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Python์œผ๋กœ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž. ์ค€๋น„๋๋‹ˆ? Let's go! ๐Ÿš€

1. ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์ด ์™œ ์ค‘์š”ํ• ๊นŒ? ๐Ÿค”

์นœ๊ตฌ์•ผ, ์ž ๊น ์ƒ์ƒํ•ด๋ด. ๋„ค๊ฐ€ ๋ง›์žˆ๋Š” ์ผ€์ดํฌ๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ์žฌ๋ฃŒ๋“ค์ด ๋‹ค ์ƒํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด. ์•„๋ฌด๋ฆฌ ๋„ค๊ฐ€ ์š”๋ฆฌ ์‹ค๋ ฅ์ด ๋›ฐ์–ด๋‚˜๋„ ๋ง›์žˆ๋Š” ์ผ€์ดํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„๊นŒ? ์ ˆ๋Œ€ ์•ˆ ๋˜๊ฒ ์ง€? ๋ฐ์ดํ„ฐ ๋ถ„์„๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์•ผ. ์•„๋ฌด๋ฆฌ ๋›ฐ์–ด๋‚œ ๋ถ„์„ ๊ธฐ์ˆ ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด๋„, ๋ฐ์ดํ„ฐ๊ฐ€ ์—‰๋ง์ด๋ฉด ์ข‹์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์–ด. ๋ฐ”๋กœ ์ด ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์ด ์ •๋ง ์ค‘์š”ํ•œ ๊ฑฐ์•ผ! ๐Ÿฐ๐Ÿ”

๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ์ค‘์š”์„ฑ:

  • ์ •ํ™•ํ•œ ๋ถ„์„ ๊ฒฐ๊ณผ ๋„์ถœ ๐Ÿ‘‰ ๊นจ๋—ํ•œ ๋ฐ์ดํ„ฐ = ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ
  • ์‹œ๊ฐ„๊ณผ ๋น„์šฉ ์ ˆ์•ฝ ๐Ÿ’ฐ ํด๋ฆฌ๋‹๋œ ๋ฐ์ดํ„ฐ๋กœ ๋ถ„์„ ์‹œ๊ฐ„ ๋‹จ์ถ•
  • ์˜์‚ฌ๊ฒฐ์ • ํ’ˆ์งˆ ํ–ฅ์ƒ ๐Ÿง  ์ •ํ™•ํ•œ ๋ฐ์ดํ„ฐ๋กœ ๋” ๋‚˜์€ ๊ฒฐ์ •
  • ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๊ฐœ์„  ๐ŸŒŸ ์ง€์†์ ์ธ ํด๋ฆฌ๋‹์œผ๋กœ ์ „๋ฐ˜์ ์ธ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ํ–ฅ์ƒ
  • ๋ฒ•์  ๊ทœ์ • ์ค€์ˆ˜ โš–๏ธ ๊ฐœ์ธ์ •๋ณด ๋ณดํ˜ธ๋ฒ• ๋“ฑ ๊ด€๋ จ ๋ฒ•๊ทœ ์ค€์ˆ˜ ์šฉ์ด

์ž, ์ด์ œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ์•Œ๊ฒ ์ง€? ๊ทธ๋Ÿผ ์ด์ œ Python์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆฌ๋‹ํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž. ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šธ ๋‚ด์šฉ๋“ค์€ ์‹ค์ œ๋กœ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์ „๋ฌธ๊ฐ€๋กœ ํ™œ๋™ํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๐Ÿ˜Š

๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ์ค‘์š”์„ฑ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์ •ํ™•์„ฑ ํšจ์œจ์„ฑ ์‹ ๋ขฐ์„ฑ

์œ„์˜ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ์ง€? ์ •ํ™•์„ฑ, ํšจ์œจ์„ฑ, ์‹ ๋ขฐ์„ฑ. ์ด ์„ธ ๊ฐ€์ง€๊ฐ€ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ํ•ต์‹ฌ์ด์•ผ. ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ Python์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ๊นจ๋—ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž! ๐Ÿ•ต๏ธโ€โ™‚๏ธ๐Ÿ’ป

2. Python ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ๊ธฐ๋ณธ: Pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์†Œ๊ฐœ ๐Ÿผ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ Python์œผ๋กœ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์„ ์‹œ์ž‘ํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ทธ ์ „์— ๋จผ์ € ์šฐ๋ฆฌ์˜ ๋“ ๋“ ํ•œ ์กฐ๋ ฅ์ž๋ฅผ ์†Œ๊ฐœํ• ๊ฒŒ. ๋ฐ”๋กœ Pandas๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์•ผ! ๐Ÿผ

Pandas๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„๊ณผ ์กฐ์ž‘์„ ์œ„ํ•œ Python ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ํŠนํžˆ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์— ์ •๋ง ์œ ์šฉํ•ด. ๋งˆ์น˜ ๋ฐ์ดํ„ฐ ์ฒญ์†Œ๋ฅผ ์œ„ํ•œ ๋งŒ๋Šฅ ๋„๊ตฌ ์ƒ์ž ๊ฐ™์€ ๊ฑฐ์ง€! ๐Ÿ˜Š

Pandas์˜ ์ฃผ์š” ํŠน์ง•:

  • ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„(DataFrame) ์ œ๊ณต ๐Ÿ“Š ์—‘์…€ ์‹œํŠธ์™€ ๋น„์Šทํ•œ 2์ฐจ์› ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • ๊ฐ•๋ ฅํ•œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๊ธฐ๋Šฅ ๐Ÿ› ๏ธ ํ•„ํ„ฐ๋ง, ๊ทธ๋ฃนํ™”, ๋ณ‘ํ•ฉ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ
  • ๋‹ค์–‘ํ•œ ํŒŒ์ผ ํ˜•์‹ ์ง€์› ๐Ÿ“ CSV, Excel, SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ
  • ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ ๐Ÿ•ณ๏ธ NaN ๊ฐ’ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌ
  • ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ โฐ ๋‚ ์งœ, ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋‹ค๋ฃจ๊ธฐ ์‰ฌ์›€

Pandas๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋จผ์ € ์„ค์น˜ํ•ด์•ผ ํ•ด. ํ„ฐ๋ฏธ๋„์ด๋‚˜ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ์—์„œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ผ:

pip install pandas

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, Python ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด Pandas๋ฅผ ์ž„ํฌํŠธํ•  ์ˆ˜ ์žˆ์–ด:

import pandas as pd

์—ฌ๊ธฐ์„œ as pd๋Š” Pandas๋ฅผ pd๋ผ๋Š” ๋ณ„์นญ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๋Š” ๋œป์ด์•ผ. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ๋งค๋ฒˆ pandas๋ฅผ ์ „๋ถ€ ์น˜์ง€ ์•Š๊ณ  pd๋งŒ ์จ๋„ ๋ผ์„œ ํŽธ๋ฆฌํ•ด.

์ž, ์ด์ œ Pandas์˜ ๊ธฐ๋ณธ์„ ์•Œ์•˜์œผ๋‹ˆ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์•Œ์•„๋ณด์ž! ๐Ÿš€

Pandas๋กœ CSV ํŒŒ์ผ ์ฝ๊ธฐ

CSV(Comma-Separated Values) ํŒŒ์ผ์€ ๋ฐ์ดํ„ฐ ๋ถ„์„์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ ํ˜•์‹์ด์•ผ. Pandas๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฐ CSV ํŒŒ์ผ์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ฝ์„ ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž:


import pandas as pd

# CSV ํŒŒ์ผ ์ฝ๊ธฐ
df = pd.read_csv('data.csv')

# ๋ฐ์ดํ„ฐ ํ™•์ธ
print(df.head())

์ด ์ฝ”๋“œ๋Š” 'data.csv'๋ผ๋Š” ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์œผ๋กœ ๋งŒ๋“ค๊ณ , ๊ทธ ์ค‘ ์•ž๋ถ€๋ถ„ ๋ช‡ ํ–‰์„ ์ถœ๋ ฅํ•ด. head() ํ•จ์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฒ˜์Œ 5ํ–‰์„ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ๊ด„ํ˜ธ ์•ˆ์— ์ˆซ์ž๋ฅผ ๋„ฃ์–ด์„œ ์›ํ•˜๋Š” ๋งŒํผ์˜ ํ–‰์„ ๋ณผ ์ˆ˜ ์žˆ์–ด.

๋ฐ์ดํ„ฐ ๊ธฐ๋ณธ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ

๋ฐ์ดํ„ฐ๋ฅผ ํด๋ฆฌ๋‹ํ•˜๊ธฐ ์ „์— ๋จผ์ € ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. Pandas๋Š” ์ด๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ์œ ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ด:


# ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์˜ ๊ธฐ๋ณธ ์ •๋ณด ํ™•์ธ
print(df.info())

# ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ํ†ต๊ณ„๋Ÿ‰ ํ™•์ธ
print(df.describe())

# ๊ฐ ์—ด์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž… ํ™•์ธ
print(df.dtypes)

์ด๋Ÿฐ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ, ๊ฐ ์—ด์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…, ๊ฒฐ์ธก์น˜ ์—ฌ๋ถ€, ๊ธฐ๋ณธ ํ†ต๊ณ„๋Ÿ‰ ๋“ฑ์„ ํ•œ๋ˆˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ๋‚˜๋ฉด, ์–ด๋–ค ๋ถ€๋ถ„์„ ํด๋ฆฌ๋‹ํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์˜ฌ ๊ฑฐ์•ผ.

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

๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์˜ˆ์ œ

์ž, ์ด์ œ ์ •๋ง ๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์˜ˆ์ œ๋ฅผ ํ•˜๋‚˜ ํ•ด๋ณผ๊ฒŒ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž:


import pandas as pd

data = {
    'Name': ['John', 'Anna', 'Peter', 'Linda'],
    'Age': [28, 34, None, 32],
    'City': ['New York', 'Paris', 'Berlin', 'London']
}

df = pd.DataFrame(data)
print(df)

์ด ๋ฐ์ดํ„ฐ์—์„œ Peter์˜ ๋‚˜์ด(Age)๊ฐ€ None, ์ฆ‰ ๊ฒฐ์ธก์น˜์•ผ. ์ด๊ฑธ ํ‰๊ท  ๋‚˜์ด๋กœ ์ฑ„์›Œ๋„ฃ๋Š” ๊ฐ„๋‹จํ•œ ํด๋ฆฌ๋‹์„ ํ•ด๋ณด์ž:


# ํ‰๊ท  ๋‚˜์ด ๊ณ„์‚ฐ (๊ฒฐ์ธก์น˜ ์ œ์™ธ)
mean_age = df['Age'].mean()

# ๊ฒฐ์ธก์น˜๋ฅผ ํ‰๊ท  ๋‚˜์ด๋กœ ์ฑ„์šฐ๊ธฐ
df['Age'] = df['Age'].fillna(mean_age)

print(df)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Peter์˜ ๋‚˜์ด๊ฐ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์˜ ํ‰๊ท  ๋‚˜์ด๋กœ ์ฑ„์›Œ์ง€๊ฒŒ ๋ผ. ๋ฌผ๋ก  ์ด๊ฑด ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๊ณ , ์‹ค์ œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์—์„œ๋Š” ๋” ๋ณต์žกํ•˜๊ณ  ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ๋‹ค๋ค„์•ผ ํ•ด.

์—ฌ๊ธฐ๊นŒ์ง€ Pandas์˜ ๊ธฐ๋ณธ๊ณผ ๊ฐ„๋‹จํ•œ ์‚ฌ์šฉ๋ฒ•์„ ์•Œ์•„๋ดค์–ด. ์ด์ œ ๋„ˆ๋„ Pandas๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ ๋„๊ตฌ์ธ์ง€ ์•Œ๊ฒ ์ง€? ๐Ÿ˜Š ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋” ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๊ธฐ๋ฒ•๋“ค์„ ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ณ„์† ๊ฐ€๋ณด์ž! ๐Ÿš€

Pandas๋ฅผ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๊ณผ์ • ๋ฐ์ดํ„ฐ ๋กœ๋“œ ๋ฐ์ดํ„ฐ ํ™•์ธ ๋ฐ์ดํ„ฐ ์ •์ œ

์œ„ ๊ทธ๋ฆผ์€ Pandas๋ฅผ ์ด์šฉํ•œ ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๊ณผ์ •์„ ๋ณด์—ฌ์ค˜. ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•˜๊ณ , ํ™•์ธํ•˜๊ณ , ์ •์ œํ•˜๋Š” ๊ณผ์ •์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ค„์ง€๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์ง€? ์ด์ œ ์šฐ๋ฆฌ๋Š” ์ด ๊ณผ์ •์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฑฐ์•ผ. ๋‹ค์Œ ์„น์…˜์—์„œ ๊ณ„์†ํ•ด์„œ ์•Œ์•„๋ณด์ž! ๐Ÿ’ช๐Ÿ˜„

3. ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ: NaN ๊ฐ’๊ณผ ์‹ธ์šฐ๊ธฐ ๐ŸฅŠ

์ž, ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ํ•ต์‹ฌ ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ธ ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ๊ฒฐ์ธก์น˜๋ž€ ๋ญ˜๊นŒ? ๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ ๋ฐ์ดํ„ฐ์— ๋นˆ ๊ณณ์ด ์žˆ๋Š” ๊ฑฐ์•ผ. ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ค๋ฌธ ์กฐ์‚ฌ์—์„œ ์–ด๋–ค ์‚ฌ๋žŒ์ด ํŠน์ • ์งˆ๋ฌธ์— ๋Œ€๋‹ต์„ ์•ˆ ํ–ˆ๋‹ค๋ฉด ๊ทธ ๋ถ€๋ถ„์ด ๊ฒฐ์ธก์น˜๊ฐ€ ๋˜๋Š” ๊ฑฐ์ง€. Python์—์„œ๋Š” ์ด๋Ÿฐ ๊ฒฐ์ธก์น˜๋ฅผ ๋ณดํ†ต NaN(Not a Number)์ด๋ผ๊ณ  ํ‘œํ˜„ํ•ด.

๊ฒฐ์ธก์น˜๋Š” ๋ฐ์ดํ„ฐ ๋ถ„์„์— ํฐ ๋ฐฉํ•ด๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด. ์™œ๋ƒํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„์˜ ๋ถ„์„ ํ•จ์ˆ˜๋“ค์€ ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ์œผ๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๊ฑฐ๋“ . ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์ด ๊ฒฐ์ธก์น˜๋“ค์„ ์ ์ ˆํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•ด. ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋ƒ๊ณ ? ์ž, ์ง€๊ธˆ๋ถ€ํ„ฐ ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด์ž! ๐Ÿ•ต๏ธโ€โ™‚๏ธ

1. ๊ฒฐ์ธก์น˜ ํ™•์ธํ•˜๊ธฐ

๋จผ์ € ์šฐ๋ฆฌ ๋ฐ์ดํ„ฐ์— ๊ฒฐ์ธก์น˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ด. Pandas์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•œ ํŽธ๋ฆฌํ•œ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•ด:


# ๊ฒฐ์ธก์น˜ ๊ฐœ์ˆ˜ ํ™•์ธ
print(df.isnull().sum())

# ๊ฒฐ์ธก์น˜ ๋น„์œจ ํ™•์ธ
print(df.isnull().mean())

์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ฐ ์—ด๋งˆ๋‹ค ๊ฒฐ์ธก์น˜๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ „์ฒด ๋ฐ์ดํ„ฐ ์ค‘ ๊ฒฐ์ธก์น˜์˜ ๋น„์œจ์ด ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์–ด. ์ด๋ ‡๊ฒŒ ๊ฒฐ์ธก์น˜์˜ ํ˜„ํ™ฉ์„ ํŒŒ์•…ํ•˜๊ณ  ๋‚˜๋ฉด, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ• ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์ง€.

2. ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐํ•˜๊ธฐ

๊ฒฐ์ธก์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ ๊ทธ๋ƒฅ ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์•ผ. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ์ด ์ค„์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์–ด. ๊ทธ๋ž˜๋„ ๊ฒฐ์ธก์น˜๊ฐ€ ์ ์€ ๊ฒฝ์šฐ์—๋Š” ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€:


# ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰ ์ œ๊ฑฐ
df_cleaned = df.dropna()

# ํŠน์ • ์—ด์— ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰๋งŒ ์ œ๊ฑฐ
df_cleaned = df.dropna(subset=['Age', 'Salary'])

dropna() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰์„ ์‰ฝ๊ฒŒ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด. subset ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŠน์ • ์—ด์— ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰๋งŒ ์„ ํƒ์ ์œผ๋กœ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์ง€.

3. ๊ฒฐ์ธก์น˜ ์ฑ„์šฐ๊ธฐ

๊ฒฐ์ธก์น˜๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋Œ€์‹  ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ์ฑ„์šธ ์ˆ˜๋„ ์žˆ์–ด. ์ด ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ์–‘์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€:


# ํ‰๊ท ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ
df['Age'].fillna(df['Age'].mean(), inplace=True)

# ์ค‘์•™๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ
df['Salary'].fillna(df['Salary'].median(), inplace=True)

# ๊ฐ€์žฅ ๋นˆ๋ฒˆํ•œ ๊ฐ’(์ตœ๋นˆ๊ฐ’)์œผ๋กœ ์ฑ„์šฐ๊ธฐ
df['City'].fillna(df['City'].mode()[0], inplace=True)

# ์ด์ „ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๊ธฐ (์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์— ์œ ์šฉ)
df['Date'].fillna(method='ffill', inplace=True)

fillna() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ์ธก์น˜๋ฅผ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฑ„์šธ ์ˆ˜ ์žˆ์–ด. ํ‰๊ท ๊ฐ’, ์ค‘์•™๊ฐ’, ์ตœ๋นˆ๊ฐ’ ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ์˜ ๊ฒฝ์šฐ ์ด์ „ ๊ฐ’์ด๋‚˜ ์ดํ›„ ๊ฐ’์œผ๋กœ ์ฑ„์šฐ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•ด.

์—ฌ๊ธฐ์„œ inplace=True๋ผ๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์›๋ณธ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ์ง์ ‘ ์ˆ˜์ •ํ•œ๋‹ค๋Š” ๋œป์ด์•ผ. ์ด๊ฑธ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋ผ.

4. ๋ณด๊ฐ„๋ฒ•(Interpolation) ์‚ฌ์šฉํ•˜๊ธฐ

๊ฒฐ์ธก์น˜๋ฅผ ์ฃผ๋ณ€ ๊ฐ’๋“ค์„ ์ด์šฉํ•ด ์ถ”์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์–ด. ์ด๊ฑธ ๋ณด๊ฐ„๋ฒ•์ด๋ผ๊ณ  ํ•ด:


# ์„ ํ˜• ๋ณด๊ฐ„๋ฒ• ์‚ฌ์šฉ
df['Height'].interpolate(method='linear', inplace=True)

์ด ๋ฐฉ๋ฒ•์€ ํŠนํžˆ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋‚˜ ์—ฐ์†์ ์ธ ์ˆ˜์น˜ ๋ฐ์ดํ„ฐ์— ์œ ์šฉํ•ด. ๊ฒฐ์ธก์น˜ ์ฃผ๋ณ€์˜ ๊ฐ’๋“ค์„ ์ด์šฉํ•ด ์ ์ ˆํ•œ ๊ฐ’์„ ์ถ”์ •ํ•˜๋Š” ๊ฑฐ์ง€.

5. ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•: ์˜ˆ์ธก ๋ชจ๋ธ ์‚ฌ์šฉํ•˜๊ธฐ

๋” ๋ณต์žกํ•˜์ง€๋งŒ ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•ด ๊ฒฐ์ธก์น˜๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค๋ฅธ ํŠน์„ฑ๋“ค์„ ์ด์šฉํ•ด ๋‚˜์ด๋ฅผ ์˜ˆ์ธกํ•˜๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€:


from sklearn.impute import SimpleImputer
from sklearn.ensemble import RandomForestRegressor

# ๊ฒฐ์ธก์น˜๊ฐ€ ์—†๋Š” ํŠน์„ฑ๋“ค ์„ ํƒ
features = ['Height', 'Weight', 'Salary']
X = df[features]
y = df['Age']

# ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰ ์ œ์™ธ
mask = ~X.isnull().any(axis=1) & ~y.isnull()
X_train, y_train = X[mask], y[mask]

# ๋žœ๋ค ํฌ๋ ˆ์ŠคํŠธ ๋ชจ๋ธ ํ•™์Šต
model = RandomForestRegressor()
model.fit(X_train, y_train)

# ๊ฒฐ์ธก์น˜ ์˜ˆ์ธก
X_missing = X[df['Age'].isnull()]
age_predicted = model.predict(X_missing)

# ์˜ˆ์ธก๊ฐ’์œผ๋กœ ๊ฒฐ์ธก์น˜ ์ฑ„์šฐ๊ธฐ
df.loc[df['Age'].isnull(), 'Age'] = age_predicted

์ด ๋ฐฉ๋ฒ•์€ ์ข€ ๋ณต์žกํ•ด ๋ณด์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‹ค๋ฅธ ํŠน์„ฑ๋“ค๊ณผ์˜ ๊ด€๊ณ„๋ฅผ ๊ณ ๋ คํ•ด ๊ฒฐ์ธก์น˜๋ฅผ ์ฑ„์šฐ๊ธฐ ๋•Œ๋ฌธ์— ๋” ์ •ํ™•ํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์–ด.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ๊ฒฐ์ธก์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•๋“ค์„ ์•Œ์•„๋ดค์–ด. ์–ด๋–ค ๋ฐฉ๋ฒ•์„ ์„ ํƒํ• ์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ๊ณผ ๋ถ„์„์˜ ๋ชฉ์ ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์–ด. ์ค‘์š”ํ•œ ๊ฑด ๊ฒฐ์ธก์น˜๋ฅผ ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜์ง€ ์•Š๊ณ  ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฑฐ์•ผ. ๊ทธ๋ž˜์•ผ ๋” ์ •ํ™•ํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ฑฐ๋“ ! ๐Ÿ˜Š

์ด๋Ÿฐ ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์€ ์žฌ๋Šฅ๋„ท๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ์ •๋ง ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ๊ฑฐ์•ผ. ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ์— ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋”๋ผ๋„ ๋„ˆ๋Š” ์ด์ œ ์ž์‹  ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ’ช

๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ• ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ์ œ๊ฑฐ ์ฑ„์šฐ๊ธฐ ์˜ˆ์ธก ๋ณด๊ฐ„๋ฒ•

์œ„ ๊ทธ๋ฆผ์€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๋“ค์„ ํ•œ๋ˆˆ์— ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. ์ œ๊ฑฐ, ์ฑ„์šฐ๊ธฐ, ์˜ˆ์ธก, ๋ณด๊ฐ„๋ฒ• ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋Š” ๊ฑธ ๊ธฐ์–ตํ•˜๊ณ , ์ƒํ™ฉ์— ๋งž๋Š” ์ ์ ˆํ•œ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด. ๋‹ค์Œ ์„น์…˜์—์„œ ๋Š” ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๊ธฐ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ฐ€๋ณด์ž! ๐Ÿš€

4. ์ด์ƒ์น˜(Outlier) ์ฒ˜๋ฆฌํ•˜๊ธฐ: ๋ฐ์ดํ„ฐ์˜ ํŠน์ด์  ๋‹ค๋ฃจ๊ธฐ ๐ŸŽฏ

์ด๋ฒˆ์—๋Š” ์ด์ƒ์น˜(Outlier)์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ด์ƒ์น˜๋ž€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋“ค๊ณผ ํ˜„์ €ํ•˜๊ฒŒ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ๋งํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ๋žŒ๋“ค์˜ ํ‚ค ๋ฐ์ดํ„ฐ์—์„œ 300cm๋ผ๋Š” ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์ด๊ฑด ์•„๋งˆ๋„ ์ด์ƒ์น˜์ผ ๊ฑฐ์•ผ. ์ด๋Ÿฐ ์ด์ƒ์น˜๋“ค์€ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์™œ๊ณก์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•ด.

1. ์ด์ƒ์น˜ ํƒ์ง€ํ•˜๊ธฐ

์ด์ƒ์น˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— ๋จผ์ € ์ฐพ์•„๋‚ด์•ผ๊ฒ ์ง€? ์ด์ƒ์น˜๋ฅผ ํƒ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด:

์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•œ ํƒ์ง€


import matplotlib.pyplot as plt
import seaborn as sns

# ๋ฐ•์Šคํ”Œ๋กฏ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['Height'])
plt.title('Height Distribution')
plt.show()

# ์‚ฐ์ ๋„ ๊ทธ๋ฆฌ๊ธฐ
plt.figure(figsize=(10, 6))
plt.scatter(df.index, df['Height'])
plt.title('Height Scatter Plot')
plt.ylabel('Height')
plt.show()

๋ฐ•์Šคํ”Œ๋กฏ์ด๋‚˜ ์‚ฐ์ ๋„๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์ด์ƒ์น˜๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด. ๋ฐ•์Šคํ”Œ๋กฏ์—์„œ ๋ฐ•์Šค ๋ฐ”๊นฅ์— ์ฐํžˆ๋Š” ์ ๋“ค์ด ๋ฐ”๋กœ ์ด์ƒ์น˜์•ผ.

IQR(Interquartile Range) ๋ฐฉ๋ฒ•


Q1 = df['Height'].quantile(0.25)
Q3 = df['Height'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

outliers = df[(df['Height'] < lower_bound) | (df['Height'] > upper_bound)]
print(outliers)

IQR ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ์‚ฌ๋ถ„์œ„์ˆ˜๋ฅผ ์ด์šฉํ•ด ์ด์ƒ์น˜๋ฅผ ํƒ์ง€ํ•ด. ๋ณดํ†ต 1.5 * IQR์„ ๋„˜์–ด๊ฐ€๋Š” ๊ฐ’๋“ค์„ ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผํ•ด.

Z-score ๋ฐฉ๋ฒ•


from scipy import stats

z_scores = stats.zscore(df['Height'])
outliers = df[abs(z_scores) > 3]
print(outliers)

Z-score ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ํ‰๊ท ๊ณผ ํ‘œ์ค€ํŽธ์ฐจ๋ฅผ ์ด์šฉํ•ด ๊ฐ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ์˜ z-score๋ฅผ ๊ณ„์‚ฐํ•˜๊ณ , ๋ณดํ†ต ์ ˆ๋Œ€๊ฐ’์ด 3์„ ๋„˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์ด์ƒ์น˜๋กœ ๊ฐ„์ฃผํ•ด.

2. ์ด์ƒ์น˜ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์ด์ƒ์น˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค๋ฉด ์ด์ œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ด. ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์–ด:

์ œ๊ฑฐํ•˜๊ธฐ


# IQR ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์ƒ์น˜ ์ œ๊ฑฐ
df = df[(df['Height'] >= lower_bound) & (df['Height'] <= upper_bound)]

# Z-score ๋ฐฉ๋ฒ•์œผ๋กœ ์ด์ƒ์น˜ ์ œ๊ฑฐ
df = df[abs(z_scores) <= 3]

์ด์ƒ์น˜๋ฅผ ๋‹จ์ˆœํžˆ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์–ด์„œ ์‹ ์ค‘ํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•ด.

๋Œ€์ฒดํ•˜๊ธฐ


# ์ƒํ•œ๊ฐ’, ํ•˜ํ•œ๊ฐ’์œผ๋กœ ๋Œ€์ฒด (Capping)
df['Height'] = df['Height'].clip(lower=lower_bound, upper=upper_bound)

# ํ‰๊ท ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
mean_height = df['Height'].mean()
df.loc[abs(z_scores) > 3, 'Height'] = mean_height

์ด์ƒ์น˜๋ฅผ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์•ผ. ์ƒํ•œ๊ฐ’์ด๋‚˜ ํ•˜ํ•œ๊ฐ’, ๋˜๋Š” ํ‰๊ท ๊ฐ’ ๋“ฑ์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด.

๋ณ€ํ™˜ํ•˜๊ธฐ


import numpy as np

# ๋กœ๊ทธ ๋ณ€ํ™˜
df['Height_log'] = np.log(df['Height'])

# ์ œ๊ณฑ๊ทผ ๋ณ€ํ™˜
df['Height_sqrt'] = np.sqrt(df['Height'])

๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™˜ํ•˜๋ฉด ์ด์ƒ์น˜์˜ ์˜ํ–ฅ์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด. ๋กœ๊ทธ ๋ณ€ํ™˜์ด๋‚˜ ์ œ๊ณฑ๊ทผ ๋ณ€ํ™˜ ๋“ฑ์ด ์ž์ฃผ ์‚ฌ์šฉ๋ผ.

3. ์ฃผ์˜์‚ฌํ•ญ

์ด์ƒ์น˜ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ๋“ค์ด ์žˆ์–ด:

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

์ด์ƒ์น˜ ์ฒ˜๋ฆฌ๋Š” ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ์ •๋ง ์ค‘์š”ํ•œ ์Šคํ‚ฌ์ด์•ผ. ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ์— ์ด์ƒ์น˜๊ฐ€ ์žˆ์„ ๋•Œ, ๋„ˆ๋Š” ์ด์ œ ์ž์‹  ์žˆ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ˜Š

์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ๊ณผ์ • ์ด์ƒ์น˜ ํƒ์ง€ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ ํ™•์ธ ์‹œ๊ฐํ™” ํ†ต๊ณ„์  ๋ฐฉ๋ฒ• ๋„๋ฉ”์ธ ์ง€์‹

์œ„ ๊ทธ๋ฆผ์€ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ์˜ ์ „์ฒด์ ์ธ ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. ํƒ์ง€๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๊ฒฐ๊ณผ ํ™•์ธ๊นŒ์ง€์˜ ๊ณผ์ •์ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ด๋ค„์ง€๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์ง€? ๊ทธ๋ฆฌ๊ณ  ์ด์ƒ์น˜๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์‹œ๊ฐํ™”, ํ†ต๊ณ„์  ๋ฐฉ๋ฒ•, ๋„๋ฉ”์ธ ์ง€์‹ ๋“ฑ ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ™œ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ๊ธฐ์–ตํ•ด!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๊ฒฐ์ธก์น˜์™€ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด. ์ด ๋‘ ๊ฐ€์ง€๋Š” ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์—์„œ ์ •๋ง ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์•ผ. ํ•˜์ง€๋งŒ ์•„์ง ๋” ๋ฐฐ์šธ ๊ฒŒ ์žˆ์–ด! ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์ •๋ฆฌํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ณ„์† ๊ฐ€๋ณด์ž! ๐Ÿš€

5. ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ •๋ฆฌํ•˜๊ธฐ: ์ผ๊ด€์„ฑ์€ ํž˜์ด๋‹ค! ๐Ÿ’ช

๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ •๋ฆฌํ•˜๋Š” ๊ฑฐ์•ผ. ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์ด ์ผ๊ด€๋˜์ง€ ์•Š์œผ๋ฉด ๋ถ„์„ํ•  ๋•Œ ํฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์–ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ ์งœ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๊ณณ์—์„œ๋Š” 'YYYY-MM-DD'๋กœ, ๋‹ค๋ฅธ ๊ณณ์—์„œ๋Š” 'MM/DD/YYYY'๋กœ ๋˜์–ด ์žˆ๋‹ค๋ฉด? ์•„์ฃผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒ ์ง€? ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•ด.

1. ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์ •๋ฆฌํ•˜๊ธฐ

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ๋Š” ํŠนํžˆ ํ˜•์‹์ด ์ผ์ •ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ์„ž์—ฌ ์žˆ๊ฑฐ๋‚˜, ์•ž๋’ค์— ๋ถˆํ•„์š”ํ•œ ๊ณต๋ฐฑ์ด ์žˆ๊ฑฐ๋‚˜, ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์ง€. ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์ž:


# ๋Œ€์†Œ๋ฌธ์ž ํ†ต์ผ
df['Name'] = df['Name'].str.lower()  # ๋ชจ๋‘ ์†Œ๋ฌธ์ž๋กœ
df['Name'] = df['Name'].str.upper()  # ๋ชจ๋‘ ๋Œ€๋ฌธ์ž๋กœ
df['Name'] = df['Name'].str.title()  # ๊ฐ ๋‹จ์–ด์˜ ์ฒซ ๊ธ€์ž๋งŒ ๋Œ€๋ฌธ์ž๋กœ

# ์•ž๋’ค ๊ณต๋ฐฑ ์ œ๊ฑฐ
df['Name'] = df['Name'].str.strip()

# ํŠน์ • ๋ฌธ์ž ์ œ๊ฑฐ
df['Phone'] = df['Phone'].str.replace('-', '')  # ํ•˜์ดํ”ˆ ์ œ๊ฑฐ

# ์ •๊ทœ ํ‘œํ˜„์‹ ์‚ฌ์šฉ
import re
df['Text'] = df['Text'].apply(lambda x: re.sub('[^a-zA-Z0-9]', '', x))  # ์•ŒํŒŒ๋ฒณ๊ณผ ์ˆซ์ž๋งŒ ๋‚จ๊ธฐ๊ธฐ

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด.

2. ๋‚ ์งœ/์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ •๋ฆฌํ•˜๊ธฐ

๋‚ ์งœ์™€ ์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋Š” ํŠนํžˆ ํ˜•์‹์ด ์ค‘์š”ํ•ด. Pandas์—์„œ๋Š” to_datetime() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ๋‚ ์งœ ํ˜•์‹์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด:


# ๋ฌธ์ž์—ด์„ ๋‚ ์งœ๋กœ ๋ณ€ํ™˜
df['Date'] = pd.to_datetime(df['Date'])

# ํŠน์ • ํ˜•์‹์˜ ๋ฌธ์ž์—ด์„ ๋‚ ์งœ๋กœ ๋ณ€ํ™˜
df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d')

# ๋‚ ์งœ์—์„œ ๋…„, ์›”, ์ผ ์ถ”์ถœ
df['Year'] = df['Date'].dt.year
df['Month'] = df['Date'].dt.month
df['Day'] = df['Date'].dt.day

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‚ ์งœ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€๋œ ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ํ•„์š”ํ•œ ์ •๋ณด๋„ ์‰ฝ๊ฒŒ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์–ด.

3. ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ ์ •๋ฆฌํ•˜๊ธฐ

์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ๋„ ํ˜•์‹์„ ํ†ต์ผํ•ด์•ผ ํ•ด. ์˜ˆ๋ฅผ ๋“ค์–ด, ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜๋ฅผ ๋งž์ถ”๊ฑฐ๋‚˜, ๋‹จ์œ„๋ฅผ ํ†ต์ผํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์–ด:


# ์†Œ์ˆ˜์  ์ž๋ฆฟ์ˆ˜ ๋งž์ถ”๊ธฐ
df['Price'] = df['Price'].round(2)

# ๋‹จ์œ„ ๋ณ€ํ™˜ (์˜ˆ: ๋ฏธํ„ฐ๋ฅผ ํ‚ฌ๋กœ๋ฏธํ„ฐ๋กœ)
df['Distance_km'] = df['Distance_m'] / 1000

# ๋ฐฑ๋ถ„์œจ์„ ์†Œ์ˆ˜๋กœ ๋ณ€ํ™˜
df['Rate'] = df['Rate'].str.rstrip('%').astype('float') / 100

์ด๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹์„ ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

4. ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ ์ •๋ฆฌํ•˜๊ธฐ

๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ๋Š” ๊ฐ™์€ ์˜๋ฏธ์ธ๋ฐ ๋‹ค๋ฅด๊ฒŒ ํ‘œํ˜„๋œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„. ์ด๋Ÿฐ ๊ฒฝ์šฐ ๋งคํ•‘์„ ํ†ตํ•ด ํ†ต์ผ์‹œํ‚ฌ ์ˆ˜ ์žˆ์–ด:


# ๋ฒ”์ฃผ ๋งคํ•‘
gender_map = {'M': 'Male', 'F': 'Female', 'Male': 'Male', 'Female': 'Female'}
df['Gender'] = df['Gender'].map(gender_map)

# ๋ฒ”์ฃผ ํ•ฉ์น˜๊ธฐ
df['Age_Group'] = pd.cut(df['Age'], bins=[0, 18, 35, 60, 100], labels=['Child', 'Young Adult', 'Adult', 'Senior'])

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฒ”์ฃผํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด.

5. ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋ณ€ํ™˜ํ•˜๊ธฐ

๋•Œ๋กœ๋Š” ๋ฐ์ดํ„ฐ์˜ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ์–ด. Pandas์—์„œ๋Š” astype() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์‰ฝ๊ฒŒ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด:


# ๋ฌธ์ž์—ด์„ ์ •์ˆ˜๋กœ ๋ณ€ํ™˜
df['Age'] = df['Age'].astype(int)

# ๋ฌธ์ž์—ด์„ ์‹ค์ˆ˜๋กœ ๋ณ€ํ™˜
df['Price'] = df['Price'].astype(float)

# ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
df['Is_Active'] = df['Is_Active'].astype(bool)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ฐ ์—ด์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์›ํ•˜๋Š” ๋Œ€๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด.

๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•  ๋•Œ ์ •๋ง ์ค‘์š”ํ•ด. ํด๋ผ์ด์–ธํŠธ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ์†Œ์Šค์—์„œ ์˜จ ๊ฒฝ์šฐ, ํ˜•์‹์ด ์ œ๊ฐ๊ฐ์ผ ์ˆ˜ ์žˆ๊ฑฐ๋“ . ์ด๋•Œ ๋„ˆ์˜ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์Šคํ‚ฌ์ด ๋น›์„ ๋ฐœํ•  ๊ฑฐ์•ผ! ๐Ÿ˜Ž

๋ฐ์ดํ„ฐ ํ˜•์‹ ์ •๋ฆฌ ๊ณผ์ • ๋ฌธ์ž์—ด ์ •๋ฆฌ ๋‚ ์งœ/์‹œ๊ฐ„ ์ •๋ฆฌ ์ˆ˜์น˜ํ˜• ์ •๋ฆฌ ํƒ€์ž… ๋ณ€ํ™˜ ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹

์œ„ ๊ทธ๋ฆผ์€ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ์ •๋ฆฌํ•˜๋Š” ์ „์ฒด์ ์ธ ๊ณผ์ •์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์–ด. ๋ฌธ์ž์—ด, ๋‚ ์งœ/์‹œ๊ฐ„, ์ˆ˜์น˜ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ๊ฐ ์ •๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋ณ€ํ™˜ํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ์ผ๊ด€๋œ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด์•ผ. ์ด๋ ‡๊ฒŒ ์ •๋ฆฌ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ถ„์„ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์งˆ ๊ฑฐ์•ผ!

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ์ฃผ์š” ๊ธฐ๋ฒ•๋“ค์„ ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด. ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ, ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ •๋ฆฌ๊นŒ์ง€. ์ด ๊ธฐ์ˆ ๋“ค์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์–ด๋–ค ๋”๋Ÿฌ์šด ๋ฐ์ดํ„ฐ๋ผ๋„ ๊นจ๋—ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ. ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ์ด ๋ชจ๋“  ๊ธฐ๋ฒ•๋“ค์„ ์ข…ํ•ฉํ•ด์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ง„ํ–‰ํ•˜๋Š”์ง€ ์•Œ์•„๋ณผ ๊ฑฐ์•ผ. ์ค€๋น„๋๋‹ˆ? ๊ณ„์† ๊ฐ€๋ณด์ž! ๐Ÿš€

6. ์‹ค์ „ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹: ๋ชจ๋“  ๊ฒƒ์„ ์ข…ํ•ฉํ•ด๋ณด์ž! ๐Ÿงฉ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋ชจ๋“  ๊ธฐ๋ฒ•๋“ค์„ ์ข…ํ•ฉํ•ด์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ง„ํ–‰ํ•ด๋ณผ ๊ฑฐ์•ผ. ๊ฐ€์ƒ์˜ ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณผ๊ฒŒ. ์ด ๋ฐ์ดํ„ฐ์—๋Š” ๊ณ ๊ฐ์˜ ์ด๋ฆ„, ๋‚˜์ด, ์ด๋ฉ”์ผ, ๊ตฌ๋งค ๊ธˆ์•ก, ๊ตฌ๋งค ๋‚ ์งœ ๋“ฑ์˜ ์ •๋ณด๊ฐ€ ์žˆ์–ด. ํ•˜์ง€๋งŒ ์ด ๋ฐ์ดํ„ฐ๋Š” ๊ฝค ์ง€์ €๋ถ„ํ•ด์„œ ์šฐ๋ฆฌ์˜ ํด๋ฆฌ๋‹ ์Šคํ‚ฌ์ด ํ•„์š”ํ•ด!

1๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋ฐ ํ™•์ธ


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
df = pd.read_csv('messy_customer_data.csv')

# ๋ฐ์ดํ„ฐ ํ™•์ธ
print(df.head())
print(df.info())
print(df.describe())

๋จผ์ € ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ๊ธฐ๋ณธ์ ์ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด. ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ์—ด์ด ์žˆ๋Š”์ง€, ๊ฐ ์—ด์˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋ฌด์—‡์ธ์ง€, ๊ฒฐ์ธก์น˜๋Š” ์–ผ๋งˆ๋‚˜ ์žˆ๋Š”์ง€ ๋“ฑ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด.

2๋‹จ๊ณ„: ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ


# ๊ฒฐ์ธก์น˜ ํ™•์ธ
print(df.isnull().sum())

# ์ด๋ฉ”์ผ ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ
df = df.dropna(subset=['Email'])

# ๋‚˜์ด ๊ฒฐ์ธก์น˜ ํ‰๊ท ์œผ๋กœ ๋Œ€์ฒด
df['Age'].fillna(df['Age'].mean(), inplace=True)

# ๊ตฌ๋งค๊ธˆ์•ก ๊ฒฐ์ธก์น˜ ์ค‘์•™๊ฐ’์œผ๋กœ ๋Œ€์ฒด
df['Purchase_Amount'].fillna(df['Purchase_Amount'].median(), inplace=True)

๊ฐ ์—ด์˜ ํŠน์„ฑ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•ด. ์ด๋ฉ”์ผ์€ ์ค‘์š”ํ•œ ์ •๋ณด์ด๋ฏ€๋กœ ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋Š” ํ–‰์„ ์ œ๊ฑฐํ•˜๊ณ , ๋‚˜์ด์™€ ๊ตฌ๋งค๊ธˆ์•ก์€ ๊ฐ๊ฐ ํ‰๊ท ๊ณผ ์ค‘์•™๊ฐ’์œผ๋กœ ๋Œ€์ฒดํ–ˆ์–ด.

3๋‹จ๊ณ„: ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ


# ๋‚˜์ด ์ด์ƒ์น˜ ํ™•์ธ ๋ฐ ์ฒ˜๋ฆฌ
Q1 = df['Age'].quantile(0.25)
Q3 = df['Age'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

df['Age'] = df['Age'].clip(lower=lower_bound, upper=upper_bound)

# ๊ตฌ๋งค๊ธˆ์•ก ์ด์ƒ์น˜ ์‹œ๊ฐํ™”
plt.figure(figsize=(10, 6))
sns.boxplot(x=df['Purchase_Amount'])
plt.title('Purchase Amount Distribution')
plt.show()

# ๊ตฌ๋งค๊ธˆ์•ก ๋กœ๊ทธ ๋ณ€ํ™˜
df['Purchase_Amount_Log'] = np.log1p(df['Purchase_Amount'])

๋‚˜์ด์˜ ๊ฒฝ์šฐ IQR ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด ์ด์ƒ์น˜๋ฅผ ์ฒ˜๋ฆฌํ–ˆ๊ณ , ๊ตฌ๋งค๊ธˆ์•ก์˜ ๊ฒฝ์šฐ ๋กœ๊ทธ ๋ณ€ํ™˜์„ ํ†ตํ•ด ๋ถ„ํฌ๋ฅผ ์กฐ์ •ํ–ˆ์–ด. ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ์ „ํ›„๋กœ ์‹œ๊ฐํ™”๋ฅผ ํ†ตํ•ด ๋ถ„ํฌ ๋ณ€ํ™”๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„.

4๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ •๋ฆฌ


# ์ด๋ฆ„ ํ˜•์‹ ์ •๋ฆฌ
df['Name'] = df['Name'].str.title().str.strip()

# ์ด๋ฉ”์ผ ์†Œ๋ฌธ์ž๋กœ ๋ณ€ํ™˜
df['Email'] = df['Email'].str.lower()

# ๊ตฌ๋งค๋‚ ์งœ datetime ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
df['Purchase_Date'] = pd.to_datetime(df['Purchase_Date'])

# ์—ฐ๋„์™€ ์›” ์ถ”์ถœ
df['Purchase_Year'] = df['Purchase_Date'].dt.year
df['Purchase_Month'] = df['Purchase_Date'].dt.month

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

5๋‹จ๊ณ„: ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ฐ ์ตœ์ข… ํ™•์ธ


# ์ค‘๋ณต ๋ฐ์ดํ„ฐ ํ™•์ธ ๋ฐ ์ œ๊ฑฐ
duplicates = df.duplicated().sum()
print(f"์ค‘๋ณต๋œ ํ–‰์˜ ์ˆ˜: {duplicates}")
df = df.drop_duplicates()

# ์ตœ์ข… ๋ฐ์ดํ„ฐ ํ™•์ธ
print(df.info())
print(df.describe())

# ์ƒ๊ด€๊ด€๊ณ„ ํ™•์ธ
plt.figure(figsize=(10, 8))
sns.heatmap(df.corr(), annot=True, cmap='coolwarm')
plt.title('Correlation Heatmap')
plt.show()

๋งˆ์ง€๋ง‰์œผ๋กœ ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , ํด๋ฆฌ๋‹๋œ ๋ฐ์ดํ„ฐ์˜ ๊ธฐ๋ณธ ์ •๋ณด์™€ ํ†ต๊ณ„๋Ÿ‰์„ ๋‹ค์‹œ ํ™•์ธํ•ด. ๋˜ํ•œ ๋ณ€์ˆ˜๋“ค ๊ฐ„์˜ ์ƒ๊ด€๊ด€๊ณ„๋ฅผ ์‹œ๊ฐํ™”ํ•ด์„œ ์ „์ฒด์ ์ธ ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ํŒŒ์•…ํ•ด.

์ž, ์ด๋ ‡๊ฒŒ ํ•ด์„œ ์šฐ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๊ณผ์ •์ด ์™„๋ฃŒ๋์–ด! ์ด์ œ ์ด ๊นจ๋—ํ•ด์ง„ ๋ฐ์ดํ„ฐ๋กœ ์›ํ•˜๋Š” ๋ถ„์„์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์ง€. ๐Ÿ˜Š

์ด๋Ÿฐ ์ข…ํ•ฉ์ ์ธ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๋Šฅ๋ ฅ์€ ์žฌ๋Šฅ๋„ท์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ •๋ง ํฐ ๊ฐ•์ ์ด ๋  ๊ฑฐ์•ผ. ํด๋ผ์ด์–ธํŠธ๋“ค์€ ๊นจ๋—ํ•˜๊ณ  ๋ถ„์„ํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์›ํ•˜๊ฑฐ๋“ . ๋„ค๊ฐ€ ์ด๋Ÿฐ ์Šคํ‚ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ๋†’์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ’ช

๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ํ”„๋กœ์„ธ์Šค ๋ฐ์ดํ„ฐ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ ํ˜•์‹ ์ •๋ฆฌ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ์ตœ์ข… ํ™•์ธ

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

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” Python์„ ์ด์šฉํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ A to Z๋ฅผ ๋ชจ๋‘ ์‚ดํŽด๋ดค์–ด. ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ์ด์ƒ์น˜ ์ฒ˜๋ฆฌ, ๋ฐ์ดํ„ฐ ํ˜•์‹ ์ •๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ์ „์ฒด ํ”„๋กœ์„ธ์Šค๊นŒ์ง€. ์ด ๋ชจ๋“  ๊ธฐ์ˆ ๋“ค์„ ๋งˆ์Šคํ„ฐํ•˜๋ฉด, ๋„ˆ๋Š” ์ง„์ •ํ•œ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์ „๋ฌธ๊ฐ€๊ฐ€ ๋  ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ! ๐Ÿ†

๋งˆ๋ฌด๋ฆฌ: ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์˜ ์ค‘์š”์„ฑ

๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊นจ๋—ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ์ด์ƒ์˜ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด. ์ด๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜์ ์ธ ๊ณผ์ •์ด์•ผ. ๊นจ๋—ํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋” ์ •ํ™•ํ•œ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋” ๋‚˜์€ ์˜์‚ฌ๊ฒฐ์ •์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค˜.

ํŠนํžˆ ์žฌ๋Šฅ๋„ท๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ, ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ๋Šฅ๋ ฅ์€ ์ •๋ง ์ค‘์š”ํ•ด. ํด๋ผ์ด์–ธํŠธ๋“ค์€ ์ข…์ข… '๋”๋Ÿฌ์šด' ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ๊ทธ๊ฑธ ์˜๋ฏธ ์žˆ๋Š” ์ •๋ณด๋กœ ๋ณ€ํ™˜ํ•ด๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๊ฑฐ๋“ . ๋„ค๊ฐ€ ์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹ ์Šคํ‚ฌ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด, ๋งŽ์€ ํ”„๋กœ์ ํŠธ์—์„œ ๋†’์€ ํ‰๊ฐ€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์•ผ.

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

์ž, ์ด์ œ ๋„ˆ๋Š” Python์œผ๋กœ ๋ฐ์ดํ„ฐ ํด๋ฆฌ๋‹์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ๋ฐฐ์› ์–ด. ์ด ์ง€์‹์„ ๊ฐ€์ง€๊ณ  ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด๋ฉด์„œ ๋” ๋งŽ์€ ๊ฒฝํ—˜์„ ์Œ“์•„๊ฐ€๊ธธ ๋ฐ”๋ผ. ๋ฐ์ดํ„ฐ ์„ธ๊ณ„๋Š” ๋„ˆ๋ฌด๋‚˜ ๋„“๊ณ  ํฅ๋ฏธ๋กœ์›Œ. ๊ณ„์†ํ•ด์„œ ํƒํ—˜ํ•˜๊ณ  ๋ฐฐ์›Œ๋‚˜๊ฐ€์ž! ํ™”์ดํŒ…! ๐Ÿ’ช๐Ÿ˜„