μ κ²μκΈμμ μΉ΄μΉ΄μ€ν‘ μλ³Έ λν λ΄μ©μ λ΄λ €λ°μ μ μ²λ¦¬νλ κ³Όμ μ μμ±νκ³ ν¨μλ‘ κ΅¬νν΄λ³΄μλ€.
βΌ κ²μλ¬Ό νμΈνκΈ°
[DA][Python] (2μ°¨ μ€κ³ λ° μμ±) μΉ΄μΉ΄μ€ν‘ λν λ°μ΄ν° μ μ²λ¦¬ μ½λ μμ μ€κ³
νμ¬ ν΄λΉ λ΄μ©μ νΌλλ°±μ λ°μ μ½λ μμ±μ μλ£νμμΌλ©° μ΅μ’ μμ±λ μ½λμ λν μ€λͺ μ΄λ€.μμ μ¬ν1. ν¨μλͺ μ λͺ ννκ² λ³κ²½2. μλ³Έ λ°μ΄ν°μ μ‘΄μ¬νλ μλ‘ λ€λ₯Έ νμμ λΌμΈ λ κ°μ§μ
sundery.tistory.com
μ²μμ λ§λ κ²μ μ¬μ©μλ³ λν λΉλ λΆμμ΄μκ³ λλ²μ§Έμ λ§λ κ²μ μ¬μ©μλ³ μ΄λͺ¨ν°μ½ μ¬μ© λΉλ λΆμμ΄μλ€.
λ κ°μ§ 쑰건μ νν°λ§νκ³ ν΄λΉνλ νμ κ°μλ§ μΈμ μΆλ ₯νλ©΄ λλ μ¬μ΄ ν¨μμλ€.
μ΄λ² μΈ λ²μ§Έλ‘ λ§λ€κ² λ ν¨μλ μκ°λλ³ κ° μ¬μ©μ νλ λΉλλ₯Ό λΆμν κ²μ΄λ€.
λΆμ λ΄μ©
μκ°λλ³ κ° μ¬μ©μ νλ λΉλ λΆμ
μ°μ μκ°μ λ²μλ₯Ό μ νλ€.
'μλ²½', 'μ€μ ', 'μ€ν', 'μ λ ' μ΄λ κ² 4κ°μ λ²μλ‘ μ νκ³ μκ°μ λ°°λΆνλ€.
μλ²½ | 00:00 ~ 06:00 |
μ€μ | 06:00 ~ 12:00 |
μ€ν | 12:00 ~ 18:00 |
μ λ | 18:00 ~ 24:00 |
μ°μ ν¨μλ₯Ό μ μν΄μ€λ€. μκ° λ³ νλ λΉλλ₯Ό λΆμνλ κ²μ΄κΈ° λλ¬Έμ analyze_activity_by_timeμ΄λΌλ ν¨μλ₯Ό μ¬μ©νλ€.
def analyze_activity_by_time(data):
μκ°λλ³λ‘ λλ μ κ³μ°ν΄μΌ νκΈ° λλ¬Έμ Time μΉΌλΌμμ Hoursλ§ μΆμΆνλ€.
df['Hours'] = pd.to_datetime(df['Time'], format='%H:%M').dt.hour
- μλ³Έ λ°μ΄ν°κ° 12:00 μ κ°μ νμμ΄κΈ° λλ¬Έμ μ΄ formatμ datetimeμΌλ‘ λ³νν΄μ£Όλ μ½λλ₯Ό μμ±νλ€.
- format = '%H:%M'
- μ¬κΈ°μ hourλ§ μΆμΆνμ¬ dfμ μΉΌλΌμ 'Hours'λ‘ λ£λλ€
Hoursλ₯Ό 4κ°μ λ²μλ‘ λλλ€.
μκ°μ κ²½κ³λ μμ λνλΈ λ―μ΄ μλ²½, μ€μ , μ€ν, μ λ μΌλ‘ λλκΈ° λλ¬Έμ boundaryλΌλ 리μ€νΈμ κ²½κ³κ°μ λ£λλ€.
κ·Έλ¦¬κ³ κ° κ²½κ³κ°μ μ΄λ¦μ μ½μ ν΄μ€λ€
boundary = [0, 6, 12, 18, 24]
labels = ['μλ²½', 'μ€μ ', 'μ€ν', 'μ λ
']
boundaryλ‘ κ° μκ°λμ κ²½κ³λ₯Ό λνλ΄μκΈ° λλ¬Έμ pd.cut μ΄λΌλ ν¨μλ₯Ό μ¬μ©νμ¬ μλμ κ°μ κ²°κ³Όκ° λμ¬ μ μλ€.
- μλ²½ : 00μ(ν¬ν¨) ~ 06μ(λ―Έλ§)
- μ€μ : 06μ(ν¬ν¨) ~ 12μ(λ―Έλ§)
- μ€ν : 12μ(ν¬ν¨) ~ 18μ(λ―Έλ§)
- μ λ : 18μ(ν¬ν¨) ~ 24μ(λ―Έλ§)
λ§μ§λ§μΌλ‘ λλ λ²μ κ°μ μΉΌλΌμΌλ‘ λ£κ³ (μΉΌλΌλͺ : 'Time_Parts') νλ€μ€μ ν¨μ cutμ κ°μ Έμμ labelsλ₯Ό μ½μ νλ€.
df['Time_Parts'] = pd.cut(df['Hours'], bins=boundary, labels=labels, right=True, include_lowest=True)
- Time_Partsμ λ€μ΄κ° λ΄μ©μ Hours μΉΌλΌμ κ°μ κ°μ Έμ¨λ€λ μλ―Έμμ df['Hours'] μ λ ₯
- ꡬκ°μ λλλ κΈ°μ€κ°λ€μ΄λ ꡬκ°μ κ°μ κ°μ binsμ μ½μ
- κ° κ΅¬κ°μ λΆμΌ λ μ΄λΈμ μΆκ°νλ€. (μμ μ μν κ°μ λ£μΌλ©΄ λλ€.)
- right = True : ꡬκ°μ μ€λ₯Έμͺ½ λμ ν¬ν¨νλ€.
- right = False : ꡬκ°μ μ€λ₯Έμͺ½ λμ ν¬ν¨νμ§ μλλ€.
- include_lowest=True : ꡬκ°μ κ°μ₯ μμ κ°μ ν¬ν¨νλ€.
- include_lowest=False : ꡬκ°μ κ°μ₯ μμ κ°μ ν¬ν¨νμ§ μλλ€.
μ΄μ κ³μ°νλ €λ κ°μΈ μκ°λλ³ νλ λΉλ μ§κ³ κ°μ μΆλ ₯νλ€.
activity_by_time = df.groupby(['Name', 'Time_Parts']).size().reset_index(name='Count_Messages')
return activity_by_time
- groupbyλ₯Ό ν΅ν΄ 'Time_Parts'μ 'Name' λ κ°μ§ 컬λΌμ κΈ°μ€μΌλ‘ κ·Έλ£Ήνκ° κ°λ₯νλ€.
- κ° κ·Έλ£Ήνλ κ·Έλ£Ήμ λΉλλ₯Ό κ³μ°νκΈ° μν΄ size() ν¨μλ₯Ό μ λ ₯νλ€.
- κ·Έλ¦¬κ³ μΈλ±μ€λ₯Ό μ΄κΈ°ννμ¬ λ°μ΄ν°νλ μ ννλ‘ λ³ννλλ° size()κ°μ Count_Messages λΌλ μΉΌλΌλͺ μ λΆμ¬μ£Όλ©΄ λλ€.
μΆλ ₯κ°μ μλμ κ°λ€.
μ¬μ€ μλ μ²μμλ ν νμμΌλ‘ μΆλ ₯νκΈ° μν΄ unstack(fill_value=0)ν¨μλ₯Ό μ¨μ νκ³Ό μ΄ μΈλ±μ€λ₯Ό μ§μ νμ¬ μΆλ ₯λλλ‘ νμλ€.
νμ§λ§ μμ κ°μ νμμΌλ‘ μΆλ ₯νλ©΄ μ§κΈ λΉμ₯ 보기μλ νΈνμ§λ§ λ°μ΄ν° λΆμ μμλ μ’μ§ μκΈ° λλ¬Έμ μμ νκ³ κ°λ³ κ°μ΄ ννμ μΆλ ₯λλλ‘ κ°μ νμ±νμλ€.
μ 체 μμ± μ½λ
#μκ°λλ³ κ° μ¬μ©μ νλ λΉλ λΆμ
def analyze_activity_by_time(data):
"""λ°μ΄ν°νλ μμμ μκ°λλ³ νλμ λΆμ"""
#μκ°λ Hours μΉΌλΌμΌλ‘ μΆμΆ
df['Hours'] = pd.to_datetime(df['Time'], format='%H:%M').dt.hour
#μκ°λ 4κ° λ²μλ‘ λλκΈ°
boundary = [0, 6, 12, 18, 24]
labels = ['μλ²½', 'μ€μ ', 'μ€ν', 'μ λ
']
df['Time_Parts'] = pd.cut(df['Hours'], bins=boundary, labels=labels, right=False, include_lowest=True)
#μκ°λλ³ νλ λΉλ μ§κ³
activity_by_time = df.groupby(['Name', 'Time_Parts']).size().reset_index(name='Count_Messages')
return activity_by_time
df = generate_dataframe(data)
analyze_activity_by_time(df)