[机器学习笔记] 用Python分析 TED演讲数据(更新中)

用Python分析 TED演讲数据

首先准备TED演讲数据集,TED演讲数据集和信息可以从下面的资源获得:

https://www.datafountain.cn/datasets/11

该数据集包含2个文件:

  • ted_main.csv
    包含演讲主要信息,包括演讲标题,发言人,演讲内容,观看次数,评论数量,演讲评分等。
  • transcripts.csv
    包含演讲链接和官方英文字幕。

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演讲数据集:

  • 什么类型的演讲讨论的热度最高?
  • 浏览数量高的演讲,在内容上有什么共性?
  • 在TED中最受欢迎的主题是什么?

结构分析

  • TED上每年新增的演讲数量?
  • 演讲类型的分布情况?
  • 演讲时长的分布情况?
  • 演讲者的职业分布?
  • 演讲浏览量的分布情况?
  • 演讲评论数的分布情况?

价值分析

  • 浏览量高的演讲所具有的特征?(主题,内容,时长)
  • 讨论度高的演讲所具有的特征?(讨论度=评论数/浏览量)

群体行为分析

  • 浏览量与讨论度的关系?
  • 浏览量与演讲时长的关系?
  • 不同类型演讲的理想传播时长?

数据分析过程

在Jupyter Notebook中,首先加载数据:

%matplotlib inline
import pandas as pd
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
import seaborn as sns #matplotlib的默认作图风格就会被覆盖成seaborn的格式
import json
from 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 datetime
df['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)

参考博文:https://www.jianshu.com/p/585019d60572

发布了646 篇原创文章 · 获赞 198 · 访问量 69万+

猜你喜欢

转载自blog.csdn.net/seagal890/article/details/105291769