Housing Prices Competition

I Putu Teddy Dharma Wijaya

Sosial Media


1 orang menyukai ini
Suka

Summary

Housing Prices Competition for Kaggle Learn Users merupakan dataset yang disediakan oleh pihak Kaagle untuk belajar machine learning dengan lebih mendalam. Dataset ini terdiri dari 81 buah kolom dengan baris lebih dari 1.400. Hal ini tentunya dapat membuat proses data cleaning / data preprocessing menjadi cukup menantang dan begitu pun juga ketika modeling dengan model deep learning. 

Description

 

Dataset yang digunakan dalam portofolio ini merupakan dataset  Housing Prices yang dapat dilihat pada tautan https://www.kaggle.com/competitions/home-data-for-ml-course/overview . Dataset tersebut terdiri dari 81 kolom dan 1400 baris. 

Gambar 1 Library yang dibutuhkan 

Library yang dibutuhkan untuk project ini antara lain pandas untuk baca data, numpy untuk convert ke numpy array, matplollib untuk plotting dan seaborn untuk visualisasi serta sklearn untuk keperluan data splitting dan label encoder. Untuk membuat deep learning model saya menggunakan library tensorflow dengan alasan kemudahan penggunaan dan familiar dengan function di dalamnya. 

Gambar 2. Read data

Read dataset menggunakan pandas, dengan ini maka data csv akan di convert menjadi pandas dataframe

Gambar 3  Check Nulitas data

Check kolom mana saja yang masih berisi nilai null dengan menggunakan fungsi isnull.sum() kemudian lakukan sorting dengan menggunakan function sort_values dan set ascending = False dengan tujuan agar disorting dari yang tertinggi sampai ke rendah. 

Gambar  4. Hasil dari check null 

 Gambar 5. Gambar Heatmap untuk mengetahui korelasi 

 

Gambar 6. Heatmap yang dihasilkan 

Heatmap bertujuan untuk mengetahui korelasi dari masing masing kolom dengan tipe data numerik terhadap target yang sudah ditetapkan. Semakin tinggi suatu feature nilai korelasinya maka akan semakin berpengaruh terhadap target.  Pada project ini yang menjadi target adalah harga rumah / house price

Fungsi get_max_sequences_price(data: pd.DataFrame) menerima sebuah DataFrame sebagai parameter dan mengembalikan dua list: years dan prices. Pertama, fungsi ini mengelompokkan data berdasarkan kolom "YearBuilt" untuk mendapatkan jumlah rumah yang dibangun setiap tahun, lalu mengurutkan tahun-tahun tersebut berdasarkan jumlah rumah yang dibangun secara menurun dan memilih 23 tahun dengan jumlah rumah terbanyak. Tahun-tahun ini disimpan dalam list years. Selanjutnya, untuk setiap tahun dalam years, fungsi ini menginisialisasi list sementara temp untuk menyimpan harga rumah yang dibangun pada tahun tersebut. Menggunakan loop, fungsi ini memeriksa setiap baris data; jika tahun pembangunan rumah sesuai dengan tahun saat ini, harga rumah tersebut ditambahkan ke dalam temp. Setelah mengumpulkan semua harga rumah untuk tahun tersebut, fungsi ini mengurutkan harga-harga tersebut secara menurun dan menambahkannya ke dalam list prices. Fungsi ini akhirnya mengembalikan dua list: years dan prices.

Setelah mendefinisikan fungsi ini, kode memanggilnya dengan DataFrame data dan menyimpan hasilnya dalam years dan prices. Kemudian, kode membuat dua subplot menggunakan Matplotlib: satu untuk grafik garis dan satu untuk pie chart. Pada subplot pertama, untuk setiap tahun dan daftar harga yang sesuai dalam years dan prices, kode memilih 20 harga teratas dan memplotnya sebagai grafik garis, di mana sumbu x mewakili urutan harga (dari 1 hingga 20) dan sumbu y mewakili harga rumah. Setiap garis diberi label dengan tahun yang sesuai. Subplot ini diberi judul "Year Build vs Home Price", dengan sumbu x berlabel "Max price" dan sumbu y berlabel "Home Price".

