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

[DA][Python] ์นด์นด์˜คํ†ก ๋Œ€ํ™” ๋‚ด์šฉ ๋ฐ์ดํ„ฐ ์ „์ฒ˜๋ฆฌํ•˜๊ธฐ (1)

by Sun A 2024. 7. 3.

๊ฐœ์š”

์นด์นด์˜คํ†ก ์ฑ„ํŒ…๋ฐฉ์˜ ๋Œ€ํ™” ๋‚ด์šฉ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ ํ›„, ๋Œ€ํ™” ๋‚ด์šฉ์„ ๋ถ„์„ํ•˜์—ฌ ์œ ์˜๋ฏธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌํ•œ๋‹ค.

 

์ตœ์ข… ๊ฒฐ๊ณผ

๋ฐ์ดํ„ฐ๋ฅผ ์ „์ฒ˜๋ฆฌํ–ˆ์„ ์‹œ, ์ตœ์ข…์ ์œผ๋กœ ์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋‚˜๋Š” ๊ฐ€์กฑ๋“ค ๋‹จํ†ก ๋‚ด์šฉ์„ ์ถ”์ถœํ–ˆ๋‹ค

 

์š”๊ตฌ์‚ฌํ•ญ

1. ์นด์นด์˜คํ†ก ์ฑ„ํŒ…๋ฐฉ์—์„œ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

2. ๋ถˆ๋Ÿฌ์˜จ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ๋ผ์ธ๋ณ„๋กœ ์ฝ๋Š”๋‹ค 

3. ์›๋ณธ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์—๋Š” ์‹œ๊ฐ„์ด ์˜ค์ „, ์˜คํ›„๋กœ ์ ํ˜€์žˆ์œผ๋ฏ€๋กœ 12์‹œ๊ฐ„ ํ˜•์‹์„ 24์‹œ๊ฐ„ ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

4. ๋ฐ์ดํ„ฐ์—์„œ ๊ฒฐ๊ณผ ํ”„๋ ˆ์ž„์— ํ•„์š”ํ•œ ์š”์†Œ๋“ค์„ ๋‚˜๋ˆ ์„œ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ฒ˜๋ฆฌ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

5. ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์„ ์ƒ์„ฑํ•˜์—ฌ ์›ํ•˜๋Š” ์ˆœ์„œ์— ๋งž์ถฐ์„œ ์ถœ๋ ฅํ•œ๋‹ค.

 

์นด์นด์˜คํ†ก ์ฑ„ํŒ…๋ฐฉ์˜ ํ…์ŠคํŠธ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ

PC ์นด์นด์˜คํ†ก์— ๋“ค์–ด๊ฐ€์„œ ํ…์ŠคํŠธ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ์€ ์นดํ†ก๋ฐฉ์— ์ ‘์†ํ•˜์—ฌ "๋Œ€ํ™” ๋‚ด๋ณด๋‚ด๊ธฐ"๋ฅผ ํด๋ฆญํ•œ๋‹ค.

์œ„์˜ ์‚ฌ์ง„๋Œ€๋กœ ๋Œ€ํ™” ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋Œ€ํ™” ๋‚ด์šฉ๋“ค์„ ์‹œ๊ฐ„๋Œ€๋ณ„๋กœ ํ…์ŠคํŠธ๋กœ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

์šฐ์„  ์œ„์˜ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์•Œ๋งž์€ ์ด๋ฆ„์œผ๋กœ ์ €์žฅํ•˜๊ณ , ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ณต์‚ฌํ•ด๋‘”๋‹ค.

 

์›๋ณธ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

์›๋ณธ ๋ฐ์ดํ„ฐ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ํ˜•์‹์„ ๊ฐ€์ง„ ๋ผ์ธ ๋‘๊ฐœ๋ฅผ ๊ฐ€์ ธ์™€์„œ ํ™•์ธํ•œ๋‹ค.

--------------- 2023๋…„ 3์›” 24์ผ ๊ธˆ์š”์ผ ---------------
[์•„๋นต] [์˜คํ›„ 2:16] ๐ŸŠ ์‚ถ์˜ ๊ตํ›ˆ

์•„๋ฒ„์ง€๊ฐ€ 3์›” 24์ผ ๊ธˆ์š”์ผ ์˜คํ›„ 2์‹œ 16๋ถ„์— ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€์ด๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์˜ columns์— ๋“ค์–ด๊ฐ€์•ผ ํ•  ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

Year Month Day  Day_of_Week Time Name Message
2023 03 24 ๊ธˆ์š”์ผ 14:16 ์•„๋นต ๐ŸŠ ์‚ถ์˜ ๊ตํ›ˆ
  • ์—ฌ๊ธฐ์„œ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†๋Š” ๋‚ด์šฉ์€ Time์ด๋‹ค. ์›๋ณธ ๋ฐ์ดํ„ฐ์—๋Š” ์˜ค์ „/์˜คํ›„๊ฐ€ ์ž…๋ ฅ๋˜์–ด์žˆ์œผ๋ฉฐ 12์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ์‹œ๊ฐ„์ด ์ ํ˜€์žˆ์ง€๋งŒ, ์ตœ์ข… ์ถœ๋ ฅ๊ฐ’์—์„œ ์›ํ•˜๋Š” ๊ฑด 24์‹œ๊ฐ„ ํ˜•์‹์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒ˜๋ฆฌ ์ฝ”๋“œ๋ฅผ ํ˜•์„ฑํ•  ๋•Œ ์‹œ๊ฐ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

ํ…์ŠคํŠธ ํŒŒ์ผ ๋ผ์ธ๋ณ„๋กœ ์ฝ๊ธฐ

์šฐ์„ , ๋ฐ์ดํ„ฐํ”„๋ ˆ์ž„์œผ๋กœ ๋งŒ๋“ค์–ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— pandas ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

import pandas as pd

 

ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋งž๊ฒŒ ํŒŒ์ผ์„ ์ฝ์–ด์•ผ ํ•œ๋‹ค.

ํ…์ŠคํŠธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ํ•˜๋‚˜์˜ ๋ณ€์ˆ˜์— ์ž…๋ ฅํ•œ ํ›„, ํŒŒ์ผ์„ ์—ฌ๋Š” ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ์€ ํ›„ ๋ผ์ธ๋ณ„๋กœ ์ €์žฅํ•œ๋‹ค.

with open(kakao_file, 'r', encoding='utf-8') as file:
    lines = file.readlines()

 

 

์‹œ๊ฐ„ ํ‘œ์‹œ ํ˜•์‹ ๋ณ€ํ™˜ ํ•จ์ˆ˜ ์ƒ์„ฑ

์šฐ์„  ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์ „์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.

24์‹œ๊ฐ„ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ช…์„ covert_to_24hr๋กœ ์ง“๋Š”๋‹ค.

def covert_to_24hr(time_str) :

ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ๋ฐ›๊ธฐ ์œ„ํ•ด ์ธ์ˆ˜์ธ time_str์„ ์‚ฝ์ž…ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ time_str๋กœ ์ธ์ˆ˜๋ช…์„ ์ง€์ •ํ•œ ์ด์œ ๋Š” ์›๋ณธ ๋ฐ์ดํ„ฐ์—์„œ '์˜ค์ „', '์˜คํ›„' ๋ถ€๋ถ„์˜ ๋ฌธ์ž์—ด์ด ํฌํ•จ๋œ ์ธ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๊ณ  ํ•ด๋‹น ๋ฌธ์ž๋ฅผ ์‚ญ์ œํ•œ ํ›„์— time์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

์›๋ณธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์›๋ณธ ๋ฐ์ดํ„ฐ ํ˜•์‹์€ [์˜คํ›„ 2:16] ์ด๋‹ค.

๋จผ์ € ์˜ค์ „, ์˜คํ›„ ๊ธ€์ž๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค.

replace ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ค์ „, ์˜คํ›„ ๋ฌธ์ž๋ฅผ ๊ณต๋ฐฑ์œผ๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.

if '์˜ค์ „' in time_str :
	time = time_str.replace('์˜ค์ „', '')
elif '์˜คํ›„' in time_str :
	time = time_str.replace('์˜คํ›„', '')
  • ์˜ค์ „๊ณผ ์˜คํ›„๋ฅผ ๋‚˜๋ˆˆ ์ด์œ ๋Š” ์˜ค์ „์€ ๋ฌธ์ž๋ฅผ ์ƒ๋žต๋งŒ ํ•˜๋ฉด ๋˜์ง€๋งŒ, ์˜คํ›„๋Š” ์‹œ๊ฐ„ + 12๋ฅผ ํ•ด์•ผ 24์‹œ๊ฐ„ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ฑฐ์นœ ์ดํ›„์— ๋ฐ์ดํ„ฐ ์ƒํƒœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค
[์˜คํ›„ 2:16] -> [ 2:16]

 

๊ทธ๋ ‡๋‹ค๋ฉด ์˜คํ›„์—์„œ ์‹œ : ๋ถ„ ์ค‘, ์‹œ๊ฐ„ ์ฆ‰ hours์—๋งŒ 12๋ฅผ ๋”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” hours์™€ minutes ๋ณ€์ˆ˜๋ฅผ ๋‹ค์‹œ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

(์—ฌ๊ธฐ์„œ ๊ฐ„๊ณผํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ฒƒ์€ ์˜ค์ „ 12์‹œ๋Š” 00์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„๋„ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.)

์šฐ์„  ์œ„์˜ ํ•จ์ˆ˜์—์„œ hours์™€ minutes๋ฅผ ๋จผ์ € ๋‚˜๋ˆ„๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž

๋‚˜๋ˆ„๋Š” ํ•จ์ˆ˜๋Š” split์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

if '์˜ค์ „' in time_str :
	time = time_str.replace('์˜ค์ „', '')
    hours, minutes = map(int, time.split(':'))
elif '์˜คํ›„' in time_str :
	time = time_str.replace('์˜คํ›„', '')
    hours, minutes = map(int, time.split(':'))
  • ๋ฐ์ดํ„ฐ์—์„œ :๋ฅผ ๊ธฐ์ค€์œผ๋กœ hours์™€ minutes๋ฅผ ์ •์˜ํ•ด์ค€๋‹ค
hours = 2
minutes = 16

 

์ด์ œ ์˜ค์ „์—์„œ๋Š” 12 ์ˆซ์ž๋Š” 0์œผ๋กœ, ์˜คํ›„๋Š” 12๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ 12๋ฅผ ๋”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, hours์™€ munites์ด 2์ž๋ฆฌ ์ˆ˜๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

if '์˜ค์ „' in time_str :
	time = time_str.replace('์˜ค์ „', '')
    hours, minutes = map(int, time.split(':'))
    if hours == 12:#์˜ค์ „ 12์‹œ๋ฅผ 00์‹œ๋กœ
    	hours = 0
elif '์˜คํ›„' in time_str :
	time = time_str.replace('์˜คํ›„', '')
    hours, minutes = map(int, time.split(':'))
    if hours != 12:#์˜คํ›„ 12์‹œ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด 12๋ฅผ ๋”ํ•˜๋„๋ก
    	hours += 12
 return f"{hours:02}:{minutes:02}"
  • ์—ฌ๊ธฐ๊นŒ์ง€ ํ–ˆ์„ ๋•Œ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค
14:16

 


์œ„์™€ ๊ฐ™์ด ์‹œ๊ฐ„์„ ๋ณ€ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๊ธ€์—์„œ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์— ๋งž๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ คํ•œ๋‹ค.