【数据挖掘干货】利用社会化媒体数据验证人们是否在周末会更快乐
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
人们总是在周末更快乐吗?
--- 对社会化媒体数据进行回归分析
==========
2011年斯科特·戈尔德(Scott Golder)和迈克尔·梅西(Michael Macy)的论文《不同文化背景下的工作、睡眠和白天不同,白天和季节性的情绪也不同》展示了社会化媒体对大规模人群的深度洞察。
本文中,使用情绪分析模型对朋友圈的讯息进行分析,并按小时、工作日、日长和国家报告变化。他们发现,人们总是在周末发布更多的积极正向的朋友圈内容,而在深夜发布更多的负面讯息。
在这个notebook中,分析目标包括:
Python数据科学堆栈,包括dataframes、绘图和统计分析
Simpson's Paradox (https:///wiki/Simpson%27s_Paradox),其中出现在聚合数据中的
结果不会出现在分类数据中
多元回归,可确定多个预测因子对结果变量的影响。
Dataframes
我们将首先加载数据,它以csv的形式出现。
为了以有用的形式访问这些数据,我们将把它作为dataframe加载。您可以将数据框视为可以通过编程控制的电子表格(数据的行和列)。
在python中,处理dataframe的标准库是pandas。让我们使用pandas来加载数据。
In [1]:
import pandas as pd
import os
df = pd.read_csv('/home/kesci/input/xps7589/golder_macy_prefix.txt',delimiter='\t') /opt/conda/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype si return f(*args, **kwds)
/opt/conda/lib/python3.6/importlib/_bootstrap.py:219: RuntimeWarning: numpy.dtype si return f(*args, **kwds)
为了简化讨论,与其分别对待积极情绪和消极情绪,不如将它们汇总为“情绪比率”
In [5]:
df['ratio'] = df['pa'] / (df['pa'] + df['na'] + 1e-10)
In [6]:
print(df.head(3))
hour pa na uid ratio
0 144 0.083333 0.023810 1 0.777778
1 23 0.090278 0.027778 1 0.764706
2 127 0.200000 0.000000 1 1.000000
成功!新字段出现在dataframe中。
绘制数据
我们要检验以下假设:
人们周末更快乐
人们在深夜不太高兴
作为第一步,让我们绘制数据。为此,我们将使用matplotlib和seaborn库。
In [7]:
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
首先,让我们在小时和情绪比率之间做一个散点图。
In [8]:
plt.scatter(df['hour'],df['ratio'])
plt.xlabel('hour')
plt.ylabel('sentiment ratio');
基本没啥用!
seaborn是一个用于从dataframes绘制的库。我们试着用这个来代替。
In [9]:
sns.lineplot(x='hour',y='ratio',data=df);
效果更好了!seaborn的lineplot显示了一周中每小时的平均情绪。默认情况下,误差条是单个标准偏差。
可视化呈现的测试表明这些数据存在某种结构。让我们试着梳理出一天中的小时和一周中的天的可视化效果。我们将通过向dataframe添加其他字段来完成此操作。
In [10]:
df['time_of_day'] = df['hour'] % 24
df['day_of_week'] = (df['hour']/24).apply(lambda x : int(x))
In [11]:
sns.lineplot(x='time_of_day',y='ratio',data=df);
这似乎很好地支持了“人们在深夜不太快乐”的假设:从凌晨1点到5点的情绪比率远低于一天中的其他时间点。让我们再看看一周中的情绪比率分布~
In [12]:
sns.lineplot(x='day_of_week',y='ratio',data=df);
hours_weekday = np.random.randint(0,24,weekday_N)
hours_weekend = np.random.randint(6,24,weekend_N)
最后,让我们生成一周中(the day of the week)的情绪比例分布。
In [19]:
days_weekday = np.random.randint(0,5,weekday_N)
days_weekend = np.random.randint(5,7,weekday_N)
现在,让我们把这些都打包成一个新的dataframe。然后将其可视化呈现出来。
In [20]:
df_sim = pd.DataFrame({'time_of_day':np.hstack([hours_weekday,hours_weekend]), 'day_of_week':np.hstack([days_weekday,days_weekend]), 'ratio':np.hstack([weekday_ratios,weekend_ratios])}) sns.lineplot(x='time_of_day',y='ratio',data=df_sim);
早上情绪更消极!然而,如果我们按一周中的每一天(by day-of-the-week)进行细分,该效果就会消失。
In [21]:
# 添加一列,指示星期几是否为工作日/节假日
df_sim['weekday'] = df_sim['day_of_week'].apply(lambda x : x < 5)