데이터 분석

[kaggle]유튜브 인기 동영상 데이터 분석(파이썬)

박범준2 2020. 2. 26. 17:22
반응형
youtube_200224
In [61]:
#티스토리 업로드를 위하여 화면 크기 조절
from IPython.core.display import display, HTML
display(HTML("<style>.container {width:90% !important;}</style>"))

유튜브 인기 동영상 데이터 분석

Data Description(kaggle)

https://www.kaggle.com/datasnaek/youtube-new
by byeongjoon

Context

YouTube (the world-famous video sharing website) maintains a list of the top trending videos on the platform. According to Variety magazine, “To determine the year’s top-trending videos, YouTube uses a combination of factors including measuring users interactions (number of views, shares, comments and likes). Note that they’re not the most-viewed videos overall for the calendar year”. Top performers on the YouTube trending list are music videos (such as the famously virile “Gangam Style”), celebrity and/or reality TV performances, and the random dude-with-a-camera viral videos that YouTube is well-known for.

This dataset is a daily record of the top trending YouTube videos.

Note that this dataset is a structurally improved version of this dataset.

Content

This dataset includes several months (and counting) of data on daily trending YouTube videos. Data is included for the US, GB, DE, CA, and FR regions (USA, Great Britain, Germany, Canada, and France, respectively), with up to 200 listed trending videos per day.

EDIT: Now includes data from RU, MX, KR, JP and IN regions (Russia, Mexico, South Korea, Japan and India respectively) over the same time period.

Each region’s data is in a separate file. Data includes the video title, channel title, publish time, tags, views, likes and dislikes, description, and comment count.

The data also includes a category_id field, which varies between regions. To retrieve the categories for a specific video, find it in the associated JSON. One such file is included for each of the five regions in the dataset.

For more information on specific columns in the dataset refer to the column metadata.

Acknowledgements

This dataset was collected using the YouTube API.

Inspiration

Possible uses for this dataset could include:

  • Sentiment analysis in a variety of forms
  • Categorising YouTube videos based on their comments and statistics.
  • Training ML algorithms like RNNs to generate their own YouTube comments.
  • Analysing what factors affect how popular a YouTube video will be.
  • Statistical analysis over time .

Columns

  • video_id
  • trending_datetrending-list에 게재된 날짜
  • title
  • channel_title
  • category_idcategory_id.json 참조
  • publish_timeupload 시각
  • tags
  • viewstrending_date 까지의 누적 조회수
  • likestrending_date 까지의 누적 좋아요 수
  • dislikestrending_date 까지의 누적 싫어요 수
  • comment_counttrending_date 까지의 누적 댓글 수
  • thumbnail_link
  • comments_disabledif TRUE → comment_count = 0
  • ratings_disabledif TRUE → likes = 0 and dislikes = 0
  • video_error_or_removed
  • description

상황

가정

  1. 한국에서 유튜브 채널을 시작하려함
  2. 채널의 방향을 어떻게 잡아야 인기 동영상에 갈 수 있을지 알아보고자함

궁금한 것

  1. 인기 동영상의 기준은 무엇인가
  2. 현재 인기동영상의 전반적인 상황은 어떠한가 2.1. views
    2.2. likes
    2.3. dislikes
    2.4. comment_count
    2.5. tag_count
    2.6. Ratio 2.7. title_length
    2.8. description_length
    2.9. 하루 평균 인기 동영상의 개수
    2.10. 게시되고 어느 정도 지나서 인기 영상에 갔는가
    2.11. category 별 동영상의 수
    2.12. 채널 별 상황은 어떠한가
  3. 조회수와 연관이 있는 항목들은 무엇인가
  4. 결론

전처리

In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import json
from datetime import timedelta

pd.options.display.float_format = "{:.2f}".format #pandas 출력 포맷팅 참고(https://financedata.github.io/posts/pandas-display-format.html)

%matplotlib inline
In [2]:
data = pd.read_csv("./dataset/KRvideos.csv", engine = "python")

pd.read_csv 를 했을 때
"utf-8" codec can"t decode bytes in position 253-254: unexpected end of data 가 발생한다면
engine="python" 을 명시해주면 됩니다.

In [3]:
data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 34567 entries, 0 to 34566
Data columns (total 16 columns):
video_id                  34567 non-null object
trending_date             34567 non-null object
title                     34567 non-null object
channel_title             34567 non-null object
category_id               34567 non-null int64
publish_time              34567 non-null object
tags                      34567 non-null object
views                     34567 non-null int64
likes                     34567 non-null int64
dislikes                  34567 non-null int64
comment_count             34567 non-null int64
thumbnail_link            34567 non-null object
comments_disabled         34567 non-null bool
ratings_disabled          34567 non-null bool
video_error_or_removed    34567 non-null bool
description               31404 non-null object
dtypes: bool(3), int64(5), object(8)
memory usage: 3.5+ MB

전체 데이터는 34,567개 column은 16개 있습니다.
description은 결측치가 있는 행이 있네요.

image.png
description에 결측치가 있는 사례 중 하나로, descriptipn이 없는지 유튜브에서 확인해봤습니다.
실제로 description에 내용이 없습니다.

video_id

In [4]:
df = data[:]

for col in ["thumbnail_link", "comments_disabled", "ratings_disabled", "video_error_or_removed"]:#해당 분석에서 사용하지 않아 미리 삭제
    del df[col] 

video_id가 동영상의 고유값인지 확인해보겠습니다.

In [5]:
df["video_id"].duplicated().value_counts()
Out[5]:
True     18691
False    15876
Name: video_id, dtype: int64

데이터의 절반 정도가 중복값이네요. 확인해보겠습니다.

In [6]:
df = df.drop_duplicates(["video_id"])[:]

동영상이 여러 일자에 인기동영상이 될 경우, 일자별로 데이터가 생겼습니다.
이번 분석에서는, 해당 기간동안 처음으로 인기동영상이 되었을 때의 데이터로만 분석을 진행하겠습니다.
중복된 video_id를 제거.

In [7]:
df["video_id"].duplicated().value_counts()
Out[7]:
False    15876
Name: video_id, dtype: int64

category_id & category

category_id와 json 파일을 사용하여 텍스트로 된 category 열을 생성합니다.
코드 참고 : https://www.kaggle.com/yontodd/us-youtube-eda-when-how-often-which-category#Cleaning-and-preparing-the-data

In [8]:
id_to_category = {}

with open("./dataset/KR_category_id.json","r") as f:
    id_data = json.load(f)
    for category in id_data["items"]:
        id_to_category[category["id"]] = category["snippet"]["title"]

# id_to_category

df["category_id"] = df["category_id"].astype(str)
df.insert(4, "category", df["category_id"].map(id_to_category))
In [9]:
df.isnull().sum()
Out[9]:
video_id            0
trending_date       0
title               0
channel_title       0
category          119
category_id         0
publish_time        0
tags                0
views               0
likes               0
dislikes            0
comment_count       0
description      1602
dtype: int64

