IMDB电影数据分析实践
IMDB電影數(shù)據(jù)分析實(shí)踐
根據(jù)IMDB5000部電影數(shù)據(jù)集進(jìn)行下列數(shù)據(jù)分析:
- 數(shù)據(jù)準(zhǔn)備:讀取數(shù)據(jù)并查看數(shù)據(jù)的基本信息
- 數(shù)據(jù)清洗:缺失值處理,重復(fù)值處理,處理后“干凈”數(shù)據(jù)的基本信息。
- 數(shù)據(jù)分析及可視化展示:
電影出品國及地區(qū)和演員票房的情況分析:
繪制電影出品數(shù)量排名前10位的國家及地區(qū)的條形圖;繪制票房前十的電影中喜愛男 1 號,男 2 號,男 3 號的人數(shù)的分組條形圖。
電影數(shù)量的分析:
按年份統(tǒng)計(jì)每年電影總數(shù)量、彩色影片數(shù)量和黑白影片數(shù)量并繪制折線圖(在同一個(gè)坐標(biāo)系中繪制)。
電影類型的分析:
繪制不同類型的電影數(shù)量條形圖和餅圖。
電影評分統(tǒng)計(jì)及電影評分相關(guān)因素分析:
找出評分排名前 20 位電影的片名和評分;繪制所有影片評分與受歡迎程度的關(guān)系散點(diǎn)圖。
文章目錄
- 一、數(shù)據(jù)準(zhǔn)備:
- 1. 導(dǎo)入numpy 包和 pandas 包,使用 read_csv 方法讀取本地 csv 數(shù)據(jù);
- 2. 查看數(shù)據(jù)的基本內(nèi)容、結(jié)構(gòu)
- 二、數(shù)據(jù)清洗
- 1. 缺失數(shù)據(jù)處理
- 2. 重復(fù)值處理
- 3. 處理后的數(shù)據(jù)
- 三、數(shù)據(jù)分析及可視化展示
- 1. 電影出品國及地區(qū)和演員票房的情況分析:
- 1.1 繪制電影出品數(shù)量排名前10位的國家及地區(qū)的條形圖;
- 1.2 繪制票房前十的電影中喜愛男1號,男2號,男3號的人數(shù)的分組條形圖。
- 2. 電影數(shù)量的分析:
- 3. 電影類型的分析:
- 4. 電影評分統(tǒng)計(jì)及電影評分相關(guān)因素分析:
- 4.1 找出評分排名前20位電影的片名和評分;
- 4.2 繪制所有影片評分與受歡迎程度的關(guān)系散點(diǎn)圖。
一、數(shù)據(jù)準(zhǔn)備:
讀取數(shù)據(jù)并查看數(shù)據(jù)的基本信息
1. 導(dǎo)入numpy 包和 pandas 包,使用 read_csv 方法讀取本地 csv 數(shù)據(jù);
import pandas as pd import numpy as np movies = pd.read_csv('D:\\gaojie\\movie_metadata.csv',encoding='utf—8')2. 查看數(shù)據(jù)的基本內(nèi)容、結(jié)構(gòu)
打印前五行觀察
movies.head (5)通過前五行,可以看出數(shù)據(jù)集有28列,以及具體的列名。同時(shí)也可以發(fā)現(xiàn),前五行里就有空值較多的行,說明我們需要對數(shù)據(jù)作處理。
輸入 .shape 看看有多少行多少列
movies.shape可以看到,數(shù)據(jù)集的維度是5043行,28列。
查看列的數(shù)據(jù)類型
movies.dtypes可以看出,數(shù)據(jù)集中涉及數(shù)據(jù)的列默認(rèn)為 float64 和 int64,無需對數(shù)據(jù)做類型轉(zhuǎn)換。而其他列均為 object 類型,后面需要考慮是否做類型轉(zhuǎn)換。
二、數(shù)據(jù)清洗
數(shù)據(jù)清洗也叫數(shù)據(jù)預(yù)處理,因?yàn)榇蠖鄷r(shí)候獲取的數(shù)據(jù)并不符合我們的數(shù)據(jù)分析的標(biāo)準(zhǔn)這時(shí)候我們就需要對數(shù)據(jù)進(jìn)行預(yù)處理,使之?dāng)?shù)據(jù)更加規(guī)整有序方便我們下一步的分析。數(shù)據(jù)清洗通常需要數(shù)據(jù)分析大部分時(shí)間,但是我覺得也是有一定的步驟的,我將它大致分為六部曲: 選擇子集→列名重命名→缺失數(shù)據(jù)處理→數(shù)據(jù)類型轉(zhuǎn)換→數(shù)據(jù)排序→異常值處理
1. 缺失數(shù)據(jù)處理
先通過isnull函數(shù)看一下是否有空值,結(jié)果是有空值的地方顯示為True,沒有的顯示為False
print(movies.isnull())可以看到有空值的行非常之多,在分析之前我們需要處理對行進(jìn)行取舍。
再通 過 isnull().sum() 直接看每一列有多少空值
print(movies.isnull().sum())可以看到,只有極少列沒有空值,有的列空值異常之多。因此我們處理的時(shí)候只能選擇讓重點(diǎn)的列沒有空值,刪除行而不要?jiǎng)h除列。
為了方便我們這里選擇直接刪除有缺失值的行
print ('刪除缺失值前數(shù)據(jù)集大小 ',movies.shape )# how=‘a(chǎn)ny’ 在給定的任何一列中有缺失值就刪除 movies = movies.dropna(how ='any' ) print ('刪除缺失值后大小 ',movies.shape )可以看到一千多行有缺失值的數(shù)據(jù)被刪除掉了,對數(shù)據(jù)的損耗還是非常大的。最好是只刪除重要列有缺失值的行,或者按缺失值的比例刪除。規(guī)定n行有多少個(gè)缺失值時(shí)再刪除。
這里我們選擇刪除電影名重復(fù)的行:
movies.drop_duplicates(subset=["movie_title"],keep='first',inplace=True) print(movies.duplicated().value_counts())2. 重復(fù)值處理
先用 duplicated() 方法進(jìn)行邏輯判斷,確定是否有重復(fù)值,統(tǒng)計(jì)重復(fù)值的數(shù)量
print(movies.duplicated().value_counts())可以看到,雖然有眾多重復(fù)值,但我們應(yīng)該考慮哪些列的重復(fù)值是不允許出現(xiàn)應(yīng)該刪除的。因?yàn)楹芏嘀貜?fù)值可能只是數(shù)據(jù)相同,或者演員、國家這樣的重復(fù)值是允許出現(xiàn)的。
再用 duplicates(subset,keep,inplace) 方法對某幾列下面的重復(fù)行刪除
- subset: 以哪幾列作為基準(zhǔn)列,判斷是否重復(fù),如果不寫則默認(rèn)所有列都要重復(fù)才算
- keep: 保留哪一個(gè),fist-保留首次出現(xiàn)的,last-保留最后出現(xiàn)的,False-重復(fù)的一個(gè)都不保留,默認(rèn)為first
- inplace: 是否進(jìn)行替換,最好選擇 False,保留原始數(shù)據(jù),默認(rèn)也是 False
這里我們選擇刪除所有電影名重復(fù)的行
movies.drop_duplicates(subset=[‘director_name’],keep='first',inplace=True) print(movies.duplicated().value_counts())可以看到重復(fù)值并沒有變化,因?yàn)橹貜?fù)值均為 int64 類型,也就是說沒有電影名重復(fù)的行。因此沒有數(shù)據(jù)被刪除掉 。
3. 處理后的數(shù)據(jù)
使用 info 查看處理后“干凈”數(shù)據(jù)的基本信息:
movies.info可以看到,處理后數(shù)據(jù)為3655行,保留了所有的列。我們將在此數(shù)據(jù)集上做數(shù)據(jù)分析及可視化展示。
三、數(shù)據(jù)分析及可視化展示
1. 電影出品國及地區(qū)和演員票房的情況分析:
1.1 繪制電影出品數(shù)量排名前10位的國家及地區(qū)的條形圖;
按country分組,統(tǒng)計(jì)所有國家的電影數(shù)量
country_group = movies.groupby('country').size() country_group電影出品數(shù)量排名前10位的國家
group_head_10=country_group.sort_values(ascending=False).head(10) group_head_10得到了電影數(shù)量前十的國家及對應(yīng)的電影數(shù)量,因?yàn)殡娪皵?shù)量為 int64,因此可以直接作為縱軸數(shù)值繪圖。
繪制電影出品數(shù)量排名前 10 位的柱形圖的國家及地區(qū)的條形圖
import pandas as pd import matplotlib.pyplot as plt import matplotlib matplotlib.rcParams['font.family']='SimHei' plt.ylabel('電影數(shù)量') plt.title('電影出品數(shù)量排名前10位的國家及地區(qū)的條形圖') group_head_10.plot(kind = 'bar')1.2 繪制票房前十的電影中喜愛男1號,男2號,男3號的人數(shù)的分組條形圖。
將電影按票房數(shù)降序排序,切取前10的電影信息
movies_max=movies.sort_values(['gross'],ascending=False).head(10) movies_max1=movies_max[['actor_1_facebook_likes','actor_2_facebook_likes','actor_3_facebook_likes']] movies_max1創(chuàng)建 DataFrame,作為分組條形圖的數(shù)據(jù)集
df = pd.DataFrame({'喜愛男1號':movies_max1['actor_1_facebook_likes'].values,'喜愛男2號':movies_max1['actor_2_facebook_likes'].values,'喜愛男3號':movies_max1['actor_3_facebook_likes'].values},index=movies_max['movie_title'].str.strip()) df這里我們對電影標(biāo)題做了一個(gè)字符串去空格操作,是因?yàn)槲覀儼l(fā)現(xiàn)在創(chuàng)建分組條形圖時(shí)橫坐標(biāo)總有異常方塊,最后發(fā)現(xiàn)是因?yàn)?csv 中的原始數(shù)據(jù)電影標(biāo)題前面有空格導(dǎo)致的。
繪制分組條形圖
plt.figure() df.plot.bar() plt.title("票房前十電影喜愛男1號,男2號,男3號的人數(shù)的分組條形圖") plt.legend(ncol=3,loc=(0,1.1)) plt.xlabel('電影標(biāo)題') plt.ylabel('喜歡人數(shù)') plt.show()2. 電影數(shù)量的分析:
按年份統(tǒng)計(jì)每年電影總數(shù)量、彩色影片數(shù)量和黑白影片數(shù)量并繪制折線圖(在同一個(gè)坐標(biāo)系中繪制)。
# 每年電影總數(shù)量折線圖 movies['title_year'].value_counts().sort_index().plot(kind='line',label='total number')# 彩色影片數(shù)量折線圖 movies[movies['color']=='Color']['title_year'].value_counts().sort_index().plot(kind='line',c='red',label='color number')# 黑白影片數(shù)量折線圖 movies[movies['color']!='Color']['title_year'].value_counts().sort_index().plot(kind='line',c='black',label='Black White number')plt.legend(loc='upper left') plt.xlabel('電影色彩') plt.ylabel('電影數(shù)量') plt.title('不同色彩電影數(shù)量折線圖') plt.legend(loc='upper left')3. 電影類型的分析:
繪制不同類型的電影數(shù)量條形圖和餅圖。
提取 genres 列所有的電影類型,放入一個(gè)數(shù)組中;
# 創(chuàng)建字典用于存儲電影類型 types = [] for tp in movies['genres']:sp = tp.split('|')for x in sp:types.append(x)# 格式化 types_df = pd.DataFrame({'genres':types})可以看到,字典中共有14504個(gè)電影類型(包含重復(fù)值)。
統(tǒng)計(jì)字典中各種類型的數(shù)量
types_df_counts = types_df['genres'].value_counts() types_df_counts繪制不同類型的電影數(shù)量條形圖
types_df_counts.plot(kind='bar') plt.xlabel('電影類型') plt.ylabel('電影數(shù)量') plt.title('不同類型的電影數(shù)量條形圖')繪制不同類型的電影數(shù)量餅圖
b1 = types_df_counts/types_df_counts.sum() explode = (b1>=0.06)/20+0.02 types_df_counts.plot.pie(autopct='%1.1f%%',figsize=(8,8),\label='',explode=explode) plt.title('不同類型的電影數(shù)量餅圖')4. 電影評分統(tǒng)計(jì)及電影評分相關(guān)因素分析:
4.1 找出評分排名前20位電影的片名和評分;
movie_score_20 = movies.sort_values(['imdb_score'],ascending=False).head(20) movie_score_20[['movie_title','imdb_score']]4.2 繪制所有影片評分與受歡迎程度的關(guān)系散點(diǎn)圖。
plt.scatter(x= movies.imdb_score,y=movies.movie_facebook_likes) plt.xlabel('電影評分') plt.ylabel('臉書喜歡人數(shù)') plt.title('影片評分與受歡迎程度的關(guān)系散點(diǎn)圖')Over
😃分享不易,點(diǎn)贊關(guān)注不迷路!
總結(jié)
以上是生活随笔為你收集整理的IMDB电影数据分析实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【时间序列分析】16.平稳序列的决定性
- 下一篇: 速达软件启示录——记中国一代ERP性价比