標籤:

分析推特上狗狗的評分

項目簡介

推特用戶 @dog_rates 的檔案也叫做 WeRateDogs。以詼諧幽默的方式對人們的寵物狗評級。這些評級通常以 10 作為分母。但是分子呢?分子一般大於 10。如11/10、12/10、13/10 等,WeRateDogs 擁有四百多萬關注者,曾受到國際媒體的報道。WeRateDogs 推特檔案包括基本的推特信息,如 5000 多條推特,但並不包括所有數據,轉發用戶和喜愛用戶是兩個遺漏的列。不過檔案中有一列包括每個推特文本,可以用來提取評級、狗的名字和 "地位" (即 doggo、floofer、pupper 和 puppo)。tweet_json文件為 txt 格式,每一行為一條獨立的 twitter 信息,格式為 JSON ,其中有轉發和喜歡。

通過一個 神經網路 運行 WeRateDogs 推特檔案中的所有圖片,這個神經網路可以對狗的品種分類。結果:對圖片預測 (只含前三名) 的文件包括每個推特 ID、圖片 URL 和最自信預測對應的圖片編號 (由於推特最多包含 4 個圖片,所以編號為 1 到 4)。

  • p1 是對推特中圖片演算法 #1 的預測 → 金毛犬
  • p1_conf 是 #1 預測中演算法的可信度 → 95%
  • p1_dog 是 #1 預測是否是狗的品種 →
  • p2 是演算法的第二個最有可能的預測 → 拉布拉多犬
  • p2_conf 是 #2 預測中演算法的可信度 → 1%
  • p2_dog 是 #2 預測是否是狗的品種 →
  • 等等

數據集

twitter-archive-enhanced.csv,推特檔案

tweet_json.txt,含轉發和喜歡

image-predictions.tsv,根據推特檔案里的圖片預測的狗

目的

收集包含圖片但不包含轉發內容的原始評級,另外,每條推特的數據,至少要包含轉發數(retweet_count)和喜歡數。最終對收集的數據進行評估清洗,並對清洗過的數據進行儲存、分析和可視化。

數據整理

收集

import pandas as pd# 將原始文件讀取為數據框df_archive = pd.read_csv(twitter-archive-enhanced.csv)df_image = pd.read_csv(image-predictions.tsv, sep= )import jsonwith open(tweet_json.txt) as f: tweet = [] for line in f: tweet.append(json.loads(line))df_tweet = pd.DataFrame(tweet, columns=[id, retweet_count, favorite_count])

視覺評估

分子評分含大量低於10分的,這部分需捨棄,狗名有大量錯誤,狗的地位沒提取出來。

編程評估

可以看到有大量空值,另外原來從推特文本中提取的狗名和評分等存在大量問題,需要重新提取。

含轉發和喜歡數的json文件及圖片信息比較清潔。

推特檔案中有17個變數,2356個觀測值,其中181個含轉發信息的需去除,只留下原始評級。

狗名有大量空值和冠詞這種無意義的。需要重新提取,當然原推文中得含有狗名。

可見狗名為None的原推文中部分含有狗名。

同上,原檔案中提取錯誤,需重新提取。

分子評分有大量異常值,需在提取時注意剔除。

質量問題

df_archive 表格

  • 含有轉發的數據
  • twitter id應為字元串
  • 分子評分有低於10分的
  • 分子分母有不合規的評分,如1776的分子評分,及420/10,165/150,143/130等
  • 狗名有a,an,the等明顯錯誤,還有大量「None」值
  • 狗的地位有空值

df_tweet 表格

  • id 應為字元串類型

df_image 表格

  • id應為字元串

清潔度問題

  • df_archive 表格中的狗地位應為一列
  • 數據分布在三個表中

清理

archive_clean = df_archive.copy()tweet_clean = df_tweet.copy()image_clean = df_image.copy()

清潔度問題

狗地位不在一列

方案

狗地位應置於一列,為避免原數據可能的錯誤,故在質量方案中重新提取

質量問題

1)含有轉發數據

方案

清理轉發數據,並刪除數據缺失嚴重的列及無用列

代碼

archive_clean = archive_clean[archive_clean.retweeted_status_id.isnull()]archive_clean = archive_clean[[tweet_id, text, rating_numerator, rating_denominator, name]]

測試

2)分子評分有低於10分的,分子分母有不合規的評分,如1776的分子評分及420/10,165/150,143/130;狗名有a,an,the等明顯錯誤,還有大量空值

方案

重新從文本中提取狗名,評分,且只提取分母為10,分子大於分母又沒有大太多的評分

代碼

# 添加新列:狗地位archive_clean[status] = None# 從text里提取狗名archive_clean.name = archive_clean.text.str.extract((?:This is|Meet|name is|Say hello to|named) ([A-Z][a-z]{2,12}), expand=False).values# 提取地位import refor i in archive_clean.index: status_set = set(re.findall((doggo|floofer|pupper|puppo), archive_clean.loc[i,text])) if len(status_set) > 0: status_value = , .join(status_set) archive_clean.loc[i, status] = status_value# 提取評分,之所以rating_numerator的範圍限定為11~16,是因為視覺評估時發現正常評分基本都在11~15之間,提取時就# 放棄420/10,165/150,143/130這種異常值archive_clean.rating_numerator = archive_clean.text.str.extract((1[1-6].?d*)/10, expand=False).valuesarchive_clean.rating_denominator = archive_clean.text.str.extract(1[1-6].?d*/(10), expand=False).values

測試

3)id應為str型

方案

合併數據框,將id統一改為str

代碼

df_clean_transit = pd.merge(archive_clean, image_clean, on=tweet_id)df_clean = pd.merge(tweet_clean, df_clean_transit, left_on=id, right_on=tweet_id)df_clean.drop(columns=id, inplace=True)

測試

可視化

import matplotlib.pyplot as plt% matplotlib inlinedf_clean[rating_numerator] = df_clean[rating_numerator].astype(float)df_clean[rating_denominator] = df_clean[rating_denominator].astype(float)df_clean.rating_numerator.hist();

結論一:分子評分數分布呈右偏分布,評分最常見的是12分,接著11分然後是13分,14分很少,15分罕見

df_clean.plot(x=retweet_count, y=favorite_count, kind=scatter);

結論二:轉發和喜歡數成正相關

結論三:被同時評為doggo, puppo的轉發量最高,均值達到了11432次,其次是floofer,最少的是pupper,只有2284次。

結論四:從圖片識別為狗的平均可信度是0.6144,識別不出的平均可信度是0.5356,可見兩者雖有差異,但差異不大。

# 保存清理後的數據df_clean.to_csv(twitter_archive_master.csv, index=False)

推薦閱讀:

【數讀】數字裝甲戰(1)
記錄我是如何轉型大數據分析(二)——iris
競品分析到底在分析什麼?
學習數據分析的意義和實踐計劃
一張象棋圖看懂鹿豹座平台的業務內容

TAG:數據分析 |