생성한 category 열에 결측치가 있는 사례가 있습니다.

In [10]:
df["category_id"].loc[df["category"].isnull() == True].value_counts()
Out[10]:
29    119
Name: category_id, dtype: int64

확인해보니 category_id가 29번인 경우 매칭이 안됐네요.

image.png

json파일을 확인해보니 29번이 없습니다.

image.png

그래서 category_id가 29번인 영상을 직접 찾아 확인해보니 카테고리가 "비영리/사회운동"이네요.
category의 결측치를 "Nonprofits & Activism" 으로 채워줍니다.

In [11]:
df["category"].loc[df["category"].isnull() == True] = "Nonprofits & Activism"
/Users/byeongjoon/anaconda3/lib/python3.7/site-packages/pandas/core/indexing.py:190: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)

분석에 사용하기 위하여 trending_date & publish_time를 datetime 형식으로 바꿔줍니다.

In [12]:
data["trending_date"] = pd.to_datetime(data["trending_date"], format = "%y.%d.%m")

df["trending_date"] = pd.to_datetime(df["trending_date"], format = "%y.%d.%m")

df["publish_time"] = pd.to_datetime(df["publish_time"])
df["publish_time"] = df["publish_time"].apply(lambda x : x.date())
df["publish_time"] = pd.to_datetime(df["publish_time"])

tags & tag_count

In [13]:
df["tags"][df["video_id"] == "C-bLqIftDY4"].values
Out[13]:
array(['불교|"즉문즉설"|"법륜스님"|"정토회"|"buddha"|"buddhism"|"pomnyun"|"스님의주례사"|"엄마수업"|"깨달음"|"기도"|"수행"|"답답하면물어라"|"법륜"|"스님"|"새로운100년"|"Buddhahood"|"Gautama"|"Buddha"|"시동생"|"조건"|"조카"|"아이들"|"이혼"|"돌아온 싱글"|"망막색소변성증"|"죄의식"|"마음"|"미안함"|"육아"|"걱정"|"책임"|"선한 행위"|"복"|"시월드"|"사주"|"워킹맘"|"며느리"|"양심"'],
      dtype=object)

image.png

tags는 meta에 있는 데이터들이네요.
다만 이미지 하단에 있는 "40대","여성","가정사","조카양육" 의 태그들이, 제공된 데이터에는 포함되지 않는 걸로 보았을 때, 4개의 태그는 제공된 데이터가 수집된 시점 이후에 추가된게 아닐까 싶습니다.

image.png

영상 설명에는 태그가 3개까지 표시되네요.

In [14]:
df["tag_count"] = df["tags"].apply(lambda x : len(x.split("|")) if x != "[none]" else 0)

동영상에 포함된 태그의 개수로 tag_count 열을 생성했습니다.

Ratio (likes/views, dislikes/views, comment_count/views, dislikes/likes)

조회수 대비 좋아요 비율
조회수 대비 싫어요 비율
조회수 대비 댓글수 비율
좋아요 대비 싫어요 비율
을 알아보기 위하여 변수 생성

In [15]:
df["likes/views"] = df["likes"] / df["views"]
df["dislikes/views"] = df["dislikes"] / df["views"]
df["comment_count/views"] = df["comment_count"] / df["views"]
df["dislikes/likes"] = df["dislikes"] / df["likes"]
df["dislikes/likes"].loc[df["dislikes/likes"] == np.inf] = 0
In [16]:
df.isnull().sum()
Out[16]:
video_id                  0
trending_date             0
title                     0
channel_title             0
category                  0
category_id               0
publish_time              0
tags                      0
views                     0
likes                     0
dislikes                  0
comment_count             0
description            1602
tag_count                 0
likes/views               0
dislikes/views            0
comment_count/views       0
dislikes/likes          727
dtype: int64

dislikes/likes 에 결측값이 있는데, likes의 값 중에 0이 있어서 그렇습니다.
결측값을 0으로 대체합니다.

In [17]:
df["dislikes/likes"].loc[df["dislikes/likes"].isnull() == True] = 0

title & title_length

In [18]:
df["title_length"] = df["title"].apply(lambda x : len(str(x)) if pd.isnull(x) == False  else 0 )

title의 길이로 title_lenght 열을 생성했습니다.

description & description_length

In [19]:
df["description_length"] = df["description"].apply(lambda x : len(str(x)) if pd.isnull(x) == False  else 0 )

description의 길이로 description_length 열을 생성했습니다.

treTime-pubTime

In [20]:
df["treTime-pubTime"] = df["trending_date"] - df["publish_time"] + timedelta(days = 1)

동영상 게시 후 얼마 후에 인기동영상에 갔는지를 의미하는 treTime-pubTime입니다.

In [21]:
df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 15876 entries, 0 to 34561
Data columns (total 21 columns):
video_id               15876 non-null object
trending_date          15876 non-null datetime64[ns]
title                  15876 non-null object
channel_title          15876 non-null object
category               15876 non-null object
category_id            15876 non-null object
publish_time           15876 non-null datetime64[ns]
tags                   15876 non-null object
views                  15876 non-null int64
likes                  15876 non-null int64
dislikes               15876 non-null int64
comment_count          15876 non-null int64
description            14274 non-null object
tag_count              15876 non-null int64
likes/views            15876 non-null float64
dislikes/views         15876 non-null float64
comment_count/views    15876 non-null float64
dislikes/likes         15876 non-null float64
title_length           15876 non-null int64
description_length     15876 non-null int64
treTime-pubTime        15876 non-null timedelta64[ns]
dtypes: datetime64[ns](2), float64(4), int64(7), object(7), timedelta64[ns](1)
memory usage: 2.7+ MB

여기까지가 전처리 과정입니다.


분석

1. 인기동영상의 기준은 무엇인가

image.png

2. 현재 인기 동영상의 전반적인 상황은 어떠한가

In [22]:
print("분석에 사용한 데이터는 {}개의 변수를 가진 인기동영상 데이터 {}개입니다.".format(len(df.columns), format(len(df),",")))
분석에 사용한 데이터는 21개의 변수를 가진 인기동영상 데이터 15,876개입니다.
In [23]:
df.describe()
Out[23]:
views likes dislikes comment_count tag_count likes/views dislikes/views comment_count/views dislikes/likes title_length description_length treTime-pubTime
count 15876.00 15876.00 15876.00 15876.00 15876.00 15876.00 15876.00 15876.00 15876.00 15876.00 15876.00 15876
mean 243673.94 7551.82 277.60 1249.53 15.76 0.02 0.00 0.00 0.11 42.29 297.91 2 days 23:10:34.013605
std 1170657.55 67322.41 7295.18 12157.74 19.52 0.03 0.00 0.01 0.31 19.75 454.45 26 days 17:05:42.936145
min 2050.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 2.00 0.00 1 days 00:00:00
25% 33104.50 300.00 14.00 71.00 2.00 0.00 0.00 0.00 0.01 28.00 44.00 2 days 00:00:00
50% 73327.00 1037.00 44.00 240.00 9.00 0.01 0.00 0.00 0.04 39.00 143.00 2 days 00:00:00
75% 167225.75 2841.25 109.00 642.00 22.00 0.03 0.00 0.01 0.10 53.00 373.00 3 days 00:00:00
max 62796390.00 4470923.00 884965.00 905925.00 152.00 0.36 0.04 0.52 9.76 100.00 5235.00 2336 days 00:00:00

likes, dislikes, comment_count, tag_count, description_length 다섯가지 항목은 최소값 항목을 살펴보니 0인 사례들이 있습니다.
각 항목 별로 확인해보았으나 데이터에 오류는 없었습니다.
해당 항목들은 인기동영상이 되는 것에 영향을 주지 않거나, 영향이 작은 것으로 판단할 수 있습니다.
위의 다섯가지 항목에서 파생한 likes/views, dislikes/views, comment_count/views, dislikes/likes 항목들도 마찬가지로 영향이 크지 않을 것입니다.

views를 중점적으로 탐색하고, 나머지 항목들은 간단하게 살펴보겠습니다.

*title_length를 제외한 나머지 항목은 평균값과 최대값의 차이가 크기 때문에, 극단적으로 높은 값들을 제외하면 실제 평균은 다소 낮아질 가능성이 있습니다.

In [24]:
plt.figure(figsize = (20, 20))
for i in range(len(df.describe().columns) - 1 ):
    plt.subplot(4, 4, i + 1)
    plt.title(df.describe().columns[i])
    plt.hist(df[df.describe().columns[i]],bins = 10)
    plt.grid()

수치형 변수의 분포는 전체적으로 오른쪽으로 꼬리가 긴 형태입니다.
극단적인 케이스의 영향을 많이 받았다고 할 수 있습니다.

In [25]:
def summary_numeric(col):
    print(col)
    print("평균 {:>15}".format(format(df[col].mean(), ",.2f")))
    print("최소 {:>15}".format(format(df[col].min(), ",.2f")))
    print("중앙 {:>15}".format(format(df[col].median(), ",.2f")))
    print("최대 {:>15}".format(format(df[col].max(), ",.2f")))

2.1. views

In [26]:
summary_numeric("views")
views
평균      243,673.94
최소        2,050.00
중앙       73,327.00
최대   62,796,390.00

views는 수치형 변수 중 최대값의 단위가 가장 큰 항목입니다.
인기 동영상들은 평균 조회수 243,674건이네요.
최대 조회수가 억 단위인걸로 봐서 극단값들의 영향이 매우 클 것 같습니다.

In [27]:
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "publish_time", "trending_date"]].sort_values(by = ["views"], ascending = [False]).head(3)
Out[27]:
video_id title channel_title category views likes dislikes comment_count publish_time trending_date
29969 7C2z4GqqS5E BTS (방탄소년단) 'FAKE LOVE' Official MV ibighit Music 62796390 4470923 119053 905925 2018-05-18 2018-05-20
4244 FlsCjmMhFmw YouTube Rewind: The Shape of 2017 | #YouTubeRe... YouTube Spotlight Entertainment 52611730 1891832 884965 702790 2017-12-06 2017-12-08
24088 i0p1bmr0EmE TWICE What is Love? M/V jypentertainment Music 38840787 1111599 96407 206639 2018-04-09 2018-04-14

조회수 상위 3개를 살펴보겠습니다.

1위는 방탄소년단의 뮤직비디오로 게시된지 2일 후 조회수 62,796,390에 도달했네요.
2위는 연말에 유튜브에서 게시하는 영상 "The Shape of 2017"고 게시 2일 후 조회수 52,611,730입니다.
3위는 트와이스의 뮤직비디오로 게시 5일 후 조회수 38,840,787입니다.

상위에 해당하는 데이터는 이 정도로 살펴보고, 극단치들을 제외하여 데이터를 살펴보겠습니다.

In [28]:
print("전체 데이터 {}건".format(len(df)) )
print("1000만이상 {}건 전체의 {:.2f}%".format(len(df.loc[df["views"] >= 10000000]),len(df.loc[df["views"] >= 10000000]) / len(df) * 100))
print("100만이상 {}건 전체의 {:.2f}%".format(len(df.loc[df["views"] >= 1000000]),len(df.loc[df["views"] >= 1000000]) / len(df) * 100))
print("100만이하 {}건 전체의 {:.2f}%".format(len(df.loc[df["views"] < 1000000]),len(df.loc[df["views"] < 1000000]) / len(df) * 100))
전체 데이터 15876건
1000만이상 32건 전체의 0.20%
100만이상 570건 전체의 3.59%
100만이하 15306건 전체의 96.41%

조회수 100만 이상의 회사 3.59%를 제외하고 그래프를 확인해보겠습니다.

In [29]:
print("조회수 100만 이하 데이터의 평균: {:.2f}".format(df["views"].loc[df["views"] <= 1000000].mean()))
plt.hist(df["views"].loc[df["views"] <= 1000000]);
조회수 100만 이하 데이터의 평균: 125664.01

조회수 100만 이상의 데이터 570건을 제외하니,
평균 조회수는 125,664건으로 나타나고,
조회수 0~20만 이하에 대부분의 영상이 있는 것을 확인할 수 있었습니다.

views에서 한가지 의외인 점은, 최소 조회수를 봤을 때 2,050의 조회수로도 인기 동영상이 될 수 있다는 것 입니다.
좀 더 자세히 살펴보겠습니다.

In [30]:
df.loc[df["views"] <= 3000,["video_id", "title", "publish_time", "trending_date", "category", "views", "likes", "comment_count", "tag_count"]].sort_values(by = "views")
Out[30]:
video_id title publish_time trending_date category views likes comment_count tag_count
1071 36qc1QtE6bk 소셜 잠금화면 앱 (달고나) 2017-11-17 2017-11-19 People & Blogs 2050 3 0 3
509 vWkMCsWwHYU 만취 브이로그ㅣ서프라이즈 생일 파티ㅣ실시간 현실 술판ㅣ여자셋 일상ㅣ일상브이로그 2017-11-15 2017-11-16 People & Blogs 2623 8 25 10
17414 3cdfrhklH_8 애슐리 18년도 딸기축제 영상❣ 2018-02-27 2018-02-27 Entertainment 2919 10 1 0

조회수 3000미만의 영상 3개 입니다.
1071행의 데이터는 11월17일에 게시하여 11월19일에 조회수 2,050 좋아요 3, 댓글 0 으로 인기동영상이 되었네요.
3일 동안 조회수 2,050에 좋아요 3이 인기동영상이 될 정도인가..? 하는 생각이 듭니다.
이 정도 수치를 달성하는 영상들이 전체 영상 중에서 적지 않을 것 같은데 말이죠.

