當前位置: 妍妍網 > 辦公

Python數據分析:一年微信,情深幾許?

2023-04-20辦公

點選藍字 · 關註我們

大家好,我是Bryce~

你們好不好奇,過去一年時間裏,都和物件聊了些什麽…(啥?你沒物件 )

作為數據分析師,絕不能靠印象說話,要用數據。所以本文 用Python分析過去一年和媳婦的微信聊天記錄 ,從月、周、日、小時等時間維度做出一些統計分析及視覺化,然後透過jieba分詞、統計詞頻來繪制詞雲圖。

有點意思呦,一起來看看吧!

一、獲取數據並處理

  1. 首先,透過工具把微信聊天記錄匯出來,形成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。看來還是晚上有得聊些…

三、數據視覺化

  1. 訊息數按月統計

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'].valuesdata_week = list(sorted_msg_week['count'].values)angles = np.linspace(02 * 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=(126)) pink_cmap = sns.diverging_palette(24010, 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(02 * 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點多的時間聊得比較多,基本都是飯點或者是晚上下班後,非常符合日常的聊天習慣。

四、最有趣的詞雲

  1. 先把聊天記錄合在一起

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、機器學習等方面的電子書合集。