Python for Data Analysis

Prasetyo Bimantoro
6 min readNov 23, 2022

--

Python adalah bahasa pemrograman tingkat tinggi yang sering digunakan untuk berbagai macam kebutuhan, salah satunya dalam data analisis. Python merupakan salah satu bahasa pemrograman yang paling sering dipakai, karena syntax nya yang cukup sederhana dan mudah dimengerti, telah mendapat dukungan bermacam-macam module dan package yang beragam, serta proses debugging yang cepat.

Untuk kebutuhan pekerjaan data analis, package dari python yang dapat membantu adalah sebagai berikut,

  1. Numpy: library python yang dapat bekerja dengan array. Numpy memiliki fungsi-fungsi perhitungan matematis seperti aljabar, fourier transform, dan matriks.
  2. Pandas: library python yang memberikan sebuah data structures dan memungkinkan kita untuk melakukan manipulasi data. Library inilah yang paling sering digunakan dalam pekerjaan data analisis dan data science.
  3. Matplotlib: library yang digunakan untuk menciptakan visualisasi statis, animatis, dan interaktif pada python. Library ini sering digunakan untuk kebutuhan menampilkan data (data visualization) pada python.
  4. Seaborn: library yang dikhususkan untuk membuat visualisasi data. Merupakan alternatif dari Matplotlib.
  5. Re: modul yang digunakan untuk mencari sebuah pola dalam suatu string.

Case Study

Pada studi kasus Python kali ini, kita akan memakai database hotel yang berasal dari:

Antonio, N., de Almeida, A. and Nunes, L. (2019) “Hotel booking demand datasets,” Data in Brief, 22, pp. 41–49. Available at: https://doi.org/10.1016/j.dib.2018.11.126.

Downloaded and cleaned data: tidytuesday

Berikut adalah deskripsi data yang digunakan:

Data Dictionary (Part 1)
Data Dictionary (Part 2)

Sebelum memulai ekstraksi dan analisis data yang diperlukan, kita harus import package yang diperlukan (pandas, numpy, matplotlib dengan modul pyplot, seaborn, dan re).

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import re
sns.set()

Untuk membaca data csv ke dalam dataframe dari python, dibutuhkan fungsi read_csv dari pandas.

df_hotels = pd.read_csv\
('https://raw.githubusercontent.com/rfordatascience/tidytuesday/\
master/data/2020/2020-02-11/hotels.csv')
df_hotels.head()

Di dataset ini tidak terdapat kolom unique identifier, sehingga untuk latihan ini kita akan menganggap bahwa jika setiap row adalah unik dengan memberikan kolom id sebagai unique identifier.

df_hotels = df_hotels.reset_index().rename(columns={'index':'id'})
df_hotels.head()

1. Buatlah fungsi dengan : 1 argumen berupa dataframe untuk mengecek data type, untuk mengecek jumlah null value, untuk mengecek percent null value, serta jumlah unique value tiap kolom yang ada di sebuah dataframe

Untuk membuat empat inspeksi dataframe “df_hotels” tersebut ke dalam satu dataframe, maka dibutuhkan suatu fungsi khusus pengecekan tersebut. Cara kerjanya yaitu

  1. fungsi akan membaca tipe, jumlah dan persentase null data, serta jumlah unique data di setiap kolom dengan fungsi looping “for”.
  2. Lalu data tersebut dimasukkan ke dalam “list_loop” yang akan selalu dilakukan overwrite pada setiap loop.
  3. Setelah itu, list “list_temp” akan ditambahkan sesuai pada data inspeksi dari “list_loop”, sehingga di akhir looping, data “list_temp” merupakan kumpulan list dari info inspeksi setiap kolom “df_hotels”.
  4. Setelah itu dibuatkan database baru dengan sumber data dari “list_temp”.
