博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[机器学习笔记] 用Python分析 TED演讲数据(更新中)
阅读量:4041 次
发布时间:2019-05-24

本文共 4790 字,大约阅读时间需要 15 分钟。

用Python分析 TED演讲数据

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

该数据集包含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 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/

你可能感兴趣的文章
tcpdump 抓包工具使用
查看>>
Linux下用文件IO的方式操作GPIO(/sys/class/gpio)
查看>>
用户态使用gpio监听中断
查看>>
以太网MAC帧结构与数据填充
查看>>
u-boot中添加命令
查看>>
分享两个免费在线shell
查看>>
在DNS服务器上查询域名的地址
查看>>
太阳系演化时序表
查看>>
我们可曾这么认真过?
查看>>
彻底搞懂HTTP协议
查看>>
见识一下cookie
查看>>
关于XSS(跨站脚本攻击)和CSRF(跨站请求伪造)
查看>>
如何防止跨站点脚本攻击
查看>>
黑客是怎样入侵你的网站的
查看>>
人类的祖先为什么会走出非洲
查看>>
电子书收藏
查看>>
网站地址中的www有还是没有
查看>>
RFC文档(中文翻译版本)
查看>>
邮件是怎么发送和接收的(STMP和POP3/IMAP协议)
查看>>
渗透的艺术
查看>>