brunch

You can make anything
by writing

C.S.Lewis

by 이준 Dec 22. 2020

데이터로 살펴보는 OTT 서비스

넷플릭스, 디즈니스플러스, 프라임비디오, 훌루 가장 맘에드는 서비스는?

집에 있다보니, OTT 서비스만큼 좋은 것이 없다. 

과거 한창 이것저것 하고 다닐 때는 특히 계속 봐야하는 드라마를 제대로 본 적이 없었는 데,

이제서야 드라마의 매력에 빠져서 보고 있다. 

무려, 도깨비를 얼마전에 다 봤다. 흑흑 


이번 주는 어떤 데이터를 갖고 놀아볼까 찾던 중 여러 스트리밍 사이트에서 제공하는 데이터 목록을 찾았다.

외국 기준으로 넷플릭스, 디즈니 플러스, 프라임 비디오, 훌루(hulu) 4가지 스트리밍 사이트의 정보를 제공한다. 


우리나라에서 사용하는 왓챠, 웨이브, 티빙 같은 서비스였으면 좋겠지만

차차 저 외국 OTT 서비스도 우리나라에 들어온다는 소문이 있는만큼... 재밌게 보고자 한다. 

왓챠와 넷플릭스도 마찬가지지만, 두 서비스가 모두 같은 콘텐츠를 갖고 있는 것은 아니다.

왓챠에 있는 영화가 넷플릭스에 없을 수도 있고, 그 반대일 수도 있다.


그래서 나는 저 둘은 대체제가 아닌 보완재로 활용하고 있다.ㅋ ㅋ

(저 2개에도 없다면... 포기..) 


위에 있는 해외 OTT 서비스가 우리나라에 들어온다고 해도 마찬가지일 것이다.

서로 다른 콘텐츠를 갖고 있는 OTT 서비스 중 어떤 서비스를 선택해야 나에게 만족감을 줄 수 있을까? 

한번 살펴보자! 


오늘의 데이터  

TV shows on Netflix, Prime Video, Hulu and Disney+ : A collection of tv shows found on these streaming platforms   tv_shows.csv  0.25MB


데이터 링크    TV shows on Netflix, Prime Video, Hulu and Disney+  A collection of tv shows found on these streaming platforms  www.kaggle.com


데이터 분석 준비 및 필요 데이터 모으기(전처리)

#1 필요 라이브러리 설치 library(dplyr) library(ggplot2) library(tidyr) library(plotly) library(purrr) library(treemapify) library(reshape2) library(gganimate) library(ggridges) df <- read.csv("./data/tvshow/tv_shows.csv") 

#2 불필요한 열 지우기 df <-  df[,c(-1,-11)] 


#3 테이블 형태 변경 df <- gather(df, Service, Value, Netflix:Disney.)%>%   filter(Value == 1)%>%   select(-Value) head(df) #4 퍼센트 변환  df$Rotten.Tomatoes <- as.numeric(sub("%","",df$Rotten.Tomatoes))/100

#1 필요 패키지 설치

분석에 필요한 라이브러리를 설치했다.

만약, 해당 라이브러리를 찾을 수 없다는 오류 문구가 뜨면, 해당 패키지를 install.packages("라이브러리이름") 으로 설치를 해주거나 구글 검색해 해당 패키지를 설치하고, 다음 라이브러리를 설치해 주면 된다. 

그리고 다운 받은 데이터를 df 데이터프레임에 저장해주었다. 

#2 불필요한 열 지우기

df[, c(-1,-11)]여기서 숫자 앞의 -가 붙으면 제거를 실행한다.

데이터 프레임의 열중 첫번째 행의 11번째 열에 속한 데이터를 지운다. 

이 데이터에서는 type에 해당하는 컬럼인데, 영화와 TV쇼를 구분하는 것으로 우리는 프로그램 전체를 기준으로 살펴볼 것이기 때문에 지운다.  

#3 테이틀 형태 변경

gather() 는 표의 형태를 세로형에서 가로형으로 바꿔주는 데,

여러 개의 컬럼을 새로 만든 값에 세로형으로 모아준다. 

