Bu eğitimin amacı, R ile web kazıma yoluyla H1B vizeleri hakkında nasıl veri toplayabileceğinizi göstermek. Ardından, JSON nesnelerini nasıl ayrıştırabileceğinizi ve verileri nasıl saklayıp işleyebileceğinizi, böylece H1B başvurularının büyük veri seti üzerinde temel bir keşif amaçlı veri analizi (EDA) yapabileceğinizi de öğreneceksiniz.
Belki kendinizi bir aday olarak nasıl en iyi konumlandırabileceğinizi ya da yeni R kodları öğrenebilirsiniz!
Giriş
Geçen hafta, DataCamp'in blogundaki "Veriler H-1B Vize Başvurunuza Yardımcı Olabilir mi" yazısı, yıllar içindeki H-1B verilerinin analizine ilişkin bazı sonuçları sundu. Şimdi, işe koyulup verileri kendiniz analiz etme ve başka neler bulabileceğinizi görme zamanı! Ted Kwartler sizi bir dizi R eğitimle bunun üzerinden geçirecek.
H1B vizeleri başvurusunda bulunan bir Teksas hukuk firmasında çalışan bir arkadaşım var. H1B, Amerika Birleşik Devletleri'nde, ABD işverenlerinin yabancı çalışanları belirli uzmanlık gerektiren pozisyonlarda geçici olarak çalıştırmasına olanak tanıyan göçmen olmayan bir vizedir. Görünüşe göre kabul edilmek son derece zor, çünkü sınırlı sayıda vize var ve başvuranlar binleri buluyor. Bu anekdotsal olsa da, nitelikli adaylara ABD'nin misafirperver bir yer olduğunu bilmelerine yardımcı olma umuduyla verileri kendim keşfetmeye karar verdim!
Verilerinizi Alma: Web Kazıma ve Ayrıştırma
DataCamp'teki bir meslektaşım beni, 2012'den 2016'ya kadar H1B verilerini içeren basit bir web sitesi olan bu siteye yönlendirdi.Site, tek bir tabloda düzenlenmiş 2 milyon H1B başvurusu olduğunu iddia ediyor.Bu verileri programatik olarak toplamaya (okuyun: web kazıma) karar verdim çünkü ömrümün sonuna kadar kopyala/yapıştır yapmaya hiç niyetim yoktu! Aşağıdaki resimde, sitenin Boston'a ait H1B verilerinin bir kısmını gösterdiğini görebilirsiniz:
Bu eğitimde kullanılacak kütüphaneler arasında JSON nesnelerini ayrıştırmak için jsonlite, HTML'i “hasat eden” rvest, temel apply fonksiyonlarına ilerleme çubuğu eklediği için kişisel favorim olan pbapply ve R'ın büyük veri çerçevelerindeki performansını iyileştiren data.table bulunuyor.
Siteyi keşfettikçe, arama formunun otomatik doldurma seçenekleri sunduğunu fark edeceksiniz. Örneğin, şehir alanına “B” yazmak aşağıda gösterilen önerilerin yer aldığı bir modal açacaktır. Aşağıdaki resim, “B” yazdığımda çıkan otomatik doldurma seçeneklerini gösteriyor:
Bu, siteyi sorgulamak için otomatik doldurmayı verimli bir yol olarak kullanabileceğiniz anlamına gelir. Chrome ile sayfayı yeniden yükleyip sağ tıklayarak “İncele” seçeneğini kullanabilir, ardından geliştirici panelinde “Ağ”a gidip sayfada “B” yazarak modalın yüklenmesini sağlayabilirsiniz. Ağ panelindeki bağlantıları incelerken, aşağıdaki gibi şehirlerin JSON nesnesini döndüren bir PHP sorgusu bulacaksınız bu. Hedef, önce tüm önerilen şehirleri toplamak ve ardından bu listeyi kullanarak H1B verilerinin bulunduğu çok sayıda sayfayı kazımaktır. Önceki URL'yi incelediğinizde, bir harfle bittiğini fark edeceksiniz. Dolayısıyla, paste0() fonksiyonunu URL tabanı olan http://h1bdata.info/cities.php?term= ile ve letters ile birlikte kullanabilirsiniz. Taban, letters içindeki her değer için yeniden kullanılır. letters nesnesi, “a”dan “z”ye yerleşik bir R vektörüdür. json.cities nesnesi, tüm otomatik doldurma önerilerini JSON olarak içeren a'dan z'ye URL'lerin bir vektörüdür.
JSON Nesnelerini Ayrıştırmajson.cities nesnesi, R tarafından okunması gereken 26 bağlantıdan oluşan bir vektördür. lapply() veya pblapply() ile birlikte fromJSON kullanarak, R her bir JSON nesnesini ayrıştırarak all.cities oluşturur. Çıktının basit bir karakter vektörü olması için sonucu unlist içinde iç içe koyarsınız. Bu kodla, veri içeren gerçek web sayfalarını oluşturmak için kullanabileceğiniz tüm otomatik doldurma şehirleri bir vektörde toplanmış olur.
Tek tek sayfa yükleme sürelerini azaltmak için, her web sayfası sorgusuna şehir ve yıl olmak üzere iki parametre geçirmeye karar verebilirsiniz. Örneğin, 2012 için Boston H1B verileri, sonra 2013 Boston ve böyle devam eder. Faktör kombinasyonları oluştururken kullanmak için harika bir fonksiyon expand.grid()'dir. Aşağıdaki kodda, şehir bilgisi all.cities olarak, yıl ise 2012'den 2016'ya seq() kullanılarak geçirilir. Fonksiyon 5000+ şehir-yıl kombinasyonu oluşturur. expand.grid(), programatik olarak Boston 2012, Boston 2013, Boston 2014 vb. oluşturur; çünkü her şehir ve her yıl benzersiz bir faktör kombinasyonunu temsil eder.
Los Angeles gibi bazı şehirler iki kelimeden oluşur ve URL'ler için kodlanmaları gerekir. url_encode() fonksiyonu, adresi geçerli kılmak için “Los Angeles”ı Los%20Angeles'a dönüştürür. Tüm vektörü geçirirsiniz ve url_encode() satır bazında çalışır:
Son olarak, paste0() fonksiyonunu tekrar kullanarak, city.year içindeki şehir ve eyalet kombinasyonlarına temel URL'yi eklersiniz. Örnek bir bağlantıya buradan bakın.
Önceki adımları tamamladıktan sonra, her sayfadan verileri toplamak için main adlı özel bir fonksiyon oluşturabilirsiniz. Bu, rvest fonksiyonlarını kullanan basit bir iş akışıdır. Önce bir URL kabul edilir ve read_html() sayfa içeriğini ayrıştırır. Sonra sayfanın tek html_table'ı diğer tüm HTML bilgilerinden seçilir. main fonksiyonu, bellekte verimli saklanabilmesi için x nesnesini bir data.table'a dönüştürür. Son olarak, main'i kapatmadan önce bir Sys.sleep ekleyerek DDOS saldırısı olarak görülmenizi engelleyebilirsiniz.
Hadi şu verileri alalım! Kazımanın ilerlemesini takip edebilmek için pblapply() ile gelen ilerleme çubuğunu seviyorum. Basitçe all.urls ve main fonksiyonunu pblapply() fonksiyonuna geçirirsiniz. R anında işe koyulur: bir sayfayı yükler, tabloyu toplar ve o sayfa için bellekte bir data.table tutar. Her URL sırayla toplanır ve bellekte tutulur.
Off! Saatler sürdü! Bu noktada all.h1b, sayfa başına bir tane olmak üzere veri tablolarından oluşan bir listedir. Listeyi tek bir veri tablosunda birleştirmek için rbindlist kullanabilirsiniz. Bu, do.call(rbind, all.h1b) ile benzerdir ancak çok daha hızlıdır.
all.h1b<-rbindlist(all.h1b)
Son olarak verileri kaydedin ki bunu tekrar yapmak zorunda kalmayın. Şansınıza, bir kopyasını burada kaydettim.
write.csv(all.h1b,'h1b_data.csv', row.names=F)
Verilerinizi Temizleme
Verileri kazımış olsanız da, yönetilebilir bir formata getirmek için bazı ek adımlar gerekir.
Tarihleri düzenlemeye yardımcı olması için lubridate kullanırsınız. Ayrıca dize işlemleri için sarmalayıcılar sunan stringr'dan yararlanırsınız.
Web kazıma, 2 milyon H1B kaydının 1,8 milyonunu yakalamış görünüyor. Bana göre 1,8 milyon yeterince iyi. O halde verileri fread() ile yükleyelim: bu fonksiyon read.csv gibidir ama daha verimli “hızlı ve dost canlısı dosya düzenleyici”dir.
Kazınan veri sütun adları büyük harfli ve boşluk içeriyor.
Bu nedenle, adlarıyla başvurmak zahmetli; bu yüzden ilk yapmak istediğiniz şey onları yeniden adlandırmaktır.
Sütunları yeniden adlandırmak, atama operatörünün (<-) her iki tarafında da fonksiyonlar gerektirir. Solda colnames() kullanın ve veri çerçevesini geçirin. Operatörün sağ tarafında ise bir dizi karakter dizisi geçebilirsiniz.
Bu örnekte, önce özgün adları tolower() kullanarak küçük harfe çevirirsiniz. İkinci satırda, genel değiştirme fonksiyonu olan gsub() uygularsınız.
gsub() bir deseni tanıdığında, bu durumda bir boşluk, tüm örnekleri ikinci parametre olan alt çizgi ile değiştirir. Son olarak, artık küçük harfli veri çerçevesi sütunlarını temsil eden names(h1b.data) içinde değişiklikleri yapmasını gsub()'a söylemeniz gerekir.
Verileri keşfederken ilk kullandığım fonksiyonlardan biri tail() fonksiyonudur. Bu fonksiyon en alttaki satırları döndürür. Burada, tail() son 8 satırı döndürecektir.
Bu, verinin şeklini ve vektörlerin nasıl göründüğünü hızlıca görmenize yardımcı olur.
Sonra, her zaman vektörlerin sınıfını kontrol ederim. Web kazınmış verilerde, sayısal değerler veya faktörler metne dönüşebilir. Sınıfları şimdi düzeltmenin, ileride yaşanacak hayal kırıklıklarını önleyebileceğini göreceksiniz!
apply() fonksiyonunu kullanarak, h1b.datayı, sonra 2 ve sınıf fonksiyonunu geçebilirsiniz. 2 seçtiğiniz için, R her sütunun sınıfını kontrol eder ve konsolunuza döndürür. apply()'ı 1 ile satır bazında bir fonksiyon uygulamak için kullanabilirsiniz ama bu durumda işe yaramaz.
Tüm sütunlar “character” ve düzeltilmeleri gerekiyor. Tarih sütunlarından birini nasıl değiştireceğinizi göstereceğim, diğerlerini size bırakıyorum. Yanlış sınıflandırılmış tarihlerin son 6 satırını incelemek için tail() kullanın.
Tarihleri düzeltmek için, / eğik çizgilerinin - tirelere çevrilmesi gerekir. Yine gsub() kullanarak / karakterini arayıp - ile değiştirin.
Tireler yerleştirildikten sonra, "ay, gün, yıl" anlamına gelen mdy() uygularsınız. Bunun sebebi, tarihler o sırayla yazılmıştır. Sıra farklı olsaydı, mdy harflerini buna göre yeniden düzenlerdiniz.
Sütunun doğru değiştiğinden emin olmak için, tekrar sondan inceleyin ve sınıfı kontrol edin. tail() çıktısı “2016-03-11 UTC” benzeri tarihler yazdırmalı ve vektör sınıfı “character” yerine “POSIXct” olmalıdır.
Bu tür bir analiz için, tarihlerden yalnızca ay ve yılı çekip yeni sütunlara koymak iyi bir fikirdir. Aşağıdaki kodda $submit_month ve $submit_yr adlı iki yeni sütunun oluşturulduğunu görüyorsunuz.
lubridate içinde month() fonksiyonu, bir tarihten ay değerlerini çıkarmak için tüm bir sütuna uygulanabilir. Benzer şekilde year() fonksiyonu, h1b.data$submit_yr sütununu oluşturmak için tarih sütununu kabul eder. head() fonksiyonunu kullandığınızda, artık iki yeni sütunun oluşturulduğunu görmelisiniz.
Sonraki adımda, $base_salary sütununu inceleyelim. Binlik ayıracı olarak virgül içeriyor ve R bunu karakter olarak görüyor, bu yüzden değiştirilmesi gerekiyor. Yine gsub() imdada yetişir; virgülü kaldırır ve boş karakterle değiştirir. Ardından as.numeric(), değerleri resmen sayıya çevirmek için h1b.data$base_salary üzerine uygulanır.
Yeni vektörün bir kısmını üçüncü satırdaki head() ile inceleyebilirsiniz.
Bu veriyi eyalet bazında da ayırmanın bir yolu var. h1b.data$location sütununu incelediğinizde, şehir ve eyaletin bir virgülle ayrıldığını görürsünüz. Aşağıdaki kod, konum bilgisini ilk virgülde ayırmak için str_split_fixed() kullanır. Basitçe sütunu, ayırıcı karakteri ve döndürülecek sütun sayısını geçin. Ortaya çıkan state nesnesi, h1b.data ile aynı sayıda satıra ve 2 sütuna sahip büyük bir matristir.
Sonraki iki kod satırı, bireysel eyalet vektörlerini $city ve $state olarak h1b.data'ya sütun olarak bağlar. Vektörler mükemmel değildir; yazımlar “Winston Salem” ile “Winston-Salem” gibi farklı olabilir. Genel olarak, bu yöntem basit EDA için yeterince iyidir; ancak diğer analizlerde bazı terim kümelendirmelerine ihtiyaç duyulabileceğini unutmayın.
Bir H1B vizesine başvuruyor olsaydınız, kabul edilme şansımı artırmak için hangi eyaletlerde daha fazla başvuru olduğunu bilmek isterdiniz. table() fonksiyonu, kategorik değişkenleri saymak için kullanılır ve h1b.data$state'e kolayca uygulanır. İkinci satırda, eyalet adlarını ve sayılan H1B verilerini yakalamak için küçük bir veri çerçevesi oluşturabilirsiniz.
state.tally ve barplot() kullanmak, eyalete göre H1B değerlerinin temel bir çubuk grafiğini oluşturur. İkinci parametre names.arg çubuk etiketlerini belirtir ve las=3 R'a etiketleri dikey yerleştirmesini söyler. Virgülle ayrımdan kaynaklanan bazı dağınık konumları görebilirsiniz ama mesaj açık… bir H1B başvuranı muhtemelen CA, NJ, NY veya TX'tedir.
Sırada, H1B vizeleri ile dış bir olgu arasındaki korelasyonu anlamaya çalışalım. Basitlik adına, R'da state.x77 adlı yerleşik bir veri seti vardır. Bu, her biri bir eyaleti temsil eden 50 satır ve 1977 ABD Nüfus Sayımı'ndaki nüfus ve yaşam beklentisi gibi bilgiler içeren bir matristir.
İpucu: kendi analizinizde daha güncel bir veri kaynağı kullanın.
Şimdilik, state.x77 kullanmak öğrenmek için iyi bir örnek. Bu yerleşik veri setini head() ile inceleyin.
Bu bilgileri ilişkileri anlamak için state.tally verileriyle daha büyük bir veri çerçevesinde birleştirelim. Bunun için, eyalet kısaltmalarını, state.abb, ve eski 1977 Nüfus Sayımı verilerini içeren bir state.data veri çerçevesi oluşturun. Ardından state.tally ve state.data'yı geçirerek merge çağrısı yapın.
Birleştirme için state sütununu açıkça vektör olarak bildirebilirsiniz. Üçüncü satırda 15'ten 20'ye kadar olan satırları indeksleyerek veri çerçevesinin bir kısmını inceleyin.
Temel bir EDA fonksiyonu cor'dur: bu, iki değişken arasındaki korelasyonu yazdırır.
Korelasyonun -1 ile 1 arasında olduğunu unutmayın: 0, değişkenlerin korelasyonu olmadığı ve muhtemelen ilgisiz olduğu anlamına gelir. 1'e yaklaşan bir sayı, değerlerin pozitif yönde ilişkili olduğu anlamına gelir (umarız R programlama ve gelir gibi). Negatif bir sayı, R programlama ile sosyal bir hayat gibi ilişkinin zıt yönlerde hareket ettiği anlamına gelir!
Bu kod, 1977 eyalet nüfusuna ve mevcut H1B sayımlarına cor uygular. Zaman uyumsuzluğuna rağmen kodun analizi nasıl yapacağınızı göstermek için yazıldığını unutmayın. Veri çerçevesindeki başka bir vektöre başvurmak için $Population'ı değiştirebilirsiniz.
Değişken ilişkilerini araştırmanın bir başka yolu da saçılım grafiği, özellikle de saçılım matrisi kullanmaktır. pairs() ile hızlıca bir saçılım matrisi çizebilirsiniz. Aşağıdaki kod, ilişkileri tanımlamak için bir formül kullanır. Her sütun araya artı işareti konarak tek tek bildirilir. data parametresi veri çerçevesini kabul eder ve main sadece grafik başlığını belirtir.
pairs(~ h1b + Population + Income,
data = state.data,
main='h1b relationships')Altyapı:
Bu saçılım matrisi, H1B sayımlarını eyalet Population ve Income ile görselleştirir.
Population ile h1b arasında bir ilişki gözlemleyebilirsiniz. Bu sezgisel olarak mantıklıdır; zira nüfusu daha fazla olan eyaletlerde H1B vizesi gerektiren iş fırsatları daha fazla olacaktır.
Matristen tek bir grafiğe “yakınlaştırmak” için basitçe plot() çağırın ve iki değişkeni geçin.
plot(state.data$Income,state.data$h1b,
main ='Income to H1B')Altyapı:
H1B Vize Verilerinizle Sonraki Adımlar
H1B vizesi keşfimize daha yeni başladınız! Bu veri seti oldukça zengin ve sonraki yazıda maaş verilerini keşfedecek, aykırı değerleri temizleyecek ve daha etkileyici ggplot2 görselleri oluşturacaksınız.
Ayrıca bu EDA kavramlarının üzerine, zaman içindeki H1B durumunu ve en büyük işverenleri inceleyerek inşa edeceksiniz. Size şimdiden göstereceğim havalı görsellerden biri, aşağıdaki kodu kullanarak H1B vize durumuna göre maaş dağılımlarını gösteren kutu grafiktir:
Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Bu eğitimin amacı, R ile web kazıma yoluyla H1B vizeleri hakkında nasıl veri toplayabileceğinizi göstermek. Ardından, JSON nesnelerini nasıl ayrıştırabileceğinizi ve verileri nasıl saklayıp işleyebileceğinizi, böylece H1B başvurularının büyük veri seti üzerinde temel bir keşif amaçlı veri analizi (EDA) yapabileceğinizi de öğreneceksiniz.
Belki kendinizi bir aday olarak nasıl en iyi konumlandırabileceğinizi ya da yeni R kodları öğrenebilirsiniz!
Giriş
Geçen hafta, DataCamp'in blogundaki "Veriler H-1B Vize Başvurunuza Yardımcı Olabilir mi" yazısı, yıllar içindeki H-1B verilerinin analizine ilişkin bazı sonuçları sundu. Şimdi, işe koyulup verileri kendiniz analiz etme ve başka neler bulabileceğinizi görme zamanı! Ted Kwartler sizi bir dizi R eğitimle bunun üzerinden geçirecek.
H1B vizeleri başvurusunda bulunan bir Teksas hukuk firmasında çalışan bir arkadaşım var. H1B, Amerika Birleşik Devletleri'nde, ABD işverenlerinin yabancı çalışanları belirli uzmanlık gerektiren pozisyonlarda geçici olarak çalıştırmasına olanak tanıyan göçmen olmayan bir vizedir. Görünüşe göre kabul edilmek son derece zor, çünkü sınırlı sayıda vize var ve başvuranlar binleri buluyor. Bu anekdotsal olsa da, nitelikli adaylara ABD'nin misafirperver bir yer olduğunu bilmelerine yardımcı olma umuduyla verileri kendim keşfetmeye karar verdim!
Verilerinizi Alma: Web Kazıma ve Ayrıştırma
DataCamp'teki bir meslektaşım beni, 2012'den 2016'ya kadar H1B verilerini içeren basit bir web sitesi olan bu siteye yönlendirdi.Site, tek bir tabloda düzenlenmiş 2 milyon H1B başvurusu olduğunu iddia ediyor.Bu verileri programatik olarak toplamaya (okuyun: web kazıma) karar verdim çünkü ömrümün sonuna kadar kopyala/yapıştır yapmaya hiç niyetim yoktu! Aşağıdaki resimde, sitenin Boston'a ait H1B verilerinin bir kısmını gösterdiğini görebilirsiniz:
Bu eğitimde kullanılacak kütüphaneler arasında JSON nesnelerini ayrıştırmak için
jsonlite, HTML'i “hasat eden”rvest, temel apply fonksiyonlarına ilerleme çubuğu eklediği için kişisel favorim olanpbapplyve R'ın büyük veri çerçevelerindeki performansını iyileştirendata.tablebulunuyor.Sayfa Yapısını Keşfetme
Siteyi keşfettikçe, arama formunun otomatik doldurma seçenekleri sunduğunu fark edeceksiniz. Örneğin, şehir alanına “B” yazmak aşağıda gösterilen önerilerin yer aldığı bir modal açacaktır. Aşağıdaki resim, “B” yazdığımda çıkan otomatik doldurma seçeneklerini gösteriyor:
Bu, siteyi sorgulamak için otomatik doldurmayı verimli bir yol olarak kullanabileceğiniz anlamına gelir. Chrome ile sayfayı yeniden yükleyip sağ tıklayarak “İncele” seçeneğini kullanabilir, ardından geliştirici panelinde “Ağ”a gidip sayfada “B” yazarak modalın yüklenmesini sağlayabilirsiniz. Ağ panelindeki bağlantıları incelerken, aşağıdaki gibi şehirlerin JSON nesnesini döndüren bir PHP sorgusu bulacaksınız bu. Hedef, önce tüm önerilen şehirleri toplamak ve ardından bu listeyi kullanarak H1B verilerinin bulunduğu çok sayıda sayfayı kazımaktır. Önceki URL'yi incelediğinizde, bir harfle bittiğini fark edeceksiniz. Dolayısıyla,
paste0()fonksiyonunu URL tabanı olanhttp://h1bdata.info/cities.php?term=ile velettersile birlikte kullanabilirsiniz. Taban,lettersiçindeki her değer için yeniden kullanılır.lettersnesnesi, “a”dan “z”ye yerleşik bir R vektörüdür.json.citiesnesnesi, tüm otomatik doldurma önerilerini JSON olarak içeren a'dan z'ye URL'lerin bir vektörüdür.json.citiesnesnesi, R tarafından okunması gereken 26 bağlantıdan oluşan bir vektördür.lapply()veyapblapply()ile birliktefromJSONkullanarak, R her bir JSON nesnesini ayrıştırarakall.citiesoluşturur. Çıktının basit bir karakter vektörü olması için sonucuunlistiçinde iç içe koyarsınız. Bu kodla, veri içeren gerçek web sayfalarını oluşturmak için kullanabileceğiniz tüm otomatik doldurma şehirleri bir vektörde toplanmış olur.expand.grid()'dir. Aşağıdaki kodda, şehir bilgisiall.citiesolarak, yıl ise 2012'den 2016'yaseq()kullanılarak geçirilir. Fonksiyon 5000+ şehir-yıl kombinasyonu oluşturur.expand.grid(), programatik olarak Boston 2012, Boston 2013, Boston 2014 vb. oluşturur; çünkü her şehir ve her yıl benzersiz bir faktör kombinasyonunu temsil eder. Los Angeles gibi bazı şehirler iki kelimeden oluşur ve URL'ler için kodlanmaları gerekir.url_encode()fonksiyonu, adresi geçerli kılmak için “Los Angeles”ı Los%20Angeles'a dönüştürür. Tüm vektörü geçirirsiniz veurl_encode()satır bazında çalışır: Son olarak,paste0()fonksiyonunu tekrar kullanarak,city.yeariçindeki şehir ve eyalet kombinasyonlarına temel URL'yi eklersiniz. Örnek bir bağlantıya buradan bakın.Sayfalardan Bilgi Çıkarmak
Önceki adımları tamamladıktan sonra, her sayfadan verileri toplamak için
mainadlı özel bir fonksiyon oluşturabilirsiniz. Bu,rvestfonksiyonlarını kullanan basit bir iş akışıdır. Önce bir URL kabul edilir veread_html()sayfa içeriğini ayrıştırır. Sonra sayfanın tekhtml_table'ı diğer tüm HTML bilgilerinden seçilir.mainfonksiyonu, bellekte verimli saklanabilmesi içinxnesnesini birdata.table'a dönüştürür. Son olarak,main'i kapatmadan önce birSys.sleepekleyerek DDOS saldırısı olarak görülmenizi engelleyebilirsiniz.Hadi şu verileri alalım! Kazımanın ilerlemesini takip edebilmek için
pblapply()ile gelen ilerleme çubuğunu seviyorum.Basitçe
all.urlsvemainfonksiyonunupblapply()fonksiyonuna geçirirsiniz. R anında işe koyulur: bir sayfayı yükler, tabloyu toplar ve o sayfa için bellekte bir data.table tutar. Her URL sırayla toplanır ve bellekte tutulur.Verileri Tek Bir Data Table'da Birleştirme
Off! Saatler sürdü! Bu noktada
all.h1b, sayfa başına bir tane olmak üzere veri tablolarından oluşan bir listedir. Listeyi tek bir veri tablosunda birleştirmek içinrbindlistkullanabilirsiniz. Bu,do.call(rbind, all.h1b)ile benzerdir ancak çok daha hızlıdır.all.h1b<-rbindlist(all.h1b)Son olarak verileri kaydedin ki bunu tekrar yapmak zorunda kalmayın. Şansınıza, bir kopyasını burada kaydettim.
write.csv(all.h1b,'h1b_data.csv', row.names=F)Verilerinizi Temizleme
Verileri kazımış olsanız da, yönetilebilir bir formata getirmek için bazı ek adımlar gerekir.
Tarihleri düzenlemeye yardımcı olması için
lubridatekullanırsınız. Ayrıca dize işlemleri için sarmalayıcılar sunanstringr'dan yararlanırsınız.Kişisel bir tercih olmakla birlikte,
scipen=999kullanmayı seviyorum. Zorunlu değil ama bilimsel gösterimi ortadan kaldırır.Web kazıma, 2 milyon H1B kaydının 1,8 milyonunu yakalamış görünüyor. Bana göre 1,8 milyon yeterince iyi. O halde verileri
fread()ile yükleyelim: bu fonksiyonread.csvgibidir ama daha verimli “hızlı ve dost canlısı dosya düzenleyici”dir.Kazınan veri sütun adları büyük harfli ve boşluk içeriyor.
Bu nedenle, adlarıyla başvurmak zahmetli; bu yüzden ilk yapmak istediğiniz şey onları yeniden adlandırmaktır.
Sütunları yeniden adlandırmak, atama operatörünün (
<-) her iki tarafında da fonksiyonlar gerektirir. Soldacolnames()kullanın ve veri çerçevesini geçirin. Operatörün sağ tarafında ise bir dizi karakter dizisi geçebilirsiniz.Bu örnekte, önce özgün adları
tolower()kullanarak küçük harfe çevirirsiniz. İkinci satırda, genel değiştirme fonksiyonu olangsub()uygularsınız.gsub()bir deseni tanıdığında, bu durumda bir boşluk, tüm örnekleri ikinci parametre olan alt çizgi ile değiştirir. Son olarak, artık küçük harfli veri çerçevesi sütunlarını temsil edennames(h1b.data)içinde değişiklikleri yapmasınıgsub()'a söylemeniz gerekir.Verileri keşfederken ilk kullandığım fonksiyonlardan biri
tail()fonksiyonudur. Bu fonksiyon en alttaki satırları döndürür. Burada,tail()son 8 satırı döndürecektir.Bu, verinin şeklini ve vektörlerin nasıl göründüğünü hızlıca görmenize yardımcı olur.
Sonra, her zaman vektörlerin sınıfını kontrol ederim. Web kazınmış verilerde, sayısal değerler veya faktörler metne dönüşebilir. Sınıfları şimdi düzeltmenin, ileride yaşanacak hayal kırıklıklarını önleyebileceğini göreceksiniz!
apply()fonksiyonunu kullanarak,h1b.datayı, sonra2ve sınıf fonksiyonunu geçebilirsiniz.2seçtiğiniz için, R her sütunun sınıfını kontrol eder ve konsolunuza döndürür.apply()'ı 1 ile satır bazında bir fonksiyon uygulamak için kullanabilirsiniz ama bu durumda işe yaramaz.Ah Tüh!
Tüm sütunlar “character” ve düzeltilmeleri gerekiyor. Tarih sütunlarından birini nasıl değiştireceğinizi göstereceğim, diğerlerini size bırakıyorum. Yanlış sınıflandırılmış tarihlerin son 6 satırını incelemek için
tail()kullanın.Tarihleri düzeltmek için,
/eğik çizgilerinin-tirelere çevrilmesi gerekir. Yinegsub()kullanarak/karakterini arayıp-ile değiştirin.Tireler yerleştirildikten sonra, "ay, gün, yıl" anlamına gelen
mdy()uygularsınız. Bunun sebebi, tarihler o sırayla yazılmıştır. Sıra farklı olsaydı,mdyharflerini buna göre yeniden düzenlerdiniz.Sütunun doğru değiştiğinden emin olmak için, tekrar sondan inceleyin ve sınıfı kontrol edin.
tail()çıktısı “2016-03-11 UTC” benzeri tarihler yazdırmalı ve vektör sınıfı “character” yerine “POSIXct” olmalıdır.Bu tür bir analiz için, tarihlerden yalnızca ay ve yılı çekip yeni sütunlara koymak iyi bir fikirdir. Aşağıdaki kodda
$submit_monthve$submit_yradlı iki yeni sütunun oluşturulduğunu görüyorsunuz.lubridateiçindemonth()fonksiyonu, bir tarihten ay değerlerini çıkarmak için tüm bir sütuna uygulanabilir. Benzer şekildeyear()fonksiyonu,h1b.data$submit_yrsütununu oluşturmak için tarih sütununu kabul eder.head()fonksiyonunu kullandığınızda, artık iki yeni sütunun oluşturulduğunu görmelisiniz.Sonraki adımda,
$base_salarysütununu inceleyelim. Binlik ayıracı olarak virgül içeriyor ve R bunu karakter olarak görüyor, bu yüzden değiştirilmesi gerekiyor. Yinegsub()imdada yetişir; virgülü kaldırır ve boş karakterle değiştirir. Ardındanas.numeric(), değerleri resmen sayıya çevirmek içinh1b.data$base_salaryüzerine uygulanır.Yeni vektörün bir kısmını üçüncü satırdaki
head()ile inceleyebilirsiniz.Bu veriyi eyalet bazında da ayırmanın bir yolu var.
h1b.data$locationsütununu incelediğinizde, şehir ve eyaletin bir virgülle ayrıldığını görürsünüz. Aşağıdaki kod, konum bilgisini ilk virgülde ayırmak içinstr_split_fixed()kullanır. Basitçe sütunu, ayırıcı karakteri ve döndürülecek sütun sayısını geçin. Ortaya çıkan state nesnesi,h1b.dataile aynı sayıda satıra ve 2 sütuna sahip büyük bir matristir.Sonraki iki kod satırı, bireysel eyalet vektörlerini
$cityve$stateolarakh1b.data'ya sütun olarak bağlar. Vektörler mükemmel değildir; yazımlar “Winston Salem” ile “Winston-Salem” gibi farklı olabilir. Genel olarak, bu yöntem basit EDA için yeterince iyidir; ancak diğer analizlerde bazı terim kümelendirmelerine ihtiyaç duyulabileceğini unutmayın.Verilerinizi Keşfetme: İlk Adımlar
Bir H1B vizesine başvuruyor olsaydınız, kabul edilme şansımı artırmak için hangi eyaletlerde daha fazla başvuru olduğunu bilmek isterdiniz.
table()fonksiyonu, kategorik değişkenleri saymak için kullanılır veh1b.data$state'e kolayca uygulanır. İkinci satırda, eyalet adlarını ve sayılan H1B verilerini yakalamak için küçük bir veri çerçevesi oluşturabilirsiniz.state.tallyvebarplot()kullanmak, eyalete göre H1B değerlerinin temel bir çubuk grafiğini oluşturur. İkinci parametrenames.argçubuk etiketlerini belirtir velas=3R'a etiketleri dikey yerleştirmesini söyler. Virgülle ayrımdan kaynaklanan bazı dağınık konumları görebilirsiniz ama mesaj açık… bir H1B başvuranı muhtemelen CA, NJ, NY veya TX'tedir.2012'den 2016'ya eyalet bazında H1B vizesi sayımını görüyorsunuz.
Sırada, H1B vizeleri ile dış bir olgu arasındaki korelasyonu anlamaya çalışalım. Basitlik adına, R'da
state.x77adlı yerleşik bir veri seti vardır. Bu, her biri bir eyaleti temsil eden 50 satır ve 1977 ABD Nüfus Sayımı'ndaki nüfus ve yaşam beklentisi gibi bilgiler içeren bir matristir.İpucu: kendi analizinizde daha güncel bir veri kaynağı kullanın.
Şimdilik,
state.x77kullanmak öğrenmek için iyi bir örnek. Bu yerleşik veri setinihead()ile inceleyin.Bu bilgileri ilişkileri anlamak için
state.tallyverileriyle daha büyük bir veri çerçevesinde birleştirelim. Bunun için, eyalet kısaltmalarını, state.abb, ve eski 1977 Nüfus Sayımı verilerini içeren birstate.dataveri çerçevesi oluşturun. Ardındanstate.tallyvestate.data'yı geçirerek merge çağrısı yapın.Birleştirme için
statesütununu açıkça vektör olarak bildirebilirsiniz. Üçüncü satırda 15'ten 20'ye kadar olan satırları indeksleyerek veri çerçevesinin bir kısmını inceleyin.Temel bir EDA fonksiyonu
cor'dur: bu, iki değişken arasındaki korelasyonu yazdırır.Korelasyonun -1 ile 1 arasında olduğunu unutmayın: 0, değişkenlerin korelasyonu olmadığı ve muhtemelen ilgisiz olduğu anlamına gelir. 1'e yaklaşan bir sayı, değerlerin pozitif yönde ilişkili olduğu anlamına gelir (umarız R programlama ve gelir gibi). Negatif bir sayı, R programlama ile sosyal bir hayat gibi ilişkinin zıt yönlerde hareket ettiği anlamına gelir!
Bu kod, 1977 eyalet nüfusuna ve mevcut H1B sayımlarına
coruygular. Zaman uyumsuzluğuna rağmen kodun analizi nasıl yapacağınızı göstermek için yazıldığını unutmayın. Veri çerçevesindeki başka bir vektöre başvurmak için$Population'ı değiştirebilirsiniz.Değişken ilişkilerini araştırmanın bir başka yolu da saçılım grafiği, özellikle de saçılım matrisi kullanmaktır.
pairs()ile hızlıca bir saçılım matrisi çizebilirsiniz. Aşağıdaki kod, ilişkileri tanımlamak için bir formül kullanır. Her sütun araya artı işareti konarak tek tek bildirilir.dataparametresi veri çerçevesini kabul eder ve main sadece grafik başlığını belirtir.Bu saçılım matrisi, H1B sayımlarını eyalet
PopulationveIncomeile görselleştirir.Populationileh1barasında bir ilişki gözlemleyebilirsiniz. Bu sezgisel olarak mantıklıdır; zira nüfusu daha fazla olan eyaletlerde H1B vizesi gerektiren iş fırsatları daha fazla olacaktır.Matristen tek bir grafiğe “yakınlaştırmak” için basitçe
plot()çağırın ve iki değişkeni geçin.H1B Vize Verilerinizle Sonraki Adımlar
H1B vizesi keşfimize daha yeni başladınız! Bu veri seti oldukça zengin ve sonraki yazıda maaş verilerini keşfedecek, aykırı değerleri temizleyecek ve daha etkileyici
ggplot2görselleri oluşturacaksınız.Ayrıca bu EDA kavramlarının üzerine, zaman içindeki H1B durumunu ve en büyük işverenleri inceleyerek inşa edeceksiniz. Size şimdiden göstereceğim havalı görsellerden biri, aşağıdaki kodu kullanarak H1B vize durumuna göre maaş dağılımlarını gösteren kutu grafiktir:
"R ile H-1B Verilerini Keşfetme" eğitim serisinin bir diğer bölümü için bizi izlemeye devam edin! Bu arada, R veri çerçevesi eğitimimize, R'de Veri İçeri Aktarma kursumuza veya dplyr ile R'da Veri Manipülasyonu kursumuza göz atmayı düşünebilirsiniz.