๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ก Data Analysis/๐Ÿ“‚ Project - Analysis of KakaoTalk (end)

[DA][Python] ๋Œ€ํ™” ๋ถ„์„ ๊ธฐ๋Šฅ - ์‚ฌ์šฉ์ž๋ณ„ ์ด๋ชจํ‹ฐ์ฝ˜ ์‚ฌ์šฉ ๋นˆ๋„ ๋ถ„์„ (2)

by Sun A 2024. 7. 11.

์•ž ๊ฒŒ์‹œ๊ธ€์—์„œ ์นด์นด์˜คํ†ก ์›๋ณธ ๋Œ€ํ™” ๋‚ด์šฉ์„ ๋‚ด๋ ค๋ฐ›์•„ ์ „์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์„ ์ž‘์„ฑํ•˜๊ณ  ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

โ–ผ ๊ฒŒ์‹œ๋ฌผ ํ™•์ธํ•˜๊ธฐ

 

[DA][Python] (2์ฐจ ์„ค๊ณ„ ๋ฐ ์™„์„ฑ) ์นด์นด์˜คํ†ก ๋Œ€ํ™” ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌ ์ฝ”๋“œ ์ˆ˜์ • ์„ค๊ณ„

ํ˜„์žฌ ํ•ด๋‹น ๋‚ด์šฉ์€ ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•„ ์ฝ”๋“œ ์ž‘์„ฑ์„ ์™„๋ฃŒํ•˜์˜€์œผ๋ฉฐ ์ตœ์ข… ์™„์„ฑ๋œ ์ฝ”๋“œ์— ๋Œ€ํ•œ ์„ค๋ช…์ด๋‹ค.์ˆ˜์ •์‚ฌํ•ญ1. ํ•จ์ˆ˜๋ช…์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณ€๊ฒฝ2. ์›๋ณธ ๋ฐ์ดํ„ฐ์— ์กด์žฌํ•˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์˜ ๋ผ์ธ ๋‘ ๊ฐ€์ง€์—

sundery.tistory.com

 

์ฒซ ๋ฒˆ์งธ ํ•จ์ˆ˜๋Š” ์‚ฌ์šฉ์ž๋ณ„ ๋Œ€ํ™” ๋นˆ๋„ ๋ถ„์„ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์˜€๊ณ , ์ด๋ฒˆ์—๋Š” ์ด๋ชจํ‹ฐ์ฝ˜ ์‚ฌ์šฉ ๋นˆ๋„๋ฅผ ๋ถ„์„ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค.

์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ์ด๋ชจํ‹ฐ์ฝ˜์€ ํ…์ŠคํŠธ "์ด๋ชจํ‹ฐ์ฝ˜"์œผ๋กœ ์ž…๋ ฅ๋˜์–ด์žˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— Message ๊ฐ’์— '์ด๋ชจํ‹ฐ์ฝ˜' ๋ฌธ์ž๊ฐ€ ํฌํ•จ๋˜์–ด์žˆ๋Š” ์ˆ˜๋ฅผ ์„ธ๋ฉด ์›ํ•˜๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.


๋ถ„์„ ๋‚ด์šฉ

์‚ฌ์šฉ์ž๋ณ„ ์ด๋ชจํ‹ฐ์ฝ˜ ์‚ฌ์šฉ ๋นˆ๋„ ๋ถ„์„

์šฐ์„  ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ’์€ Name๊ณผ ์ด๋ชจํ‹ฐ์ฝ˜์ด๋ผ๋Š” ๋ฌธ์ž๊ฐ€ ์ถœ๋ ฅ๋œ ํšŸ์ˆ˜๋ฅผ ์‚ฌ์šฉ์ž๋ณ„๋กœ ์นด์šดํŠธํ•œ ๊ฐ’์ด๋‹ค

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ช…์€ compare_emoticon_counts๋กœ ์ •์˜ํ•œ๋‹ค.

def compare_emoticon_counts(data, emoticon):

๋˜ํ•œ ํฌํ•จ๋˜๋Š” ๋ฌธ์ž๋ฅผ ๋‹ค๋ฅธ ๋ฌธ์ž๋กœ ๋ฐ”๊ฟ”์„œ ์ž…๋ ฅํ•˜์—ฌ ๋ถ„์„ํ• ์ˆ˜๋„ ์žˆ๋‹ค. 

emoticon์ด๋ผ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋‹ค๋ฅธ ๊ฐ’์„ ๋„ฃ์–ด์„œ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

์šฐ์„  ํ•จ์ˆ˜๋ช…์„ ์ •์˜ํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ’๋„ ์ •์˜ํ•˜์˜€๋‹ค๋ฉด Name๋ณ„๋กœ ์ด๋ชจํ‹ฐ์ฝ˜์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ Message ์นผ๋Ÿผ ๋‚ด์˜ ๋ฌธ์ž์—ด์— ์–ผ๋งˆ๋‚˜ ํฌํ•จ๋˜์—ˆ๋Š” ์ง€ ์…€ ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์งœ์•ผํ•œ๋‹ค.

 

์šฐ์„  Message ๊ฐ’์— emoticon์— ๋“ค์–ด๊ฐ€๋Š” ๊ฐ’์ด ํฌํ•จ๋œ ๋ฌธ์ž์—ด์„ ๋ฝ‘๊ธฐ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค.

emoticon_count = df['Message'].str.contains(emoticon)

 

์ด ์ƒํƒœ๋กœ ์ถœ๋ ฅํ–ˆ์„ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜จ๋‹ค.

 

'์ด๋ชจํ‹ฐ์ฝ˜' ์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฐ’์€ ๋ชจ๋‘ False๋กœ ์ถœ๋ ฅ๋˜๋Š” ๋ฐ ์—ฌ๊ธฐ์„œ ํ˜น์‹œ๋‚˜ ์žˆ์„ ๊ฒฐ์ธก๊ฐ’๋„ False๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— na=False๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