여기서는 df 데이터프레임에 Service와 Value 라는 새로운 항목을 만들고, 넷플릭스부터 디즈니까지의 값을 세로형으로 모아줬습니다. 그리고 Value가 1인 것을 필터링해 해당 열을 빼준 값을 다시 df에 저장해줬다.  


#4 로튼토마토 수치 변환

퍼센트로 되어있는 로튼토마토 수치를 숫자형으로 바꿈과 동시에 그래프 시각화가 쉽도록 %도 없애줬다.

sub() 를 이용해 %를 공란으로 바꾸고, 해당 숫자를 100으로 나눠 소수점형태로 바꿨다.  


TV 프로그램을 가장 많이 갖고 있는 서비스는 어디일까?

다양한 TV프로그램 콘텐츠는 OTT 서비스 선택의 중요한 요소이다.

#1 TV쇼를 가장 많이 보유한 서비스 그리기 

ggplot(df)+   geom_bar(aes(Service, fill = Service))+   ggtitle("스트리밍 서비스가 제공하는 TV쇼 개수",subtitle = "프라임비디오가 가장 많은 서비스를 제공한다.")+   xlab("서비스")+   ylab("TV쇼 숫자")+   theme(legend.position = "none")+   theme(plot.title = element_text(hjust = 0.5))+   theme(plot.subtitle = element_text(hjust = 0.5))


ggplot()을 이용해 그렸다. 

geom_bar를 통해 단순 막대그래프로 어떤 서비스가 가장 많이 제공하는 지를 알 수 있다.

Service에 각 스트리밍 서비스를 세로형으로 녹였으므로 해당 개수를 세는 것으로 했다. 

프라임 비디오가 가장 많은 TV Show를 보유하고 있다.

프라임 비디오가 가장 많은 TV 프로그램을 보유하고 있음을 알 수 있다.  


IMdb 등급으로 보는 각 서비스별 콘텐츠 품질

IMdb가 무엇인지 찾아보니, 아마존의 자회사로 영화, Tv, 배우, 게임 등 여러 콘텐츠에 대한 정보를 제공하는 사이트다.

여기서도 평점을 제공하는 데, 이 데이터를 활용해 각 스트리밍 사이트가 제공하는 콘텐츠의 품질을 추측해볼 수 있다.


#1 바이올린 그래프그리기 

df$Service <- as.factor(df$Service) ggplot(df, aes(x = factor(Service),y = IMDb))+   geom_violin(aes(fill = factor(Service)), draw_quantiles = c(0.25,0.50,0.75))+   ggtitle("IMDB RATING DISTRIBUTION BY STREAMING SERVICE",subtitle = "It seems Disney is a laggard in terms of content quality")+   xlab("Streaming Service")+   ylab("IMDb Rating of Titles")+   theme(legend.position = "none")+   theme(plot.title = element_text(hjust = 0.5))+   theme(plot.subtitle = element_text(hjust = 0.5))


바이올린 그래프를 그리면 박스플롯의 정보와 함께 대략적인 데이터의 분포를 확인할 수 있다.

먼저 x축에 들어갈 서비스를 factor로 변경해주었다. 

마찬가지로 ggplot 그래프를 활용해 그렸으며,

geom_violin()으로 바이올린 그래프를 그릴 수 있다.


x축은 서비스, y축은  IMdb 값을 넣을 것이고, draw_quantiles 로 사분위별로 표시해주었다.  

디즈니의 IMdb 평점 중앙값이 가장 낮으며 그 평점 분포도 중앙값을 기준으로 다른 스트리밍에 비해 작게 형성되고 있는 모습이다. 10점에 가까운 평점도 가장 없다.

디즈니가 콘텐츠 품질 측면에서 뒤처진 것으로 보인다. 


콘텐츠 품질이 가장 좋은 곳은 어디일까?

데이터 상에서 제공하는 IMDb와 Rotten.Tomatoes 데이터를 활용해 IMdb 8점이상, 로튼토마토 지수 0.8(80%) 이상인 콘텐츠를 보유하고 있는 서비스를 비교해 보고자한다.


#Top 250 기준 

Top250 <- df %>%   filter(IMDb >= 8 & Rotten.Tomatoes > 0.8)%>%   arrange(-IMDb)%>%   top_n(250, IMDb)%>%   select(Service,Value)%>%   group_by(Service)%>%   summarise_each(funs(sum)) head(Top250,10) #ggplot 트리맵 그리기 ggplot(Top250, aes(area = Value, fill = Service, label = Service)) +   geom_treemap() +    geom_treemap_text(fontface = "italic", color = "white", place = "centre")


#Top 250 기준 값 개수 구하기 

Top250을 기준으로 해당 데이터를 추출해본다.

필터를 활용해 조건을 걸어주고, IMdb 오름차순으로 정렬해준다. 250개를 뽑아 서비스와 Value를 남기고, 서비스를 기준으로 Group_by 해준다음, 각각 값을 서비스 기준으로 합해준다. 그럼, 각 서비스의 밸류 값의 함을 구할 수 있다. 


#트리맵 그리기

ggplot 그래프를 활용해 트리맵을 그려준다. Top250 데이터를 활용한다.

크기로 보면 애매하지만, 위의 top250 실행해보면, 넷플리스 96으로 가장 많은 고퀄리티 콘텐츠를 갖고 있음을 확인할 수 있다. 2등은 Hulu로 85개, 프라임 비디오는 69개, 디즈니는 8개 순이다.


연령대별 콘텐츠 

어떤 연령대가 주로 해당 서비스를 소비하는 지를 알면, 현재 이용하는 사람의 나이대에 따라 선택지를 더욱 좁힐 수 있을 것이다.


#1 임시 파일 저장 

temp <- dcast(df, Service ~ Age, fill = 0)%>%   select(1,3:7) 

#2 그래프 만들기 

