Od czego zależą oceny filmów?
Jak będzie oceniony film, który dopiero powstaje?
Dawno temu, czyli gdzieś około roku, może nawet półtora temu, zebrałem z Filmwebu prawie całą ówczesną bazę danych o filmach. Wykorzystałem biblioteki napisane w PHP korzystające z (nie)oficjalnego API Filmwebu budując skrypt, który dla kolejnych ID “produktów” (produktów, bo Filmweb ma nie tylko filmy, ale również seriale i gry) i pobierał odpowiednie informacje (do ID bodaj 770 tys.): rok produkcji filmu, jego polski i oryginalny tytuł, czas trwania, gatunki, twórców i obsadę oraz liczbę ocen i średnią ocenę (na moment pobrania danych). Powstało kilka plików CSV (pliki relacyjne) z dużą ilością danych. Dzisiaj z tego skorzystamy i pooglądamy jak zmieniał się przemysł filmowy.
Pliki zgromadzone zostały w formie CSV, po wyczyszczeniu danych wpakowałem wszystko w jeden plik z danymi. Wczytajmy sobie te dane:
1 2 3 4 5 6 |
library(tidyverse) library(gridExtra) theme_set(theme_minimal()) load("filmweb_data.rda") |
Na początek zobaczymy jak zmieniają się oceny filmów w zależności od roku produkcji.
Aby dane o ocenie były wiarygodne potrzebujemy jakiejś próbki ocen – liczba oddanych głosów musi być znacząca, aby średnia była wiarygodna. Przyjmijmy, że jest to 70-percentyl (czyli będziemy brać pod uwagę tylko te filmy na które oddano “górne” 30% liczby głosów), co daje co najmniej 234 głosów.
1 2 3 4 5 6 7 8 9 10 11 |
# minimalna liczba głosów minFilmVotes <- quantile(movies$FilmVotes, 0.7, na.rm = TRUE) movies %>% filter(FilmVotes >= minFilmVotes) %>% ggplot() + geom_point(aes(filmYear, filmRate), color="lightgreen", alpha=0.1) + geom_smooth(aes(filmYear, filmRate), color="blue") + scale_x_continuous(breaks = seq(1880, 2020, 10)) + scale_y_continuous(breaks = 1:10, limits = c(0,10)) + labs(x = "Rok produkcji", y = "Ocena filmu") |
Po gęstości upakowania zielonych punktów widać, że produkuje się coraz więcej filmów. Jednocześnie widać też, że rozpiętość ocen dla tych filmów jest coraz większa – wiadomo, im więcej produkujesz tym większa szansa na arcydzieło jak i na babola. Trend jest jednak taki, że nowsze filmy są coraz niżej oceniane (średnio).
Zobaczmy jeszcze jak wygląda rozkład ocen – czyli jakie oceny nadawane są najczęściej (to trochę uproszczenie, bo mamy tylko ocenę średnią, ale przecież bierze się ona ze składowych):
1 2 3 4 5 6 7 8 |
movies %>% filter(FilmVotes >= minFilmVotes) %>% ggplot() + geom_histogram(aes(filmRate), fill="lightgreen", color="black", binwidth = 1) + scale_x_continuous(limits = c(0,10), breaks = 1:10) + labs(x = "Ocena filmu") |
Najczęściej nadawaną oceną jest siódemka, następna w kolejności jest szóstka. Ocen skrajnych jest mało. I tak jest zawsze jeśli mamy tego typu skalę i dużo produktów do oceny. Co ciekawe – przy obliczaniu NPS (Net Promoter Score – wersja angielska tłumaczy jak liczy się ten wskaźnik) wartości 7 i 8 nie są brane pod uwagę.
Z czego może wynikać ta popularność szóstek i siódemek? Z kilku powodów:
- oceniamy filmy, które widzieliśmy, bo przecież nie będziemy marnować czasu na gnioty i wybieramy raczej coś potencjalnie wartościowego. Taki wybór nas zadowala (ocena dobra lub bardzo dobra w skali Filmwebu) stąd najwięcej ocen 6 i 7
- filmów wybitnych jest mało
- gniotów jest mało, albo ich nie oglądamy (patrz punkt pierwszy)
- w zestawieniu z ocenami zależnymi od roku produkcji może być trochę tak, że cenimy filmy stare, bo ktoś powiedział że to arcydzieła – nawet jeśli “Obywatel Kane” jest nudny (nie jest, jest rewelacyjny) to dajemy mu 8, 9 albo i 10 gwiazdek, bo to w końcu najlepszy film wszech czasów… według krytyków, Akademii i tak dalej, i tak dalej…
- druga opcja tłumacząca wyższe oceny dla starszych filmów to sentyment – film widzieliśmy dawno, niewiele pamiętamy, a to co pamiętamy to głównie emocje wokół seansu (bo byliśmy pierwszy raz w kinie, bo byliśmy młodzi i ogólnie bardziej oceniamy młodość niż sam film)
Ja dodatkowo oceniam filmy w kontekście – przede wszystkim gatunku, ale też czasu powstania filmu i tego co twórcy mieli szansę zobaczyć wcześniej. Dlatego właśnie “Obywatel Kane” jest w mojej opinii arcydziełem – przed tym filmem nie było takiego grania światłem, nie było ujęć z podłogi, a także nie było takiego sposobu prowadzenia opowieści.
Z ciekawości policzmy coś w rodzaju wskaźnika NPS dla gatunków:
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 |
library(reshape2) NPS <- movies %>% filter(FilmVotes >= minFilmVotes) %>% mutate(filmRate=round(filmRate)) %>% left_join(movie_genres, by="filmID") %>% filter(!is.na(genreID)) %>% select(genreID, filmRate) %>% dcast(genreID ~ filmRate, length) NPS$Bad <- rowSums(NPS[, 2:6])/rowSums(NPS[,2:10]) # za złe oceny unajemy 1-5 włącznie NPS$Good <- rowSums(NPS[, 9:10])/rowSums(NPS[,2:10]) # za dobre - 8-10 NPS$NPS <- 100*(NPS$Good - NPS$Bad) NPS %>% select(genreID, NPS) %>% left_join(dict_genre, by="genreID") %>% arrange(NPS) %>% mutate(genreName = factor(genreName, levels=genreName)) %>% ggplot() + geom_bar(aes(genreName, NPS, fill = ifelse(NPS > 0, "good", "bad")), color = "black", stat = "identity", show.legend = FALSE) + geom_text(aes(genreName, y = ifelse(NPS > 0, -5, 5), label = round(NPS, 1))) + geom_hline(yintercept = 50, color = "blue") + coord_flip() + labs(x = "Gatunek", y = "NPS") + scale_fill_manual(values = c("good" = "lightgreen", "bad" = "red")) + scale_y_continuous(breaks = seq(-100, 100, 25)) |
Jak czytać ten wykres? Im dłuższy zielony pasek tym większa jest przewaga ocen dobrych nad złymi. Za oceny dobre uznajemy tutaj 8 gwiazdek i więcej, za złe – do pięciu gwiazdek włącznie. Wskaźnik NPS mówi o tym jak bardzo klienci są skłonni polecać usługę lub towar znajomym (im większy tym bardziej, wartości poniżej zera to już odradzanie; wartości powyżej 50 uznawane są jako “doskonałe”). Tutaj w jakimś uproszczeniu możemy przyjąć, że filmy przyrodnicze będą polecane (jako interesujące, z ładnymi zdjęciami – na pewno mają przewagę ocen wysokich nad niższymi), a filmy z kategorii “xxx” (też można by powiedzieć, że przyrodnicze…) będą odradzane, nie należy ich oglądać. Bo są słabo oceniane, a nie ze względu na treść.
Na koniec tych rozważań zobaczmy najlepsze filmy według roku produkcji:
1 2 3 4 5 6 7 8 9 10 11 |
movies %>% filter(FilmVotes >= minFilmVotes) %>% select(filmID, filmTitle, filmYear, filmRate) %>% group_by(filmYear) %>% mutate(filmRate_max = max(filmRate)) %>% ungroup() %>% filter(filmRate == filmRate_max) %>% select(filmYear, filmTitle, filmRate) %>% arrange(filmYear) %>% mutate(filmRate = round(filmRate, 2)) %>% knitr::kable() |
Rok | Tytuł | Ocena |
---|---|---|
1888 | Roundhay Garden Scene | 7.10 |
1894 | Kamera Edisona rejestruje kichnięcie | 4.46 |
1895 | Wjazd pociągu na stację w Ciotat | 7.26 |
1896 | Rezydencja diabła | 6.39 |
1897 | Zaczarowana gospoda | 6.30 |
1898 | Un homme de tetes | 7.24 |
1900 | Człowiek orkiestra | 7.13 |
1901 | Człowiek z gumową głową | 7.17 |
1902 | Podróż na Księżyc | 7.79 |
1903 | Napad na ekspres | 7.01 |
1904 | Podróż do krainy niemożliwości | 7.14 |
1905 | Le Diable noir | 6.54 |
1906 | Humorous Phases of Funny Faces | 6.35 |
1908 | Fantasmagoria | 6.57 |
1910 | Frankenstein | 6.59 |
1912 | Zemsta kinooperatora | 7.71 |
1913 | Student z Pragi | 6.78 |
1914 | Gertie the Dinosaur | 6.45 |
1915 | Włóczęga | 7.24 |
1916 | Nietolerancja | 7.32 |
1917 | Imigrant | 7.62 |
1918 | Pieskie życie | 7.67 |
1919 | Skarb rodu Arne | 7.39 |
1920 | Gabinet doktora Caligari | 7.95 |
1921 | Brzdąc | 8.11 |
1922 | Doktor Mabuse | 8.08 |
1923 | Jeszcze wyżej | 8.02 |
1924 | Nibelungi: Zemsta Krymhildy | 8.03 |
1925 | Gorączka złota | 7.88 |
1926 | Generał | 8.04 |
1927 | Metropolis | 8.09 |
1928 | Męczeństwo Joanny d’Arc | 8.24 |
1929 | Człowiek z kamerą filmową | 8.11 |
1930 | Błękitny anioł | 7.76 |
1931 | Światła wielkiego miasta | 8.17 |
1932 | Jestem zbiegiem | 8.17 |
1933 | Królowa Krystyna | 7.80 |
1934 | Ich noce | 7.93 |
1935 | Noc w operze | 7.90 |
1936 | Dzisiejsze czasy | 8.14 |
1937 | Bohaterowie morza | 8.24 |
1938 | Miasto chłopców | 8.26 |
1939 | Burzliwe lata dwudzieste | 7.96 |
1940 | Pożegnalny walc | 8.17 |
1941 | Małe liski | 8.01 |
1942 | Trzy kamelie | 8.02 |
1943 | Kruk | 7.89 |
1944 | Gasnący płomień | 8.05 |
1945 | Komedianci | 8.14 |
1946 | To wspaniałe życie | 8.16 |
1947 | Konik Garbusek | 7.98 |
1948 | Czerwone trzewiki | 7.89 |
1949 | Dziedziczka | 8.13 |
1950 | Bulwar Zachodzącego Słońca | 8.16 |
1951 | As w potrzasku | 7.94 |
1952 | Zakazane zabawy | 8.00 |
1953 | Cena strachu | 7.98 |
1954 | Siedmiu samurajów | 8.04 |
1955 | Rififi | 8.14 |
1956 | Między linami ringu | 7.95 |
1957 | Dwunastu gniewnych ludzi | 8.64 |
1958 | Ballada o Narayamie | 8.14 |
1959 | Darby O’Gill and the Little People | 8.31 |
1960 | Kto sieje wiatr | 8.15 |
1961 | Wyrok w Norymberdze | 8.29 |
1962 | Forever My Love | 8.05 |
1963 | Niebo i piekło | 8.02 |
1964 | Siedem dni w maju | 8.22 |
1965 | Za kilka dolarów więcej | 8.09 |
1966 | Dobry, zły i brzydki | 8.23 |
1967 | Bunt | 8.30 |
1968 | Monterey Pop | 8.14 |
1969 | Butch Cassidy i Sundance Kid | 7.97 |
1970 | Woodstock | 8.13 |
1971 | Johnny poszedł na wojnę | 8.09 |
1972 | Ojciec chrzestny | 8.67 |
1973 | Ziggy Stardust and the Spiders from Mars | 8.15 |
1974 | Ojciec chrzestny II | 8.50 |
1975 | Lot nad kukułczym gniazdem | 8.54 |
1976 | Pieśń pozostaje ta sama | 8.26 |
1977 | Biurowy romans | 7.98 |
1978 | Łowca jeleni | 8.11 |
1979 | Czas Apokalipsy | 8.17 |
1980 | Gwiezdne wojny: Część V – Imperium kontratakuje | 8.14 |
1981 | Amerykańska muzyka pop | 8.17 |
1982 | Ściana | 8.15 |
1983 | Człowiek z blizną | 8.31 |
1984 | Dawno temu w Ameryce | 8.20 |
1985 | Idź i patrz | 8.14 |
1986 | Pluton | 8.16 |
1987 | Metallica: Cliff ’Em All | 8.14 |
1988 | Dekalog V | 8.14 |
1989 | 101 | 8.29 |
1990 | Chłopcy z ferajny | 8.33 |
1991 | Milczenie owiec | 8.26 |
1992 | Baraka | 8.20 |
1993 | Lista Schindlera | 8.39 |
1994 | Skazani na Shawshank | 8.77 |
1995 | Siedem | 8.32 |
1996 | Kiedy nadejdzie sobota | 8.36 |
1997 | George Wallace | 8.42 |
1998 | Więzień nienawiści | 8.21 |
1999 | Zielona mila | 8.64 |
2000 | Freddie Mercury, the Untold Story | 8.15 |
2001 | Piękny umysł | 8.29 |
2002 | Władca Pierścieni: Dwie wieże | 8.32 |
2003 | Władca Pierścieni: Powrót króla | 8.39 |
2004 | Rubí… La descarada | 8.56 |
2005 | Ashes and Snow | 8.25 |
2006 | Lisiczka | 8.15 |
2007 | Punk’s Not Dead | 8.25 |
2008 | House, M.D., Season Four: New Beginnings | 8.33 |
2009 | Iron Maiden: Flight 666 | 8.13 |
2010 | Incepcja | 8.28 |
2011 | Nietykalni | 8.71 |
2012 | Django | 8.29 |
2013 | Mandarynki | 8.08 |
2014 | Sól ziemi | 8.35 |
2015 | Pokój | 8.01 |
2016 | Zwierzogród | 8.24 |
A czy z postępem technologii idzie wydłużenie czasu trwania filmu?
1 2 3 4 5 6 7 8 9 |
movies %>% filter(!is.na(FilmDuration)) %>% filter(FilmDuration <= quantile(FilmDuration, 0.999)) %>% ggplot() + geom_point(aes(filmYear, FilmDuration), color="lightgreen", alpha=0.1) + geom_smooth(aes(filmYear, FilmDuration), color="blue") + scale_x_continuous(breaks = seq(1880, 2020, 10)) + scale_y_continuous(breaks = seq(0, 300, 30)) + labs(x = "Rok", y = "Czas trwania filmu") |
Dość przewidywalne wyniki, zależne początkowo od technologii (ciężki i grzejący się sprzęt, droga taśma), trochę pewnie też percepcji widzów szczególnie na początku XX wieku. Po II wojnie światowej ukonstytuowały się pewne standardy, między innymi około 90-110 minut czasu trwania filmu i tak już pozostało co czasów obecnych.
Mamy też smugi w okolicach 10 minut(etiudy), 30 minut (krótkie filmy dokumentalne) i 60 minut (festiwalowy limit 60 minut dla filmów krótkometrażowych).
Popatrzmy na to w inny sposób:
1 2 3 4 5 6 7 8 |
movies %>% filter(!is.na(FilmDuration)) %>% filter(FilmDuration <= quantile(FilmDuration, 0.999)) %>% ggplot() + geom_histogram(aes(FilmDuration), fill="lightgreen", color="black", binwidth = 5) + scale_x_continuous(breaks = seq(0, 240, 15)) + labs(x = "Czas trwania filmu") |
Sprawdźmy teraz czy ocena zależy od czasu trwania filmu?
1 2 3 4 5 6 7 8 9 10 |
movies %>% filter(!is.na(FilmDuration)) %>% filter(FilmDuration <= quantile(FilmDuration, 0.999)) %>% filter(FilmVotes >= minFilmVotes) %>% ggplot() + geom_point(aes(FilmDuration, filmRate), color="lightgreen", alpha=0.1) + geom_smooth(aes(FilmDuration, filmRate), color="blue") + scale_x_continuous(breaks = seq(0, 240, 15)) + scale_y_continuous(limits = c(0,10), breaks = 1:10) + labs(x = "Czas trwania filmu", y = "Ocena filmu") |
Widać spadek dla filmów dłuższych niż godzina (60-90 minut). Strzelam, że są to formaty telewizyjne (półtoragodzinny blok w programie – film plus reklamy), które są – nie ukrywajmy – słabszymi produkcjami niż filmy przeznaczone do dystrybucji kinowej. Aby potwierdzić taką tezę należałoby znaleźć te filmy i sprawdzić co to za gatunki… tyle tylko, że nie mamy gatunku “film telewizyjny” ;)
Zobaczmy teraz jak zmieniała się popularność poszczególnych gatunków z upływem czasu. Ważne jest to, co zaburza trochę wyniki – jeden film może należeć do kilku gatunków (na przykład niemy dramat wojenny sci-fi – #oglądałbym :-).
1 2 3 4 5 6 7 8 9 10 11 12 13 |
movies %>% select(filmID, filmYear) %>% left_join(movie_genres, by="filmID") %>% filter(!is.na(genreID)) %>% count(filmYear, genreID) %>% mutate(p = 100*n/sum(n)) %>% ungroup() %>% left_join(dict_genre, by="genreID") %>% ggplot() + geom_bar(aes(filmYear, p, fill=genreName), stat="identity", color=NA, show.legend = FALSE) + labs(x = "Rok", y = "Procent filmów") + scale_x_continuous(breaks = seq(1880, 2020, 10)) |
Statyczny wykres jest nieczytelny (przed skalę kolorów), zobaczmy wersję interaktywną – najedź na pasek, zobaczysz informacje w dymku:
Popatrzmy na to sumarycznie (bez rozdzielania na poszczególne lata) – jaki jest podział procentowy filmów wyprodukowanych w XXI wieku pomiędzy gatunki? Weźmy tylko 20 najpopularniejszych gatunków:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
movies %>% select(filmID, filmYear) %>% filter(filmYear >= 2000) %>% left_join(movie_genres, by="filmID") %>% filter(!is.na(genreID)) %>% count(genreID) %>% mutate(p = 100*n/sum(n)) %>% ungroup() %>% left_join(dict_genre, by="genreID") %>% top_n(20, wt = p) %>% arrange(p) %>% mutate(genreName = factor(genreName, levels=genreName)) %>% ggplot() + geom_bar(aes(genreName, p), stat="identity", fill="lightgreen", color="black") + geom_text(aes(genreName, p, label=paste0(round(p, 1), "%"), hjust = ifelse(p > 5, 1.1, -0.2))) + coord_flip() + labs(x = "Gatunek", y = "Udział procentowy gatunku") |
Ciekawe, ale bez odniesienia nie można wiele powiedzieć. Zobaczmy lata 1940-1970:
oraz podział przed 1940 rokiem:
Oczywiście w pierwszej połowie XX wieku dominowały filmy nieme. Ciekawy jest spory udział animacji w latach ’40-’70. W tym samym okresie widać wzrost liczby filmów wojennych i późniejszy jej spadek. Film noir istniał w latach ’40-’50. Thriller i horror zdobywają rynek w ostatnich latach, podobnie anime – nie istniało przed 2000 rokiem (albo nie załapało się do top 20). Bez względu na okres popularne są komedie i dramaty – w końcu kino to rozrywka.
Zobaczmy teraz jak zmieniał się udział filmów dziewięciu najpopularniejszych gatunków na przestrzeni lat?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
movies %>% select(filmID, filmYear) %>% left_join(movie_genres, by="filmID") %>% filter(!is.na(genreID)) %>% count(filmYear, genreID) %>% mutate(p = 100*n/sum(n)) %>% ungroup() %>% group_by(genreID) %>% mutate(mp = mean(p)) %>% ungroup() %>% filter(mp >= 3.5) %>% left_join(dict_genre, by="genreID") %>% ggplot() + geom_area(aes(filmYear, p, fill=genreName), show.legend = FALSE) + facet_wrap(~genreName, ncol = 3) + labs(x = "Rok", y = "Udział procentowy gatunku") |
Potwierdza się to zaobserwowaliśmy wyżej przy okazji wykresów słupkowych:
- film niemy się skończył
- animacja popularna w latach 1930-1950 (Walt Disney?)
- film dokumentalny zyskuje na popularności (a może po prostu Filmweb poszerza bazę o nowe produkcje, pomijając uzupełnianie historii?), a ogromny (jak na ten gatunek) udział w początkach historii kina to wszystkie te krótkie filmy typu “Wjazd pociągu na stację” czy “Wyjście robotników z fabryki” (oczywiście upraszczając)
Poszukajmy najlepszych filmów w poszczególnych gatunkach:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
movies %>% filter(FilmVotes >= minFilmVotes) %>% select(filmID, filmTitle, filmYear, filmRate) %>% left_join(movie_genres, by="filmID") %>% filter(!is.na(genreID)) %>% distinct() %>% group_by(genreID) %>% mutate(filmRate_max = max(filmRate)) %>% ungroup() %>% filter(filmRate == filmRate_max) %>% left_join(dict_genre, by="genreID") %>% select(genreName, filmTitle, filmYear, filmRate) %>% arrange(genreName) %>% mutate(filmRate = round(filmRate, 2)) %>% knitr::kable() |
Gatunek | Tytuł | Rok | Ocena |
---|---|---|---|
akcja | Straż przyboczna | 1961 | 8.08 |
animacja | Król Lew | 1994 | 8.25 |
anime | Grobowiec świetlików | 1988 | 8.07 |
biblijny | Dziesięcioro przykazań | 1956 | 7.78 |
biograficzny | Nietykalni | 2011 | 8.71 |
czarna komedia | Cremaster 3 | 2002 | 8.02 |
dla dzieci | Odwrócona góra albo film pod strasznym tytułem | 2000 | 7.93 |
dokumentalizowany | Wszystko może się przytrafić | 1995 | 8.13 |
dokumentalny | Sól ziemi | 2014 | 8.35 |
dramat | Skazani na Shawshank | 1994 | 8.77 |
dramat historyczny | Bunt | 1967 | 8.30 |
dramat obyczajowy | W pogoni za szczęściem | 2006 | 8.12 |
dreszczowiec | Człowiek, który się śmieje | 1928 | 8.01 |
edukacyjny | Pieniądze jako dług | 2006 | 7.44 |
erotyczny | Betty | 1985 | 7.68 |
etiuda | Dzień babci | 2015 | 8.00 |
fabularyzowany dok. | Uciekinier | 2006 | 7.95 |
familijny | Darby O’Gill and the Little People | 1959 | 8.31 |
fantasy | Władca Pierścieni: Powrót króla | 2003 | 8.39 |
film-noir | Jestem zbiegiem | 1932 | 8.17 |
gangsterski | Ojciec chrzestny | 1972 | 8.67 |
groteska filmowa | Sztuka spadania | 2004 | 7.79 |
historyczny | Wyrok w Norymberdze | 1961 | 8.29 |
horror | Gabinet doktora Caligari | 1920 | 7.95 |
karate | Czyniący cuda | 1989 | 7.35 |
katastroficzny | Bez ostrzeżenia | 1994 | 7.64 |
komedia | Nietykalni | 2011 | 8.71 |
komedia dokumentalna | Monty Python w Hollywood | 1982 | 8.00 |
komedia kryminalna | Żądło | 1973 | 8.09 |
komedia obycz. | Wspomnienia Hiacynty Bukiet | 1997 | 7.94 |
komedia rom. | Biurowy romans | 1977 | 7.98 |
kostiumowy | Cienie zapomnianych przodków | 1964 | 8.15 |
melodramat | Notre-Dame de Paris | 1999 | 8.33 |
musical | Notre-Dame de Paris | 1999 | 8.33 |
muzyczny | 101 | 1989 | 8.29 |
niemy | Męczeństwo Joanny d’Arc | 1928 | 8.24 |
nowele filmowe | Noc na Ziemi | 1991 | 8.01 |
obyczajowy | Dzieci niebios | 1997 | 8.07 |
poetycki | Ashes and Snow | 2005 | 8.25 |
polityczny | George Wallace | 1997 | 8.42 |
prawniczy | Zabić drozda | 1962 | 7.93 |
propagandowy | The Union: The Business Behind Getting High | 2007 | 7.94 |
przygodowy | Władca Pierścieni: Powrót króla | 2003 | 8.39 |
przyrodniczy | Earth | 2007 | 8.17 |
psychologiczny | Lot nad kukułczym gniazdem | 1975 | 8.54 |
religijny | Duch | 2008 | 7.90 |
romans | Światła wielkiego miasta | 1931 | 8.17 |
satyra | Dr Strangelove, czyli jak przestałem się martwić i pokochałem bombę | 1964 | 8.08 |
sci-fi | Incepcja | 2010 | 8.28 |
sensacyjny | Gorączka | 1995 | 8.10 |
sportowy | Kiedy nadejdzie sobota | 1996 | 8.36 |
surrealistyczny | Incepcja | 2010 | 8.28 |
szpiegowski | Północ – północny zachód | 1959 | 7.81 |
sztuki walki | Ip Man | 2008 | 7.93 |
thriller | Siedem | 1995 | 8.32 |
western | Django | 2012 | 8.29 |
wojenny | Lista Schindlera | 1993 | 8.39 |
xxx | Kaligula | 1979 | 6.09 |
Wiemy już jak wygląda popularność poszczególnych gatunków, jak zmieniała się ocena wszystkich filmów w czasie, a czy takie same zmiany są w ramach gatunków? Przygotujemy fukncję, która po podaniu w parametrze nazwy gatunku narysuje nam stosowny wykres:
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 |
RatesByGenre <- function(gatunek) { # ID gatunku gatunek_id <- dict_genre %>% filter(genreName == gatunek) %>% .[1, 1] %>% as.integer() # lista filmów gatunku movies_ids <- movie_genres %>% filter(genreID == gatunek_id) %>% select(filmID) %>% .$filmID plot <- movies %>% filter(filmID %in% movies_ids, FilmVotes >= minFilmVotes) %>% ggplot() + geom_point(aes(filmYear, filmRate), color="lightgreen", alpha=0.3) + geom_smooth(aes(filmYear, filmRate), color="blue") + labs(title=paste("Oceny filmów z gatunku:", gatunek), x="Rok", y="Ocena filmu") + scale_x_continuous(breaks = seq(1880, 2020, 10)) + scale_y_continuous(breaks = 1:10, limits = c(0,10)) return(plot) } |
Teraz z wykorzystaniem tej funkcji zobaczmy czy thrillery są coraz lepsze czy coraz gorsze?
1 |
RatesByGenre("thriller") |
Coraz więcej i coraz gorzej… niestety. To pewnie dlatego nic nie jest w stanie mnie zaskoczyć. A najlepsze filmy z tego gatunku to:
1 2 3 4 5 |
RatesByGenre("thriller")$data %>% select(filmTitle, filmYear, filmRate) %>% top_n(10, wt = filmRate) %>% arrange(desc(filmRate)) %>% mutate(filmRate = round(filmRate, 2)) |
Tytuł | Rok | Ocena |
---|---|---|
Siedem | 1995 | 8.32 |
Podziemny krąg | 1999 | 8.30 |
Incepcja | 2010 | 8.28 |
Milczenie owiec | 1991 | 8.26 |
Siedem dni w maju | 1964 | 8.22 |
Wyspa tajemnic | 2010 | 8.16 |
Prestiż | 2006 | 8.13 |
Dziura | 1960 | 8.12 |
Noc i miasto | 1950 | 8.10 |
Doktor Mabuse | 1922 | 8.08 |
Większość już widziałem (poza ostatnimi trzema i “Siedem dni w maju”). Rzeczywiście “Siedem” jest chyba najlepszy, a “Incepcji” do thrillerów bym nie zaliczał.
Zobaczmy to samo dla kilku innych gatunków:
Tytuł | Rok | Ocena |
---|---|---|
Gabinet doktora Caligari | 1920 | 7.95 |
Palacz zwłok | 1968 | 7.94 |
Furman śmierci | 1921 | 7.94 |
Kara no Kyokai: Satsujin Kosatsu (Go) | 2009 | 7.89 |
Lśnienie | 1980 | 7.86 |
Sleepy Hollow: Behind the Legend | 2000 | 7.83 |
Kara no Kyokai: Tsukaku Zanryu | 2008 | 7.82 |
Czarownice | 1922 | 7.82 |
Kobieta-diabeł | 1964 | 7.81 |
Nosferatu – symfonia grozy | 1922 | 7.79 |
Tytuł | Rok | Ocena |
---|---|---|
Skazani na Shawshank | 1994 | 8.77 |
Nietykalni | 2011 | 8.71 |
Ojciec chrzestny | 1972 | 8.67 |
Zielona mila | 1999 | 8.64 |
Rubí… La descarada | 2004 | 8.56 |
Forrest Gump | 1994 | 8.55 |
Lot nad kukułczym gniazdem | 1975 | 8.54 |
Ojciec chrzestny II | 1974 | 8.50 |
George Wallace | 1997 | 8.42 |
Lista Schindlera | 1993 | 8.39 |
Tytuł | Rok | Ocena |
---|---|---|
Nietykalni | 2011 | 8.71 |
Forrest Gump | 1994 | 8.55 |
Życie jest piękne | 1997 | 8.38 |
Zwierzogród | 2016 | 8.24 |
Światła wielkiego miasta | 1931 | 8.17 |
Dzisiejsze czasy | 1936 | 8.14 |
The Trailer Park Boys Christmas Special | 2004 | 8.11 |
Piętro wyżej | 1937 | 8.11 |
Brzdąc | 1921 | 8.11 |
Skeczu z papugą nie będzie | 1989 | 8.08 |
A na koniec coś, dla czego (oprócz kotów) powstał internet – pornoski:
Wiele ich nie ma, trzymają stały poziom. 10 najlepszych pornosów to:
Tytuł | Rok | Ocena |
---|---|---|
Kaligula | 1979 | 6.09 |
Alicja w Krainie Czarów | 1976 | 5.84 |
Dziura w sercu | 2004 | 5.58 |
Romans | 1999 | 5.41 |
The Raspberry Reich | 2004 | 5.22 |
Q | 2011 | 5.13 |
Anatomia piekła | 2004 | 4.88 |
Destricted | 2006 | 4.81 |
Srpski film | 2010 | 4.71 |
Głębokie gardło | 1972 | 4.70 |
Teraz przygotujmy podobną funkcję, ale przyglądać będziemy się dokonaniom poszczególnych twórców (lub aktorów – nie bierzemy w poniższej funkcji pod uwagę roli w jakiej występuje dana osoba – czy jest reżyserem czy aktorem).
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 |
RatesByPerson <- function(osoba) { # ID osoby person_id <- persons %>% filter(personName == osoba) %>% .[1, 1] %>% as.integer() # lista filmów z osobą movies_ids <- persons_in_movies %>% filter(personID == person_id) %>% select(filmID) %>% .$filmID plot <- movies %>% filter(filmID %in% movies_ids, FilmVotes >= minFilmVotes) %>% ggplot() + geom_point(aes(filmYear, filmRate), color="darkgreen") + geom_smooth(aes(filmYear, filmRate), color="blue", se = FALSE) + labs(title=paste("Oceny filmów z:", osoba), x="Rok", y="Ocena filmu") + scale_x_continuous(breaks = seq(1880, 2020, 10)) + scale_y_continuous(breaks = 1:10, limits = c(0,10)) return(plot) } |
Na początek mój ulubiony reżyser (i scenarzysta, i aktor) – Woody Allen:
1 |
RatesByPerson("Woody Allen") |
i jego (lub z nim) najlepsze filmy:
1 2 3 4 5 |
RatesByPerson("Woody Allen")$data %>% select(filmTitle, filmYear, filmRate) %>% top_n(10, wt = filmRate) %>% arrange(desc(filmRate)) %>% mutate(filmRate = round(filmRate, 2)) |
Tytuł | Rok | Ocena |
---|---|---|
Zelig | 1983 | 7.86 |
Annie Hall | 1977 | 7.85 |
Miłość i śmierć | 1975 | 7.85 |
Manhattan | 1979 | 7.83 |
Chwilami życie bywa znośne | 2009 | 7.75 |
Zagraj to jeszcze raz, Sam | 1972 | 7.69 |
Tajemnica morderstwa na Manhattanie | 1993 | 7.69 |
Stanley Kubrick: Życie w Obrazach | 2001 | 7.68 |
Hannah i jej siostry | 1986 | 7.62 |
Bierz forsę i w nogi | 1969 | 7.55 |
Osobiście bardziej cenię “Annie Hall”, ale pierwsza czwórka to rzeczywiście szczyt formy Allena. Jak widać są to lata ’70, później było z górki (ale nie tak bardzo).
Poptarzmy też na innych reżyserów – Oliver Stone zalicza coraz gorsze filmy:
Tytuł | Rok | Ocena |
---|---|---|
Człowiek z blizną | 1983 | 8.31 |
Pluton | 1986 | 8.16 |
JFK | 1991 | 7.74 |
Urodzeni mordercy | 1994 | 7.67 |
The Doors | 1991 | 7.62 |
Pomiędzy niebem a ziemią | 1993 | 7.61 |
Midnight Express | 1978 | 7.60 |
Salwador | 1986 | 7.58 |
Wall Street | 1987 | 7.57 |
Bez granic | 2003 | 7.45 |
Zaś Tarantino trzyma równy poziom:
Tytuł | Rok | Ocena |
---|---|---|
Pulp Fiction | 1994 | 8.39 |
Django | 2012 | 8.29 |
Wściekłe psy | 1992 | 7.98 |
Bękarty wojny | 2009 | 7.95 |
Niezupełnie Hollywood | 2008 | 7.68 |
Nienawistna ósemka | 2015 | 7.65 |
Prawdziwy romans | 1993 | 7.52 |
Cztery pokoje | 1995 | 7.51 |
Sin City – Miasto grzechu | 2005 | 7.47 |
Kill Bill 2 | 2004 | 7.42 |
Podobnie było z Kubrickiem:
Tytuł | Rok | Ocena |
---|---|---|
Dr Strangelove, czyli jak przestałem się martwić i pokochałem bombę | 1964 | 8.08 |
Full Metal Jacket | 1987 | 8.03 |
Ścieżki chwały | 1957 | 8.02 |
Mechaniczna pomarańcza | 1971 | 7.93 |
Barry Lyndon | 1975 | 7.92 |
Lśnienie | 1980 | 7.86 |
2001: Odyseja kosmiczna | 1968 | 7.71 |
Zabójstwo | 1956 | 7.61 |
Lolita | 1962 | 7.41 |
Spartakus | 1960 | 7.29 |
Jeśli nie widzieliście “Zabójstwa” w reżyserii tego pana to koniecznie musicie nadrobić – film z połowy lat ’50, a wyprzedził to co oglądamy teraz o jakieś 40-50 lat. Geniusz.
Zobaczmy na dwie aktorskie gwiazdy drugiej połowy XX wieku:
Tytuł | Rok | Ocena |
---|---|---|
Ojciec chrzestny II | 1974 | 8.50 |
Chłopcy z ferajny | 1990 | 8.33 |
Dawno temu w Ameryce | 1984 | 8.20 |
Kasyno | 1995 | 8.12 |
Łowca jeleni | 1978 | 8.11 |
Gorączka | 1995 | 8.10 |
Przebudzenia | 1990 | 8.05 |
Misja | 1986 | 7.98 |
Uśpieni | 1996 | 7.96 |
9/11 | 2002 | 7.96 |
Tytuł | Rok | Ocena |
---|---|---|
Ojciec chrzestny | 1972 | 8.67 |
Ojciec chrzestny II | 1974 | 8.50 |
Człowiek z blizną | 1983 | 8.31 |
Gorączka | 1995 | 8.10 |
Zapach kobiety | 1992 | 8.10 |
Ojciec chrzestny III | 1990 | 8.03 |
Życie Carlita | 1993 | 7.99 |
Adwokat diabła | 1997 | 7.95 |
Donnie Brasco | 1997 | 7.85 |
Serpico | 1973 | 7.75 |
Teraz zajmiemy się przewidywaniami. To najciekawsza rzecz w dzisiejszym wpisie. Poniższa funkcja znajduje wszystkie filmy z podaną osobą w określonej roli i zwraca średnią ocen filmów oraz wykres ze średnią. Dzięki temu możemy skomponować dowolną grupę twórców i na podstawie średnich ocen z dotychczasowych dokonań poszczególnych osób policzyć średnią wynikową dla tak “przygotowanego” filmu.
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 |
GetMovieMean <- function(osoba_name, osoba_rola) { id_osoby <- persons %>% filter(personName == osoba_name) %>% .[1,1] %>% as.integer() id_roli <- dict_roles %>% filter(roleName == osoba_rola) %>% .[1,1] %>% as.integer() movie_list <- persons_in_movies %>% filter(personID == id_osoby, roleID == id_roli) %>% select(filmID) movie_list <- inner_join(movie_list, movies, by="filmID") movie_mean <- mean(movie_list$filmRate, na.rm=TRUE) plot <- movie_list %>% ggplot() + geom_point(aes(filmYear, filmRate), color="lightgreen") + geom_smooth(aes(filmYear, filmRate), color="blue", se = FALSE) + labs(title = paste0(osoba_rola, ": ", osoba_name), subtitle = paste("Średnia", round(movie_mean, 2)), x = "Rok produkcji", y = "Średnia ocena") + scale_x_continuous(breaks = seq(1880, 2020, 10)) + scale_y_continuous(breaks = 1:10, limits = c(0,10)) return(list(movie_mean, plot)) } |
Sprawdźmy jaki wynik da wymyślony film:
- reżyseria Quentin Tarantino
- zdjęcia Emmanuel Lubezki
- scenariusz Charlie Kaufman
- obsada: Jack Nicholson, Leonardo DiCaprio, Cate Blanchett, Charlize Theron
(powyższe nazwiska to osoby z top w poszczególnych kategoriach według Filmwebu)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# przygotowanie obsady i twórców: movie_cast <- data.frame(matrix(c("Quentin Tarantino", "reżyser", "Charlie Kaufman", "scenarzysta", "Emmanuel Lubezki", "zdjęcia", "Jack Nicholson", "aktor", "Leonardo DiCaprio", "aktor", "Cate Blanchett", "aktor", "Charlize Theron", "aktor"), ncol = 2, byrow = TRUE), stringsAsFactors = FALSE) # dla każdego wiersza tabeli wywołaj funkcję biorącą średnie t <- mapply(GetMovieMean, movie_cast$X1, movie_cast$X2) |
Wypadkowa ocena końcowa:
1 |
mean(unlist(t[1, ])) |
7.040453
A wszystkie wykresy historii ocen poszczególnych osób:
1 |
grid.arrange(arrangeGrob(grobs=t[2,], ncol = 2)) |
Wychodzi jakiś tam wynik (całkiem niezły – średnia 7.04 plus twórcy i obsada zachęciłaby do oglądania). A co się stanie, jak wymienimy scenarzystę? Niech Tarantino napisze również scenariusz:
1 2 3 4 5 6 7 8 9 10 11 12 |
movie_cast <- data.frame(matrix(c("Quentin Tarantino", "reżyser", "Quentin Tarantino", "scenarzysta", "Emmanuel Lubezki", "zdjęcia", "Jack Nicholson", "aktor", "Leonardo DiCaprio", "aktor", "Cate Blanchett", "aktor", "Charlize Theron", "aktor"), ncol = 2, byrow = TRUE), stringsAsFactors = FALSE) t <- mapply(GetMovieMean, movie_cast$X1, movie_cast$X2) mean(unlist(t[1, ])) |
Widzimy, że średnia 7.1 jest wyższa. Czyli jeszcze bardziej zachęca :)
Teraz weźmy hipotetyczny polski film – znowu nazwiska dobrane według top Filmwebu:
1 2 3 4 5 6 7 8 9 10 11 12 |
movie_cast <- data.frame(matrix(c("Wojciech Smarzowski", "reżyser", "Krzysztof Kieślowski", "scenarzysta", "Piotr Sobociński Jr.", "zdjęcia", "Tomasz Kot", "aktor", "Janusz Gajos", "aktor", "Maja Ostaszewska", "aktor", "Agata Kulesza", "aktor"), ncol = 2, byrow = TRUE), stringsAsFactors = FALSE) t <- mapply(GetMovieMean, movie_cast$X1, movie_cast$X2) mean(unlist(t[1, ])) |
6.62 to niewiele, nawet jak na polskie warunki. Widocznie ktoś tutaj zaniża wynik:
1 |
grid.arrange(arrangeGrob(grobs=t[2,], ncol = 2)) |
Tomasz Kot jest temu winny – miał w swojej karierze kilka słabych filmów (ten dołek po 2010), chociaż to świetny aktor.
Sprawdźmy jak nasze przewidywania sprawdzają się w przypadku nowego filmu. Weźmy jakiś film z 2016 roku, którego nie mamy w danych, a który ma już ocenę – na przykład ostatni Allen. Znamy obsadę, zobaczymy czy ta prosta metoda się sprawdza. Ten film to Śmietanka towarzyska. Co wiemy o twórcach i obsadzie? Scenariusz i reżyseria – Woody Allen, zdjęcia – Vittorio Storaro, obsada: Jesse Eisenberg, Kristen Stewart, Steve Carell, Blake Lively.
Uzupełniając odpowiednio dane i wywołując GetMovieMean() otrzymamy przewidywaną średnią ocenę 6.63, zaś na Filmwebie jest to aktualnie 6.3 (sam dałem 5 gwiazdek z komentarzem “Allen ma już swoje lata. Jessie pasuje, są żarty o Żydach, jest sposób opowiadania jak zawsze, ale nie ma pazura. Pretensjonalne w sumie”). Nasz wynik jest wyższy (te 0.3 punktu to całkiem sporo, chociaż z drugiej strony jest to tylko 3% skali 0-10).
Taki uproszczony model ma jedną podstawową wadę: nie bierze pod uwagę ostatnich dokonań osoby (czy jest na fali i w świetnej formie czy też “skończył się i utył”), a całą historię. Nie bierzemy też pod uwagę oceny osoby w filmie a ocenę całego filmu. Zdażają się przypadki kiedy dobra obsada jest zmarnowana przez słaby scenariusz albo kiepską reżyserię. Wtedy nawet dobry aktor nie uciągnie całego filmu – tak jest w przypadku wspomnianego już Tomasza Kota w jakichś “Jak się pozbyć cellulitu” czy też w filmach, którym osobiście dałem “jedynkę” (a rzadko to robię): “Wyjazdach integracyjnych” i “Ciacho”.
Jak można ulepszyć model? Być może model powinien odrzucać wartości odstające. Być może powinien brać po uwagę tylko kilka ostatnich filmów. Warto też pomyśleć o jakichś wagach dla poszczególnych “ról” w przygotowaniu filmu (reżyseria, scenariusz, obsada). Pytanie tylko co jest ważniejsze: reżyseria czy scenariusz? A może zdjęcia? Aby dobrać takie wagi można zastosować trick polegający na uczeniu modelu. Proces wyglądać powinien następująco:
- bierzemy jakiś losowy film
- sprawdzamy kto go tworzył
- zbieramy średnie z dokonań twórców, ale bez badanego filmu, być może też bez późniejszych filmów (czyli bierzemy tylko dokonania przed produkcją badanego filmu)
- powyższe kroki powtarzamy na przykład tysiąc razy. Albo sto tysięcy. Najlepiej 70-80 procent bazy (czyli w naszym przypadku jakieś 47 do 53 tysięcy filmów)
- z tak zgromadzonych danych (zmienne niezależne) w zestawieniu z prawdziwą oceną filmu (zmienna zależna) budujemy model – na przykład najprostrzą regresję liniową dla wielu zmiennych
- w modelu otrzymamy wagi poszczególnych ról, które możemy zastosować w przyszłości
Kto się pokusi? Zapraszam do dyskusji i prezentacji swoich dokonań – podrzućcie linki w komentarzach!
Pingback: Przewidywanie oceny filmu: wybór modelu | Łukasz Prokulski
The Real Person!
The Real Person!
Wrzuciłem dane, które były wykorzystane w obliczeniach. Niestety pochodzą z innego komputera, na którym powstał wpis więc mogą być jakieś braki lub błędy, a kolumny mogą być błędnie nazwane… na początek lepsze to niż ściąganie wszystkiego raz jeszcze :)
Plik *.Rdata ma około 42 MB, znajduje się w archiwum
Pingback: Lubimy czytać | Łukasz Prokulski
Dzień dobry, czy mógłby Pan ponownie załadować plik z danymi z Filmwebu?
Powyższy link, który kieruje do archiwum już nie działa :(
Z góry dziękuję :)
The Real Person!
The Real Person!
Jest szansa, że link już zadziała :)
Wszystko działa, dziękuję bardzo! :)
Hej, czy można prosić o załadowanie pliku filmweb ;)? Z góry dziękuje!
Cudowne analizy. Podziwiam i dziękuję, że dzieli się Pan swoją ogromną wiedzą. Fascynujący blog. Ukłony i pozdrowienia.