μ κ²μκΈμμ μΉ΄μΉ΄μ€ν‘ μλ³Έ λν λ΄μ©μ λ΄λ €λ°μ μ μ²λ¦¬νλ κ³Όμ μ μμ±νκ³ ν¨μλ‘ κ΅¬νν΄λ³΄μλ€.
βΌ κ²μλ¬Ό νμΈνκΈ°
[DA][Python] (2μ°¨ μ€κ³ λ° μμ±) μΉ΄μΉ΄μ€ν‘ λν λ°μ΄ν° μ μ²λ¦¬ μ½λ μμ μ€κ³
νμ¬ ν΄λΉ λ΄μ©μ νΌλλ°±μ λ°μ μ½λ μμ±μ μλ£νμμΌλ©° μ΅μ’ μμ±λ μ½λμ λν μ€λͺ μ΄λ€.μμ μ¬ν1. ν¨μλͺ μ λͺ ννκ² λ³κ²½2. μλ³Έ λ°μ΄ν°μ μ‘΄μ¬νλ μλ‘ λ€λ₯Έ νμμ λΌμΈ λ κ°μ§μ
sundery.tistory.com
μμ λ κ°μ ν¨μλ₯Ό λ§λ€μκΈ° λλ¬Έμ μΈλ²μ§Έ κΈ°λ₯ ν¨μλ₯Ό ꡬννκ³ μ νλ€.
μ΄λ²μλ μκ°λ λ²μλ₯Ό λλκ³ κ° μ¬μ©μκ° μμ£Ό μ±ν λ°©μ λ€μ΄μ€λ νλ μκ°λλ₯Ό λΆμνλ κ²μ΄λ€.
λ²μμ λν΄ κ°μ λνλλ κ²μ΄κΈ° λλ¬Έμ νμ΄μ°¨νΈλ‘ μΆλ ₯λλλ‘ μ€κ³ν κ²μ΄λ©° κ°λ³μ μΌλ‘ μ¬λμ νν°λ§νμ¬ μΆμΆλ μ μλλ‘ μ½λλ₯Ό μμ±ν μμ μ΄λ€.
λν μμ ν¨μμμ μ¬μ©ν λ°μ΄ν°λ€μ κ°μ‘± λ¨ν‘λ°©μ κ°μ Έμμ§λ§ μ΄λ²μλ 6λͺ μ μΈμμ λ¨ν‘λ°© λ΄μ©μ κ°μ Έμμ 6κ°μνμ΄μ°¨νΈλ₯Ό 보μ΄λλ‘ νμ¬ λ€μν κ²°κ³Όκ°μ λμΆν μμ μ΄λ€.
λΆμ λ΄μ©
μ¬μ©μλ³ κ° μκ°λ νλ λΉλ λΆμ
λ¨Όμ ν¨μκ° 2κ° λμ¬ μμ μ΄λ€.
μκ°λ λ²μλ‘ λλ μ νλ λΉλλ₯Ό μ§κ³ν ν¨μμ μ΄λ¦λ³λ‘ κ²°κ³Όλ₯Ό λ°λ‘ μΆλ ₯ν΄μ£Όλ ν¨μ λ κ°λ₯Ό μμ±ν κ²μ΄λ€.
λ¨Όμ μκ°λ λ²μλ₯Ό λλλ ν¨μλ₯Ό μ μνλ€.
def analyze_activity_by_time(df):
μλ³Έ λ°μ΄ν°λ₯Ό μ°Έκ³ ν΄λ³΄λ©΄ μλμ κ°μλ°
μ¬κΈ°μ Time μΉΌλΌμ κ°μ Έμμ μ¬μ©ν΄μΌ νλ€.
μ°μ λ΄κ° λλκ² λ μκ°λ λ²μλ μλμ κ°λ€.
μλ²½ | μ€μ | μ€ν | μ λ |
00μ ~ 05μ 59λΆ | 06μ ~ 11μ 59λΆ | 12μ ~ 17μ 59λΆ | 18μ ~ 23μ 59λΆ |
λ²μλ Hoursλ₯Ό κΈ°μ€μΌλ‘λ§ λλκΈ° λλ¬Έμ μκ° λ°μ΄ν°κ°μμ Hoursλ§ μΆμΆν΄μΌ νλ€.
df['Hours'] = pd.to_datetime(df['Time'], format='%H:%M').dt.hour
- Time μΉΌλΌμμ μκ°κ³Ό λΆ fomatμΌλ‘ κ°μ Έμμ datetimeμ hourλ§ μΆμΆνλ€.
μκ°λλ₯Ό 4κ° λ²μλ‘ λλκΈ° μν΄ λΌλ²¨κ³Ό λ²μλ₯Ό μ§μ νλ€.
boundary = [0, 6, 12, 18, 24]
labels = ['μλ²½', 'μ€μ ', 'μ€ν', 'μ λ
']
κ·Έλ¦¬κ³ λ°μ΄ν°νλ μ μΉΌλΌ 'Time_Parts'λ₯Ό λ§λ€μ΄μ κ°μ λ£μ΄μ€λ€.
κ°μ μμ λλμλ Hoursμμ κ°μ Έμ¨λ€.
df['Time_Parts'] = pd.cut(df['Hours'], bins=boundary, labels=labels, right=False, include_lowest=True)
- κ°μ boundary, κ° λ²μ λͺ μ labelsμμ κ°μ Έμ€κ³ μ€λ₯Έμͺ½ κ°μ ν¬ν¨νμ§ μκ³ μΌμͺ½ κ°μ ν¬ν¨νλλ‘ Falseμ Trueλ₯Ό μ§μ ν΄μ€λ€.
λ€μμΌλ‘ μκ°λλ³λ‘ νλ λΉλλ₯Ό μ§κ³ν΄μ£Όλ κ°μ μμ±νλ€.
activity_by_time = df.groupby(['Name', 'Time_Parts']).size().reset_index(name='Count_Messages')
return activity_by_time
- Nameκ³Ό Time_Parts μ΄μ κΈ°μ€μΌλ‘ κ·Έλ£Ήννλ€.
- κ° κ·Έλ£Ήμ ν¬κΈ°, κ° κ·Έλ£Ή λ΄μ ν μλ₯Ό κ³μ°νκΈ° μν΄ size()λ₯Ό μ΄λ€.
- κ·Έλ£Ήν κ²°κ³Όλ₯Ό λ°μ΄ν°νλ μ ννλ‘ λ³ννκ³ μΈλ±μ€λ₯Ό Count_MessagesλΌλ μΉΌλΌ μ΄λ¦μΌλ‘ μ§μ νλ€.
βΌ μ΅μ’ μ½λ
#μ¬μ©μλ³ κ° μκ°λ νλ λΉλ λΆμ
def analyze_activity_by_time(df):
"""λ°μ΄ν°νλ μμμ μκ°λλ³ νλμ λΆμ"""
#μκ°λ 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
κ° μ¬μ©μ κ°μΈ κ°λ μΆλ ₯λλλ‘ μμ±
μμ κΈ°λ₯μ νμ΄μ°¨νΈλ‘ μΆλ ₯λλλ‘ μ€μ ν κ²μ΄κΈ° λλ¬Έμ λ°λ‘ ν¨μλ₯Ό μ§μ ν΄μ€λ€.
def individual_activity_time(activity_by_time, names):
- names ν¨μμ μΆλ ₯κ°μ μ°Ύμ μ΄λ¦μ μ λ ₯νλ€.
μ¬μ©μ λ°μ΄ν°μ κ°μ΄ λ¬Έμμ΄μΈμ§ μλμ§ νμΈνκ³ λ¦¬μ€νΈλ‘ λ³ννλ€.
if isinstance(names, str):
names = [names]
μμ λ§λ names κ°μ λ€μ΄κ°λ κ°μ μ μΈν κ°λ€μ Falseλ‘ μ§μ ν μ μλλ‘ νλ€.
user_data = activity_by_time[activity_by_time['Name'].isin(names)]
- 'Name' μ΄μμ names 리μ€νΈμ μλ μ΄λ¦λ€μ κ°μ§ νμ μ°Ύμμ λ°μ΄ν° νλ μμ νμ±νμ¬ user_data λ³μμ μ½μ νλ€.
λ°μ΄ν°λ₯Ό μ¬κ΅¬μ±νμ¬ μκ°λ λ²μμ λ§κ² κ°μ΄ μΆλ ₯λλλ‘ νΌλ² ν μ΄λΈμ ꡬμ±νλ€.
pivot_table = user_data.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
- νΌλ² ν μ΄λΈμ ν λ μ΄λΈμ 'Name' κ°μΌλ‘ μ€μ νλ€.
- λν νΌλ² ν μ΄λΈμ μ΄ λ μ΄λΈμ Time_Partsλ‘ μ§μ νμ¬ κ° μ΄μ μκ° λ²μλ‘ μ§μ νλ€.
- λ§μ§λ§μΌλ‘ νΌλ² ν μ΄λΈμ κ°μ Count_Messages μ΄ κ°μΌλ‘ λ©μμ§ μλ₯Ό μΌλ€.
- κ·Έλ¦¬κ³ κ°μ΄ μλ μ μ 0μΌλ‘ μ§μ νκΈ° μν΄ fillna(0)μ μ¬μ©νμ¬ νΉμ μ¬μ©μμ μκ° μ‘°ν©μ λ©μμ§κ° μλ κ²½μ°λ₯Ό μμ νλ€.
μμ±ν νΌλ² ν μ΄λΈμ νμ©νμ¬ νμ΄ μ°¨νΈλ₯Ό μμ±νλ€.
if not pivot_table.empty:
pivot_table.iloc[0].plot(kind='pie', autopct='%1.1f%%', startangle=90, legend=False)
plt.title(f"{names}μ μκ°λλ³ νλ λΉλ")
plt.ylabel('')
plt.show()
- λ§μ½ pivot_tableμ λ°μ΄ν°κ° λΉμ΄μμ§ μλ€λ©΄
- pivot_tableμ 첫 λ²μ§Έ μ¬μ©μ λ°μ΄ν°λ₯Ό μ ννμ¬ μΆλ ₯νλ€. (user_dataλ₯Ό λ£μκΈ° λλ¬Έμ μ¬μ©μκ° μ λ ₯ν μ°Έμ¬μμ κ°μ΄ μΆλ ₯λλ€.)
- νμ΄μ°¨νΈλ‘ μ’ λ₯λ₯Ό μ ννκ³ λ°±λΆμ¨λ‘ νννλ, μμμ 첫 λ²μ§Έ μ리κΉμ§λ§ μΆλ ₯νλ€,
- startangle=90μ μ¨μ νμ΄ μ°¨νΈμ μμ κ°λλ₯Ό 90μΌλ‘ μ€μ νλ€.
- λ²λ‘λ₯Ό νμνμ§ μλλ‘ legend=Falseλ‘ μ€μ νλ€.
- νμ΄μ°¨νΈμ title λͺ κ³Ό yμΆ λΌλ²¨μ μ κ±°νμ¬ νμνλλ‘ μμ±νλ€.
λ°λλ‘ μ μ²΄λ‘ μΆλ ₯νκ³ μΆμ λλ₯Ό μ λ ₯νλ€.
μ¬μ©μμ μ΄λ¦μ μμ±νμ§ μμμ λ μ 체 κ°μ΄ μΆλ ₯λλλ‘ νλ€.
else:
pivot_table = activity_by_time.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
- μμλ user_data κ°μ κ°μ Έμμ νΌλ² ν μ΄λΈλ‘ λ§λ€μμ§λ§, μ μ²΄κ° μΆλ ₯λμ΄μΌ νκΈ° λλ¬Έμ activity_by_timeμμ μμ±νλ€.
μ¬λ¬ κ°μ μλΈ νλ‘―μ μμ±νμ¬ νμ΄μ°¨νΈλ₯Ό μμ±νλ€. (μ 체λ₯Ό μΆλ ₯νκΈ° μν΄ νμ)
fig, axes = plt.subplots(nrows=1, ncols=len(pivot_table), figsize=(15, 5))
- μ¬λ¬ κ°μ μλΈνλ‘―μ μμ±νλ subplotsλ₯Ό μ¬μ©νλ€.
- nrows=1 μ μ¬μ©νμ¬ ν νμ λͺ¨λ λ°°μΉλλλ‘ νλ€.
- μλΈ νλ‘―μ κ°μλ pivot_tableμ ν μλ§νΌ μμ±ν΄μΌ νκΈ° λλ¬Έμ lenμ μ¬μ©νλ€.pie
- μ 체 κ·Έλνμ ν¬κΈ°λ₯Ό κ°λ‘ 15μΈμΉ, μΈλ‘ 5μΈμΉλ‘ fig μ¬μ΄μ¦λ₯Ό μ§μ νλ€.
νΌλ² ν μ΄λΈμ λͺ¨λ κ°μ μΆλ ₯νκΈ° μν΄ λ°λ³΅νμ¬ μ²λ¦¬νλ for λ¬Έμ μ¬μ©νλ€.
for i, (names, data) in enumerate(pivot_table.iterrows()):
data.plot(kind='pie', ax=axes[i], autopct='%1.1f%%', startangle=90, legend=False)
- forμ μ¬μ©νμ¬ νΌλ² ν μ΄λΈμ κ° νμ λ°λ³΅νμ¬ μ²λ¦¬νλ€.
- iλ‘ μΈλ±μ€ κ°μ λνλ΄κ³ namesλ‘ νμ¬ νμ μ΄λ¦μ λνλΈλ€.
- enumerate νμ΄μ¬μ λ΄μ₯ ν¨μλ‘, 리μ€νΈλ₯Ό μννλ©΄μ μΈλ±μ€μ μμλ₯Ό λμμ λ°ννλ€.
- namesμ dataλ₯Ό λ°λ³΅ μννλ€.
- ax=axes[i]λ₯Ό μ¬μ©ν΄μ νμ¬ μλΈνλ‘―μ μ°¨νΈλ₯Ό κ·Έλ¦°λ€.
- autopct = '%1.1f%%' λ₯Ό μ΄μ©νμ¬ νμ΄ μ°¨νΈμμ κ° μ‘°κ°μ λΉμ¨μ νμνλ νμμΌλ‘ μ§μ νλ€.
- pie ν¨μμμλ§ μ¬μ©λλ€.
- fλ₯Ό μ¨μ μ«μλ₯Ό μμλ‘ νμνν¨μ λνλΈλ€.
- %%λ₯Ό μ¬μ©ν΄μ νΌμΌνΈ κΈ°νΈλ₯Ό μΆλ ₯μ ν¬ν¨μν¨λ€.
- startangle=90μΌλ‘ μ°¨νΈμ μμ κ°λλ₯Ό 90μΌλ‘ μ€μ νκ³ legend=False λ₯Ό ν΅ν΄ λ²λ‘λ₯Ό νμνμ§ μλλ‘ μ€μ νλ€.
μλΈνλ‘―μ μ λͺ©κ³Ό yλ μ΄λΈμ μμμ μμ κ³ κΉλν νμ΄ μ°¨νΈλ‘ μΆλ ₯νκΈ° μν΄ μλμ κ°μ μ½λλ μΆκ°νλ€.
axes[i].set_title(names)
axes[i].set_ylabel('')
- κ° μλΈ μ°¨νΈμ μ΄λ¦μ μ¬μ©μ μ΄λ¦μΌλ‘ μ§μ νκ³ ylabelμ νμμκΈ° λλ¬Έμ μλ΅ν΄μ€λ€.
κ·Έλ¦¬κ³ νμ΄ μ°¨νΈκ° μΆλ ₯λλλ‘ νλ μ½λλ‘ λ§λ¬΄λ¦¬νλ€.
plt.tight_layout()
plt.show()
return individual_activity_time
βΌ μ 체 μ½λ
## κ°λ³ μ¬μ©μ νλ μκ°λ μΆλ ₯ μ½λ
def individual_activity_time(activity_by_time, names):
"""νΉμ μ¬μ©μμ μκ°λλ³ νλ λΉλλ₯Ό νμ΄ μ°¨νΈλ‘ νμ"""
# νΉμ μ¬μ©μ λ°μ΄ν° νν°λ§
if isinstance(names, str):
names = [names]
user_data = activity_by_time[activity_by_time['Name'].isin(names)]
# νΌλ² ν
μ΄λΈ μμ±
pivot_table = user_data.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
# νμ΄ μ°¨νΈ μμ±
if not pivot_table.empty:
pivot_table.iloc[0].plot(kind='pie', autopct='%1.1f%%', startangle=90, legend=False)
plt.title(f"{names}μ μκ°λλ³ νλ λΉλ")
plt.ylabel('')
plt.show()
else:
pivot_table = activity_by_time.pivot(index='Name', columns='Time_Parts', values='Count_Messages').fillna(0)
fig, axes = plt.subplots(nrows=1, ncols=len(pivot_table), figsize=(15, 5))
for i, (names, data) in enumerate(pivot_table.iterrows()):
data.plot(kind='pie', ax=axes[i], autopct='%1.1f%%', startangle=90, legend=False)
axes[i].set_title(names)
axes[i].set_ylabel('')
plt.tight_layout()
plt.show()
return individual_activity_time
activity_by_time = analyze_activity_by_time(df)
individual_activity_time(activity_by_time, ' ')
κ²°κ³Όκ°