1. 程式人生 > 其它 >觀影大資料分析(上)

觀影大資料分析(上)

題目

王S聰想要在海外開拓萬 D 電影的市場,這次他在考慮:怎麼拍商業電影才能賺錢?畢竟一些製作成本超過 1 億美元的大型電影也會失敗。這個問題對電影業來說比以往任何時候都更加重要。所以,他就請來了你(資料分析師)來幫他解決問題,給出一些建議,根據資料分析一下商業電影的成功是否存在統一公式?以幫助他更好地進行決策。
解決的終極問題是:電影票房的影響因素有哪些?
接下來我們就分不同的維度分析:
• 觀眾喜歡什麼電影型別?有什麼主題關鍵詞?
• 電影風格隨時間是如何變化的?
• 電影預算高低是否影響票房?
• 高票房或者高評分的導演有哪些?
• 電影的發行時間最好選在啥時候?
• 拍原創電影好還是改編電影好?
本次使用的資料來自於 Kaggle 平臺(TMDb 5000 Movie Database)。收錄了美國地區 1916-2017 年近 5000 部電影的資料,包含預算、導演、票房、電影評分等資訊。原始資料集包含 2 個檔案:
• tmdb_5000_movies:電影基本資訊,包含 20 個變數
• tmdb_5000_credits:演職員資訊,包含 4 個變數
請使用 Python 程式設計,完成下列問題:
(1)使用附件中的 tmdb_5000_movies.csv 和 tmdb_5000_credits.csv 資料集,進行資料清洗、資料探勘、資料分析和資料視覺化等,研究電影票房的影響因素有哪些?從不同的維度分析電影,討論並分析你的結果。
(2)附件 tmdb_1000_predict.csv 中包含 1000 部電影的基本資訊,請你選擇合適的指標,進行特徵提取,建立機器學習的預測模型,預測 1000 部電影的vote_average 和 vote_count,並儲存為 tmdb_1000_predicted.csv。

資料清洗

匯入資料

credits = pd.read_csv("tmdb_5000_credits.csv")
movies = pd.read_csv('tmdb_5000_movies.csv')


缺失值處理

通過觀察可以發現,兩個表中存在相同欄位。那我們將兩張表合併,並找出需要的欄位,刪去不需要的欄位。

# 刪除所有不必要的列
del credits['title']
del credits['movie_id']
del movies['homepage']
del movies['spoken_languages']
del movies['original_title']
del movies['overview']
del movies['tagline']
del movies['status']
# 合併兩張表
fullDf = pd.concat([movies, credits], axis=1)

檢視大表資訊

fullDf.info()

缺失記錄僅3條,採取網上搜索,補全資訊

補全release_data

# 找出release_data列缺失值
nanX2 = fullDf['release_date'].isnull()
fullDf.loc[nanX2, :]

fullDf.loc[4553, 'release_date'] = '2014/06/01'

缺失記錄的電影標題為《America Is Still the Place》,日期為2014/06/01。

補全runtime

nanX1 = fullDf['runtime'].isnull()
fullDf.loc[nanX1, :]

# 將查詢到的資訊填寫上去
fullDf.loc[2656, 'runtime'] = '98'
fullDf.loc[4140, 'runtime'] = '81'



缺失記錄的電影 runtime 分別為98min 和 81min。

重複值處理

sum(fullDf.duplicated())
# 處理重複值
fullDf.drop_duplicates(subset=['id'], keep='first')
fullDf.info()

執行結果:有4803個不重複的 id,可以認為沒有重複資料。

日期值處理

# 將release_date的資料型別改為日期型別
fullDf.loc[:, 'release_date'] = pd.to_datetime(fullDf.loc[:, 'release_date'], format='%Y-%m-%d', errors='coerce')
fullDf.info()

篩選資料

使用資料分析師最喜歡的一個語法:

df.describe()

票房、預算、受歡迎程度、評分為0的資料應該去除;
評分人數過低的電影,評分不具有統計意義,篩選評分人數大於50的資料。

df = df[(df.vote_count >= 50) &(df.budget * df.revenue * df.popularity * df.vote_average !=0)].reset_index(drop = 'True')

json資料轉換

json_cols = ['genres', 'keywords', 'production_companies', 'production_countries', 'cast', 'crew']
for i in json_cols:
    fullDf[i] = fullDf[i].apply(json.loads)


def get_names(x):
    return ",".join(i['name'] for i in x)

def get_director(x):
    for i in x:
        if i['job'] == 'Director':
            return i['name']

fullDf['genres'] = fullDf['genres'].apply(get_names)
fullDf['keywords'] = fullDf['keywords'].apply(get_names)
fullDf['production_companies'] = fullDf['production_companies'].apply(get_names)
fullDf['production_countries'] = fullDf['production_countries'].apply(get_names)
fullDf['cast'] = fullDf['cast'].apply(get_names)
fullDf['crew'] = fullDf['crew'].apply(get_director)

資料備份

# 資料備份
fullDf.to_csv("./fullDf.csv", encoding='utf-8', index=False)