Terlihat pada grafik yang di sebelah kiri dimana rumah dengan tahun yang lebih muda relatif memiliki harga yang condong tingggi dibandingkan dengan usia yang lebih tua  dan pada pie chart kedua menunjukkan bahwa data rumah produksi tahun 2005 dan 2006 adalah yang terbanyak dari sisi  distribusinya

Gambar 7.  Code visualisasi perbandingan OveralQual, GrLivArea, GarageArea dan TotalBsmtSFt terhadap SalePrice

Code diawali dengan pembuatan subplots untuk multi visualisasi dengan ukuran 20 x 10  dan banyak kolom = 2 serta baris  = 2. Lalu untuk plotting yang pertaama menggunakan plotting boxplot, lalu dilanjukan dengan scatterplot untuk sisanya 

Berdasarkan hasil visualisasi  didapatkan hasil bahwa OveralQuality sangat berpengaruh terhadap harga rumah dimana semakin tinggi overal quality maka harga akan cenderung meningkat.  Tak hanya itu rumah dengan nilai overal quality yang tinggi cenderung memilki ukuran ground living area, GarageArea dan TotalBsmtSFt (Total square feet of basement area)  yang lebih besar dibandingkan dengan rumah yang memiliki overal quality yang lebih rendah. 

Gambar 8.  Code visualisasi perbandingan ExterCond dan Exterior1st terhadap OveralQual

Hampir sama dengan yang sebelumnya diamana yang pertama adalah memnbuat subplots untuk multi plotting dan dillanjutkan dengan visulisasi subplot

Hal yang menarik dari visualisasi ini adalah baik dari kualitas rumah 5 - 10 memiliki kualitas garasi yang dominan TA (Average) dan kemudian dari sisi eksterior rumah, rumah dengan grade 5 - 10 juga dominan menunjukkan bahan yang paling banyak digunakan sama sehingga disimpulkan bahwa rumah dengan grade 5 - 10 memilki kondisi eksterior (ExterCond) dan kondisi Exterior (dalam)  yang hampir sama 

Gambar 9. Code visualisasi perbandingan Garage Features dan Sales Condition

Pertama, fungsi new_garage_area(data: pd.DataFrame) -> pd.DataFrame menambahkan kolom baru ke DataFrame yang ada, yaitu garage_range, untuk mengklasifikasikan luas garasi ke dalam tiga kategori: kurang dari 300 meter persegi, antara 300 dan 500 meter persegi, dan lebih dari 500 meter persegi. Fungsi ini menginisialisasi kolom garage_range dengan nilai default "0" untuk setiap baris. Selanjutnya, dengan menggunakan loop, fungsi ini memeriksa nilai GarageArea untuk setiap baris dan memperbarui kolom garage_range sesuai dengan kategori yang telah ditentukan. Setelah pengkategorian selesai, fungsi ini mengembalikan DataFrame yang telah diperbarui.

Setelah mengkategorikan luas garasi, DataFrame yang dihasilkan disimpan dalam variabel new_data. Kemudian, menggunakan library seaborn dan matplotlib, kode ini membuat figure yang berisi empat subplot dengan ukuran 20x12 inci. Judul umum untuk figure ini adalah "Garage Features vs Sales condition".

Setiap subplot adalah grafik bar yang menunjukkan hubungan antara berbagai fitur garasi dengan kondisi penjualan rumah.

Subplot pertama menampilkan jumlah rumah berdasarkan kondisi penjualan (SaleCondition) dan jumlah mobil yang dapat ditampung garasi (GarageCars). Subplot ini diberi judul "Garage Count vs House count".

Subplot kedua menunjukkan jumlah rumah berdasarkan kondisi penjualan dan kualitas garasi (GarageQual). Judul subplot ini adalah "Garage Quality vs House count".

