Análise de dados para negócios da base de dados de uma locadora de filmes.
Sumário
- Sobre o Projeto
- Iniciar o Projeto
- Entender a Base
-
Análise do Negócio
- Quais foram os 5 gêneros mais alugados?
- Existe alguma possibilidade desses gêneros serem os mais alugados por terem mais filmes?
- Quais foram os 5 filmes mais alugados?
- Quais foram os 5 filmes menos alugados?
- Existe algum filme que não foi alugado?
- Por ordem decrescente, qual foi o lucro que cada loja recebeu?
- Quem são os 10 maiores clientes?
- Quais são as cidades onde residem os 10 maiores clientes?
- Quais são as cinco cidades com o maior número de clientes, exceto as que já possuem lojas?
- Quem é o ator que tem mais filmes alugados?
- Por ordem decrescente, qual foi o lucro que cada loja recebeu?
- Apresentação
- Agradecimentos
- License
- Contact
Este projeto tem o objetivo de treinar e demonstrar as minhas habilidades em análise de dados com o SQL Server.
Para realizar este projeto, foi utilizado as seguintes ferramentas:
-
Análise da Base:
Inicialmente, realizou-se uma consulta em cada tabela, com o objetivo de compreender seus atributos e relacionamentos. Essa etapa permitiu obter uma visão abrangente dos dados disponíveis.
-
Levantamento de Requisitos:
Com base na análise das tabelas, foram levantados os requisitos necessários para a resolução do problema de negócio. Essa fase é fundamental para garantir que os dados extraídos sejam adequados às demandas específicas da empresa.
-
Extração dos Dados:
Uma vez definidos os requisitos, procedeu-se à criação das queries para extrair os dados relevantes para a resolução do problema. A extração foi realizada de forma a obter informações necessárias para a geração de insights.
-
Transferência dos Dados para o Excel:
Após a extração dos dados, estes foram transferidos para o Excel. Essa etapa permitiu uma manipulação mais eficiente dos dados, possibilitando a criação de análises detalhadas para os relatórios.
-
Geração dos Relatórios:
Utilizando as informações consolidadas no Excel, foram gerados dois relatórios, apresentando os resultados obtidos. Esses relatórios constituem uma parte crucial do processo, pois fornecem insights valiosos para a compreensão do cenário atual e potenciais oportunidades de melhoria.
-
Criação da Apresentação de Storytelling no PowerPoint:
Finalmente, os visuais e informações mais relevantes dos relatórios foram incorporados a uma apresentação de storytelling no PowerPoint. Essa etapa permitiu criar uma narrativa envolvente e visualmente impactante, facilitando a comunicação dos resultados e conclusões aos stakeholders e tomadores de decisão.
- Clone este Repositório
git clone https://github.com/DemikFR/SQL-Server-Sakila-Data-Analysis.git
- Execute a query que está em '/sql-server-sakila-db/sql-server-sakila-db'
A base de dados Sakila será instalada em seu SQL-Server.
Para compreender esta base de dados, foi realizado uma pequena query com SELECT em cada tabela e um relacionamento com as tabelas referente às vendas das lojas, conforme abaixo:
SELECT title, rental_date, return_date, amount
FROM film f
JOIN inventory i ON f.film_id = i.film_id
JOIN rental r ON i.inventory_id = r.inventory_id
JOIN payment p ON r.rental_id = p.rental_id
ORDER BY titleEsta tabela armazena o ID e sobrenome do Ator.
A tabela address conta com informações de endereço, como CEP e logradouro, além de um campo de identificação (ID) da cidade correspondente. Essa tabela estabelecerá uma relação com a tabela city para cada endereço, por meio do campo de ID da cidade. A tabela cidade, por sua vez, possui um campo de ID que identifica o país (country) ao qual ela pertence.
Esta tabela tem por objetivo guardar os clientes de cada loja, cada um receberá a identificação estrangeira da loja, além do ID de endereço.
Esta tabela serve para armazenar os gêneros dos filmes, por exemplo: ação, comédia, etc.
Esta tabela tem a finalidade de armazenar informações dos filmes, bem como nome, sinopse e data de lançamento. Além disso ela contém informações comercial do filme, como 'rental duration' que é o tempo de duração do contrato, 'rental rate' que é a taxa fixa do aluguel e o 'replacement cost' que é a taxa para o cliente trocar de filme.
A tabela Film Actor serve para relacionar o filme com o seu principal ator (tabela actor), já a film category relaciona o filme com o(s) seu(s) gênero(s). A tabela film text serve para armazenar o filme e sua sinópse, porém está em desuso.
Esta tabela armazena as 6 principais linguagens de filmes.
Compreende todas as unidades da locadora.
Os gerentes de cada loja.
Guardará as lojas junto com o seu gerente e endereço.
Esta tabela relaciona os filmes com suas respectivas lojas, indicando qual loja é responsável pela disponibilidade de cada filme.
Esta tabela tem o aluguel de cada cliente, bem como o filme alugado, qual loja pertence e a data locação e de devolução.
Tabela que tem por finalidade armazenar a informação e confirmação do pagamento da locação pelo cliente, nela conterá o valor final do aluguel, ou seja, total pago.
Para realizar a análise, foram feitas algumas perguntas de negócios com base nos dados disponíveis, cada uma foi repondida conforme a sua consulta SQL mostrada ao longo deste tópico.
Essa pergunta será útil para a equipe de negócios identificar o perfil dos seus clientes, pois sabendo disso, poderá ser tomada uma melhor decisão sobre quais filmes deverão adquirir em um próximo investimento.
Os gêneros de filmes que mais vendem são:
| genero_filme | alugueis |
|---|---|
| Sports | 1179 |
| Animation | 1166 |
| Action | 1112 |
| Sci-Fi | 1101 |
| Family | 1096 |
Para ter o resultado acima, foi necessário realizar a seguinte consulta no SQL Server:
SELECT TOP 5 c.name genero_filme, COUNT(r.rental_id) alugueis
FROM [dbo].[category] c
INNER JOIN [dbo].[film_category] fc ON c.category_id = fc.category_id
INNER JOIN [dbo].[film] f ON fc.film_id = f.film_id
INNER JOIN [dbo].[inventory] i ON f.film_id = i.film_id
INNER JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
GROUP BY c.name
ORDER BY alugueis DESCSe caso, essa possibilidade ser real, é possível que aumentando as opções dos outros gêneros, aumente as vendas de cada gênero.
Para reponder essa pergunta, foi necessário usar a Correlação de Pearson que é uma medida estatística para verificar se uma variável tem relação com a outra, no caso, se a quantidade de alugueis tem relação com a quantidade de filmes por gênero disponíveis no estoque. A correlação deve retornar um valor de -1 a 1, sendo que, basicamente, se quanto mais perto do número inteiro estiver, maior é a correlação, caso estiver próximo de 0, menor é a correlação ou não existe.
WITH relatorio_generos(genero_filme, alugueis, filmes)
AS
(
SELECT c.name genero_filme, COUNT(r.rental_id) alugueis, COUNT(DISTINCT fc.film_id) filmes
FROM [dbo].[category] c
INNER JOIN [dbo].[film_category] fc ON c.category_id = fc.category_id
INNER JOIN [dbo].[film] f ON fc.film_id = f.film_id
LEFT JOIN [dbo].[inventory] i ON f.film_id = i.film_id
LEFT JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
GROUP BY c.name
)
SELECT
ROUND(
(
SUM(alugueis * filmes) - (SUM(alugueis) * SUM(filmes)) / COUNT(*)
)
/
(
SQRT(
SUM(alugueis * alugueis) - (SUM(alugueis) * SUM(alugueis)) / COUNT(*)
) * SQRT(
SUM(filmes * filmes) - (SUM(filmes) * SUM(filmes)) / COUNT(*)
)
), 2) AS correlacao
FROM relatorio_generosO cálculo retornou o valor 0.79 que significa que existe uma correlação forte entre as variáveis.
Esse resultado sugere que há uma tendência de que os gêneros de filmes com mais títulos disponíveis no estoque também sejam mais alugados. Com base nesse resultado, a equipe de negócios pode considerar adquirir mais filmes de outros gêneros para ampliar sua oferta e atender às preferências do seu público de maneira mais abrangente.
Essa questão pode ser útil para a equipe de negócios entender quais filmes são mais procurados pelos clientes e, assim, adquirir mais títulos seguindo o mesmo padrão.
Sendo assim, para extrair essa informação foi feita a seguinte query:
SELECT TOP 7 f.title AS nome_filme, c.name AS genero_filme, COUNT(r.rental_id) alugueis
FROM [dbo].[category] c
INNER JOIN [dbo].[film_category] fc ON c.category_id = fc.category_id
INNER JOIN [dbo].[film] f ON fc.film_id = f.film_id
INNER JOIN [dbo].[inventory] i ON f.film_id = i.film_id
INNER JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
GROUP BY f.title, c.name
ORDER BY alugueis DESCO resultado da consulta foi:
| nome_filme | genero_filme | alugueis |
|---|---|---|
| BUCKET BROTHERHOOD | Travel | 34 |
| ROCKETEER MOTHER | Foreign | 33 |
| RIDGEMONT SUBMARINE | New | 32 |
| JUGGLER HARDLY | Animation | 32 |
| GRIT CLOCKWORK | Games | 32 |
| SCALAWAG DUCK | Music | 32 |
| FORWARD TEMPLE | Games | 32 |
Note que para melhor decisão foram considerados os empatados.
A fim de complementar a pergunta anterior, esta tem como objetivo ajudar a equipe de negócios a identificar quais padrões de filmes são menos populares entre os clientes, evitando adquirir títulos semelhantes no futuro.
Para responde-la foi feita a seguinte consulta no banco:
SELECT TOP 17 f.title AS nome_filme, c.name AS genero_filme, COUNT(r.rental_id) alugueis
FROM [dbo].[category] c
INNER JOIN [dbo].[film_category] fc ON c.category_id = fc.category_id
INNER JOIN [dbo].[film] f ON fc.film_id = f.film_id
INNER JOIN [dbo].[inventory] i ON f.film_id = i.film_id
INNER JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
GROUP BY f.title, c.name
ORDER BY alugueis ASCOs filmes com menos vendas foram:
| nome_filme | genero_filme | alugueis |
|---|---|---|
| MIXED DOORS | Foreign | 4 |
| TRAIN BUNCH | Horror | 4 |
| HARDLY ROBBERS | Documentary | 4 |
| PRIVATE DROP | Games | 5 |
| INFORMER DOUBLE | Foreign | 5 |
| BUNCH MINDS | Drama | 5 |
| GLORY TRACY | Games | 5 |
| MANNEQUIN WORST | New | 5 |
| HUNTER ALTER | Documentary | 5 |
| CONSPIRACY SPIRIT | Classics | 5 |
| FREEDOM CLEOPATRA | Comedy | 5 |
| MUSSOLINI SPOILERS | Sports | 5 |
| SEVEN SWARM | Games | 5 |
| BRAVEHEART HUMAN | Family | 5 |
| FEVER EMPIRE | Games | 5 |
| FULL FLATLINERS | Children | 5 |
| TRAFFIC HOBBIT | Travel | 5 |
Neste caso, também foram considerados os empatados.
Não foram encontrados filmes nessa condição, conforme a consulta abaixo:
SELECT f.title AS nome_filme, c.name AS genero_filme, COUNT(r.rental_id) alugueis
FROM [dbo].[category] c
INNER JOIN [dbo].[film_category] fc ON c.category_id = fc.category_id
INNER JOIN [dbo].[film] f ON fc.film_id = f.film_id
INNER JOIN [dbo].[inventory] i ON f.film_id = i.film_id
INNER JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
GROUP BY f.title, c.name
HAVING COUNT(r.rental_id) = 0
ORDER BY alugueis ASCResultado:
| nome_filme | genero_filme | alugueis |
|---|
Com essa pergunta, a equipe de negócios saberá quem é o ator mais famoso entre os seus clientes, podendo assim, adquirir mais produtos do mesmo.
Após a consulta realizada abaixo, constatou-se que Susan Davis foi a atriz que teve mais filmes alugados, com um total de 825 locações, tornando-a a mais famosa entre os clientes.
SELECT TOP 1 a.first_name+' '+a.last_name AS nome_ator, COUNT(r.rental_id) alugueis
FROM [dbo].[actor] a
INNER JOIN [dbo].[film_actor] fa ON a.actor_id = fa.actor_id
INNER JOIN [dbo].[film] f ON fa.film_id = f.film_id
INNER JOIN [dbo].[inventory] i ON f.film_id = i.film_id
INNER JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
GROUP BY a.first_name+' '+a.last_name
ORDER BY alugueis DESCA fim de identificar os principais clientes da locadora, foi realizada uma consulta no banco de dados para obter uma lista dos 10 clientes com maior quantidade de locações realizadas.
SELECT TOP 10 c.first_name+' '+c.last_name AS nome_cliente, COUNT(r.rental_id) alugueis
FROM [dbo].[customer] c
INNER JOIN [dbo].[rental] r ON c.customer_id = r.customer_id
GROUP BY c.first_name+' '+c.last_name
ORDER BY alugueis DESCResultado:
| nome_cliente | alugueis |
|---|---|
| ELEANOR HUNT | 46 |
| KARL SEAL | 45 |
| CLARA SHAW | 42 |
| MARCIA DEAN | 42 |
| TAMMY SANDERS | 41 |
| SUE PETERS | 40 |
| WESLEY BULL | 40 |
| MARION SNYDER | 39 |
| RHONDA KENNEDY | 39 |
| TIM CARY | 39 |
Será possível usar essa informação para tomar a decisão de onde poderá abrir uma próxima unidade.
Para tal, a seguinte query foi realizada:
WITH top_clientes(id_cliente, alugueis)
AS
(
SELECT TOP 10 c.customer_id AS id_cliente, COUNT(r.rental_id) alugueis
FROM [dbo].[customer] c
INNER JOIN [dbo].[rental] r ON c.customer_id = r.customer_id
GROUP BY c.customer_id
ORDER BY alugueis DESC
)
SELECT cr.first_name+' '+cr.last_name AS nome_cliente, c.city AS cidade_cliente
FROM [dbo].[city] c
INNER JOIN [dbo].[address] a ON c.city_id = a.city_id
INNER JOIN [dbo].[customer] cr ON a.address_id = cr.address_id
INNER JOIN [top_clientes] tc ON cr.customer_id = tc.id_clienteO resultado da consulta foi:
| nome_cliente | cidade_cliente |
|---|---|
| ELEANOR HUNT | Saint-Denis |
| KARL SEAL | Cape Coral |
| CLARA SHAW | Molodetno |
| MARCIA DEAN | Tanza |
| TAMMY SANDERS | Changhwa |
| SUE PETERS | Changzhou |
| WESLEY BULL | Ourense (Orense) |
| MARION SNYDER | Santa Brbara dOeste |
| TIM CARY | Bijapur |
| RHONDA KENNEDY | Apeldoorn |
Para complementar o resultado da pergunta anterior, foi possível identificar as cidades onde tem o maior número de clientes, em exceção das que já existem lojas, conforme a consulta abaixo:
WITH cidades_loja(id_cidade)
AS
(
SELECT c.city_id
FROM [dbo].[city] c
INNER JOIN [dbo].[address] a ON c.city_id = a.city_id
INNER JOIN [dbo].[store] s ON a.address_id = s.address_id
)
SELECT TOP 2 c.city AS nome_cidade, COUNT(cr.customer_id) qte_clientes
FROM [dbo].[city] c
INNER JOIN [dbo].[address] a ON c.city_id = a.city_id
INNER JOIN [dbo].[customer] cr ON a.address_id = cr.address_id
LEFT JOIN [cidades_loja] cl ON c.city_id = cl.id_cidade
GROUP BY c.city
ORDER BY qte_clientes DESCApenas duas cidades contém mais clientes que as outras, que é 2, em todas as outras cidades cadastradas, foram constatadas apenas 1 cliente por cidade, assim, foi filtrado na consulta apenas essas duas.
| nome_cidade | qte_clientes |
|---|---|
| Aurora | 2 |
| London | 2 |
Essa questão pode servir para a equipe de negócios analisar o desempenho de cada loja e identificar oportunidades para maximizar os lucros.
A seguinte consulta foi realizada:
SELECT s.store_id AS id_loja, sf.first_name+' '+sf.last_name AS nome_gerente, SUM(p.amount) lucro_total
FROM [dbo].[store] s
INNER JOIN [dbo].[staff] sf ON s.store_id = sf.store_id
INNER JOIN [dbo].[inventory] i ON s.store_id = i.store_id
INNER JOIN [dbo].[rental] r ON i.inventory_id = r.inventory_id
INNER JOIN [dbo].[payment] p ON r.rental_id = p.rental_id
GROUP BY s.store_id, sf.first_name+' '+sf.last_name
ORDER BY lucro_total DESCO resultado obtido foi:
| id_loja | nome_gerente | lucro_total |
|---|---|---|
| 2 | Jon Stephens | 33726.77 |
| 1 | Mike Hillyer | 33679.79 |
Todas as imagens abaixo são os slides retirados do arquivo apresentacao.pptx deste repositório.
Este projeto usou a versão da base Sakila disponibilizada pelo JOOQ através de seu repositório Sakila.
Distributed under the BSD 2-Clause License. See LICENSE.txt for more information.
Demik Freitas - Linkedin - demik.freitast2d18@gmail.com
Project Link: https://github.com/DemikFR/SQL-Server-Sakila-Data-Analysis