L'obiettivo di questo tutorial è mostrarti come raccogliere dati sui visti H1B tramite web scraping con R. In seguito, imparerai anche come fare il parsing degli oggetti JSON e come archiviare e manipolare i dati per poter eseguire un'analisi esplorativa di base (EDA) sul grande set di dati delle pratiche H1B.
Magari scoprirai come presentarti al meglio come candidato o imparerai del nuovo codice R!
Introduzione
La settimana scorsa, il blog di DataCamp "Can Data Help Your H-1B Visa Application" ti ha presentato alcuni risultati di un'analisi dei dati H-1B nel corso degli anni. Ora è il momento di sporcarti le mani, analizzare i dati in prima persona e vedere cos'altro riesci a trovare! Ted Kwartler ti guiderà con una serie di tutorial in R.
Ho un amico in uno studio legale in Texas che si occupa di pratiche H1B. L'H1B è un visto per non immigranti negli Stati Uniti che consente ai datori di lavoro statunitensi di assumere temporaneamente lavoratori stranieri in occupazioni specialistiche. A quanto pare, essere accettati è estremamente difficile perché l'offerta di visti è limitata rispetto alle migliaia di candidati. Anche se questo è aneddotico, ho deciso di esplorare i dati di persona nella speranza di aiutare i candidati qualificati a sapere che gli USA sono un luogo accogliente!
Ottenere i dati: web scraping e parsing
Un collega di DataCamp mi ha indicato questo sito, un sito semplice che contiene dati H1B dal 2012 al 2016. Il sito sostiene di avere 2 milioni di domande H1B organizzate in un'unica tabella.Ho deciso di raccogliere questi dati in modo programmatico (leggi: fare web scraping) perché non avevo intenzione di fare copia/incolla per il resto della vita! Come puoi vedere, l'immagine qui sotto mostra una parte del sito con i dati H1B di Boston:
Le librerie usate in questo tutorial includono jsonlite per il parsing di oggetti JSON, rvest che “raccoglie” HTML, pbapply, una delle mie preferite perché aggiunge barre di avanzamento alle funzioni apply di base, e data.table, che migliora le prestazioni di R su data frame di grandi dimensioni.
library(jsonlite)library(rvest)library(pbapply)library(data.table)Offerto da
Esplorare la struttura della pagina
Esplorando il sito, ti accorgerai che il modulo di ricerca suggerisce opzioni di precompilazione. Ad esempio, digitando “B” nel campo città comparirà una modale con i suggerimenti mostrati sotto. L'immagine seguente mostra le opzioni di precompilazione quando digito “B”:
Questo significa che puoi usare la precompilazione come modo efficiente per interrogare il sito. Con Chrome, puoi ricaricare e poi cliccare con il tasto destro su “Ispeziona” nella pagina, quindi andare su “Network” nel pannello sviluppatore e infine digitare “B” sulla pagina per caricare la modale. Esplorando i link del pannello Network, troverai una query PHP che restituisce un oggetto JSON di città come questa. L'obiettivo è prima raccogliere tutte le città suggerite e poi usare quell'elenco per fare scraping di un gran numero di pagine con dati H1B. Esplorando l'URL precedente, noterai che termina con una lettera. Quindi puoi usare paste0() con la base dell'URL, http://h1bdata.info/cities.php?term=, e letters. La base viene riciclata per ogni valore in letters. L'oggetto letters è un vettore incorporato di R da “a” a “z”. L'oggetto json.cities è un vettore di URL, da a a z, che contengono tutti i suggerimenti di precompilazione in formato JSON.
json.cities<-paste0('http://h1bdata.info/cities.php?term=', letters)Offerto da
Parsing di oggetti JSON L'oggetto json.cities è un vettore di 26 link che devono essere letti da R. Usando lapply() o pblapply() insieme a fromJSON, R farà il parsing di ciascun oggetto JSON per creare all.cities. Incapsuli il risultato in unlist così l'output è un semplice vettore di stringhe. Con questo codice, hai tutte le città di precompilazione organizzate in un vettore che puoi usare per costruire le vere pagine web contenenti i dati.
all.cities<-unlist(pblapply(json.cities,fromJSON))Offerto da
Per ridurre i tempi di caricamento delle singole pagine, puoi decidere di passare due parametri, città e anno, in ogni query della pagina. Per esempio, i dati H1B di Boston nel 2012, poi Boston 2013 e così via. Una funzione ottima da usare quando crei combinazioni di fattori è expand.grid(). Nel codice sotto, vedi che si passa l'informazione della città, all.cities, e poi l'anno usando seq() dal 2012 al 2016. La funzione crea oltre 5000 combinazioni città-anno. expand.grid() crea in modo programmatico Boston 2012, Boston 2013, Boston 2014, ecc. perché ogni città e ogni anno rappresentano una combinazione unica di fattori.
city.year<-expand.grid(city=all.cities,yr=seq(2012,2016))Offerto da
Alcune città come Los Angeles sono composte da due parole e devono essere codificate per gli URL. La funzione url_encode() cambia “Los Angeles” in Los%20Angeles per rendere l'indirizzo valido. Passi dentro l'intero vettore e url_encode() lavorerà riga per riga:
city.year$city<-urltools::url_encode(as.character(city.year$city))Offerto da
Infine, usi di nuovo la funzione paste0() per concatenare la base dell'URL alle combinazioni di città e stato in city.year. Dai un'occhiata a un link di esempio qui.
all.urls<-paste0('http://h1bdata.info/index.php?em=&job=&city=', city.year[,1],'&year=', city.year[,2])Offerto da
Estrarre informazioni dalle pagine
Una volta completati i passaggi precedenti, puoi creare una funzione personalizzata chiamata main per raccogliere i dati da ciascuna pagina. È un flusso semplice che usa funzioni di rvest. Per prima cosa, si accetta un URL e read_html() fa il parsing dei contenuti della pagina. Poi si seleziona la singola html_table della pagina rispetto a tutte le altre informazioni HTML. La funzione main converte l'oggetto x in un data.table così può essere memorizzato in modo efficiente. Infine, prima di chiudere main, puoi aggiungere un Sys.sleep così non verrai considerato un attacco DDoS.
main<-function(url.x){
x<-read_html(url.x)
x<-html_table(x)
x<-data.table(x[[1]])return(x)
Sys.sleep(5)}Offerto da
Andiamo a prendere quei dati! Mi piace avere la barra di avanzamento di pblapply() per tenere traccia dello scraping. Ti basta passare all.urls e la funzione main nella funzione pblapply(). Subito R inizia a caricare una pagina, raccogliere la tabella e mantenere un data.table in memoria per quella pagina. Ogni URL viene raccolto a turno e mantenuto in memoria.
Uff! Ci sono volute ore! A questo punto all.h1b è un elenco di data table, uno per pagina. Per unificare l'elenco in un unico data table, puoi usare rbindlist. È simile a do.call(rbind, all.h1b) ma molto più veloce.
all.h1b<-rbindlist(all.h1b)
Infine salva i dati così non dovrai rifarlo. Per tua fortuna, ne ho salvata una copia qui.
write.csv(all.h1b,'h1b_data.csv', row.names=F)
Pulire i dati
Anche se hai fatto lo scraping dei dati, servono alcuni passaggi aggiuntivi per portarli in un formato gestibile.
Usi lubridate per aiutarti a organizzare le date. Usi anche stringr, che fornisce wrapper per la manipolazione di stringhe.
Si scopre che lo scraping ha catturato 1,8 milioni dei 2 milioni di record H1B. A mio parere, 1,8 milioni sono abbastanza. Quindi carichiamo i dati usando fread(): questa funzione è come read.csv ma è il più efficiente “fast & friendly file finagler”.
I nomi delle colonne dei dati estratti sono in maiuscolo e contengono spazi.
Di conseguenza, referenziarli per nome è scomodo, quindi la prima cosa da fare è rinominarli.
Rinominare le colonne richiede funzioni su entrambi i lati dell'operatore di assegnazione (<-). A sinistra usa colnames() e passa il data frame. A destra dell'operatore, puoi passare un vettore di stringhe.
In questo esempio, prima prendi i nomi originali e li trasformi in minuscolo con tolower(). Nella seconda riga applichi gsub(), una funzione di sostituzione globale.
Quando gsub() riconosce un pattern, in questo caso uno spazio, sostituirà tutte le occorrenze con il secondo parametro, l'underscore. Infine, devi dire a gsub() di effettuare le sostituzioni in names(h1b.data) che rappresentano le colonne ora in minuscolo.
colnames(h1b.data)<-tolower(names(h1b.data))colnames(h1b.data)<-gsub(' ','_',names(h1b.data))Offerto da
Una delle prime funzioni che uso quando esploro i dati è tail(). Questa funzione restituisce le righe in fondo. Qui, tail() restituirà le ultime 8 righe.
Questo ti aiuta a vedere rapidamente com'è la forma dei dati e i vettori.
Successivamente, controllo sempre la classe dei vettori. Con i dati estratti dal web, valori numerici o fattori possono diventare testo. Vedrai che correggere le classi ora può evitare frustrazioni dopo!
Usando la funzione apply(), puoi passare h1b.data, poi 2 e la funzione class. Dal momento che hai selezionato 2, R controllerà la classe di ogni colonna e la stamperà in console. Puoi usare apply() con 1 per applicare una funzione per riga ma qui non aiuterebbe.
Tutte le colonne sono “character” e vanno corrette. Ti mostrerò come cambiare una delle colonne delle date e lascerò le altre a te. Usando tail(), puoi esaminare le ultime 6 righe delle date classificate male.
Per correggere le date, le barre / devono essere cambiate in -. Ancora una volta, usa gsub() per cercare / e sostituirlo con -.
tail(h1b.data$submit_date)
h1b.data$submit_date<-gsub('/','-', h1b.data$submit_date)Offerto da
Con i trattini al loro posto, applichi mdy() che sta per “month, day, year”. Questo perché le date sono dichiarate in quell'ordine. Se l'ordine fosse diverso, riorganizzeresti le lettere di mdy di conseguenza.
Per assicurarti che la colonna sia stata cambiata correttamente, riesamini la coda e controlli la classe. tail() dovrebbe stampare date simili a “2016-03-11 UTC” e la classe del vettore dovrebbe essere “POSIXct” invece di “character”.
h1b.data$submit_date<-mdy(h1b.data$submit_date)tail(h1b.data$submit_date)class(h1b.data$submit_date)Offerto da
Per questo tipo di analisi, è una buona idea estrarre solo il mese e l'anno dalle date in nuove colonne. Nel codice sotto vedi che vengono dichiarate due nuove colonne $submit_month e $submit_yr.
All'interno di lubridate la funzione month() può essere applicata a un'intera colonna per estrarre i valori del mese da una data. La funzione year() accetta allo stesso modo la colonna di date per creare h1b.data$submit_yr. Usando la funzione head(), ora dovresti vedere che sono state create due nuove colonne.
h1b.data$submit_month<-month(h1b.data$submit_date, label=T)
h1b.data$submit_yr<-year(h1b.data$submit_date)head(h1b.data)Offerto da
Ora esaminiamo la colonna $base_salary. Ha una virgola nelle migliaia e R la considera un carattere, quindi va cambiata. Ancora una volta gsub() corre in aiuto per rimuovere la virgola e sostituirla con un carattere vuoto. Poi as.numeric() viene applicato a h1b.data$base_salary per cambiare ufficialmente i valori in numeri.
Puoi esaminare una parte del nuovo vettore con head() nella terza riga.
h1b.data$base_salary<-gsub(',','',h1b.data$base_salary)
h1b.data$base_salary<-as.numeric(h1b.data$base_salary)head(h1b.data$base_salary)Offerto da
Un altro modo di segmentare questi dati è per stato. Esaminando la colonna h1b.data$location, vedi che città e stato sono separati da una virgola. Il codice sotto usa str_split_fixed() per separare le informazioni di località alla prima virgola. Ti basta passare la colonna, il carattere separatore e il numero di colonne da restituire. L'oggetto state risultante è una grande matrice con lo stesso numero di righe di h1b.data e 2 colonne.
state<-str_split_fixed(h1b.data$location,', ',2)Offerto da
Le due righe di codice successive concatenano per colonna i singoli vettori di stato come $city e $state a h1b.data. I vettori non sono perfetti perché l'ortografia può differire, come “Winston Salem” rispetto a “Winston-Salem”. Nel complesso, questo metodo è abbastanza buono per una semplice EDA, ma tieni presente che in altre analisi potrebbe essere necessaria un'aggregazione dei termini.
h1b.data$city<-state[,1]
h1b.data$state<-state[,2]Offerto da
Esplorare i dati: primi passi
Se stessi facendo domanda per un visto H1B, vorresti sapere quali stati hanno più opportunità per aumentare le tue chance di essere accettato. La funzione table() serve a conteggiare variabili categoriche e si applica facilmente a h1b.data$state. Nella seconda riga, puoi creare un piccolo data frame per raccogliere i nomi degli stati e i conteggi H1B.
state.tally<-table(h1b.data$state)
state.tally<-data.frame(state=names(state.tally), h1b=as.vector(state.tally))Offerto da
Usando state.tally e barplot() creerai un istogramma base dei valori H1B per stato. Il secondo parametro names.arg dichiara le etichette delle barre e las=3 dice a R di posizionare le etichette verticalmente. Noterai qualche località scritta male per via della divisione sulla virgola, ma il punto è chiaro… un richiedente H1B probabilmente sarà in CA, NJ, NY o TX.
barplot(state.tally$h1b,
names.arg =names(table(h1b.data$state)),
las=3)Offerto da
Vedi il conteggio dei visti H1B per stato dal 2012 al 2016.
Ora proviamo a capire la correlazione tra visti H1B e un fatto esterno. Per semplicità, R ha un dataset incorporato chiamato state.x77. È una matrice con 50 righe, 1 per stato, e informazioni come popolazione e aspettativa di vita nel Censimento USA del 1977.
Suggerimento: usa una fonte di dati più recente nella tua analisi.
Per ora, usare state.x77 è un buon esempio didattico. Esamina questo dataset incorporato con head().
Uniamo queste informazioni con i dati di state.tally in un data frame più grande per capire le relazioni. Per farlo, crea un data frame state.data contenente le abbreviazioni degli stati, state.abb, e i vecchi dati del Censimento 1977. Poi chiama merge passando state.tally e state.data.
Puoi dichiarare esplicitamente la colonna state come vettore di join. Esamina una parte del data frame alla terza riga indicizzando dalla riga 15 alla 20.
state.data<-data.frame(state=state.abb,state.x77)
state.data<-merge(state.tally,
state.data,
by='state')
state.data[15:20,]Offerto da
Una funzione EDA di base è cor: stamperà la correlazione tra due variabili.
Ricorda che la correlazione varia da -1 a 1: 0 significa che le variabili non sono correlate e probabilmente non sono legate. Un numero vicino a 1 significa che i valori sono positivamente correlati (si spera) come programmazione in R e reddito. Un numero negativo significa che la relazione si muove in direzioni opposte, come programmazione in R e vita sociale!
Questo codice applica cor alla popolazione degli stati nel 1977 e agli attuali conteggi H1B. Ricorda, il codice serve a illustrare come fare l'analisi nonostante la discrepanza temporale. Puoi cambiare $Population per riferirti a un altro vettore del data frame.
cor(state.data$Population, state.data$h1b)Offerto da
Un altro modo per indagare le relazioni tra variabili è con uno scatterplot, in particolare una matrice di scatterplot. Usa pairs() per tracciarne rapidamente una. Il codice sotto usa una formula per definire le relazioni. Ogni colonna è dichiarata individualmente con un più in mezzo. Il parametro data accetta il data frame e main imposta il titolo del grafico.
pairs(~ h1b + Population + Income,
data = state.data,
main='h1b relationships')Offerto da
Vedi che questa matrice di scatterplot visualizza i conteggi H1B rispetto a Population e Income degli stati.
Si osserva una relazione tra Population e h1b. Ha senso intuitivamente perché gli stati più popolosi hanno più opportunità di lavoro che richiedono un visto H1B.
Per “ingrandire” un singolo grafico della matrice, chiama semplicemente plot() e passa le due variabili.
plot(state.data$Income,state.data$h1b,
main ='Income to H1B')Offerto da
Prossimi passi con i dati del visto H1B
Hai appena iniziato la nostra esplorazione dei visti H1B! Questo set di dati è molto ricco e nel prossimo post esplorerai i dati sugli stipendi, eliminerai gli outlier e creerai visualizzazioni ggplot2 più efficaci.
Approfondirai anche questi concetti di EDA esplorando lo status H1B nel tempo e i principali datori di lavoro. Una delle visualizzazioni interessanti che ti mostro già è il box plot che mostra le distribuzioni degli stipendi per stato del visto H1B usando questo codice:
ggplot(h1b.data)+geom_boxplot(aes(factor(case_status),base_salary,fill=as.factor(case_status)))+ylim(0,100000)+theme_gdocs()+scale_fill_gdocs()+theme(axis.text.x=element_blank())Offerto da
Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
L'obiettivo di questo tutorial è mostrarti come raccogliere dati sui visti H1B tramite web scraping con R. In seguito, imparerai anche come fare il parsing degli oggetti JSON e come archiviare e manipolare i dati per poter eseguire un'analisi esplorativa di base (EDA) sul grande set di dati delle pratiche H1B.
Magari scoprirai come presentarti al meglio come candidato o imparerai del nuovo codice R!
Introduzione
La settimana scorsa, il blog di DataCamp "Can Data Help Your H-1B Visa Application" ti ha presentato alcuni risultati di un'analisi dei dati H-1B nel corso degli anni. Ora è il momento di sporcarti le mani, analizzare i dati in prima persona e vedere cos'altro riesci a trovare! Ted Kwartler ti guiderà con una serie di tutorial in R.
Ho un amico in uno studio legale in Texas che si occupa di pratiche H1B. L'H1B è un visto per non immigranti negli Stati Uniti che consente ai datori di lavoro statunitensi di assumere temporaneamente lavoratori stranieri in occupazioni specialistiche. A quanto pare, essere accettati è estremamente difficile perché l'offerta di visti è limitata rispetto alle migliaia di candidati. Anche se questo è aneddotico, ho deciso di esplorare i dati di persona nella speranza di aiutare i candidati qualificati a sapere che gli USA sono un luogo accogliente!
Ottenere i dati: web scraping e parsing
Un collega di DataCamp mi ha indicato questo sito, un sito semplice che contiene dati H1B dal 2012 al 2016. Il sito sostiene di avere 2 milioni di domande H1B organizzate in un'unica tabella.Ho deciso di raccogliere questi dati in modo programmatico (leggi: fare web scraping) perché non avevo intenzione di fare copia/incolla per il resto della vita! Come puoi vedere, l'immagine qui sotto mostra una parte del sito con i dati H1B di Boston:
Le librerie usate in questo tutorial includono
jsonliteper il parsing di oggetti JSON,rvestche “raccoglie” HTML,pbapply, una delle mie preferite perché aggiunge barre di avanzamento alle funzioni apply di base, edata.table, che migliora le prestazioni di R su data frame di grandi dimensioni.Esplorare la struttura della pagina
Esplorando il sito, ti accorgerai che il modulo di ricerca suggerisce opzioni di precompilazione. Ad esempio, digitando “B” nel campo città comparirà una modale con i suggerimenti mostrati sotto. L'immagine seguente mostra le opzioni di precompilazione quando digito “B”:
Questo significa che puoi usare la precompilazione come modo efficiente per interrogare il sito. Con Chrome, puoi ricaricare e poi cliccare con il tasto destro su “Ispeziona” nella pagina, quindi andare su “Network” nel pannello sviluppatore e infine digitare “B” sulla pagina per caricare la modale. Esplorando i link del pannello Network, troverai una query PHP che restituisce un oggetto JSON di città come questa. L'obiettivo è prima raccogliere tutte le città suggerite e poi usare quell'elenco per fare scraping di un gran numero di pagine con dati H1B. Esplorando l'URL precedente, noterai che termina con una lettera. Quindi puoi usare
paste0()con la base dell'URL,http://h1bdata.info/cities.php?term=, eletters. La base viene riciclata per ogni valore inletters. L'oggettolettersè un vettore incorporato di R da “a” a “z”. L'oggettojson.citiesè un vettore di URL, da a a z, che contengono tutti i suggerimenti di precompilazione in formato JSON.json.citiesè un vettore di 26 link che devono essere letti da R. Usandolapply()opblapply()insieme afromJSON, R farà il parsing di ciascun oggetto JSON per creareall.cities. Incapsuli il risultato inunlistcosì l'output è un semplice vettore di stringhe. Con questo codice, hai tutte le città di precompilazione organizzate in un vettore che puoi usare per costruire le vere pagine web contenenti i dati.expand.grid(). Nel codice sotto, vedi che si passa l'informazione della città,all.cities, e poi l'anno usandoseq()dal 2012 al 2016. La funzione crea oltre 5000 combinazioni città-anno.expand.grid()crea in modo programmatico Boston 2012, Boston 2013, Boston 2014, ecc. perché ogni città e ogni anno rappresentano una combinazione unica di fattori. Alcune città come Los Angeles sono composte da due parole e devono essere codificate per gli URL. La funzioneurl_encode()cambia “Los Angeles” in Los%20Angeles per rendere l'indirizzo valido. Passi dentro l'intero vettore eurl_encode()lavorerà riga per riga: Infine, usi di nuovo la funzionepaste0()per concatenare la base dell'URL alle combinazioni di città e stato incity.year. Dai un'occhiata a un link di esempio qui.Estrarre informazioni dalle pagine
Una volta completati i passaggi precedenti, puoi creare una funzione personalizzata chiamata
mainper raccogliere i dati da ciascuna pagina. È un flusso semplice che usa funzioni dirvest. Per prima cosa, si accetta un URL eread_html()fa il parsing dei contenuti della pagina. Poi si seleziona la singolahtml_tabledella pagina rispetto a tutte le altre informazioni HTML. La funzionemainconverte l'oggettoxin undata.tablecosì può essere memorizzato in modo efficiente. Infine, prima di chiuderemain, puoi aggiungere unSys.sleepcosì non verrai considerato un attacco DDoS.Andiamo a prendere quei dati! Mi piace avere la barra di avanzamento di
pblapply()per tenere traccia dello scraping.Ti basta passare
all.urlse la funzione main nella funzionepblapply(). Subito R inizia a caricare una pagina, raccogliere la tabella e mantenere un data.table in memoria per quella pagina. Ogni URL viene raccolto a turno e mantenuto in memoria.Combinare i dati in un data table
Uff! Ci sono volute ore! A questo punto
all.h1bè un elenco di data table, uno per pagina. Per unificare l'elenco in un unico data table, puoi usarerbindlist. È simile ado.call(rbind, all.h1b)ma molto più veloce.all.h1b<-rbindlist(all.h1b)Infine salva i dati così non dovrai rifarlo. Per tua fortuna, ne ho salvata una copia qui.
write.csv(all.h1b,'h1b_data.csv', row.names=F)Pulire i dati
Anche se hai fatto lo scraping dei dati, servono alcuni passaggi aggiuntivi per portarli in un formato gestibile.
Usi
lubridateper aiutarti a organizzare le date. Usi anchestringr, che fornisce wrapper per la manipolazione di stringhe.Anche se è una preferenza personale, mi piace usare
scipen=999. Non è obbligatorio ma elimina la notazione scientifica.Si scopre che lo scraping ha catturato 1,8 milioni dei 2 milioni di record H1B. A mio parere, 1,8 milioni sono abbastanza. Quindi carichiamo i dati usando
fread(): questa funzione è comeread.csvma è il più efficiente “fast & friendly file finagler”.I nomi delle colonne dei dati estratti sono in maiuscolo e contengono spazi.
Di conseguenza, referenziarli per nome è scomodo, quindi la prima cosa da fare è rinominarli.
Rinominare le colonne richiede funzioni su entrambi i lati dell'operatore di assegnazione (
<-). A sinistra usacolnames()e passa il data frame. A destra dell'operatore, puoi passare un vettore di stringhe.In questo esempio, prima prendi i nomi originali e li trasformi in minuscolo con
tolower(). Nella seconda riga applichigsub(), una funzione di sostituzione globale.Quando
gsub()riconosce un pattern, in questo caso uno spazio, sostituirà tutte le occorrenze con il secondo parametro, l'underscore. Infine, devi dire agsub()di effettuare le sostituzioni innames(h1b.data)che rappresentano le colonne ora in minuscolo.Una delle prime funzioni che uso quando esploro i dati è
tail(). Questa funzione restituisce le righe in fondo. Qui,tail()restituirà le ultime 8 righe.Questo ti aiuta a vedere rapidamente com'è la forma dei dati e i vettori.
Successivamente, controllo sempre la classe dei vettori. Con i dati estratti dal web, valori numerici o fattori possono diventare testo. Vedrai che correggere le classi ora può evitare frustrazioni dopo!
Usando la funzione
apply(), puoi passareh1b.data, poi2e la funzione class. Dal momento che hai selezionato2, R controllerà la classe di ogni colonna e la stamperà in console. Puoi usareapply()con 1 per applicare una funzione per riga ma qui non aiuterebbe.Ops!
Tutte le colonne sono “character” e vanno corrette. Ti mostrerò come cambiare una delle colonne delle date e lascerò le altre a te. Usando
tail(), puoi esaminare le ultime 6 righe delle date classificate male.Per correggere le date, le barre
/devono essere cambiate in-. Ancora una volta, usagsub()per cercare/e sostituirlo con-.Con i trattini al loro posto, applichi
mdy()che sta per “month, day, year”. Questo perché le date sono dichiarate in quell'ordine. Se l'ordine fosse diverso, riorganizzeresti le lettere dimdydi conseguenza.Per assicurarti che la colonna sia stata cambiata correttamente, riesamini la coda e controlli la classe.
tail()dovrebbe stampare date simili a “2016-03-11 UTC” e la classe del vettore dovrebbe essere “POSIXct” invece di “character”.Per questo tipo di analisi, è una buona idea estrarre solo il mese e l'anno dalle date in nuove colonne. Nel codice sotto vedi che vengono dichiarate due nuove colonne
$submit_monthe$submit_yr.All'interno di
lubridatela funzionemonth()può essere applicata a un'intera colonna per estrarre i valori del mese da una data. La funzioneyear()accetta allo stesso modo la colonna di date per creareh1b.data$submit_yr. Usando la funzionehead(), ora dovresti vedere che sono state create due nuove colonne.Ora esaminiamo la colonna
$base_salary. Ha una virgola nelle migliaia e R la considera un carattere, quindi va cambiata. Ancora una voltagsub()corre in aiuto per rimuovere la virgola e sostituirla con un carattere vuoto. Poias.numeric()viene applicato ah1b.data$base_salaryper cambiare ufficialmente i valori in numeri.Puoi esaminare una parte del nuovo vettore con
head()nella terza riga.Un altro modo di segmentare questi dati è per stato. Esaminando la colonna
h1b.data$location, vedi che città e stato sono separati da una virgola. Il codice sotto usastr_split_fixed()per separare le informazioni di località alla prima virgola. Ti basta passare la colonna, il carattere separatore e il numero di colonne da restituire. L'oggetto state risultante è una grande matrice con lo stesso numero di righe dih1b.datae 2 colonne.Le due righe di codice successive concatenano per colonna i singoli vettori di stato come
$citye$stateah1b.data. I vettori non sono perfetti perché l'ortografia può differire, come “Winston Salem” rispetto a “Winston-Salem”. Nel complesso, questo metodo è abbastanza buono per una semplice EDA, ma tieni presente che in altre analisi potrebbe essere necessaria un'aggregazione dei termini.Esplorare i dati: primi passi
Se stessi facendo domanda per un visto H1B, vorresti sapere quali stati hanno più opportunità per aumentare le tue chance di essere accettato. La funzione
table()serve a conteggiare variabili categoriche e si applica facilmente ah1b.data$state. Nella seconda riga, puoi creare un piccolo data frame per raccogliere i nomi degli stati e i conteggi H1B.Usando
state.tallyebarplot()creerai un istogramma base dei valori H1B per stato. Il secondo parametronames.argdichiara le etichette delle barre elas=3dice a R di posizionare le etichette verticalmente. Noterai qualche località scritta male per via della divisione sulla virgola, ma il punto è chiaro… un richiedente H1B probabilmente sarà in CA, NJ, NY o TX.Vedi il conteggio dei visti H1B per stato dal 2012 al 2016.
Ora proviamo a capire la correlazione tra visti H1B e un fatto esterno. Per semplicità, R ha un dataset incorporato chiamato
state.x77. È una matrice con 50 righe, 1 per stato, e informazioni come popolazione e aspettativa di vita nel Censimento USA del 1977.Suggerimento: usa una fonte di dati più recente nella tua analisi.
Per ora, usare
state.x77è un buon esempio didattico. Esamina questo dataset incorporato conhead().Uniamo queste informazioni con i dati di
state.tallyin un data frame più grande per capire le relazioni. Per farlo, crea un data framestate.datacontenente le abbreviazioni degli stati, state.abb, e i vecchi dati del Censimento 1977. Poi chiama merge passandostate.tallyestate.data.Puoi dichiarare esplicitamente la colonna
statecome vettore di join. Esamina una parte del data frame alla terza riga indicizzando dalla riga 15 alla 20.Una funzione EDA di base è
cor: stamperà la correlazione tra due variabili.Ricorda che la correlazione varia da -1 a 1: 0 significa che le variabili non sono correlate e probabilmente non sono legate. Un numero vicino a 1 significa che i valori sono positivamente correlati (si spera) come programmazione in R e reddito. Un numero negativo significa che la relazione si muove in direzioni opposte, come programmazione in R e vita sociale!
Questo codice applica
coralla popolazione degli stati nel 1977 e agli attuali conteggi H1B. Ricorda, il codice serve a illustrare come fare l'analisi nonostante la discrepanza temporale. Puoi cambiare$Populationper riferirti a un altro vettore del data frame.Un altro modo per indagare le relazioni tra variabili è con uno scatterplot, in particolare una matrice di scatterplot. Usa
pairs()per tracciarne rapidamente una. Il codice sotto usa una formula per definire le relazioni. Ogni colonna è dichiarata individualmente con un più in mezzo. Il parametrodataaccetta il data frame e main imposta il titolo del grafico.Vedi che questa matrice di scatterplot visualizza i conteggi H1B rispetto a
PopulationeIncomedegli stati.Si osserva una relazione tra
Populationeh1b. Ha senso intuitivamente perché gli stati più popolosi hanno più opportunità di lavoro che richiedono un visto H1B.Per “ingrandire” un singolo grafico della matrice, chiama semplicemente
plot()e passa le due variabili.Prossimi passi con i dati del visto H1B
Hai appena iniziato la nostra esplorazione dei visti H1B! Questo set di dati è molto ricco e nel prossimo post esplorerai i dati sugli stipendi, eliminerai gli outlier e creerai visualizzazioni
ggplot2più efficaci.Approfondirai anche questi concetti di EDA esplorando lo status H1B nel tempo e i principali datori di lavoro. Una delle visualizzazioni interessanti che ti mostro già è il box plot che mostra le distribuzioni degli stipendi per stato del visto H1B usando questo codice:
Resta sintonizzato per un'altra parte della serie di tutorial "Exploring H-1B Data with R"! Nel frattempo, dai un'occhiata al nostro tutorial sui data frame in R, al nostro corso Importing Data in R o al nostro corso Data Manipulation in R with dplyr.