-
Notifications
You must be signed in to change notification settings - Fork 1
/
data_manipulation.qmd
411 lines (280 loc) · 16.4 KB
/
data_manipulation.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
# Veri Manipulasyonu {#part-manipulation .unnumbered}
![](images/dplyr.png){fig-align="center"}
Veri manipülasyonu, veri çerçeveleri üzerinde verileri dönüştürmek, filtrelemek, birleştirmek veya yeniden düzenlemek gibi işlemleri içeren önemli bir veri bilimi becerisidir. R programlama dili, veri manipülasyonu için oldukça güçlü ve esnek bir araç sunar. Bu yazıda, R kullanarak veri manipülasyonunu nasıl yapabileceğinizi öğreneceğiz.
Veri manipülasyonu için R'da yaygın olarak kullanılan iki ana kavram, "veri çerçeveleri" ve "paketler"dir. Veri çerçeveleri, verileri tablo şeklinde düzenleyen ve işleyen veri yapılarıdır. R'da veri çerçeveleri, **`data.frame`** türünden nesnelerdir. Veri manipülasyonu için kullanabileceğiniz birçok paket vardır, ancak en yaygın kullanılanlar arasında **`dplyr`** ve **`tidyr`** bulunur. Bu paketler, veri manipülasyonunu kolaylaştırmak için bir dizi işlev içerir.
**`dplyr`**, RStudio'dan Hadley Wickham tarafından geliştirilmiş ve en yaygın veri işleme zorluklarını çözmenize yardımcı olan bir veri işleme dilbilgisidir. **`dplyr`** paketi, **`devtools`** paketi ve `install_github()` fonksiyonu kullanılarak **CRAN**'**dan** veya **GitHub'dan** kurulabilir. GitHub deposu genellikle paketteki en son güncellemeleri ve geliştirme sürümünü içerir.
CRAN sayfasından yüklemek için;
```
> install.packages("dplyr")
```
GitHub sayfasından yüklemek için;
```
> install_github("hadley/dplyr")
```
dplyr paketinde sıklıkla kullanılan fonksiyonlar şunlardır:
- **`select`** : veri çerçevesinden istenilen sütunları seçer.
- **`filter`** : mantıksal koşullara dayalı olarak bir veri çerçevesinden satırları filtreler.
- **`arrange`** : satıları sıralar.
- **`rename`** : sütun isimlerini yeniden isimlendirir.
- **`mutate`** : yeni değişkenler/sütunlar ekler veya mevcut değişkenleri dönüştürür.
- **`summarise/ summarize`** : veri çerçevesindeki farklı değişkenlerin özet istatistiklerini oluşturur
- **`%>%`** (pipe) operatörü birden çok eylemi ardışık düzende zincirleme şekilde birbirine bağlamak için kullanılır.
Veri manipülasyonu ile örnekler için bazen küçük veri setleri oluşturulacaktır bazen de 2015 yılı ABD nüfus sayımına ilişkin [counties](https://github.com/MFatihTuzen/r-book-tr/blob/main/datasets/counties.rds) veri seti kullanılacaktır. Bu veri setinde eyalet ve şehir detayında nüfus, gelir, ırk, coğrafi yapı, işgücü gibi değişkenler yer almaktadır.
```{r message=FALSE}
library(dplyr)
counties <- readRDS("datasets/counties.rds")
# veri setinin yapısı hakkında bilgi sağlar
glimpse(counties)
```
## Değişken Seçme - `select`
Tabloyu (veri çerçevesi) seçmek ve dönüştürmek için R'da **`dplyr`** paketinde bulunan **`select()`** fonksiyonu oldukça kullanışlıdır. Bu fonksiyon, belirli sütunları seçmek veya sütun adlarını değiştirmek için kullanılır. **`select()`** fonksiyonunu kullanarak veri çerçevesinde sütunları seçme ve dönüştürme işlemlerinin nasıl yapıldığına dair aşağıda örnekler mevcuttur.
::: callout-note
### Not
**`select()`** fonksiyonu ayrıca sütunları seçerken veya döndürürken bazı özel işlevler de kullanmanıza olanak tanır. Örneğin, **`starts_with()`**, **`ends_with()`**, **`contains()`** gibi işlevleri kullanarak sütun adlarının belirli bir örüntüyü karşılayanları seçebilirsiniz. Bu fonksiyon, veri manipülasyonu işlemlerinde oldukça kullanışlıdır ve veri çerçevelerini istediğiniz şekilde özelleştirmenize yardımcı olur.
:::
```{r}
# belirli sütunları seçmek
counties %>%
select(state, county, population, unemployment)
# belli aralıkta bütün sütunların seçilmesi
counties %>%
select(state, county, drive:work_at_home)
# belirli bir ifadeyi içeren sütunları seçmek
counties %>%
select(state, county, contains("employed"))
# belirli bir ifade ile başyalan sütunları seçmek
counties %>%
select(state, county, starts_with("income"))
# belirli bir ifade ile biten sütunları seçmek
counties %>%
select(state, county, ends_with("work"))
# belirli sütunları hariç tutarak seçmek
counties %>%
select(census_id:population,-c(men:land_area))
# belirli veri tipindeki sütunları seçmek
counties %>%
select(where(is.character))
# select ile kolon adı değiştirmek
counties %>%
select(census_id,pop = population)
```
## Veri Sıralama - `arrange`
**`dplyr`** paketinde bulunan **`arrange()`** fonksiyonu, veri çerçevesindeki satırları belirli bir sıraya göre düzenlemek için kullanılır. Bu sıralama işlemi, bir veya daha fazla sütunun değerlerine göre yapılabilir. **`arrange()`** fonksiyonu, veri analizi ve veri keşfi sırasında verilerinizi anlamak ve analiz etmek için önemli bir araçtır.
```{r}
counties_selected <- counties %>%
select(state, county, population, unemployment)
# artan sıralama (ascending)
counties_selected %>%
arrange(population)
# azalan sıralama (descending)
counties_selected %>%
arrange(desc(population))
# birden fazla sütun seçerek sıralama
counties_selected %>%
arrange(state,desc(population))
```
## Veri Filtreleme - `filter`
**`dplyr`** paketindeki **`filter()`** fonksiyonu, veri çerçevesinde belirli bir koşulu karşılayan satırları seçmek için kullanılır. Bu fonksiyon, veri analizi sırasında verilerinizi filtrelemek ve istediğiniz verileri elde etmek için oldukça kullanışlıdır. **`filter()`** fonksiyonu, veri çerçevesindeki satırları seçerken belirli sütunlardaki değerlere dayalı koşulları uygulamanıza olanak tanır.
```{r}
# sadece New York'u filtrele
counties_selected %>%
arrange(desc(population)) %>%
filter(state == "New York")
# işsizlik oranı 6'dan küçük olanları filtrele
counties_selected %>%
arrange(desc(population)) %>%
filter(unemployment < 6)
# birden fazla koşul
counties_selected %>%
arrange(desc(population)) %>%
filter(state == "New York",unemployment < 6)
# veya kullanımı
counties_selected %>%
arrange(desc(population)) %>%
filter(state == "New York"| unemployment < 6)
```
## Değişken Güncelleme ve Oluşturma- `mutate`
**`dplyr`** paketindeki **`mutate()`** fonksiyonu, bir veri çerçevesinde yeni sütunlar oluşturmak veya mevcut sütunları dönüştürmek için kullanılır. Bu fonksiyon, veri çerçevesindeki herhangi bir sütunu işleyerek yeni bilgiler eklemenize veya mevcut sütunları değiştirmenize olanak tanır. **`mutate()`** fonksiyonu, veri analizi sırasında verilerinizi özelleştirmek için oldukça kullanışlıdır.
```{r}
# işsiz nüfus sayısına ilişkin değişken üretme
counties_selected %>%
mutate(unemployed_population = population * unemployment / 100)
# yeni sütun ekle
counties_selected %>%
mutate(unemployed_population = population * unemployment / 100) %>%
arrange(desc(unemployed_population))
# var olan sütunu güncelle
counties %>%
select(state, county, population, men,women) %>%
mutate(population = men + women)
# birden fazla yeni değişken üretme
counties %>%
select(state, county, population, men,women) %>%
mutate(men_ratio = men/population*100,
women_ratio = women/population*100)
# transmute sadece yeni eklenen değişkenleri gösterir
counties %>%
select(state, county, population, men,women) %>%
transmute(men_ratio = men/population*100,
women_ratio = women/population*100)
# mutate_at ile koşula göre birden fazla değişkene aynı fonksiyon uygulanabilir.
scale2 <- function(x, na.rm = FALSE) (x - mean(x, na.rm = na.rm)) / sd(x, na.rm)
counties_selected %>%
mutate_at(c("population","unemployment"),scale2)
counties_selected %>% # birden fazla argüman kullanımı
mutate_at(c("population","unemployment"),scale2,na.rm = TRUE)
# mutate_if ile koşula göre birden fazla değişkende değişiklik yapılabilir.
str(counties_selected)
counties_selected <- counties_selected %>%
mutate_if(is.character,as.factor)
str(counties_selected)
counties_selected %>%
mutate_if(is.numeric, scale2, na.rm = TRUE)
```
::: callout-warning
### Dikkat
**`mutate()`** ve **`transmute()`** fonksiyonları, **`dplyr`** paketinde veri çerçevelerini işlerken kullanılan iki farklı fonksiyondur. Her ikisi de yeni sütunlar oluşturmanıza veya mevcut sütunları dönüştürmenize olanak tanır, ancak aralarındaki temel fark işlevlerinin dönüş değerleridir. Ancak kullanırken aşağıda belirtilen hususlara dikkat etmek gerekir:
- **`mutate()`**, veri çerçevesine yeni sütunlar eklerken, orijinal veri çerçevesini değiştirmez. Yani, yeni sütunlar eklerken orijinal veri çerçevesinin boyutu artar. **`mutate()`** fonksiyonu, orijinal veri çerçevesini döndürürken eklenen sütunlarla birlikte veriyi içeren yeni bir veri çerçevesi döndürür.
- **`transmute()`**, yeni sütunlar oluştururken orijinal veri çerçevesini değiştirmez. Ancak, **`transmute()`** fonksiyonu yalnızca belirtilen sütunları ve yeni sütunları içeren bir veri çerçevesi döndürür. Diğer orijinal sütunlar bu yeni veri çerçevesinde yer almaz. Bu, veri çerçevesini daha küçük ve özgünleştirilmiş bir hale getirir.
:::
### Koşullu Değişken Oluşturma - `case_when`
**`case_when()`** fonksiyonu, R programlama dilinde **`dplyr`** paketi içinde bulunan ve çoklu koşullara dayalı olarak yeni bir sütun oluşturmak veya mevcut bir sütunu dönüştürmek için kullanılan bir fonksiyondur. Bu fonksiyon, özellikle veri çerçevelerinde veya veri tablolarında, belirli koşullara dayalı olarak işlem yapmanız gerektiğinde oldukça kullanışlıdır. **`case_when()`** fonksiyonu, birden fazla koşulu kontrol ederek her bir koşula uygun bir değer veya işlem döndürmenizi sağlar. **`case_when()`** fonksiyonu, bir veya daha fazla koşul ifadesi ve bu koşullara karşılık gelecek değerler içeren çiftlerin bir listesini alır. Bu çiftler, **`~`** operatörü ile ayrılır.
```{r}
# Örnek bir veri çerçevesi oluşturalım
veri <- data.frame(
Ogrenci_Ad = c("Ali", "Esra", "Erkan", "Derya"),
Puan = c(90, 75, 60, 80)
)
# Yeni bir sütun oluşturma: Puan kategorisi
veri <- veri %>%
mutate(Puan_Kategorisi = case_when(
Puan >= 90 ~ "AA",
Puan >= 80 ~ "BA",
Puan >= 70 ~ "BB",
Puan >= 60 ~ "CB",
TRUE ~ "FF" # Tüm diğer durumlar için
))
print(veri)
```
**`case_when()`** fonksiyonunu birden fazla koşul ile kullanabilirsiniz. Koşullar yukarıdan aşağıya sırayla kontrol edilir ve ilk koşulu sağlayan değer kullanılır.
```{r}
veri <- veri %>%
mutate(Not_Durumu = case_when(
Puan >= 90 ~ "Geçti",
Puan >= 60 & Puan < 70 ~ "Şartlı Geçti",
Puan < 60 ~ "Kaldı",
TRUE ~ "Bilinmiyor" # Tüm diğer durumlar için
))
veri
```
## Değişken İsimlendirme - `rename`
**`rename()`** fonksiyonu, R programlama dilinde veri çerçevesi içindeki sütunların adlarını değiştirmek için kullanılır. Veri çerçevesi sütunlarının daha açıklayıcı veya kullanıcı dostu adlara sahip olmasını sağlar. Bu, veri analizi ve raporlama süreçlerini daha anlaşılır ve düzenli hale getirmenize yardımcı olabilir.
```{r}
# yeniden isimlendirmede eşitliği sol tarafı yeni isim olmalı
counties_selected %>%
rename(unemployment_rate = unemployment)
# select ile beraber de yeniden isimlendirme yapılabilir
counties_selected %>%
select(state, county, population, unemployment_rate = unemployment)
```
::: callout-caution
### Dikkat
**`rename`** fonksiyonunda eşitliğin sol tarafına yeni isim, sağ tarafına ise önceki isim yazılır.
:::
## Verileri Sayma - `count`
**`count()`** fonksiyonu, R programlama dilindeki **`dplyr`** paketinde bulunan ve belirli bir sütuna göre veri çerçevesindeki gözlemlerin sayısını hesaplamak için kullanılan bir fonksiyondur. Bu fonksiyon, veri çerçevesindeki belirli bir kategorik değişkenin benzersiz değerlerini ve her bir değer için kaç gözlemin olduğunu hesaplamak için oldukça kullanışlıdır.
**`count()`** fonksiyonu, veri analizi sürecinde veri özeti oluşturmak ve belirli bir değişkenin frekansını görmek için sıkça kullanılır. Ayrıca, veri çerçevesindeki her bir kategorik değeri ve bu değerlere ait gözlem sayılarını içeren yeni bir veri çerçevesi döndürür.
```{r}
# count ile veri setinde sayma işlemleri yapılır
counties %>%
count()
# state dağılımını elde etmek
counties %>%
count(state)
# sort = TRUE ile büyükten küçüge sıralama yapılabilir
counties %>%
count(state, sort = TRUE)
# wt argümanı ile değişken toplamları hesaplanabilir
counties %>%
count(state, wt = population, sort = TRUE)
```
## Veri Özetleme - `summarize`
**`group_by()`** ve **`summarize()`** fonksiyonları, R programlama dilinde veri çerçevesi üzerinde gruplama ve özetleme işlemleri yapmak için kullanılan önemli **`dplyr`** fonksiyonlarıdır. Bu fonksiyonlar, veri analizi sürecinde verilerinizi daha iyi anlamak ve özetlemek için oldukça güçlü araçlardır.
**`group_by()`** fonksiyonu, veri çerçevesindeki verileri belirli bir sütuna veya birden fazla sütuna göre gruplamak için kullanılır. Bu gruplandırma işlemi, veriyi belirli bir kategoriye veya sınıfa göre ayırmak için kullanılır.
**`summarize()`** fonksiyonu, gruplanmış veri üzerinde istatistiksel veya özetleyici işlemler yapmak için kullanılır. Bu fonksiyon, belirli bir grup için özet bilgileri hesaplamak için kullanılır.
```{r}
counties %>%
summarize(total_population = sum(population))
counties %>%
summarize(total_population = sum(population),
average_unemployment = mean(unemployment))
# istenilen düzeye göre hesaplamalar group_by ile yapılır
counties %>%
group_by(state) %>%
summarize(total_pop = sum(population),
average_unemployment = sum(unemployment))
counties %>%
group_by(state) %>%
summarize(total_pop = sum(population),
average_unemployment = mean(unemployment)) %>%
arrange(desc(average_unemployment))
# birden fazla değişken düzeyinde gruplama
counties %>%
group_by(state, metro) %>%
summarize(total_pop = sum(population))
# elde edilen veri üzerinden devam edilecekse ungroup kullanılmalı.
# ungroup kullanılmazsa sonradan yapılan işlemler group_by değişkenleri düzeyinde
# devam eder
counties %>%
group_by(state, metro) %>%
summarize(total_pop = sum(population)) %>%
ungroup()
# top_n en yüksek ya da en düşük sonuçları listeleme
counties_selected %>%
group_by(state) %>%
top_n(1, population) # her eyaletteki en yüksek nüfuslu yer
counties_selected %>%
group_by(state) %>%
top_n(-1, population) # her eyaletteki en düşük nüfuslu yer
counties_selected %>%
group_by(state) %>%
top_n(2, population) # her eyaletteki en yüksek nüfuslu 2 yer
# summarise_all bütün değişkenler için özetleme yapar
counties_selected %>% summarise_all(nlevels)
counties_selected %>%
select(-county) %>%
group_by(state) %>%
summarise_all(mean)
# summarise_at belli değişkenler için özetleme yapar
counties_selected %>%
select(-county) %>%
group_by(state) %>%
summarise_at("population",mean)
# summarise_if ile koşula göre özetleme yapar
counties_selected %>%
summarize_if(is.numeric, mean, na.rm = TRUE)
```
::: callout-caution
### Dikkat
**`ungroup()`** fonksiyonu, **`dplyr`** paketinde kullanılan bir işlevdir ve bir veri çerçevesini veya gruplanmış bir veri çerçevesini gruplardan çıkarmak için kullanılır. **`group_by()`** fonksiyonu ile gruplanmış bir veri çerçevesini oluşturduğunuzda, veri çerçevesi belirli sütunlar üzerinde gruplama yapar ve her grup için ayrı işlemler yapmanıza olanak tanır. Ancak bazen gruplamadan çıkmak ve orijinal veri çerçevesini elde etmek isteyebilirsiniz.
:::
```{r}
# Örnek bir veri çerçevesi oluşturalım
veri <- data.frame(
Sehir = c("İstanbul", "Ankara", "İstanbul", "Ankara", "İzmir"),
Cinsiyet = c("Erkek", "Kadın", "Erkek", "Kadın", "Erkek"),
Yas = c(28, 32, 22, 24, 30),
Puan = c(90, 85, 78, 92, 88)
)
# Şehir sütununa göre veriyi grupla
gruplu_veri <- group_by(veri, Sehir)
gruplu_veri |> summarise(mean(Puan))
# Grubu çıkarma
gruplu_veri <- ungroup(gruplu_veri)
gruplu_veri |> summarise(mean(Puan))
```
Aynı veri setinde farklı sonuçlar elde edildiğine dikkat edelim. Eğer **`group_by`** ile oluşturulan veri setinde başka işlemler yapacaksanız öncesinde **`ungroup()`** yapmayı ihmal etmeyin.
::: callout-note
## Not
**`group_by`** sadece `summarize` fonksiyonu ile değil `mutate`, `transmute` gibi diğer fonksiyonlar ile birlikte de kullanılabilir.
:::