17414행의 데이터는 당일에 게시하여, 조회수 2919에 좋아요 10, 댓글 1로 인기동영상이 된 것과 비교해봐도..의구심이 생깁니다.
시간당 조회수로 따져봐도 1071은 2050/(24*3) = 28.47 , 17414는 2919/24 = 121.63 인데..

유튜브에서 발표한 인기영상의 기준을 봤을 때,
image.png

조회수, 온도, 업로드기간에서 크게 강점이 없는 것 같은데, 그러면 유입소스에서 강점이 있는걸까요?

*혹시 영상 내 광고 유무가 영향을 줄까하여 해당 영상을 확인해봤지만, 광고는 없었습니다.

image.png

분석시점 2020년 02월 25일 기준 해당 영상의 수치입니다.
컨텐츠는 앱 광고영상이네요.
인기영상에 간 시점에서 2년이 지났는데 조회수 767, 좋아요 1이 증가했습니다.
전체 조회수의 약 70% 동영상 게시 2일 동안 발생했다는 이야기인데 구독자도 1인 상황이네요. 유튜브 알고리즘이 정상적으로 작동했다는 가정하에, 가능성은 두 가지입니다.
첫번째: 해당 영상을 광고로 사용(궁금증: 광고에서 영상을 봐도 조회수가 오르는가?)
두번째: 봇을 사용하여 해당 영상의 조회수를 조작(가능성이 낮다고 생각합니다.)

첫번째 경우에 해당될 것 같습니다.
만약 광고 영상으로 조회수가 오르는 것이 사실이라면, 저는 인기 동영상에 게시되는게 목표이기 때문에, 동영상 게시 후 약 3일 동안 광고하여 조회수 2,000을 넘어가게끔 하겠습니다.

2.2. likes

In [31]:
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "tag_count", "description_length"]].sort_values(by = ["likes"], ascending = [False]).head(3)
Out[31]:
video_id title channel_title category views likes dislikes comment_count tag_count description_length
29969 7C2z4GqqS5E BTS (방탄소년단) 'FAKE LOVE' Official MV ibighit Music 62796390 4470923 119053 905925 8 784
1976 kTlv5_Bs8aw BTS (방탄소년단) 'MIC Drop (Steve Aoki Remix)' Offi... ibighit Music 13945717 2055181 23890 395562 6 781
17879 OK3GJ0WIQ8s j-hope 'Daydream (백일몽)' MV ibighit Music 10695328 2050584 14714 387397 6 912

간략하게 살펴보면 likes는 평균 7,552, 범위는 0 ~ 4,470,923
상위 3개의 동영상을 살펴보니 모두 뮤직비디오이고, ibighit 채널에서 게시한 동영상이네요.
29969 항목은 조회수 1위에 해당하는 동영상입니다.

2.3. dislikes

In [32]:
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "tag_count", "description_length"]].sort_values(by = ["dislikes"], ascending = [False]).head(3)
Out[32]:
video_id title channel_title category views likes dislikes comment_count tag_count description_length
4244 FlsCjmMhFmw YouTube Rewind: The Shape of 2017 | #YouTubeRe... YouTube Spotlight Entertainment 52611730 1891832 884965 702790 37 710
29969 7C2z4GqqS5E BTS (방탄소년단) 'FAKE LOVE' Official MV ibighit Music 62796390 4470923 119053 905925 8 784
24088 i0p1bmr0EmE TWICE What is Love? M/V jypentertainment Music 38840787 1111599 96407 206639 35 498

dislikes는 평균 278, 범위는 0 ~ 884,965
상위 3개의 동영상을 살펴보니, 모두 조회수 1~3위에 해당하는 동영상들입니다.

2.4. comment_count

In [33]:
df[["video_id", "title", "channel_title", "category","views","likes", "dislikes", "comment_count", "tag_count", "description_length"]].sort_values(by = ["comment_count"], ascending = [False]).head(3)
Out[33]:
video_id title channel_title category views likes dislikes comment_count tag_count description_length
29969 7C2z4GqqS5E BTS (방탄소년단) 'FAKE LOVE' Official MV ibighit Music 62796390 4470923 119053 905925 8 784
4244 FlsCjmMhFmw YouTube Rewind: The Shape of 2017 | #YouTubeRe... YouTube Spotlight Entertainment 52611730 1891832 884965 702790 37 710
1976 kTlv5_Bs8aw BTS (방탄소년단) 'MIC Drop (Steve Aoki Remix)' Offi... ibighit Music 13945717 2055181 23890 395562 6 781

comment_count는 평균 1,250, 범위는 0 ~ 905,925
상위 2개의 항목은, 조회수 1~3위에 해당하는 동영상이네요.

2.5. tag_count

In [34]:
plt.hist(df["tag_count"],bins = 10);

tag_count는 평균 16, 범위는 0 ~ 152
태그의 개수가 10개 이하인 동영상이 약 10,000개 정도 입니다.

In [35]:
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "tag_count","description_length"]].sort_values(by = ["tag_count"], ascending = [False]).head(10)
Out[35]:
video_id title channel_title category views likes dislikes comment_count tag_count description_length
1879 _k6vG6rdLdU [무당튜브] 2018년도 부자되는 띠 010-2896-3010 양지암 People & Blogs 16463 91 17 3 152 2
26604 YPLGSDBVsLE 해외에서 강아지 다루는 태도로 주목 받고 있는 애견 미용사 ㅎㄷㄷ.. FeelSoGood Pets & Animals 738011 8366 390 1621 132 478
2166 wW7WisSQm30 강아지에게 손을 달라 해놓고 안받아 줬더니 ㅋㅋㅋㅋㅋㅋㅋㅋ FeelSoGood Pets & Animals 53085 1097 16 68 129 189
25501 SZcWqrCPZ3c 집사의 귀가시간이 평소보다 3시간이 늦어 단단히 삐진 냥이 FeelSoGood Pets & Animals 146700 3231 65 177 127 444
23946 C1nYy3wNt3A 소파에 쉬고 있는 말라뮤트를 새끼 고양이가 귀찮게굴자 말라뮤트는.... FeelSoGood Pets & Animals 392793 4011 87 385 126 356
20155 R740niISpq4 논밭을 뜯어먹는 멧돼지를 잡았는데 새끼여서 풀어줬더니 ...ㅋㅋㅋㅋㅋㅋ FeelSoGood Pets & Animals 371000 3400 108 770 126 356
12105 WpLawX898eI 계단 내려가는게 넘 귀찮았던 냥이가 선택한 방법ㅋㅋㅋㅋㅋㅋ FeelSoGood Pets & Animals 28546 905 9 122 126 356
27485 LVO6SFZCsa4 강아지에게 주인이 사라지는 마술을 보여줬더니 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ FeelSoGood Pets & Animals 219369 3299 54 275 126 342
29522 X-Fz2nZfyzk 고양이에게 갖다 버린다고 했더니..? FeelSoGood Pets & Animals 115706 923 126 126 126 362
13571 tatJhPX5ey4 눈밭에서 눈덩이를 던진 뒤 시바견에게 가져오라고 했는데 ㅋㅋㅋㅋㅋㅋㅋㅋ FeelSoGood Pets & Animals 165471 5455 35 366 126 454

