{ "nbformat": 4, "nbformat_minor": 2, "metadata": { "colab": { "name": "lesson_2-R.ipynb", "provenance": [], "collapsed_sections": [], "toc_visible": true }, "kernelspec": { "name": "ir", "display_name": "R" }, "language_info": { "name": "R" }, "coopTranslator": { "original_hash": "f3c335f9940cfd76528b3ef918b9b342", "translation_date": "2025-09-06T13:55:20+00:00", "source_file": "2-Regression/2-Data/solution/R/lesson_2-R.ipynb", "language_code": "tr" } }, "cells": [ { "cell_type": "markdown", "source": [ "# Bir regresyon modeli oluşturma: verileri hazırlama ve görselleştirme\n", "\n", "## **Balkabağı için Doğrusal Regresyon - Ders 2**\n", "#### Giriş\n", "\n", "Tidymodels ve Tidyverse ile makine öğrenimi modeli oluşturma sürecine başlamak için gerekli araçları kurduğunuza göre, artık verilerinizle ilgili sorular sormaya hazırsınız. Verilerle çalışırken ve ML çözümleri uygularken, veri setinizin potansiyelini doğru bir şekilde açığa çıkarmak için doğru soruyu nasıl soracağınızı anlamak çok önemlidir.\n", "\n", "Bu derste öğreneceksiniz:\n", "\n", "- Model oluşturma için verilerinizi nasıl hazırlayacağınızı.\n", "\n", "- Veri görselleştirme için `ggplot2`'yi nasıl kullanacağınızı.\n", "\n", "Cevaplanmasını istediğiniz soru, hangi tür ML algoritmalarını kullanacağınızı belirleyecektir. Ve alacağınız cevabın kalitesi, büyük ölçüde verilerinizin doğasına bağlı olacaktır.\n", "\n", "Bunu pratik bir alıştırma ile görelim.\n", "\n", "\n", "
\n",
" \n",
"
\n",
"\n",
"> Bir hatırlatma: Pipe operatörü (`%>%`), bir nesneyi ileriye doğru bir fonksiyona veya çağrı ifadesine geçirerek işlemleri mantıksal bir sırayla gerçekleştirir. Pipe operatörünü kodunuzda \"ve sonra\" demek gibi düşünebilirsiniz.\n"
],
"metadata": {
"id": "REWcIv9yX29v"
}
},
{
"cell_type": "markdown",
"source": [
"## 2. Eksik verileri kontrol et\n",
"\n",
"Veri bilimcilerin en sık karşılaştığı sorunlardan biri eksik veya kayıp verilerdir. R, eksik veya bilinmeyen değerleri özel bir işaret değeri olan `NA` (Not Available) ile temsil eder.\n",
"\n",
"Peki, veri çerçevesinde eksik değerler olduğunu nasıl anlayabiliriz?\n",
"
\n",
"- En basit yöntem, mantıksal nesneler `TRUE` veya `FALSE` döndüren temel R fonksiyonu `anyNA`yı kullanmaktır.\n"
],
"metadata": {
"id": "Zxfb3AM5YbUe"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" anyNA()"
],
"outputs": [],
"metadata": {
"id": "G--DQutAYltj"
}
},
{
"cell_type": "markdown",
"source": [
"Harika, bazı eksik veriler var gibi görünüyor! Bu başlamak için iyi bir yer.\n",
"\n",
"- Bir başka yöntem, hangi bireysel sütun elemanlarının eksik olduğunu `TRUE` mantıksal değeriyle gösteren `is.na()` fonksiyonunu kullanmaktır.\n"
],
"metadata": {
"id": "mU-7-SB6YokF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "W-DxDOR4YxSW"
}
},
{
"cell_type": "markdown",
"source": [
"Tamam, iş tamamlandı ancak bu kadar büyük bir veri çerçevesiyle, tüm satırları ve sütunları tek tek incelemek verimsiz ve pratikte imkansız olurdu😴.\n",
"\n",
"- Daha sezgisel bir yöntem, her sütundaki eksik değerlerin toplamını hesaplamak olacaktır:\n"
],
"metadata": {
"id": "xUWxipKYY0o7"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"pumpkins %>% \n",
" is.na() %>% \n",
" colSums()"
],
"outputs": [],
"metadata": {
"id": "ZRBWV6P9ZArL"
}
},
{
"cell_type": "markdown",
"source": [
"Çok daha iyi! Eksik veriler var, ancak belki de bu, yapılacak görev için önemli olmayabilir. Bakalım, daha fazla analiz ne ortaya çıkaracak.\n",
"\n",
"> R, harika paketler ve fonksiyonlar setlerinin yanı sıra çok iyi bir dokümantasyona sahiptir. Örneğin, `help(colSums)` veya `?colSums` kullanarak bu fonksiyon hakkında daha fazla bilgi edinebilirsiniz.\n"
],
"metadata": {
"id": "9gv-crB6ZD1Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 3. Dplyr: Veri Manipülasyonu için Bir Dilbilgisi\n",
"\n",
"
\n",
" \n",
"
\n"
],
"metadata": {
"id": "i5o33MQBZWWw"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::select()\n",
"\n",
"`select()` fonksiyonu, `dplyr` paketinde bulunan ve belirli sütunları seçmenize veya hariç tutmanıza yardımcı olan bir işlevdir.\n",
"\n",
"Veri çerçevenizi daha kolay çalışılabilir hale getirmek için, `select()` kullanarak ihtiyacınız olan sütunları tutup diğerlerini kaldırabilirsiniz.\n",
"\n",
"Örneğin, bu alıştırmada analizimiz `Package`, `Low Price`, `High Price` ve `Date` sütunlarını içerecek. Hadi bu sütunları seçelim.\n"
],
"metadata": {
"id": "x3VGMAGBZiUr"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Select desired columns\n",
"pumpkins <- pumpkins %>% \n",
" select(Package, `Low Price`, `High Price`, Date)\n",
"\n",
"\n",
"# Print data set\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "F_FgxQnVZnM0"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::mutate()\n",
"\n",
"`mutate()`, `dplyr` paketinde bulunan ve mevcut sütunları korurken yeni sütunlar oluşturmanıza veya mevcut sütunları değiştirmenize yardımcı olan bir fonksiyondur.\n",
"\n",
"`mutate` fonksiyonunun genel yapısı şu şekildedir:\n",
"\n",
"`data %>% mutate(yeni_sutun_adi = icerigi)`\n",
"\n",
"`mutate` fonksiyonunu `Date` sütunu üzerinde şu işlemleri yaparak deneyelim:\n",
"\n",
"1. Tarihleri (şu anda karakter türünde) ay formatına dönüştürün (bunlar ABD tarih formatında, yani `MM/DD/YYYY`).\n",
"\n",
"2. Tarihlerden ay bilgisini çıkararak yeni bir sütuna ekleyin.\n",
"\n",
"R dilinde, [lubridate](https://lubridate.tidyverse.org/) paketi Tarih-Zaman verileriyle çalışmayı kolaylaştırır. Bu nedenle, yukarıdaki hedeflere ulaşmak için `dplyr::mutate()`, `lubridate::mdy()`, `lubridate::month()` fonksiyonlarını kullanalım. Date sütununu, sonraki işlemlerde artık ihtiyaç duymayacağımız için kaldırabiliriz.\n"
],
"metadata": {
"id": "2KKo0Ed9Z1VB"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load lubridate\n",
"library(lubridate)\n",
"\n",
"pumpkins <- pumpkins %>% \n",
" # Convert the Date column to a date object\n",
" mutate(Date = mdy(Date)) %>% \n",
" # Extract month from Date\n",
" mutate(Month = month(Date)) %>% \n",
" # Drop Date column\n",
" select(-Date)\n",
"\n",
"# View the first few rows\n",
"pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "5joszIVSZ6xe"
}
},
{
"cell_type": "markdown",
"source": [
"Woohoo! 🤩\n",
"\n",
"Şimdi, bir yeni sütun olan `Price` oluşturalım. Bu sütun, bir kabağın ortalama fiyatını temsil ediyor. Şimdi, `Low Price` ve `High Price` sütunlarının ortalamasını alarak yeni Price sütununu dolduralım.\n",
"
\n"
],
"metadata": {
"id": "nIgLjNMCZ-6Y"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new column Price\n",
"pumpkins <- pumpkins %>% \n",
" mutate(Price = (`Low Price` + `High Price`)/2)\n",
"\n",
"# View the first few rows of the data\n",
"pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "Zo0BsqqtaJw2"
}
},
{
"cell_type": "markdown",
"source": [
"Evet!💪\n",
"\n",
"\"Ama dur bir dakika!\", tüm veri setini `View(pumpkins)` ile hızlıca gözden geçirdikten sonra diyeceksiniz ki, \"Burada bir gariplik var!\"🤔\n",
"\n",
"Eğer `Package` sütununa bakarsanız, kabakların birçok farklı şekilde satıldığını göreceksiniz. Bazıları `1 1/9 bushel` ölçüsünde, bazıları `1/2 bushel` ölçüsünde, bazıları kabak başına, bazıları pound başına, ve bazıları da farklı genişliklerde büyük kutular içinde satılıyor.\n",
"\n",
"Hadi bunu doğrulayalım:\n"
],
"metadata": {
"id": "p77WZr-9aQAR"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Verify the distinct observations in Package column\n",
"pumpkins %>% \n",
" distinct(Package)"
],
"outputs": [],
"metadata": {
"id": "XISGfh0IaUy6"
}
},
{
"cell_type": "markdown",
"source": [
"Harika!👏\n",
"\n",
"Balkabaklarını tutarlı bir şekilde tartmak oldukça zor görünüyor, bu yüzden onları filtreleyelim. Bunun için `Package` sütununda *bushel* kelimesini içeren balkabaklarını seçip yeni bir veri çerçevesi olan `new_pumpkins` içine koyalım.\n"
],
"metadata": {
"id": "7sMjiVujaZxY"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::filter() ve stringr::str_detect()\n",
"\n",
"[`dplyr::filter()`](https://dplyr.tidyverse.org/reference/filter.html): Verilerin yalnızca **satırlarının** koşullarınızı sağladığı bir alt kümesini oluşturur, bu durumda `Package` sütununda *bushel* kelimesini içeren kabaklar.\n",
"\n",
"[stringr::str_detect()](https://stringr.tidyverse.org/reference/str_detect.html): Bir dizgede bir desenin varlığını veya yokluğunu algılar.\n",
"\n",
"[`stringr`](https://github.com/tidyverse/stringr) paketi, yaygın dizge işlemleri için basit fonksiyonlar sağlar.\n"
],
"metadata": {
"id": "L8Qfcs92ageF"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Retain only pumpkins with \"bushel\"\n",
"new_pumpkins <- pumpkins %>% \n",
" filter(str_detect(Package, \"bushel\"))\n",
"\n",
"# Get the dimensions of the new data\n",
"dim(new_pumpkins)\n",
"\n",
"# View a few rows of the new data\n",
"new_pumpkins %>% \n",
" slice_head(n = 5)"
],
"outputs": [],
"metadata": {
"id": "hy_SGYREampd"
}
},
{
"cell_type": "markdown",
"source": [
"Kabakları kile ile içeren yaklaşık 415 satıra kadar daralttığımızı görebilirsiniz.🤩\n",
"
\n"
],
"metadata": {
"id": "VrDwF031avlR"
}
},
{
"cell_type": "markdown",
"source": [
"#### dplyr::case_when()\n",
"\n",
"**Ama durun! Yapılacak bir şey daha var**\n",
"\n",
"Her satırda buşel miktarının değiştiğini fark ettiniz mi? Fiyatlandırmayı normalize etmeniz gerekiyor, böylece fiyatlandırmayı 1 1/9 veya 1/2 buşel yerine buşel başına gösterebilirsiniz. Şimdi fiyatları standartlaştırmak için biraz matematik yapma zamanı.\n",
"\n",
"Fiyat sütununu bazı koşullara bağlı olarak *değiştirmek* için [`case_when()`](https://dplyr.tidyverse.org/reference/case_when.html) fonksiyonunu kullanacağız. `case_when`, birden fazla `if_else()` ifadesini vektörleştirmenize olanak tanır.\n"
],
"metadata": {
"id": "mLpw2jH4a0tx"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Convert the price if the Package contains fractional bushel values\n",
"new_pumpkins <- new_pumpkins %>% \n",
" mutate(Price = case_when(\n",
" str_detect(Package, \"1 1/9\") ~ Price/(1 + 1/9),\n",
" str_detect(Package, \"1/2\") ~ Price/(1/2),\n",
" TRUE ~ Price))\n",
"\n",
"# View the first few rows of the data\n",
"new_pumpkins %>% \n",
" slice_head(n = 30)"
],
"outputs": [],
"metadata": {
"id": "P68kLVQmbM6I"
}
},
{
"cell_type": "markdown",
"source": [
"Şimdi, bushel ölçümüne göre birim fiyat analizini yapabiliriz. Ancak, tüm bu kabak bushel'leri üzerine yapılan çalışma, `verinizin doğasını anlamanın` ne kadar `önemli` olduğunu gösteriyor!\n",
"\n",
"> ✅ [The Spruce Eats](https://www.thespruceeats.com/how-much-is-a-bushel-1389308)'e göre, bir bushel'in ağırlığı ürün türüne bağlıdır çünkü bu bir hacim ölçüsüdür. \"Örneğin, bir domates bushel'i 56 pound ağırlığında olmalı... Yapraklar ve yeşillikler daha az ağırlıkla daha fazla alan kaplar, bu yüzden bir ıspanak bushel'i sadece 20 pound'dur.\" Oldukça karmaşık bir konu! Bushel'den pound'a dönüşüm yapmaya uğraşmayalım, bunun yerine bushel üzerinden fiyatlandırma yapalım. Ancak, tüm bu kabak bushel'leri üzerine yapılan çalışma, verinizin doğasını anlamanın ne kadar önemli olduğunu gösteriyor!\n",
">\n",
"> ✅ Yarım bushel ile satılan kabakların çok pahalı olduğunu fark ettiniz mi? Nedenini çözebilir misiniz? İpucu: Küçük kabaklar büyük olanlardan çok daha pahalıdır, muhtemelen bir bushel'de daha fazla yer kapladıkları için. Büyük, içi boş bir turta kabağının kapladığı kullanılmayan alan nedeniyle bushel başına daha fazla küçük kabak bulunur.\n"
],
"metadata": {
"id": "pS2GNPagbSdb"
}
},
{
"cell_type": "markdown",
"source": [
"Son olarak, sırf macera olsun diye 💁♀️, Haydi Ay sütununu da ilk sıraya, yani `Package` sütununun `öncesine` taşıyalım.\n",
"\n",
"Sütunların yerini değiştirmek için `dplyr::relocate()` kullanılır.\n"
],
"metadata": {
"id": "qql1SowfbdnP"
}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Create a new data frame new_pumpkins\n",
"new_pumpkins <- new_pumpkins %>% \n",
" relocate(Month, .before = Package)\n",
"\n",
"new_pumpkins %>% \n",
" slice_head(n = 7)"
],
"outputs": [],
"metadata": {
"id": "JJ1x6kw8bixF"
}
},
{
"cell_type": "markdown",
"source": [
"Tebrikler! 👌 Artık yeni regresyon modelinizi oluşturabileceğiniz temiz ve düzenli bir veri kümesine sahipsiniz! \n",
"
\n"
],
"metadata": {
"id": "y8TJ0Za_bn5Y"
}
},
{
"cell_type": "markdown",
"source": [
"## 4. ggplot2 ile Veri Görselleştirme\n",
"\n",
"
\n",
" \n",
"