# Praktikum 1

## Pra Pengolahan Data - Ekstraksi Fitur &#x20;

Pada praktikum ini kita akan mencoba melakukan Pra pengolahan data dengan encoding, imputasi data  terhadap data yang hilang (*missing value*) dan standarisasi. Setelah melakukan Pra pengolahan Data akan dilakukan ektraksi fitur. Dataset yang digunakan adalah dataset Titanic.

:arrow\_down: **Download** :arrow\_down:

[60KBTitanic-Dataset.csv](https://1473714265-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fhh7WzzoZbeFX9VC0bZSU%2Fuploads%2FlefGVONKVrfDztf8aPzt%2FTitanic-Dataset.csv?alt=media\&token=8af4107f-c0b2-4711-8553-0f5ff17cfc26)

#### Langkah 1 - Load Data

Import library yang dibutuhkan kemudian, load data kedalam DataFrame Pandas.

```python
import pandas as pd

data = 'Training-Dataset.csv' # path dataset
df = pd.read_csv(data) # load dataset
```

jika menggunakan colab, kita harus upload datanya dulu ke colab, baru kemudian bisa diakses

```python

from google.colab import files
uploaded = files.upload() # upload dataset
```

```python
import pandas as pd
import io

df = pd.read_csv(io.BytesIO(uploaded['NamaFile.format'])) # load dataset
```

Tampilkan data teratas dengan perintah df.head()

```python
df.head()
```

Maka akan muncul tampilan seperti dibawah ini

<figure><img src="https://1473714265-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fhh7WzzoZbeFX9VC0bZSU%2Fuploads%2FMJOS357EnFRYZmpo8RDi%2Ftitanic.png?alt=media&#x26;token=d56fcea1-e16d-4411-80ea-1e48f3611f69" alt=""><figcaption></figcaption></figure>

#### Langkah 2 - Pengecekan Data

Lakukan pengecekan informasi mengenai data dengan menggunakan `df.info()`

```
df.info()
```

Perhatikan hasil dari perintah yang telah dijalankan.

<pre><code>&#x3C;class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 <a data-footnote-ref href="#user-content-fn-1">5   Age          714 non-null    float64</a>
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 <a data-footnote-ref href="#user-content-fn-1">10  Cabin        204 non-null    object</a> 
 <a data-footnote-ref href="#user-content-fn-1">11  Embarked     889 non-null    object</a> 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
</code></pre>

Dari `df.info()` kita dapat mengetahui jumlah data untuk setiap kolom. Selain itu, kita mengetahui bahwa,

* "Age" berjenis float64
* "Cabin" berjenis object
* "Embarked" berjenis object

***Pada Pandas, object sering kali mewaliki tipe data string. Kita harus cermat dalam hal ini. Hal ini berkaitan dengan teknik imputasi yang akan kita gunakan nantinya.***

Selanjutnya, untuk lebih mengetahui jumlah data yang hilang untuk setiap kolom, gunakan perintah,

```
df.isnull().sum()
```

Didapatkan informasi seperti berikut,

```
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
```

Dari informasi ini, kita dapat mengetahui data yang hilang sejumlah,

* 177 data "Age"
* 687 data "Cabin"
* 2 data "Embarked"

#### Langkah 3 - Imputasi

Pada langkah ini kita akan melakukan imputasi terdapat data yang hilang pada "Age", "Cabin", dan "Embarked".

Strategi yang akan kita gunakan adalah,

* "Age" --> Dikarenakan "Age" adalah data nominal, maka kita akan menggunakan strategi mean.
* "Cabin" --> "Cabin" merupakan informasi terkait dengan nomor kabin penumpang. Disini kita akan berasumsi bahwa, seluruh penumpang yang tidak memiliki nomor kabin, merupakan penumpang yang tinggal di dek-dek kapal. Sehingga kita akan mensubtitusi data yang hilang dengan informasi "DECK".
* "Embarked" --> "Embarked" merupakan informasi lokasi embarkasi penumpang. Hanya ada 2 data yang hilang disini. Dikarenakan data merupakan data nominal, maka kita dapat menggunakan modus (mode) untuk mensubtitusi data yang hilang.

```python
# Age - mean
df['Age'].fillna(value=df['Age'].mean(), inplace=True)

# Cabin - "DECK"
df['Cabin'].fillna(value="DECK", inplace=True)

# Embarked - modus
df['Embarked'].fillna(value=df['Embarked'].mode, inplace=True)
```

#### Langkah 4 - Validasi Hasil

Lakukan pengecekan kembali dengan `df.info()`. Selanjutnya, kita juga dapat memastikan kembali apakah nilai yang disikan sudah benar dengan melakukan pencekan data secara langsung. Hasil dari proses imputasi adalah sebagai berikut,

<figure><img src="https://1473714265-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fhh7WzzoZbeFX9VC0bZSU%2Fuploads%2FU6ME7cO5JaWTScpS1kPQ%2Fsliced.png?alt=media&#x26;token=4cd74059-777e-421c-910b-cf10d34557ab" alt=""><figcaption><p>Hasil Proses Imputasi</p></figcaption></figure>

### Langkah 5 - Ekstraksi Fitur

Setelah melakukan Pre-Processing, langkah berikutnya kita akan melakukan Ekstraksi Fitur berdasarkan Jumlah keluarga "Familysize", Gelar Jumlah keluarga "Title", kelompok usia "AgeBin", Tempat tiket "CabinDeck"

```notebook-python
import matplotlib.pyplot as plt
import seaborn as sns
```

```notebook-python
# === EKSTRAKSI FITUR ===

# 1. FamilySize: jumlah keluarga di kapal (SibSp + Parch + diri sendiri)
df["FamilySize"] = df["SibSp"] + df["Parch"] + 1

# 2. Title: ambil gelar dari kolom Name (Mr, Mrs, Miss, Master, dll.)
df["Title"] = df["Name"].str.extract(r',\s*([^\.]+)\.', expand=False)
title_mapping = {
    "Mlle": "Miss", "Ms": "Miss", "Mme": "Mrs",
    "Lady": "Rare", "Countess": "Rare", "Capt": "Rare", "Col": "Rare",
    "Don": "Rare", "Dr": "Rare", "Major": "Rare", "Rev": "Rare",
    "Sir": "Rare", "Jonkheer": "Rare", "Dona": "Rare"
}
df["Title"] = df["Title"].replace(title_mapping)

# 3. AgeBin: kelompokkan usia menjadi kategori
df["AgeBin"] = pd.cut(df["Age"], bins=[0, 12, 18, 35, 60, 100],
                      labels=["Child", "Teen", "YoungAdult", "Adult", "Senior"])

# 4. CabinDeck: ambil huruf pertama dari kolom Cabin
df["CabinDeck"] = df["Cabin"].astype(str).str[0]

# 5. Fare per person: bagi harga tiket dengan jumlah keluarga
df["FarePerPerson"] = df["Fare"] / df["FamilySize"]

print("✅ Hasil Ekstraksi fitur ")
df[["Name", "Title", "Age", "AgeBin", "FamilySize", "Cabin", "CabinDeck", "FarePerPerson"]].head()

```

```
✅ Hasil Ekstraksi Fitur
```

<figure><img src="https://3041032130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5CvtE8Xh9b75jKUaRr5Y%2Fuploads%2FV47XXxFECQyecTJUNA0Q%2FTabel%20Ekstraksi%20Fitur.jpg?alt=media&#x26;token=251cf167-d3f9-45f8-9809-e13095c7a3f8" alt=""><figcaption></figcaption></figure>

**Langkah 6 - Visualisasi Hasil Ektraksi Fitur**

```notebook-python
import seaborn as sns
import matplotlib.pyplot as plt

# === VISUALISASI FITUR HASIL EKSTRAKSI ===

plt.figure(figsize=(12, 6))
sns.barplot(x="FamilySize", y="Survived", data=df)
plt.title("Survival Rate berdasarkan Family Size")
plt.show()

plt.figure(figsize=(12, 6))
sns.barplot(x="Title", y="Survived", data=df,
            order=df.groupby("Title")["Survived"].mean().sort_values().index)
plt.title("Survival Rate berdasarkan Title")
plt.xticks(rotation=45)
plt.show()

plt.figure(figsize=(12, 6))
sns.barplot(x="AgeBin", y="Survived", data=df,
            order=["Child", "Teen", "YoungAdult", "Adult", "Senior"])
plt.title("Survival Rate berdasarkan Kelompok Usia (AgeBin)")
plt.show()

plt.figure(figsize=(12, 6))
sns.barplot(x="CabinDeck", y="Survived", data=df,
            order=df.groupby("CabinDeck")["Survived"].mean().sort_values().index)
plt.title("Survival Rate berdasarkan Cabin Deck")
plt.show()

```

Hasil dari visualisasi Ektraksi Fitur seperti tampilan di bawah ini

<figure><img src="https://3041032130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5CvtE8Xh9b75jKUaRr5Y%2Fuploads%2F1PTdCZuxXYKij7yM6n1M%2FGrafik%20hasil%20ektraksi%20Fitur.jpg?alt=media&#x26;token=2c502046-b9bd-4486-9ef5-3607fa404fa9" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3041032130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5CvtE8Xh9b75jKUaRr5Y%2Fuploads%2FRr35Odbawtxi5IrL9bHz%2FGrafik%20Hasil%20Ekstraksi%20Fitur2.jpg?alt=media&#x26;token=76cf9e08-d91f-48aa-ae37-013b237b6738" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3041032130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5CvtE8Xh9b75jKUaRr5Y%2Fuploads%2FQTqZBVLSzJlWMed4HIQJ%2FGrafik%20Hasil%20Ekstraksi%20Fitur3.jpg?alt=media&#x26;token=acca72f0-23e0-4105-ba58-a6fb9ce25c5d" alt=""><figcaption></figcaption></figure>

<figure><img src="https://3041032130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5CvtE8Xh9b75jKUaRr5Y%2Fuploads%2FYvsvX22OVXvzHvNDuxOH%2FGrafik%20Hasil%20Ekstraksi%20Fitur4.jpg?alt=media&#x26;token=60cccad9-2215-49f6-909a-e124730ea5b2" alt=""><figcaption></figcaption></figure>

### Kode Lengkap

{% file src="<https://3041032130-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F5CvtE8Xh9b75jKUaRr5Y%2Fuploads%2FjyqHvDYA0wvarJhbLVW5%2FModul03_1.ipynb?alt=media&token=e4d4cde6-b84e-4a31-8ca9-5fa213bdf55a>" %}

[^1]: Terdapat data yang hilang