상위 10개까지 살펴보니, 1위를 제외하고 2~10위는 모두 FeelSoGood 채널에서 게시한 동영상입니다.
해당 채널은 태그의 개수를 많이 사용하는 경향이 있는 것 같습니다.

2.6. Ratio (likes/views, dislikes/views, comment_count/views, dislikes/likes)

In [36]:
df[["likes/views", "dislikes/views", "comment_count/views", "dislikes/likes"]].describe()
Out[36]:
likes/views dislikes/views comment_count/views dislikes/likes
count 15876.00 15876.00 15876.00 15876.00
mean 0.02 0.00 0.00 0.11
std 0.03 0.00 0.01 0.31
min 0.00 0.00 0.00 0.00
25% 0.00 0.00 0.00 0.01
50% 0.01 0.00 0.00 0.04
75% 0.03 0.00 0.01 0.10
max 0.36 0.04 0.52 9.76

조회수 대비 좋아요는 평균은 2%이고 최대 36%입니다.
조회수 대비 싫어요는 대부분 0%로 측정되고 최대 4%입니다.
조회수 대비 댓글수는 대부분 0%인데 최대가 52%네요. 특이값이 있는 것 같습니다.
좋아요 대비 싫어요는 평균 11%인데 최대가 976%입니다. 이 항목도 특이값이 있는 것 같습니다.

In [37]:
df[["video_id", "title", "channel_title", "category", "views", "likes/views", "dislikes/views", "comment_count/views", "dislikes/likes", "trending_date"]].sort_values(by = ["likes/views"], ascending = [False]).head(5)
Out[37]:
video_id title channel_title category views likes/views dislikes/views comment_count/views dislikes/likes trending_date
33694 I1u59qyuUBE ★90만 구독자 돌파★ 슈퍼컴퓨터세트 로밀리들 다 가져가세요!! 로이조 TV Gaming 170127 0.36 0.00 0.50 0.00 2018-06-09
18151 lEy_XobnhGk ★i7-7700k / GTX1080ti★ 330만원짜리 슈퍼컴퓨터 한번 더 가즈아ㅏ... 로이조 TV People & Blogs 133479 0.36 0.00 0.52 0.00 2018-03-03
20913 sJGolNWtHFI Special Trailer | BTS: Burn The Stage BANGTANTV Entertainment 690491 0.30 0.00 0.03 0.00 2018-03-20
15491 ykZi4U9669A [BANGTAN BOMB] BTS' exciting Game room #1 - BT... BANGTANTV Music 539149 0.28 0.00 0.02 0.00 2018-02-15
31975 fYh-H2GOw_M 레오(LEO) - 꿈 RealVIXX Music 63111 0.26 0.00 0.03 0.00 2018-05-31

조회수 대비 좋아요를 기준으로 하는 상위 5개의 항목입니다.
1,2위는 로이조TV 채널의 동영상, 3,4위는 방탄소년단 채널의 동영상, 5위는 빅스 채널의 동영상입니다.

1,2위 영상의 제목,
1,2위 조회수 대비 댓글수(comment_count/views),
구독자가 BANGTANTV 2580만명, RealVIXX 123만명, 로이조TV가 68만명인것(2020년02월25일 기준 구독자 수지만 2년 전에도 그 비율은 비슷했을걸로 추정),
총 3가지를 고려했을 때 로이조TV에서 컴퓨터를 상품으로 좋아요와 댓글 이벤트를 진행한 것 같습니다.
1,2위에 해당하는 영상이 비공개 처리되어 정확하게 확인할 수는 없네요.

좋아요와 댓글수를 늘리는 것에는 상품이 큰 영향을 주는 것 같습니다.

In [38]:
df[["video_id", "title", "channel_title", "category", "views", "likes/views", "dislikes/views", "comment_count/views", "dislikes/likes", "trending_date"]].sort_values(by = ["dislikes/views"], ascending = [False]).head(5)
Out[38]:
video_id title channel_title category views likes/views dislikes/views comment_count/views dislikes/likes trending_date
6321 _4XMgqNMwJs 12.18] 12.19] 스크림팀 갓건배 오늘 11시 시작합니다!!!! 오버워치 ... 갓건배 Gaming 9056 0.04 0.04 0.00 1.21 2017-12-20
9210 a5jpM7biXp4 1.6] 슬라임 개부자 갓건배방송. 오버워치 부캐 배치봅니다. 그마갑니다. 여러분들... 갓건배 Gaming 22978 0.03 0.04 0.01 1.39 2018-01-07
2667 rzUpGAmhgPc Chi Pu | EM SAI RỒI ANH XIN LỖI EM ĐI (#ESRAXL... Chi Pu Official Entertainment 2354772 0.04 0.03 0.01 0.81 2017-11-28
1316 VWH6NGjrG4Q [변희재의 시사폭격] 조원진과 김경혜의 대한애국당 사망선고일! 그래도 희망은 잃지 말자 미디어워치 TV Entertainment 42283 0.03 0.03 0.03 0.79 2017-11-21
10305 M_Mtb-XR4Us 1.14] 오버워치 부캐(남친계정대리중)참교육방송 및 11시 스크림팀!!! 오버워... 갓건배 Gaming 17266 0.03 0.03 0.00 0.84 2018-01-15

조회수 대비 싫어요를 기준으로 하는 상위 5개의 항목입니다.
갓건배 채널의 동영상이 3개가 있습니다.
찾아보니 욕설 등의 논란으로 유튜브에서 여러 번 영구정지 처분을 받았고 그때마다 새로운 계정을 만들었다고 하네요.

In [39]:
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "dislikes/likes", "trending_date"]].sort_values(by = ["dislikes/likes"], ascending = [False]).head(5)
Out[39]:
video_id title channel_title category views likes dislikes dislikes/likes trending_date
25041 3TsaEm3n4g4 비행기에서 여자 승객이 창문 밖으로 빨려나갔습니다 ♥ 오늘의 뉴스 korean stars Entertainment 40371 29 283 9.76 2018-04-20
26375 drvMBP-JQiA [충격 비밀] 진실!!! 광주 쌍촌동 교통 사고 블랙박스 영상 뒤의 진실 [K픽처] K픽처 People & Blogs 43173 24 234 9.75 2018-04-28
6219 WtSuPsBqPkc 샤이니 종현 부모님 아빠 엄마 비화 더욱 슬프다 스타뉴스 People & Blogs 73862 61 535 8.77 2017-12-20
5543 YmIEwuRpBlU 고영욱 엄마 자살 근황 사건 출소 전자발찌 신상정보공개 연예인 People & Blogs 218254 210 1747 8.32 2017-12-16
16282 nxgDrS1S3oU 파파다키스 노출 사고 시즈롱 의상 때문에 저... 빵빠레 People & Blogs 295195 64 525 8.20 2018-02-20

