Airlanes Booking Analys
Airlanes Booking Analys
drive.mount('/content/drive')
data_path = '/content/drive/MyDrive/Dataset/customer_booking.csv'
df = pd.read_csv(data_path, encoding='latin1')
df.head()
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 50000 entries, 0 to 49999
Data columns (total 14 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 num_passengers 50000 non-null int64
1 sales_channel 50000 non-null object
2 trip_type 50000 non-null object
3 purchase_lead 50000 non-null int64
4 length_of_stay 50000 non-null int64
5 flight_hour 50000 non-null int64
6 flight_day 50000 non-null object
7 route 50000 non-null object
8 booking_origin 50000 non-null object
9 wants_extra_baggage 50000 non-null int64
10 wants_preferred_seat 50000 non-null int64
11 wants_in_flight_meals 50000 non-null int64
12 flight_duration 50000 non-null float64
13 booking_complete 50000 non-null int64
dtypes: float64(1), int64(8), object(5)
memory usage: 5.3+ MB
num_passengers int64
sales_channel object
trip_type object
purchase_lead int64
length_of_stay int64
flight_hour int64
flight_day object
route object
booking_origin object
wants_extra_baggage int64
wants_preferred_seat int64
wants_in_flight_meals int64
flight_duration float64
booking_complete int64
dtype: object
sales_channel
Internet 44382
Mobile 5618
Name: count, dtype: int64
trip_type
RoundTrip 49497
OneWay 387
CircleTrip 116
Name: count, dtype: int64
booking_origin
Australia 17872
Malaysia 7174
South Korea 4559
Japan 3885
China 3387
...
Panama 1
Tonga 1
Tanzania 1
Bulgaria 1
Svalbard & Jan Mayen 1
Name: count, Length: 104, dtype: int64
route
AKLKUL 2680
PENTPE 924
MELSGN 842
ICNSIN 801
DMKKIX 744
...
LBUTPE 1
CXRMEL 1
DELKBR 1
KOSSYD 1
MRUXIY 1
Name: count, Length: 799, dtype: int64
wants_in_flight_meals flight_duration \
num_passengers 0.022943 -0.063169
purchase_lead -0.022653 0.067866
length_of_stay 0.098828 0.141181
flight_hour 0.013014 -0.002101
wants_extra_baggage 0.216470 0.057054
wants_preferred_seat 0.315088 0.101289
wants_in_flight_meals 1.000000 0.154312
flight_duration 0.154312 1.000000
booking_complete 0.026511 -0.106266
booking_complete
num_passengers 0.024116
purchase_lead -0.022131
length_of_stay -0.042408
flight_hour 0.007127
wants_extra_baggage 0.068139
wants_preferred_seat 0.050116
wants_in_flight_meals 0.026511
flight_duration -0.106266
booking_complete 1.000000
1. numeric_columns = df.select_dtypes(include=['int64',
'float64']).columns: Baris ini mengidentifikasi kolom-kolom dalam dataframe
yang memiliki tipe data numerik, seperti int64 dan float64, dan menyimpan nama-
nama kolom tersebut dalam variabel numeric_columns.
1. Menangani nilai yang hilang: Baris ini menangani nilai yang hilang dalam
dataframe. Metode fillna() digunakan untuk mengganti nilai-nilai yang hilang
(NaN) dengan mean dari setiap kolom. Ini adalah salah satu pendekatan umum
untuk menangani nilai yang hilang, dengan mengisi nilai yang hilang dengan nilai
rata-rata dari kolom yang bersangkutan.
# Memilih fitur dan target
X = df[['sales_channel', 'trip_type', 'purchase_lead', 'flight_duration',
'route', 'booking_origin']]
y = df['booking_complete']
RandomForestClassifier(random_state=42)
# Evaluasi model
predictions = model.predict(X_test)
print(classification_report(y_test, predictions))
print(confusion_matrix(y_test, predictions))
[[7830 690]
[1113 367]]
# Membuat plot
plt.figure(figsize=(10, 6))
plt.title('Feature Importances by RandomForest Model')
colors = plt.cm.viridis(np.linspace(0, 1, len(X.columns))) # Menggunakan
colormap untuk warna
bars = plt.bar(range(len(X.columns)), feature_importances[indices],
color=colors, align='center')
route: Fitur ini memiliki tingkat kepentingan yang sedang (sekitar 0.2). Jalur yang
diambil mungkin mempengaruhi keputusan pembelian berdasarkan faktor-faktor
seperti durasi, biaya, atau preferensi rute.
booking_origin: Kepentingan fitur ini relatif lebih rendah dibandingkan dengan dua
fitur sebelumnya (sekitar 0.1). Hal ini menunjukkan bahwa asal mula booking
memiliki pengaruh tetapi tidak sekuat fitur lain dalam memprediksi hasil.
1. trip_type: Jenis perjalanan (misalnya perjalanan satu arah vs. perjalanan pulang
pergi) mungkin terkait dengan peluang penyelesaian pemesanan. Perjalanan pulang
pergi mungkin lebih kompleks dan memiliki potensi masalah yang lebih tinggi yang
bisa berakibat pada pembatalan.
4. route: Rute penerbangan bisa sangat berpengaruh karena beberapa rute mungkin
memiliki lebih banyak masalah logistik atau operasional yang bisa berdampak pada
keberhasilan pemesanan. Rute-rute tertentu mungkin juga lebih populer atau
memiliki tingkat permintaan yang lebih tinggi yang bisa mempengaruhi probabilitas
pembatalan.
Regresi Logistik
# Mengkodekan variabel kategorikal
label_encoders = {}
categorical_columns = ['sales_channel', 'trip_type', 'flight_day', 'route',
'booking_origin']
for col in categorical_columns:
le = LabelEncoder()
df[col] = le.fit_transform(df[col])
label_encoders[col] = le
LogisticRegression()
# Evaluasi model
predictions = model.predict(X_test)
print("Classification Report:")
print(classification_report(y_test, predictions))
print("Confusion Matrix:")
print(confusion_matrix(y_test, predictions))
Classification Report:
precision recall f1-score support
Confusion Matrix:
[[8520 0]
[1480 0]]
/usr/local/lib/python3.10/dist-packages/sklearn/metrics/
_classification.py:1344: UndefinedMetricWarning: Precision and F-score are
ill-defined and being set to 0.0 in labels with no predicted samples. Use
`zero_division` parameter to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:13
44: UndefinedMetricWarning: Precision and F-score are ill-defined and being
set to 0.0 in labels with no predicted samples. Use `zero_division` parameter
to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
/usr/local/lib/python3.10/dist-packages/sklearn/metrics/_classification.py:13
44: UndefinedMetricWarning: Precision and F-score are ill-defined and being
set to 0.0 in labels with no predicted samples. Use `zero_division` parameter
to control this behavior.
_warn_prf(average, modifier, msg_start, len(result))
Confusion Matrix
True Negatives (TN): 8520 - Ini menunjukkan bahwa model berhasil
mengidentifikasi semua sampel kelas 0 (negatif) dengan benar.
False Positives (FP): 0 - Tidak ada kasus di mana model salah mengklasifikasikan
kelas 0 sebagai kelas 1.
True Positives (TP): 0 - Model tidak berhasil mengidentifikasi satupun kelas 1
(positif) dengan benar.
False Negatives (FN): 1480 - Semua sampel kelas 1 dianggap oleh model sebagai
kelas 0.
Classification Report
Precision untuk Kelas 1 adalah 0.00: Ini menunjukkan bahwa model tidak
memiliki kemampuan untuk mengidentifikasi kelas positif sama sekali.
Recall untuk Kelas 1 juga 0.00: Artinya, dari semua kasus positif yang sebenarnya,
model tidak mengidentifikasi satupun dari mereka dengan benar.
F1-Score untuk Kelas 1 adalah 0.00: F1-score adalah rata-rata harmonik dari
precision dan recall, dan skor 0 di sini menegaskan lagi bahwa model gagal total
dalam mengidentifikasi kelas 1.
Precision, Recall, dan F1-score untuk Kelas 0 cukup tinggi: Ini mengindikasikan
bahwa model sangat efisien dalam mengidentifikasi kelas 0 tetapi pada biaya
mengabaikan kelas 1.
Analisis Umum
Model yang digunakan memiliki kinerja yang sangat bias ke arah kelas mayoritas (kelas 0)
dan gagal total dalam mengklasifikasikan kelas minoritas (kelas 1). Kinerja seperti ini
sering kali terjadi jika:
1. Model Kurang Fit: Model mungkin terlalu sederhana (underfit) sehingga tidak bisa
menangkap kompleksitas dalam data untuk kelas 1.
1. Data Tidak Seimbang: Jika dataset sangat tidak seimbang (lebih banyak sampel
untuk kelas 0), model bisa menjadi bias dan hanya belajar untuk selalu memprediksi
kelas mayoritas.
2. Label Kelas Mungkin Salah atau Tidak Konsisten: Terkadang masalah dalam
data itu sendiri, seperti label yang tidak konsisten atau salah, bisa menyebabkan
model tidak dapat belajar dengan efektif.
coef = model.coef_[0]
indices = np.argsort(np.abs(coef))[::-1] # Mengurutkan koefisien berdasarkan
nilai absolutnya
# Membuat plot
plt.figure(figsize=(10, 6))
plt.title('Coefficient Importance in Logistic Regression')
plt.bar(range(X_train.shape[1]), coef[indices], color='salmon',
align='center')
plt.xticks(range(X_train.shape[1]), [X.columns[i] for i in indices],
rotation=90)
plt.xlabel('Features')
plt.ylabel('Coefficient Value')
plt.tight_layout()
plt.show()
AdaBoostClassifier &XGBoost
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import xgboost as xgb
from sklearn.metrics import accuracy_score,confusion_matrix
from sklearn.ensemble import AdaBoostClassifier
from sklearn import preprocessing
from sklearn.pipeline import Pipeline
from sklearn import decomposition
from tqdm.notebook import tqdm
from sklearn import cluster
from sklearn import metrics
from sklearn import mixture
from sklearn import model_selection
sales_channel_counts = df['sales_channel'].value_counts()
plt.axis('equal')
plt.title('Distribution by Sales Channel')
plt.show()
df =
pd.get_dummies(df,columns=['sales_channel','trip_type','flight_day','route',
'booking_origin'],drop_first = True)
x=df.drop('wants_extra_baggage',axis=1)
y=df['wants_extra_baggage']
x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=0.7,random_stat
e=10)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)
0.7306
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, cmap='Blues', fmt='g', xticklabels=['Class 0',
'Class 1'], yticklabels=['Class 0', 'Class 1'])
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.title('Confusion Matrix')
plt.show()
ada_classifier = AdaBoostClassifier(n_estimators=50, random_state=42)
ada_classifier.fit(x_train, y_train)
y_pred = ada_classifier.predict(x_test)
Accuracy: 0.724
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, cmap='Blues', fmt='g', xticklabels=['Class 0',
'Class 1'], yticklabels=['Class 0', 'Class 1'])
plt.xlabel('Predicted labels')
plt.ylabel('True labels')
plt.title('Confusion Matrix')
plt.show()
# Model ANOVA
model = ols('wants_extra_baggage ~ flight_hour', data=df).fit()
# Hasil ANOVA
anova_table = sm.stats.anova_lm(model, typ=2)
print(anova_table)
sum_sq df F PR(>F)
flight_hour 1.447921 1.0 6.537088 0.010568
Residual 11074.217659 49998.0 NaN NaN
sum_sq df F PR(>F)
sales_channel_1 167.166110 1.0 74.717791 5.588170e-18
Residual 111860.522805 49998.0 NaN NaN