<jupyter_start><jupyter_text><jupyter_code>!pip install statsmodels=='0.12.2'
import statsmodels as sm 
sm.__version__
import pandas as pd

tmdb = pd.read_csv('https://github.com/alura-cursos/data-science-introducao-a-testes-estatisticos-com-python/raw/master/aula0/tmdb_5000_movies.csv')
tmdb.head()
tmdb.describe()
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(16, 6))
sns.set_theme()

ax = sns.distplot(tmdb.vote_average)
ax.set(xlabel='Nota média', ylabel='Densidade')
ax.set_title('Média de votos em filmes no TMDB 5000', fontsize=18);
import seaborn as sns

plt.figure(figsize=(16, 6))
ax = sns.histplot(tmdb.vote_average)
ax.set(xlabel='Nota média', ylabel='Frequência')
ax.set_title('Média de votos em filmes no TMDB 5000', fontsize=18);
plt.figure(figsize=(16, 6))

ax = sns.boxplot(x=tmdb.vote_average)
ax.set(xlabel='Nota média do filme')
ax.set_title('Distribuição de nota média dos filmes do TMDB 5000', fontsize=18);<jupyter_output><empty_output><jupyter_text>Não faz sentido filmes cuja nota média é 0 ou 10. A quantidade  de votos é muito pequena.Vamos verificar...<jupyter_code>tmdb.query('vote_average == 0').head()
tmdb.query('vote_average == 10').head()<jupyter_output><empty_output><jupyter_text>Iremos remover os filmes com poucos votos desta análise.<jupyter_code>tmdb_com_mais_de_10_votos = tmdb.query('vote_count >= 10')
tmdb_com_mais_de_10_votos.describe()
plt.figure(figsize=(16, 6))
ax = sns.histplot(tmdb_com_mais_de_10_votos.vote_average)
ax.set(xlabel='Nota média', ylabel='Frequência')
ax.set_title('Média de votos em filmes no TMDB 5000 dentre os filmes com 10 ou mais votos', fontsize=18);
plt.figure(figsize=(16, 6))
ax = sns.histplot(tmdb_com_mais_de_10_votos.vote_average, kde=True, stat='density')
ax.set(xlabel='Nota média', ylabel='Densidade')
ax.set_title('Média de votos em filmes no TMDB 5000 dentre os filmes com 10 ou mais votos', fontsize=18);
plt.figure(figsize=(10, 8))
ax = sns.histplot(tmdb_com_mais_de_10_votos.vote_average, kde=True, stat='density', cumulative=True)
ax.set(xlabel='Nota média', ylabel='% acumulada de filmes')
ax.set_title('Distribuição cumulativa da média de votos em filmes no TMDB 5000 com 10 ou mais votos', fontsize=18);
plt.figure(figsize=(16, 6))

ax = sns.boxplot(x=tmdb_com_mais_de_10_votos.vote_average)
ax.set(xlabel='Nota média do filme')
ax.set_title('Distribuição de nota média dos filmes do TMDB 5000 dentre os filmes com 10 ou mais votos', fontsize=18);<jupyter_output><empty_output><jupyter_text>Analisaremos também o movielens<jupyter_code>notas = pd.read_csv('https://github.com/alura-cursos/data-science-introducao-a-testes-estatisticos-com-python/raw/master/aula0/ratings.csv')
 notas.head()
nota_media_por_filme = notas.groupby('movieId').mean().rating
nota_media_por_filme.head()
plt.figure(figsize=(16, 6))
ax = sns.histplot(nota_media_por_filme.values, kde=True, stat='density')
ax.set(xlabel='Nota média', ylabel='Densidade')
ax.set_title('Média de votos em filmes no Movielens 100k', fontsize=18);
quantidade_de_votos_por_filme = notas.groupby('movieId').count()
filmes_com_pelo_menos_10_votos = quantidade_de_votos_por_filme.query('rating >= 10').index
filmes_com_pelo_menos_10_votos.values
nota_media_dos_filmes_com_pelo_menos_10_votos = nota_media_por_filme.loc[filmes_com_pelo_menos_10_votos.values]
nota_media_dos_filmes_com_pelo_menos_10_votos.head()
plt.figure(figsize=(16, 6))
ax = sns.histplot(nota_media_dos_filmes_com_pelo_menos_10_votos.values, kde=True, stat='density')
ax.set(xlabel='Nota média', ylabel='Densidade')
ax.set_title('Média de votos em filmes no Movielens 100k com 10 ou mais votos', fontsize=18);
plt.figure(figsize=(16, 6))

