FreshWomen · Season 3

Fontes e método

De onde vem cada número deste painel, quem leu o quê, e o quanto dá para confiar em cada coisa. Esta página é gerada pelos próprios arquivos de dado: as contagens abaixo são lidas na hora em que ela é montada, não digitadas.

As duas origens, e elas não têm o mesmo peso

Metade deste painel eu apurei do zero e dá para auditar linha a linha. A outra metade veio pronta.

Reviews: apuradas aqui. Tudo que é review, nota, volume, idioma e citação saiu da API pública da Steam, baixada por script para arquivo local, e está conferível. O endereço é store.steampowered.com/appreviews/<appid>, paginado por cursor, 100 por requisição, sempre com language=all e purchase_type=all — sem esses dois parâmetros a Steam devolve só inglês e só compra direta, que é cerca de 15% do total e daria um retrato falso. Datas de update saem de ISteamNews/GetNewsForApp e a ficha da loja de api/appdetails.
Faturamento: não é meu. Nenhum valor em dólar deste painel foi apurado por mim. $72.527/dia, $9.084/dia, $18.804/dia e a projeção inteira vieram dos CSVs do Steamworks, entregues prontos. Não tenho acesso ao Steamworks: o que fiz com esses números foi reagrupar por bloco e dividir por dias. Se o CSV estiver errado, o painel repete o erro. Foi por isso que a comparação de faturamento entre temporadas saiu do ar, e é por isso que a projeção da aba 03 é cenário declarado e não previsão.
Uma figura mistura as duas origens de propósito, e é a única. O calendário de vendas e eventos da aba 01 põe no mesmo eixo de tempo o $/dia por bloco, que é Steamworks, e as reviews por dia, que são da API. São dois desenhos separados, empilhados, justamente para ninguém ler uma curva como se fosse a outra: a série de dinheiro não existe em resolução diária, só agregada por bloco de preço.

O que foi baixado, e quanto disso é o total

Cobertura de cada coleta contra o número que a própria API declara. Coleta parcial está marcada e explicada.

BaseAppColetadasAPI declaraCoberturaArquivoColeta
Season 1135065018.67818.679100%19.1 MB13/08/2026
Season 234786502.6412.641100%3.0 MB13/08/2026
Season 340058700--0 KB13/08/2026
Playtest S3450914099100%13 KB13/08/2026
Pentiment12055209.6879.687100%830 KB14/08/2026
SlayThePrincess198927033.46033.465100%3.9 MB14/08/2026
YsFelghana2073202.1292.129100%213 KB14/08/2026
Wasteland22407608.1008.100100%732 KB14/08/2026
SunlessSkies5969703.4683.468100%315 KB14/08/2026
Disco Elysium632470112.193129.92086%10.7 MB14/08/2026
Disco Elysium é a única coleta parcial de propósito. A paginação vai da review mais nova para a mais velha, e eu parei em 01/06/2020 porque o que interessa é a janela de 183 dias em volta de 30/03/2021, que está 100% coberta. O que falta é anterior a junho de 2020 e não entra em conta nenhuma.

Quem leu as reviews

Nenhum script classificou nada. O papel do regex foi achar candidatas e despejar o texto num arquivo; a decisão de classe é leitura, entrada por entrada.

Candidatas da S1 lidas
1.018
904 da rede inicial + 114 recuperadas
Candidatas da S2 lidas
235
de 2.641 reviews
Negativas da S1 lidas
908
todas, inteiras
Negativas da S2 lidas
461
todas, inteiras
Classificação feita à mãoReviewsOnde aparece
S1 · pedido explícito de voz211aba 01 e aba 04
S1 · reclamação da ausência221aba 01 e aba 04
S1 · total que pede voz432o 3,1% da aba 01
S2 · elogia a voz111aba 02
S2 · critica a voz18aba 02
S2 · diz que a voz custou conteúdo9aba 02
S2 · pede mais voz9aba 02
S2 · cita sem julgar20aba 02
S2 · falso positivo do filtro69descartadas
S1 · negativas lidas inteiras908os motivos da aba 01
S2 · negativas lidas inteiras461os motivos da aba 02
O que NÃO foi lido à mão, e está assim escrito nas abas: o percentual “citam voz” dos jogos da aba 05 (122 mil reviews, casamento de termo puro) e a contagem por motivo das negativas — das 908 da S1 e das 461 da S2. Ali os temas saíram da leitura, mas a contagem de cada linha é por lista de termos, para aplicar o mesmo critério em todas.

