Matrix 精选

Matrix 是少数派的写作社区,我们主张分享真实的产品体验,有实用价值的经验与思考。我们会不定期挑选 Matrix 最优质的文章,展示来自用户的最真实的体验和观点。

文章代表作者个人观点,少数派仅对标题和排版略作修改。


前言与展示

你可能已经不止一回被别人推荐使用 Apple 自带的 iMessage 作为聊天软件,因为它耗电量小,界面简洁,表情包可玩花样多。而且所有聊天记录上传 iCloud 云端备份,导出也非常方便。

非常幸运的是,我和身边人一直在使用 iMessage 聊天,积累了足量数据。恰逢年关,各大互联网公司都推出了自家产品的用户年度数据报告。但是因为聊天数据特殊,所以社交通讯应用是不会帮你制作个人年度报告的。所以在这里自己稍微尝试了一下,抛砖引玉,供大家参考:

请输入图片标题
请输入图片标题
请输入图片标题

高清长图可以点击 这里

虽然实际过程中是什么工具方便选什么,但是考虑到即使在少数派能熟练使用编程软件的也是少数派,所以整份报告都可以不用编程实现。如果你会一些编程的话,文末有一些个人经验可供参考。

导出和转换

比起现在正在手撕的微信数据,iMessage 数据导出真的非常友好。不过一般数据分析最劝退的步骤就是数据获取和导出,所以还是尽量写了详尽步骤。为了文章阅读流畅,放在附录共大家使用,如有疑惑可随意留言。

值得一提的是,转换过程中有个地方非常重要, chat.db里时间使用一种特别的 18 位数字时间戳(Timestamp)。一般系统和编程语言都计算 1970-01-01 开始的秒数作为时间,称为 Unix Timestamp,但是 Apple 一直比较特立独行,是从 2001-01-01零点开始计时,称作 Mac Absolute Time。我并没有搜寻到确切的原因,个人推测其中一个可能是 2038 问题 2

这个问题类似千年虫,是指在 2038 年 1 月 19 日 3 时 14 分 07 秒之后,32 位系统的 UNIX 时间将会被重置,从而某些软件将无法正常工作。具体原理就像小时候用手指做减法一样:当你数到 10 的时候,你的所有指头都用完了,那么这时再继续数 11,你只能用一根手指表示。但这样你做减法就变成:1 - 10,显然你不会有负九根指头,所以你大脑就崩溃了。

Year 2038 Problem(from Wiki)

32 位系统就像用 32 个指头来数时间,从 1970 年数到 2038 年那个时候正好都用完了1 ,这样会出现用过去时间表示未来的情况,自然会出现大量程序错误。而现在大多使用的 64 位系统数时间,要 2900 亿年后用完,自然不用担心。

但是是否绝大部分 32 位系统到 2038 年都淘汰了呢? 可能是考虑到这个问题,再加进入新千禧年, Apple 改成 2001-01-01开始计算时间,相当于给自家 32 位系统设备又续了 31 年的寿命。

不过目前无论是 iOS 还是 macOS 最新系统都已不支持 32 位应用与软件,以上这些也仅为个人推测。

分析、处理和作图

走完以上非常枯燥的数据导出清洗过程,我们来看一下数据结构。

样例

整个数据分为三列,第一列为聊天内容( 文本),但是不包含表情和文件。第二列是发送人( 来源),1 代表这一条为你自己,0 代表对方,最后是日期时间( 时间)。当然,数据库里还有很多其他信息也可以导出分析。例如,如果你 iMessage 有打开已读回执的话,可以将 data_read 导出分析。全文还是默认在北京时区,跨时区需要另找数据处理。

首先我们需要思考可以得到什么结果,常用一个思路是「维度组合」。这里一共三个维度,文本、时间、来源。可以单独分析,也可两两组合,下面举一些例子。

来源:比比谁发得最多!谁更喜欢一次性发很多条消息。

时间:比较容易想到是按照时间维度对数目进行统计,每日数量,变化趋势,极值背后的真实事件,特殊日期节点的情况。

文本 × 来源统计出吵架说得最多词语以后尽量少说,建一个最近网络流行语的词典看看谁更容易被影响,两人惯用语统计。

文本 × 来源 × 时间谁最先道歉,发什么内容的时候对方回复间隔比较漫长,回复晚安时间分析。

如果想法还是比较少,可以浏览其他年度报告,找找灵感,构思一下自己想涵盖哪些内容。在网上搜资料过程中,令人印象最深的是 2017 年淘票票 年度报告

淘票票年度报告( 配图来自上述链接)

它套用了茨威格「一个陌生女人的来信」的设定,整个结构是以书信情节来推动,统计数据也很好融入故事中,让人阅读十分流畅,也符合电影购票作为文艺消费的定位。虽然年度报告更多是 App 运营需要,但是自己制作的话,可以加入个性化探索,发现没注意到的日常,同时融入细节讲好一个故事。

接下来的事情如果你继续选择使用 Excel 做数据处理,那么就基本是一场「全国大学生计算机办公自动化上机考试」了。我并不是一位计算机或者编程老师,所以比起步骤,会更多推荐一些工具和技巧。

