本文共 4790 字,大约阅读时间需要 15 分钟。
首先准备TED演讲数据集,TED演讲数据集和信息可以从下面的资源获得:
该数据集包含2个文件:
1)文件ted_main.csv包含17个字段,2550行,每一行代表的是一个TED演讲,具体信息如下:
序号 | 字段名 | 数据类型 | 字段描述 |
---|---|---|---|
1 | name | Integer | 演讲的正式名称(主要发言人+标题 |
2 | title | String | 演讲的标题 |
3 | description | Integer | 演讲内容 |
4 | main_speaker | String | 主要发言人 |
5 | speaker_occupation | Integer | 主要发言人的职业 |
6 | num_speaker | Integer | 发言人数量 |
7 | duration | String | 演讲时长,以秒为单位 |
8 | event | String | 演讲所在的TED / TEDx活动 |
9 | film_date | Integer | 演讲拍摄时间 (Unix timestamp) |
10 | published_date | Integer | 演讲发布时间 (Unix timestamp) |
11 | comments | String | 评论数量 |
12 | tags | String | String |
13 | languages | String | 收听演讲时可选择的语言数量 |
14 | ratings | String | 一个列表,里面包含许多字典,每个字典是不同的演讲评级(如鼓舞人心,引人入胜,令人惊讶等) |
15 | related_talks | String | 一个列表,里面包含许多字典,每个字典是下一个值得观看的演讲推荐 |
16 | url | String | 演讲的URL链接 |
17 | views | Integer | 观看数量 |
(2)文件transcripts.csv包含2个字段,2467行,每一行代表的是一个TED演讲,具体信息如下:
序号 | 字段名 | 数据类型 | 字段描述 |
---|---|---|---|
1 | url | String | 演讲的URL链接 |
2 | transcript | String | 演讲的官方英文字幕 |
探索方向(持续更新)
可以从以下几个方面来探索TED演讲数据集:
结构分析
价值分析
群体行为分析
在Jupyter Notebook中,首先加载数据:
%matplotlib inlineimport pandas as pdimport numpy as npfrom scipy import statsimport matplotlib.pyplot as pltimport seaborn as sns #matplotlib的默认作图风格就会被覆盖成seaborn的格式import jsonfrom pandas.io.json import json_normalize
#加载数据集df = pd.read_csv("C:\\Machine-Learning-with-Python-master\\data\\ted_main.csv")#查看数据集行列数print("该数据集共有 {} 行 {} 列".format(ted.shape[0],ted.shape[1]))
该数据集共包含 2550行,17列的数据。
接下来处理一下数据列的日期格式
import datetimedf['film_date'] = df['film_date'].apply(lambda x: datetime.datetime.fromtimestamp( int(x)).strftime('%d-%m-%Y'))df['published_date'] = df['published_date'].apply(lambda x: datetime.datetime.fromtimestamp( int(x)).strftime('%d-%m-%Y'))
df.head()
接下来根据观看数量排序,提出前15行数据
#根据views量排序前15行数据pop_talks = df[['title','main_speaker','views','film_date']].sort_values('views',ascending=False)[:15]pop_talks
浏览量最多的演讲:Do schools kill creativity? 浏览次数:47227110
Do schools kill creativity? | Ken Robinson | 47227110 | 25-02-2006 |
#切分main_speaker的前三个字母,新增一列abbr数据pop_talks["abbr"] = pop_talks['main_speaker'].apply(lambda x: x[:3])pop_talks.head()
sns.set_style("whitegrid")plt.figure(figsize=(10,6))sns.barplot(x='abbr',y='views',data=pop_talks)
sns.distplot(df['views'])
sns.distplot(df[df['views'] < 0.4e7]['views'])
sns.distplot(df[(df['views'] > 0.5e4)&(df['views'] < 0.4e7)]['views']) #多条件布尔索引
df['views'].describe()
TED Talks的views平均数为160万。中位数是112万。这表明TED Talks的普及程度非常高。我们也注意到大部分Talks的views不到400万。我们将在后面的章节中将这个框图作为框图的切点。
sns.distplot(df['comments'])
sns.distplot(df[df['comments'] < 500]['comments'])
sns.jointplot(x='views', y='comments', data=df)
df['comments'].describe()
平均每次Talks都有191.5条评论。假设评论是建设性的批评,我们可以得出结论,TED社区高度参与讨论循环谈判。与评论相关的标准偏差很大。事实上,它甚至比意味着这些措施可能对异常值敏感的意思更大。我们将绘制这个图来检查分布的性质。谈话的最小评论数是2,最大数是6404.该范围是6402 ..尽管如此,最少的数字可能是最近发表的谈话的结果。
df[['views', 'comments']].corr() #相关系数函数
如散点图和相关矩阵所示,相关系数略大于0.5。这表明两个数量之间的中等到强相关性。如上所述,这个结果是相当期待的。现在让我们来检查一下有史以来最受关注的10个会谈的观点和评论数量。
df[['title', 'main_speaker','views', 'comments']].sort_values('comments', ascending=False).head(10)
df['dis_quo'] = df['comments']/df['views'] #新增一列‘dis_quo’
#评论数/点击量之比 前10行df[['title', 'main_speaker','views', 'comments', 'dis_quo', 'film_date']].sort_values('dis_quo', ascending=False).head(10)
month_order = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']day_order = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']df['month'] = df['film_date'].apply(lambda x: month_order[int(x.split('-')[1]) - 1])df['month'].head()month_df = pd.DataFrame(df['month'].value_counts()).reset_index()month_df.columns = ['month', 'talks']sns.barplot(x='month',y='talks',data=month_df,order=month_order)
二月显然是最受欢迎的会议,而八月和一月是最不受欢迎的。二月份的人气很大程度上是由于二月份举行的官方会议。
#使用datetime的strtime方法获取一个日期是周几def getday(x): day, month, year = (int(i) for i in x.split('-')) answer = datetime.date(year, month, day).strftime("%A") return answer[:3]#使用datetime的weekday方法获取一个日期是一周里的第几天,用这个当索引在day_order里取相应的value值def getday2(x): day, month, year = (int(i) for i in x.split('-')) answer = datetime.date(year, month, day).weekday() return day_order[answer]
df['day'] = df['film_date'].apply(getday) #新增一列day列day_df = pd.DataFrame(df['day'].value_counts()).reset_index()day_df.columns = ['day', 'talks']sns.barplot(x='day', y='talks', data=day_df, order=day_order)
从上图中可以看出,Wed 和 Thu 是最受欢迎的日子,而星期天 Sun 最少。看来周中参与的人多,周末都需要休息。
df['year'] = df['film_date'].apply(lambda x: x.split('-')[2])year_df = pd.DataFrame(df['year'].value_counts().reset_index())year_df.columns = ['year', 'talks']plt.figure(figsize=(18,5))sns.pointplot(x='year', y='talks', data=year_df)
参考博文:
转载地址:http://tpvdi.baihongyu.com/