ax = sns.boxplot(x=nota_media_dos_filmes_com_pelo_menos_10_votos.values)
ax.set(xlabel='Nota média do filme')
ax.set_title('Distribuição de nota média dos filmes do Movielens 100k dentre os filmes com 10 ou mais votos', fontsize=18);
plt.figure(figsize=(10, 8))
ax = sns.histplot(nota_media_dos_filmes_com_pelo_menos_10_votos.values, kde=True, stat='density', cumulative=True)
ax.set(xlabel='Nota média', ylabel='% acumulada de filmes')
ax.set_title('Distribuição cumulativa da média de votos em filmes no Movielens 100k com 10 ou mais votos', fontsize=18);<jupyter_output><empty_output><jupyter_text>Analisando a distribuição dos dados capturados de outros campos do TMDB<jupyter_code>tmdb_com_mais_de_10_votos.head()
plt.figure(figsize=(16, 8))
ax = sns.histplot(tmdb_com_mais_de_10_votos.vote_count, kde=True, stat='density', bins=50)
ax.set(xlabel='Número de votos', ylabel='Densidade')
ax.set_title('Número de votos em filmes no IMDB 5000 com 10 ou mais votos', fontsize=18);
plt.figure(figsize=(16, 8))
ax = sns.histplot(tmdb.query('budget > 0').budget, kde=True, stat='density', bins=50)
ax.set(xlabel='Budget (gastos)', ylabel='Densidade')
ax.set_title('Gastos em filmes no IMDB 5000', fontsize=18);
plt.figure(figsize=(16, 8))
ax = sns.histplot(tmdb.popularity, kde=True, stat='density', bins=50)
ax.set(xlabel='Popularidade', ylabel='Densidade')
ax.set_title('Popularidade dos filmes no IMDB 5000', fontsize=18);
tmdb.runtime.isnull().sum()
plt.figure(figsize=(16, 8))
ax = sns.histplot(tmdb.runtime.dropna(), kde=True, stat='density', bins=50)
ax.set(xlabel='Tempo de duração', ylabel='Densidade')
ax.set_title('Tempo de duração dos filmes no IMDB 5000', fontsize=18);
tmdb.query('runtime == 0')
plt.figure(figsize=(16, 8))
ax = sns.histplot(tmdb.query('runtime > 0').runtime.dropna(), kde=True, stat='density', bins=50)
ax.set(xlabel='Tempo de duração', ylabel='Densidade')
ax.set_title('Tempo de duração dos filmes no IMDB 5000', fontsize=18);
plt.figure(figsize=(16, 8))
ax = sns.histplot(tmdb.query('runtime > 0').runtime.dropna(), kde=True, stat='density', cumulative=True)
ax.set(xlabel='Tempo de duração', ylabel='% de filmes')
ax.set_title('Tempo de duração dos filmes no TMDB 5000', fontsize=18);
tmdb.query('runtime > 0').runtime.dropna().quantile(0.8)<jupyter_output><empty_output><jupyter_text>Movielens: média dos filmes com pelo menos 10 votos<jupyter_code>print(f'Média dos filmes com pelo menos 10 votos: {nota_media_dos_filmes_com_pelo_menos_10_votos.mean():.4f}')
# nota_media_dos_filmes_com_pelo_menos_10_votos.mean()
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.figure(figsize=(16, 8))
plt.plot(medias);
from statsmodels.stats.weightstats import zconfint
zconfint(nota_media_dos_filmes_com_pelo_menos_10_votos)
# Como o tamanho da amostra é bem maior que 30 (>2000), não seria necessário realizar o t_test, mas vamos averiguar o resultado mesmo assim:

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()<jupyter_output><empty_output><jupyter_text>Vamos ver o filme 1<jupyter_code>filmes = pd.read_csv('https://github.com/alura-cursos/data-science-introducao-a-testes-estatisticos-com-python/raw/master/aula0/movies.csv')
filmes.head()
filmes.query('movieId == 1')
notas1 = notas.query('movieId == 1')
notas1.head()
plt.figure(figsize=(10, 6))
ax = sns.histplot(notas1.rating, kde=True, stat='density', bins=10)
ax.set(xlabel='Nota', ylabel='Densidade')
ax.set_title('Distribuiçao das notas para o Toy Story', fontsize=18);
plt.figure(figsize=(10, 6))
ax = sns.boxplot(data=notas1, x='rating')
ax.set(xlabel='Nota')
ax.set_title('Boxplot das notas para o Toy Story', fontsize=18);
notas1.rating.mean()
notas1.rating.count()
zconfint(notas1.rating)
from statsmodels.stats.weightstats import ztest

ztest(notas1.rating, value=nota_media_dos_filmes_com_pelo_menos_10_votos.mean())
np.random.seed(75241)
temp = notas1.sample(frac=1).rating

def calcula_teste(i):
    media = temp[0:i].mean()
    stat, p_value = ztest(temp[0:i], value=nota_media_dos_filmes_com_pelo_menos_10_votos.mean())
    return (i, media, p_value)

valores = np.array([calcula_teste(i) for i in range(2, len(temp))])