p <- plot_ly(data = temp,              x = ~Service,              y = ~all,              type = 'bar' ) %>%   layout(     title = "TV Shows for Different Age Groups",     xaxis = list(domain = c(0.1, 1)),     yaxis = list(title = "TV Show Count"),     updatemenus = list(       list(         y = 1,         x = -0.1,         buttons = list(           list(method = "restyle",                args = list("y", list(temp$`13+`)),  # put it in a list                label = "Teenagers"),           list(method = "restyle",                args = list("y", list(temp$`16+`)),  # put it in a list                label = "Mature Teenagers"),           list(method = "restyle",                args = list("y", list(temp$`18+`)),  # put it in a list                label = "Adult"),           list(method = "restyle",                args = list("y", list(temp$`7+`)),  # put it in a list                label = "Kids"),           list(method = "restyle",                args = list("y", list(temp$`all`)),  # put it in a list                label = "Universal")))     )) 

#3 그래프 실행 ggplotly(p)


#1

서비스별 연령대 데이터를 불러와야하니, dcast() 를 활용한다.

dcast()는 세로를 가로형으로 변경하는 함수로, 앞에 오는 service를 세로 축에 고정하고, age를 가로형으로 녹인다.

그럼 아래와 같은 형태의 데이터가 보인다.


> dcast(df, Service ~ Age, fill = 0)       

Service Var.2 13+ 16+ 18+ 3.1 7.2 7.8  7+ all 1     

Disney.    31   0   3   0   1   1   1  66  81 2        

Hulu   478   0 514 238   0   0   1 365 159 3     

Netflix   699   3 398 359   0   1   0 300 171 4 

Prime.Video  1335   1 209 182   0   0   0 223 192


이 중 서비스와 10대, 청소년, 성인, 아이, 대학생을 구분할 수 있는 나이대를 선택한다.

1열 서비스와 3열 ~ 7열까지를 선택했다. 


#2

조금 특이한 그래프를 그려볼 수 있다.

해당 코드와 같은 양식으로 만들면 아래와 같은 데이터를 만들 수 있다.

좌측의 10대, 청소년, 성인 등을 드롭다운하여 선택해 데이터를 볼 수 있다. 


#3

해당 그래프를 실행하면 아래와 같은 형태로 확인 가능하다. 

10대는 프라임 비디오를 가장 많이 활용하며

성숙한 10대(청소년)은 Hulu를 가장 많이 활용했다.

성인은 넷플릭스를 활용했다. 


어떤 서비스가 가장 최신 서비스를 제공할까?

최신 프로그램을 보유하고 있는 것도 당연 매력적이다.


animate <- df %>%   filter(Year >= 2010, Rotten.Tomatoes >= 0.8, IMDb >= 8) %>%   group_by(Service, Year) %>%    summarise(Count = n()) %>%    ungroup() %>%    arrange(Year, Count) %>%   mutate(Order = 1:n())


2010년 이상, 로튼 토마토 점수 80%이상, IMDb 9점 이상 중에서 

서비스와 연도를 기준으로 개수를 요약했다.


거기에서 다시 그룹을 해제하고, 연도와 해당 개수를 센 값(count)로 정렬해

새로운 열에 그 개수를 추가했다.


animated_gif <- ggplot(data = animate) +    geom_bar(mapping = aes(x = Order, y = Count, fill = Service),             show.legend = FALSE,             stat = "identity",             width = 0.50) +    transition_states(states = as.integer(Year), transition_length = 20, state_length = 50) +   scale_x_continuous(breaks = animate$Order,                       labels = animate$Service) +   view_follow(fixed_y = TRUE) +    labs(x = "Streaming Platform",         y = "No of Shows",         title = "Shows by Year: {closest_state}",         caption = "TV Shows ")


이번엔 해당 그래프를 애니메이션 gif 파일로 변환했다.

geom_bar로 개수를 계산했고,


아래 코드를 통해 애니메이션 형태로 제작할 수 있었다. 

자체적으로 애니메이션 제작은 안되어서 제공하는 이미지 캡쳐를 모아 ㅜ ㅜ 포토스케이프로 제작했다.

연도별로 변화하는 TV Show 개수 모습을 볼 수 있다. 


서비스별 가장 인기있는 프로그램

서비스 플랫폼별 가장 인기있는 서비스는 무엇일까?

아래 조건으로 각 서비스별 인기 프로그램을 고를 수 있다. Service가 무엇인지만 바꿔주면 된다.

df %>%   filter(Service == "Netflix", IMDb > 8 & Rotten.Tomatoes > 0.8)%>%   arrange(-IMDb)%>%   select(1:6)%>%   top_n(10,IMDb)


넷플릭스 인기 프로그램

     Title Year Age IMDb Rotten.Tomatoes Service 

1                      Breaking Bad 2008 18+  9.5            0.96 Netflix 

2                        Our Planet 2019  7+  9.3            0.93 Netflix

3        Avatar: The Last Airbender 2005  7+  9.2            1.00 Netflix 

4  Fullmetal Alchemist: Brotherhood 2009 18+  9.1            1.00 Netflix 

5                   The Vietnam War 2017 18+  9.1            0.98 Netflix 

6                 The Twilight Zone 1959  7+  9.0            0.82 Netflix 

7                        The Office 2005 16+  8.9            0.81 Netflix 

8                  When They See Us 2019 18+  8.9            0.96 Netflix 

9                   Stranger Things 2016 16+  8.8            0.93 Netflix 

10                     Black Mirror 2011 18+  8.8            0.83 Netflix 

11                   Peaky Blinders 2013 18+  8.8            0.92 Netflix 

12                  Attack on Titan 2013 16+  8.8            0.94 Netflix 

13                           Narcos 2015 18+  8.8            0.89 Netflix 

14                       Twin Peaks 1990 18+  8.8            0.89 Netflix 

15                    One-Punch Man 2015 16+  8.8            1.00 Netflix 

16     Monty Python's Flying Circus 1969 16+  8.8            1.00 Netflix


디즈니 플러스 인기 프로그램

                      Title Year Age IMDb Rotten.Tomatoes Service 

1    The Imagineering Story 2019  7+  9.1            1.00 Disney. 

2             Gravity Falls 2012  7+  8.9            1.00 Disney. 

3          One Strange Rock 2018 all  8.8            0.83 Disney. 

4              The Simpsons 1989  7+  8.7            0.85 Disney. 

5           The Mandalorian 2019  7+  8.7            0.93 Disney. 

6                     X-Men 1992  7+  8.4            0.85 Disney. 

7 Star Wars: The Clone Wars 2008  7+  8.2            0.93 Disney. 

8                 DuckTales 2017  7+  8.2            1.00 Disney.


Hulu 인기 프로그램

                               Title Year Age IMDb Rotten.Tomatoes Service 

1                     Rick and Morty 2013 18+  9.2            0.94    Hulu 

2   Fullmetal Alchemist: Brotherhood 2009 18+  9.1            1.00    Hulu 

3                  The Twilight Zone 1959  7+  9.0            0.82    Hulu 

4                            Firefly 2002 16+  9.0            0.85    Hulu

5                              Fargo 2014 18+  8.9            0.96    Hulu 

6                      Gravity Falls 2012  7+  8.9            1.00    Hulu 

7                Pride and Prejudice 1995 all  8.9            0.88    Hulu 

8                    Attack on Titan 2013 16+  8.8            0.94    Hulu 

9                         Twin Peaks 1990 18+  8.8            0.89    Hulu 

10                     One-Punch Man 2015 16+  8.8            1.00    Hulu 

11                          Seinfeld 1989  7+  8.8            0.88    Hulu 

12 It's Always Sunny in Philadelphia 2005 18+  8.8            0.96    Hulu 

13                     Normal People 2020      8.8            0.83    Hulu 

14                       Steins;Gate 2011 16+  8.8            1.00    Hulu 

15              Over the Garden Wall 2014  7+  8.8            0.88    Hulu 

16                    Nathan For You 2013 16+  8.8            0.97    Hulu


프라임 비디오 인기 프로그램

                       Title Year Age IMDb Rotten.Tomatoes     Service 

1           Band of Brothers 2001 18+  9.4            0.94 Prime.Video 

2                   The Wire 2002 18+  9.3            0.94 Prime.Video 

3               The Sopranos 1999 18+  9.2            0.92 Prime.Video 

4                The Planets 2019 all  9.1            1.00 Prime.Video 

5        Pride and Prejudice 1995 all  8.9            0.88 Prime.Video 

6                      House 2004 16+  8.7            0.90 Prime.Video 

7                   The Boys 2019 18+  8.7            0.84 Prime.Video 

8                    Fleabag 2016 18+  8.7            1.00 Prime.Video 

9                       Rome 2005 18+  8.7            0.86 Prime.Video 

10 The Marvelous Mrs. Maisel 2017 18+  8.7            0.89 Prime.Video 

11      Curb Your Enthusiasm 2000 18+  8.7            0.92 Prime.Video 

12            Six Feet Under 2001 18+  8.7            0.81 Prime.Video 

13                        Oz 1997 18+  8.7            0.89 Prime.Video 

14           The Thick of It 2005 18+  8.7            0.85 Prime.Video 


각 플랫폼 서비스별로 다양한 관점으로 데이터를 뜯어보았다.

어떤 서비스가 가장 맘에 드는지, 가장 나에게 마음에 드는 지 찾기 위해서 

인기 콘텐츠를 얼마나 갖고 있는 지, 최신 콘텐츠는 얼마나 있는 지, 고평가 받는 콘텐츠를 갖고 있는 곳은 어디인지 등 다양하게 살펴보았다. 


워낙, 한국 자체도 너무 많은 OTT 서비스가 있어서 어떤 식으로 시장이 바뀔진 모르겠지만!

들어온다면 디즈니 플러스가 빨리 출시했으면 좋겠다. ㅋ-ㅋ... 


데이터를 전처리하고 시각화하는 것만으로도 큰 공부가 된다.

이런 식의 공부도 자주해야겠다는 생각이 든다.

매거진의 이전글 피파19 플레이어 가치 예측하기

작품 선택

키워드 선택 0 / 3 0

댓글여부

afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari