๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ เป’(โŠ™แด—โŠ™)เฅญโœŽ

[๋ฉ‹์Ÿ์ด์‚ฌ์ž์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐ๋ถ„์„ ๋ถ€ํŠธ์บ ํ”„ 5๊ธฐ] EDA ์Œ์ฃผ๐Ÿป ๋ฐ์ดํ„ฐ ๋ถ„์„ํ•˜๊ธฐ

๊ฐ์ž์Šˆ๋‹ˆ 2025. 5. 17. 12:18

 

0. ๋ถ„์„์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—..

๋“œ๋””์–ด ๋ฐ์ดํ„ฐ ๋‹ค์šด ๋ฐ์ดํ„ฐ ๊ฐ€์ง€๊ณ  ๋ถ„์„์„ ํ•ด๋ณด์•˜๋‹ค.
์ด์ œ ๊ทธ๋ž˜ํ”„๋„ ์ข€ ๋” ๋‹ค์ด๋‚˜๋ฏน ํ•˜๊ณ  ์˜๋ฏธ์žˆ๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค ๋ณด๋‹ˆ ์žฌ๋ฐŒ๋‹ค.

MPG, ๋ณต์ง€ํŒจ๋„๋ฐ์ดํ„ฐ, ์•Œ์ฝœ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๊ณ  ์ฃผ์‹ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ค„๋ดค์ง€๋งŒ,
๊ฐ€์žฅ ์žฌ๋ฐŒ์—ˆ๋˜ ๋ฐ์ดํ„ฐ๋Š” ์•Œ์ฝœ ๋ฐ์ดํ„ฐ์˜€๋‹ค ๐Ÿบ๐Ÿพ๐Ÿท
๊ทธ๋ฆฌ๊ณ  ์ˆ˜์—… ์‹œ๊ฐ„ ๋”ฅํ•˜๊ฒŒ ๋‹ค๋ฃจ์ง„ ์•Š์•„์„œ, ๋ณต์Šต๋„ ํ•  ๊ฒธ ๋‹ค์–‘ํ•œ ๋ถ„์„๋“ค์„ ํ•ด๋ณด๋ ค ํ•œ๋‹ค


1. ๋ฐ์ดํ„ฐ ์†Œ๊ฐœ

๋ฐ์ดํ„ฐ ๋ง›๋ณด๊ธฐ๋ฅผ ์œ„ํ•ด head()๋กœ 5๊ฐœ์˜ ํ–‰๋งŒ ๊ฐ€์ ธ์™€๋ณธ๋‹ค.

 

< ๋ณ€์ˆ˜๋ช… ์ •๋ฆฌ>

country ๊ตญ๊ฐ€๋ช…
beer_servings  ๋งฅ์ฃผ ์–‘
spirit_servings ์ฆ๋ฅ˜์ฃผ ์–‘
wine_servings  ์™€์ธ ์–‘
total_litres_of_pure_alcohol  ์ˆœ์ˆ˜ ์•Œ์ฝœ์˜ ์ด ๋ฆฌํ„ฐ
continent ๋Œ€๋ฅ™

 


2. ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ


1) ๋ฐ์ดํ„ฐ์˜ ๊ฒฐ์ธก์น˜ ํ™•์ธ

drinks.isna().sum()

 


๊ฒฐ์ธก์น˜๊ฐ€ ์กด์žฌํ•˜๋Š” ์ปฌ๋Ÿผ์€ continent ๋ฟ์ด๋‹ค.
๊ทธ๋Ÿผ continent์˜ ๋ถ„ํฌ๋ฅผ ํ™•์ธํ•ด๋ณด์ž

 

csv ํŒŒ์ผ์„ ํ™•์ธํ•ด๋ณด๋‹ˆ continent ์ปฌ๋Ÿผ์— NA ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค.
์ด๊ฒƒ์€ ๊ฒฐ์ธก์น˜์˜ NA๊ฐ€ ์•„๋‹ˆ๋ผ North America๋ฅผ ์ค„์ธ NA์ด๋‹ค.
ํŒŒ์ด์ฌ์—์„œ ์ด๊ฒƒ์„ ๊ฒฐ์ธก์น˜๋กœ ์ธ์‹ํ•˜๊ณ  ์žˆ๋‹ค.
์ž์นซ ์ž˜๋ชป ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌํ•œ๋‹ค๊ณ  drop ํ•ด๋ฒ„๋ฆฌ๋ฉด ํฐ!์ผ!๋‚œ!๋‹ค!

 

2) ๋ฐ์ดํ„ฐ ๊ฒฐ์ธก์น˜ ์ฒ˜๋ฆฌ

Na๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‹ค์ œ Na๋ผ๋Š” "๊ฐ’ "์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก 
na_filter๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— False๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.

drinks = pd.read_csv('data/drinks.csv', na_filter = False)
drinks.isna().sum()

๐Ÿšจ ์ฃผ์˜

์ด๊ฒƒ์€ ์ปฌ๋Ÿผ๋“ค ์ค‘ continent ์ปฌ๋Ÿผ์—๋งŒ ๊ฒฐ์ธก์น˜(์‚ฌ์‹ค Na ๋‹จ์–ด์ด์ง€๋งŒ)๊ฐ€ ์žˆ์–ด์„œ ๊ฐ€๋Šฅํ•œ ์ผ์ด๋‹ค.
๋งŒ์•ฝ ๋‹ค๋ฅธ ์ปฌ๋Ÿผ์—๋„ ๊ฒฐ์ธก์น˜๊ฐ€ ์žˆ๋‹ค๋ฉด continent์ปฌ๋Ÿผ์—๋งŒ na_filter๋ฅผ ์ ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 


3. ๋ฐ์ดํ„ฐ ๋ถ„์„

 

1) ๊ฐ ๋‚˜๋ผ๋ณ„๋กœ ์ „์ฒด ์ˆ  ์†Œ๋น„๋Ÿ‰์ด ์–ผ๋งˆ์ธ์ง€์— ๊ณ„์‚ฐํ•œ๋‹ค.

drinks['total_servings'] = drinks['beer_servings'] + \
                            drinks['spirit_servings'] + \
                            drinks['wine_servings']
drinks


total_servings๋ผ๋Š” ์ปฌ๋Ÿผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธ
์•„ํ”„๊ฐ€๋‹ˆ์Šคํƒ„์€ ๋ฌด์Šฌ๋ฆผ๊ต์ด๋ผ ์ˆ  ์†Œ๋น„๋Ÿ‰์ด 0์ธ ๊ฒƒ๋„ ํ™•์ธ..!


2) ๋Œ€๋ฅ™๋ณ„ ์ˆœ์ˆ˜ ์•Œ์ฝœ ๋น„์œจ์„ ๋น„๊ตํ•ด๋ณธ๋‹ค.

์•Œ์ฝœ ๋น„์œจ =  ์ „์ฒด ์ˆœ์ˆ˜ ์•Œ์ฝœ๋Ÿ‰ / ์ „์ฒด ์ˆ  ์†Œ๋น„๋Ÿ‰

์•Œ์ฝœ ๋น„์œจ ์ปฌ๋Ÿผ ์ƒ์„ฑ

drinks['alcohol_rate'] = drinks['total_litres_of_pure_alcohol'] / drinks['total_servings']
drinks['alcohol_rate'].fillna(0, inplace=True)

 

๊ฐ ๋Œ€๋ฅ™๋ณ„ ์ˆœ์ˆ˜ ์•Œ์ฝœ๋น„์œจ์˜ ํ‰๊ท ์œผ๋กœ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ ์ƒ์„ฑ

# ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
df2 = drinks[['continent', 'alcohol_rate']]
# ๊ฐ ๋Œ€๋ฅ™๋ณ„ ์•Œ์ฝœ ๋น„์œจ์˜ ํ‰๊ท ์„ ๊ฐ€์ ธ์˜จ๋‹ค.
df3 = df2.groupby('continent').mean()
df3.sort_values('alcohol_rate', inplace = True, ascending = False)
df3

 