文本作图

不懂人工智能文本分析?

没关系!你就是那个人工智能。没有人或者 AI 比你更熟悉自己说过的话了,所以完全可以通过自己脑中记忆来构建词典。

Emoji 云

我们以相对复杂的 「 Emoji 云」 作为例子,如果你添加 iPhone 自带的 Emoji 键盘,最开始就会显示近期使用的 Emoji ,你也可以去 EmojiCopy 快速选择复制你的表情。然后拷贝至表格中,分成各行。

计算 Emoji 频数

计算频数的公式为 =COUNTIF('@@@', "*"&###&"*"),将公示中的 @@@换成另一张表格里文本所在列( 'S1'!A:A), ###换成这一行 emoji 所在单元格位置( A1)即可。

然后有一个小算数技巧:以上数据中,第一名「😂」 是第二名「👌」的将近 7 倍,是最后「💩」的近 100 倍,这样子词云中某个表情会占绝大多数面积,很难表现出频数,所以我们对 C 列频数开根号计算,让绝对差距变小。

至于制作 emoji 词云图,推荐在线使用 WordItOut 这个网站:

支持 emoji 的词云制作网站

我们只要把表格形式的数据填入文本框中,就可以生成 emoji 云了,同时 WordItOut 也支持修改格式比例,套用已有模版。

请输入图片标题

另外,这份个人报告中所有的柱状图,都是使用 Numbers 制作。有一个特性大家可能平时会忽视:Numbers 柱状图可以选择「圆角」来让图片不显得锐利,这在结果呈现时还是很有必要的。

其他类型文本也可以通过构建字典方式做统计,另外一个易于上手的制作交互图表的网站是:Datawrapper

Datawrapper 定制图表
距离图

Datawrapper 可定制各种图表。例如,比起柱状图,距离图(Range Plot)可以更加直观的显示两组离散数据差异,所以你可以用这种方式比较聊天双方对不同词语的使用偏好。

时序作图

这里我们使用大名鼎鼎的 Tableau 做时序数据可视化,可以下载免费版 Tableau Public 。如果你使用 Windows 也非常推荐 Power BI 。如果你在境外,有机会访问 Google ,在线的轻量级 Google Data Studio 也很方便,不过出于个人隐私还是建议先将聊天文本隐去。

至于学习资源和介绍,这篇文章《爬取2000篇 Matrix 文章,这是一份可视化踹门教程》已经给出非常细致内容,就不做赘述了,只是说下重要特点。

Tableau 最方便之处在于整合了数据处理、分析、可视化三块内容,而且上手非常简单。例如,如果想用 Excel 创建这张「每礼拜 4 时均消息热力图」,你需要先计算一列为小时,另一列为礼拜,然后汇总,数据透视,复制到另一张表,每列除以每年周数,调整格式上颜色。

但是在 Tableau 里面,你只需要把时间这个维度(Dimensions)拖动到行和列,分别改成礼拜和小时,双击变量条就可以做简单计算,然后根据喜好调整格式即可。

热力图

如果需要制作个人报告第二张图中日历热力图,只需把礼拜换成周数,然后调整格式。

Tableau 另外一点是有丰富的模版(Galley)。比如最后比较双方「晚安」时间的小提琴图(Violin Plot),自己创建非常麻烦,但是你可以下载模版,按照结构准备数据,一键生成并且在此基础上个性化微调。

总之 Tableau 方便时序作图的流程,并且如果结合文本分析,我们还可以继续挖掘有趣的内容。

排版与设计

首先真的非常推荐少数派「成为身边人中懂设计的那一个」付费课程,可以说物超所值。

这份个人数据报告基本可以看作是「懂设计」的线下个人实践。这篇文章的封面也算按照里面设计原则自己制作,使用工具也是仅仅是 Keynote 加 Numbers。当然还是有很多问题,比如页边距太小,排版还可以提高,但是还是分享一下制作思路。

首先选择大小。如果是发微博或者转发给朋友,那转一张长图片会比较方便;但是如果是发朋友圈的话,那么九图会比较合理。因为我实在不知道怎么选,就只能全都要。最后选择 Keynote 九张幻灯片,设定宽度 812 像素,比例 4:3。制作完后,导出图片再拼接成长图,通过一些跨页的元素来减少拼接带来的割裂感。

少数派里 Keynote 教程、技巧和资料已经有很多,这里也不赘述了。

我制作的思路是:字体选择无衬线字体,因为是数字阅读;然后因为是和数据相关算科技内容,所以选择黑体。因为是 Apple 自带应用,「苹方」肯定要用。我希望读者能一眼就看到关键信息,所以加上了粗体「冬青黑」。

配色只选择 Keynote 的模版颜色。正文使用灰黑色 #333333 减少阅读压力,备注用灰色小字不抢视野。排版是这一份不是很好的地方。因为是先有图片再有布局,被限定为九张图片,又比较贪心,文字图片都想显示就会导致阅读压力偏大。

以上就是全部内容,希望大家在专注科技资讯、新鲜应用同时,关心一下自己,关注一下个人数据。

附:iMessage 数据导出步骤

如果你使用 Windows:

则需要通过备份,找到%appdata%/Roaming/Apple Computer/MobileSync/Backup这里面寻找chat.db复制即可。 这里不演示 Windows 的情况,如遇问题可以留言帮忙解决。

如果你使用 macOS:

那很简单,打开 Finder,按command + shit + G,输入~/Library/Messages/chat.db,回车,将该文件拷出即可。

打开 db 格式文件需要下载专门软件,这里推荐一款免费开源的 DB Browser for SQLite,Win 、macOS 都支持。

用 DB Browser 打开文件:

图 1 找联系人的ROWID

如上图 1 所示,首先确定你想导出小伙伴的 iMessage 账号是多少。一般情况下是对方的手机号,但也可能是对方的 AppleID 账号, 去 iMessage 里面确认一下便可。

总之将table(黄色框)选为chat,将联系人的 iMessage 账号填入图中guid(黄色箭头)处筛选便可以得到ROWID,如图中为4

图 2 执行 SQL 并导出

如上图 2 所示, 打开Execute SQL(黄色框), 将下列 SQL 代码中的#替代为你刚找到联系人的ROWID,填入 SQL 文本框内(蓝色箭头处), 点击执行(左起第一红框),点击保存(左起第二红框)导出为 CSV 文件。

 SELECT ROWID, text, handle_id,
             date, is_from_me
             FROM message T1
            INNER JOIN chat_message_join T2
                 ON T1.ROWID=T2.message_id
                 AND T2.chat_id=#
             ORDER BY T1.date

如果你需要导出多个 ID 的联系人,只需要把 SQL 代码改成用OR连接就好,如AND (T3.chat_id=2 OR T3.chat_id=343)

我这边使用 WPS 打开处理正文提到的时间戳的问题。

Mac 装了新版的 WPS 之后基本就没有打开过 Excel 了, 操作逻辑和函数基本一样,也新添方便功能。但是使用时间长还是会发现很多 Bug 让人体验不好,换用 Excel Mac 来做也是类似的。如果你 WPS 打开是会乱码或者 emoji 显示不出,请用 Numbers 打开并导出为 Excel 格式,或在 Numbers 上直接处理。以下为步骤:

图 3 图中高亮所在行与列在浏览长数据时很常用

先转换成 Unix 时间戳: =(INT(#)/1000000000+978307200),将 #换成原 Mac Absolute Time 时间戳所在列(如图 3 中D2)。

图 4

再转换成北京时间: =#/86400+DATE(1970,1,1)+HOUR(8),将 #换成 Unix 时间戳所在列(如图 4 中G2)。

图 5

最后把格式设置为yyyy/mm/dd h:mm即可。

图 6 自动筛选

个人最满意的功能就是自动筛选,浏览数据时候非常提高效率。你可以直接进行数据筛选清洗,比如只选取 2019 年的条目。

这样子从 iMessage 数据库里面导出联系人聊天记录就完成了,过程有一点复杂但是基本按照流程走就可以实现,有问题可以随意留言。

如果你会一些编程:

以 Python 为例,可以用 sqlite3 导出 SQL 数据, 这里有一篇文章可供 参考。另外上文提到的时间戳的问题也可直接在 SQL 语句里面转换。具体语句可以根据需要去更改,比如把表情数据合并分析(~/Library/Messages/Attachments)。

 有关文本数据,如果你直接从聊天记录里面提取 emoji,要注意有些 emoji 是几个表情联合在一起的(How to Split Emoji)。关于国家地区、情绪感受、礼貌用语、人名称谓,这些是有专门的中文词库来使你的分析结果更加的准确。这里举一例:THUOCL:清华大学开放中文词库。 

另外个人觉得聊天记录做 NLP 是不太方便的,用传统方法进行统计效果会更好。因为聊天文本数据是质量不高的文本。平时聊天并不按照语法打出来,上下文联系也会跳来跳去,不改错别字也很正常,如果真的要做的话数据清洗会花很多时间。但是根据数据训练出一个聊天机器人还是可行的,网上教程 也很多。 

有关时序数据一个需要注意到的点是,每小时数目和每日数目数据是有意义的,但是每月和每礼拜是有误差的。以 2019 年为例,礼拜二有 53 天,比其他要多 1 天, 月份更是会在 28 - 31 间变化。所以用每月日均和每礼拜日均更加准确,不这样做的话会带来 2% - 3% 的差距。另一个问题是如何定义「每天」,例如计算「晚安」时间的话,需要特别处理到了第二天凌晨的情况。 

有关作图,如果你希望通过实现自动化的话,plot.ly UI 定制更加全面,你也可以选择 JS 或调用 JS 的方法实现可交互图表,个人推荐 highcharts 和 Google Chart

> 下载少数派 客户端、关注 少数派公众号,找到数字时代更好的生活方式 🎊

> 特惠、好用的硬件产品,尽在 少数派 sspai 官方店铺 🛒