Subplot ketiga menampilkan jumlah rumah berdasarkan kondisi penjualan dan kondisi garasi (GarageCond). Judulnya adalah "Garage Condition vs House count".

Subplot keempat menunjukkan jumlah rumah berdasarkan kondisi penjualan dan rentang luas garasi (garage_range). Subplot ini diberi judul "Garage Area Range vs House count".

Terlihat bahwa Rumah yang dalam keadaan normal saat sales condition memiliki variasi jumlah garasi yang bervariasi dibandingkan dengan yang lain namun didominasi dengan jumlah garasi yang sama dengan 2, rumah dengan tipe sales condition adjland tidak memiliki garasi sama sekali, rumah yang sales condition nya normal memiliki kualitas garasi dengan kualitas rata rata terbanyak dibandingkan dengan jenis sales condition yang lain namun masih ditemukan juga dengan kondisi garasi yang tidak baik dari sisi kualitasnya (poor), rumah dengan normal sales conditon juga menawarkan variasi luas garasi yang lebih beragam dibandingkan dengan yang lain, dan juga menawarkan garasi dengan luas terluas terbanyak dibandingkan dengan yang lain, sehingga sebagai kesimpulan untuk garage features, jika pembeli ingin memerhatikan kondisi garage maka disarankan untuk memilih rumah dengan tipe normal atau partial (yang sedang dibangun / belum selesai dibangun )

Gambar 10 GarageCars, GarageQual,garage_range, GarageCond terhadap Sale Price (Harga Rumah)

Berdasarkan visualisasi yang pertama rumah dengan jumlah garasi terbanyak dalam satu rumah adalah rumah dengan tipe “family” sedangkan rumah yang menawarkan jumlah variasi jumlah garasi terbanyak diungguli dari rumah dengan sales condition “Normal” sedangkan dari sisi kualitas rumah dengan kualitas garasi terbaik terbanyak adalah partial lalu normal.  Luas garasi tidak memiliki pengaruh signifikan pada harga yang dimana luas garasi > 500 m^2  tidak selalu lebih mahal dibandingkan rumah yang memiliki luas garasi yang < 300 m^2

Gambar 11.  Proses Preprocessing

Fungsi get_correlation(data) mengembalikan DataFrame yang berisi korelasi absolut antara setiap kolom dengan kolom SalePrice, diurutkan dari yang paling tinggi ke yang paling rendah. Fungsi ini menghitung matriks korelasi dari DataFrame, mengambil nilai absolut dari korelasi antara setiap kolom dengan SalePrice, kemudian mengurutkan nilai-nilai ini dalam urutan menurun.

Selanjutnya, fungsi drop_column_if_null(data: pd.DataFrame, correlation_score: pd.DataFrame, null_ranked: pd.DataFrame) menghapus kolom yang memiliki nilai null dengan korelasi kurang dari 0.30 terhadap SalePrice. Pertama, fungsi ini membuat daftar sementara temp untuk menyimpan kolom yang memiliki nilai null tetapi korelasi tinggi. Loop pertama memeriksa kolom-kolom yang memiliki nilai null, dan loop kedua memeriksa apakah kolom tersebut memiliki korelasi dengan SalePrice yang lebih rendah dari 0.30. Jika iya, kolom tersebut dihapus dari DataFrame. Kolom dengan korelasi tinggi ditambahkan ke daftar temp. Fungsi ini kemudian mengembalikan DataFrame yang sudah dimodifikasi beserta daftar temp.

Fungsi drop_columns(data: pd.DataFrame, correlation_score: pd.DataFrame) menghapus kolom-kolom yang korelasinya dengan SalePrice kurang dari 0.30. Dalam loopnya, fungsi ini memeriksa setiap kolom dalam DataFrame dan menghapusnya jika korelasinya dengan SalePrice berada di bawah ambang batas yang telah ditentukan.