def check_values(df):
# Write the code down below
list_temp = []
for i in df.columns:
list_loop = [i,
df[i].dtype,
df[i].isnull().sum(),
(df[i].isnull().sum()/df_hotels.isnull().sum().sum())*100,
df[i].nunique()]
list_temp.append(list_loop)
return pd.DataFrame(columns=['name',
'dtype',
'isnull',
'% isnull',
'n-unique'], data=list_temp)

check_values(df_hotels)

Berikut hasilnya,

Data dari kolom “agent” dan “company” memiliki null values yang cukup tinggi (> 10%).

2. Ada berapa berapa jumlah pengunjung yang membatalkan reservasi dan yang tidak? Dan dari jumlah tersebut buatlah kesimpulan mengenai proporsisi masing-masing!

Dengan menggunakan aggregasi untuk menentukan proporsi sesuai code

print("jumlah pengunjung yang membatalkan reservasi adalah :") 
print(df_hotels['is_canceled'].values.sum())
print("dan proporsinya adalah :")
print((df_hotels['is_canceled'].values.sum()/df_hotels['id'].count())*100)
print("jumlah pengunjung yang tidak membatalkan reservasi adalah :")
print(df_hotels['id'].count()-df_hotels['is_canceled'].values.sum())
print("dan proporsinya adalah :")
print(((df_hotels['id'].count()-df_hotels['is_canceled'].values.sum())/df_hotels['id'].count())*100)

didapatkan hasil seperti ini.

*proporsi dalam satuan %

Data tersebut dilakukan plotting menggunakan seaborn dengan code seperti ini,

sns.countplot(data=df_hotels, x='is_canceled')
plt.title('Cancelled')
plt.show()

Fungsi plt.show akan menghasilkan grafik seperti berikut.

Ternyata terdapat lumayan banyak pengunjung yang membatalkan reservasi, hingga 37% dari seluruh pengunjung.

3A. Untuk “City Hotel”, berapa persen reservasi yang dibatalkan?

Pengambilan data persen reservasi pada awalnya dibuat dengan memanggil dataframe baru dengan kriteria is_canceled == 1 dan ‘hotel’ == ‘City Hotel’. Lalu dihitung jumlahnya dan persentasenya dengan fungsi len yang memberikan data berupa jumlah data pada dataframe.

df_city_hotel = df_hotels[(df_hotels['is_canceled'] == 1) & \
(df_hotels['hotel'] == 'City Hotel')]
print("jumlah pengunjung yang membatalkan reservasi di City Hotel adalah :")
print(df_city_hotel['is_canceled'].values.sum())
print("persentasenya adalah :")
len(df_hotels[(df_hotels.hotel=='City Hotel')&(df_hotels.is_canceled==1)]) /\
len(df_hotels[(df_hotels.hotel=='City Hotel')]) *100

3B. Untuk “Resort Hotel”, berapa persen reservasi yang dibatalkan?

Pengambilan data persen reservasi pada awalnya dibuat dengan memanggil dataframe baru dengan kriteria is_canceled == 1 dan ‘hotel’ == ‘Resort Hotel’. Lalu dihitung jumlahnya dan persentasenya dengan fungsi len yang memberikan data berupa jumlah data pada dataframe.

df_resort_hotel = df_hotels[(df_hotels['is_canceled'] == 1) & \
(df_hotels['hotel'] == 'Resort Hotel')]
print("jumlah pengunjung yang membatalkan reservasi di Resort Hotel adalah :")
print(df_resort_hotel['is_canceled'].values.sum())
print("persentasenya adalah :")
len(df_hotels[(df_hotels.hotel=='Resort Hotel')&(df_hotels.is_canceled==1)]) /\
len(df_hotels[(df_hotels.hotel=='Resort Hotel')])*100

4. Lakukan filter sehingga hanya menampilkan data pengunjung yang tidak membatalkan reservasi. Dan simpan hasilnya dalam variabel df_checkout.

Membuat df_checkout dilakukan hanya dengan melakukan filter ‘is_canceled’ == 0 pada df_checkout.

df_checkout = df_hotels[df_hotels['is_canceled'] == 0]
df_checkout.shape
df_checkout.head()
shape df_checkout
head df_checkout

5A. Tampilkan jumlah reservasi tiap bulan kedatangan untuk masing-masing jenis hotel.

Hal ini dapat direalisasikan dengan fungsi groupby dan fungsi size seperti code berikut.

df_checkout.groupby(['hotel', 'arrival_date_month']).size()

5B. Lalu di bulan apa terdapat reservasi yang paling banyak di masing-masing jenis hotel? Buatlah kesimpulan apakah trennya sama di kedua jenis hotel? Lakukan dengan nama bulan yang sudah di-mapping menjadi bulan dalam angka

Untuk membuat nama bulan menjadi angka, kita perlu membuat kolom baru berupa arrival_date_month_num pada dataframe df_checkout. Cara kerjanya yaitu

  1. membaca data di kolom arrival_date_month menjadi sebuah datetime yang hanya mengandung bulan dan format %B,
  2. data tersebut ditransformasikan ke dalam bentuk integer.
df_checkout['arrival_date_month_num'] =\
pd.to_datetime(df_checkout['arrival_date_month'],\
format='%B')\
.dt.month.astype(int)

Berikut tampilan kolomnya.

Lalu data dilakukan aggregasi dengan groupby dan size,

df_checkout.groupby(['hotel', 'arrival_date_month_num']).size()

Jawaban pada soal dapat terealisasi dengan visualisasi data dengan menggunakan seaborn.

#data reservasi tanpa cancel per bulan
sns.countplot(data=df_checkout, x='arrival_date_month_num')
#data reservasi tanpa cancel per bulan
#yang telah dikelompokkan ke dalam jenis hotel
sns.countplot(data=df_checkout, x='arrival_date_month_num',hue='hotel')
plt.xlabel('bulan kedatangan')
plt.ylabel('jumlah reservasi')
plt.show()
data check out per bulan
data check out per bulan berdasarkan jenis hotel

6. Buat sebuah kolom baru bernama arrival_date yang berisi info lengkap tentang tahun, bulan, dan tanggal kedatangan dan ubah kolom menjadi tipe datetime.

Langkah 1: mengubah arrival_date_month_num menjadi string

df_checkout['arrival_date_month_num'] = \
df_checkout['arrival_date_month_num'].astype(str)
df_checkout.dtypes
data tipe arrival_date_month_num setelah dilakukan langkah 1

Langkah 2: lalu menambahkan zero padding, sehingga ‘1’ menjadi ‘01’

Langkah ke-2 dapat dilakukan dengan fungsi df.pad, namun saya di sini memakai for dan append.

#zero padding nomor bulan
x = df_checkout['arrival_date_month_num'].values
k = []
for i in x:
if len(i) == 1:
j = '0' + i
k.append(j)
else:
k.append(i)
df_checkout['arrival_date_month_num'] = k
df_checkout.unique()
df_checkout[‘arrival_date_month_num’].unique()
#zero padding nomor hari
x = df_checkout['arrival_date_day_of_month'].values
k = []
for i in x:
if len(i) == 1:
j = '0' + i
k.append(j)
else:
k.append(i)

df_checkout['arrival_date_day_of_month'] = k
df_checkout['arrival_date_day_of_month'].unique()
df_checkout[‘arrival_date_day_of_month’].unique()

Langkah 3: menggabungkan tanggal, bulan, dan tahun

df_checkout['arrival_date'] =\
df_checkout['arrival_date_year'] + '-' +\
df_checkout['arrival_date_month_num'] + '-' +\
df_checkout['arrival_date_day_of_month']

df_checkout['arrival_date']

Langkah 4: mengubah arrival_date menjadi datetime

df_checkout['arrival_date'] = pd.to_datetime(df_checkout['arrival_date'])

--

--