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
,显然你不会有负九根指头,所以你大脑就崩溃了。
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 云」 作为例子,如果你添加 iPhone 自带的 Emoji 键盘,最开始就会显示近期使用的 Emoji ,你也可以去 EmojiCopy 快速选择复制你的表情。然后拷贝至表格中,分成各行。
计算频数的公式为
=COUNTIF('@@@', "*"&###&"*")
,将公示中的
@@@
换成另一张表格里文本所在列(
'S1'!A:A
),
###
换成这一行 emoji 所在单元格位置(
A1
)即可。
然后有一个小算数技巧:以上数据中,第一名「😂」 是第二名「👌」的将近 7 倍,是最后「💩」的近 100 倍,这样子词云中某个表情会占绝大多数面积,很难表现出频数,所以我们对 C 列频数开根号计算,让绝对差距变小。
至于制作 emoji 词云图,推荐在线使用 WordItOut 这个网站:
我们只要把表格形式的数据填入文本框中,就可以生成 emoji 云了,同时 WordItOut 也支持修改格式比例,套用已有模版。
另外,这份个人报告中所有的柱状图,都是使用 Numbers 制作。有一个特性大家可能平时会忽视:Numbers 柱状图可以选择「圆角」来让图片不显得锐利,这在结果呈现时还是很有必要的。
其他类型文本也可以通过构建字典方式做统计,另外一个易于上手的制作交互图表的网站是: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 减少阅读压力,备注用灰色小字不抢视野。排版是这一份不是很好的地方。因为是先有图片再有布局,被限定为九张图片,又比较贪心,文字图片都想显示就会导致阅读压力偏大。
以上就是全部内容,希望大家在专注科技资讯、新鲜应用同时,关心一下自己,关注一下个人数据。
如果你使用 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 所示, 打开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 上直接处理。以下为步骤:
先转换成 Unix 时间戳: =(INT(#)/1000000000+978307200)
,将 #
换成原 Mac Absolute Time 时间戳所在列(如图 3 中D2
)。
再转换成北京时间: =#/86400+DATE(1970,1,1)+HOUR(8)
,将 #
换成 Unix 时间戳所在列(如图 4 中G2
)。
最后把格式设置为yyyy/mm/dd h:mm
即可。
个人最满意的功能就是自动筛选,浏览数据时候非常提高效率。你可以直接进行数据筛选清洗,比如只选取 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 官方店铺 🛒