Como o filtro foi testado

Rede ampla de propósito: falso positivo o olho descarta na leitura, falso negativo some para sempre. Por isso o filtro é auditado contra uma amostra de fora dele.

Na S1 o teste rodou e pegou erro. Sorteei 200 reviews que o filtro não tinha pego e li uma a uma: 3 falavam de voz, todas por termo que faltava — ses em turco, 声音 em chinês e voces em espanhol. Com o filtro ampliado entraram 114 candidatas novas, das quais 67 realmente pediam voz: a contagem inicial estava 15% baixa. Contra o filtro final, a mesma amostra tem zero escapes.
Na S2 esse teste ficou pela metade. A amostra de 200 rodou e achou 3 escapes, o filtro foi ampliado e recuperou 11 candidatas — mas não refiz uma amostra nova contra o filtro corrigido. É a lacuna de método que sobrou neste painel. Barata de fechar, e até que feche, os números de voz da S2 são piso.

Quanto dá para confiar em cada número

Não existe um percentual único de confiabilidade, porque os números não foram produzidos do mesmo jeito. São quatro níveis.

Tipo de númeroNívelPor quê
Aprovação, volume, idioma, datacensoNão é amostra, é contagem: 18.678 de 18.679 na S1, 2.641 de 2.641 na S2. O erro possível é de coleta, não de estatística
Pedido de voz na S1, elogio na S2alta, e é pisoLeitura integral das candidatas, com o filtro auditado por amostra de fora. Erra para baixo, nunca para cima
Motivos das 461 negativasranking sim, linha nãoA ordem é robusta — roteiro com 54,9% está muito à frente de tudo. O valor exato de cada linha muda conforme o termo escolhido
“Citam voz” nos casos da aba 05médiaSó termo, sem leitura. Vale para o antes contra o depois, porque o critério é o mesmo dos dois lados; não vale como número absoluto
Tabela dos 22 concorrentesmetadado exato, amostra nãoA marcação de áudio completo é da própria Steam. Mas a escolha dos 22 títulos é minha e não é aleatória: essa é a parte fraca da aba 05
Faturamento e projeçãonão verificadoVem do Steamworks, entregue pronto. Não tenho como conferir
Três limites que valem repetir. Review editada conta como o texto de hoje, e cerca de 8% das reviews da S1 foram editadas depois de publicadas — existe review de 2022 que hoje diz “atualizaram com voz, ficou ótimo” e cujo pedido original sumiu do texto. Review apagada ou de conta banida não está no arquivo. E nada aqui prova causa: quando duas coisas acontecem juntas, as abas dizem que aconteceram juntas, não que uma causou a outra.

Os scripts, na ordem em que o dado passa por eles

Todos ficam na pasta do projeto e podem ser rodados de novo. A descrição de cada um é lida do cabeçalho do próprio arquivo.

