27
loading...
This website collects cookies to deliver better user experience
# Importando a biblioteca Pandas
import pandas as pd
# Lendo o arquivo
tmdb = pd.read_csv('tmdb_5000_movies.csv')
describe()
:# Descrevendo o dataset
tmdb.describe()
ax = sns.displot(tmdb.vote_average, kde=True)
ax.set(xlabel = "Nota Média", ylabel = "Densidade")
ax.fig.suptitle("Média de votos em filmes no TMDB 5000")
ax = sns.boxplot(x = tmdb.vote_average)
ax.set(title = "Distribuição de nota média dos filmes do TMDB 5000", xlabel = "Nota média do filme")
tmdb.query("vote_average == 0").iloc[:, [0, 3, 8, 13, 18, 19]].head()
vote_average
existe dados igual a 0, ou seja, simplesmente ninguém votou nesses filmes! Então, para não atrapalhar nossas análises, vamos eliminar os filmes que tem 0 votos, e aceitar apenas os filmes com mais ou igual a 10 votos:tmdb.query("vote_count >= 10")
tmdb_com_mais_de_10_votos = tmdb.query("vote_count>= 10")
describe()
) dos filmes com 10 ou mais votos:tmdb_com_mais_de_10_votos.describe()
tmdb.query("vote_count == 10")
os filmes com a média 10 tinha recebido apenas 1 ou 2 votos.ax = sns.displot(tmdb_com_mais_de_10_votos.vote_average, stat="count", kde = False)
ax.set(title = "Média de votos em filmes no TMDB 5000 dentre os filmes com 10 ou mais votos",
xlabel = "Nota média",
ylabel = "Frequência")
stat = "density"
e kde = True
:notas = pd.read_csv('ratings.csv')
notas.head()
nota_media_por_filme = notas.groupby('movieId').mean()['rating']
nota_media_por_filme.head()
ax = sns.displot(nota_media_por_filme.values, kde = True, stat='density')
ax.set(title = "Média de votos em filmes no MovieLens 100k",
xlabel = 'Nota média',
ylabel = 'Densidade')
quantidade_de_votos_por_filme = notas.groupby('movieId').count()
quantidade_de_votos_por_filme.head()
filmes_com_pelo_menos_10_votos = quantidade_de_votos_por_filme.query('rating >= 10').index
pd.DataFrame(filmes_com_pelo_menos_10_votos).head()
filmes_com_pelo_menos_10_votos
:nota_media_dos_filmes_com_pelo_menos_10_votos = nota_media_por_filme.loc[filmes_com_pelo_menos_10_votos]
pd.DataFrame(nota_media_dos_filmes_com_pelo_menos_10_votos).head()
ax = sns.displot(nota_media_dos_filmes_com_pelo_menos_10_votos.values, kde = True, stat='density')
ax.set(title = "Média de votos em filmes no MovieLens 100k com 10 ou mais votos",
xlabel = 'Nota média',
ylabel = 'Densidade')
ax = sns.boxplot(x = nota_media_dos_filmes_com_pelo_menos_10_votos.values)
ax.set(title = "Distribuição de nota média dos filmes do MovieLens 100k dentre os filmes com 10 ou mais votos",
xlabel = "Nota média do filme")
ax = sns.histplot(nota_media_dos_filmes_com_pelo_menos_10_votos.values,
cumulative = True,
kde = True,
stat = 'density')
ax.set(xlabel="Nota média", ylabel="% acumulada de filmes")
ax.set_title("Média de votos em filmes no Movielens 100k com 10 ou mais votos")
ax = sns.histplot(tmdb_com_mais_de_10_votos.vote_average,
cumulative = True,
kde = True,
stat = 'density')
ax.set(xlabel="Nota média", ylabel="% acumulada de filmes")
ax.set_title("Média de votos em filmes no TMDB 5000 com 10 ou mais votos")
ax = sns.histplot(tmdb_com_mais_de_10_votos.vote_count, kde = True, stat = 'density')
ax.set(title = 'Número de votos em filmes do TMDB 5000 com 10 ou mais votos',
xlabel = 'Número de votos',
ylabel = 'Densidade')
ax.figure.set_size_inches(12, 6)
ax = sns.histplot(tmdb.query('budget > 0').budget, kde = True, stat = 'density')
ax.set(title = 'Gastos em filmes do TMDB 5000',
xlabel = 'Budget (Gastos)',
ylabel = 'Densidade')
ax.figure.set_size_inches(12, 6)
ax = sns.histplot(tmdb.popularity, kde = True, stat = 'density')
ax.set(title = 'Popularidade em filmes no TMDB 5000',
xlabel = 'Popularidade',
ylabel = 'Densidade')
ax.figure.set_size_inches(20, 12)
pd.isnull()
e vamos somar esses valores com a função pd.count()
:tmdb.runtime.isnull().sum()
ax = sns.histplot(tmdb.runtime.dropna(), kde = True, stat = 'density')
ax.set(title = 'Tempo de duração em filmes no TMDB 5000',
xlabel = 'Tempo de duração',
ylabel = 'Densidade')
ax.figure.set_size_inches(12, 6)
tmdb.query('runtime == 0')
query
onde o runtime seja maior que 0:ax = sns.histplot(tmdb.query('runtime > 0').runtime.dropna(), kde = True, stat = 'density')
ax.set(title = 'Tempo de duração em filmes no TMDB 5000',
xlabel = 'Tempo de duração',
ylabel = 'Densidade')
ax.figure.set_size_inches(12, 5)
ax = sns.histplot(tmdb.query('runtime > 0').runtime.dropna(), kde = True, stat = 'density', cumulative = True)
ax.set(title = 'Tempo de duração em filmes no TMDB 5000',
xlabel = 'Tempo de duração',
ylabel = '% de filmes')
ax.figure.set_size_inches(12, 5)
tmdb.query('runtime > 0').runtime.dropna().quantile(0.8)
121.0
minutos, muito próximo da aproximação visual.nota_media_dos_filmes_com_pelo_menos_10_votos[0:5].mean()
3.5259741603585653
For
que abranja todo o nosso conjunto:for i in range(1, len(nota_media_dos_filmes_com_pelo_menos_10_votos)):
for i in range(1, len(nota_media_dos_filmes_com_pelo_menos_10_votos)):
nota_media_dos_filmes_com_pelo_menos_10_votos[0:i].mean()
medias
que receberá como argumento uma lista (list())
. Com medias.append()
, passaremos o retorno da nossa iteração para essa variável, e a exibiremos na tela:medias = list()
for i in range(1, len(nota_media_dos_filmes_com_pelo_menos_10_votos)):
medias.append(nota_media_dos_filmes_com_pelo_menos_10_votos[0:i].mean())
medias
matlplotlib
e passaremos medias para a função plt.plot()
:import matplotlib.pyplot as plt
medias = list()
for i in range(1, len(nota_media_dos_filmes_com_pelo_menos_10_votos)):
medias.append(nota_media_dos_filmes_com_pelo_menos_10_votos[0:i].mean())
plt.plot(medias)
import numpy as np
np.random.seed(75243)
temp = nota_media_dos_filmes_com_pelo_menos_10_votos.sample(frac=1)
medias = [temp[0:i].mean() for i in range(1, len(temp))]
plt.plot(medias)
from statsmodels.stats.weightstats import zconfint
zconfint(nota_media_dos_filmes_com_pelo_menos_10_votos)
(3.4112459477469557, 3.452854733323563)
3.41
e 3.45
para os filmes em geral, não só para a minha amostra. from statsmodels.stats.weightstats import DescrStatsW
descr_todos_com_10_votos = DescrStatsW(nota_media_dos_filmes_com_pelo_menos_10_votos)
descr_todos_com_10_votos.tconfint_mean()
(3.41123483922938, 3.4528658418411386)
movies.csv
e o importaremos com o Pandas. Como queremos somente o primeiro filme, faremos uma query()
selecionando-o por seu movieId
:filmes = pd.read_csv("movies.csv")
filmes.query("movieId==1")
notas1 = notas.query('movieId == 1')
notas1.head()
ax = sns.histplot(notas1.rating, kde = True, stat = 'density')
ax.set(title = 'Distribuição das notas para o Toy Story',
xlabel = 'Nota',
ylabel = 'Densidade')
ax = sns.boxplot(x = notas1.rating)
ax.set(title = 'Distribuição das notas para o Toy Story',
xlabel = 'Nota')
notas1.rating.mean()
3.9209302325581397
zconfint(notas1.rating)
(3.8093359183563402, 4.032524546759939)
from statsmodels.stats.weightstats import ztest
ztest(notas1.rating, value = 3.4320503405352603)
(8.586342305916716, 8.978190401886942e-18)
np.random.seed(75241)
temp = notas1.sample(frac=1).rating
medias = [temp[0:i].mean() for i in range(1, len(temp))]
plt.plot(medias)
def calcula_teste(i):
media = temp[0:i].mean()
stat, p = ztest(temp[0:i], value = 3.4320503405352603)
return (i, media, p)
medias = [calcula_teste(i) for i in range(2, len(temp))]
medias
[(2, 4.5, 0.032687621135204896), (3, 4.0, 0.3252543510880489), (4, 3.875, 0.29952196979944745), (5, 3.9, 0.15826781784711086), (6, 3.9166666666666665, 0.07406936464331344), (7, 3.9285714285714284, 0.03058372185045264), (8, 4.0625, 0.008546846816661634), (9, 3.9444444444444446, 0.034351369792154834), (10, 3.6, 0.6797757440816464), (11, 3.590909090909091, 0.6661040559180447), (12, 3.5, 0.8452594429449549), (...)]
medias = np.array([calcula_teste(i) for i in range(2, len(temp))])
medias
plt.plot(medias[:,1])
calcula_teste(i)
está retornando outros valores além da média, mudaremos o nome da variável medias para valores. No eixo x do nosso gráfico, passaremos valores[:,0]
para pegarmos o índice que figura na primeira coluna do nosso conjunto:valores = np.array([calcula_teste(i) for i in range(2, len(temp))])
medias
plt.plot(valores[:,0],valores[:,1])
p_value
:plt.plot(valores[:,0],valores[:,1])
plt.plot(valores[:,0],valores[:,2])
plt.plot(valores[:,0],valores[:,1])
plt.plot(valores[:,0],valores[:,2])
plt.hlines(y = 0.05, xmin = 2, xmax = len(temp), colors = 'r')
zconfint(notas1.rating, notas.rating)
(0.2799245129192442, 0.5588219849631111)
notas1.rating
é entre 0.279 e 0.558 mais alta que notas.rating
. Também podemos imprimir o p-value
dessa comparação:print (ztest(notas1.rating, notas.rating))
zconfint(notas1.rating, notas.rating)
(5.894327101501841, 3.762112778881965e-09)
(0.2799245129192442, 0.5588219849631111)
from scipy.stats import ttest_ind
ttest_ind(notas.rating, notas1.rating)
Ttest_indResult(statistic=-5.894327101501841,
pvalue=3.774003138720876e-09)
notas1.rating
e notas.rating
, j´que um histograma nesse caso ficaria um pouco poluído.import matplotlib.pyplot as plt
plt.boxplot([notas.rating, notas1.rating], labels=["Todas as notas", "Toy Story"])
plt.title("Distribuição das notas de acordo com filmes")
filmes.query('movieId in [1, 593, 72226]')
notas1 = notas.query("movieId == 1")
notas593 = notas.query("movieId == 593")
notas72226 = notas.query("movieId == 72226")
plt.boxplot([notas1.rating, notas593.rating, notas72226.rating], labels=["Toy Story", "Silence of the Lambs,", "Fantastic Mr. Fox"])
plt.title("Distribuição das notas de acordo com filmes")
notas72226.describe()
4.250000
seaborn
. Para isso, teremos que passar três parâmetros distintos:data
, que receberá um notas.query()
com as movieId
dos três filmes sendo analisadosx
, que será nossa coluna movieId
y
, que será nossa coluna rating
sns.boxplot()
é interessante quando nossos dados podem ser facilmente separados por colunas. No caso do plt.boxplot()
, temos que separar esses dados manualmente.sns.boxplot(x = "movieId", y = "rating", data = notas.query("movieId in (1, 593, 72226)"))
descr_1 = DescrStatsW(notas1.rating)
descr_593 = DescrStatsW(notas593.rating)
comparacao = descr_1.get_compare(descr_593)
comparacao.summary()
coef std err t P>|t| [0.025 0.975]
subset #1 -0.2404 0.077 -3.132 0.002 -0.391 -0.090
alpha = 0.05
, encontramos uma diferença estatística entre os filmes Toy Story e Silence of the Lambs, com um p-value
igual a 0.02
e um intervalo de confiança entre -0.391
e -0.090
".descr_72226 = DescrStatsW(notas72226.rating)
descr_593 = DescrStatsW(notas593.rating)
comparacao = descr_72226.get_compare(descr_593)
comparacao.summary()
coef std err t P>|t| [0.025 0.975]
subset #1 -0.0780 0.208 -0.374 0.708 -0.488 0.332
comparacao = descr_1.get_compare(descr_72226)
comparacao.summary()
coef std err t P>|t| [0.025 0.975]
subset #1 -0.1624 0.206 -0.788 0.431 -0.568 0.243
notas.query("movieId in (1, 593, 72226)").groupby("movieId").count()
from scipy.stats import normaltest
stat, p = normaltest(notas1.rating)
p
p-value
de 0.00011053430732728716
- ou seja, menor do que 0.05
. Como essa função testa a hipótese nula de que o conjunto de dados venha de uma distribuição normal, um resultado menor que 0.05
indica que não estamos trabalhando com uma distribuição normal.from scipy.stats import ranksums
_, p = ranksums(notas1.rating, notas593.rating)
p
0.0003267718756440693
p-value
é significativo, descartando a hipótese nula. No ranksums()
, a hipótese nula é de que as duas amostras vieram da mesma distribuição. Já a hipótese alternativa, que admitiremos nesse caso (já que o p-value
foi bem pequeno), é a de que os valores de uma amostra têm uma tendência a serem maiores que os da outra amostra.