用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