Membuat Database Film Indonesia Bag-2: Data Cleaning
Assalamualaikum warahmatullahi wabarakatuh
Semoga Allah Subhana Wata’ala senantiasa mencurah-curahkan RahmatNya kepada kita semua dan semoga sholawat serta salam senantiasa tercurahkan kepada Rosulullah Shalallahu Alaihi Wassalam
Ini merupakan artikel lanjutan dari bahasan Membuat Database Film Indonesia. Bagian satu dari series artikel ini bisa diakses di sini.
Struktur Tabel
Dari data film_indo_raw.xls akan kita bagi menjadi lima data yang pada bagian ke 3 akan kita inputkan ke table Postgre database. Kelima data tersebut adalah data genre, data pemeran, data perusahaan pembuat film, data negara rilis film, dan data film itu sendiri-sendiri. Masing-masing tabel akan dihubungkan dengan id untuk masing-masing table. Hal ini dilakukan agar data dapat digunakan untuk membuat materi pembelajaran SQL di konten From Basic to Epic PostgreSQL for Data Analyst di Youtube Channel Hobi Data
Data Genre
Kita akan menggunakan kolom genre_id_list dan genre_name_list untuk membuat data genre. Ingat, pada setiap film bisasanya dikategorikan ke lebih dari satu genre.
# Mengecek kolom genre_id_list
df_raw.genre_id_list
0 [28, 35, 80]
1 [28, 80, 53]
2 [18, 27, 9648]
3 [28, 53, 80]
4 [27, 18, 9648]
...
2333 []
2334 []
2335 []
2336 []
2337 [18, 10749]
Name: genre_id_list, Length: 2249, dtype: object
Oleh sebab itu isi pada setiap baru pada dua kolom ini barupa list. Kita akan membuka dan menggabungkan data dari masing-masing baris ke dalam sebuah list baru yaitu id_genre dan nama_genre.
# Membuat list kosong id_genre dan nama_genre
id_genre = []
nama_genre = []
# Melakukan looping untuk mengumpulkan semua id genre dalam satu list id_genre
for i in df_raw.genre_id_list:
id_genre = id_genre+i
# Melakukan looping untuk mengumpulkan semua nama genre dalam satu list nama_genre
for i in df_raw.genre_name_list:
nama_genre = nama_genre+i
# Melihat 10 data pertama id_genre
id_genre[:10]
[28, 35, 80, 28, 80, 53, 18, 27, 9648, 28]
# Melihat 10 data pertama nama_genre
nama_genre[:10]
['Aksi',
'Komedi',
'Kejahatan',
'Aksi',
'Kejahatan',
'Cerita Seru',
'Drama',
'Kengerian',
'Misteri',
'Aksi']
Kemudian kita akan membuat dataframe df_genre dan memastikan tidak ada duplikasi id dan nama genre serta mengurutkan data berdasarkan id.
# Membuat dataframe df_genre
df_genre = pd.DataFrame({'id':id_genre, 'nama':nama_genre})
# Drop data yang duplikasi
df_genre = df_genre.drop_duplicates()
# Mengurutkan data berdasarkan id
df_genre = df_genre.sort_values('id').reset_index(drop=True)
# Melihat data df_genre
print(df_genre)
id nama
0 12 Petualangan
1 14 Fantasi
2 16 Animasi
3 18 Drama
4 27 Kengerian
5 28 Aksi
6 35 Komedi
7 36 Sejarah
8 37 Barat
9 53 Cerita Seru
10 80 Kejahatan
11 99 Dokumenter
12 878 Cerita Fiksi
13 9648 Misteri
14 10402 Musik
15 10749 Percintaan
16 10751 Keluarga
17 10752 Kejahatan
18 10770 Film TV
dari hasil di atas diperoleh 18 data unik untuk genre film Indonesia. Kemudian kita simpan df_genre ke dalam file csv.
# Menyimpan df_genre dalam bentuk file csv tanpa menyimpan indeksnya
df_genre.to_csv('genre.csv', index=False)
Data Perusahaan
Kolom company_id_list, company_name_list dan company_original_country_list akan digunakan untuk membuat data perusahaan. Berdasarkan data yang kita peroleh ada film yang diproduksi oleh satu perusahaan, dua perusahaan atau datanya tidak tersedia di TMDB.
# Mengecek kolom genre_id_list
df_raw.company_id_list
0 [138594]
1 [58, 11341, 12141, 12142]
2 [7872, 72491, 104946]
3 [58, 860, 11341, 12141, 12142]
4 [7036, 7872]
...
2329 []
2330 []
2331 []
2332 []
2333 [128632]
Name: company_id_list, Length: 2248, dtype: object
sama dengan data genre, kita akan menggabungkan data list untuk id nama perusahaan, dan negara asal dalam list id_perusahaan, nama_perusahaan, dan negara_asal_perusahaan.
# Membuat list kosong id_perusahaan, nama_perusahaan, dan negara_asal_perusahaan
id_perusahaan = []
nama_perusahaan = []
negara_asal_perusahaan = []
# Melakukan looping untuk mengumpulkan semua id perusahaan dalam satu list id_perusahaan
for i in df_raw.company_id_list:
id_perusahaan = id_perusahaan+i
# Melakukan looping untuk mengumpulkan semua nama perusahaan dalam satu list nama_perusahaan
for i in df_raw.company_name_list:
nama_perusahaan = nama_perusahaan+i
# Melakukan looping untuk mengumpulkan semua negara asal perusahaan dalam satu list negara_asal_perusahaan
for i in df_raw.company_original_country_list:
negara_asal_perusahaan = negara_asal_perusahaan+i
# Melihat 10 data pertama list id_perusahaan
id_perusahaan[:10]
[138594, 58, 11341, 12141, 12142, 7872, 72491, 104946, 58, 860]
# Melihat 10 data pertama list nama_perusahaan
nama_perusahaan[:10]
['Frontier Pictures',
'Sony Pictures Classics',
'Stage 6 Films',
'Pt. Merantau Films',
'XYZ Films',
'Rapi Films',
'Brown Entertainment',
'Sky Media',
'Sony Pictures Classics',
'Celluloid Dreams']
# Melihat 10 data pertama list negara_asal_perusahaan
negara_asal_perusahaan[:10]
['ID', 'US', 'US', 'ID', 'US', 'ID', '', 'ID', 'US', 'FR']
Bisa diamati bahwa negara asal perusahaan dalam bentuk kode negara sesuai standar ISO. Selanjutnya kita akan membuat dataframe df_perusahaan dan memastikan tidak ada duplikasi data serta mengurutkan data berdasarkan id.
# Membuat dataframe df_perusahaan
df_perusahaan = pd.DataFrame({'id':id_perusahaan, 'nama':nama_perusahaan, 'negara_asal':negara_asal_perusahaan})
# Melakukan drop duplikasi pada data
df_perusahaan = df_perusahaan.drop_duplicates()
# Mengurutkan data berdasarkan id
df_perusahaan = df_perusahaan.sort_values('id').reset_index(drop=True)
# Menampilkan data df_perusahaan
print(df_perusahaan)
id nama negara_asal
0 25 20th Century Fox US
1 58 Sony Pictures Classics US
2 789 Pallas Film DE
3 860 Celluloid Dreams FR
4 3052 Troma Entertainment US
... ... ... ...
1185 188242 Miura Films
1186 188528 RUMPI Entertainment
1187 188559 Asaloka Films
1188 188706 Silent D Pictures
1189 188933 Yoikatra
[1190 rows x 3 columns]
dari hasil di atas diperoleh 1190 data unik untuk perusahaan pembuat film Indonesia. Kemudian kita simpan df_perusahaan ke dalam file csv.
# Menyimpan df_perusahaan dalam bentuk file csv tanpa menyimpan indeksnya
df_perusahaan.to_csv('perusahaan.csv', index=False)
Data Negara
Kolom country_id_list, dan country_name_list akan digunakan untuk membuat data negara.
# Mengecek kolom genre_id_list
df_raw.country_id_list
0 [ID]
1 [ID, US]
2 [ID]
3 [FR, ID, US]
4 [ID, KR]
...
2329 [ID]
2330 [ID]
2331 [ID]
2332 [ID]
2333 [ID]
Name: country_id_list, Length: 2248, dtype: object
Kita akan menggabungkan data list untuk id dan nama negaradalam list id_negara, dan nama_negara.
# Membuat list kosong id_negara dan nama_negara
id_negara = []
nama_negara = []
# Melakukan looping untuk mengumpulkan semua id negara dalam satu list id_negara
for i in df_raw.country_id_list:
id_negara = id_negara+i
# Melakukan looping untuk mengumpulkan semua nama negara dalam satu list nama_negara
for i in df_raw.country_name_list:
nama_negara = nama_negara+i
# Melihat 10 data pertama list nama_negara
nama_negara[:10]
['Indonesia',
'Indonesia',
'United States of America',
'Indonesia',
'France',
'Indonesia',
'United States of America',
'Indonesia',
'South Korea',
'Indonesia']
Membuat dataframe df_negara sama seperti langkah-langkah sebelumnya.
# Membuat dataframe df_negara
df_negara = pd.DataFrame({'id':id_negara, 'nama':nama_negara})
# Melakukan drop duplikasi pada data
df_negara = df_negara.drop_duplicates()
# Mengurutkan data berdasarkan id
df_negara = df_negara.sort_values('id').reset_index(drop=True)
# Menampilkan data df_negara
print(df_negara)
id nama
0 AU Australia
1 BE Belgium
2 CN China
3 DE Germany
4 DK Denmark
5 FR France
6 GB United Kingdom
7 HK Hong Kong
8 ID Indonesia
9 JP Japan
10 KR South Korea
11 MY Malaysia
12 NL Netherlands
13 NO Norway
14 NZ New Zealand
15 PH Philippines
16 PL Poland
17 QA Qatar
18 SG Singapore
19 TH Thailand
20 TW Taiwan
21 US United States of America
22 ZA South Africa
Diperoleh 22 negara yang berhubungan dengan data film Indonesia yang kita kumpulkan. Langkah selanjutnya adalah menyimpan dalam file csv sebagai berikut.
# Menyimpan df_negar dalam bentuk file csv tanpa menyimpan indeksnya
df_negara.to_csv('negara.csv', index=False)
Data Pemeran
Data pemeran yang berhasil kita himpun di antaranya: id, nama, nama asli, nama karakter yang diperankan dan nilai popularitas artis/aktor/pemeran tersebut. Kita akan membuat list-list untuk menyimpan data-data di atas seperti dua data sebelumnya kemudian kita bentuk menjadi dataframe df_pemeran.
# Mengumpulkan data pemeran dalam list
id_pemeran = []
nama_pemeran = []
nama_asli_pemeran = []
karakter_diperankan = []
popularitas_pemeran = []
for i in df_raw.cast_id_list:
id_pemeran = id_pemeran+i
for i in df_raw.cast_name_list:
nama_pemeran = nama_pemeran+i
for i in df_raw.cast_original_name_list:
nama_asli_pemeran = nama_asli_pemeran+i
for i in df_raw.cast_character_list:
karakter_diperankan = karakter_diperankan+i
for i in df_raw.cast_popularity_list:
popularitas_pemeran = popularitas_pemeran+i
Data yang kita buat adalah data pemeran yang mana terdapat kolom data karakter_diperankan. Sehingga kita perlu menambahkan satu kolom lagi yaitu id film yang berkaitan. Sebelumnya kita perlu membuat kolom baru dalam dataframe df_raw yaitu jumlah_pemeran. Ini dilakukan untuk membuat data film_id sejumah pemeran yang ada. Jadi misal dalam satu baris ada 5 pemeran maka kita membuat list id_film sejumlah lima kali yaitu [id_filmA, id_filmA, id_filmA, id_filmA, id_filmA].
# Membuat list kosong id_film
id_film = []
# Mengumpulkan list id_film sejuamlah jumlah pemeran pada masing-masing film
for i, jp in zip(df_raw.id, df_raw['jumlah_pemeran']):
id_film= id_film + [i]*jp
Kemudian dilanjutkan dengan membuat dataframe df_pemeran sebagai berikut.
# Membuat dataframe df_pemeran
df_pemeran = pd.DataFrame({'id' : id_pemeran,
'nama' : nama_pemeran,
'nama_asli' : nama_asli_pemeran,
'id_film' : id_film,
'karakter' : karakter_diperankan,
'popularitas' :popularitas_pemeran})
# Drop duplikasi data pada kolom id dan id_film
df_pemeran = df_pemeran.drop_duplicates(subset=['id', 'id_film'])
# Menampilkan ata df_pemeran
print(df_pemeran)
id nama nama_asli id_film karakter \
0 1203378 Abimana Aryasatya Abimana Aryasatya 683328 Topan
1 1891479 Putri Marino Putri Marino 683328 Dina
2 1916568 Lutesha Lutesha 683328 Alpha
3 1488899 Arie Kriting Arie Kriting 683328 Jenggo
4 2752309 Kristo Immanuel Kristo Immanuel 683328 Pelor
... ... ... ... ... ...
22770 1716632 Sadana Agung Sadana Agung 595307 Niki
22771 2119647 Kevin Bzezovski Kevin Bzezovski 595307
22772 2304050 Messi Gusti Messi Gusti 595307
22773 2077543 Ananta Rispo Ananta Rispo 595307 Agency Owner
22774 1368172 Fico Fachriza Fico Fachriza 595307 Agency Crew
popularitas
0 3.238
1 3.238
2 12.992
3 1.486
4 2.724
... ...
22770 0.883
22771 0.600
22772 0.600
22773 0.600
22774 0.700
[22760 rows x 6 columns]
Diperoleh data 22760 pemeran pada data yang kita ambil. Kemudian kita simpan dalam file csv.
# Menyimpan df_pemeran dalam bentuk file csv tanpa menyimpan indeksnya
df_pemeran.to_csv('pemeran.csv', index=False)
Data Film
Akhirnya, kita akan membuat data flm itu sendiri, terdapat beberapa kolom yang akan kita ambil dari df_raw kemudian akan kita tambahkan kolom-kolom baru. Pertama kita memilih kolom-kolom yang kita inginkan dan melakukan perubahan nama kolom dalam bahasa Indonesia.
# Memilih kolom yang diinginkan
df_film = df_raw[['id', 'imdb_id', 'title', 'overview_raw', 'popularity', 'adult',
'runtime', 'revenue', 'budget', 'release_date',
'vote_count', 'vote_average', 'genre_id_list',
'country_id_list', 'company_id_list',
'original_language', 'translation_id_list',
'cast_popularity_list', 'cast_id_list', 'jumlah_pemeran']]
# Mengganti nama kolom
df_film = df_film.rename(columns={"title":'judul',
"overview_raw":"ringkasan",
"popularity":"popularitas",
"adult":"kategori_dewasa",
"runtime":"durasi",
"revenue":"pendapatan",
"budget":"biaya_pembuatan",
"release_date":"tanggal_rilis",
"vote_count":"jumlah_vote",
"vote_average":"rerata_vote",
"original_language":"bahasa_asli"
""})
Menambahkan kolom genre_1, genre_2, genre_3, dan genre_4.
# Mengambil 4 genre pertama masing-masing dalam satu list
genre1 = []
for i in df_film.genre_id_list:
try :
genre1.append(i[0])
except:
genre1.append(None)
genre2 = []
for i in df_film.genre_id_list:
try :
genre2.append(i[1])
except:
genre2.append(None)
genre3 = []
for i in df_film.genre_id_list:
try :
genre3.append(i[2])
except:
genre3.append(None)
genre4 = []
for i in df_film.genre_id_list:
try :
genre4.append(i[3])
except:
genre4.append(None)
# Membuat kolom baru genre_1, genre_2, genre_3, dan genre_4
df_film['genre_1'] = genre1
df_film['genre_2'] = genre2
df_film['genre_3'] = genre3
df_film['genre_4'] = genre4
Menambahkan kolom negara_1, negara_2, negara_3, dan negara_4.
# Mengambil 4 negara pertama masing-masing dalam satu list
negara1 = []
for i in df_film.country_id_list:
try :
negara1.append(i[0])
except:
negara1.append(None)
negara2 = []
for i in df_film.country_id_list:
try :
negara2.append(i[1])
except:
negara2.append(None)
negara3 = []
for i in df_film.country_id_list:
try :
negara3.append(i[2])
except:
negara3.append(None)
negara4 = []
for i in df_film.country_id_list:
try :
negara4.append(i[3])
except:
negara4.append(None)
# Membuat kolom baru genre_1, genre_2, genre_3, dan genre_4
df_film['negara_1'] = negara1
df_film['negara_2'] = negara2
df_film['negara_3'] = negara3
df_film['negara_4'] = negara4
Menambahkan kolom perusahaan_1, perusahaan_2, perusahaan_3, dan perusahaan_4.
# Mengambil 4 perusahaan pertama masing-masing dalam satu list
perusahaan1 = []
for i in df_film.company_id_list:
try :
perusahaan1.append(i[0])
except:
perusahaan1.append(None)
perusahaan2 = []
for i in df_film.company_id_list:
try :
perusahaan2.append(i[1])
except:
perusahaan2.append(None)
perusahaan3 = []
for i in df_film.company_id_list:
try :
perusahaan3.append(i[2])
except:
perusahaan3.append(None)
perusahaan4 = []
for i in df_film.company_id_list:
try :
perusahaan4.append(i[3])
except:
perusahaan4.append(None)
# Membuat kolom baru perusahaan_1, perusahaan_2, perusahaan_3, dan perusahaan_4
df_film['perusahaan_1'] = perusahaan1
df_film['perusahaan_2'] = perusahaan2
df_film['perusahaan_3'] = perusahaan3
df_film['perusahaan_4'] = perusahaan4
Menambahkan kolom jumlah_terjemahan
# Membuat kolom jumlah terjemahan film
df_film['jumlah_terjemahan'] = df_film['translation_id_list'].apply(lambda x: len(x))
Menambahkan kolom pemeran_1, pemeran_2, pemeran_3, pemeran_4, dan pemeran_5.
# Mengambil 5 pemeran pertama masing-masing dalam satu list
pemeran1 = []
for i in df_film.cast_id_list:
try :
pemeran1.append(i[0])
except:
pemeran1.append(None)
pemeran2 = []
for i in df_film.cast_id_list:
try :
pemeran2.append(i[1])
except:
pemeran2.append(None)
pemeran3 = []
for i in df_film.cast_id_list:
try :
pemeran3.append(i[2])
except:
pemeran3.append(None)
pemeran4 = []
for i in df_film.cast_id_list:
try :
pemeran4.append(i[3])
except:
pemeran4.append(None)
pemeran5 = []
for i in df_film.cast_id_list:
try :
pemeran5.append(i[4])
except:
pemeran5.append(None)
# Membuat kolom baru pemeran_utama_1, pemeran_utama_2, pemeran_utama_3, pemeran_utama_4, pemeran_utama_5
df_film['pemeran_utama_1'] = pemeran1
df_film['pemeran_utama_2'] = pemeran2
df_film['pemeran_utama_3'] = pemeran3
df_film['pemeran_utama_4'] = pemeran4
df_film['pemeran_utama_5'] = pemeran5
Menambahkan kolom rata-rata popularitas pemeran.
# Fungsi menghitung rata-rata pada lsit
def pop_avg(list_pop):
try:
result = sum(np.array(list_pop))/len(list_pop)
except:
result = None
return result
# menambahkan kolom rata-rata popularitas pemeran dalam film
df_film['rata2_pop_pemeran'] = df_film['cast_popularity_list'].apply(lambda x: pop_avg(x))
Mestandarkan tipe data pada kolom kategori_dewasa dan tanggal_rilis
# Standarisasi tipe data
df_film['tanggal_rilis'] = pd.to_datetime(df_film['tanggal_rilis'])
df_film['kategori_dewasa'] = df_film['kategori_dewasa'].astype('boolean')
Drop duplikasi pada kolom id
# Drop duplikasi
df_film = df_film.drop_duplicates(subset=['id'])
Menghapus kolom yang tidak diperlukan kembali
# Menghapus Kolom yang tidak diperlukan
df_film = df_film.drop(columns=['genre_id_list', 'country_id_list',
'company_id_list', 'bahasa_asli', 'translation_id_list',
'cast_popularity_list', 'cast_id_list', ])
Menyimpan df_film dalam file csv
# Menyimpan df_film dalam bentuk file csv tanpa menyimpan indeksnya
df_film.to_csv('film.csv', index=False)
Penutup
Kelima data sudah selesai kita buat, selanjutnya adalah proses import ke Postgre SQL yang akan di bahas di bagian 3. Semoga Allah Subhana wata’ala senantiasa memudahkan kita dalam menuntut ilmu yang bermanfaat
nuun walqolami wama yasturun
Wassalamualaikum warahmatullahi wabarakatuh