點選藍字 · 關註我們
大家好,我是Bryce~
你們好不好奇,過去一年時間裏,都和物件聊了些什麽…(啥?你沒物件 )
作為數據分析師,絕不能靠印象說話,要用數據。所以本文 用Python分析過去一年和媳婦的微信聊天記錄 ,從月、周、日、小時等時間維度做出一些統計分析及視覺化,然後透過jieba分詞、統計詞頻來繪制詞雲圖。
有點意思呦,一起來看看吧!
一、獲取數據並處理
首先,透過工具把微信聊天記錄匯出來,形成csv檔。
# 看看數據長啥樣
msg_data = pd.read_csv('微信聊天記錄.csv')
msg_data.head()
2.然後,取出2023年的數據,做一些前處理工作。
# 只取2023年的數據
msg_data['date'] = msg_data['StrTime'].str[:10]
msg_data['year'] = msg_data['StrTime'].str[:4]
msg_data['month'] = msg_data['StrTime'].str[5:7]
msg_data['hour'] = msg_data['StrTime'].str[11:13]
msg_data_2023 = msg_data[msg_data['year'] == '2023']
msg_data_2023.reset_index(drop=True, inplace=True)
# 計算是周幾
msg_data_2023 = msg_data_2023.copy()
msg_data_2023.loc[:, 'time_datetime'] = pd.to_datetime(msg_data_2023.loc[:,'StrTime'])
msg_data_2023.loc[:, 'day_of_week_number'] = msg_data_2023.loc[:, 'time_datetime'].dt.dayofweek
day_names_zh = {0: '周一', 1: '周二', 2: '周三', 3: '周四', 4: '周五', 5: '周六', 6: '周日'}
msg_data_2023['day_of_week'] = msg_data_2023['day_of_week_number'].map(day_names_zh)
del msg_data_2023['time_datetime']
msg_data_2023['StrContent'] = msg_data_2023['StrContent'].astype(str)
msg_data_2023.head()
3. 對Type列和IsSender列做一些轉換
Type列為訊息型別,比如1表示文本,3表示圖片,49表示檔等。IsSender列,1表示自己,0表示對方。
二、簡單的數據統計
1. 2023年365天,我們聊了355天 。
msg_data_2023['date'].nunique() # 355
2.2023年
一共發了23784條訊息,共161869字
,平均每條訊息8個字。其中,我發了11554條訊息,她發了12230條訊息。
# 行數統計
msg_data_2023.shape[0]
# 字數統計
total_chars_and_punctuation = msg_data_2023['StrContent'].apply(count_chinese_chars_and_punctuation).sum()
3.對各種訊息型別進行統計
可以看出,
她愛發文本訊息,而我更愛打視訊電話
,足足多了73次,差不多是她的兩倍,哈哈哈!另外,我好像特別特別愛發表情,她的6倍…
# 各自發的訊息型別
msg_type_stat = msg_data_2023.groupby(['IsSender', 'Type'])['StrContent'].size().reset_index(name='count')
msg_type_stat = msg_type_stat.reset_index(drop=True)
msg_type_stat = msg_type_stat.pivot_table(index = ['Type'], columns= 'IsSender', values='count', fill_value=0)
msg_type_stat.reset_index(inplace=True)
sorted_msg_type_stat = msg_type_stat.sort_values(by='Q', ascending=False)
sorted_msg_type_stat.reset_index(drop=True, inplace=True)
sorted_msg_type_stat['Q-T'] = sorted_msg_type_stat['Q'] - sorted_msg_type_stat['T']
sorted_msg_type_stat
4.很好奇,哪次聊得最久
設定5分鐘內回的訊息都為1次聊天,超過了就不算。經計算發現:最長的時長為2368秒,即39分鐘,發生在2023-04-20 22:00:12 ~ 2023-04-20 22:39:40。看來還是晚上有得聊些…
三、數據視覺化
訊息數按月統計
msg_month = msg_data_2023.groupby(['month'])['StrContent'].size().reset_index(name='count')
# 繪制柱狀圖
plt.figure(figsize=(10, 6))
plt.bar(msg_month['month'], msg_month['count'], color='orange', width=0.5, edgecolor='black', label='Values')
plt.legend()
plt.title('訊息數按月統計')
plt.xlabel('月份')
plt.ylabel('訊息數量')
plt.grid(axis='y', alpha=0.75)
10月份聊得最少,因為有個國慶日,天天在一起,訊息數自然少,數據正常。而12月訊息數最多,也是非常合理的,因為那時快臨近我們的婚期了,太多的事情需要溝通了。
2.訊息數按周統計
msg_week = msg_data_2023.groupby(['day_of_week', 'day_of_week_number'])['StrContent'].size().reset_index(name='count')
sorted_msg_week = msg_week.sort_values(by='day_of_week_number', ascending=True)
sorted_msg_week.reset_index(drop=True, inplace=True)
# 雷達圖
labels = sorted_msg_week['day_of_week'].values
data_week = list(sorted_msg_week['count'].values)
angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist()
data = np.concatenate((data_week, [data_week[0]]))
angles = np.concatenate((angles, [angles[0]]))
fig = plt.figure()
ax = fig.add_subplot(111, polar=True)
ax.plot(angles, data, 'o-', linewidth=2)
ax.fill(angles, data, alpha=0.25)
ax.set_thetagrids((angles * 180/np.pi)[:7], labels)
ax.set_title("訊息數按周幾統計")
plt.show()
可以看到,周一到周五訊息數非常平均,周末數量驟減。是的,你沒猜錯,我們是
周末夫妻
,工作日在兩地上班,周末才會相聚。
3.訊息數按日統計
msg_day = msg_data_2023.groupby(['date'])['StrContent'].size().reset_index(name='count')
msg_day.loc[:, 'date_datetime'] = pd.to_datetime(msg_day.loc[:,'date'])
del msg_day['date']
# 設定日期為索引
msg_day.set_index('date_datetime', inplace=True)
date_range = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D')
msg_day_resampled = msg_day.asfreq(freq='D', fill_value=0)
msg_day_resampled.reset_index(inplace=True)
# 繪制每日熱力圖,沒聊天的日期置為0
year = msg_day_resampled['date_datetime'].dt.year.unique()[0] # 假設所有日期都在同一年
week_number = msg_day_resampled['date_datetime'].dt.isocalendar().week
day_of_week = msg_day_resampled['date_datetime'].dt.dayofweek # 0代表周一,6代表周日
heatmap_data = msg_day_resampled.pivot_table(index=week_number, columns=day_of_week, values='count', aggfunc='sum').fillna(0)
fig = plt.figure(figsize=(12, 6))
pink_cmap = sns.diverging_palette(240, 10, as_cmap=True)
sns.heatmap(heatmap_data, cmap=pink_cmap, annot=False, fmt='d', linewidths=0.5)
plt.xlabel('周幾 (0=Mon, 6=Sun)')
plt.ylabel('周數')
plt.title('訊息數每日熱力圖')
plt.show()
4.訊息數按小時統計
msg_hour = msg_data_2023.groupby(['hour'])['StrContent'].size().reset_index(name='count')
categories = list(msg_hour['hour'].values)
values = list(msg_hour['count'].values)
# 建立顏色對映並提取顏色
colormap = cm.get_cmap('Reds', 24)
colors = [colormap(i / 23) for i in range(24)]
N = len(categories)
angles = np.linspace(0, 2 * np.pi, N, endpoint=False).tolist()
values = values + values[:1]
angles = angles + angles[:1]
# 建立極座標圖
fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True))
for i in range(N):
ax.bar(angles[i], values[i], width=0.20, bottom=0.0, color=colors[i % len(colors)])
ax.set_yticklabels([])
ax.set_xticks(angles[:-1])
ax.set_xticklabels(categories)
plt.gca().spines['polar'].set_visible(False)
plt.title('訊息數按小時統計', va='bottom')
plt.show()
這裏采用了 南廷庫爾玫瑰圖 !
可以看出來,12點,17、18點,21點多的時間聊得比較多,基本都是飯點或者是晚上下班後,非常符合日常的聊天習慣。四、最有趣的詞雲
先把聊天記錄合在一起
msg_T = filtered_df[filtered_df['IsSender'] == 'T'].loc[:, 'StrContent'].to_frame()
msg_Q = filtered_df[filtered_df['IsSender'] == 'Q'].loc[:, 'StrContent'].to_frame()
msg_all = ','.join(map(str, filtered_df['StrContent']))
msg_join_T = ','.join(map(str, msg_T['StrContent']))
msg_join_Q = ','.join(map(str, msg_Q['StrContent']))
2.先繪制總的詞雲,然後繪制各自的詞雲
# 使用jieba進行分詞
words_list_jieba = jieba.lcut(msg_all)
words_list = [x for x in words_list_jieba if x not in excluded_words]
# 使用Counter進行詞頻統計
word_counter = Counter(words_list)
sorted_file = word_counter.most_common()
mask = np.array(Image.open("7.jpg"))
# 生成詞雲時指定遮罩
tmp_wordcloud = WordCloud(font_path='C:\Windows\Fonts\simhei.ttf',
background_color='white',
mask=mask)
wordcloud = tmp_wordcloud.generate_from_frequencies(dict(sorted_file))
# 顯示詞雲圖
plt.figure(figsize=(10, 8))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
所有聊天記錄的詞雲, 我們 是最大的兩個字,劃重點,要考!
她聊天記錄的詞雲,我們依然是第一位,然後是……
買買買,哈哈哈
。和我了解的她一模一樣,愛購物,樂觀積極。
最後再來看看我的詞雲,重點詞: 我們、下班、買 。看來下班真是件幸福的事,幾乎每次下班都說一聲!
關於 買 字,我需要 狡辯 解釋一下 一般都是我讓她買,不是我買,畢竟經濟大權在她那。
以上就是本次分享的全部內容。 如果你有興趣,後台回復【聊天分析】,即可獲得完整的程式碼。
我是Bryce,我們下期見~
你好!我是Bryce,自學從機械專業轉行大廠數據分析。轉正半年被主管破格提拔晉升一級,目前是某計畫數據業務負責人。日常輸出數分技術、AI編程、職場認知相關內容,歡迎交流!
關註我
常進步
關註下方公眾號,回復【數據分析書籍】,即可獲取SQL、Python、機器學習等方面的電子書合集。