Miało być o wizualizacji danych o diagnozie społecznej, ale będzie reklama pakietu nad którym pracuję.
Ale od początku. Co jakiś czas, średnio co semestr jakaś grupa moich studentów dostaje projekt polegający na wykonaniu wizualizacji wybranego zbioru danych w R. Jak dotąd pośród takich prezentacji można było znaleźć kilka rodzynków, czasami zaprezentowane są dosyć trafnie naprawdę ciekawe zależności. Wyniki z najnowszej wersji tego projektu niestety nie były tak rewelacyjne jak wyniki poprzednich roczników. Dlatego zamiast pokazać tutaj najlepsze z wykresów moich studentów, pokażę pakiet do wyszukiwania plagiatów który napisałem w poczekalni na lotnisku (ok, można było napisać kilka rzeczy efektywniej, nie jestem z aktualnej wersji zadowolony, po to ta wymówka).
Do rzeczy. Zadanie jest następujące. K zespołów studentów przygotowało wizualizacje i przesłała skrypty R generujące te wizualizacje. Studenci mogli pisać projekt w parach, dzięki temu poprawi się umiejętność współpracy wewnątrz zespołu i zmniejszy się liczba niechcianych współprac pomiędzy zespołami (niechcianych = nieudokumentowanych, o których prowadzący nie wie).
Wiele rzeczy można w R zrobić w jednej linii, ale nie wizualizacje. Bez względu na to jakiego pakietu używamy wykonanie dobrej wizualizacji oznacza dużo kodu i dużo czasu. Nie chodzi o to by jak najszybciej wygenerować wykres, ale żeby pokazać coś czego bez naszej wizualizacji nie widać na pierwszy rzut oka. Zazwyczaj nie mam problemu z plagiatami, szczęśliwie większość studentów jest bardzo samodzielna lub sprytniejsza niż ja. Ale w tym roku było inaczje.
Napisałem pakiet plagiat, który jest jeszcze w bardzo wczesnej wersji, ale można go ściągnąć ze tej strony. Można go też rozwinąć, gorąco do tego zapraszam. Funkcja parseAndPlot() z tego pakietu przyjmuje za argument listę plików tekstowych, dla każdej pary plików liczy długość najdłuższej wspólnej podsekwencji (bardzo prymitywnie, w gołym R, usprawnienie jest niewątpliwie potrzebne) a następnie graficznie przedstawia podobieństwa między plikami.
Miało być o wizualizacji, więc zobaczmy wynik tej funkcji dla przykładowych danych z ostatniego projektu.
[Rys 1. Wynik funkcji parseAndPlot() na zbiorze danych skryptów z 3 projektu. Wierzchołki oznaczają pliki z rozwiązaniami. Wielkość punktu jest wprost proporcjonalna do wielkości pliku R, krawędź jest zaznaczona jeżeli długość wspólnej podsekwencji przekracza 5% wielkości obu plików, w tym przypadku na krawędzi jest też wypisywany procentowy udział długości wspólnej sekwencji. Rozłożenie punktów jest automatyczne, dlatego nie wygląda na zbyt uporządkowane.]
Nazwy plików skróciłem do pierwszej litery, nie jest specjalnie ważne czyj jest który plik. Można dyskutować czy 16.8% (ponad 1200 znaków po usunięciu komentarzy) najdłuższego fragmentu przeklejonego kodu to dużo czy mało.
Różne osoby czytają ten blog, dla osób pracujących z R może będzie to zachęta by pomóc mi w rozwinięciu pakietu plagiat, pewnie jest masa bibliotek, które można by użyć a o których nie wiem. Dla prowadzących zajęcia w R, może pakiet plagiat będzie przydatnym narzędziem, dzięki któremu można szybko zobaczyć czy otrzymane pliki z rozwiązaniem nie są do siebie zbyt podobne. Aktualnie do wygenerowania takiego obrazka wystarczą następujące komendy
setwd("c:/katalog ze skryptami/") library(plagiat) fileList <- list.files(pattern="\\.r$") parseAndPlot(fileList)
Dla studentów może będzie to zachęta do pracy w grupie ale w sposób przejrzysty, tak by prowadzący wiedział kogo za co ocenia a student korzystał z zalet wspólnego uczenia się.
Howgh.