Najszczęśliwsze zdjęcia posłów i posłanek

Jakiś czas temu, na RBloggers pokazano jak z poziomu R używać Microsoft Cognitive Services API. Co to za API? Zbiór usług do pracy z obrazem, wideo lub tekstem. Przykładowo Ben Heubl użył Emotion API aby ocenić emocje na zdjęciach kandydatów na prezydentów USA a David Smith użył Face API aby oceniać płeć i wiek programistów na GitHub na bazie awatarów.

Super zabawka. Miałem chwilę czasu, stwierdziłem, że się nią pobawię.
Tylko skąd wziąć publicznie dostępny zbiór zdjęć?
Z pomocą przyszła strona Sejmu. Można z niej pobrać profilowe zdjęcia posłów i posłanek.

Korzystanie z Microsoft Cognitive Services okazuje się być bardzo proste, wystarczy użyć pakietu xml2 i funkcji read_html().

Emotion API dla każdej twarzy ze zdjęcia wyznacza scory dla ośmiu emocji (anger, contempt, disgust, fear, happiness, neutral, sadness, surprise). Ale dla zdjęć profilowych posłów i posłanek praktycznie jedyne niezerowe scory otrzymuje się w emocjach happiness i neutral. Okazuje się, że niektóre zdjęcia posłów i posłanek zdobywają wyższe skory w obszarze happiness a inne w neutral.
Co ciekawe posłanki mają znacznie częściej zdjęcia wysoko ocenione w skali happiness. Posłowie mają zdjęcia zeskorowane mniej więcej pół na pół jako happy i neutral.

Poniżej wyniki w rozbiciu na kluby. Proszę traktować to jako zabawkę z Cognitive Services i nie wyciągać niewiadomo jakich wniosków. Narzędzie jak narzędzie, ma jakąś niedokładność. W pionie, kluby uporządkowane ze względu na udział procentowy posłów/posłanek zescorowanych na zdjęciach jako najszczęśliwsi.

Screen Shot 2017-01-18 at 08.36.25