์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  Seaborn์˜ barplot์œผ๋กœ ์‹œ๊ฐํ™” ํ•ด๋ณด์ž 

# ์‹œ๊ฐํ™”
df3.reset_index() #๊ธฐ์กด์˜ ์ธ๋ฑ์Šค๋ฅผ ์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ์œผ๋กœ ์ถ”๊ฐ€
sns.barplot(data = df3, x = 'continent', y = 'alcohol_rate', hue = 'continent', palette = 'pastel')

๐Ÿ’ญ ํ™•์‹คํžˆ ์•„ํ”„๋ฆฌ์นด ๋Œ€๋ฅ™์ด ๋„˜์‚ฌ๋ฒฝ ์ˆ˜์ค€์œผ๋กœ ๋†’๋‹ค.
์–ผ๋งˆ๋‚˜ ์„ผ ๋…์ฃผ๋ฅผ ๋งˆ์‹œ๊ธธ๋ž˜....
์˜ˆ์ƒ๋Œ€๋กœ ์•„์‹œ์•„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์•˜๋‹ค.
์ด ๊ทธ๋ž˜ํ”„๋Š” ์•„ํ”„๋ฆฌ์นด์˜ ์•Œ์ฝœ ๋น„์œจ์ด ์ƒ๋Œ€์ ์œผ๋กœ ๊ทนํžˆ ๋†’๋‹ค ๋ผ๋Š” ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๋Š” ์ •๋„๋กœ ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ„๋‹ค.

 


3) ํ•œ๊ตญ์€ ์ „์„ธ๊ณ„์—์„œ ๋…์ฃผ ์ˆœ์œ„๊ฐ€ ์–ด๋А์ •๋„์ผ๊นŒ? ๐Ÿซจ

# ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
country_with_rank = drinks[['country', 'alcohol_rate']]
country_with_rank

๋ฐ์ดํ„ฐ๋ฅผ ์ด๋ ‡๊ฒŒ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ํ˜„์ œ country ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
๋…์ฃผ ์ˆœ์œ„ ๊ธฐ์ค€(alcohol_rate)์œผ๋กœ ๋‹ค์‹œ ์ •๋ ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

# alcohol_rate๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌ
country_with_rank.sort_values('alcohol_rate', ascending = False, inplace=True)
country_with_rank

 

ํ•œ๊ตญ(South Korea)์˜ ์ˆœ์œ„ ํ™•์ธํ•˜๊ธฐ

# ํ•œ๊ตญ์ด ๋ช‡ ๋ฒˆ์งธ์— ์žˆ๋Š”์ง€ ํŒŒ์•…ํ•œ๋‹ค.
# index๋ฅผ ๋ฆฌ์…‹ํ•œ๋‹ค.
a1 = country_with_rank.reset_index(drop=True)
# ํ•œ๊ตญ์˜ index๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
korea_index = a1.query('country == "South Korea"').index[0]
print(f'{korea_index} ์œ„')

์ฝ”๋“œ๋ฅผ ๋Œ๋ ค๋ณธ ๊ฒฐ๊ณผ ํ•œ๊ตญ์€ 14์œ„ ์ด๋‹ค. (๊ฝค ๋†’๊ตฐ.....)

 

์ „์„ธ๊ณ„์—์„œ ์–ด๋А ์ •๋„ ์œ„์น˜์— ์žˆ๋Š”์ง€ ์‹œ๊ฐํ™”ํ•ด์„œ ๋ณด์ž.
matplotlib์˜ barplot์„ ์ด์šฉํ•ด๋ณธ๋‹ค.

โ€ป x์ถ•์— ๋‚˜๋ผ ์ด๋ฆ„์„ ํ‘œ์‹œํ•˜๋ฉด ํ…์ŠคํŠธ๋“ค์ด ๊ฒน์ณ์„œ ๋ญ๊ฐ€ ๋ญ”์ง€ ์•Œ์•„๋ณผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—
x์ถ•์€ ๊ทธ๋ƒฅ ๋ฐ์ดํ„ฐ ๊ธธ์ด๋ฅผ arange๋กœ ๋ฐ›์•„์„œ ์“ธ ๊ฒƒ์ด๋‹ค. ์–ด์ฐจํ”ผ ํ•œ๊ตญ์€ ํ™”์‚ดํ‘œ๋กœ ๋”ฐ๋กœ ํ‘œ์‹œ ํ• ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€์—†๋‹ค (?)

