基于机器学习的人格预测项目:通过社交媒体数据预测MBTI人格类型
创作时间:
作者:
@小白创作中心
基于机器学习的人格预测项目:通过社交媒体数据预测MBTI人格类型
引用
1
来源
1.
https://www.cnblogs.com/ai168/p/18713523
基于机器学习的人格预测项目,通过分析社交媒体上的帖子内容,预测个体的MBTI(迈尔斯-布里格斯类型指标)人格类型。本文将详细介绍数据集的背景、内容和使用方法,并通过代码和可视化分析展示如何处理和分析人格数据。
项目背景
Myers Briggs 类型指标是一个人格类型系统,它根据内向性、直觉、思考和感知能力将人划分为16种不同的人格类型。这个项目的目标是开发一个模型,该模型能够基于个人在社交媒体上的行为和发布的内容,预测他们的Myers Briggs人格类型。
关于数据集
迈尔斯-布里格斯类型指标(简称MBTI)是一个个性类型系统,将每个人划分到4个轴上的16种不同的个性类型:
- 内向(I) – 外向(E)
- 直觉(N) – 感觉(S)
- 思维(T) – 情感(F)
- 判断(J) – 感知(P)
例如,一个偏好内向、直觉、思维和感知的人在MBTI系统中会被标记为INTP。MBTI是世界上最受欢迎的个性测试之一,被用于企业、线上、娱乐、研究等多个领域。
近年来,MBTI的使用/有效性受到质疑,但仍然被视为在很多领域中非常有用的工具。这个数据集的目的就是帮助发现特定类型和其写作风格之间是否有任何模式,总体上探索测试在分析、预测或分类行为方面的有效性。
数据集内容
这个数据集包含超过8600行数据,每一行是一个人的:
- 类型(该人的4字母MBTI代码/类型)
- 他们最近发布的50篇文章的每个部分(每个条目用“|||”(三个竖线字符)分隔)
这些数据是通过PersonalityCafe论坛收集的,因为该论坛提供了大量的人群和他们的MBTI个性类型,以及他们所写的内容。
基本用途
- 使用机器学习评估MBTI的有效性和其在线预测语言风格和行为的能力。
- 生产一个机器学习算法,可以根据某人所写的一些文本尝试确定其个性类型。
数据分析
引入必要的库
import pandas as pd # 导入 pandas 库,用于数据处理和分析
import numpy as np # 导入 numpy 库,用于数值计算
import seaborn as sns # 导入 seaborn 库,用于绘制统计图表
import matplotlib.pyplot as plt # 导入 matplotlib.pyplot 库,用于绘图
读取数据
df = pd.read_csv('../input/mbti_1.csv') # 读取 CSV 文件,文件路径为 '../input/mbti_1.csv'
df.head() # 显示数据的前五行
定义一个计算每条评论中词数方差的函数
def var_row(row):
l = [] # 初始化一个空列表,用于存储每条评论的词数
for i in row.split('|||'): # 将帖子内容按 '|||' 分隔成每条评论
l.append(len(i.split())) # 计算每条评论的词数,并添加到列表中
return np.var(l) # 返回列表中词数的方差
计算每条评论的平均词数和词数方差
df['words_per_comment'] = df['posts'].apply(lambda x: len(x.split())/50) # 计算每条评论的平均词数,并添加到数据框中
df['variance_of_word_counts'] = df['posts'].apply(lambda x: var_row(x)) # 计算每条评论的词数方差,并添加到数据框中
df.head() # 显示数据的前五行
绘制不同类型用户的每条评论平均词数的 swarmplot 图
plt.figure(figsize=(15,10)) # 设置绘图窗口的大小
sns.swarmplot("type", "words_per_comment", data=df) # 绘制 swarmplot 图,x 轴为用户类型,y 轴为每条评论的平均词数
统计每种类型的用户数量
df.groupby('type').agg({'type':'count'}) # 按 'type' 列分组,统计每种类型的用户数量
筛选掉特定类型用户并计算每条评论中的 HTTP 链接数和问号数
df_2 = df[~df['type'].isin(['ESFJ','ESFP','ESTJ','ESTP'])] # 筛选掉 'ESFJ', 'ESFP', 'ESTJ', 'ESTP' 这几种类型的用户
df_2['http_per_comment'] = df_2['posts'].apply(lambda x: x.count('http')/50) # 计算每条评论中的 HTTP 链接数,并添加到数据框中
df_2['qm_per_comment'] = df_2['posts'].apply(lambda x: x.count('?')/50) # 计算每条评论中的问号数,并添加到数据框中
df_2.head() # 显示筛选后的数据的前五行
计算每种类型的用户每条评论中的平均 HTTP 链接数和问号数
print(df_2.groupby('type').agg({'http_per_comment': 'mean'})) # 按 'type' 列分组,计算每种类型的用户每条评论中的平均 HTTP 链接数
print(df_2.groupby('type').agg({'qm_per_comment': 'mean'})) # 按 'type' 列分组,计算每种类型的用户每条评论中的平均问号数
绘制不同类型用户的词数方差与每条评论平均词数的联合分布图
plt.figure(figsize=(15,10)) # 设置绘图窗口的大小
sns.jointplot("variance_of_word_counts", "words_per_comment", data=df_2, kind="hex") # 绘制 hexbin 联合分布图,x 轴为词数方差,y 轴为每条评论的平均词数
定义一个绘制不同类型用户的联合分布图的函数
def plot_jointplot(mbti_type, axs, titles):
df_3 = df_2[df_2['type'] == mbti_type] # 筛选指定类型的用户
sns.jointplot("variance_of_word_counts", "words_per_comment", data=df_3, kind="hex", ax=axs, title=titles) # 绘制 hexbin 联合分布图,x 轴为词数方差,y 轴为每条评论的平均词数
绘制所有类型用户的联合分布图
i = df_2['type'].unique() # 获取所有不同的用户类型
k = 0 # 初始化计数器
for m in range(0,2): # 外层循环,控制行数
for n in range(0,6): # 内层循环,控制列数
df_3 = df_2[df_2['type'] == i[k]] # 筛选指定类型的用户
sns.jointplot("variance_of_word_counts", "words_per_comment", data=df_3, kind="hex") # 绘制 hexbin 联合分布图,x 轴为词数方差,y 轴为每条评论的平均词数
plt.title(i[k]) # 设置子图的标题为用户类型
k += 1 # 更新计数器
绘制不同类型用户的词云图
from scipy.misc import imread # 从 scipy.misc 模块导入 imread 函数,用于读取图像
from wordcloud import WordCloud, STOPWORDS # 从 wordcloud 模块导入 WordCloud 和 STOPWORDS 类,用于生成词云图
fig, ax = plt.subplots(len(df['type'].unique()), sharex=True, figsize=(15,10*len(df['type'].unique()))) # 创建多个子图,每个子图对应一个用户类型,设置共享 x 轴
k = 0 # 初始化计数器
for i in df['type'].unique(): # 遍历所有不同的用户类型
df_4 = df[df['type'] == i] # 筛选指定类型的用户
wordcloud = WordCloud().generate(df_4['posts'].to_string()) # 生成词云图
ax[k].imshow(wordcloud) # 显示词云图
ax[k].set_title(i) # 设置子图的标题为用户类型
ax[k].axis("off") # 关闭坐标轴
k += 1 # 更新计数器
参考资料
- Pandas 官方文档:https://pandas.pydata.org/docs/
- Numpy 官方文档:https://numpy.org/doc/stable/
- Seaborn 官方文档:https://seaborn.pydata.org/tutorial.html
- Matplotlib 官方文档:https://matplotlib.org/stable/contents.html
- MBTI 简介与应用:https://www.verywellmind.com/what-is-mbti-2795965
- 数据科学入门:https://www.dataquest.io/blog/learning-path-data-science/
- Python 数据分析:https://www.cnblogs.com/jasonfjliu/p/11357168.html
- 统计图表可视化:https://www.jb51.net/article/123224.htm
- MBTI 类型的统计分析:https://www.researchgate.net/publication/332057668_Analysis_of_MBTI_Personality_Types_in_Social_Media_Posts
- 数据预处理技巧:https://towardsdatascience.com/data-preprocessing-with-python-pandas-part-1-33c8b0a44e45
- Hexbin 联合分布图详解:https://matplotlib.org/stable/gallery/statistics/hexbin_demo.html
- 词云图生成工具:https://amueller.github.io/word_cloud/
- MBTI 类型与社交媒体行为:https://www.tandfonline.com/doi/abs/10.1080/19317208.2018.1465568
- 数据分析中的统计方法:https://www.kaggle.com/learn/statistics
- Python 数据可视化教程:https://www.cnblogs.com/ffli/p/10268122.html
- MBTI 类型的性格特征:https://www.psychologytoday.com/us/basics/mbti
- 数据科学项目实例:https://www.kdnuggets.com/2020/06/top-10-data-science-projects.html
- 统计图表的高级用法:https://seaborn.pydata.org/examples/index.html
- Numpy 数值计算与应用:https://numpy.org/doc/stable/user/whatisnumpy.html
- 数据处理与分析实战:https://www.cnblogs.com/chengxiao/p/6128487.html
热门推荐
积极向上的字取名:从字形、音韵到含义的全方位指南
喝苏打水好吗?详细讲解苏打水的健康益处与饮用注意事项
唐朝四大山水田园诗人,王孟韦柳,四种风格谁是你的最爱?
抒情叙事关系与诗歌艺术规律
套二是什么意思
麻辣水煮牛肉制作详解:从食材到成品的完整指南
小儿贫血怎么补充铁剂药物
儿童贫血是什么原因造成的
生活中的电磁辐射对人体到底有多大的危害?
上海苏州地铁乘车避坑指南:沪苏互联篇
芯片IC测试工程师的前景分析:市场需求与职业发展路径
城市周边的秘境探索:发现北京箭扣长城、上海崇明岛的非热门景点
PE顶空进样器的主要性能指标与技术特点
合同标准化条款的撰写指南与法律实务分析
西晋八王之乱是哪八个王?为何最后能引来五胡乱华?
检查幽门螺杆菌需要多少钱?
低开缩量在股市中意味着什么?投资者在这一情况下应如何操作?
金融市场缩量现象全解析:原因分析与判断方法
如何测量金属丝的直径?
7个问题解答你关于美白面膜的所有困惑
石雕关公像的雕刻风格与流派
正宗老式蒸米糕做法,简单易学的正宗老式蒸米糕,回味儿时甜蜜!
推荐9款食疗汤羹——中国人的饮食智慧
高性能底漆:可喷涂、刷涂或辊涂,适用于多种施工方式
找律师一般律师费是多少
湿度理论5 - 温度和压力对相对湿度的影响
小杨哥掉粉300万,直播电商行业迎来拐点?
笔记本防中暑指南:教你给笔记本清灰
如何利用MACD指标选股?这些选股策略有哪些参考价值?
高于市场价2倍价格欺诈怎么办?五种维权途径全解析