#티스토리 업로드를 위하여 화면 크기 조절
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
상황¶
가정¶
- 한국에서 유튜브 채널을 시작하려함
- 채널의 방향을 어떻게 잡아야 인기 동영상에 갈 수 있을지 알아보고자함
궁금한 것¶
- 인기 동영상의 기준은 무엇인가
- 현재 인기동영상의 전반적인 상황은 어떠한가
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. 채널 별 상황은 어떠한가 - 조회수와 연관이 있는 항목들은 무엇인가
- 결론
전처리¶
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
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" 을 명시해주면 됩니다.
data.info()
전체 데이터는 34,567개 column은 16개 있습니다.
description은 결측치가 있는 행이 있네요.
description에 결측치가 있는 사례 중 하나로, descriptipn이 없는지 유튜브에서 확인해봤습니다.
실제로 description에 내용이 없습니다.
video_id¶
df = data[:]
for col in ["thumbnail_link", "comments_disabled", "ratings_disabled", "video_error_or_removed"]:#해당 분석에서 사용하지 않아 미리 삭제
del df[col]
video_id가 동영상의 고유값인지 확인해보겠습니다.
df["video_id"].duplicated().value_counts()
데이터의 절반 정도가 중복값이네요. 확인해보겠습니다.
df = df.drop_duplicates(["video_id"])[:]
동영상이 여러 일자에 인기동영상이 될 경우, 일자별로 데이터가 생겼습니다.
이번 분석에서는, 해당 기간동안 처음으로 인기동영상이 되었을 때의 데이터로만 분석을 진행하겠습니다.
중복된 video_id를 제거.
df["video_id"].duplicated().value_counts()
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
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))
df.isnull().sum()
생성한 category 열에 결측치가 있는 사례가 있습니다.
df["category_id"].loc[df["category"].isnull() == True].value_counts()
확인해보니 category_id가 29번인 경우 매칭이 안됐네요.
json파일을 확인해보니 29번이 없습니다.
그래서 category_id가 29번인 영상을 직접 찾아 확인해보니 카테고리가 "비영리/사회운동"이네요.
category의 결측치를 "Nonprofits & Activism" 으로 채워줍니다.
df["category"].loc[df["category"].isnull() == True] = "Nonprofits & Activism"
trending_date & publish_time¶
분석에 사용하기 위하여 trending_date & publish_time를 datetime 형식으로 바꿔줍니다.
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¶
df["tags"][df["video_id"] == "C-bLqIftDY4"].values
tags는 meta에 있는 데이터들이네요.
다만 이미지 하단에 있는 "40대","여성","가정사","조카양육" 의 태그들이, 제공된 데이터에는 포함되지 않는 걸로 보았을 때, 4개의 태그는 제공된 데이터가 수집된 시점 이후에 추가된게 아닐까 싶습니다.
영상 설명에는 태그가 3개까지 표시되네요.
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)¶
조회수 대비 좋아요 비율
조회수 대비 싫어요 비율
조회수 대비 댓글수 비율
좋아요 대비 싫어요 비율
을 알아보기 위하여 변수 생성
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
df.isnull().sum()
dislikes/likes 에 결측값이 있는데, likes의 값 중에 0이 있어서 그렇습니다.
결측값을 0으로 대체합니다.
df["dislikes/likes"].loc[df["dislikes/likes"].isnull() == True] = 0
title & title_length¶
df["title_length"] = df["title"].apply(lambda x : len(str(x)) if pd.isnull(x) == False else 0 )
title의 길이로 title_lenght 열을 생성했습니다.
description & description_length¶
df["description_length"] = df["description"].apply(lambda x : len(str(x)) if pd.isnull(x) == False else 0 )
description의 길이로 description_length 열을 생성했습니다.
treTime-pubTime¶
df["treTime-pubTime"] = df["trending_date"] - df["publish_time"] + timedelta(days = 1)
동영상 게시 후 얼마 후에 인기동영상에 갔는지를 의미하는 treTime-pubTime입니다.
df.info()
여기까지가 전처리 과정입니다.
분석¶
1. 인기동영상의 기준은 무엇인가¶
2. 현재 인기 동영상의 전반적인 상황은 어떠한가¶
print("분석에 사용한 데이터는 {}개의 변수를 가진 인기동영상 데이터 {}개입니다.".format(len(df.columns), format(len(df),",")))
df.describe()
likes, dislikes, comment_count, tag_count, description_length 다섯가지 항목은 최소값 항목을 살펴보니 0인 사례들이 있습니다.
각 항목 별로 확인해보았으나 데이터에 오류는 없었습니다.
해당 항목들은 인기동영상이 되는 것에 영향을 주지 않거나, 영향이 작은 것으로 판단할 수 있습니다.
위의 다섯가지 항목에서 파생한 likes/views, dislikes/views, comment_count/views, dislikes/likes 항목들도 마찬가지로 영향이 크지 않을 것입니다.
views를 중점적으로 탐색하고, 나머지 항목들은 간단하게 살펴보겠습니다.
*title_length를 제외한 나머지 항목은 평균값과 최대값의 차이가 크기 때문에, 극단적으로 높은 값들을 제외하면 실제 평균은 다소 낮아질 가능성이 있습니다.
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()
수치형 변수의 분포는 전체적으로 오른쪽으로 꼬리가 긴 형태입니다.
극단적인 케이스의 영향을 많이 받았다고 할 수 있습니다.
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¶
summary_numeric("views")
views는 수치형 변수 중 최대값의 단위가 가장 큰 항목입니다.
인기 동영상들은 평균 조회수 243,674건이네요.
최대 조회수가 억 단위인걸로 봐서 극단값들의 영향이 매우 클 것 같습니다.
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "publish_time", "trending_date"]].sort_values(by = ["views"], ascending = [False]).head(3)
조회수 상위 3개를 살펴보겠습니다.
1위는 방탄소년단의 뮤직비디오로 게시된지 2일 후 조회수 62,796,390에 도달했네요.
2위는 연말에 유튜브에서 게시하는 영상 "The Shape of 2017"고 게시 2일 후 조회수 52,611,730입니다.
3위는 트와이스의 뮤직비디오로 게시 5일 후 조회수 38,840,787입니다.
상위에 해당하는 데이터는 이 정도로 살펴보고, 극단치들을 제외하여 데이터를 살펴보겠습니다.
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))
조회수 100만 이상의 회사 3.59%를 제외하고 그래프를 확인해보겠습니다.
print("조회수 100만 이하 데이터의 평균: {:.2f}".format(df["views"].loc[df["views"] <= 1000000].mean()))
plt.hist(df["views"].loc[df["views"] <= 1000000]);
조회수 100만 이상의 데이터 570건을 제외하니,
평균 조회수는 125,664건으로 나타나고,
조회수 0~20만 이하에 대부분의 영상이 있는 것을 확인할 수 있었습니다.
views에서 한가지 의외인 점은, 최소 조회수를 봤을 때 2,050의 조회수로도 인기 동영상이 될 수 있다는 것 입니다.
좀 더 자세히 살펴보겠습니다.
df.loc[df["views"] <= 3000,["video_id", "title", "publish_time", "trending_date", "category", "views", "likes", "comment_count", "tag_count"]].sort_values(by = "views")
조회수 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 인데..
유튜브에서 발표한 인기영상의 기준을 봤을 때,
조회수, 온도, 업로드기간에서 크게 강점이 없는 것 같은데, 그러면 유입소스에서 강점이 있는걸까요?
*혹시 영상 내 광고 유무가 영향을 줄까하여 해당 영상을 확인해봤지만, 광고는 없었습니다.
분석시점 2020년 02월 25일 기준 해당 영상의 수치입니다.
컨텐츠는 앱 광고영상이네요.
인기영상에 간 시점에서 2년이 지났는데 조회수 767, 좋아요 1이 증가했습니다.
전체 조회수의 약 70% 동영상 게시 2일 동안 발생했다는 이야기인데 구독자도 1인 상황이네요.
유튜브 알고리즘이 정상적으로 작동했다는 가정하에, 가능성은 두 가지입니다.
첫번째: 해당 영상을 광고로 사용(궁금증: 광고에서 영상을 봐도 조회수가 오르는가?)
두번째: 봇을 사용하여 해당 영상의 조회수를 조작(가능성이 낮다고 생각합니다.)
첫번째 경우에 해당될 것 같습니다.
만약 광고 영상으로 조회수가 오르는 것이 사실이라면,
저는 인기 동영상에 게시되는게 목표이기 때문에, 동영상 게시 후 약 3일 동안 광고하여 조회수 2,000을 넘어가게끔 하겠습니다.
2.2. likes¶
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "tag_count", "description_length"]].sort_values(by = ["likes"], ascending = [False]).head(3)
간략하게 살펴보면
likes는 평균 7,552, 범위는 0 ~ 4,470,923
상위 3개의 동영상을 살펴보니 모두 뮤직비디오이고, ibighit 채널에서 게시한 동영상이네요.
29969 항목은 조회수 1위에 해당하는 동영상입니다.
2.3. dislikes¶
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "comment_count", "tag_count", "description_length"]].sort_values(by = ["dislikes"], ascending = [False]).head(3)
dislikes는 평균 278, 범위는 0 ~ 884,965
상위 3개의 동영상을 살펴보니, 모두 조회수 1~3위에 해당하는 동영상들입니다.
2.4. comment_count¶
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)
comment_count는 평균 1,250, 범위는 0 ~ 905,925
상위 2개의 항목은, 조회수 1~3위에 해당하는 동영상이네요.
2.5. tag_count¶
plt.hist(df["tag_count"],bins = 10);
tag_count는 평균 16, 범위는 0 ~ 152
태그의 개수가 10개 이하인 동영상이 약 10,000개 정도 입니다.
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)
상위 10개까지 살펴보니, 1위를 제외하고 2~10위는 모두 FeelSoGood 채널에서 게시한 동영상입니다.
해당 채널은 태그의 개수를 많이 사용하는 경향이 있는 것 같습니다.
2.6. Ratio (likes/views, dislikes/views, comment_count/views, dislikes/likes)¶
df[["likes/views", "dislikes/views", "comment_count/views", "dislikes/likes"]].describe()
조회수 대비 좋아요는 평균은 2%이고 최대 36%입니다.
조회수 대비 싫어요는 대부분 0%로 측정되고 최대 4%입니다.
조회수 대비 댓글수는 대부분 0%인데 최대가 52%네요. 특이값이 있는 것 같습니다.
좋아요 대비 싫어요는 평균 11%인데 최대가 976%입니다. 이 항목도 특이값이 있는 것 같습니다.
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)
조회수 대비 좋아요를 기준으로 하는 상위 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위에 해당하는 영상이 비공개 처리되어 정확하게 확인할 수는 없네요.
좋아요와 댓글수를 늘리는 것에는 상품이 큰 영향을 주는 것 같습니다.
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)
조회수 대비 싫어요를 기준으로 하는 상위 5개의 항목입니다.
갓건배 채널의 동영상이 3개가 있습니다.
찾아보니 욕설 등의 논란으로 유튜브에서 여러 번 영구정지 처분을 받았고 그때마다 새로운 계정을 만들었다고 하네요.
df[["video_id", "title", "channel_title", "category", "views", "likes", "dislikes", "dislikes/likes", "trending_date"]].sort_values(by = ["dislikes/likes"], ascending = [False]).head(5)
좋아요 대비 싫어요를 기준으로 하는 상위 5개의 항목입니다.
대부분 당시 사회 이슈와 관련되어 있고, 논란이 있었던 소재들인 것으로 보입니다.
2.7. title_length¶
plt.hist(df["title_length"],bins = 10)
plt.axvline(x = 42, color = "r", linestyle = "-", linewidth = 1)
title_length는 평균 42, 범위는 2 ~ 100입니다.
항목들 중 그나마 극단적으로 치우치지 않은 분포를 보입니다.
길이가 10~60자 이내인 동영상이 많은 비중을 차지하고 있습니다.
df.loc[df["title_length"] <= 2]
제목의 길이가 2인 인기동영상 4개입니다.
특이한 점은 likes/views 평균이 0.02인 것을 고려했을 때, 4개의 동영상 모두 likes/views의 비율이 높은 편인 것입니다.
17806 안재효 채널은 아이돌그룹 블락비의 멤버의 채널이라 likes/views가 높은 것으로 추정됩니다.
나머지 3개의 동영상은 현재 비공개 처리되어 확인할 수 없었습니다.
2.8. description_length¶
plt.hist(df["description_length"],bins = 10);
description_length는 평균 298, 범위는 0 ~ 5235
길이가 500 이하인 데이터가 대부분입니다.
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)
1~3위는 모두 lamuqe 채널에서 게시한 동영상으로, 해당 채널은 description을 길게 작성하는 경향이 있는 것 같습니다.
또한 다른 속성들의 상위 동영상들과 달리, description_length 상위에 있는 동영상들은 제품 혹은 서비스를 리뷰하는 동영상이 많은 비중을 차지하고 있습니다.
2.9. 하루 평균 인기 동영상의 개수¶
plt.figure(figsize = (15,10));
data["trending_date"].value_counts().plot(label = "중복영상을 포함한 하루 인기동영상의 개수")
df["trending_date"].value_counts().plot(label = "중복영상을 제외한 하루 인기동영상의 개수")
plt.legend(prop = {"size":17});
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개 정도의 영상이 인기동영상에 포함되고, 102~200의 범위를 가지네요.
한편 중복포함과 중복제외 인기동영상의 개수를 확인해보니,
하루 평균 약 100개 정도의 다른 일자의 인기동영상이 포함되어있습니다.
2.10. 게시되고 어느 정도 지나서 인기 영상에 갔는가¶
df["treTime-pubTime"].describe()
인기동영상들은 동영상을 평균적으로 게시하고 다음 날 인기동영상이 되었습니다. 빠르면 당일에 인기동영상이 되네요.
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)
게시 후
당일에 인기동영상이 되는 경우가 3%
2일째에 인기동영상이 되는 경우가 90%
3일 이내에 인기동영상이 되는 경우가 95%입니다.
게시 후 3일 이내에 인기동영상이 되지 못하면, 인기 동영상이 되기 힘들다고 보입니다.
df.loc[df["treTime-pubTime"] > timedelta(days = 1000)].sort_values(by = "treTime-pubTime", ascending = False)
게시 후 1,000일이 지나 인기동영상이 된 사례들입니다.
16123은 2018년 2월 18일 방영된 효리네민박에서 언급되어 하루 지난 19일에 인기동영상이 된 걸로 생각합니다.
6684는 2017년 12월 17일 샤이니 종현 사망 사건 이후 22일에 인기동영상이 된 것 같습니다.
154와 15823은 인기동영상이 된 이유를 모르겠습니다.
2.11. category 별 동영상의 수¶
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]))
category 별 인기동영상의 개수를 확인해본 결과입니다.
1위는 Entertainment로 4073개 26%
2위는 News & Politics로 3728개 23%
3위는 People & Blogs로 3379개 21%
3개의 카테고리가 70%를 차지하네요.
위의 3가지 카테고리에 속한 카테고리를 사람들이 많이 조회한다고 보입니다.
for cate in df["category"].value_counts().index[0:3]:
print(cate, df["treTime-pubTime"].loc[df["category"] == cate].mean())
Entertainment와 News & Politics는 평균 2일 째에, People & Blogs는 평균 3일 째에 인기동영상이 되네요.
2.12. 채널 별 상황은 어떠한가¶
print("전체 데이터 개수 {} 포함된 채널의 수 {}".format(len(df), len(df["channel_title"].unique())))
df_pivot=pd.pivot_table(df, index = ["channel_title"],
values = ["views"],
aggfunc = ["count", "mean"])
df_pivot["count"]["views"].value_counts().plot(kind = "pie",title = "인기동영상 개수 별 채널 수",label = " ",figsize = (6, 6));
해당 기간 동안 인기동영상 개수 별 채널의 수입니다. 인기 동영상을 1개 보유한 채널이 약 50%이고, 3개 이내가 약 75%입니다.
df["category"].loc[df["channel_title"].isin(df_pivot[df_pivot["count"]["views"] == 1].index)].value_counts()
인기동영상 개수가 1개인 채널의 카테고리 현황입니다.
People & Blogs ,Entertainment의 비중이 각각 1,2위입니다.
News & Politics 카테고리는 생각보다 작은 5위이네요.
df["category"].loc[df["channel_title"].isin(df_pivot[(df_pivot["count"]["views"] >= 2) & (df_pivot["count"]["views"] < 4)].index)].value_counts()
인기동영상 개수가 2~3개인 채널의 카테고리 현황입니다.
마찬가지로 People & Blogs ,Entertainment의 비중이 각각 1,2위입니다.
News & Politics 카테고리는 한단계 상승하여 4위이네요.
df["category"].loc[df["channel_title"].isin(df_pivot[df_pivot["count"]["views"] >= 4].index)].value_counts()
인기동영상 개수가 4개 이상인 채널의 카테고리 현황입니다.
이전의 결과들과 다르게 News & Politics 카테고리가 가장 많은 비중을 차지합니다.
그 다음은 Entertainment가 2위이고, People & Blogs가 3번째로 많은 비중을 차지합니다.
인기동영상 개수별 채널 현황 및 카테고리를 살펴보니 인기동영상을 3개 이내로 보유한 채널이 전체의 75%였고,
4번 이상 보유한 채널들의 동영상들을 살펴봤을 때, News & Politics 카테고리가 가장 많은 비중을 차지했습니다.
Entertainment 카테고리의 동영상을 다루는 채널들은 모든 범위에서 인기동영상에 많이 선정된다고 보이고,
News & Politics 카테고리의 동영상을 다루는 채널들이 다른 카테고리 채널들에 비해, 인기동영상에 많이 선정된다고 보입니다.
3. 조회수와 연관이 있는 항목들은 무엇인가¶
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()
조회수에 영향을 주는 항목들이 무엇인지 알아보기 위한 산점도입니다.
소수의 조회수 상위 항목들에 의해 그래프의 분포가 영향을 받는 것 같습니다.
조회수 상위 데이터(조회수 백만 이상 데이터 570개)를 제외하고 그래프를 그려보겠습니다.
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()
특별한 패턴을 보이는 항목은 없어보입니다.
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. 결론¶
지금까지 인기 동영상들의 전반적인 상황을 살펴봤습니다.
분석의 목적인 "채널의 방향을 어떻게 잡아야 인기 동영상에 갈 수 있나"를 고려했을 때, 시사점은 다음과 같습니다.
시사점
- 인기동영상에 게시된 동영상들은 조회수 20만 이하의 영상이 대부분이고, 조회수가 가장 적은 영상은 2,050이다.
- 3일 이내에 인기동영상이 되지 못하면, 인기 동영상이 되기 힘들다고 보인다.
- 인기 동영상의 70%는 Entertainment, News & Politics, People & Blogs의 카테고리에 속한다.
- Entertainment 카테고리 동영상을 다루는 채널들은, 채널 별 인기동영상의 개수를 기준으로 보면, 모든 범위에서 많은 비중을 차지한다.
- 참고: 좋아요와 댓글수를 늘릴 때 상품이 큰 영향을 준다.
전략
- 채널은 Entertainment, News & Politics, People & Blogs의 3개 카테고리의 동영상을 다뤄야하며, 그 중에서 Entertainment 카테고리가 가장 유리함.
- 태그 개수는 조회수와 크게 상관이 없는 것으로 보이나, 대부분의 인기동영상은 10개 정도 사용함.
- 제목의 길이는 조회수와 크게 상관이 없는 것으로 보이나, 대부분의 인기동영상은 10~60자 정도의 제목을 사용함.
- 설명의 길이는 조회수와 크게 상관이 없는 것으로 보이나, 대부분의 인기동영상은 500자 이내의 설명을 사용함.
- 3일 이내로 조회수 최소 2,000을 넘기지 못했다면 다음 동영상을 준비해야함.
- 돈이 된다면 광고를 하더라도 인기 동영상에 선정 될 수 있음.
'데이터 분석' 카테고리의 다른 글
Matrix Factorization 알고리즘을 사용한 상품 추천 (0) | 2021.01.13 |
---|---|
카톡 분석 : 파이썬 (0) | 2019.11.28 |
알바몬 분석: 알바몬 경기의 공고수는 몇개나 될까 (0) | 2019.08.18 |
공공데이터 활용 - 교통사고 통계 리포트 (0) | 2019.07.18 |