# x ์ถ•
x = np.arange(len(country_with_rank))
# y ์ถ•
y = country_with_rank['alcohol_rate']

# ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ฆฐ๋‹ค. ์ด ๋•Œ, ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ง‰๋Œ€ ๊ฐ์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›๋Š”๋‹ค.
# ํ•œ๊ตญ์˜ ์œ„์น˜๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—
bar_list = plt.bar(x, y)

# ํ•œ๊ตญ์˜ ๋ง‰๋Œ€๋ฅผ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ์„ค์ •ํ•ด์ค€๋‹ค.
bar_list[korea_index].set_color('r')

# ์–ด๋…ธํ…Œ์ด์…˜์˜ ํ™”์‚ดํ‘œ ์˜ต์…˜
arrow_dict1 = {
    # ์ƒ‰์ƒ
    'facecolor' : 'red',
}

# ํ•œ๊ตญ ๋ถ€๋ถ„์— ์–ด๋…ธํ…Œ์ด์…˜์„ ํ‘œ์‹œํ•œ๋‹ค
# text : ํ‘œ์‹œํ•  ๋ฌธ์ž์—ด
# xytext : ์–ด๋…ธํ…Œ์ด์…˜์—์„œ ๋ฌธ์ž์—ด ๋ถ€๋ถ„์˜ ์œ„์น˜
# arrowprops : ํ™”์‚ดํ‘œ ์˜ต์…˜
plt.annotate(text = 'South Korea', xy=(korea_index, y[korea_index] + 0.04),
            xytext = (korea_index + 20, y[korea_index] + 0.1),
            arrowprops=arrow_dict1)


plt.show()


ํ•œ๋ˆˆ์— ์•Œ์•„๋ณด๊ธฐ ์‰ฌ์šด ํ‘œ ์™„์„ฑ !!

๐Ÿ’ญ ํ™•์‹คํžˆ ์••๋„์ ์œผ๋กœ ๋†’์€ ๋‚˜๋ผ๋Š” ๋ช‡ ์—†๊ณ , ๊ทธ ๋‹ค์Œ ๋ถ€ํ„ฐ๋Š” ํ™• ๋–จ์–ด์ง€๋Š”๊ฒŒ ๋ˆˆ์— ๋ณด์ธ๋‹ค.
์šฐ๋ฆฌ๋‚˜๋ผ๊ฐ€ ์ƒ๊ฐ๋ณด๋‹ค ์ƒ์œ„๊ถŒ์— ์žˆ๋‹ค๋Š”๊ฒŒ ์‹ ๊ธฐํ•˜๋‹ค. ์ผ๋ณธ, ์ค‘๊ตญ, ๋Œ€๋งŒ, ๋ถํ•œ๋„ ๊ถ๊ธˆ...

์•„์‹œ์•„์—์„œ ์ˆ ๋กœ ์œ ๋ช…ํ•œ ๋‚˜๋ผ๋“ค ๋ช‡๊ฐœ ํ™•์ธํ•ด๋ณด๋ฉด ์–ด๋–จ์ง€ ๊ถ๊ธˆํ•ด์„œ, ๋งˆ์ง€๋ง‰์œผ๋กœ ์ถ”๊ฐ€ ๋ถ„์„ ํ•ด๋ณด์•˜๋‹ค.

 



4. ํ•œ๊ตญ, ๋ถํ•œ, ์ผ๋ณธ, ์ค‘๊ตญ, ํƒœ๊ตญ, ๋ฒ ํŠธ๋‚จ ์˜ ๋…์ฃผ ๋น„์œจ ๋น„๊ตํ•ด๋ณด๊ธฐ 

