Una plataforma de streaming para el hogar, con presencia en todo el mundo, necesita impulsar su rendimiento utilizando datos de tendencias en el sector de manera estratégica. Como científico de datos especializado en la industria del entretenimiento, has sido convocado para analizar estos datos y ofrecer insights que guíen sus decisiones y respondan a las siguientes preguntas clave:
Preguntas:
¿Cual es la evolución del rating por tipo de contenido?
¿Cual es el rating promedio por género?
¿Cuáles son los géneros que proporcionan mayor ROI?
¿Cuáles son los países con mayor producción de contenido?
¿Cual es tu recomendación para el cliente?
1. Configuración del Ambiente
Code
import warningsimport numpy as npimport pandas as pdpd.set_option('display.max_rows', None)pd.set_option('display.max_columns', None)pd.set_option('display.float_format', '{:.2f}'.format)import matplotlib.pyplot as pltimport matplotlib.ticker as tickerimport seaborn as snsimport dask.dataframe as ddfrom matplotlib.ticker import FuncFormatter, MaxNLocatorglobal df_title_basics,df_title_ratings,df_tmdb
2. Obtención, Tratamiento y Análisis Exploratório (EDA)
C:\Users\Gabriel Chavez\AppData\Local\Programs\Python\Python311\Lib\site-packages\dask\dataframe\io\csv.py:640: UserWarning:
Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
C:\Users\Gabriel Chavez\AppData\Local\Programs\Python\Python311\Lib\site-packages\dask\dataframe\io\csv.py:640: UserWarning:
Could not infer format, so each element will be parsed individually, falling back to `dateutil`. To ensure parsing is consistent and as-expected, please specify a format.
#Eliminar los outliersprimer_cuartil = df_title_basics["runtimeMinutes"].quantile(0.25)tercer_cuartil = df_title_basics["runtimeMinutes"].quantile(0.75)# Calcula el rango intercuartílico (IQR)IQR = tercer_cuartil - primer_cuartil#Calcula los límites para considerar los valores atípicoslimite_inferior = primer_cuartil -1.5* IQRlimite_superior = tercer_cuartil +1.5* IQR#Filtra los valores que están dentro de los límitesdf_title_basics_limpio = df_title_basics[( df_title_basics["runtimeMinutes"] >= limite_inferior) & ( df_title_basics["runtimeMinutes"] <= limite_superior)]fig, axes = plt.subplots(ncols=2, figsize=(15, 6))sns.boxplot(x=df_title_basics['runtimeMinutes'], ax=axes[0])axes[0].set_title('Box Plot runtimeMinutes')axes[0].set_xlabel('Time (minut)')sns.boxplot(x=df_title_basics['runtimeMinutes'],showfliers=False, ax=axes[1])axes[1].set_title('Box Plot runtimeMinutes sin outliers')axes[1].set_xlabel('Time')# Ajustar el espaciado y mostrar los gráficosplt.tight_layout()plt.show()
En el primer boxplot, observamos películas con una duración en días. Si bien es cierto que existen registros de algunas películas con duraciones extremadamente largas, en muchos casos estos datos corresponden a cortometrajes repetidos. Esto podría afectar gravemente nuestro análisis, ya que distorsiona la información al incluir datos atípicos.
En el segundo boxplot, tenemos una distribución más coherente, donde las películas generalmente duran entre 1 hora y 1:30 horas, llegando hasta las 2 horas. Este rango es más representativo de las duraciones típicas de las películas y proporciona una base más sólida para el análisis.
Code
#@titlefig, axes = plt.subplots(ncols=2, figsize=(15, 6))sns.histplot(x=df_title_basics['startYear'],bins=30, ax=axes[0])axes[0].set_title('Histograma starYear')axes[0].set_xlabel('Time (minut)')sns.countplot(x=df_title_basics['isAdult'], ax=axes[1])axes[1].set_title('Distribucion de Adult')axes[1].set_xlabel('Time')gen_cnt = df_title_basics['isAdult'].value_counts()npkmn = gen_cnt.values.sum()sns.countplot(x=df_title_basics['isAdult'], ax=axes[1],color="skyblue")for i inrange(len(gen_cnt)): cnt = gen_cnt[i] pcnt ='{:0.1f}%'.format(100*cnt/npkmn) plt.text(i, cnt, pcnt, va='bottom', ha='center')# Ajustar el espaciado y mostrar los gráficosplt.tight_layout()plt.show()
Observamos que, a partir de los años 90, se produjo un aumento significativo en la cantidad de películas. Esto sugiere que sería más relevante enfocar nuestro análisis desde este punto en adelante, ya que refleja mejor los cambios tecnológicos y las preferencias del público en tiempos más recientes.
Además, la mayoría de las películas están adaptadas para todo público, representando un 98.7% del total. Esto indica una tendencia hacia la creación de contenido que sea accesible y atractivo para una audiencia amplia y diversa.
Code
df_title_ratings.describe()
averageRating
numVotes
count
1446041.00
1446041.00
mean
6.96
1032.07
std
1.38
17697.86
min
1.00
5.00
25%
6.20
11.00
50%
7.20
26.00
75%
7.90
101.00
max
10.00
2904305.00
Code
fig, axes = plt.subplots(ncols=2, figsize=(15, 6))sns.histplot(x=df_title_ratings['averageRating'], ax=axes[0],bins=30,kde=True)axes[0].set_title('Distribucion de averageRating')axes[0].set_xlabel('averageRating')sns.boxplot(x=df_title_ratings['numVotes'],showfliers=False, ax=axes[1])axes[1].set_title('Box Plot s sin outliers de numVotes ')axes[1].set_xlabel('numVotes')# Ajustar el espaciado y mostrar los gráficosplt.tight_layout()plt.show()
Las usuarios tienden a dar puntajes que oscilan entre 5 y 8, con un máximo aproximado de 100 votos.
Code
df_tmdb.describe()
release_date
budget
revenue
vote_average
roi
count
9159
9159.00
9159.00
9159.00
9159.00
mean
2002-02-11 11:39:47.815263744
24838109.66
58469683.80
5.72
1.06
min
1914-04-25 00:00:00
1.00
-1974717015.00
0.00
-1.00
25%
1995-12-22 00:00:00
2500000.00
1500000.00
5.00
-0.42
50%
2007-03-30 00:00:00
10000000.00
11130889.00
6.00
0.49
75%
2014-09-04 12:00:00
30000000.00
50240765.50
6.00
2.00
max
2024-07-23 00:00:00
460000000.00
2068223624.00
10.00
7.60
std
NaN
38726673.32
137905062.93
1.58
1.93
Code
def millions_formatter(x, pos):returnf'{x:.0f} M'# Convertir la columna 'budget' y 'revenue' a millonesdf_tmdb["budget_millions"] = df_tmdb["budget"] /1000000df_tmdb["revenue_millions"] = df_tmdb["revenue"] /1000000# Crear la figura y los subplotsfig, axes = plt.subplots(ncols=2, figsize=(15, 6))# Boxplot para 'budget' en el primer subplotsns.boxplot(x=df_tmdb['budget_millions'], ax=axes[0])axes[0].set_title('Box Plot Budget (in Millions)')axes[0].set_xlabel('Budget (in Millions)')axes[0].xaxis.set_major_formatter(FuncFormatter(millions_formatter))axes[0].set_ylabel('')# Boxplot para 'revenue' en el segundo subplotsns.boxplot(x=df_tmdb['revenue_millions'], ax=axes[1])axes[1].set_title('Box Plot Revenue (in Millions)')axes[1].set_xlabel('Revenue (in Millions)')axes[1].xaxis.set_major_formatter(FuncFormatter(millions_formatter))axes[1].set_ylabel('')# Ajustar el espaciado y mostrar los gráficosplt.tight_layout()plt.show()
Algunas películas tienen costos de producción y ganancias demasiado elevados. Por ejemplo, ‘Avatar’ obtuvo ganancias significativas, pero también existen películas con presupuestos de producción muy altos. Es importante destacar que estos son casos específicos, ya que no todas las películas alcanzan ese nivel de éxito.
3. Preguntas y respuestas
Pregunta 1: ¿Cual es la evolución del rating por tipo de contenido?
Code
# Filtrar y preparar los datosdf_movie = df_title_basics[(df_title_basics["titleType"] =="movie") & (df_title_basics["startYear"] >=1990)]df_tv = df_title_basics[(df_title_basics["titleType"] =="tvSeries") & (df_title_basics["startYear"] >=1990)]df_movie = df_movie.merge(df_title_ratings, on="tconst").groupby('startYear')['averageRating'].mean()df_tv = df_tv.merge(df_title_ratings, on="tconst").groupby('startYear')['averageRating'].mean()# Preparar los datos para el gráfico de pasteltitle_type_counts = df_title_basics['titleType'].value_counts()# Crear la figura y los ejes con gridspecfig = plt.figure(figsize=(18, 6))gs = fig.add_gridspec(1, 3, width_ratios=[2, 2, 2]) # 3 columnas, con diferentes anchos# Gráfico de pastel para la distribución de tipos de títulosax1 = fig.add_subplot(gs[0, 0]) # Primer subplot ocupa la primera columnaax1.pie(title_type_counts, labels=title_type_counts.index, autopct='%1.1f%%', colors=sns.color_palette('pastel'))ax1.set_title('Distribución de Tipos de Contenido')# Gráfico de líneas para películas y series de TVax2 = fig.add_subplot(gs[0, 1]) # Segundo subplot ocupa la segunda columnasns.lineplot(data=df_movie, ax=ax2, label='Películas', marker='o', color='b')sns.lineplot(data=df_tv, ax=ax2, label='Series de TV', marker='o', color='orange')ax2.set_title('Rating promedio por año y comtenido')ax2.set_xlabel('Año')ax2.set_ylabel('Calificación Promedio')ax2.grid(True, axis='y')# Ajustar la leyendaax2.legend(loc='center left')ax2.spines['top'].set_visible(False)ax2.spines['right'].set_visible(False)ax2.spines['left'].set_visible(False)ax2.spines['bottom'].set_visible(False)# Espacio para el textoax3 = fig.add_subplot(gs[0, 2]) # Tercer subplot ocupa la tercera columnaax3.axis('off') # Ocultar ejes para el área de textoconclusion_text = ("El análisis del contenido indica que \n""históricamente el publico consume más \n""$\\bf{Películas}$ que $\\bf{Series\\ de\\ Televisión}$ \n\n""Sin embargo, el público prefiere más las\n""$\\bf{Series\\ de\\ Televisión}$ con rating \n""superior a los $\\bf{7}$ puntos,mientras que las \n"" $\\bf{Películas}$ solo alcanzan los $\\bf{6}$ puntos.")ax3.text(0.5, 0.5, conclusion_text, ha="center",va="center", fontsize=18)# Ajustar el espaciado entre los gráficos y el textofig.tight_layout()# Mostrar los gráficosplt.show()
Pregunta 2: ¿Cual es el rating promedio por género?
genre_order = df_title_basics_expanded['genre'].value_counts().index# Crear la figura y los ejesfig, ax1 = plt.subplots(figsize=(25, 6))gs = fig.add_gridspec(1, 3, width_ratios=[2, 2, 2])# Grafico de barrassns.countplot(data=df_title_basics_expanded, x='genre', ax=ax1, order=genre_order)ax1.set_title('Distribución y Rating por Género')ax1.set_xlabel('Genre') # Añadir etiqueta al eje xax1.set_ylabel('Count by genre', color="blue") # Añadir etiqueta al eje y izquierdoax1.tick_params(axis='y', colors='blue') # Ajustar color de los ticks del eje yax1.grid(True, axis='y')for spine in ax1.spines.values(): spine.set_visible(False) # Ocultar los bordes de ax1# Ajustar etiquetas del eje x# Ajustar etiquetas del eje x con FixedLocator y FixedFormatterax1.set_xticks(range(len(genre_order)))ax1.set_xticklabels(genre_order, rotation=45, ha='right') # Rotar 45 grados y alinear a la derecha# Crear un segundo eje y graficar el rating promedioax2 = ax1.twinx()# Asegurarse de que los géneros en df_genre_stats estén en el mismo orden que en el gráfico de barrasdf_genre_stats = df_genre_stats.set_index('genre').loc[genre_order].reset_index()sns.lineplot(data=df_genre_stats, x='genre', y='averageRating', ax=ax2, color='g', marker='o')ax2.set_ylabel('Average Rating', color="green") # Añadir etiqueta al eje y derechofor spine in ax2.spines.values(): spine.set_visible(False)# Ajustar las etiquetas del gráficoax2.set_xlabel(None) # No mostrar etiqueta en el eje x del segundo gráfico#ax1.tick_params(axis='y', colors='blue')ax2.tick_params(axis='y', colors='green')# Espacio para el textoax2 = fig.add_subplot(gs[0, 2]) # Tercer subplot ocupa la tercera columnaax2.axis('off') # Ocultar ejes para el área de textoconclusion_text = ("El análisis de los géneros nos indica que \n""el público prefiere contenidos relacionados \n""a $\\bf{Documentarios}$, $\\bf{Biografía}$ $\\bf{Historía}$ y \n""$\\bf{Animación}$\n\n""Sin embargo, podemos observar que es un \n""nicho poco explorado ya que se produce \n""muy poco contenido en la actualidad\n\n""Teniendo en cuenta que algunos de estos géneros\n""brindan información cultural, lo cual puede mejorar el rating\n""positivamente pero no quiere decir que las \n""personas prefieran este tipo de géneros.")ax2.text(2.0, 0.5, conclusion_text, ha="center",va="center", fontsize=18)# Ajustar el espaciado entre los subplotsplt.tight_layout()# Mostrar el gráficoplt.show()
Pregunta 3: ¿Cuáles son los géneros que proporcionan mayor ROI?
# Crear la figura y el gráficofig, ax = plt.subplots(figsize=(10, 6))sns.barplot(x='roi', y='genre', data=df_genre_roi,hue='genre', palette='viridis', dodge=False, ax=ax,legend=False)# Añadir etiquetas con el promedio de ROI al final de cada barrafor index, row in df_genre_roi.iterrows(): ax.text(row['roi'] +0.01, index, f'{row["roi"]:.2f}', ha='left', va='center', fontsize=10, color='black')# Quitar la cuadrícula (grid) y los contornos de las barrasax.grid(False)sns.despine(ax=ax, left=True, bottom=True)# Configuraciones adicionalesax.set_xlabel('ROI')ax.set_ylabel('Género')ax.set_title('Ranking Top 10 Géneros con mayor ROI', fontsize=18, pad=40)# Añadir el texto a la derecha del gráficoconclusion_text = ("El análisis del $\\bf{ROI}$ nos indica que los géneros\n""relacionados con $\\bf{Ciencia Ficción}$, $\\bf{Fantasía}$ \n""y $\\bf{Acción}$, son los que tienen mayor ROI. \n\n""Seguidos muy cerca por los géneros de\n""$\\bf{Crimen}$,$\\bf{Familia}$ y $\\bf{Aventura}$")fig.text(1.05, 0.5, conclusion_text, ha="left", va="center", fontsize=12, transform=ax.transAxes)# Quitar títulos y etiquetas del eje xax.set_title('')ax.set_xlabel('')ax.set_xticks([])# Ajustar el diseño para que se vea bienplt.tight_layout()plt.show()
Pregunta 4: ¿Cuáles son los países con mayor producción de contenido?
Code
# Explosión de production_countriesdf_tmdb_exploded_countries = df_tmdb.assign( production_countries=df_tmdb['production_countries'].str.split(',')).explode('production_countries').copy()# Eliminar espacios en blancodf_tmdb_exploded_countries['production_countries'] = df_tmdb_exploded_countries['production_countries'].str.strip()# Agrupar y agregardf_plot = df_tmdb_exploded_countries.groupby('production_countries').agg({'roi': 'mean', 'production_countries': 'size'})# Renombrar columnasdf_plot=df_plot.rename(columns={'production_countries': 'count'})# Ordenar y seleccionar los 13 países con más películasdf_plot = df_plot.sort_values(by=['count']).iloc[-13:]num_countries =len(df_plot)# Generar posiciones x e ygrid_size =int(np.ceil(np.sqrt(num_countries)))df_plot['x'] = np.tile(np.arange(grid_size), grid_size)[:num_countries]df_plot['y'] = np.repeat(np.arange(grid_size), grid_size)[:num_countries]df_plot
Pregunta 5: ¿Cual es tu recomendación para el cliente?
Code
avatar=df_tmdb_titles[df_tmdb_titles["imdb_id"]=="tt0499549"]endgame=df_tmdb_titles[df_tmdb_titles["imdb_id"]=="tt4154796"]avatar_sentido_del_agua=df_tmdb_titles[df_tmdb_titles["imdb_id"]=="tt1630029"]spiderman=df_tmdb_titles[df_tmdb_titles["imdb_id"]=="tt10872600"]jurassic_world=df_tmdb_titles[df_tmdb_titles["imdb_id"]=="tt0369610"]films1=pd.concat([avatar,endgame,avatar_sentido_del_agua,spiderman,jurassic_world])[['title','revenue']]#films["revenue"]=(films["revenue"]/1000000000).apply(lambda x:f'${x:.2f}B')data = {'title': ['Avatar', 'Avengers: Endgame', 'Avatar: The Way of Water', 'Spider-Man: No Way Home', 'Jurassic World'],'revenue': [2923706026, 2800000000, 2320250281, 1921847111, 1671537444]}# Crear el DataFramefilms = pd.DataFrame(data)films
title
revenue
0
Avatar
2923706026
1
Avengers: Endgame
2800000000
2
Avatar: The Way of Water
2320250281
3
Spider-Man: No Way Home
1921847111
4
Jurassic World
1671537444
Code
import matplotlib.pyplot as pltimport seaborn as snsimport numpy as npfrom matplotlib.patches import FancyBboxPatchimport requestsfrom io import BytesIOfrom matplotlib.offsetbox import OffsetImage, AnnotationBbox# URLs de las imágenesdef billions_formatter(x, pos):returnf"${x/1e9:.2f}B"imagenes_paths = ['https://i.postimg.cc/HnTBG1Nf/Avatar.png','https://i.postimg.cc/xd6nW9qz/avengers.png','https://i.postimg.cc/Y9kMP86h/avatar-agua.png','https://i.postimg.cc/mDbNrf3R/spiderman.png','https://i.postimg.cc/7PgZ3zNh/jurassic.png']# Generar la gráficaplt.subplots(figsize=(15, 6))# Crear una paleta de colores para cada barranum_bars =len(films['revenue'])colores_azules = plt.cm.Blues_r(np.linspace(0.2, 0.6, num_bars))# Convertir la paleta en una lista para evitar advertenciascolores_azules =list(colores_azules)# Plot con seaborn, asignando 'y' como hue y deshabilitando la leyendaax = sns.barplot(x=films['revenue'], y=films['title'], hue=films['title'], palette=colores_azules, orient='h', dodge=False, legend=False)new_patches = []for patch, color, title, revenue, image_path inzip(ax.patches, colores_azules, films['title'], films['revenue'], imagenes_paths): bb = patch.get_bbox() p_bbox = FancyBboxPatch((bb.xmin, bb.ymin),abs(bb.width), abs(bb.height), boxstyle="round,pad=1,rounding_size=-5", ec="none", fc=color, mutation_aspect=0.3 ) patch.remove() new_patches.append(p_bbox)# Añadir imagen a la barra response = requests.get(image_path) image = plt.imread(BytesIO(response.content)) imagebox = OffsetImage(image, zoom=0.9) ab = AnnotationBbox(imagebox, xy=(bb.xmin +100, patch.get_y() + patch.get_height() /2), xybox=(17, 0), xycoords="data", boxcoords="offset points", pad=0, arrowprops=dict(arrowstyle='-', color='none'), bboxprops=dict(facecolor='none', edgecolor='none')) ax.add_artist(ab)# Añadir texto presupuesto a la derecha de la barra ax.annotate(billions_formatter(revenue, None), xy=(patch.get_width(), patch.get_y() + patch.get_height() /2), xytext=(-5, 0), textcoords='offset points', color='black', fontweight='bold', fontsize=12, ha='right', va='center', xycoords='data', bbox=dict(facecolor='none', edgecolor='none', pad=0), annotation_clip=False)for patch in new_patches: ax.add_patch(patch)# Agregar conclusión a la derecha del gráficoconclusion_text = ("El analisis de las películas nos conduce\n"" a una conclusión más precisa,\n""donde los géneros de $\\bf{Ciencia\\ Ficción}$, \n""$\\bf{Aventura}$ y $\\bf{Acción}$, son los queregistran \n""mayores Ganancias.\n\n""Esto sugiere una creciente tendencia donde \n""la tecnología continúa impresionando\n""a los espectadores con $\\bf{efectos\\ especiales}$ \n""avanzados junto con accion y aventura.")ax.text(3100000000, 2, conclusion_text, fontsize=12, va='center', ha='left')# Personalizando el gráficoax.set_title("Top 5 películas con mayor Ganancia en la historia", loc="center", fontdict={"fontsize":20}, pad=20)ax.set_xlabel("Ganancias")ax.set_ylabel("Título")ax.xaxis.grid(False)ax.yaxis.grid(False)ax.set_xticks([])ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['bottom'].set_visible(False)ax.spines['left'].set_visible(False)sns.despine(left=True, bottom=True)plt.show()
Code
# Definir los datos de las seriesdata = {'title': ['Breaking Bad','Game of Thrones','Stranger Things','The Crown','The Mandalorian' ],'rating': [9.4,9.3,8.7,8.7,8.8 ]}# Crear el DataFramedf_series = pd.DataFrame(data)# Mostrar el DataFramedf_series=df_series.sort_values(by='rating',ascending=False)df_series
title
rating
0
Breaking Bad
9.40
1
Game of Thrones
9.30
4
The Mandalorian
8.80
2
Stranger Things
8.70
3
The Crown
8.70
Code
# URLs de las imágenes correspondientes a cada serieimagenes_paths = ['https://i.postimg.cc/x1ZzRxrw/breaking.png','https://i.postimg.cc/85Qr87zw/games.png','https://i.postimg.cc/Hxw8TTJm/themandalorian.png','https://i.postimg.cc/Pq88FWTP/stranger.png','https://i.postimg.cc/sgxW5FLP/thecrown.png']# Generar la gráficaplt.subplots(figsize=(15, 6))# Crear una paleta de colores para cada barranum_bars =len(df_series['rating'])colores_azules = plt.cm.BuGn_r(np.linspace(0.2, 0.6, num_bars))# Convertir la paleta en una lista para evitar advertenciascolores_azules =list(colores_azules)# Plot con seaborn, asignando 'y' como hue y deshabilitando la leyendaax = sns.barplot(x=df_series['rating'], y=df_series['title'], hue=df_series['title'], palette=colores_azules, orient='h', dodge=False, legend=False)# Ajustar las barras para que se ajusten al contenido#ax.set_xlim(15, 20) # Establecer límites para ajustar el espacio de las barrasnew_patches = []for patch, color, title, rating, image_path inzip(ax.patches, colores_azules, df_series['title'], df_series['rating'], imagenes_paths): bb = patch.get_bbox() p_bbox = FancyBboxPatch((bb.xmin, bb.ymin),abs(bb.width), abs(bb.height), boxstyle="round", #le damos el redondeo a las graficas ec="none", fc=color, mutation_aspect=0.4 ) patch.remove() new_patches.append(p_bbox)# Añadir imagen a la barra response = requests.get(image_path) image = plt.imread(BytesIO(response.content)) imagebox = OffsetImage(image, zoom=0.9) # Ajustar el zoom de la imagen ab = AnnotationBbox(imagebox, xy=(0.3, patch.get_y() + patch.get_height() /2),#la etiqueda de adentro xybox=(0, 0), xycoords="data", boxcoords="offset points", pad=0, arrowprops=dict(arrowstyle='-', color='none'), bboxprops=dict(facecolor='none', edgecolor='none')) ax.add_artist(ab)# Añadir texto de calificación a la derecha de la barra ax.annotate(f'{rating}★', xy=(patch.get_width(), patch.get_y() + patch.get_height() /2),#ponemos la posicion de la imagen xytext=(-6, 0), textcoords='offset points', color='black', fontweight='bold', fontsize=12, ha='right', va='center', xycoords='data', bbox=dict(facecolor='none', edgecolor='none', pad=0), annotation_clip=False)for patch in new_patches: ax.add_patch(patch)# Agregar conclusión a la derecha del gráficoconclusion_text = ("¡Interesante!\n\n""El análisis de algunas series nos indica nuevamente\n""que los usuarios tienen una afición por los géneros\n""$\\bf{Ciencia\\ Ficción}$, $\\bf{Aventura}$ y $\\bf{Drama}$,\n""teniendo alto rating.\n\n""Ya sea a través de personajes complejos,\n""$\\bf{tramas\\ emocionantes}$, $\\bf{nostalgia}$, $\\bf{efectos\\ especiales}$\n""o una combinación de todos estos elementos.")ax.text(10.1, 2, conclusion_text, fontsize=12, va='center', ha='left')# Personalizando el gráficoax.set_title("Top 5 series con mejor calificación", loc="center", fontdict={"fontsize":20}, pad=20)ax.set_xlabel("Calificación")ax.set_ylabel("Título")ax.xaxis.grid(False)ax.yaxis.grid(False)ax.set_xticks([])ax.spines['top'].set_visible(False)ax.spines['right'].set_visible(False)ax.spines['bottom'].set_visible(False)ax.spines['left'].set_visible(False)sns.despine(left=True, bottom=True)plt.tight_layout() # Ajustar el diseño del gráfico para mejorar la visualización de elementosplt.show()
Conclusión
El análisis global sugiere que los géneros de drama, aventura y ciencia ficción son altamente valorados, tanto en series como en películas. Además, aunque las películas siguen dominando en términos de cantidad, las series de televisión están ganando terreno en términos de calidad y calificación del público. La industria del entretenimiento de Estados Unidos sigue siendo la más dominante a nivel mundial, con una considerable producción de contenido y un alto retorno sobre la inversión.
Este análisis proporciona información valiosa sobre las tendencias actuales en el consumo de entretenimiento y las preferencias del público, destacando la importancia de ciertos géneros y la evolución en la valoración de series de televisión sobre las películas.
Recomendaciones 1. Incorporación de Contenido con Alto Rating:
Industria de EE.UU.: Estados Unidos lidera en la producción de contenido. Atraer a la plataforma las series y películas con mejor rating provenientes de este país puede aumentar significativamente la satisfacción de los usuarios y la retención de suscriptores.
Foco en Géneros Populares:
Géneros Clave: Ciencia Ficción, Aventura, Acción, Drama, Fantasía y Terror son los géneros que generan mayor visualización. Enfocar la adquisición y promoción de contenido en estos géneros atraerá a más clientes y aumentará el tiempo de visualización.
Explotación de Contenido Clásico:
Contenido Clásico: Películas y series clásicas que, aunque no sean recientes, siguen siendo populares debido a la nostalgia y el entretenimiento que proporcionan. Promover estos títulos puede atraer a una audiencia más amplia y diversificada.
Inversión en Nuevas Producciones:
Nuevas Películas y Series: Invertir en la creación de nuevas películas y series enfocadas en Ciencia Ficción, Aventura y Drama, o una combinación de estos, puede capturar la atención de una audiencia ávida de contenido fresco y emocionante.
Acuerdos con Productoras:
Contratos de Contenido: Identificar títulos con calificaciones positivas que no están disponibles en la plataforma y negociar acuerdos con las productoras para financiar y asegurar la exclusividad de estos títulos. Esto puede diferenciar la plataforma de la competencia y ofrecer contenido exclusivo de alta calidad.
Mejora Continua:
Análisis Regular: Continuar analizando las tendencias y las preferencias del público para adaptar la estrategia de contenido de manera dinámica y proactiva. Esto permitirá mantener la relevancia y la competitividad en el mercado del entretenimiento en constante evolución.
Implementar estas recomendaciones ayudará a maximizar el atractivo de la plataforma, mejorar la experiencia del usuario y aumentar la base de suscriptores, garantizando así el éxito a largo plazo en un mercado altamente competitivo.