top of page
learn_data_science.jpg

Data Scientist Program

 

Free Online Data Science Training for Complete Beginners.
 


No prior coding knowledge required!

Analytics of Guest Stars in The Office

The Office! What started as a British documentary series about office culture in 2001 has since spawned ten other variants across the world, including an Israeli version (2010-13), a Hindi version (2019-), and even a French Canadian variant (2006-2007). Of all these iterations (including the original), the American series has been the longest-running, spanning 201 episodes over nine seasons.


Kaggle is where the data was extracted.


The dataset contains information on a variety of characteristics of each episode. In detail, these are:

  • episode_number: Canonical episode number.

  • season: Season in which the episode appeared.

  • episode_title: Title of the episode.

  • description: Description of the episode.

  • ratings: Average IMDB rating.

  • votes: Number of votes.

  • viewership: Number of US viewers in millions.

  • duration: Duration in the number of minutes.

  • release_date: Airdate.

  • guest_stars: Guest stars in the episode (if any).

  • director: Director of the episode.

  • writers: Writers of the episode.

The first step is to import the required libraries and load the data into pandas data frame as show below. Plotly was the main library used to generative interactive visual insights.


import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import plotly.express as px
plt.rcParams['figure.figsize']=[11,7]
plt.style.use("ggplot")

Data was imported using pandas and the date column set to be datetime.

# Here we imported the data, and set the Date column to be: datetime not object 
office_df=pd.read_csv('the_office_series.csv',parse_dates=['Date'])
df=office_df.copy()

The function below used to generate hind sights on the data before making further analysis. For instance, we ca observe that GuestStars is the only variable with both null and non null values. In this case the are 29 non null data points.

df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 188 entries, 0 to 187
Data columns (total 12 columns):
 #   Column        Non-Null Count  Dtype         
---  ------        --------------  -----         
 0   Unnamed: 0    188 non-null    int64         
 1   Season        188 non-null    int64         
 2   EpisodeTitle  188 non-null    object        
 3   About         188 non-null    object        
 4   Ratings       188 non-null    float64       
 5   Votes         188 non-null    int64         
 6   Viewership    188 non-null    float64       
 7   Duration      188 non-null    int64         
 8   Date          188 non-null    datetime64[ns]
 9   GuestStars    29 non-null     object        
 10  Director      188 non-null    object        
 11  Writers       188 non-null    object        
dtypes: datetime64[ns](1), float64(2), int64(4), object(5)
memory usage: 17.8+ KB

The function below shows that there are 159 null data points on GuestStars variable.

# Check null values in a dataset
df.isna().sum()
Unnamed: 0        0
Season            0
EpisodeTitle      0
About             0
Ratings           0
Votes             0
Viewership        0
Duration          0
Date              0
GuestStars      159
Director          0
Writers           0
dtype: int64

Based on insights of non values, another variable created to slice the that so that we have a variable contains data with guest stars and the another without guest stars.


# create 'has_guests' column that contains boolean values for whether there is a guest star or not
guest=df.GuestStars.isnull()
has_guest=[False if i else True for i in guest]
has_guest
df['has_guests']=has_guest
df.head()

# change the name of the first column to be episode_number
df.rename(columns={'Unnamed: 0':'episode_number'},inplace=True)
df.head()




Exploratory data analysis


1. Viewership vs Time.


To see the relationship between viewership and ratings and guest appearance along with the series, we need to separate the data with colors and size as there are at most 3 dimensions we can draw.


Create colors of red if the scaled rating is less than 0.25, orange if less than 0.5, light green if less than 0.75, and dark green if more than 0.75.


Create different sizes of dots; the size of 250 if the episode contains guest star and 25 if does not.



 # Below is the interactive chart which shows viewership across the years
fig = px.scatter(df, x="Date", y="Viewership",title="Scatter plot displays relationship between  Years and viewership",
                 color="Coloring", size='Size' )

fig.show()


One outlier (episode) with the scaled rating of more than 7.5 and that contains guest stars has 22.5 million viewers. What is that episode?

df[df['viewership'] == max(df['viewership'])]
episode_number           77
season                    5
episodetitle  Stress Relief
ratings                 9.7
votes                  8170
viewership            22.91
duration                 60
date          2009-02-01 00:00:00
gueststars    Cloris Leachman, Jack Black, Jessica Alba
director      Jeffrey Blitz
writers       Paul Lieberstein
scaled_ratings       0.96875
has_guest               True

The scatter plot below show the association between viewership and episode number.


fig = plt.figure()
# plotting using scatter plots two dataframes, the first one that contains data
# with existence of guest stars, The other one for data with no guest stars with 
# different markers

plt.scatter(x=non_guests_df.episode_number,y=non_guests_df.Viewership,
            c=non_guests_df.Coloring,
            s=non_guests_df.Size)

plt.scatter(x=guests_df.episode_number,y=guests_df.Viewership,
           c=guests_df.Coloring,
            s=guests_df.Size,marker='*')


plt.xlabel('Episode Number')
plt.ylabel('Viewership (Millions)')
plt.title('Popularity, Quality, and Guest Appearances on the Office')
plt.show()

We can observe the 75 episode number with viewership above 22.5 million as an outlier.


How many episodes in each season


# In this case we count the number of episodes in each season
e=df.groupby(('Season'),as_index=False).count()
e=e[['Season','episode_number']]
e.rename(columns={'episode_number':'NoOfEpisodes'},inplace=True)
fig = px.bar(e, x="Season", y="NoOfEpisodes",title="Season and Number of episods bar chart")
fig.show()

There are only 6 episodes in Season 1 and 14 in Season 2.


Relationship between season and rating


# Grouping the data by season and calculate the average of the ratings for each season
rating=df.groupby('Season')['Ratings'].mean()

fig = px.line( rating,
              title = 'Season Vs Rating line graph')

fig.show()

The line graph above shows that season 3 has the most rating on average whilist season 8 has the least rating.


As we know there is an outlier in the `viewership` column that has guest stars. Even an outlier contains, the mean values are almost the same and viewership does not seem to increase if guest stars are present.



0 comments

Recent Posts

See All
bottom of page