# ํ•œ๊ตญ, ๋ถํ•œ, ์ผ๋ณธ, ์ค‘๊ตญ, ํƒœ๊ตญ, ๋ฒ ํŠธ๋‚จ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
Asia1 = ['South Korea', 'North Korea', 'Japan', 'China', 'Thailand', 'Vietnam']
df100 = drinks.query('country in @Asia1')

# ๊ฐ ๋‚˜๋ผ์˜ ๋…์ฃผ ๋น„์œจ์„ ์ˆœ์œ„๋Œ€๋กœ ๋‚˜์—ดํ•˜๊ธฐ
df200 = df100.sort_values('alcohol_rate', ascending = False, inplace = False)

# ์‹œ๊ฐํ™”
sns.barplot(data = df200, x = 'country', y = 'alcohol_rate', hue = 'country', palette = 'autumn')
plt.title('ํ•œ๋ถ์ผ์ค‘ํƒœ๋ฒ  ๋…์ฃผ ์ˆœ์œ„')
plt.show()

 

๋ถํ•œ์€ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค 0์ด๋‹ค..
์•„๋ฌด๋ž˜๋„ ์ˆ˜์ง‘์„ ๋ชปํ–ˆ๊ฒ ์ง€ ? ๐Ÿ˜…

๐Ÿ’ญ ํ•œ-์ผ-์ค‘-ํƒœ-๋ฒ  ์ˆœ์œผ๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค. ํƒœ๊ตญ๊ณผ ๋ฒ ํŠธ๋‚จ์€ ๋น„์Šท๋น„์Šทํ•ด๋ณด์ด๊ณ ..
์ผ๋ณธ๋„ ์‚ฌ์ผ€, ๋งฅ์ฃผ๊ฐ€ ์œ ๋ช…ํ•˜๋‹ค ๋ณด๋‹ˆ ๊ฝค๋‚˜ ๋†’๋‹ค..
๊ทผ๋ฐ ํ•œ๊ตญ์€ ๋ฌด์Šจ ์ผ์ด์ง€.. ์™œ์ด๋ ‡๊ฒŒ ๋†’์€๊ฒƒ์ด์•ผ ใ… ใ…‹ใ…‹ใ…‹


๐Ÿ“– ๋А๋‚€ ์ 

์žฌ๋ฐŒ๋‹ค... ๊ด€์‹ฌ์‚ฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๋‹ˆ ๊ถ๊ธˆํ•œ ๊ฒƒ๋„ ์ƒ๊ธฐ๊ณ 
๊ณ„์† ๊ณ„์† ๋ถ„์„ํ•˜๊ณ  ์‹ถ์€ ์š•์‹ฌ์ด ์ƒ๊ธฐ๋Š”๊ฑฐ ๊ฐ™๋‹ค.

๊ทผ๋ฐ ์•„์ง ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ๋ถ€์กฑํ•œ ์ ์ด ๋งŽ์€ ๊ฒƒ ๊ฐ™๋‹ค.
๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋ฉด ๊ทธ๋ƒฅ ๋†’๋„ค? ๋‚ฎ๋„ค? ์ •๋„๋งŒ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค.
์ด ๊ทธ๋ž˜ํ”„์—์„œ ๋†’์œผ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ๊ทธ๋ž˜ํ”„๋ฅผ ๊ทธ๋ ค์„œ ~~์„ ํ™•์ธํ•ด๋ด์•ผ๊ฒ ๋‹ค. ์ •๋„๋Š” ์•ˆ๋˜๋Š”๋“ฏ ใ…Žใ…Ž
๋ฌผ๋ก  ๋‚œ ์•„์ง ๋ฐ์ดํ„ฐ๋ถ„์„๊ฐ€ ์œ ๋ง์ฃผ....๊ฐ€ ๋  ์ฃผ๋‹ˆ์–ด๋‹ˆ๊นŒ~ ใ…‹ใ…‹

์„ฑ์žฅํ•˜์ž ๊ฐ์ž์Šˆ๋‹ˆ!!!!!!!

 

์ถœ์ฒ˜ : ๋ฉ‹์Ÿ์ด ์‚ฌ์ž์ฒ˜๋Ÿผ