[ネット分析]ハリウッド俳優のネットを知る


ネットワーク分析はビッグデータ分析の基本テクニックの一つであり、ネットワークに接続することでデータ間の関係を確定し、データ中心のデータを見つける.最も基本的な状況では、人々の間のネットワークを分析できますが、語、Webサイト、または国/地域の関係を表示するには、これらの分析を使用します.
そんな中、今日はimdb映画関連のデータを通じて、同じ作品に出演する俳優たちのネットワークを構築し、彼らのつながりがあるかどうか、誰が最も人気のある人なのかを見てみましょう.

1.パッケージのインストール


まず、必要なパッケージをインストールします.基本パッケージが1つあると仮定し、新しく使用したパッケージを2つインストールします.Networkxはネットワーク分析パッケージであり、pyvisは動的可視化パッケージである.
! pip install networkx
! pip install pyvis

2.データの準備


2.1. データのダウンロード


imdbはデータセットを提供しています.圧縮ファイルをダウンロードできます.解凍するとtsvファイルがあります.imdb(https://www.imdb.com/interfaces/)の説明を表示し、必要なデータをダウンロードできます.今回の分析では、「title.akas.tsv.gz」以外のすべてのコンテンツがダウンロードされます.
ダウンロードが完了したら、データフレームにロードします.
import pandas as pd

# 인물정보

name_info = pd.read_csv('/Users/ihaewon/Downloads/name.basics.tsv', sep='\t')
name_info.head()
# 작품 별 제작진/출연진
# 출연진은 상위 10명까지만 나옴

principal = pd.read_csv('/Users/ihaewon/Downloads/title.principals.tsv', sep='\t')
principal.head()
# 작품 기본 정보

title_info  = pd.read_csv('/Users/ihaewon/Downloads/title.basics.tsv', sep='\t')
title_info.head()
# 별점

rating  = pd.read_csv('/Users/ihaewon/Downloads/title.ratings.tsv', sep='\t')
rating.head()

2.2. データのマージ


データがロードされている場合は、データを統合して必要なデータセットを構成します.タイトルに関する情報とスコア、およびタイトルの主演と主演に関する情報が必要です.そのため、4つのデータセットで統一されたデータセットを作成します.
title_crew = principal.merge(name_info, how='inner', on='nconst')
actors = title_crew.loc[(title_crew['category'] == 'actor') | (title_crew['category'] == 'actress')]
actors = actors.merge(title_info, how='inner', on='tconst')
actors = actors.merge(rating, how='inner', on='tconst')
actors.head()

2.3. データ検証


データをcsvファイルとして保存し、後で再起動するときに上記の手順をスキップするためにcsvファイルに再ロードします.データが大きすぎて、ストレージとロードに時間がかかります.
actors.to_csv('actors.csv')
actors = pd.read_csv('actors.csv')
actors.info()
データ情報からいくつかの変換が表示されます.不要なコラムを削除し、データ型を変換します.
import numpy as np

actors = actors.drop(columns='Unnamed: 0')
actors['startYear_y'] = actors['startYear_y'].replace('\\N', np.nan)
actors['startYear_y'] = actors['startYear_y'].astype(float)
actors.info()

2.4. データプリプロセッシング


ネットワーク分析のデータを選択する必要があります.まず現在のデータが大きすぎるので2021年のデータしか使用していません.内容の形式は映画やテレビシリーズに限られ、2000を超える内容しか見られない.

actors_2021 = actors.loc[(actors['startYear_y'] == 2021) 
                         & ((actors['titleType_y'] == 'movie') 
                         | (actors['titleType_y'] == 'tvSeries'))
                         & (actors['numVotes'] > 2000)].dropna()
このレッスンが終了したら、俳優名(tconst)と俳優名(primaryName)のみを含むデータフレームを使用します(俳優名を除く).でもデータが多すぎて2021年に1本しか出演していない俳優は削除しましょう
actors_2021 = actors_2021.loc[:, actors_2021.columns.intersection(['tconst','primaryName'])]
actors_2021['primaryName'] = actors_2021['primaryName'].str.replace(',', '')
actors_2021['counts'] = actors_2021.groupby(['primaryName']).transform('count')

3.ネットワーク分析


3.1. ネットワーク分析データセット


次に、ネットワーク分析のためにデータのフォーマットを変更する必要があります.1つのタイトルに複数の参加者がいる場合、複数のレコードが作成されます.これをグループbyとしてタイトルごとに出演者のリストが作られますでは、重複したタイトルはないでしょう.
actors_2021_join = actors_2021.groupby(['tconst'])['primaryName'].apply(list).reset_index()
actors_2021_join

次に、ネットワーク分析のために変換する必要があります.ネットワーク解析に使用するデータフレームには、「source」、「target」、および「weight」が必要です.「source」の俳優、「target」の俳優、そしてどれだけのグループが発生したかによる「weight」で構成されています.元の「source」と「target」には方向性の意味がありますが、この解析では方向性は必要ありません.「ソース」と「ターゲット」は1つしか指定できないので、同じ作品に出演する俳優の中から2人で構成されたすべてのグループを見つける必要があります.
from itertools import combinations

actors_2021_join['primaryName'] = actors_2021_join['primaryName'].apply(lambda l: list(combinations(l, 2)))
actors_2021_join = actors_2021_join.explode('primaryName').dropna()
actors_2021_join.head()
nt = pd.DataFrame(actors_2021_join['primaryName'].to_list(), columns=['source','target'])
nt

3.2. ネットワーク分析の実行


データの準備が完了したら、ネットワーク分析を実行します.上に作成したデータセットをnetworkxからグラフィックに変換します.
import networkx as nx

nt['weight'] = nt.groupby(['source', 'target'])['source'].transform('size')
nt = nt.dropna()

G = nx.from_pandas_edgelist(nt, 'source', 'target',
                            create_using=nx.DiGraph(), edge_attr='weight')

nt

今が最终!ネットワークの可視化を行い、ファイルとして保存します.ビジュアル化の結果は、メインピーターのノートパソコンに表示され、ファイルにも格納されます.
from pyvis.network import Network

net = Network(notebook=True)
net.from_nx(G)
net.show_buttons(filter_=['nodes'])
net.show('example3.html')

4.解釈結果


夜空のように美しい姿が現れた.🤣

もう少し詳しく見ると、星のように浮かんでいる様子は主に同じドラマに出演している俳優さんたちです.

また、各国のネットワークも表示されます.次は韓国の俳優たちのネットです韓国の俳優は2021年に韓国作品を制作したが、海外の俳優のような作品はないことが分かった.

最も中央の角度から見ると、ハリウッドの巨大なネットワークを見ることができます.ハリウッドの俳優たちは、他の映画俳優たちと活発につながっており、いくつかの人物を中心にテレビ俳優たちとつながっているのも見られる.

関係ネットワークの中心になる影響力のある人物を調べてみましょう多作に出演する脇役たちの活躍が目立つ


主演俳優の中では、『ゞ』、『アダム・スペリー』などに出演したオスカーのアイザック、『ターミネーター』、『殺し屋のボディーガード』に出演したシャルマッハヨ、『フリーゲイ』、『殺し屋のボディーガード』、『レッドノティス』のライアン・レノスがネット形成において重要な役割を果たしている.



今日の分析はここまでです.特定のノードに異なる色を指定できれば、より分かりやすい可視化になるはずなので、方法がわかればいいのですが.😅 参考として以下の可視化はほとんどデータをフィルタリングしていないデータが大きいほど、わかりやすくなります.