emoticon_count = df['Message'].str.contains(emoticon, na=False)

 


์ด์ œ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๋ณ„๋กœ ์ด๋ชจํ‹ฐ์ฝ˜ ๋ฌธ์ž์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์–ด์•ผ ํ•œ๋‹ค.
'Name' ์นผ๋Ÿผ์„ ์ด์šฉํ•ด์„œ ์‚ฌ์šฉ์ž๋ณ„๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 'Name' ์ด์šฉํ•˜์—ฌ ๊ทธ๋ฃน๋ณ„๋กœ ๋ฌถ์–ด์ค€๋‹ค.

(๋™์ผํ•œ 'Name'์„ ๊ฐ€์ง„ ํ–‰๋ผ๋ฆฌ ๋ฌถ๋Š”๋‹ค.)

emoticon_count = df[df['Message'].str.contains(emoticon, na=False)].groupby('Name')

 

๋ฌถ์ธ ํ–‰์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๊ธฐ ์œ„ํ•ด์„œ .size() ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ทธ๋ฃนํ™”๋œ 'Name'์˜ ํ–‰ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

emoticon_count = df[df['Message'].str.contains(emoticon, na=False)].groupby('Name').size()

 

์ด์ œ ์ด ๊ฒฐ๊ณผ๊ฐ’์„ ์•ž์— ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๋ฌผ์ฒ˜๋Ÿผ ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. 

.reset_index๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•˜๊ณ  ์ถœ๋ ฅํ•œ๋‹ค.

๊ทผ๋ฐ ์•ž์„œ ์ž‘์„ฑํ•œ ๊ฒŒ์‹œ๋ฌผ์—์„œ๋Š” ๋ณ€์ˆ˜๋ช…์— .columns ๋ฅผ ๋ถ™์—ฌ์„œ ์นผ๋Ÿผ๋ช…์„ ์ •์˜ํ•˜์˜€๋Š”๋ฐ

reset_index ํ•จ์ˆ˜ ์•ˆ์— name = '์›ํ•˜๋Š” ์นผ๋Ÿผ๋ช…'์„ ์ž…๋ ฅํ•˜๋ฉด ๋ฐ”๋กœ ๊ฐ’์ด ๋‚˜์™€์„œ ์•ž์˜ ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์˜€๋‹ค. 

(ํ•จ์ˆ˜ ๊ตฌํ˜„ (1)์— ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธํ•จ)

~~~ .size().reset_index(name = 'Emoticon_Count')

(~~~๋Š” ์œ„์— ์ž‘์„ฑ๋œ ์ฝ”๋“œ์™€ ๋™์ผํ•˜๋‹ค.)

 

์ด์ œ ์ด ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค

์—ฌ๊ธฐ๊นŒ์ง€๋งŒ ํ•ด๋„ ๋˜์ง€๋งŒ ๋‚˜๋Š” ๋ˆ„๊ฐ€ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋Š”์ง€๋„ ๊ถ๊ธˆํ•ด์„œ ์ •๋ ฌ ์ฝ”๋“œ๋„ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

 

์ •๋ ฌํ•  ๋•Œ๋Š” .sort_values()๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค

์ด sort_values๋Š” ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„ํ™” ๋˜์–ด ์žˆ์„๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ์„  Emoticon_Count ์นผ๋Ÿผ์˜ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— sort_values์— ๊ธฐ์ค€์„ ๋„ฃ๊ณ 

๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ์œ„ํ•ด ascending=False๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. (True๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ์˜ค๋ฆ„์ฐจ์ˆœ์ด ๋œ๋‹ค. ์•„๋‹ˆ๋ฉด ์ƒ๋žตํ•ด๋„ ๋™์ผํ•˜๋‹ค.)

emoticon_count = emoticon_count.sort_values(by='Emoticon_Count', ascending=False)

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ์™„์„ฑ๋˜๋ฉฐ ์ฒ˜์Œ์— ์„ค๊ณ„ํ•œ ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

(์‚ฌ์‹ค reset_index ๋’ค์— ๋ถ™์—ฌ๋„ ์ถœ๋ ฅ์€ ๋˜์ง€๋งŒ ์ •๋ˆ๋˜๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋”ฐ๋กœ ์ผ๋‹ค.)


์ „์ฒด ์™„์„ฑ๋œ ์ฝ”๋“œ

#์‚ฌ์šฉ์ž๋ณ„ ์ด๋ชจํ‹ฐ์ฝ˜ ์‚ฌ์šฉ ๋นˆ๋„ ๋ถ„์„
def compare_emoticon_counts(data, emoticon):
    #Name ๋ณ„๋กœ ์ด๋ชจํ‹ฐ์ฝ˜ ์ด๋ผ๋Š” ๋‹จ์–ด๊ฐ€ Message ์นผ๋Ÿผ ๋‚ด์˜ ๋ฌธ์ž์—ด์— ์–ผ๋งˆ๋‚˜ ํฌํ•จ๋˜์—ˆ๋Š” ์ง€ ์„ธ์„œ Emoticon_Count์— ์‚ฝ์ž…
    emoticon_count = df[df['Message'].str.contains(emoticon, na=False)].groupby('Name').size().reset_index(name='Emoticon_Count')
    
    #๋งŽ์ด ์‚ฌ์šฉํ•œ ์ˆœ์œผ๋กœ ์ •๋ ฌ
    emoticon_count = emoticon_count.sort_values(by='Emoticon_Count', ascending=False)
    return emoticon_count

df = generate_dataframe(data)
compare_emoticon_counts(df, '์ด๋ชจํ‹ฐ์ฝ˜')