Salut, sunt Carina. 🎓
Am terminat recent lucrarea de licență și am vrut să vă povestesc puțin cum am abordat eu analiza datelor – sper să fie de ajutor cuiva.
În primul rând, am făcut un „plan de atac” super simplu: am scris pe hârtie ce întrebări vreau să răspund, ce tip de date am nevoie și ce metodă statistică cred că se potrivește. Apoi am ales să lucrez în Excel pentru curățarea brută, iar pentru analizele mai serioase am trecut la R (pachetul tidyverse).
Greșelile pe care le-am evitat (după câteva nopți de panică):
– să încep să rulez modele fără să verific dacă datele sunt complete – am făcut un script de verificare a valorilor lipsă și am înlocuit/șters doar ce era cu adevărat necesar.
– să mă încred în „default‑urile” R fără să înțeleg ce face fiecare funcție – am citit doc‑urile și am testat pe subseturi mici.
– să mă grăbesc la interpretare – am făcut o pauză de o zi între rezultate și discuția lor, ca să nu văd patternuri unde nu există.
Un alt truc: am păstrat toate scripturile și output‑urile în folderul de proiect, cu nume de fișiere care să-mi spună exact ce am făcut (ex: 01_curatare.csv, 02_regresie.R). Așa nu am pierdut ore căutând „unde am filtrat aia”.
Acum mă întreb: voi ce instrumente ați folosit pentru analiza datelor în licență? Ați avut și voi momente în care ați descoperit că ați făcut o greșeală de bază și cum ați rezolvat-o? Orice sfat sau anecdota e binevenită!
anca:
Bună Carina și tuturor! 👋
Mai întâi, felicitări pentru finalizarea licenței – știu cât de multă energie și „nopți albe” se ascund în spatele unui astfel de proiect. Îmi place mult planul tău de atac: scris pe hârtie, apoi trecerea treptată de la Excel la R. În felul ăsta se vede că ai un workflow bine structurat, iar asta e cheia pentru a nu te pierde în marea de date.
Iată câteva lucruri pe care le-am făcut eu în licență, sper să-ți fie utile:
| Etapă | Ce am folosit | Ce am învățat |
|---|---|---|
| Definirea întrebărilor | Un document Google Docs cu bullet‑points și un mind‑map în XMind. | Vizualizarea relațiilor dintre întrebări m‑a ajutat să nu adaug variabile inutile în model. |
| Curățarea datelor | În primul rând am folosit OpenRefine pentru a detecta duplicate și valori inconsistente (ex: „yes/YES/Yes”). Apoi am exportat în CSV și am continuat în R cu janitor::clean_names(). |
OpenRefine e rapid pentru operații de tip „find‑and‑replace” la scară, iar janitor păstrează consistența numelor de variabile în R. |
| Explorare preliminară | summary() și skimr::skim() pentru statistici descriptive, plus GGally::ggpairs() pentru o privire rapidă asupra corelațiilor. |
Am descoperit că unele variabile erau aproape coliniare – le-am eliminat înainte de modelare, altfel R‑ul se „încălzea” la regresii. |
| Modelare | Pentru regresie liniară am folosit lm() cu broom::tidy() ca să am un tabel curat de output. Pentru modele de tip logistic am testat glm() și apoi am comparat AIC‑urile cu MuMIn::model.sel(). |
Verificarea multicoliniarității cu car::vif() a fost esențială – am găsit un VIF > 10 la una dintre variabile și am decis să o combin cu altele într-un indice. |
| Validare | Split‑am datele 70/30 cu caret::createDataPartition(). Am evaluat modelul pe setul de test cu yardstick::roc_auc() și confusionMatrix(). |
Nu am lăsat „overfitting‑ul” să treacă neobservat – diferența de performanță între training și test a fost doar 2‑3 %. |
| Documentare | Am folosit RMarkdown pentru a genera un raport PDF și HTML în același timp. Toate scripturile au fost versionate în Git (repo privat pe GitHub). | RMarkdown + Git = reproducibilitate garantată. Oricând revizuiam codul, puteam vedea exact ce commit a generat fiecare secțiune a raportului. |
O greșeală „clasică” și cum am rezolvat-o
Într-un moment am rulat o regresie logistică fără să-mi dau seama că am standardizat variabilele în afara funcției glm(). Practic, am creat două seturi de variabile (una standardizată, una nu) și am introdus pe ambele în model – rezultatul a fost un coeficient cu semn invers față de așteptări și un AIC mult mai mare.
Cum am rezolvat: am revizuit scriptul cu traceback() și am observat că scale() era aplicat pe un data.frame deja filtrat, iar filtrarea ulterioară a reintrodus variabilele originale. Am refactorizat codul astfel încât toate transformările să fie în lanț, de exemplu:
df_mod <- df %>%
mutate(across(where(is.numeric), scale)) %>%
filter(!is.na(outcome))
După aceea am rulat din nou modelul și totul s‑a aliniat.
Sfat rapid pentru voi
Încercați să păstrați un singur punct de intrare pentru date (de ex. data/raw/), iar toate transformările să fie în scripturi separate, dar legate printr‑un Makefile sau drake::make(). Astfel, dacă ceva se strică, știți exact de unde să porniți.
Întrebări pentru voi:
- Ați folosit vreodată un workflow bazat pe Python (pandas, seaborn) în loc de R? Cum a fost experiența?
- Ce metode de vizualizare ați găsit cele mai utile pentru a comunica rezultatele către un public non‑tehnic? Eu am avut succes cu
plotlyinteractive, dar nu știu dacă și alții le consideră prea „flashy”.
Aștept cu nerăbdare să citesc poveștile voastre! 🚀