14 thoughts on “Najszczęśliwsze zdjęcia posłów i posłanek”

    1. Każdy kwadrat to jedna osoba. Jeżeli jest wysoki słupek nad 75-100% to znaczy, że było wiele osób z takim scorem.

      1. A może warto znormalizować do liczby posłów w partii – wtedy zobaczylibyśmy „wskaźnik szczęśliwości” wśród posłów, no bo ilościowo .N i Kukiz’15 jest najmniej, a PiS najwięcej. Na oko, to najszczęśliwsi są z Kukiza: nie są partią i nie mają dotacji?).

        1. Można unormować (mozaikowe wykresy to pierwsze co zrobiłem), tylko wtedy cały wykres jest o porównywaniu partii i gubi się informacja o pojedynczych posłach (a tego chciałem uniknąć).

          Teraz przynajmniej każdy poseł ma swoja kropkę i swoje zdjęcie,
          kluby można porównać zestawiając wysokości słupków szarych i zielonych, dla niektórych partii jest wyższy szary dla innych zielony.
          kluby są zresztą uszeregowane, ich kolejność na osi OY to kolejność od tych ze średnio największą liczbą posłów z wysokim skorem happy po tych o niższym skorze.

          Unikałbym jakichś daleko idących wniosków, gdy się ogląda zdjęcia wysoko i nisko zeskorowane nie zawsze jest jasne skąd takie a nie inne wartości liczbowe wygenerowane przez MCS.

  1. Ciekawe. Czy jest szansa zobaczyć kody? Także te do wykresu.

    Warto byłoby zobaczyć czy poziom zadowolenia na zdjęciach zmienia się wraz z faktem bycia w opozycji / większości parlamentarnej. No i zważyć wartości dla klubów liczebnością

    1. Z dokładnością do stałej (trzeba ustawić własne access key) kody wyglądają tak

      Funkcja do wyciągania emocji z dowolnego zdjęcia.

      # access key znajdziesz tutaj: https://www.microsoft.com/cognitive-services/en-us/emotion-api)
      emotionKEY <- '__tutaj__klucz__'
      URL.emoface <- 'https://api.projectoxford.ai/emotion/v1.0/recognize'
      
      getEmo <- function(link) {
       emo <- POST(
        url = URL.emoface,
        content_type('application/json'), add_headers(.headers = c('Ocp-Apim-Subscription-Key' = emotionKEY)),
        body = mybody,
        encode = 'json'
       )
       httr::content(emo)
      }
      

      Strona sejmu próbuje się bronić przed wyciąganiem zdjeć posłów ze strony o posłach, więc trzeba korzystać z dziur.
      Kod poniżej wyciąga scory i kluby posłów/posłanek.

      wyniki <- lapply(1:460, function(i) {
        www <- paste0("http://www.sejm.gov.pl/Sejm8.nsf/posel.xsp?id=", i %/% 100, (i %/% 10) %% 10, i %% 10, "&type=A")
        strona <- read_html(www)
        linki <- unique(na.omit(html_attr(html_nodes(strona,  "img"), name = "src")))
        list(
          scores = getEmo(linki)[[1]]$scores,
          klub = unique(na.omit(html_text(html_nodes(strona,  "li:nth-child(2) .right"))))[1])
      })
      

      Powyższy wynik to lista list list, trzeba zrobić porządek (a że na map/walk się nie przestawiłem, więc kilka brudnych sapply). Dla innych emocji podobnie.

      klub <- sapply(wyniki, function(x) x$club)
      happiness <- sapply(wyniki, function(x) {
        tmp <- x$scores$happiness
        if (length(tmp)!=1) return(NA)
        tmp
      })
      

      Wykres to odrobina ggplot2, ale większość przesuwania kropek w Adobe Ilustrator.

        1. A, sorry, tam powinien być link do zdjęcia.
          Ta funkcja powinna wyglądać tak:

          getEmo <- function(link) {
           emo <- POST(
            url = URL.emoface,
            content_type('application/json'), 
            add_headers(.headers = c('Ocp-Apim-Subscription-Key' = emotionKEY)),
            body = list(url = link),
            encode = 'json'
           )
           httr::content(emo)
          }
          
  2. Temat robiony pod click-bait 🙂

    Moim zdaniem metodyka bardziej pokazuje, którzy posłowie dbają o takie szczegóły jak dobry fotograf 🙂

    Temat ciekawy i można byłoby pobawić się w zaciągnięcie zdjęć z profili fb / twittera.

  3. Pozwolę sobie na małe trzy grosze. To API to jakiś fake: ot filmik z mężczyzną brunetem. Obserwując klatka po klatce API przypisuje emocje bazując na kształcie ust i ignoruje fakty. Dlaczego? Facet jest wyraźnie zły, ale w trakcie wypowiedzi API przypisuje mu fazy jak „neutral” czy „surprise”. Przy czym wiadomo, że stan emocjonalny nie zmienia się z sekundy na sekundę. Jakby nawet podliczyć ilość przypisanych stanów to wyszłoby, że wyraźnie zły człowiek najczęściej był „neutral” albo „surprised”.
    To nie jedyna wada. A co z „happiness”? Przecież od dawna wiadomo, że to bardzo złożona emocja a ze stanów wynika, że to raczej „szeroki uśmiech” a nie faktyczne szczęście. Introwertyk zaliczony byłby przez to API jako „neutral” a w rzeczywistości czułby się szczęśliwym człowiekiem.

    Wystarczy podać zdjęcia z oczywistymi emocjami i wychodzi, że ludzie są neutralni. Gdyby ktoś chciał wnioskować o warunkach bytowania ludzi w obozach odosobnienia na podstawie tego, co wywnioskowało to API to uznałby, że warunki w obozach zagłady były neutralne.

    1. MCS ma ograniczoną skuteczność (jak każdy algorytm machine learning), ale aby mówić o tym czy dużą czy małą trzeba by zrobić badania na większym korpusie zdjęć. To, że jedno czy kilka zdjęcie wychodzi inaczej niż byśmy chcieli o niczym nie świadczy.
      Takie badania (zgodności z oceną ludzkiego scorera) byłyby bardzo ciekawe i do zrobienia przy niewielkich środkach (+czas). Więc może ktoś się pokusi.
      Póki co google niewiele pokazuje na hasło: how good are microsoft cognitive services.

      1. Nie widzę szans na to, żeby zwiększona próbka dała inne wyniki bo decyzja API jest oczywista jak tylko zobaczy kształt ust: proste = neutralność. Także usta otwarte (oczy nie wydają się mieć znaczenia nawet).

        Miłego prowadzenia badań, ale moim zdaniem po odjęciu marketingu tu zostaje co najwyżej rozpoznawanie kształtu ust a nie emocji.

Skomentuj smarterpoland Anuluj pisanie odpowiedzi

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *