데이터 분석

카톡 분석 : 파이썬

박범준2 2019. 11. 28. 00:41
반응형

재미를 목적으로 만든 카카오톡 대화 분석기입니다. 

우리 단톡방은 언제 말이 많았고, 누가 어떤 말을 많이 사용하는지 알 수 있었네요.

(개인신상과 관련된 부분은 가렸습니다.)

 

파이썬+주피터를 사용했습니다.


 

 

카카오톡 단톡방 분석
분석 목차
연도별 메시지 개수
월별 메시지 개수
요일별 메시지 개수
시간별 메시지 개수
중간 정리
보낸 사람 별 메시지 개수
이모티콘 사용 순위
사진 보내기 순위
욕설 순위
욕설 순위2
욕설 순위3
감탄 순위
웃음 순위
눈물 순위
강조 순위
의문 순위

 


코드

카카오톡의 대화내용 내보내기 기능을 이용하여 추출한 csv파일을 이용했습니다.

#!/usr/bin/env python
# coding: utf-8

# # 카카오톡 대화 분석기
# 

# In[ ]:


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')

import locale 
locale.setlocale(locale.LC_ALL, 'ko_KR.UTF-8')


# In[ ]:


df=pd.read_csv("talk.csv")


# In[ ]:


df.head()


# ## 전처리
# - Date 변수 나누기
# - 시스템 메시지 제거
#  - 초대했습니다.
#  - 나갔습니다.
# - 결측값 처리

# ### Date 변수 나누기
# 

# In[ ]:


df["Date"]=df["Date"].astype("datetime64") 

df["year"]=df["Date"].dt.year
df["month"]=df["Date"].dt.month
df["day"]=df["Date"].dt.day
df["hour"]=df["Date"].dt.hour
df['weekday']=df["Date"].dt.strftime("%A")


# ### 시스템 메시지 제거

# In[ ]:


df=df[~df["Message"].str.contains("invited")]
df=df[~df["Message"].str.contains("나갔습니다.")]


# ### 결측값 제거

# In[ ]:


df.isnull().sum()


# In[ ]:


df["User"]=df["User"].fillna("(알 수 없음)")


# ## 분석 
# 기간 : 2014-02-13 ~ 2019-08-23(약 6년)  
# 메시지 개수 : 213,047건
# - 날짜
#     - 연도별 메시지 개수
#     - 월별 메시지 개수
#     - 요일별 메시지 개수
#     - 시간별 메시지 개수
# - 내용
#     - 보낸 사람별 메시지 개수
#     - 이모티콘 사용 순위
#     - 사진 보내기 순위
#     - 욕설 순위
#         - ㅅㅂ
#         - ㅂㅅ
#         - ㅁㅊ
#     - 감탄 순위
#         - 우와
#     - 웃음 순위
#         - ㅋ
#     - 눈물 순위
#         - ㅠ
#     - 강조 순위
#         - !
#     - 의문 순위
#         - ?
#     
# - ㅋㅋ이 가장 많은 대화(예정)
# 

# ### 날짜

# #### 연도별 메시지 개수

# In[ ]:


df.groupby("year")["Message"].count()


# In[ ]:


df.groupby("year")["Message"].count().plot(kind="pie")


# #### 월별 메시지 개수

# In[ ]:


df.groupby("month")["Message"].count()


# In[ ]:


df[df["year"]==2014].groupby("month")["Message"].count().plot(kind="pie");


# In[ ]:


df[df["year"]==2019].groupby("month")["Message"].count().plot(kind="pie");


# #### 요일별 메시지 개수

# In[ ]:


df.groupby("weekday")["Message"].count().sort_values(ascending=False)


# In[ ]:


df[df["year"]==2014].groupby("weekday")["Message"].count().sort_values(ascending=False).plot("pie");


# In[ ]:


df[df["year"]==2019].groupby("weekday")["Message"].count().sort_values(ascending=False).plot("pie");


# #### 시간별 메시지 개수

# In[ ]:


df.groupby("hour")["Message"].count()


# In[ ]:


df[df["year"]==2014].groupby("hour")["Message"].count().plot("pie");


# In[ ]:


df[df["year"]==2019].groupby("hour")["Message"].count().plot("pie");


# ### 내용

# #### 보낸사람별 메시지 개수

# In[ ]:


df.groupby("User")["Message"].count().sort_values(ascending=False)


# In[ ]:


df.groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 이모티콘 사용 순위

# In[ ]:


df[df["Message"]=="이모티콘"].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"]=="이모티콘"].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 사진 보내기 순위

# In[ ]:


df[df["Message"]=="사진"].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"]=="사진"].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 욕설 순위

# ##### ㅅㅂ

# In[ ]:


df[(df["Message"].str.contains("ㅅㅂ"))|(df["Message"].str.contains("시발")) ].groupby("User")["Message"].count().sort_values(ascending=False)[:5]


# In[ ]:


df[(df["Message"].str.contains("ㅅㅂ"))|(df["Message"].str.contains("시발")) ].groupby("User")["Message"].count().sort_values(ascending=True)[-10:].plot(kind="barh",grid=True);


# ##### ㅂㅅ

# In[ ]:


df[(df["Message"].str.contains("ㅂㅅ"))|(df["Message"].str.contains("병신"))].groupby("User")["Message"].count().sort_values(ascending=False)[:5]


# In[ ]:


df[(df["Message"].str.contains("ㅂㅅ"))|(df["Message"].str.contains("병신")) ].groupby("User")["Message"].count().sort_values(ascending=True)[-10:].plot(kind="barh",grid=True);


# ##### ㅁㅊ

# In[ ]:


df[(df["Message"].str.contains("ㅁㅊ"))|(df["Message"].str.contains("미친"))].groupby("User")["Message"].count().sort_values(ascending=False)[:5]


# In[ ]:


df[(df["Message"].str.contains("ㅁㅊ"))|(df["Message"].str.contains("미친")) ].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 감탄 순위

# ##### 우와

# In[ ]:


df[df["Message"].str.contains("우와")].groupby("User")["Message"].count().sort_values(ascending=False)[:5]


# In[ ]:


df[df["Message"].str.contains("우와")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# #### 웃음 순위

# ##### ㅋ 

# In[ ]:


df[df["Message"].str.contains("ㅋ")].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"].str.contains("ㅋ")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# ##### ㅎ

# In[ ]:


df[df["Message"].str.contains("ㅎ")].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"].str.contains("ㅎ")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# #### 눈물 순위

# ##### ㅠ

# In[ ]:


df[df["Message"].str.contains("ㅠ")].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"].str.contains("ㅠ")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# ##### ㅜ 

# In[ ]:


df[df["Message"].str.contains("ㅜ")].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"].str.contains("ㅜ")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# #### 강조 순위

# ##### !

# In[ ]:


df[df["Message"].str.contains("!")].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"].str.contains("!")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# #### 의문 순위

# ##### ?

# In[ ]:


df[df["Message"].str.contains("\?")].groupby("User")["Message"].count().sort_values(ascending=False)[:10]


# In[ ]:


df[df["Message"].str.contains("\?")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:-1].plot(kind="barh",grid=True);


# ### 번외 

# #### 사과 순위

# In[ ]:


df[df["Message"].str.contains("미안")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 존나 순위

# In[ ]:


df[(df["Message"].str.contains("ㅈㄴ"))|(df["Message"].str.contains("존나")) ].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 감사 순위

# In[ ]:


df[(df["Message"].str.contains("ㄱㅅ"))|(df["Message"].str.contains("감사"))|(df["Message"].str.contains("고마워"))|(df["Message"].str.contains("고맙")) ].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);


# #### 굿 순위

# In[ ]:


df[df["Message"].str.contains("굿")].groupby("User")["Message"].count().sort_values(ascending=True)[-11:].plot(kind="barh",grid=True);

 

자유롭게 사용하시고 

도움이 되었다면 공감이나 댓글 부탁드립니다!

반응형