λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’‘ Data Analysis/πŸ“‚ Project - Analysis of KakaoTalk (end)

[DA][Python] λŒ€ν™” 뢄석 κΈ°λŠ₯ - μ‚¬μš©μžλ³„ 평균 λ‹΅λ³€ μ‹œκ°„ 뢄석 (4)

by Sun A 2024. 7. 24.

μ•ž κ²Œμ‹œκΈ€μ—μ„œ μΉ΄μΉ΄μ˜€ν†‘ 원본 λŒ€ν™” λ‚΄μš©μ„ λ‚΄λ €λ°›μ•„ μ „μ²˜λ¦¬ν•˜λŠ” 과정을 μž‘μ„±ν•˜κ³  ν•¨μˆ˜λ‘œ κ΅¬ν˜„ν•΄λ³΄μ•˜λ‹€.

β–Ό κ²Œμ‹œλ¬Ό ν™•μΈν•˜κΈ°

 

[DA][Python] (2μ°¨ 섀계 및 μ™„μ„±) μΉ΄μΉ΄μ˜€ν†‘ λŒ€ν™” 데이터 μ „μ²˜λ¦¬ μ½”λ“œ μˆ˜μ • 섀계

ν˜„μž¬ ν•΄λ‹Ή λ‚΄μš©μ€ ν”Όλ“œλ°±μ„ λ°›μ•„ μ½”λ“œ μž‘μ„±μ„ μ™„λ£Œν•˜μ˜€μœΌλ©° μ΅œμ’… μ™„μ„±λœ μ½”λ“œμ— λŒ€ν•œ μ„€λͺ…이닀.μˆ˜μ •μ‚¬ν•­1. ν•¨μˆ˜λͺ…을 λͺ…ν™•ν•˜κ²Œ λ³€κ²½2. 원본 데이터에 μ‘΄μž¬ν•˜λŠ” μ„œλ‘œ λ‹€λ₯Έ ν˜•μ‹μ˜ 라인 두 가지에

sundery.tistory.com

 

4개의 ν•¨μˆ˜ 쀑 λ§ˆμ§€λ§‰ ν•¨μˆ˜μ΄λ©° 이 κΈ°λŠ₯은 μ‚¬μš©μžλ³„λ‘œ 평균 λ‹΅λ³€ μ‹œκ°„μ„ λΆ„μ„ν•˜μ—¬ 좜λ ₯값이 큰 μ‚¬λžŒμΌμˆ˜λ‘ μƒλŒ€μ μœΌλ‘œ μ±„νŒ…λ°©μ— 적게 λ°©λ¬Έν•˜λŠ” μ‚¬λžŒμ΄λΌκ³  νŒλ‹¨ν•  수 μžˆλ‹€.


뢄석 λ‚΄μš©

μ‚¬μš©μžλ³„ 평균 λ‹΅λ³€ μ‹œκ°„

μš°μ„  μ²˜μŒμ— 이 값을 좜λ ₯ν•˜κΈ° μœ„ν•΄μ„œ κ³ μ•ˆν•œ 방법은 

각 행을 Nameλ³„λ‘œ κ·Έλ£Ήν™”ν•˜μ—¬ 각 ν–‰μ˜ Time을 λΊ€ κ°’μ˜ 평균을 κ΅¬ν•˜λŠ” 것이닀.

그러기 μœ„ν•΄μ„œ ν•„μš”ν•œ μ²˜λ¦¬λŠ” Time 값을 μ—°μ‚°ν•˜κΈ° 쉽도둝 초 λ‹¨μœ„λ‘œ λ³€ν™˜ν•˜λŠ” 것이 ν•„μš”ν•˜λ‹€.

 

μš°μ„  ν•¨μˆ˜λ₯Ό λ¨Όμ € μ •μ˜ν•œλ‹€.

def calculate_response_time(df):

 

μ•žμ„œ λ§Œλ“€μ–΄ λ‘” λ°μ΄ν„°ν”„λ ˆμž„μ—μ„œ 'Time' μΉΌλŸΌμ„ κ°€μ Έμ™€μ„œ Name λ³„λ‘œ μ •λ ¬ν•œλ‹€.

df['Time'] = pd.to_datetime(df['Time'])
df = df.sort_values(by=['Name', 'Time'])

 

ν˜„μž¬ ν–‰κ³Ό 이전 ν–‰μ˜ κ°’ 차이λ₯Ό κ³„μ‚°ν•΄μ£ΌλŠ” ν•¨μˆ˜μΈ diff( )λ₯Ό μ‚¬μš©ν•˜μ—¬ 첫 번째 ν–‰μ˜ 값은 0으둜 μ‹œμž‘ν•˜λ„λ‘ μ„€μ •ν•œλ‹€.

df['ResponseTime'] = df.groupby('Name')['Time'].diff().fillna(pd.Timedelta(seconds=0))
  • λŒ€κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°ν”„λ ˆμž„μ˜ 'Time'을 선택
  • μ†Œκ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ—¬ 'Name' 열을 κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό κ·Έλ£Ήν™”

 

μ΄λ¦„λ³„λ‘œ μ •λ¦¬ν•œ μ‹œκ°„μ˜ 평균 값을 κ³„μ‚°ν•˜κ³  ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ μ •μ˜ν•œλ‹€.

avg_response_time = df.groupby('Name')['ResponseTime'].mean().reset_index()

 

응닡 μ‹œκ°„μ˜ 값을 초 λ‹¨μœ„λ‘œ λ³€ν™˜ν•˜κ³  μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬κΉŒμ§€λ§Œ 좜λ ₯ν•˜μ—¬ μ •λˆλœ 값이 λ‚˜μ˜€λ„λ‘ ν•œλ‹€.

avg_response_time['ResponseTime'] = avg_response_time['ResponseTime'].dt.total_seconds().round(2)
  • μœ„μ— timedelta ν˜•μ‹μœΌλ‘œ μž‘μ„±ν–ˆκΈ° λ•Œλ¬Έμ— 초 λ‹¨μœ„λ‘œ λ³€ν™˜ν•˜μ—¬ 값을 계산할 수 μžˆλ‹€.
  • round(2)λ₯Ό μ‚¬μš©ν•˜μ—¬ μ†Œμˆ˜μ  λ‘˜μ§Έ μžλ¦¬κΉŒμ§€λ§Œ λ°˜ν™˜

 

값을 κ²°κ³Ό 값이 μž‘μ€ μ‚¬λžŒμΌμˆ˜λ‘ μ±„νŒ…λ°©μ— 자주 λ“€μ–΄μ˜€λŠ” μ‚¬λžŒμ΄κΈ° λ•Œλ¬Έμ— μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜λ„λ‘ μ„€μ •ν•œλ‹€.

avg_response_time = avg_response_time.sort_values(by='ResponseTime', ascending = False)
  • ResponsTime 칼럼 값을 κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬

 

κ°€λ‘œ λ§‰λŒ€ κ·Έλž˜ν”„λ‘œ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ barh 차트λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‹œκ°ν™”ν•œλ‹€.

plt.figure(figsize=(10, 4))
plt.barh(avg_response_time['Name'], avg_response_time['ResponseTime'], color='skyblue')

 

λ§ˆμ§€λ§‰μœΌλ‘œ 좜λ ₯된 κ°’μ˜ 각 라벨 이름과 타이틀 λͺ…을 μ •μ˜ν•˜μ—¬ 좜λ ₯ν•˜λŠ” κ²ƒμœΌλ‘œ λ§ˆλ¬΄λ¦¬ν•œλ‹€.

    plt.title('μ‚¬μš©μžλ³„ 평균 λ‹΅λ³€ μ‹œκ°„')
    plt.xlabel('λ‹΅μž₯ 평균 μ‹œκ°„ (초)')
    plt.ylabel('μ‚¬μš©μž')
    plt.legend(title='λ‹΅μž₯ 평균 μ‹œκ°„ (초)', fontsize=9)
    plt.show()

return avg_response_time

 


κ²°κ³Όκ°’