좋아요 대비 싫어요를 기준으로 하는 상위 5개의 항목입니다.
대부분 당시 사회 이슈와 관련되어 있고, 논란이 있었던 소재들인 것으로 보입니다.

2.7. title_length

In [40]:
plt.hist(df["title_length"],bins = 10)
plt.axvline(x = 42, color = "r", linestyle = "-", linewidth = 1)
Out[40]:
<matplotlib.lines.Line2D at 0x1a24103a20>

title_length는 평균 42, 범위는 2 ~ 100입니다.
항목들 중 그나마 극단적으로 치우치지 않은 분포를 보입니다.
길이가 10~60자 이내인 동영상이 많은 비중을 차지하고 있습니다.

In [41]:
df.loc[df["title_length"] <= 2]
Out[41]:
video_id trending_date title channel_title category category_id publish_time tags views likes ... comment_count description tag_count likes/views dislikes/views comment_count/views dislikes/likes title_length description_length treTime-pubTime
2096 Se5kH2axq_E 2017-11-25 59 자유의 함성 Autos & Vehicles 2 2017-11-23 [none] 18753 1434 ... 140 연 락처: khiabc1102@gmail.com 0 0.08 0.00 0.01 0.00 2 26 3 days
2754 GR3XqucodQo 2017-11-29 70 자유의 함성 Autos & Vehicles 2 2017-11-27 [none] 12844 1265 ... 128 khiabc1102@gmail.com 0 0.10 0.00 0.01 0.00 2 20 3 days
2985 z9rce24zlzQ 2017-11-30 72 자유의 함성 Autos & Vehicles 2 2017-11-28 [none] 14444 1399 ... 93 khiabc1102@gmail.com 0 0.10 0.00 0.01 0.00 2 20 3 days
17806 VUKZsCEjPVw 2018-03-01 케밥 안재효 People & Blogs 22 2018-02-27 [none] 6558 1145 ... 407 조하 0 0.17 0.00 0.06 0.01 2 2 3 days

4 rows × 21 columns

제목의 길이가 2인 인기동영상 4개입니다.
특이한 점은 likes/views 평균이 0.02인 것을 고려했을 때, 4개의 동영상 모두 likes/views의 비율이 높은 편인 것입니다.
17806 안재효 채널은 아이돌그룹 블락비의 멤버의 채널이라 likes/views가 높은 것으로 추정됩니다.
나머지 3개의 동영상은 현재 비공개 처리되어 확인할 수 없었습니다.

2.8. description_length

In [42]:
plt.hist(df["description_length"],bins = 10);

description_length는 평균 298, 범위는 0 ~ 5235
길이가 500 이하인 데이터가 대부분입니다.

