[機器學習筆記] 用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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章