plt.figure(figsize=(15, 10))
plt.plot(valores[:,0], valores[:,1], label='media')
plt.plot(valores[:,0], valores[:,2], label='p_value')
plt.hlines(y=0.05, xmin=2, xmax=len(temp), colors='r', label='0.05')
plt.legend();<jupyter_output><empty_output><jupyter_text>Comparação de dois conjuntos de amostras<jupyter_code>stat_test, p_valor = ztest(notas1.rating, notas.rating)
print(f'Estatística do teste = {stat_test:.3f}, p-valor = {p_valor}')
print(f'Como o resultado de p-valor é menor que 0.05 podemos dizer que há uma diferença significativa entre as duas médias.\n')

int_confianca = zconfint(notas1.rating, notas.rating)
print(f'A média de "notas1.rating" (Toy Story) é entre {int_confianca[0].round(4)} e {int_confianca[1].round(4)} mais alta que "notas.rating" (Todos os filmes).')
from scipy.stats import ttest_ind

ttest_ind(notas1.rating, notas.rating)
descr_todas_as_notas = DescrStatsW(notas.rating)
descr_toystory = DescrStatsW(notas1.rating)
comparacao = descr_toystory.get_compare(descr_todas_as_notas)
print(comparacao.summary()) # use_t=False -> z_test
print(comparacao.summary(use_t=True)) # t_test
plt.title('Distribuição das notas de acordo com filmes', fontsize=18);
g = sns.boxplot(data=[notas.rating, notas1.rating])
g.set_xticklabels(labels=['Todas as notas', 'Toy Story']);
plt.title('Distribuição das notas de acordo com filmes', fontsize=18);
g = sns.boxplot(data=[notas.rating, notas1[3:12].rating])
g.set_xticklabels(labels=['Todas as notas', 'Toy Story(do 3 ao 12)']);
descr_todas_as_notas = DescrStatsW(notas.rating)
descr_toystory = DescrStatsW(notas1[3:12].rating) # Comparação apenas com um subset de Toy Story
comparacao = descr_todas_as_notas.get_compare(descr_toystory)
print(comparacao.summary(use_t=True))<jupyter_output>Test for equality of means                          
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
subset #1     -0.0540      0.348     -0.155      0.877      -0.735       0.627
==============================================================================<jupyter_text>Comparar as médias de alguns filmes<jupyter_code>filmes.query('movieId in [1, 593, 72226]')
notas1 = notas.query('movieId == 1')
notas593 = notas.query('movieId == 593')
notas72226 = notas.query('movieId == 72226')

plt.figure(figsize=(14,5))
plt.title('Distribuição das notas de acordo com filmes', fontsize=18);
g = sns.boxplot(data=[notas1.rating, notas593.rating, notas72226.rating])
g.set_xticklabels(labels=['Toy Story', 'Silence of the Lambs, The', 'Fantastic Mr. Fox']);
notas72226.describe()
sns.boxplot(data=notas.query('movieId in (1, 593, 72226)'), x='movieId', y='rating');
notas.query('movieId in (1, 593, 72226)').groupby('movieId').count()
descr_1 = DescrStatsW(notas1.rating)
descr_593 = DescrStatsW(notas593.rating)
comparacao = descr_1.get_compare(descr_593)
print(comparacao.summary())
descr_72226 = DescrStatsW(notas72226.rating)
descr_593 = DescrStatsW(notas593.rating)
comparacao = descr_72226.get_compare(descr_593)
print(comparacao.summary(use_t=True))
comparacao = descr_1.get_compare(descr_72226)
print(comparacao.summary(use_t=True))
from scipy.stats import normaltest

_, p_value = normaltest(notas1.rating)
print(f'p-value = {p_value}\n\nComo essa função testa a hipótese nula de que o conjunto de dados venha de uma distribuição normal,\num resultado menor que 0.05 indica que não estamos trabalhando com uma distribuição normal.')
print('\nPor não atenderem ao teste de normalidade, os conjuntos anteriores não poderiam ter sido submetidos ao z_test/t_test.')
from scipy.stats import ranksums

stat, p_value = ranksums(notas1.rating, notas593.rating)
p_value

print(f'O ranksums consiste no teste Wilcoxon, que faz uma análise baseada em ranqueamento.\nA hipótese alternativa (p_value={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.')<jupyter_output>O ranksums consiste no teste Wilcoxon, que faz uma análise baseada em ranqueamento.
A hipótese alternativa (p_value=0.0003267718756440693 foi bem pequeno), é a de que os valores de uma amostra têm uma tendência a serem maiores que os da outra amostra.
{'fraction_non_alphanumeric': 0.1485340440998304, 'fraction_numerical': 0.04199983846215976, 'mean_word_length': 6.662128712871287, 'pattern_counts': {'":': 0, '<': 35, '<?xml version=': 0, '>': 44, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '262888', 'license': 'MIT', 'n_tokens_mistral': 5297, 'n_tokens_neox': 4879, 'n_words': 982, 'path': 'data_science_introducao_a_testes_estatisticos_com_python.ipynb', 'repo_name': 'Daniel-ASG/Course_Classes', 'size': '12381'}