You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/tr/5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb

493 lines
27 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"cells": [
{
"cell_type": "markdown",
"source": [
"## **Spotify'den Toplanan Nijerya Müziği - Bir Analiz**\n",
"\n",
"Kümeleme, bir tür [Denetimsiz Öğrenme](https://wikipedia.org/wiki/Unsupervised_learning) yöntemidir ve bir veri setinin etiketlenmemiş olduğunu veya girdilerinin önceden tanımlanmış çıktılarla eşleşmediğini varsayar. Bu yöntem, çeşitli algoritmalar kullanarak etiketlenmemiş verileri analiz eder ve verideki desenlere göre gruplamalar sağlar.\n",
"\n",
"[**Ders öncesi test**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/27/)\n",
"\n",
"### **Giriş**\n",
"\n",
"[Kümeleme](https://link.springer.com/referenceworkentry/10.1007%2F978-0-387-30164-8_124), veri keşfi için oldukça faydalıdır. Nijeryalı dinleyicilerin müzik tüketim alışkanlıklarında trendleri ve desenleri keşfetmeye yardımcı olup olamayacağını görelim.\n",
"\n",
"> ✅ Kümelemenin kullanım alanlarını düşünmek için bir dakika ayırın. Gerçek hayatta, kümeleme çamaşır yığınınızı aile üyelerinizin kıyafetlerine göre ayırmanız gerektiğinde gerçekleşir 🧦👕👖🩲. Veri biliminde ise, kümeleme bir kullanıcının tercihlerini analiz ederken veya etiketlenmemiş bir veri setinin özelliklerini belirlerken gerçekleşir. Kümeleme, bir anlamda, kaosu anlamlandırmaya yardımcı olur, tıpkı bir çorap çekmecesi gibi.\n",
"\n",
"Profesyonel bir ortamda, kümeleme pazar segmentasyonu belirlemek, örneğin hangi yaş gruplarının hangi ürünleri satın aldığını anlamak için kullanılabilir. Bir diğer kullanım alanı ise anomali tespiti olabilir; örneğin, kredi kartı işlemleri veri setinden dolandırıcılığı tespit etmek. Ya da tıbbi taramalardaki tümörleri belirlemek için kümeleme kullanılabilir.\n",
"\n",
"✅ Bankacılık, e-ticaret veya iş dünyasında 'doğada' kümelemeyle karşılaştığınız durumları düşünmek için bir dakika ayırın.\n",
"\n",
"> 🎓 İlginç bir şekilde, kümeleme analizi 1930'larda Antropoloji ve Psikoloji alanlarında ortaya çıkmıştır. Sizce o zamanlar nasıl kullanılmış olabilir?\n",
"\n",
"Alternatif olarak, arama sonuçlarını gruplamak için kullanılabilir - örneğin alışveriş bağlantıları, görseller veya incelemeler. Kümeleme, büyük bir veri setini küçültmek ve daha ayrıntılı analiz yapmak istediğinizde faydalıdır, bu nedenle diğer modeller oluşturulmadan önce veri hakkında bilgi edinmek için kullanılabilir.\n",
"\n",
"✅ Verileriniz kümeler halinde organize edildikten sonra, her birine bir küme kimliği atarsınız. Bu teknik, bir veri setinin gizliliğini korumak için faydalı olabilir; bir veri noktasına daha açıklayıcı ve tanımlayıcı veriler yerine küme kimliğiyle atıfta bulunabilirsiniz. Küme kimliğiyle diğer küme öğelerine atıfta bulunmak yerine başka nedenler düşünebilir misiniz?\n",
"\n",
"### Kümelemeye Başlangıç\n",
"\n",
"> 🎓 Kümeleri nasıl oluşturduğumuz, veri noktalarını gruplara nasıl topladığımızla yakından ilgilidir. Bazı terimleri açalım:\n",
">\n",
"> 🎓 ['Transdüktif' vs. 'indüktif'](https://wikipedia.org/wiki/Transduction_(machine_learning))\n",
">\n",
"> Transdüktif çıkarım, belirli test durumlarına eşlenen gözlemlenen eğitim durumlarından türetilir. İndüktif çıkarım ise genel kurallara eşlenen eğitim durumlarından türetilir ve bu kurallar yalnızca test durumlarına uygulanır.\n",
">\n",
"> Bir örnek: Elinizde yalnızca kısmen etiketlenmiş bir veri seti olduğunu hayal edin. Bazı şeyler 'plak', bazıları 'cd' ve bazıları boş. Göreviniz, boş olanlara etiket vermektir. İndüktif bir yaklaşım seçerseniz, 'plak' ve 'cd' arayan bir model eğitirsiniz ve bu etiketleri etiketlenmemiş verinize uygularsınız. Bu yaklaşım, aslında 'kaset' olan şeyleri sınıflandırmakta zorlanır. Transdüktif bir yaklaşım ise bu bilinmeyen veriyi daha etkili bir şekilde ele alır, benzer öğeleri gruplandırır ve ardından bir gruba etiket uygular. Bu durumda, kümeler 'yuvarlak müzik şeyleri' ve 'kare müzik şeyleri' gibi görünebilir.\n",
">\n",
"> 🎓 ['Düz' vs. 'düz olmayan' geometriler](https://datascience.stackexchange.com/questions/52260/terminology-flat-geometry-in-the-context-of-clustering)\n",
">\n",
"> Matematiksel terminolojiden türetilen düz ve düz olmayan geometriler, noktalar arasındaki mesafelerin 'düz' ([Öklid](https://wikipedia.org/wiki/Euclidean_geometry)) veya 'düz olmayan' (Öklid dışı) geometrik yöntemlerle ölçülmesini ifade eder.\n",
">\n",
"> Bu bağlamda 'düz', Öklid geometrisini (bazı bölümleri 'düzlem' geometrisi olarak öğretilir) ifade ederken, 'düz olmayan' Öklid dışı geometriyi ifade eder. Geometri, makine öğrenimiyle nasıl ilişkilidir? Matematiğe dayalı iki alan olarak, kümelerdeki noktalar arasındaki mesafeleri ölçmek için ortak bir yol bulunmalıdır ve bu, verinin doğasına bağlı olarak 'düz' veya 'düz olmayan' şekilde yapılabilir. [Öklid mesafeleri](https://wikipedia.org/wiki/Euclidean_distance), iki nokta arasındaki doğru parçasının uzunluğu olarak ölçülür. [Öklid dışı mesafeler](https://wikipedia.org/wiki/Non-Euclidean_geometry) ise bir eğri boyunca ölçülür. Verileriniz görselleştirildiğinde bir düzlemde bulunmuyorsa, bunu ele almak için özel bir algoritma kullanmanız gerekebilir.\n",
"\n",
"<p>\n",
" <img src=\"../../images/flat-nonflat.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Dasani Madipalli tarafından hazırlanan infografik</figcaption>\n",
"\n",
"> 🎓 ['Mesafeler'](https://web.stanford.edu/class/cs345a/slides/12-clustering.pdf)\n",
">\n",
"> Kümeler, mesafe matrisleriyle tanımlanır, örneğin noktalar arasındaki mesafeler. Bu mesafe birkaç şekilde ölçülebilir. Öklid kümeleri, nokta değerlerinin ortalamasıyla tanımlanır ve bir 'merkez' veya merkez noktası içerir. Mesafeler, bu merkeze olan uzaklıkla ölçülür. Öklid dışı mesafeler ise 'clustroid' olarak adlandırılan, diğer noktalara en yakın noktayı ifade eder. Clustroid'ler çeşitli şekillerde tanımlanabilir.\n",
">\n",
"> 🎓 ['Kısıtlı'](https://wikipedia.org/wiki/Constrained_clustering)\n",
">\n",
"> [Kısıtlı Kümeleme](https://web.cs.ucdavis.edu/~davidson/Publications/ICDMTutorial.pdf), bu denetimsiz yönteme 'yarı denetimli' öğrenme ekler. Noktalar arasındaki ilişkiler 'bağlanamaz' veya 'bağlanmalı' olarak işaretlenir, böylece veri setine bazı kurallar uygulanır.\n",
">\n",
"> Bir örnek: Bir algoritma etiketlenmemiş veya yarı etiketlenmiş bir veri setinde serbest bırakılırsa, ürettiği kümeler düşük kaliteli olabilir. Yukarıdaki örnekte, kümeler 'yuvarlak müzik şeyleri', 'kare müzik şeyleri', 'üçgen şeyler' ve 'kurabiyeler' olarak gruplandırılabilir. Eğer algoritmaya bazı kısıtlamalar veya kurallar verilirse (\"öğe plastikten yapılmış olmalı\", \"öğe müzik üretebilmelidir\"), bu algoritmanın daha iyi seçimler yapmasına yardımcı olabilir.\n",
">\n",
"> 🎓 'Yoğunluk'\n",
">\n",
"> 'Gürültülü' olarak kabul edilen veri 'yoğun' olarak değerlendirilir. Kümelerindeki noktalar arasındaki mesafeler, incelendiğinde daha az veya daha çok yoğun, yani 'kalabalık' olabilir ve bu veri uygun kümeleme yöntemiyle analiz edilmelidir. [Bu makale](https://www.kdnuggets.com/2020/02/understanding-density-based-clustering.html), düzensiz küme yoğunluğuna sahip gürültülü bir veri setini keşfetmek için K-Means kümeleme ve HDBSCAN algoritmalarını kullanmanın farkını göstermektedir.\n",
"\n",
"Kümeleme tekniklerini daha iyi anlamak için bu [Öğrenme modülünü](https://docs.microsoft.com/learn/modules/train-evaluate-cluster-models?WT.mc_id=academic-77952-leestott) inceleyin.\n",
"\n",
"### **Kümeleme Algoritmaları**\n",
"\n",
"100'den fazla kümeleme algoritması vardır ve bunların kullanımı, eldeki verinin doğasına bağlıdır. Önemli olanlardan bazılarını tartışalım:\n",
"\n",
"- **Hiyerarşik kümeleme**. Bir nesne, yakınındaki bir nesneye olan yakınlığına göre sınıflandırıldığında, kümeler üyelerinin diğer nesnelere olan mesafelerine göre oluşturulur. Hiyerarşik kümeleme, iki kümeyi tekrar tekrar birleştirerek karakterize edilir.\n",
"\n",
"<p>\n",
" <img src=\"../../images/hierarchical.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Dasani Madipalli tarafından hazırlanan infografik</figcaption>\n",
"\n",
"- **Merkez kümeleme**. Bu popüler algoritma, oluşturulacak küme sayısını ('k') seçmeyi gerektirir, ardından algoritma bir kümenin merkez noktasını belirler ve veriyi bu nokta etrafında toplar. [K-means kümeleme](https://wikipedia.org/wiki/K-means_clustering), önceden tanımlanmış K gruplarına bir veri setini ayıran popüler bir merkez kümeleme versiyonudur. Merkez, en yakın ortalama ile belirlenir, bu nedenle adı buradan gelir. Kümeden olan kare mesafesi minimize edilir.\n",
"\n",
"<p>\n",
" <img src=\"../../images/centroid.png\"\n",
" width=\"600\"/>\n",
" <figcaption>Dasani Madipalli tarafından hazırlanan infografik</figcaption>\n",
"\n",
"- **Dağılım tabanlı kümeleme**. İstatistiksel modellemeye dayalı olan dağılım tabanlı kümeleme, bir veri noktasının bir kümeye ait olma olasılığını belirler ve buna göre atama yapar. Gaussian karışım yöntemleri bu türe aittir.\n",
"\n",
"- **Yoğunluk tabanlı kümeleme**. Veri noktaları, yoğunluklarına veya birbirleri etrafındaki gruplarına göre kümelere atanır. Gruptan uzak olan veri noktaları, aykırı değerler veya gürültü olarak kabul edilir. DBSCAN, Mean-shift ve OPTICS bu tür kümelemeye aittir.\n",
"\n",
"- **Izgara tabanlı kümeleme**. Çok boyutlu veri setleri için bir ızgara oluşturulur ve veri, ızgaranın hücreleri arasında bölünerek kümeler oluşturulur.\n",
"\n",
"Kümelemeyi öğrenmenin en iyi yolu, onu kendiniz denemektir, bu yüzden bu alıştırmada bunu yapacaksınız.\n",
"\n",
"Bu modülü tamamlamak için bazı paketlere ihtiyacımız olacak. Şu şekilde yükleyebilirsiniz: `install.packages(c('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork'))`\n",
"\n",
"Alternatif olarak, aşağıdaki script eksik olan paketleri kontrol eder ve bu modülü tamamlamak için gerekenleri sizin için yükler.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"suppressWarnings(if(!require(\"pacman\")) install.packages(\"pacman\"))\r\n",
"\r\n",
"pacman::p_load('tidyverse', 'tidymodels', 'DataExplorer', 'summarytools', 'plotly', 'paletteer', 'corrplot', 'patchwork')\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"## Alıştırma - Verilerinizi kümeleyin\n",
"\n",
"Kümeleme tekniği, doğru görselleştirme ile büyük ölçüde desteklenir, bu yüzden müzik verilerimizi görselleştirerek başlayalım. Bu alıştırma, bu verilerin doğasına en uygun kümeleme yöntemini seçmemize yardımcı olacak.\n",
"\n",
"Verileri içe aktararak işe koyulalım.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Load the core tidyverse and make it available in your current R session\r\n",
"library(tidyverse)\r\n",
"\r\n",
"# Import the data into a tibble\r\n",
"df <- read_csv(file = \"https://raw.githubusercontent.com/microsoft/ML-For-Beginners/main/5-Clustering/data/nigerian-songs.csv\")\r\n",
"\r\n",
"# View the first 5 rows of the data set\r\n",
"df %>% \r\n",
" slice_head(n = 5)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Bazen verilerimiz hakkında biraz daha fazla bilgiye ihtiyaç duyabiliriz. `data` ve `yapısını` [*glimpse()*](https://pillar.r-lib.org/reference/glimpse.html) fonksiyonunu kullanarak inceleyebiliriz:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Glimpse into the data set\r\n",
"df %>% \r\n",
" glimpse()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"İyi iş!💪\n",
"\n",
"`glimpse()` fonksiyonunun, toplam satır (gözlem) ve sütun (değişken) sayısını verdiğini, ardından değişken adından sonra her bir değişkenin ilk birkaç girişini satır halinde gösterdiğini gözlemleyebiliriz. Ayrıca, değişkenin *veri tipi* her değişken adının hemen ardından `< >` içinde belirtilir.\n",
"\n",
"`DataExplorer::introduce()` bu bilgiyi düzenli bir şekilde özetleyebilir:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe basic information for our data\r\n",
"df %>% \r\n",
" introduce()\r\n",
"\r\n",
"# A visual display of the same\r\n",
"df %>% \r\n",
" plot_intro()\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Harika! Verilerimizde eksik değer olmadığını yeni öğrendik.\n",
"\n",
"Bu sırada, yaygın merkezi eğilim istatistiklerini (örneğin [ortalama](https://en.wikipedia.org/wiki/Arithmetic_mean) ve [medyan](https://en.wikipedia.org/wiki/Median)) ve dağılım ölçülerini (örneğin [standart sapma](https://en.wikipedia.org/wiki/Standard_deviation)) `summarytools::descr()` kullanarak inceleyebiliriz.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Describe common statistics\r\n",
"df %>% \r\n",
" descr(stats = \"common\")\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Hadi verilerin genel değerlerine bir göz atalım. Popülerliğin `0` olabileceğini unutmayın, bu sıfır sıralamaya sahip şarkıları gösterir. Bunları birazdan kaldıracağız.\n",
"\n",
"> 🤔 Eğer etiketlenmiş verilere ihtiyaç duymayan, denetimsiz bir yöntem olan kümeleme ile çalışıyorsak, neden bu verileri etiketlerle gösteriyoruz? Veri keşfi aşamasında bu etiketler işe yarar, ancak kümeleme algoritmalarının çalışması için gerekli değildir.\n",
"\n",
"### 1. Popüler türleri keşfet\n",
"\n",
"Hadi en popüler türleri 🎶 bulalım ve göründükleri örneklerin sayısını hesaplayalım.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Popular genres\r\n",
"top_genres <- df %>% \r\n",
" count(artist_top_genre, sort = TRUE) %>% \r\n",
"# Encode to categorical and reorder the according to count\r\n",
" mutate(artist_top_genre = factor(artist_top_genre) %>% fct_inorder())\r\n",
"\r\n",
"# Print the top genres\r\n",
"top_genres\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Bu iyi gitti! Bir resmin binlerce veri çerçevesi satırına bedel olduğu söylenir (aslında kimse bunu söylemez 😅). Ama ne demek istediğimi anladınız, değil mi?\n",
"\n",
"Kategorik verileri (karakter veya faktör değişkenleri) görselleştirmenin bir yolu çubuk grafikler kullanmaktır. Haydi, en popüler 10 türün çubuk grafiğini oluşturalım:\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Change the default gray theme\r\n",
"theme_set(theme_light())\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Şimdi `eksik` türlerin olduğunu fark etmek çok daha kolay 🧐!\n",
"\n",
"> İyi bir görselleştirme, beklemediğiniz şeyleri size gösterebilir veya veri hakkında yeni sorular ortaya çıkarabilir - Hadley Wickham ve Garrett Grolemund, [R For Data Science](https://r4ds.had.co.nz/introduction.html)\n",
"\n",
"Not: En üst tür `Eksik` olarak tanımlandığında, bu Spotify'ın onu sınıflandırmadığı anlamına gelir, bu yüzden ondan kurtulalım.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Visualize popular genres\r\n",
"top_genres %>%\r\n",
" filter(artist_top_genre != \"Missing\") %>% \r\n",
" slice(1:10) %>% \r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"rcartocolor::Vivid\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5),\r\n",
" # Rotates the X markers (so we can read them)\r\n",
" axis.text.x = element_text(angle = 90))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Veriler üzerinde yapılan küçük bir keşif sonucunda, en üst üç türün bu veri setine hakim olduğunu öğreniyoruz. Hadi `afro dancehall`, `afropop` ve `nigerian pop` türlerine odaklanalım, ayrıca veri setini filtreleyerek popülerlik değeri 0 olan her şeyi kaldıralım (bu, veri setinde popülerlik ile sınıflandırılmamış ve bizim amaçlarımız için gürültü olarak kabul edilebilir anlamına gelir):\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"nigerian_songs <- df %>% \r\n",
" # Concentrate on top 3 genres\r\n",
" filter(artist_top_genre %in% c(\"afro dancehall\", \"afropop\",\"nigerian pop\")) %>% \r\n",
" # Remove unclassified observations\r\n",
" filter(popularity != 0)\r\n",
"\r\n",
"\r\n",
"\r\n",
"# Visualize popular genres\r\n",
"nigerian_songs %>%\r\n",
" count(artist_top_genre) %>%\r\n",
" ggplot(mapping = aes(x = artist_top_genre, y = n,\r\n",
" fill = artist_top_genre)) +\r\n",
" geom_col(alpha = 0.8) +\r\n",
" paletteer::scale_fill_paletteer_d(\"ggsci::category10_d3\") +\r\n",
" ggtitle(\"Top genres\") +\r\n",
" theme(plot.title = element_text(hjust = 0.5))\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Veri setimizdeki sayısal değişkenler arasında belirgin bir doğrusal ilişki olup olmadığını görelim. Bu ilişki, matematiksel olarak [korelasyon istatistiği](https://en.wikipedia.org/wiki/Correlation) ile ölçülür.\n",
"\n",
"Korelasyon istatistiği, -1 ile 1 arasında bir değer alır ve ilişkinin gücünü gösterir. 0'ın üzerindeki değerler *pozitif* bir korelasyonu ifade eder (bir değişkenin yüksek değerleri genellikle diğer değişkenin yüksek değerleriyle örtüşür), 0'ın altındaki değerler ise *negatif* bir korelasyonu ifade eder (bir değişkenin yüksek değerleri genellikle diğer değişkenin düşük değerleriyle örtüşür).\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Narrow down to numeric variables and fid correlation\r\n",
"corr_mat <- nigerian_songs %>% \r\n",
" select(where(is.numeric)) %>% \r\n",
" cor()\r\n",
"\r\n",
"# Visualize correlation matrix\r\n",
"corrplot(corr_mat, order = 'AOE', col = c('white', 'black'), bg = 'gold2') \r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Veriler güçlü bir şekilde ilişkili değil, sadece `energy` ve `loudness` arasında bir bağlantı var, ki bu mantıklı, çünkü yüksek sesli müzik genellikle oldukça enerjik olur. `Popularity` ile `release date` arasında bir ilişki var, bu da mantıklı, çünkü daha yeni şarkılar muhtemelen daha popülerdir. Uzunluk ve enerji arasında da bir korelasyon olduğu görülüyor.\n",
"\n",
"Bu verilerle bir kümeleme algoritmasının neler yapabileceğini görmek ilginç olacak!\n",
"\n",
"> 🎓 Korelasyonun nedensellik anlamına gelmediğini unutmayın! Korelasyonun kanıtına sahibiz, ancak nedenselliğin kanıtına sahip değiliz. Bu noktayı vurgulayan bazı görsellerin bulunduğu [eğlenceli bir web sitesi](https://tylervigen.com/spurious-correlations) var.\n",
"\n",
"### 2. Veri dağılımını keşfet\n",
"\n",
"Daha ince sorular soralım. Türler, popülerliklerine göre dans edilebilirlik algısında önemli ölçüde farklı mı? İlk üç türümüzün popülerlik ve dans edilebilirlik verilerinin dağılımını belirli bir x ve y ekseni boyunca [yoğunluk grafikleri](https://www.khanacademy.org/math/ap-statistics/density-curves-normal-distribution-ap/density-curves/v/density-curves) kullanarak inceleyelim.\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# Perform 2D kernel density estimation\r\n",
"density_estimate_2d <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre)) +\r\n",
" geom_density_2d(bins = 5, size = 1) +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" xlim(-20, 80) +\r\n",
" ylim(0, 1.2)\r\n",
"\r\n",
"# Density plot based on the popularity\r\n",
"density_estimate_pop <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" theme(legend.position = \"none\")\r\n",
"\r\n",
"# Density plot based on the danceability\r\n",
"density_estimate_dance <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = danceability, fill = artist_top_genre, color = artist_top_genre)) +\r\n",
" geom_density(size = 1, alpha = 0.5) +\r\n",
" paletteer::scale_fill_paletteer_d(\"RSkittleBrewer::wildberry\") +\r\n",
" paletteer::scale_color_paletteer_d(\"RSkittleBrewer::wildberry\")\r\n",
"\r\n",
"\r\n",
"# Patch everything together\r\n",
"library(patchwork)\r\n",
"density_estimate_2d / (density_estimate_pop + density_estimate_dance)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Nijerya'daki zevklerin bu tür için belirli bir dans edilebilirlik seviyesinde birleştiği söylenebilir mi? Türden bağımsız olarak, eşleşen eşmerkezli daireler görüyoruz.\n",
"\n",
"Genel olarak, üç tür popülerlik ve dans edilebilirlik açısından uyum gösteriyor. Bu gevşek bir şekilde hizalanmış verilerde kümeleri belirlemek zor olacak. Bakalım bir dağılım grafiği bunu destekleyebilir mi?\n"
],
"metadata": {}
},
{
"cell_type": "code",
"execution_count": null,
"source": [
"# A scatter plot of popularity and danceability\r\n",
"scatter_plot <- nigerian_songs %>% \r\n",
" ggplot(mapping = aes(x = popularity, y = danceability, color = artist_top_genre, shape = artist_top_genre)) +\r\n",
" geom_point(size = 2, alpha = 0.8) +\r\n",
" paletteer::scale_color_paletteer_d(\"futurevisions::mars\")\r\n",
"\r\n",
"# Add a touch of interactivity\r\n",
"ggplotly(scatter_plot)\r\n"
],
"outputs": [],
"metadata": {}
},
{
"cell_type": "markdown",
"source": [
"Aynı eksenlerin bir dağılım grafiği, benzer bir yakınsama modelini gösterir.\n",
"\n",
"Genel olarak, kümeleme için dağılım grafikleri kullanarak veri kümelerini gösterebilirsiniz, bu nedenle bu tür görselleştirmeyi öğrenmek oldukça faydalıdır. Bir sonraki derste, bu filtrelenmiş veriyi alıp k-means kümeleme yöntemini kullanarak ilginç şekillerde örtüşen grupları keşfedeceğiz.\n",
"\n",
"## **🚀 Meydan Okuma**\n",
"\n",
"Bir sonraki derse hazırlık olarak, üretim ortamında keşfedebileceğiniz ve kullanabileceğiniz çeşitli kümeleme algoritmaları hakkında bir grafik oluşturun. Kümeleme hangi tür problemleri çözmeye çalışıyor?\n",
"\n",
"## [**Ders Sonrası Test**](https://gray-sand-07a10f403.1.azurestaticapps.net/quiz/28/)\n",
"\n",
"## **Gözden Geçirme ve Kendi Kendine Çalışma**\n",
"\n",
"Kümeleme algoritmalarını uygulamadan önce, öğrendiğimiz gibi, veri kümenizin doğasını anlamak iyi bir fikirdir. Bu konu hakkında daha fazla bilgi edinin [buradan](https://www.kdnuggets.com/2019/10/right-clustering-algorithm.html).\n",
"\n",
"Kümeleme teknikleri hakkındaki bilginizi derinleştirin:\n",
"\n",
"- [Tidymodels ve arkadaşları ile Kümeleme Modellerini Eğitme ve Değerlendirme](https://rpubs.com/eR_ic/clustering)\n",
"\n",
"- Bradley Boehmke & Brandon Greenwell, [*Hands-On Machine Learning with R*](https://bradleyboehmke.github.io/HOML/)*.*\n",
"\n",
"## **Ödev**\n",
"\n",
"[Kümeleme için diğer görselleştirme yöntemlerini araştırın](https://github.com/microsoft/ML-For-Beginners/blob/main/5-Clustering/1-Visualize/assignment.md)\n",
"\n",
"## TEŞEKKÜRLER:\n",
"\n",
"[Jen Looper](https://www.twitter.com/jenlooper), bu modülün orijinal Python versiyonunu oluşturduğu için ♥️\n",
"\n",
"[`Dasani Madipalli`](https://twitter.com/dasani_decoded), makine öğrenimi kavramlarını daha anlaşılır ve kolay hale getiren harika illüstrasyonları oluşturduğu için.\n",
"\n",
"Mutlu öğrenmeler,\n",
"\n",
"[Eric](https://twitter.com/ericntay), Gold Microsoft Learn Öğrenci Elçisi.\n"
],
"metadata": {}
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Feragatname**: \nBu belge, [Co-op Translator](https://github.com/Azure/co-op-translator) adlı yapay zeka çeviri hizmeti kullanılarak çevrilmiştir. Doğruluk için çaba göstersek de, otomatik çevirilerin hata veya yanlışlıklar içerebileceğini lütfen unutmayın. Belgenin orijinal dili, yetkili kaynak olarak kabul edilmelidir. Kritik bilgiler için profesyonel bir insan çevirisi önerilir. Bu çevirinin kullanımından kaynaklanan herhangi bir yanlış anlama veya yanlış yorumlama durumunda sorumluluk kabul edilmez.\n"
]
}
],
"metadata": {
"anaconda-cloud": "",
"kernelspec": {
"display_name": "R",
"language": "R",
"name": "ir"
},
"language_info": {
"codemirror_mode": "r",
"file_extension": ".r",
"mimetype": "text/x-r-source",
"name": "R",
"pygments_lexer": "r",
"version": "3.4.1"
},
"coopTranslator": {
"original_hash": "99c36449cad3708a435f6798cfa39972",
"translation_date": "2025-09-06T14:18:06+00:00",
"source_file": "5-Clustering/1-Visualize/solution/R/lesson_14-R.ipynb",
"language_code": "tr"
}
},
"nbformat": 4,
"nbformat_minor": 1
}