-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathdata_preprocess.qmd
451 lines (281 loc) · 25.1 KB
/
data_preprocess.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# Veri Ön İşleme {.unnumbered}
Veri ön işleme; istatistiksel modeller kurulmadan önce veri seti üzerinde yapılan bir takım düzeltme, eksik veriyi tamamlama, tekrarlanan verileri kaldırma, dönüştürme, bütünleştirme, temizleme, normalleştirme, boyut indirgeme vb. işlemlerdir. Bu aşamada ister istemez veri üzerinde bilgi keşfi yapılmış olur. Veri önişleme istatistiksel bir modelleme sürecinin büyük kısmını oluşturmaktadır. Kesin bir rakam olmamakla birlikte modelleme sürecinin yarısından fazlasının bu aşamada harcandığını ifade edebiliriz. Veri ön işleme temel anlamda 4 aşamadan oluşmaktadır. Bunlar sırasıyla şu şekildedir:
1. **Veri Temizleme :** Eksik verilerin tamamlanması, aykırı değerlerin teşhis edilmesi ve verilerdeki tutarsızlıkların giderilmesi gibi işlemler yapılmaktadır.
2. **Veri Birleştirme:** Farklı farklı veri tabanlarında bulunan veri setlerinin tek bir yerde toplanması aşamasının düzenli bir şekilde yürütülmesi sağlanır.
3. **Veri Dönüştürme :** Bu aşamada veriler, modelleme için uygun formlara dönüştürülürler. Veri dönüştürme; düzeltme, birleştirme, genelleştirme ve normalleştirme gibi değişik işlemlerden biri veya bir kaçını içerebilir. Veri normalleştirme , min-max dönüşümü, z standartlaştırması gibi yöntemler en sık kullanılan veri dönüştürme işlemlerinden bazılarıdır.
4. **Veri İndirgeme :** Daha küçük hacimli olarak veri kümesinin indirgenmiş bir örneğinin elde edilmesi amacıyla uygulanır. Bu sayede elde edilen indirgenmiş veri kümesine modelleme teknikleri uygulanarak daha etkin sonuçlar elde edilebilir. Veri Birleştirme (Data Aggregation), Boyut indirgeme (Dimension Reduction), Veri Sıkıştırma (Data Compression), Kesikli hale getirme (Discretization), Özellik Seçimi (Feature Selection) sık kullanılan veri indirgeme işlemlerindendir.
Bu dokümanda eksik veriler (missing values), aykırı değerler (outliers) ve veri normalleştirme işlemleri R uygulamları ile anlatılacaktır.
## Eksik Veriler
Eksik veriler, bir veri setinde belirli gözlemlerde veya değişkenlerde eksik veya boş değerler içeren durumlardır. Eksik veriler, ölçüm hatası, veri toplama sürecindeki problemler veya rasgele olaylar nedeniyle ortaya çıkabilir. Sistematik bir kayıp gözlem durumu yoksa ortada ciddi bir sorun yoktur. Ama rastgele olmayan bir hata varsa tüm kitleye dair yanlılık olacağı için bu durum göz ardı edilemez.
**Eksik Verilerin Türleri:**
1. **Rasgele Eksiklik (MCAR - Missing Completely At Random):** Eksiklik, gözlemler arasında tamamen rastgele ve bağımsız bir şekilde meydana gelir. Örneğin, bir anket çalışması yapıyorsunuz ve bazı katılımcılar, bilgisayar hatası nedeniyle rastgele seçilmiş sorulara cevap verememişlerdir. Bu durumda, eksiklik rastgele olarak oluştu ve diğer değişkenlerle ilişkili değildir.
2. **Rastgele Eksiklik (MAR - Missing At Random):** Eksiklik, diğer değişkenlerin değerlerine bağlı olarak meydana gelir, ancak eksik veri değeri eksik olduğu değişkenle ilgili değildir. Örneğin, bir sağlık çalışması yapılıyor ve bazı katılımcılar, yaşlarına bağlı olarak belirli testlere katılamıyorlar. Bu durumda, eksiklik yaşa bağlıdır, ancak test sonuçlarından bağımsız olarak rastgele olarak meydana gelmiştir.
3. **Sistematik Eksiklik (MNAR - Missing Not At Random):** Eksiklik, eksik olan değerlerin değerlere bağlı olarak ortaya çıktığı bir modeli takip eder. Bu durum, eksik verilerin diğer değişkenlerle ilişkili olduğu anlamına gelir. Örneğin, bir maaş anketi yapılıyor ve yüksek maaş alan katılımcılar, maaşlarını ifşa etme konusundaki isteksizlikleri nedeniyle maaş sorularına cevap vermiyorlar. Bu durumda, eksiklik maaş seviyesi ile ilişkilidir ve bu durum MNAR olarak kabul edilir.
Eksik veriler için daha fazla örnek aşağıda yer almaktadır:
- **Mevcut Olmayan Bilgi (Not Stated - NS):** Bir anketin bir bölümünde "Cinsiyet" sorusu vardır ve bazı katılımcılar bu soruya cevap vermez veya "Belirtmek İstemiyorum" seçeneğini işaretler. Bu durum, cinsiyet bilgisinin eksik olduğu ve bu eksikliğin katılımcıların cinsiyetiyle ilgili olup olmadığını anlamak zordur. Bu durum MCAR veya MAR olarak değerlendirilebilir.
- **Zamanla Değişen Eksiklik (Time-Dependent Missingness):** Bir panel veri setinde her yıl yapılan bir ankette, bazı katılımcılar belirli bir yıl için bazı sorulara cevap vermemiş olabilir. Bu durumda eksiklik, zamanla değişen bir yapıya sahiptir ve belirli bir yıla özgüdür. Bu tür eksiklik zaman serileri analizinde önemli olabilir.
- **Seçimli Eksiklik (Selective Missingness):** Bir çalışma, belirli bir tedavi grubuna katılan katılımcıların tedaviye yanıtını ölçen bir değişkenle ilgili eksik verilere sahiptir. Tedavi grubuna dahil olan katılımcılar bu değişkeni ölçmeyi reddetmiş olabilir veya ölçüm yapılmamış olabilir. Bu durum, eksiklik belirli bir grupla sınırlıdır ve bu grupla ilgili özelliklere bağlıdır, bu da durumu MNAR yapar.
- **Sosyal İsteksizlik (Social Desirability Bias):** Bir anket, katılımcılara kişisel gelirlerini belirtmelerini istemektedir. Ancak, bazı katılımcılar gelirlerini abartma eğilimindedir çünkü yüksek gelir bildirmek sosyal olarak daha kabul edilebilir bir durum olarak görülmektedir. Bu durumda, eksiklik sosyal etkileşim ve katılımcıların isteğine bağlıdır, bu da durumu MAR veya MNAR yapabilir.
Her bir örnek, eksik verilerin farklı nedenlere dayanabileceğini ve bu nedenlere bağlı olarak başa çıkma stratejilerinin belirlenmesi gerektiğini göstermektedir. Eksik verilerin türlerini anlamak, başa çıkma stratejilerini belirlemede önemlidir çünkü stratejiler eksik verilerin nasıl oluştuğuna bağlı olarak farklılık gösterebilir. MCAR durumu, basit bir ortalama atama stratejisinin kullanılmasını daha kabul edilebilir kılabilirken, MAR ve MNAR durumları daha sofistike yöntemleri gerektirebilir.
```{r}
# Örnek veri seti oluşturalım
# üreteç sabitlenir
set.seed(123)
data <- data.frame(
ID = 1:10,
Age = c(25, 30, NA, 22, 35, 40, NA, 28, NA, 32),
Income = c(50000, 60000, 75000, NA, 80000, 90000, 70000, NA, 65000, 75000),
Score = c(80, 85, 90, 78, NA, 88, 92, 85, 80, NA)
)
# veride hiç NA var mı?
# TRUE tabloda en az bir tane NA olduğu anlamına gelir
anyNA(data)
# eksik verilerin sorgulanması
is.na(data)
# toplam eksik veri sayısını tespit etmek
sum(is.na(data))
# değişken düzeyinde eksik veri sayısını tespit etmek
colSums(is.na(data))
```
## İmputasyon
İmputasyon terimi, eksik verilerin yerine konulması veya doldurulması işlemine atıfta bulunur. Eksik veriler, bir veri setinde belirli gözlemler veya değişkenler için eksik veya bilinmeyen değerler içeren durumlardır. İstatistiksel analiz yaparken eksik verilerle başa çıkmak önemlidir çünkü eksik veriler, sonuçları yanıltabilir veya analizleri etkileyebilir.
İmputasyon, eksik verileri doldurmak veya tahmin etmek için kullanılan çeşitli istatistiksel yöntemleri ifade eder. İmputasyon işlemi, eksik verileri analizde kullanılabilir hale getirmek amacıyla yapılır. İmputasyon yöntemleri, veri setinin yapısına ve eksik verilerin nedenlerine bağlı olarak değişebilir. Yaygın olarak kullanılan bazı imputasyon yöntemleri ve eksik verilerle başa çıkma stratejileri aşağıda verilmiştir:
1. **Silme (Deletion):**
- **Listwise Deletion (Tamamen Eksik Gözlemleri Silme):** Eksik veri içeren gözlemleri veri setinden tamamen çıkarır. Ancak, bu yöntem veri kaybına neden olabilir ve analizin güvenilirliğini azaltabilir.
- **Pairwise Deletion (Çiftler Arası Silme):** Her analizde eksik verisi olan değişkenleri dışlamadan eksik verilerle çalışmayı sağlar.
2. **Basit Değer Atama (Single Imputation):**
- **Ortalama, Medyan veya Mod Atama:** Eksik değerlere ortalama, medyan veya mod değerleri atanabilir. Ancak, bu yöntem veri dağılımını etkileyebilir. Ortalama ile atama, eksik verilerin diğer gözlemlerdeki ortalama değerlere benzer olduğu varsayımına dayanır. Medyan ile atama ise, verilerdeki aşırı değerlerden etkilenmeyeceği için ortalama değere göre daha dayanıklı bir seçenek olarak tercih edilebilir.
- **Doldurma (Interpolation):** Zaman serisi verilerinde kullanılan bir yöntemdir. Mevcut değerlere dayanarak eksik değerleri tahmin eder.
3. **Çoklu Değer Atama (Multiple Imputation):**
- Birden fazla kez eksik verileri doldurur ve her birini farklı bir "tamamlanmış" veri seti olarak ele alır. Bu, belirsizlikle başa çıkma avantajına sahiptir.
4. **Model Tabanlı Yöntemler:**
- İleri düzey istatistiksel modeller veya makine öğrenimi algoritmaları kullanarak eksik değerleri tahmin edebilir. KNN (K Nearest Neighbor-En Yakın Komşu), regresyon analizi ve karar ağaçları bu tür yöntemlere örnektir.
İmputasyon yöntemi, veri setinin özelliklerine, eksik verilerin miktarına ve verilerin doğasına bağlı olarak seçilir. Her yöntemin avantajları ve dezavantajları vardır, bu nedenle doğru yöntemi seçmek, analizin doğruluğunu ve güvenilirliğini etkileyebilir. İmputasyonun amacı, eksik verilerin doğru ve güvenilir bir şekilde doldurulmasıdır, böylece analiz sonuçları daha kesin ve anlamlı olur.
### Eksik Verilerin Silinmesi
Eksik verilerin silinmesi, bir analizde kullanılan veri setinden eksik değerlere sahip olan gözlemlerin veya değişkenlerin tamamen çıkarılması anlamına gelir. Ancak, bu strateji her zaman uygun değildir, çünkü veri kaybına neden olabilir ve analizin güvenilirliğini azaltabilir. Bu nedenle, dikkatlice düşünülmesi gereken bir yöntemdir.
```{r}
# Eksik verilere sahip gözlemleri sil
data_no_missing <- na.omit(data)
# Sonucu göster
print(data_no_missing)
```
Bu örnekte, "Age", "Income" ve "Score" değişkenlerinde eksik verilere sahip olan bir veri seti oluşturuldu. Ardından, **`na.omit()`** fonksiyonu kullanılarak eksik verilere sahip gözlemler silindi. Ancak, bu işlemle birlikte bazı gözlemler tamamen silinmiş oldu.
```{r}
# complete.cases ile eksik verilere sahip gözlemleri filtrele
complete_data <- data[complete.cases(data), ]
# Sonucu göster
print(complete_data)
```
**`complete.cases(data)`** ifadesi, veri setindeki tamamen eksiksiz olan gözlemleri belirleyerek **`TRUE`** ve **`FALSE`** değerlerinden oluşan bir mantıksal vektör oluşturur. Daha sonra, bu mantıksal vektör kullanılarak sadece tamamen eksiksiz olan gözlemleri içeren yeni bir veri seti oluşturulur.
Eksik verilerin silinmesi avantajlı olabilir çünkü veri seti daha temiz hale gelir ve analiz daha basitleşir. Ancak, bu yaklaşımın dezavantajı, silinen gözlemler nedeniyle veri setindeki genel örüntülerin ve ilişkilerin değişebileceğidir. Ayrıca, eksik veri durumunun mevcut olduğu durumlarda analiz yapılamayabilir. Bu nedenle, eksik verilerin silinmesi stratejisini kullanmadan önce eksik verilerin neden kaynaklandığını anlamak ve analizin amacını dikkate almak önemlidir.
### Eksik Değerlere Basit Değer Atama
Eksik değerlere basit değer atama, eksik değerlere sabit bir değer, ortalama, medyan veya mod gibi basit bir istatistiksel ölçüt atanması anlamına gelir. Bu, eksik verilerin tahmin edilmesinde basit ancak yaygın bir yöntemdir.
Eksik değerlere basit bir değer atamak için, örneğin, **`Age`** değişkenindeki eksik değerlere ortalama değeri atayabiliriz:
```{r}
# Age değişkenindeki eksik değerlere ortalama değeri atama
data$Age[is.na(data$Age)] <- mean(data$Age, na.rm = TRUE)
# Değişiklikleri göster
print(data)
```
Bu örnekte, **`is.na(data$Age)`** ifadesi, **`Age`** değişkenindeki eksik değerlere **`TRUE`**, eksik olmayan değerlere **`FALSE`** döndüren bir mantıksal vektör oluşturur. Ardından, **`mean(data$Age, na.rm = TRUE)`** ifadesi ile **`Age`** değişkeninin ortalama değeri hesaplanır ve eksik değerlere bu ortalama değer atanır.
Aynı yöntem, diğer basit istatistiksel ölçütlerle de uygulanabilir. Örneğin, eksik değerlere medyan veya belirli bir sabit değer atanabilir.
```{r}
# Income değişkenindeki eksik değerlere medyan değeri atama
data$Income[is.na(data$Income)] <- median(data$Income, na.rm = TRUE)
# Score değişkenindeki eksik değerlere sabit bir değer (örneğin, 75) atama
data$Score[is.na(data$Score)] <- 75
# Değişiklikleri göster
print(data)
```
Eksik değerlere çoklu olarak basit değer atama yapmak için **`sapply`** fonksiyonu kullanılabilir. Bu fonksiyon, bir liste veya vektör üzerinde bir işlemi tekrarlamak için kullanılır.
```{r}
# Örnek veri seti yeniden oluşturalım
# Çünkü önceki örneklerde farklı yöntemlerle değer atadık.
# üreteç sabitlenir
set.seed(123)
data <- data.frame(
ID = 1:10,
Age = c(25, 30, NA, 22, 35, 40, NA, 28, NA, 32),
Income = c(50000, 60000, 75000, NA, 80000, 90000, 70000, NA, 65000, 75000),
Score = c(80, 85, 90, 78, NA, 88, 92, 85, 80, NA)
)
# Sapply ile eksik değerlere ortalama değeri atama
sapply(data, function(x)
ifelse(is.na(x), mean(x, na.rm = TRUE), x))
```
Eksik değerleri doldurmak için **`zoo`** paketinde bulunan **`na.locf`**, **`na.approx`** ve **`na.spline`** fonksiyonları oldukça kullanışlıdır. Bu fonksiyonlar, sırasıyla bir önceki değeri kullanma (last observation carried forward), doğrusal interpolasyon ve spline interpolasyon yöntemlerini içerir.
**`na.locf`**, **`na.approx`**, ve **`na.spline`** fonksiyonları, zaman serisi verilerinde eksik değerleri doldurmak için özellikle kullanışlıdır. Bu fonksiyonlar, zaman içinde belirli bir düzeni takip eden verilerdeki eksik değerleri tahmin etmek için tasarlanmıştır. İşte bu fonksiyonlar ve uygun oldukları senaryoların kısa bir açıklaması:
**`na.locf` (Last Observation Carried Forward):** Zaman serisi verilerinde, gözlemler arasındaki sürekli düzeni korumak istediğiniz durumlar. Önceki gözlemin değeri, sonraki eksik gözlemin değeri olarak kabul edilir.
```{r message=FALSE}
library(zoo)
# carry forward
# eksik değerler bir önceki gözlemin değeriyle doldurulur.
sapply(data, function(x) ifelse(is.na(x), na.locf(x), x ))
```
**`na.approx` (Linear Approximation):** Zaman serisi verilerinde, eksik değerleri doğrusal bir eğilimle doldurmak istediğiniz durumlar. Ancak, doğrusal interpolasyon, verilerde gerçekten doğrusal bir ilişki olduğu durumları varsayar.
```{r}
# linear interpolation
# eksik değerler doğrusal interpolasyon yöntemiyle doldurulur.
sapply(data, function(x) ifelse(is.na(x), na.approx(x), x ))
```
**`na.spline` (Spline Approximation):** Zaman serisi verilerinde, eksik değerleri spline interpolasyon yöntemi ile doldurmak istediğiniz durumlar. Spline interpolasyon, veriler arasında daha karmaşık ve eğri bir ilişki olduğu durumları ele alabilir.
```{r}
# spline interpolation
# eksik değerler spline interpolasyon yöntemiyle doldurulur.
sapply(data, function(x) ifelse(is.na(x), na.spline(x), x ))
```
Bu fonksiyonlar, özellikle zamana bağlı değişen veri setlerinde eksik değerleri doldurmak için kullanılır. Ancak, kullanmadan önce dikkat edilmesi gereken önemli bir nokta, interpolasyonun verilerdeki gerçek ilişkileri ne kadar doğru yansıttığıdır. Doğru bir doldurma stratejisi seçilirken, eksik değerlerin neden kaynaklandığını ve veri setinin özelliklerini anlamak önemlidir.
### En Yakın Komşu Yöntemi (KNN) ile Değer Atama
En yakın komşu yöntemi (K-Nearest Neighbors, KNN) eksik değerleri doldurmak için kullanılan bir yöntemdir. Temel fikir, bir gözlemin sınıfını veya değerini belirlemek için, o gözleme en yakın komşularının etkisini kullanmaktır. Bu yöntem, eksik değeri olan bir gözlemi, benzer diğer gözlemlerin değerleriyle doldurmayı amaçlar. KNN, benzerlik ya da uzaklık ölçüsüne dayalı olarak en yakın k komşuyu belirleyerek eksik değeri doldurur. Uzaklık ise bu yakınlığın ölçüsünü ifade eder. Uzaklık metrikleri, gözlemler veya özellik vektörleri arasındaki benzerlik veya farklılık düzeyini belirlemek için kullanılır.
KNN'de yaygın olarak kullanılan uzaklık metrikleri şunlardır:
1. **Euclidean Distance (Öklidyen Uzaklık):** İki nokta arasındaki doğrusal mesafeyi ölçer. 2-boyutlu uzayda, iki nokta $(x_1,y_1)$ ve $(x_2,y_2)$ arasındaki öklidyen uzaklık formülü şu şekildedir:
$$
Uzaklık=\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}
$$
Bu formül genelleştirilebilir ve çok boyutlu uzaylarda kullanılabilir.
2. **Manhattan Distance (Manhattan Uzaklığı veya L1 Uzaklığı):** İki nokta arasındaki "şehir blokları" tarzında mesafeyi ölçer. Özellik vektörlerindeki farklar toplanır. 2-boyutlu uzayda, iki nokta $(x_1,y_1)$ ve $(x_2,y_2)$ arasındaki Manhattan uzaklık formülü şu şekildedir:
$$
Uzaklık=|x_2-x_1|+|y_2-y_1|
$$
3. **Chebyshev Distance (Chebyshev Uzaklığı veya L∞ Uzaklığı):** İki nokta arasındaki maksimum farkı ölçer. Özellik vektörlerindeki farkların mutlak değerlerinden en büyüğünü seçer.
4. **Minkowski Distance:** Minkowski uzaklığı, öklidyen, Manhattan ve Chebyshev uzaklıklarını içeren genel bir formülü ifade eder. Bu formül şu şekildedir:
$$
Uzaklık=(\sum_{i=1}^n |x_{i2}-x_{i1}|^p)^{1/p}
$$
Burada $p$ parametresi, uzaklık ölçüsünün tipini belirler. $p=2$ öklidyen uzaklığı, $p=1$ Manhattan uzaklığı, $p=\infty$ Chebyshev uzaklığını temsil eder.
Uzaklık, KNN algoritmasında önemlidir çünkü bu algoritma komşuluk temeline dayalı çalışır. Bir gözlemin sınıfını veya değerini belirlerken, o gözleme en yakın komşularının etkisini alır. Bu nedenle, doğru uzaklık metrikinin seçimi, modelin performansını etkiler. Veri setinin özelliklerine, dağılımına ve problemin niteliğine bağlı olarak en uygun uzaklık metriğinin seçilmesi önemlidir.
**R** ile örnek bir uygulama yapmak için **`DMwR2`** paketini kullanabiliriz. **`DMwR2`** paketi, "[**Data Mining with R: Learning with Case Studies**](https://www.amazon.com/Data-Mining-Learning-Knowledge-Discovery/dp/1439810184)" kitabının örnekleri üzerine dayanarak, eksik verilerle başa çıkmak için kullanılan bir pakettir. Bu paket, özellikle eksik değerleri tahmin etmek ve doldurmak amacıyla bazı yöntemleri içermektedir.
Aşağıda, **`DMwR2`** paketi kullanılarak K-Nearest Neighbors (KNN) algoritması ile eksik değer doldurma işlemi için bir örnek bulunmaktadır. Bu örnekte, **`DMwR2`** paketi ile **`knnImputation`** fonksiyonu kullanılarak bir veri setindeki eksik değerler doldurulmuştur.
```{r message=FALSE}
library(DMwR2)
# KNN ile eksik değerleri doldur
# k parametresi, verilen bir noktaya en yakın komşuların sayısıdır.
# Bu örnekte uzaklığa (öklit) göre en yakın 3 komşu belirlenir
# Dah sonra mesafenin ağırlıklı ortalaması hesaplanır.
# Ağırlıklandırma, her komşuya 1 / d ağırlığının verilmesini içerir.
# d komşuya olan uzaklıktır.
data_imputed <- knnImputation(data, k = 3)
# Sonucu göster
print(data_imputed)
```
Bu örnekte, **`knnImputation`** fonksiyonu, K-Nearest Neighbors algoritmasını kullanarak eksik değerleri doldurur. **`k`** parametresi, her bir eksik değeri doldurmak için kullanılacak olan komşu sayısını belirler. Bu örnekte **`k = 3`** olarak seçildi.
Bu örnekte, KNN algoritması kullanılarak eksik değerlerin doldurulduğu bir senaryoyu görmüş olduk. Ancak, KNN'nin avantajlarına rağmen, kullanılan algoritmanın ve komşuluk sayısının seçimi, problem bağlamına bağlı olarak değişebilir. Eksik değer doldurma stratejilerini seçerken, veri setinin yapısı, eksik değerlerin neden kaynaklandığı ve analizin amacı göz önüne alınmalıdır.
::: callout-tip
### Tavsiye
Eksik verilerin analiz edilmesi ve imputasyon konusunda R içerisinde çeşitli kütühaneler bulunmaktadır. Bunlardan en çok bilinenleri **`mice, VIM, missForest, imputation, mi, Amelia`** ve **`Hmisc`** paketleridir.
:::
## Aykırı Değer Analizi
Aykırı değer, diğer gözlemlerden uzak olan, yani diğer veri noktalarından önemli ölçüde farklı olan bir veri noktası olan bir değer veya gözlemdir. Bu dokümanda, tanımlayıcı istatistikler (minimum, maksimum, histogram, kutu grafiği ve yüzdelikler dahil) gibi basit teknikler ve Z-Skoru ile aykırı değer analizi anlatılacaktır.
### Minumum ve Maximum
```{r}
library(ggplot2)
# mpg verisindeki hwy değişkeni üzerinden inceleyelim
summary(mpg$hwy)
min(mpg$hwy)
max(mpg$hwy)
```
### Histogram
```{r}
# grafiğin sağ tarafında kalan gözlemler şüpheli görünüyor.
ggplot(mpg) +
aes(x = hwy) +
geom_histogram(bins = 20, fill = "blue") +
theme_minimal()
```
### Boxplot
Boxplot, beş konum ölçüsü kullanarak verilerin grafiksel bir sunumunu verir: en küçük değer (min), birinci çeyreklik ($Q_1$) , medyan, üçüncü çeyreklik ($Q_3$) en büyük değer. Kutunun farklı bölümleri arasındaki boşluk, verilerdeki dağılım (yayılma) ve çarpıklık derecesini gösterir. Bir boxplot grafiği, çeyrekler arası aralık (IQR) kriteri kullanılarak şüpheli bir aykırı değer olarak sınıflandırılan herhangi bir gözlemi görüntüleyerek nicel bir değişkeni görselleştirmeye yardımcı olur.
$I = [Q_1-1.5 * IQR ; Q_3 + 1.5 * IQR]$
![](images/boxplot.png){fig-align="center"}
IQR ise üçüncü ve birinci çeyrek arasındaki farktır. R içerisindeki **`IQR()`** fonksiyonu bu amaçla kullanılabilir.
```{r}
# temel istatistiklere erişim
summary(mpg$hwy)
fivenum(mpg$hwy)
ggplot(mpg) +
aes(x = "", y = hwy) +
geom_boxplot(fill = "blue") +
theme_minimal()
# outlier değerlerine erişim
boxplot.stats(mpg$hwy)$out
# outier olarak görülen değerlerin konumları
hwy_out <- boxplot.stats(mpg$hwy)$out
hwy_out_sira <- which(mpg$hwy %in% c(hwy_out))
hwy_out_sira
# outlier olarak görülen satırlar
mpg[hwy_out_sira, ]
```
### Yüzdelikler (Percentiles)
Bu aykırı değer tespiti yöntemi, yüzdelik dilimlere dayalıdır. Yüzdelikler yöntemiyle, 2,5 ve 97,5 yüzdelik dilimlerin oluşturduğu aralığın dışında kalan tüm gözlemler potansiyel aykırı değerler olarak kabul edilecektir. Aralığı oluşturmak için 1 ve 99 veya 5 ve 95 yüzdelikler gibi diğer yüzdelikler de düşünülebilir.
```{r}
alt_sinir <- quantile(mpg$hwy, 0.025)
alt_sinir
ust_sinir <- quantile(mpg$hwy, 0.975)
ust_sinir
# Bu yönteme göre, 14'ün altındaki ve 35.175'in üzerindeki tüm gözlemler,
# potansiyel aykırı değerler olarak kabul edilecektir.
outlier_sira <- which(mpg$hwy < alt_sinir | mpg$hwy > ust_sinir)
outlier_sira
# Bu yönteme göre 11 adet outlier bulunmuştur.
mpg[outlier_sira,]
# Sınırları biraz daha küçültelim
alt_sinir <- quantile(mpg$hwy, 0.01)
ust_sinir <- quantile(mpg$hwy, 0.99)
outlier_sira <- which(mpg$hwy < alt_sinir | mpg$hwy > ust_sinir)
mpg[outlier_sira, ]
# Buna göre IQR ile elde edildiği gibi 3 adet outlier bulundu.
```
### Z-Skor Yöntemi
Aykırı değerlerin tespitinde ortalama ve standart sapmanın kulllanıldığı en bilinen yöntemlerdendir ve aşağıdaki şekilde hesaplanır.
$$
Z_i = \frac{(X_1-\mu)}{\sigma}
$$
![](images/sigma.png){fig-align="center"}
```{r}
std_z <- function(x){
z=(x-mean(x))/sd(x)
return(z)
}
mpg$hwy_std <- std_z(mpg$hwy)
mpg[,c("hwy","hwy_std")]
# -3 ve +3 sapma dışında kalanları aykırı değer olarak kabul ediyoruz.
outliers_zskor <- which(mpg$hwy_std < -3 | mpg$hwy_std > +3)
outliers_zskor
mpg[outliers_zskor,c() ]
# bu yönteme göre 2 adet aykırı değer bulunmuştur.
```
## Veri Normalleştirme
Değişkenler farklı ölçeklerde ölçüldüğünde, genellikle analize eşit katkıda bulunmazlar. Örneğin, bir değişkenin değerleri 0 ile 100.000 arasında ve başka bir değişkenin değerleri 0 ile 100 arasında değişiyorsa, daha büyük aralığa sahip değişkene analizde daha büyük bir ağırlık verilecektir. Değişkenleri normalleştirerek, her bir değişkenin analize eşit katkı sağladığından emin olabiliriz. Değişkenleri normalleştirmek için (veya ölçeklendirmek) genellikle min-max ya da z dönüşümü yöntemleri kullanılır.
```{r, fig.height = 6, fig.width = 10, message=FALSE}
# min-max dönüşümleri
# 0 ile 1 arasi dönüşüm
std_0_1 <- function(x) {
(x - min(x)) / (max(x) - min(x))
}
#-1 ile +1 arası dönüşüm
std_1_1 <- function(x) {
((x - mean(x)) / max(abs(x - mean(x))))
}
# a ile b arası dönüşüm
std_min_max <- function(x,a,b) {
# a min değer
# b max değer
(a + ((x - min(x)) * (b - a)) / (max(x) - min(x)))
}
# dat isimli yeni bir tablo üretelim
set.seed(12345)
dat <- data.frame(x = rnorm(20, 10, 3),
y = rnorm(20, 30, 8),
z = rnorm(20, 25, 5))
dat
summary(dat)
apply(dat, 2, std_0_1)
library(dplyr)
dat %>% mutate_all(std_0_1) %>% summary()
dat %>% mutate_all(std_1_1) %>% summary()
dat %>% mutate_all(std_min_max, a = -2, b = 2) %>% summary()
dat %>% mutate_all(std_z) %>% summary()
# Yapılan dönüşümler verinin dağılımını değiştirmemektedir.
par(mfrow=c(2,1))
hist(dat$x,main="original data",col="blue")
hist(std_0_1(dat$x),main="normalize data",col="red")
```