c:\Users\PC\Desktop\Pessoal\Projetos\oppaiman\lancamentos\painel-s3\
ScriptAlimentaO que fazTamanho
coletar_todos.pyabas 01, 02, 04 e /communityMesmos parametros do coletar_1350650.py (json=1, filter=recent, language=all, purchase_type=all, num_per_page=100, cursor). Um arquivo por app em _dados/. Sem os defaults abertos a API esconde ~85% das reviews, entao language=all e3 KB
coletar_1350650.pyaba 01Coleta pura: nao filtra janela, nao analisa, nao resume. A analise le o arquivo depois, para que qualquer numero do relatorio possa ser reconferido no bruto. Parametros exigidos na tarefa: json=1, filter=recent, language=all,4 KB
reviews.pyaba 01Alimenta a analise de reviews do painel (freshwomen-s3.pages.dev). Nao publica nada: so coleta e imprime o resumo, alem de gravar o JSON bruto para conferencia. Como a API se comporta (verificado em 11/08/2026, nao e de memoria):9 KB
analisar_dublagem.pyabas 01 e 04Le o bruto de reviews_1350650.json (nunca chama a API: assim todo numero do relatorio pode ser reconferido no mesmo arquivo) e escreve um relatorio markdown. Janelas, atribuidas pela data de CRIACAO da review (timestamp_created, UTC):18 KB
pedido_de_voz.pyabas 01 e 04Etapa 1 (--dump): rede ampla por regex sobre as 18.677 reviews e despejo dos candidatos em lotes de texto, para leitura humana. Review curta sai inteira; review longa sai como janela em volta do termo, que e o barato que da contagem7 KB
voz_s2.pyaba 02A S2 nasceu dublada, entao aqui nao existe "antes e depois": a unica pergunta respondivel e QUANTO da conversa da S2 e sobre voz, e se e elogio ou queixa. O metodo e o mesmo da S1 (pedido_de_voz.py): rede ampla por regex, despejo dos5 KB
coletar_caso.pyaba 05Serve para a aba de casos: para cada jogo que ganhou voz depois de lancado, o que interessa e a data, o polegar, o idioma e se o texto fala de voz. Guardar a review inteira de um jogo com 130 mil reviews nao cabe e nao serve para nada,4 KB
categoria_voz.pyaba 05Para cada titulo de uma lista de VNs adultas e jogos do mesmo balcao na Steam, pega da API da loja: se algum idioma esta marcado como AUDIO COMPLETO, o total de reviews e o percentual positivo. Sem isso, "voz e diferencial" e opiniao.4 KB
metricas_community.py/communityLe _dados/reviews_.json (gerado por coletar_todos.py) e escreve _dados/community.json com tudo que a pagina desenha. A pagina nao calcula nada: so plota o que sai daqui, para que todo numero seja reconferivel no bruto.8 KB
gerar_community.py/communityA pagina nao calcula nada: recebe o payload pronto e so desenha. Assim todo numero do grafico pode ser reconferido no bruto de reviews_.json. Paleta dos graficos: slots 1 e 2 da paleta categorica de referencia, passo dark7 KB
graficos_s1.pyaba 01Duas figuras no mesmo eixo de tempo (out/2023 a abr/2024), para dar para ler uma em cima da outra: A) $/dia por bloco de venda, com as promocoes destacadas e o dia da DLC marcado7 KB
graficos_s2.pyaba 02Quatro figuras, cada uma com UM eixo (nunca dois no mesmo desenho): A) reviews por mes, barra empilhada positiva/negativa -> volume B) % de recomendo por mes, linha -> recepcao10 KB
graficos_casos.pyaba 05Cada caso e um jogo que ganhou voz depois de lancado. Sao duas medidas diferentes, entao sao dois desenhos, nunca dois eixos no mesmo: A) quanto da conversa passou a ser sobre voz (antes x depois)3 KB
amostrar_ccu.py/communityRoda de hora em hora pela tarefa do Windows "FreshWomen - CCU horario". Cada passada acrescenta uma linha em _dados/ccu.json, regenera site/community.html e publica. Um retrato solto de CCU nao vale nada; a serie ao longo das semanas ate2 KB
gerar_fontes.pyesta páginaA pagina de metodo nao pode ter numero digitado a mao, senao ela envelhece mentindo. Tudo aqui e lido na hora: cobertura de cada coleta, quantas reviews foram lidas a mao, o que cada script faz (a primeira linha do docstring dele) e22 KB
publicar.pytodasProjeto Pages proprio (freshwomen-s3), na conta da OPPAIMAN. Nao divide projeto com o LocStudio nem com o voice-oppaiman: cada deploy do Pages substitui a pasta inteira, entao juntar projetos so cria a chance de um apagar o outro.2 KB
Onde fica o resto: _dados/ guarda o bruto das coletas, _dados/casos/ os jogos de referência da aba 05, _lotes/ e _lotes_s2/ os despejos de texto que eu li, e classificacao.json e classificacao_s2.json a decisão de cada review por índice — é por aí que se audita qualquer número de leitura deste painel, review por review.
Como refazer tudo do zero: python coletar_todos.py baixa as reviews de novo, pedido_de_voz.py --contar e voz_s2.py --contar refazem as contagens em cima da classificação salva, graficos_s2.py e graficos_casos.py redesenham as figuras, gerar_fontes.py refaz esta página e publicar.py põe no ar. Nenhuma etapa depende de número digitado à mão.

Página gerada em 14/08/2026 a partir dos arquivos do projeto.