分析推特上狗狗的評分
項目簡介
推特用戶 @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:數據分析 |