Fungsi insert_null_row(data: pd.DataFrame, temp: list) mengisi nilai null dalam kolom yang tersisa dengan nilai rata-rata atau nilai lantai dari kolom tersebut, tergantung pada tipe data kolom. Untuk kolom numerik, fungsi ini menghitung nilai rata-rata dan mengisi nilai null dengan nilai tersebut. Untuk kolom bertipe integer, fungsi ini menggunakan nilai lantai dari rata-rata. Fungsi ini memastikan tidak ada nilai null yang tersisa dalam kolom yang dipertahankan.

Fungsi convert_object_to_numeric(data: pd.DataFrame) mengubah kolom bertipe object (biasanya kolom kategori) menjadi nilai numerik menggunakan LabelEncoder. Fungsi ini iteratif memeriksa setiap kolom dalam DataFrame dan mengubah kolom bertipe object menjadi nilai numerik, yang memungkinkan analisis lebih lanjut pada data tersebut.

Setelah mendefinisikan fungsi-fungsi ini, data diubah terlebih dahulu dengan memanggil convert_object_to_numeric(data) untuk mengonversi kolom kategori menjadi numerik. Selanjutnya, fungsi get_correlation(data_converted) digunakan untuk mendapatkan skor korelasi. Data yang baru diubah kemudian diproses oleh drop_column_if_null() untuk menghapus kolom yang memiliki nilai null dan korelasi rendah. Fungsi insert_null_row() mengisi nilai null yang tersisa dengan nilai yang sesuai. Akhirnya, drop_columns() memeriksa lagi dan menghapus kolom-kolom yang memiliki korelasi rendah, memastikan DataFrame akhir hanya mengandung kolom yang relevan untuk analisis lebih lanjut. DataFrame yang telah diproses ditampilkan dengan new_data_converted.head()

fungsi normalization(data: pd.DataFrame) -> pd.DataFrame melakukan normalisasi pada setiap kolom dalam DataFrame. Untuk setiap kolom, fungsi ini menemukan nilai maksimum dan membagi setiap nilai dalam kolom tersebut dengan nilai maksimum tersebut. Proses ini memastikan bahwa setiap nilai dalam DataFrame berada dalam rentang 0 hingga 1, yang dapat membantu meningkatkan kinerja model machine learning. Setelah normalisasi selesai, fungsi ini mengembalikan DataFrame yang telah dinormalisasi.

Selanjutnya, fungsi train_test_split_data(data: pd.DataFrame) memisahkan data menjadi fitur (X) dan target (y). Kolom SalePrice diambil sebagai target (y), sementara semua kolom lainnya diambil sebagai fitur (X). Fungsi ini kemudian menggunakan train_test_split dari scikit-learn untuk membagi data menjadi set pelatihan dan pengujian, dengan 80% data digunakan untuk pelatihan dan 20% untuk pengujian. Fungsi ini mengembalikan empat variabel: X_train, X_test, y_train, dan y_test.

Setelah normalisasi data menggunakan normalization(data=new_data_converted), data yang telah dinormalisasi kemudian dipisahkan menjadi set pelatihan dan pengujian menggunakan train_test_split_data(new_data_converted). Hasilnya adalah X_train, X_test, y_train, dan y_test.Selanjutnya, sebuah model neural network dibuat menggunakan TensorFlow dan Keras. Model ini terdiri dari tiga lapisan (layers) sesuai dengan yang ada pada gambar Model dikompilasi menggunakan optimizer adam dan fungsi loss mse (mean squared error), serta diukur dengan metrik mse.

Model ini kemudian dilatih menggunakan metode fit(), dengan X_train dan y_train sebagai data pelatihan, serta X_test dan y_test sebagai data validasi. Pelatihan dilakukan selama 100 epoch, yang berarti model akan melihat seluruh data pelatihan sebanyak 100 kali.

 

Source code tersedia di halaman : https://github.com/TeddyDharma/Home-Price

Informasi Course Terkait
  Kategori: Data Science / Big Data
  Course: Data Science SIB Batch 6