In [43]:
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "tag_count", "description_length"]].sort_values(by = ["description_length"], ascending = [False]).head(10)
Out[43]:
video_id title channel_title category views likes dislikes comment_count tag_count description_length
9017 s-PBegx1OPU [라뮤끄 성형외과] 꿀팁 대방출 ! 짝눈, 비대칭 성형 메이크업 (feat. 첫 손... lamuqe Howto & Style 251180 12357 72 2059 23 5235
15270 5pdwNHuGLB4 [라뮤끄 성형외과] 꿀팁 대방출! 평면적인 윤곽&속쌍&홍조 성형 메이크업(세 번째 ... lamuqe Howto & Style 376864 10567 174 2218 20 5175
12240 TJYjeQg7e-M [라뮤끄 성형외과] 꿀팁 대방출 ! 작은눈&무쌍 성형 메이크업 (두 번째 손님) |... lamuqe Howto & Style 358662 17414 105 3684 18 5147
17084 yhWf-FILZm8 빨간 달이 문제인 / 벌레소년 (feat. 벌레소녀, 음반업자X) Boy Bugs Music 92994 7845 248 1759 0 5104
20573 EAB0SI1D6c8 셀카 잘 나오는 ALL 로드샵 데일리 메이크업✨(feat.새내기 드루오세욥) | W... 우린 Howto & Style 59825 1594 21 200 20 5081
25018 PPtQu9wmcVU 미국 명문대가 동양인을 차별하는 진짜 이유 올리버쌤 Education 88908 5621 36 1233 0 5069
15877 x31DL-bEFoQ (**Eng.) 재생크림? 욕세럼? 핌플패드, 토너 진짜 좋을까?! SNS유명템 탈... 디렉터 파이 People & Blogs 54739 2093 16 322 43 5034
25319 wV_60-8ZaGw EATING LIPS with MAKEUP!!! Kluna Tik Dinner | ... Kluna Tik Entertainment 2546834 21257 2672 1856 61 4938
15543 oJ-ebp0Yn2c [병맛리뷰] 여러분의 인생 영화를 바꿔드립니다. 샤크네이도! 9bul People & Blogs 23570 527 15 284 6 4868
28956 r-3iathMo7o The ULTIMATE $30,000 Gaming PC Setup Unbox Therapy Science & Technology 3205123 74196 5439 9400 37 4830

1~3위는 모두 lamuqe 채널에서 게시한 동영상으로, 해당 채널은 description을 길게 작성하는 경향이 있는 것 같습니다.
또한 다른 속성들의 상위 동영상들과 달리, description_length 상위에 있는 동영상들은 제품 혹은 서비스를 리뷰하는 동영상이 많은 비중을 차지하고 있습니다.

2.9. 하루 평균 인기 동영상의 개수

In [44]:
plt.figure(figsize = (15,10));
data["trending_date"].value_counts().plot(label = "중복영상을 포함한 하루 인기동영상의 개수")
df["trending_date"].value_counts().plot(label = "중복영상을 제외한 하루 인기동영상의 개수")

plt.legend(prop = {"size":17});
In [45]:
print("중복영상을 포함한 하루 인기동영상의 개수")
print("평균 : {:.2f}개".format(data["trending_date"].value_counts().mean()))
print("최대 : {:.2f}개".format(data["trending_date"].value_counts().max()))
print("최소 : {:.2f}개".format(data["trending_date"].value_counts().min()))

print("중복영상을 제외한 하루 인기동영상의 개수")
print("평균 : {:.2f}개".format(df["trending_date"].value_counts().mean()))
print("최대 : {:.2f}개".format(df["trending_date"].value_counts().max()))
print("최소 : {:.2f}개".format(df["trending_date"].value_counts().min()))
중복영상을 포함한 하루 인기동영상의 개수
평균 : 168.62개
최대 : 200.00개
최소 : 102.00개
중복영상을 제외한 하루 인기동영상의 개수
평균 : 77.82개
최대 : 178.00개
최소 : 2.00개

하루 평균 168개 정도의 영상이 인기동영상에 포함되고, 102~200의 범위를 가지네요.
한편 중복포함과 중복제외 인기동영상의 개수를 확인해보니,
하루 평균 약 100개 정도의 다른 일자의 인기동영상이 포함되어있습니다.

2.10. 게시되고 어느 정도 지나서 인기 영상에 갔는가

In [46]:
df["treTime-pubTime"].describe()
Out[46]:
count                      15876
mean      2 days 23:10:34.013605
std      26 days 17:05:42.936145
min              1 days 00:00:00
25%              2 days 00:00:00
50%              2 days 00:00:00
75%              3 days 00:00:00
max           2336 days 00:00:00
Name: treTime-pubTime, dtype: object

인기동영상들은 동영상을 평균적으로 게시하고 다음 날 인기동영상이 되었습니다. 빠르면 당일에 인기동영상이 되네요.

In [47]:
pd.cut(df["treTime-pubTime"],[timedelta(days = 0),timedelta(days = 1),timedelta(days = 2),timedelta(days = 3),timedelta(days = 2335)]).value_counts(sort = False,normalize = True)
Out[47]:
(0 days 00:00:00, 1 days 00:00:00]      0.03
(1 days 00:00:00, 2 days 00:00:00]      0.70
(2 days 00:00:00, 3 days 00:00:00]      0.22
(3 days 00:00:00, 2335 days 00:00:00]   0.05
Name: treTime-pubTime, dtype: float64

게시 후
당일에 인기동영상이 되는 경우가 3%
2일째에 인기동영상이 되는 경우가 90%
3일 이내에 인기동영상이 되는 경우가 95%입니다. 게시 후 3일 이내에 인기동영상이 되지 못하면, 인기 동영상이 되기 힘들다고 보입니다.

In [48]:
df.loc[df["treTime-pubTime"] > timedelta(days = 1000)].sort_values(by = "treTime-pubTime", ascending = False) 
Out[48]:
video_id trending_date title channel_title category category_id publish_time tags views likes ... comment_count description tag_count likes/views dislikes/views comment_count/views dislikes/likes title_length description_length treTime-pubTime
16123 _j7LqDL6BMc 2018-02-19 손성제 - Goodbye TeamKabeto Music 10 2011-09-29 mv|"music"|"goodbye"|"손성제" 56227 690 ... 66 NaN 4 0.01 0.00 0.00 0.02 13 0 2336 days
6684 d8HKnWncwks 2017-12-22 [141005] Jonghyun 종현 ♡♡ Haru 하루 PP2pinkyTOP89 People & Blogs 22 2014-10-05 SHINee|"샤이니" 79566 1218 ... 50 NaN 2 0.02 0.00 0.00 0.01 31 0 1175 days
154 qAcW06XhYDQ 2017-11-14 요즘 엔진 진동 Minook Kim People & Blogs 22 2014-09-21 [none] 16273 0 ... 1 엔진진동 촬영한 것 0 0.00 0.00 0.00 0.00 8 10 1151 days
15823 5HlZEq31JY8 2018-02-17 TYPICAL CONVERSATION WITH OUR SWEET SAMOYED Fluffy Ice Pets & Animals 15 2015-04-16 Cute|"Animals"|"Dog"|"Funny"|"Happy"|"Sweet"|"... 8220 107 ... 2 Our sweet Samoyed Ice has to put up with TWO w... 30 0.01 0.00 0.00 0.02 43 61 1039 days

4 rows × 21 columns

게시 후 1,000일이 지나 인기동영상이 된 사례들입니다.
16123은 2018년 2월 18일 방영된 효리네민박에서 언급되어 하루 지난 19일에 인기동영상이 된 걸로 생각합니다.
6684는 2017년 12월 17일 샤이니 종현 사망 사건 이후 22일에 인기동영상이 된 것 같습니다.
154와 15823은 인기동영상이 된 이유를 모르겠습니다.

2.11. category 별 동영상의 수

In [49]:
print("전체 데이터 {}\ncategory 개수 {}\n".format(len(df),len(df["category"].unique())))
for i in range(len(df["category"].value_counts())):
    print("{:23} {:4} {:.2f}".format(df["category"].value_counts().index[i],
                            df["category"].value_counts().values[i],
                            df["category"].value_counts(normalize = True).values[i]))
전체 데이터 15876개
category 개수 17개

Entertainment           4073 0.26
News & Politics         3728 0.23
People & Blogs          3379 0.21
Film & Animation         870 0.05
Comedy                   829 0.05
Music                    797 0.05
Gaming                   598 0.04
Sports                   470 0.03
Pets & Animals           304 0.02
Howto & Style            251 0.02
Education                232 0.01
Nonprofits & Activism    119 0.01
Shows                     73 0.00
Autos & Vehicles          65 0.00
Science & Technology      47 0.00
Travel & Events           40 0.00
Trailers                   1 0.00

category 별 인기동영상의 개수를 확인해본 결과입니다.
1위는 Entertainment로 4073개 26%
2위는 News & Politics로 3728개 23%
3위는 People & Blogs로 3379개 21%

3개의 카테고리가 70%를 차지하네요.
위의 3가지 카테고리에 속한 카테고리를 사람들이 많이 조회한다고 보입니다.

In [50]:
for cate in df["category"].value_counts().index[0:3]:
    print(cate, df["treTime-pubTime"].loc[df["category"] == cate].mean())
Entertainment 2 days 08:52:05.362140
News & Politics 2 days 06:24:20.085836
People & Blogs 3 days 16:27:24.983722

Entertainment와 News & Politics는 평균 2일 째에, People & Blogs는 평균 3일 째에 인기동영상이 되네요.

2.12. 채널 별 상황은 어떠한가

In [51]:
print("전체 데이터 개수 {} 포함된 채널의 수 {}".format(len(df), len(df["channel_title"].unique())))   
전체 데이터 개수 15876 포함된 채널의 수 3986
In [52]:
df_pivot=pd.pivot_table(df, index = ["channel_title"], 
                    values = ["views"],
                    aggfunc = ["count", "mean"])
In [53]:
df_pivot["count"]["views"].value_counts().plot(kind = "pie",title = "인기동영상 개수 별 채널 수",label = " ",figsize = (6, 6));

해당 기간 동안 인기동영상 개수 별 채널의 수입니다. 인기 동영상을 1개 보유한 채널이 약 50%이고, 3개 이내가 약 75%입니다.

In [54]:
df["category"].loc[df["channel_title"].isin(df_pivot[df_pivot["count"]["views"] == 1].index)].value_counts()
Out[54]:
People & Blogs           813
Entertainment            493
Music                    221
Film & Animation         133
News & Politics          131
Gaming                   116
Sports                    78
Comedy                    62
Howto & Style             43
Education                 22
Travel & Events           21
Autos & Vehicles          20
Science & Technology      18
Pets & Animals            13
Nonprofits & Activism      9
Trailers                   1
Shows                      1
Name: category, dtype: int64

인기동영상 개수가 1개인 채널의 카테고리 현황입니다.
People & Blogs ,Entertainment의 비중이 각각 1,2위입니다.
News & Politics 카테고리는 생각보다 작은 5위이네요.

In [55]:
df["category"].loc[df["channel_title"].isin(df_pivot[(df_pivot["count"]["views"] >= 2) & (df_pivot["count"]["views"] < 4)].index)].value_counts()
Out[55]:
People & Blogs           649
Entertainment            475
Music                    181
News & Politics          168
Film & Animation         152
Sports                   105
Gaming                    99
Howto & Style             58
Comedy                    46
Education                 42
Pets & Animals            21
Science & Technology      20
Nonprofits & Activism     17
Autos & Vehicles          11
Travel & Events            4
Name: category, dtype: int64

인기동영상 개수가 2~3개인 채널의 카테고리 현황입니다.
마찬가지로 People & Blogs ,Entertainment의 비중이 각각 1,2위입니다.
News & Politics 카테고리는 한단계 상승하여 4위이네요.

In [56]:
df["category"].loc[df["channel_title"].isin(df_pivot[df_pivot["count"]["views"] >= 4].index)].value_counts()
Out[56]:
News & Politics          3429
Entertainment            3105
People & Blogs           1917
Comedy                    721
Film & Animation          585
Music                     395
Gaming                    383
Sports                    287
Pets & Animals            270
Education                 168
Howto & Style             150
Nonprofits & Activism      93
Shows                      72
Autos & Vehicles           34
Travel & Events            15
Science & Technology        9
Name: category, dtype: int64

인기동영상 개수가 4개 이상인 채널의 카테고리 현황입니다.
이전의 결과들과 다르게 News & Politics 카테고리가 가장 많은 비중을 차지합니다.
그 다음은 Entertainment가 2위이고, People & Blogs가 3번째로 많은 비중을 차지합니다.

인기동영상 개수별 채널 현황 및 카테고리를 살펴보니 인기동영상을 3개 이내로 보유한 채널이 전체의 75%였고,
4번 이상 보유한 채널들의 동영상들을 살펴봤을 때, News & Politics 카테고리가 가장 많은 비중을 차지했습니다.

Entertainment 카테고리의 동영상을 다루는 채널들은 모든 범위에서 인기동영상에 많이 선정된다고 보이고,
News & Politics 카테고리의 동영상을 다루는 채널들이 다른 카테고리 채널들에 비해, 인기동영상에 많이 선정된다고 보입니다.

3. 조회수와 연관이 있는 항목들은 무엇인가

In [57]:
plt.figure(figsize = (20, 20))

for i in range(1, len(df.describe().columns) - 1 ):
    plt.subplot(4, 4, i)
    plt.title("views와 {}의 관계".format(df.describe().columns[i]))
    plt.xlabel("views")
    plt.ylabel(df.describe().columns[i])
    plt.scatter(x = df["views"], y = df[df.describe().columns[i]])
    plt.grid()
/Users/byeongjoon/anaconda3/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py:211: RuntimeWarning: Glyph 8722 missing from current font.
  font.set_text(s, 0.0, flags=flags)
/Users/byeongjoon/anaconda3/lib/python3.7/site-packages/matplotlib/backends/backend_agg.py:180: RuntimeWarning: Glyph 8722 missing from current font.
  font.set_text(s, 0, flags=flags)

조회수에 영향을 주는 항목들이 무엇인지 알아보기 위한 산점도입니다.
소수의 조회수 상위 항목들에 의해 그래프의 분포가 영향을 받는 것 같습니다.
조회수 상위 데이터(조회수 백만 이상 데이터 570개)를 제외하고 그래프를 그려보겠습니다.

In [58]:
plt.figure(figsize = (20, 20))

for i in range(1, len(df.describe().columns) - 1 ):
    plt.subplot(4, 4, i)
    plt.title("views와 {}의 관계".format(df.describe().columns[i]))
    plt.xlabel("views")
    plt.ylabel(df.describe().columns[i])
    plt.scatter(x = df["views"].loc[df["views"] <= 1000000], y = df[df.describe().columns[i]].loc[df["views"] <= 1000000])
    plt.grid()

특별한 패턴을 보이는 항목은 없어보입니다.

In [59]:
plt.figure(figsize = (15,15))
sns.heatmap(data = df.loc[df["views"] <= 1000000].corr(method="pearson"), annot = True, fmt = ".2f", linewidths = .5, cmap = "Blues");

조회수 상위 데이터를 제외한 상관관계입니다.
likes, dislikes, comment_count가 각각 0.45, 0.57, 0.24의 상관관계를 가진다고 나타났습니다.
다만 좋아요와 싫어요를 누르거나 댓글을 남기려면 먼저 동영상을 조회해야하기 때문에,
조회수가 likes, dislikes, comment_count에 영향을 준다고 해석해야 합니다.

tag_count, title_length, description_length가 views와 상관관계가 있지 않을까 생각했었는데, 관계가 없는 것으로 나타났습니다.

4. 결론

지금까지 인기 동영상들의 전반적인 상황을 살펴봤습니다.
분석의 목적인 "채널의 방향을 어떻게 잡아야 인기 동영상에 갈 수 있나"를 고려했을 때, 시사점은 다음과 같습니다.

시사점

  1. 인기동영상에 게시된 동영상들은 조회수 20만 이하의 영상이 대부분이고, 조회수가 가장 적은 영상은 2,050이다.
  2. 3일 이내에 인기동영상이 되지 못하면, 인기 동영상이 되기 힘들다고 보인다.
  3. 인기 동영상의 70%는 Entertainment, News & Politics, People & Blogs의 카테고리에 속한다.
  4. Entertainment 카테고리 동영상을 다루는 채널들은, 채널 별 인기동영상의 개수를 기준으로 보면, 모든 범위에서 많은 비중을 차지한다.
  5. 참고: 좋아요와 댓글수를 늘릴 때 상품이 큰 영향을 준다.

전략

  1. 채널은 Entertainment, News & Politics, People & Blogs의 3개 카테고리의 동영상을 다뤄야하며, 그 중에서 Entertainment 카테고리가 가장 유리함.
  2. 태그 개수는 조회수와 크게 상관이 없는 것으로 보이나, 대부분의 인기동영상은 10개 정도 사용함.
  3. 제목의 길이는 조회수와 크게 상관이 없는 것으로 보이나, 대부분의 인기동영상은 10~60자 정도의 제목을 사용함.
  4. 설명의 길이는 조회수와 크게 상관이 없는 것으로 보이나, 대부분의 인기동영상은 500자 이내의 설명을 사용함.
  5. 3일 이내로 조회수 최소 2,000을 넘기지 못했다면 다음 동영상을 준비해야함.
  6. 돈이 된다면 광고를 하더라도 인기 동영상에 선정 될 수 있음.
반응형