<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arquivo de Machine Learning - Data Universe</title>
	<atom:link href="https://datauniverse.com.br/category/machine-learning/feed/" rel="self" type="application/rss+xml" />
	<link>https://datauniverse.com.br/category/machine-learning/</link>
	<description>Conteúdos sobre as áreas de Data Science, Data Analytics, Estatística e Probabilidade, Inteligência Artificial e Machine Learning.</description>
	<lastBuildDate>Fri, 28 Feb 2025 21:15:13 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://datauniverse.com.br/wp-content/uploads/2026/01/cropped-data-universe-logo-icon-32x32.png</url>
	<title>Arquivo de Machine Learning - Data Universe</title>
	<link>https://datauniverse.com.br/category/machine-learning/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Game Theory: Prisioner&#8217;s Dilemma utilizando Deep Q-Learning (DQN) Tensorflow.Keras</title>
		<link>https://datauniverse.com.br/game-theory-prisioners-dilemma-utilizando-tensorflow-keras/</link>
					<comments>https://datauniverse.com.br/game-theory-prisioners-dilemma-utilizando-tensorflow-keras/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Wed, 30 Oct 2024 20:03:36 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Projetos]]></category>
		<guid isPermaLink="false">https://dataisle.co/?p=2552</guid>

					<description><![CDATA[<p>A Teoria dos Jogos (Game Theory) é um campo da matemática e da economia que estuda como indivíduos ou grupos tomam decisões estratégicas em cenários onde suas escolhas afetam uns aos outros. Esses &#8220;jogos&#8221; envolvem situações onde o resultado de cada jogador depende das ações dos outros, e a teoria busca entender as melhores estratégias [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/game-theory-prisioners-dilemma-utilizando-tensorflow-keras/">Game Theory: Prisioner&#8217;s Dilemma utilizando Deep Q-Learning (DQN) Tensorflow.Keras</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" open><summary>Detalhes do projeto</summary>
<ul class="wp-block-list">
<li><strong>Link do projeto no Github:</strong> <a href="https://github.com/cerqueiralex/project-personal-prisioners-dilemma" target="_blank" rel="noreferrer noopener">https://github.com/cerqueiralex/project-personal-prisioners-dilemma</a></li>



<li><strong>Tecnologias:</strong> Python, Tensorflow, Random, Deep Q-Learning (DQN)</li>



<li><strong>Categorias:</strong> Data Science, Machine Learning</li>
</ul>
</details>



<p>A Teoria dos Jogos (Game Theory) é um campo da matemática e da economia que estuda como indivíduos ou grupos tomam decisões estratégicas em cenários onde suas escolhas afetam uns aos outros. </p>



<p>Esses &#8220;jogos&#8221; envolvem situações onde o resultado de cada jogador depende das ações dos outros, e a teoria busca entender as melhores estratégias para cada participante. </p>



<p>É amplamente aplicada em economia, psicologia, ciência política e até mesmo em biologia evolutiva para entender desde competições de mercado até comportamentos sociais.</p>



<h3 class="wp-block-heading">O Dilema dos Prisioneiros</h3>



<p>O <strong>Dilema dos Prisioneiros</strong> é um dos exemplos mais conhecidos da Teoria dos Jogos. Nele, dois suspeitos de um crime são presos e mantidos separados. Cada um tem duas opções: confessar ou não confessar o crime. As possíveis consequências são as seguintes:</p>



<ul class="wp-block-list">
<li>Se ambos não confessarem, cada um pega uma pena leve (digamos, 1 ano).</li>



<li>Se um confessar e o outro não confessar, o que confessou fica livre, enquanto o que não confessou recebe a pena máxima (10 anos).</li>



<li>Se ambos confessarem, cada um recebe uma pena moderada (5 anos).</li>
</ul>



<p>Os prisioneiros não conseguem se comunicar e precisam tomar suas decisões sem saber o que o outro vai escolher. </p>



<p>Isso cria um dilema: embora a melhor estratégia conjunta seja ambos não confessarem (levando a penas mínimas para ambos), o medo de que o outro possa confessar leva cada prisioneiro a considerar confessar como uma opção mais segura, pois, se o outro confessar, ao menos evitará a pena máxima.</p>



<p>Esse dilema gira em torno de um tema extremamente importante dentro da nossa sociedade: Confiança!</p>



<h3 class="wp-block-heading">Relação entre Teoria dos Jogos e o Dilema dos Prisioneiros</h3>



<p>O Dilema dos Prisioneiros demonstra um conceito importante na Teoria dos Jogos chamado equilíbrio de Nash. Esse equilíbrio ocorre quando, em uma situação com múltiplos jogadores, ninguém pode melhorar seu resultado mudando de estratégia, desde que os outros jogadores mantenham suas escolhas. </p>



<p>No dilema, o equilíbrio de Nash é que ambos confessem, pois, dado que um prisioneiro está confessando, o outro não ganha nada ao ficar em silêncio.</p>



<p>Esse exemplo ajuda a ilustrar uma verdade fundamental na Teoria dos Jogos: os interesses individuais e os interesses coletivos nem sempre estão alinhados. </p>



<p>Situações como o Dilema dos Prisioneiros são comuns em mercados, política e comportamento social, onde decisões baseadas apenas no próprio interesse individual podem levar a resultados subótimos para todos.</p>



<h2 class="wp-block-heading">Primeiro experimento: Testando partidas aleatórias</h2>



<p>Antes de fazer um treinamento de modelo, resolvi testar como seria o comportamento de escolhas aleatórias.</p>



<p>Para isso foi construido esse código onde cada prisioneiro, aleatóriamente escolhe entre cooperar &#8220;cooperate&#8221; ou trair &#8220;betray&#8221;.</p>



<pre class="wp-block-code"><code>import random
import matplotlib.pyplot as plt  # Importando a biblioteca para gráficos

# Definir número de rodadas
rounds = 1000

# Pontuação acumulada para cada prisioneiro
score_prisoner1 = 0
score_prisoner2 = 0

# Listas para armazenar as pontuações acumuladas ao longo das rodadas
scores_prisoner1 = &#91;]
scores_prisoner2 = &#91;]

# Função para simular uma rodada do dilema dos prisioneiros
def play_round():
    # Cada prisioneiro escolhe aleatoriamente entre "cooperar" ou "trair"
    choice1 = random.choice(&#91;"cooperate", "betray"])
    choice2 = random.choice(&#91;"cooperate", "betray"])

    if choice1 == "cooperate" and choice2 == "cooperate":
        return 3, 3, choice1, choice2  # Ambos cooperam
    elif choice1 == "betray" and choice2 == "betray":
        return 1, 1, choice1, choice2  # Ambos traem
    elif choice1 == "cooperate" and choice2 == "betray":
        return 0, 5, choice1, choice2  # Prisioneiro 1 coopera, Prisioneiro 2 trai
    else:
        return 5, 0, choice1, choice2  # Prisioneiro 1 trai, Prisioneiro 2 coopera

# Executa os rounds, acumula pontuação e exibe cada rodada
for round_num in range(1, rounds + 1):
    points1, points2, choice1, choice2 = play_round()
    score_prisoner1 += points1
    score_prisoner2 += points2

    # Armazenar pontuações acumuladas
    scores_prisoner1.append(score_prisoner1)
    scores_prisoner2.append(score_prisoner2)

    # Exibir resultados da rodada
    print(f"Rodada {round_num}:")
    print(f"  Prisioneiro 1 escolheu: {choice1} | Pontos nesta rodada: {points1}")
    print(f"  Prisioneiro 2 escolheu: {choice2} | Pontos nesta rodada: {points2}")
    print(f"  Pontuação acumulada - Prisioneiro 1: {score_prisoner1}, Prisioneiro 2: {score_prisoner2}")
    print("-" * 40)

# Resultados finais
print("Resultado Final:")
print(f"Pontuação final do Prisioneiro 1: {score_prisoner1}")
print(f"Pontuação final do Prisioneiro 2: {score_prisoner2}")

# Gerar gráfico da pontuação acumulada ao longo dos rounds
plt.figure(figsize=(12, 6))
plt.plot(scores_prisoner1, label="Prisioneiro 1", color='red')
plt.plot(scores_prisoner2, label="Prisioneiro 2", color='blue')
plt.title("Evolução da Pontuação Acumulada dos Prisioneiros")
plt.xlabel("Rodadas")
plt.ylabel("Pontuação Acumulada")
plt.legend()
plt.grid()
plt.show()</code></pre>



<p>Esse é o resultado de 5 partidas aleatórias, onde ocorreram 2 vitórias para o prisioneiro 2 e 3 vitórias para o prisioneiro 1:</p>



<p><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXebUqBcZ_8_sDuw4EPufRHKeLOqdLJLLpUYeNdSTIctB_Rxyy2uUIRJZYZVuGrh_UeHxW1invRqe98Wyq5OrK7qcMHMMly57Cw5CP3ZykGzC9serhbw-ocW7xuN-9veXjZlpc36maQjLNGVbx9-0CDU880?key=OLLPDFBT4KpuCuEfGbCoYyTD" width="345" height="111"></p>



<p><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXeoWU0fTXn8OKSnUYM3DRDrCh1NlJj8XaoAeRSLqbUbtloM893WRJ8wHXtTFsVHg-3DSiUboyLKoqlAKTG0Vazu6ipURYKQ2UBMBwtS4uF119t6alD8YK_sd39xLV8nQCvIZB7tWSXMSRxroctj8BGSwVQ?key=OLLPDFBT4KpuCuEfGbCoYyTD" width="345" height="107"></p>



<p><img decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXc32iRMG7uOnOGWP0Ne0tOWncdM5bVgDZMG3is2FQxD32HjpZw1PBd9SJpxdVGUOQMfLrIjBMQgabMi01AzJzhR07easAuBwGBrheyrlEh0_OW846xQZuHxcnVwPRn85VT-Xc42eVVjGRMaOoGAVt6V0YmS?key=OLLPDFBT4KpuCuEfGbCoYyTD" width="345" height="108"></p>



<p><img loading="lazy" decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXcGnI1shLnFlxF4ixkiJkjNwq_f03__jZlJyfOgywaJXfu6PPSPM63I1zFqqW0AtW9AJ30xyVKiEIBdLsNjSp7oE2RwFj2FdN5Pk99g9Psf2jBuC9ofAqSN1Ckw91H4V1cQ20VgIu-AiLEiYk5095D29QIR?key=OLLPDFBT4KpuCuEfGbCoYyTD" width="345" height="109"></p>



<p><img loading="lazy" decoding="async" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXdEY56HcSsZKHtWn8Uradh2SBCA_5jGNEOTcWPlbZI5AuydgvmRxAr_KQm_x-B9n3jky1or0USj-IZllOLW82KWTcN15WWIqruZ5-iICkjIEgP33iD-ZS_MPBUmOuvVyPOW4d-tZM5YjDRIO--R-hA4XoSh?key=OLLPDFBT4KpuCuEfGbCoYyTD" width="345" height="108"></p>



<p>Olhando para o gráfico abaixo, é possível observar que no comportamento aleatório, o acúmulo das pontuações está sempre muito próximo, o que é esperado.</p>



<p>Pela projeção de 1000 rodadas, é possível verificar que não é uma boa estratégia e que a chance de vitória é sempre de 50%, mas esse gráfico é interessante para compreender as próximas etapas.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1014" height="547" src="https://datauniverse.com.br/wp-content/uploads/2024/10/image-3.png" alt="" class="wp-image-2557" srcset="https://datauniverse.com.br/wp-content/uploads/2024/10/image-3.png 1014w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-3-300x162.png 300w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-3-768x414.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></figure>



<h2 class="wp-block-heading">Desenvolvendo o código em Python utilizando tensorflow.keras</h2>



<p>A lógica que foi desenvolvida acontece de forma que somente o primeiro prisioneiro irá receber o treinamento de aprendizado por reforço com Q-Learning enquanto que o segundo prisioneiro sempre irá tomar decisões aleatórias.</p>



<p>A ideia é que o primeiro prisioneiro aprenda a melhorar sua estratégia conforme ele aprende com as decisões do segundo.</p>



<p>Para implementar o Q-Learning usando TensorFlow (TF), vamos usar uma rede neural para aproximar a função Q. Esse método é conhecido como Deep Q-Learning (DQN) e é útil para problemas com espaço de estado grande ou contínuo, onde o uso de uma tabela Q tradicional seria inviável.</p>



<p>Neste exemplo do Dilema dos Prisioneiros, vamos configurar uma rede neural simples para estimar a Q-valor para cada ação (&#8220;cooperar&#8221; ou &#8220;trair&#8221;) com base na última ação do outro prisioneiro. Essa rede será treinada usando a biblioteca TensorFlow.</p>



<p>Para a Construção do Modelo Q, usamos uma rede neural de três camadas (duas ocultas e uma de saída) para prever o valor Q para cada ação. A entrada é o estado atual, que inclui a última ação do Prisioneiro 2 representada como um vetor one-hot.</p>



<pre class="wp-block-code"><code># Parâmetros do aprendizado
learning_rate = 0.01
discount_factor = 0.9
exploration_rate = 1.0
exploration_decay = 0.01
min_exploration_rate = 0.01
rounds = 1000

# Pontuação acumulada para cada prisioneiro
score_prisoner1 = 0
score_prisoner2 = 0

# Contadores de escolhas para cada prisioneiro
choices_count = {
    "prisoner1": {"cooperate": 0, "betray": 0},
    "prisoner2": {"cooperate": 0, "betray": 0}
}

# Definir ações
actions = &#91;"cooperate", "betray"]

# Converter ações para índices
action_to_index = {action: i for i, action in enumerate(actions)}

# Construir a rede neural para aproximar a função Q
def build_model(input_size, output_size):
    model = Sequential(&#91;
        Dense(24, input_dim=input_size, activation="relu"),
        Dense(24, activation="relu"),
        Dense(output_size, activation="linear")
    ])
    model.compile(optimizer=Adam(learning_rate=learning_rate), loss="mse")
    return model

# Modelo Q para o Prisioneiro 1
model = build_model(input_size=2, output_size=len(actions))

# Função para simular uma rodada do dilema dos prisioneiros
def play_round(prisoner1_choice, prisoner2_choice):
    if prisoner1_choice == "cooperate" and prisoner2_choice == "cooperate":
        return 3, 3  # Ambos cooperam
    elif prisoner1_choice == "betray" and prisoner2_choice == "betray":
        return 1, 1  # Ambos traem
    elif prisoner1_choice == "cooperate" and prisoner2_choice == "betray":
        return 0, 5  # Prisioneiro 1 coopera, Prisioneiro 2 trai
    else:
        return 5, 0  # Prisioneiro 1 trai, Prisioneiro 2 coopera

# Função para escolher a ação do Prisioneiro 1
def choose_action(state):
    if np.random.rand() &lt; exploration_rate:
        # Exploração: escolhe uma ação aleatória
        return random.choice(actions)
    else:
        # Exploração: escolhe a ação com maior valor Q estimado
        q_values = model.predict(state)
        return actions&#91;np.argmax(q_values&#91;0])]

# Executa os rounds
last_prisoner2_choice = random.choice(actions)

for round_num in range(1, rounds + 1):
    # Estado atual (última ação do Prisioneiro 2 em one-hot encoding)
    state = np.array(&#91;&#91;1 if last_prisoner2_choice == action else 0 for action in actions]])

    # Escolher a ação do Prisioneiro 1
    prisoner1_choice = choose_action(state)
    prisoner2_choice = random.choice(actions)

    # Contabilizar as escolhas
    choices_count&#91;"prisoner1"]&#91;prisoner1_choice] += 1
    choices_count&#91;"prisoner2"]&#91;prisoner2_choice] += 1

    # Jogar a rodada e obter a recompensa
    points1, points2 = play_round(prisoner1_choice, prisoner2_choice)
    score_prisoner1 += points1
    score_prisoner2 += points2

    # Próximo estado
    next_state = np.array(&#91;&#91;1 if prisoner2_choice == action else 0 for action in actions]])

    # Atualização do Q-valor
    target = points1 + discount_factor * np.max(model.predict(next_state)&#91;0])
    target_f = model.predict(state)
    target_f&#91;0]&#91;action_to_index&#91;prisoner1_choice]] = target

    # Treinar o modelo
    model.fit(state, target_f, epochs=1, verbose=0)

    # Atualizar a última escolha do Prisioneiro 2 para a próxima rodada
    last_prisoner2_choice = prisoner2_choice

    # Decaimento da taxa de exploração
    exploration_rate = max(min_exploration_rate, exploration_rate * exploration_decay)</code></pre>



<p><strong>Escolha de Ação</strong>: </p>



<p>A função choose_action usa uma política ε-greedy para escolher uma ação com base na previsão do modelo Q. Durante o treinamento, o agente explora mais, e com o tempo passa a explorar menos à medida que aprende.</p>



<p><strong>Atualização do Q-valor e Treinamento do Modelo</strong>: </p>



<p>Após cada rodada, calculamos o alvo para a ação escolhida, que é o valor de recompensa somado ao valor Q máximo esperado para o próximo estado. Esse valor é então usado para ajustar o modelo.</p>



<p><strong>Decaimento da Taxa de Exploração</strong>: </p>



<p>Após cada rodada, a taxa de exploração diminui, incentivando o agente a explorar menos conforme aprende.</p>



<p>Este modelo aproxima o comportamento de um agente Q-Learning com aprendizado por reforço, mas utiliza uma rede neural para aprender Q-valores ao invés de uma tabela Q.</p>



<h2 class="wp-block-heading">Motivos para o Decaimento da Taxa de Exploração</h2>



<p>A taxa de exploração no aprendizado por reforço decai com o tempo para permitir que o agente aprenda a <strong>explorar menos</strong> conforme ele acumula conhecimento do ambiente e <strong>explorar mais as ações que têm maior potencial de recompensa</strong>.</p>



<p>Se a taxa de exploração subisse com o tempo, o agente continuaria a tomar ações de forma aleatória mesmo quando ele já tivesse uma estratégia razoavelmente boa, o que impediria que ele convergisse para uma política estável.</p>



<p><strong>Exploração Inicial</strong>:</p>



<p>No início do treinamento, o agente tem pouca ou nenhuma informação sobre quais ações são melhores. Uma alta taxa de exploração (ε) permite que o agente experimente várias ações, conheça o ambiente e construa uma base inicial de conhecimento.</p>



<p><strong>Exploração x Exploração</strong>:</p>



<p>Conforme o treinamento avança, o agente já terá <strong>acumulado experiência</strong> e <strong>aprendido quais ações tendem a dar melhores recompensas</strong>. Se a taxa de exploração permanecer alta, o agente continuará a tomar decisões aleatórias, reduzindo a efetividade do aprendizado.</p>



<p>Diminuindo a exploração, o agente passa a <strong>confiar mais em seu aprendizado (exploração)</strong> e a escolher as ações que parecem mais promissoras com base nos valores Q já aprendidos.</p>



<p><strong>Convergência para uma Política Ótima</strong>:</p>



<p>O objetivo é que, ao final do treinamento, o agente seja capaz de seguir uma <strong>política ótima</strong>, ou seja, uma estratégia onde ele maximiza suas recompensas.</p>



<p>Um ε próximo de zero é desejável ao fim do treinamento, pois indica que o agente seguirá a política que ele acredita ser ótima, baseada nas recompensas que ele acumulou ao longo do tempo.</p>



<h3 class="wp-block-heading">Primeiros Rounds</h3>



<p>Nos primeiros rounds é possível observar que com uma taxa de exploração alta, o primeiro prisioneiro fica bem atrás do segundo nas pontuações e isso acontece até mais ou menos a rodada 50 onde el começa a aprender os padrões: </p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="439" height="704" src="https://datauniverse.com.br/wp-content/uploads/2024/10/image.png" alt="" class="wp-image-2554" srcset="https://datauniverse.com.br/wp-content/uploads/2024/10/image.png 439w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-187x300.png 187w" sizes="(max-width: 439px) 100vw, 439px" /></figure>



<h3 class="wp-block-heading">Resultados do treinamento com 1000 rounds</h3>



<p>Ao final do treinamento com 1000 rodadas o prisioneiro 1 consegue aprender que quanto mais ele escolher a opção de betray, mais ele aumenta as chances de ganhar.</p>



<p>Mesmo realizando diversos testes, o comportamento do aprendizado é o mesmo! Sempre que o prisioneiro 1 aprende que betray é a melhor estratégia por volta da rodada 50, ele começa a ganhar e disparar na pontuação.</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="289" height="154" src="https://datauniverse.com.br/wp-content/uploads/2024/10/image-2.png" alt="" class="wp-image-2556"/></figure>



<p>Ao final conseguimos visualizar a curva de aprendizado do prisioneiro 1</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1014" height="547" src="https://datauniverse.com.br/wp-content/uploads/2024/10/image-1.png" alt="" class="wp-image-2555" srcset="https://datauniverse.com.br/wp-content/uploads/2024/10/image-1.png 1014w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-1-300x162.png 300w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-1-768x414.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></figure>



<h2 class="wp-block-heading">Porque sempre escolher a opção de betray é matematicamente a estratégia predominante?</h2>



<p>Escolher a opção de &#8220;betray&#8221; (trair) no Dilema dos Prisioneiros é matematicamente vantajoso devido à análise de recompensas associadas a cada combinação de decisões dos prisioneiros. Vamos detalhar essa análise.</p>



<h3 class="wp-block-heading">Cenário do Dilema dos Prisioneiros</h3>



<p>Considere duas opções para cada prisioneiro: <strong>cooperate</strong> (cooperar) ou <strong>betray</strong> (trair). A tabela a seguir mostra as recompensas associadas a cada combinação de decisões:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Prisioneiro 1</th><th>Prisioneiro 2</th><th>Pontuação P1</th><th>Pontuação P2</th></tr></thead><tbody><tr><td>Cooperate</td><td>Cooperate</td><td>3</td><td>3</td></tr><tr><td>Cooperate</td><td>Betray</td><td>0</td><td>5</td></tr><tr><td>Betray</td><td>Cooperate</td><td>5</td><td>0</td></tr><tr><td>Betray</td><td>Betray</td><td>1</td><td>1</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Análise das Estratégias</h3>



<ol class="wp-block-list">
<li><strong>Se ambos cooperam</strong>:
<ul class="wp-block-list">
<li>Ambos recebem 3 pontos. Este é o cenário ótimo para ambos, mas requer confiança.</li>
</ul>
</li>



<li><strong>Se o Prisioneiro 1 coopera e o Prisioneiro 2 trai</strong>:
<ul class="wp-block-list">
<li>O Prisioneiro 1 recebe 0 pontos, enquanto o Prisioneiro 2 recebe 5 pontos.</li>



<li><strong>Perda máxima</strong> para o Prisioneiro 1, se ele confiar.</li>
</ul>
</li>



<li><strong>Se o Prisioneiro 1 trai e o Prisioneiro 2 coopera</strong>:
<ul class="wp-block-list">
<li>O Prisioneiro 1 recebe 5 pontos e o Prisioneiro 2 recebe 0 pontos.</li>



<li><strong>Máxima recompensa</strong> para o Prisioneiro 1, se o outro confiar.</li>
</ul>
</li>



<li><strong>Se ambos traem</strong>:
<ul class="wp-block-list">
<li>Ambos recebem 1 ponto. Este é um resultado pior do que ambos cooperarem, mas melhor do que a situação em que um coopera e o outro trai.</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading">Estratégia Dominante</h3>



<p>Matematicamente, a escolha de trair se torna a <strong>estratégia dominante</strong> para o Prisioneiro 1:</p>



<ul class="wp-block-list">
<li><strong>Se o Prisioneiro 2 escolher cooperar</strong>:
<ul class="wp-block-list">
<li>Trair (5 pontos) é melhor do que cooperar (3 pontos).</li>
</ul>
</li>



<li><strong>Se o Prisioneiro 2 escolher trair</strong>:
<ul class="wp-block-list">
<li>Trair (1 ponto) é melhor do que cooperar (0 pontos).</li>
</ul>
</li>
</ul>



<p>Portanto, independentemente da escolha do Prisioneiro 2, a opção de trair sempre resulta em uma pontuação igual ou maior para o Prisioneiro 1. Essa análise leva à conclusão de que trair é a estratégia mais vantajosa.</p>



<ul class="wp-block-list">
<li><strong>Teorema da Estratégia Dominante</strong>: A escolha de &#8220;betray&#8221; é a melhor estratégia para o Prisioneiro 1, pois maximiza a pontuação em relação à escolha do outro jogador, independentemente da ação que ele escolha.</li>



<li><strong>Resultados a Longo Prazo</strong>: Se o Prisioneiro 1 sempre trair, ele garante uma pontuação consistente e evita a possibilidade de perda máxima que ocorre quando coopera e o outro trai.</li>
</ul>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1014" height="547" src="https://datauniverse.com.br/wp-content/uploads/2024/10/image-4.png" alt="" class="wp-image-2558" srcset="https://datauniverse.com.br/wp-content/uploads/2024/10/image-4.png 1014w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-4-300x162.png 300w, https://datauniverse.com.br/wp-content/uploads/2024/10/image-4-768x414.png 768w" sizes="(max-width: 1014px) 100vw, 1014px" /></figure>



<p>Assim, a escolha de sempre trair (betray) é matematicamente fundamentada, pois, ao longo de várias iterações do jogo, essa estratégia levará a um desempenho superior, especialmente quando considerada a incerteza sobre as ações do oponente.</p>



<h2 class="wp-block-heading">Conclusão</h2>



<p>O que é mais curioso de ser observado de acordo com esse dilema e dadas suas condições, é que o aprendizado de máquina, simula de forma matemática, muitas das decisões individuais que são tomadas na sociedade e a estratégia dominante de sempre escolher a opção de trair ilustra a lógica do &#8220;racional egoísmo&#8221;, onde indivíduos optam por maximizar seus próprios benefícios em detrimento dos outros, resultando em um comportamento que pode minar a confiança nas relações interpessoais. </p>



<p>O dilema dos prisioneiros exemplifica a tensão entre interesses individuais e coletivos, refletindo como a escolha de trair ou cooperar pode se manifestar em interações sociais cotidianas. </p>



<p>Essa ideia é algo que vemos na sociedade, em situações como negociações, amizades ou até na política, onde a desconfiança pode levar a escolhas que, embora benéficas a curto prazo para um indivíduo, criam um ambiente de desconfiança generalizada.</p>



<p>Assim, a prevalência da traição como estratégia pode dificultar a formação de laços de confiança, essenciais para a colaboração e a construção de uma comunidade coesa, mostrando que a cooperação, embora menos intuitiva em um contexto competitivo, pode ser crucial para o bem-estar coletivo e a prosperidade a longo prazo.</p>



<p>Nele, a escolha de trair sempre parece a opção mais segura, mostrando que, muitas vezes, a gente pensa primeiro em si mesmo do que em quem está do lado. </p>



<h2 class="wp-block-heading">Referências</h2>



<ul class="wp-block-list">
<li><a href="https://en.wikipedia.org/wiki/Game_theory">https://en.wikipedia.org/wiki/Game_theory</a></li>



<li><a href="https://en.wikipedia.org/wiki/Prisoner%27s_dilemma">https://en.wikipedia.org/wiki/Prisoner%27s_dilemma</a></li>



<li><a href="https://medium.com/@shruti.dhumne/deep-q-network-dqn-90e1a8799871">https://medium.com/@shruti.dhumne/deep-q-network-dqn-90e1a8799871</a></li>
</ul>
<p>O post <a href="https://datauniverse.com.br/game-theory-prisioners-dilemma-utilizando-tensorflow-keras/">Game Theory: Prisioner&#8217;s Dilemma utilizando Deep Q-Learning (DQN) Tensorflow.Keras</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/game-theory-prisioners-dilemma-utilizando-tensorflow-keras/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Introdução à Machine Learning e I.A.</title>
		<link>https://datauniverse.com.br/introducao-a-machine-learning-e-i-a/</link>
					<comments>https://datauniverse.com.br/introducao-a-machine-learning-e-i-a/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Mon, 04 Mar 2024 01:27:11 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<guid isPermaLink="false">https://dataisle.co/?p=2169</guid>

					<description><![CDATA[<p>O Aprendizado de Máquina (Machine Learning, em inglês) representa um subcampo da Inteligência Artificial que capacita máquinas a aprenderem com dados, substituindo a programação explícita. Em síntese, os algoritmos de aprendizado de máquina permitem que sistemas realizem previsões ou tomem decisões fundamentadas em dados, evoluindo automaticamente com a experiência adquirida. Aplicações Pioneiras O aprendizado de [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/introducao-a-machine-learning-e-i-a/">Introdução à Machine Learning e I.A.</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>O Aprendizado de Máquina (Machine Learning, em inglês) representa um subcampo da Inteligência Artificial que capacita máquinas a aprenderem com dados, substituindo a programação explícita. Em síntese, os algoritmos de aprendizado de máquina permitem que sistemas realizem previsões ou tomem decisões fundamentadas em dados, evoluindo automaticamente com a experiência adquirida.</p>



<h2 class="wp-block-heading">Aplicações Pioneiras</h2>



<p>O aprendizado de máquina tem vasta aplicabilidade, desde sistemas de recomendação online até diagnósticos médicos e veículos autônomos. Outras áreas incluem processamento de linguagem natural, visão computacional e análise de sentimentos em textos.</p>



<p><strong>Desafios e Considerações</strong></p>



<p>Apesar das amplas aplicações, desafios como overfitting, viés nos dados e complexidade computacional persistem. Reconhecer esses fundamentos é crucial para explorar eficazmente temas avançados e aplicar técnicas de maneira eficiente em projetos próprios.</p>



<h2 class="wp-block-heading">Diversidade nos Tipos de Aprendizado de Máquina</h2>



<p>Existem três categorias principais de aprendizado de máquina: supervisionado, não supervisionado e por reforço.</p>



<p><strong>1. Aprendizado Supervisionado</strong></p>



<p>Este é o tipo mais comum, onde o algoritmo se instrui a partir de um conjunto de dados rotulado. A finalidade é identificar uma função que relaciona entradas a saídas. Exemplos incluem regressão linear e máquinas de vetores de suporte.</p>



<p><strong>2. Aprendizado Não Supervisionado</strong></p>



<p>Aqui, o algoritmo é treinado em dados não rotulados, sendo incumbido de descobrir padrões intrínsecos. Algoritmos de clustering e técnicas de redução de dimensionalidade são exemplos nesse contexto.</p>



<p><strong>3. Aprendizado por Reforço</strong></p>



<p>Nesse cenário, um agente aprende a otimizar seu comportamento em um ambiente para maximizar recompensas acumulativas. Aplicações incluem sistemas de recomendação e estratégias de navegação para robôs.</p>



<h2 class="wp-block-heading">Etapa Crucial: Preparação de Dados</h2>



<p><strong>1. A Essencial Preparação de Dados</strong></p>



<p>Antes de adentrarmos nos algoritmos de aprendizado de máquina, a compreensão da importância da preparação de dados é imperativa. O ditado &#8220;Lixo entra, lixo sai&#8221; ressalta que a qualidade dos insights gerados é diretamente proporcional à qualidade dos dados.</p>



<p><strong>2. Limpeza de Dados</strong></p>



<p>A primeira etapa consiste na limpeza dos dados, envolvendo remoção ou correção de imprecisões, incompletudes ou irrelevâncias. Técnicas como tratamento de valores ausentes e remoção de outliers são fundamentais nesse processo.</p>



<p><strong>3. Transformação de Dados</strong></p>



<p>Após a limpeza, a transformação de dados se faz necessária, abrangendo técnicas como <a href="https://datauniverse.com.br/normalizacao-vs-desnormalizacao-de-dados/">normalização</a>, padronização e codificação de variáveis categóricas.</p>



<p><strong>4. Divisão de Dados</strong></p>



<p>A etapa final envolve a divisão dos dados em conjuntos de treinamento e teste, ou, ocasionalmente, validação. Essa prática possibilita a avaliação do desempenho do modelo em dados não vistos, garantindo uma modelagem mais robusta e precisa.</p>



<p>A preparação de dados é essencial para o sucesso na modelagem de aprendizado de máquina, garantindo eficiência e acurácia nos resultados.</p>



<h2 class="wp-block-heading">Explorando Algoritmos de Aprendizado de Máquina</h2>



<p><strong>1. Regressão Linear</strong></p>



<p>A Regressão Linear, algoritmo supervisionado, analisa relações entre variáveis e prevê resultados futuros com base em dados históricos. É aplicável em análise de tendências, sendo útil para decisões informadas durante transações.</p>



<p><strong>2. Árvores de Decisão</strong></p>



<p>Árvores de Decisão resolvem problemas de classificação e regressão, dividindo iterativamente dados com base em características. São valiosas na análise de relações entre variáveis e na identificação de fatores-chave em resultados.</p>



<p><strong>3. K-Vizinhos mais Próximos (KNN)</strong></p>



<p>O algoritmo KNN, supervisionado, prevê classificações ou valores baseando-se na proximidade de pontos de dados. Aplicável na previsão de comportamento de mercado e identificação de padrões com base em históricos.</p>



<p><strong>4. Redes Neurais Artificiais</strong></p>



<p>Inspiradas no cérebro humano, as Redes Neurais Artificiais possuem camadas de neurônios que processam informações e aprendem com dados de entrada. Adequadas para prever preços, detectar fraudes e otimizar estratégias de negociação.</p>



<p>Exploramos quatro algoritmos amplamente utilizados na análise de dados, destacando sua aplicabilidade no contexto de negociação. O entendimento dessas técnicas proporciona vantagem competitiva e decisões mais informadas.</p>



<h2 class="wp-block-heading">Aprofundando nos Modelos de Aprendizado de Máquina</h2>



<p><strong>1. Validação de Modelos</strong></p>



<p>A validação de modelos é essencial para avaliar o desempenho do modelo treinado. Técnicas incluem a divisão de dados em conjuntos de treinamento e teste, validação cruzada k-fold e validação cruzada de repetição aleatória.</p>



<p><strong>2. Otimização de Hiperparâmetros</strong></p>



<p>Hiperparâmetros, definidos antes do treinamento, impactam o desempenho do modelo. A otimização envolve testar diferentes combinações de valores, utilizando técnicas como pesquisa em grade, pesquisa aleatória e otimização bayesiana.</p>



<p><strong>3. Seleção de Recursos</strong></p>



<p>Identificar e selecionar os recursos mais relevantes melhora a eficiência e precisão do modelo. Técnicas incluem filtragem, seleção baseada em envoltório e seleção baseada em incorporação.</p>



<p><strong>4. Aplicação e Avaliação em Dados Reais</strong></p>



<p>Após treinamento e otimização, aplicar o modelo a dados reais é crucial. Métricas como precisão, recall, F1-score e erro médio quadrático são utilizadas para avaliar o desempenho, considerando também interpretabilidade e facilidade de implementação.</p>



<p>A validação de modelos, otimização de hiperparâmetros, seleção de recursos e aplicação em dados reais são fundamentais para garantir eficácia e confiabilidade em modelos de aprendizado de máquina no contexto de negociação.</p>



<h2 class="wp-block-heading">Referências:</h2>



<ul class="wp-block-list">
<li>https://awari.com.br</li>
</ul>
<p>O post <a href="https://datauniverse.com.br/introducao-a-machine-learning-e-i-a/">Introdução à Machine Learning e I.A.</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/introducao-a-machine-learning-e-i-a/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Clusterização com K-means em Python utilizando Elbow Method</title>
		<link>https://datauniverse.com.br/clusterizacao-com-k-means-em-python-utilizando-elbow-method/</link>
					<comments>https://datauniverse.com.br/clusterizacao-com-k-means-em-python-utilizando-elbow-method/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Sun, 03 Sep 2023 18:35:34 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Projetos]]></category>
		<guid isPermaLink="false">https://alexandrepolselli.com.br/?p=1660</guid>

					<description><![CDATA[<p>Clustering, também conhecido como agrupamento, refere-se à aplicação de técnicas de machine learning destinadas a dividir um conjunto de dados em diversos clusters ou grupos distintos, tendo como critério principal a semelhança entre os dados. Em contraste com algoritmos de classificação e regressão, o clustering é uma técnica simples da aprendizagem não supervisionada, uma vez [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/clusterizacao-com-k-means-em-python-utilizando-elbow-method/">Clusterização com K-means em Python utilizando Elbow Method</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" open><summary>Detalhes do projeto</summary>
<ul class="wp-block-list">
<li><strong>Link do projeto no Github:</strong> <a href="https://github.com/cerqueiralex/kmeans-elbow-method" target="_blank" rel="noreferrer noopener">https://github.com/cerqueiralex/kmeans-elbow-method</a></li>



<li><strong>Tecnologias:</strong> Python, Scikit Learn, Pandas, Numpy, Plotly, Matplotlib</li>



<li><strong>Categorias:</strong> Estatística</li>
</ul>
</details>



<p>Clustering, também conhecido como agrupamento, refere-se à aplicação de técnicas de machine learning destinadas a dividir um conjunto de dados em diversos clusters ou grupos distintos, tendo como critério principal a semelhança entre os dados. </p>



<p>Em contraste com algoritmos de classificação e regressão, o clustering é uma técnica simples da aprendizagem não supervisionada, uma vez que os algoritmos envolvidos precisam discernir as relações intrínsecas entre os dados, sem depender de rótulos prévios que indiquem a que categoria pertencem.</p>



<p>Por meio de clustering, é possível extrair informações valiosas e insights que muitas vezes não seriam perceptíveis por meio de abordagens de aprendizado supervisionado.</p>



<h2 class="wp-block-heading">K-means</h2>



<p>K-Means é um algoritmo de agrupamento iterativo que busca encontrar centróides ótimos para criar clusters em um conjunto de dados. Ele itera até que os centróides não mudem substancialmente, e nesse ponto, os clusters resultantes são considerados estáveis e representam grupos distintos com base nas semelhanças entre os dados.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/kmeans.gif" alt="" class="wp-image-1664" style="width:750px;height:562px"/><figcaption class="wp-element-caption"><a href="http://shabal.in/visuals/kmeans/2.html" target="_blank" rel="noreferrer noopener">fonte: shabal</a></figcaption></figure>



<p>O algoritmo opera seguindo os seguintes passos:</p>



<p><strong>Inicialização:</strong> O algoritmo escolhe aleatoriamente K pontos a partir dos dados, onde K é o número de clusters predefinido como parâmetro. Esses pontos iniciais atuam como os centros dos clusters &#8220;provisórios&#8221; antes de qualquer ajuste.</p>



<p><strong>Atribuição de Clusters:</strong> Cada ponto de dado é avaliado para determinar a sua proximidade ao centróide mais próximo. Isso resulta na divisão dos dados em clusters, onde cada cluster é composto pelos pontos mais próximos ao centróide associado.</p>



<p><strong>Atualização dos Centróides:</strong> Os novos valores para os centróides são calculados como a média dos dados contidos em cada cluster. Isso significa que o centro de cada cluster é recalculado com base nos pontos que o compõem.</p>



<p><strong>Iteração: </strong>O processo de encontrar centróides e atualizar clusters é repetido. Os centróides são recalculados, os pontos são reatribuídos aos clusters com base na proximidade aos novos centróides e os centróides são novamente atualizados pela média dos pontos do cluster.</p>



<p><strong>Convergência:</strong> O algoritmo continua a iterar até que a posição dos centróides não mude mais. Isso indica que os centróides convergiram para suas posições finais e que os clusters estão estáveis.</p>



<p>Este processo é repetido até que os centróides se estabilizem, e os clusters alcancem uma configuração na qual não haja mais alterações significativas. </p>



<p>A abordagem que o algoritmo K-Means segue para resolver o problema é chamada Expectation-Maximization (Expectativa-Maximização). A etapa E é atribuir os pontos de dados ao cluster mais próximo. </p>



<p>A etapa M é calcular o centróide de cada cluster. Abaixo está uma quebra de como podemos resolver isso matematicamente:</p>



<p>A função é:</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-1.png" alt="" class="wp-image-1667"/><figcaption class="wp-element-caption"><a href="https://towardsdatascience.com/k-means-clustering-algorithm-applications-evaluation-methods-and-drawbacks-aa03e644b48a" target="_blank" rel="noreferrer noopener">fonte: Imad Dabbura</a></figcaption></figure>



<p>Onde wik=1 para o ponto de dados xi se ele pertencer ao cluster k; caso contrário, wik=0. Além disso, μk é o centróide do cluster de xi.</p>



<p>É um problema de minimização de duas partes. Primeiro, minimizamos J com relação a wik e tratamos μk como fixo. Em seguida, minimizamos J com relação a μk e tratamos wik como fixo. Tecnicamente falando, diferenciamos J com relação a wik primeiro e atualizamos as atribuições de cluster (etapa E). </p>



<p>Em seguida, diferenciamos J com relação a μk e recalculamos os centróides após as atribuições de cluster da etapa anterior (etapa M). Portanto, a etapa E é:</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-2.png" alt="" class="wp-image-1668"/><figcaption class="wp-element-caption"><a href="https://towardsdatascience.com/k-means-clustering-algorithm-applications-evaluation-methods-and-drawbacks-aa03e644b48a" target="_blank" rel="noreferrer noopener">fonte: Imad Dabbura</a></figcaption></figure>



<p>Em outras palavras, atribuimos o ponto de dados xi ao cluster mais próximo, julgado pela soma das distâncias quadradas do centróide do cluster.</p>



<p>E a etapa M é:</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-3.png" alt="" class="wp-image-1669" style="width:750px;height:116px"/><figcaption class="wp-element-caption"><a href="https://towardsdatascience.com/k-means-clustering-algorithm-applications-evaluation-methods-and-drawbacks-aa03e644b48a" target="_blank" rel="noreferrer noopener">fonte: Imad Dabbura</a></figcaption></figure>



<p>O que se traduz em recalcular o centróide de cada cluster para refletir as novas atribuições.</p>



<h2 class="wp-block-heading">Elbow method</h2>



<p>Simplesmente olhando para os dados em um scatterplot, em alguns casos é possível estimar a olho nu a quantidade de centróides ideal para ser aplicada no conjunto de dados como é possível observar na figura a seguir.</p>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-13.png" alt="" class="wp-image-1686" style="width:400px;height:450px"/><figcaption class="wp-element-caption"><a href="https://medium.com/turing-talks/clustering-conceitos-b%C3%A1sicos-principais-algoritmos-e-aplica%C3%A7%C3%A3o-ace572a062a9" target="_blank" rel="noreferrer noopener">fonte: turing talks</a></figcaption></figure>



<p>Aqui podemos estimar que o número ideal de centróides seria igual a 5, por causa dos grandes grupos, o que resultaria no seguinte agrupamento:</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-14.png" alt="" class="wp-image-1687"/><figcaption class="wp-element-caption"><a href="https://medium.com/turing-talks/clustering-conceitos-b%C3%A1sicos-principais-algoritmos-e-aplica%C3%A7%C3%A3o-ace572a062a9" target="_blank" rel="noreferrer noopener">fonte: turing talks</a></figcaption></figure>



<p>Porém como podemos saber o número ideal do ponto de vista matemático?</p>



<p>Um passo fundamental para qualquer algoritmo não supervisionado é determinar o número ideal de agrupamentos nos quais os dados podem ser divididos. </p>



<p>Como não temos um número pré-definido de agrupamentos no aprendizado não supervisionado, tendemos a utilizar algum método que nos ajude a decidir o melhor número de agrupamentos. No caso do agrupamento K-Means, usamos o Elbow-Method.</p>



<p>Ele leva esse nome justamente por se assemelhar a um &#8220;cotovelo&#8221; conforme é possível de se observar na figura abaixo.</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image.png" alt="" class="wp-image-1665"/></figure>



<h3 class="wp-block-heading">O que é o Elbow-Method no Agrupamento K-Means</h3>



<p>No algoritmo de agrupamento K-Means, inicializamos aleatoriamente k agrupamentos e ajustamos iterativamente esses k agrupamentos até que os k-centróides alcancem um estado de equilíbrio. No entanto, a coisa principal que fazemos antes de inicializar esses agrupamentos é determinar quantos agrupamentos devemos usar.</p>



<p>Neste método, para determinar o valor de k, iteramos continuamente de k=1 até k=n (onde n é o hiperparâmetro que escolhemos de acordo com nossos requisitos). Para cada valor de k, calculamos o valor da soma dos quadrados dentro do agrupamento (WCSS).</p>



<p>WCSS &#8211; É definido como a soma das distâncias quadradas entre os centróides e cada ponto.</p>



<p>Agora, para determinar o melhor número de agrupamentos (k), traçamos um gráfico de k versus o valor de WCSS correspondente.</p>



<p>Além disso, quando k=1, o WCSS tem o valor mais alto, mas, à medida que o valor de k aumenta, o valor do WCSS começa a diminuir. <strong>Escolhemos o valor de k observando no gráfico em que ponto ele começa a se assemelhar a uma linha reta.</strong></p>



<h2 class="wp-block-heading">Construindo uma visualização em Python</h2>



<p>Começamos importando as bibliotecas que iremos utilizar. A biblioteca do KMeans do Sklearn, pandas para tratar a base, numpy para os np arrays e matplotlib para a visualização final dos gráficos.</p>



<p><a href="https://github.com/cerqueiralex/kmeans-elbow-method" target="_blank" rel="noreferrer noopener">O link do github deste projeto está disponível aqui</a></p>



<pre class="wp-block-code"><code>from sklearn.cluster import KMeans
from sklearn import metrics
from scipy.spatial.distance import cdist
import numpy as np
import matplotlib.pyplot as plt</code></pre>



<p>O dataset utilizado é o <a href="https://www.kaggle.com/datasets/vjchoudhary7/customer-segmentation-tutorial-in-python?resource=download" target="_blank" rel="noreferrer noopener">mall_customers.csv</a> disponível no kaggle. Este conjunto de dados foi criado apenas para fins de aprendizado dos conceitos de segmentação de clientes, também conhecido como &#8220;análise de cesta de mercado&#8221;. </p>



<pre class="wp-block-code"><code>from google.colab import files
files.upload()
df = pd.read_csv ("Mall_Customers.csv")</code></pre>



<p>Usamos essa função para importar o dataset e defini-lo na variável &#8220;df&#8221;.</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/Sem-Titulo-2-1024x439.png" alt="" class="wp-image-1672"/></figure>



<p>Ao imprimir o dataset é possível verificar que ele possui 5 dimensões, mas só preciso utilizar 2 delas que são o salário anual (Annual Income) e o score de gastos (spending score). Então eu vou tratar o dataset aqui mesmo com o pandas.</p>



<pre class="wp-block-code"><code>df = df.drop(columns=&#91;'Gender','CustomerID','Age'])
print('Modified DataFrame:\n', df)</code></pre>



<p>Vamos montar agora o código que treina o modelo:</p>



<pre class="wp-block-code"><code>distortions = &#91;]
inertias = &#91;]
mapping1 = {}
mapping2 = {}
K = range(1, 10)

for k in K:
	# Construindo e treinando o modelo
	kmeanModel = KMeans(n_clusters=k).fit(X)
	kmeanModel.fit(X)

	distortions.append(sum(np.min(cdist(X, kmeanModel.cluster_centers_,
										'euclidean'), axis=1)) / X.shape&#91;0])
	inertias.append(kmeanModel.inertia_)

	mapping1&#91;k] = sum(np.min(cdist(X, kmeanModel.cluster_centers_,
								'euclidean'), axis=1)) / X.shape&#91;0]
	mapping2&#91;k] = kmeanModel.inertia_</code></pre>



<p>Aqui calculamos as métricas de distorção e inércia para diferentes valores de K (número de clusters) e armazenamos essas métricas em listas e dicionários.</p>



<p><code>distortions</code> e <code>inertias</code> são listas vazias que serão usadas para armazenar as métricas de distorção e inércia, respectivamente.</p>



<p><code>mapping1</code> e <code>mapping2</code> são dicionários vazios que serão usados para mapear os valores de K para suas métricas de distorção e inércia correspondentes.</p>



<p><code>K</code> é uma lista que contém valores de K de 1 a 9 (ou seja, de 1 a 9 clusters) que serão testados.</p>



<p>O loop <code>for k in K:</code> itera sobre os diferentes valores de K.</p>



<p>Dentro do loop, o modelo K-Means é construído e treinado com o número atual de clusters definido por <code>k</code>:</p>



<pre class="wp-block-code"><code>kmeanModel = KMeans(n_clusters=k).fit(X)
kmeanModel.fit(X)</code></pre>



<p>Isso cria uma instância do modelo K-Means com o número atual de clusters e o ajusta aos dados <code>X</code>.</p>



<p>A distorção é calculada para o valor de K atual com a fórmula:</p>



<pre class="wp-block-code"><code>sum(np.min(cdist(X, kmeanModel.cluster_centers_, 'euclidean'), axis=1)) / X.shape&#91;0]</code></pre>



<p>Essa fórmula calcula a média das distâncias euclidianas mínimas entre cada ponto de dados e os centros dos clusters mais próximos.</p>



<p>A inércia é calculada para o valor de K atual com <code>kmeanModel.inertia_</code>. A inércia é a soma das distâncias quadráticas entre os pontos de dados e os centros dos clusters.</p>



<p>As métricas de distorção e inércia calculadas são armazenadas nas listas <code>distortions</code> e <code>inertias</code>, respectivamente.</p>



<p>Os valores de K e suas métricas de distorção e inércia correspondentes são armazenados nos dicionários <code>mapping1</code> e <code>mapping2</code>, respectivamente, para análise posterior.</p>



<p>No final do loop, você terá listas contendo as métricas de distorção e inércia para diferentes valores de K, bem como dicionários que mapeiam os valores de K para essas métricas. Aqui queremos determinar o número ideal de clusters em uma análise de cluster K-Means.</p>



<p>Vamos tabular e visualizar os resultados agora utilizando os diferentes valores de distortion para o dicionário mapping1:</p>



<pre class="wp-block-code"><code>for key, val in mapping1.items():
	print(f'{key} : {val}')</code></pre>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-4.png" alt="" class="wp-image-1673" style="width:343px;height:183px"/></figure>



<p>Plotamos em um gráfico agora os dados acima:</p>



<pre class="wp-block-code"><code>plt.plot(K, distortions, 'bx-')
plt.xlabel('Values of K')
plt.ylabel('Distortion')
plt.title('The Elbow Method using Distortion')
plt.show()</code></pre>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-5.png" alt="" class="wp-image-1674" style="width:567px;height:455px"/></figure>



<p>Utilizando agora os diferentes valores de inércia para o dicionário mapping2:</p>



<pre class="wp-block-code"><code>for key, val in mapping2.items():
	print(f'{key} : {val}')</code></pre>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-6.png" alt="" class="wp-image-1675" style="width:313px;height:205px"/></figure>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/Sem-Titulo.png" alt="" class="wp-image-1670" style="width:569px;height:453px"/></figure>



<p>Para determinar o número ideal de clusters, devemos selecionar o valor de k no &#8220;cotovelo&#8221;, ou seja, o ponto após o qual a distorção/inércia começa a diminuir de maneira linear. Assim, para os dados fornecidos, concluímos que o número ideal de clusters para os dados é 5.</p>



<p>De forma resumida para o código a seguir,  iremos plotar imagens dos pontos de dados agrupados para diferentes valores de k. Para isso, aplicaremos o algoritmo K-Means no conjunto de dados, iterando em uma faixa de valores de k.</p>



<p>Na range, colocamos o número que conseguimos através do Elbow-Method que foi 5</p>



<pre class="wp-block-code"><code># Cria um range de valores para k
k_range = range(1, 6)

# Iniciamos uma lista vazia para armazenar os valores de inércia para cada K
inertia_values = &#91;]

# Treinamos e plotamos os dados para cada valor de k
for k in k_range:
	kmeans = KMeans(n_clusters=k, \
					init='k-means++', random_state=42)
	y_kmeans = kmeans.fit_predict(X)
	inertia_values.append(kmeans.inertia_)
 
#Gráfico Matplotlib
	plt.scatter(X&#91;:, 0], X&#91;:, 1], c=y_kmeans)
	plt.scatter(kmeans.cluster_centers_&#91;:, 0],\
				kmeans.cluster_centers_&#91;:, 1], \
				s=100, c='red')
	plt.title('K-means clustering (k={})'.format(k))
	plt.xlabel('Feature 1')
	plt.ylabel('Feature 2')
	plt.show()

# Plota os valores de inércia para cada k
plt.plot(k_range, inertia_values, 'bo-')
plt.title('Elbow Method')
plt.xlabel('Number of clusters (k)')
plt.ylabel('Inertia')
plt.show()</code></pre>



<h2 class="wp-block-heading">Resultado final:</h2>



<p>Aqui é possível visualizar o resultado final com a plotagem iterativa de todos os gráficos para cada valor de K e os respectivos centróides.</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-8.png" alt="" class="wp-image-1680"/></figure>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-9.png" alt="" class="wp-image-1681"/></figure>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-10.png" alt="" class="wp-image-1682"/></figure>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-11.png" alt="" class="wp-image-1683"/></figure>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/09/image-12.png" alt="" class="wp-image-1684"/></figure>



<h2 class="wp-block-heading">Conclusão</h2>



<p>Você é o proprietário de um shopping e deseja compreender os perfis dos seus clientes e quem pode ser facilmente convertido (Clientes-Alvo).</p>



<p>Utilizando o dataset de score de pontuação financeira, utilizamos o algoritmo do Elbow-Method para encontrar o número da referência ideal de centróides e aplicamos isso no algoritmo de aprendizado de máquina não supervisionado K-means para criar os clusters e identificar quais são os perfis de clientes de modo que isso possa ser transmitido à equipe de marketing e que a estratégia seja planejada de acordo.</p>



<h2 class="wp-block-heading">Referências</h2>



<ul class="wp-block-list">
<li>https://www.kaggle.com/datasets/vjchoudhary7/customer-segmentation-tutorial-in-python</li>



<li>http://shabal.in/visuals/kmeans/2.html</li>



<li>https://www.geeksforgeeks.org/elbow-method-for-optimal-value-of-k-in-kmeans/</li>



<li>https://en.wikipedia.org/wiki/Cluster_analysis</li>



<li>https://towardsdatascience.com/k-means-clustering-algorithm-applications-evaluation-methods-and-drawbacks-aa03e644b48a</li>



<li>https://medium.com/turing-talks/clustering-conceitos-b%C3%A1sicos-principais-algoritmos-e-aplica%C3%A7%C3%A3o-ace572a062a9</li>
</ul>
<p>O post <a href="https://datauniverse.com.br/clusterizacao-com-k-means-em-python-utilizando-elbow-method/">Clusterização com K-means em Python utilizando Elbow Method</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/clusterizacao-com-k-means-em-python-utilizando-elbow-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Análise Estatística e treinamento de modelo preditivo de Machine Learning com regressão linear OLS em python: Relação entre a área de imóveis e o valor do aluguel</title>
		<link>https://datauniverse.com.br/analise-estatistica-exploratoria-com-statsmodels-relacao-entre-a-area-de-imoveis-e-o-valor-do-aluguel/</link>
					<comments>https://datauniverse.com.br/analise-estatistica-exploratoria-com-statsmodels-relacao-entre-a-area-de-imoveis-e-o-valor-do-aluguel/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Tue, 09 May 2023 03:34:00 +0000</pubDate>
				<category><![CDATA[Machine Learning]]></category>
		<category><![CDATA[Projetos]]></category>
		<guid isPermaLink="false">https://alexandrepolselli.com.br/?p=1428</guid>

					<description><![CDATA[<p>Este é um projeto de análise estatística exploratória utilizando o statsmodels e scikitlearn com uma base de dados fictícia para trabalhar o seguinte problema: Existe alguma relação entre a área de imóveis (em metros quadrados) e o valor do aluguel em uma determinada cidade? Caso exista relação, como podemos mensurá-la? Para atacar esse problema de [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/analise-estatistica-exploratoria-com-statsmodels-relacao-entre-a-area-de-imoveis-e-o-valor-do-aluguel/">Análise Estatística e treinamento de modelo preditivo de Machine Learning com regressão linear OLS em python: Relação entre a área de imóveis e o valor do aluguel</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<details class="wp-block-details is-layout-flow wp-block-details-is-layout-flow" open><summary>Detalhes do projeto</summary>
<ul class="wp-block-list">
<li><strong>Link do projeto no Github:</strong> <a href="https://github.com/cerqueiralex/machine-learning-previsao-aluguel" target="_blank" rel="noreferrer noopener">https://github.com/cerqueiralex/machine-learning-previsao-aluguel</a></li>



<li><strong>Tecnologias:</strong> Python, Pandas, Numpy, Matplotlib, Seaborn,Statsmodels, Scikit learn</li>



<li><strong>Categorias:</strong> Estatística</li>
</ul>
</details>



<p>Este é um projeto de análise estatística exploratória utilizando o statsmodels e scikitlearn com uma base de dados fictícia para trabalhar o seguinte problema: Existe alguma relação entre a área de imóveis (em metros quadrados) e o valor do aluguel em uma determinada cidade? Caso exista relação, como podemos mensurá-la?</p>



<p>Para atacar esse problema de forma didática, primeiro iremos realizar uma análise estatística exploratória com regressão linear simples através do método Ordinary Least Squares que será explicado mais adiante e em seguida utilizaremos o mesmo método para treinar um modelo de previsão de machine learning que irá tentar prever o provável valor de um aluguel baseado na area em m² de um imóvel.</p>



<p>Primeiro as bibliotecas que iremos trabalhar:</p>



<pre class="wp-block-code"><code># Imports
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split</code></pre>



<p>O objetivo inicial é utilizar as bibliotecas do pandas para importar os dados, matplotlib e seaborn para gerar alguns gráficos exploratórios e o statsmodels pra fazer uma regressão linear simples na fase analítica.</p>



<p>Em seguida utilizamos o numpy para criar os arrays de machinelearning e o sklearn para treinar o modelo e realizar um deploy.</p>



<h2 class="wp-block-heading">Carregando os dados e fazendo análise exploratória</h2>



<p>Carregamos  então o dataset em csv e analisamos sua estrutura</p>



<pre class="wp-block-code"><code># Carrega o dataset
df_dsa = pd.read_csv('dataset.csv')

df = pd.read_csv(path)
df.describe</code></pre>



<p>Esse é um pequeno dataset como podemos ver que possui somente 3000 linhas x 7 colunas</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image.png" alt="" class="wp-image-1430"/></figure>



<p>O dataset possui diversas dimensões, porém somente iremos utilizar o valor do aluguel e a área em m2. Como pode ver, essas são as dimensões disponíveis no dataset:</p>



<ul class="wp-block-list">
<li>&#8216;valor_aluguel&#8217;, </li>



<li>&#8216;area_m2&#8217;, </li>



<li>&#8216;ano_construcao&#8217;, </li>



<li>&#8216;codigo_localidade&#8217;,</li>



<li>&#8216;numero_banheiros&#8217;, </li>



<li>&#8216;numero_cozinhas&#8217;, </li>



<li>&#8216;codigo_bairro&#8217;</li>
</ul>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-1.png" alt="" class="wp-image-1432"/></figure>



<p>Agora vamos analisar qual é o valor médio dos aluguéis com o comando histplot:</p>



<pre class="wp-block-code"><code># sns.histplot = chama o método histplot do seaborn 
sns.histplot(data = df, x = "valor_aluguel", kde = True)</code></pre>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-2.png" alt="" class="wp-image-1433"/></figure>



<p>É possível observar que a maior parte dos valores de aluguel gira em torno da casa dos 300 a 400 reais.</p>



<p>Através do método &#8220;<strong>corr</strong>&#8221; podemos facilmente analisar uma matriz de correlação entre as dimensões do nosso dataset para entender o valor que iremos trabalhar com nossas dimensões de entrada e saída.</p>



<pre class="wp-block-code"><code># Correlação entre as variáveis
df.corr()</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-4.png" alt="" class="wp-image-1435"/></figure>



<p>O coeficiente de correlação é uma medida estatística que indica a força e a direção da relação linear entre duas variáveis numéricas. Ele varia entre -1 e 1, onde:</p>



<p>Um coeficiente de correlação igual a 1 indica uma correlação linear perfeita positiva, ou seja, quando uma variável aumenta, a outra variável também aumenta na mesma proporção.</p>



<p>Um coeficiente de correlação igual a -1 indica uma correlação linear perfeita negativa, ou seja, quando uma variável aumenta, a outra variável diminui na mesma proporção.</p>



<p>Um coeficiente de correlação igual a 0 sugere que não há correlação linear entre as duas variáveis.</p>



<p>O coeficiente de correlação mais comum é o de Pearson, que mede a correlação linear entre duas variáveis. Existem outras medidas de correlação, como o coeficiente de correlação de Spearman, que avalia a relação monotônica entre duas variáveis, e o coeficiente de correlação de Kendall, que considera a concordância entre os rankings das variáveis.</p>



<p>Nesse caso temos uma correlação de 58% que é bem fraca.</p>



<p>Agora vamos visualizar isso em um gráfico scatterplot para analisar a distribuição desses dados nas dimensões x e y.</p>



<pre class="wp-block-code"><code># Vamos analisar a relação entre a variável de entrada area_m2 e a variável alvo valor_aluguel
sns.scatterplot(data = df_dsa, x = "area_m2", y = "valor_aluguel")</code></pre>



<figure class="wp-block-image aligncenter size-full is-resized"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-5.png" alt="" class="wp-image-1436" style="width:596px;height:455px"/></figure>



<h2 class="wp-block-heading">Regressão Linear Simples</h2>



<p>A Regressão Linear é uma técnica estatística utilizada para modelar a relação entre uma variável dependente (também chamada de variável resposta ou variável alvo) e uma ou mais variáveis independentes (também chamadas de variáveis explicativas ou preditoras).</p>



<p>A Regressão Linear tem como objetivo estimar os coeficientes da equação que melhor descreve essa relação, minimizando a soma dos erros quadráticos entre os valores observados e os valores previstos pelo modelo.</p>



<p>Existem dois tipos principais de regressão linear:</p>



<p><strong>Regressão Linear Simples</strong>: Neste caso, há apenas uma variável independente envolvida. A equação da Regressão Linear Simples é expressa como:</p>



<p>Y = a + bX + ε</p>



<p>Onde Y é a variável dependente, X é a variável independente, a é o coeficiente linear (intercepto), b é o coeficiente angular (inclinação) e ε é o erro aleatório.</p>



<p><strong>Regressão Linear Múltipla</strong>: Neste caso, há duas ou mais variáveis independentes envolvidas. A equação é expressa como:</p>



<p>Y = a + b1X1 + b2X2 + &#8230; + bnXn + ε</p>



<p>Onde Y é a variável dependente, X1, X2, &#8230;, Xn são as variáveis independentes, a é o coeficiente linear (intercepto), b1, b2, &#8230;, bn são os coeficientes angulares (inclinações) e ε é o erro aleatório.</p>



<p>A Regressão Linear é amplamente utilizada em diversas áreas, como economia, ciências sociais, biologia e engenharia, para prever resultados, avaliar relações causais e identificar fatores que contribuem para um fenômeno específico.</p>



<p>Além disso, é uma técnica fundamental para a análise de dados e aprendizado de máquina, onde é usada para desenvolver modelos preditivos.</p>



<h2 class="wp-block-heading">Construção do Modelo OLS (Ordinary Least Squares) com Statsmodels em Python</h2>



<p>Ordinary Least Squares Regression (OLSR): uma técnica de regressão linear usada para minimizar a soma dos erros quadrados entre a variável dependente e as variáveis independentes.</p>



<p>O método sm.OLS(y, X) é uma função do pacote Statsmodels, biblioteca Python utilizada para análise estatística. A função OLS (Ordinary Least Squares) é usada para ajustar um modelo de regressão linear, minimizando a soma dos erros quadráticos entre os valores observados e os valores previstos pelo modelo.</p>



<p>A função sm.OLS(y, X) recebe dois argumentos principais:</p>



<p>y: Um array ou pandas Series representando a variável dependente (variável resposta ou alvo). É a variável que você deseja prever ou explicar com base nas variáveis independentes.</p>



<p>X: Um array ou pandas DataFrame representando as variáveis independentes (variáveis explicativas ou preditoras). São as variáveis que você deseja usar para explicar ou prever a variável dependente.</p>



<pre class="wp-block-code"><code># Definimos a variável dependente
y = df_dsa&#91;"valor_aluguel"]

# Definimos a variável independente
X = df_dsa&#91;"area_m2"]

# O Statsmodels requer a adição de uma constante à variável independente
X = sm.add_constant(X)

# Criamos o modelo
modelo = sm.OLS(y, X)</code></pre>



<p>Em seguida treinamos o modelo e imprimimos o resultado:</p>



<pre class="wp-block-code"><code># Treinamento do modelo
resultado = modelo.fit()

print(resultado.summary())</code></pre>



<p>E esse é o resultado do nosso modelo:</p>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-6.png" alt="" class="wp-image-1438"/></figure>



<h2 class="wp-block-heading">Interpretando o Resultado do Modelo Estatístico com Statsmodels</h2>



<p>A tabela acima traz um resumo do modelo com diversas estatísticas. Aqui faremos a análise de uma delas, o R².</p>



<p>O coeficiente de determinação, também conhecido como R², é uma medida estatística que avalia o quão bem o modelo de regressão se ajusta aos dados observados. Ele varia de 0 a 1 e representa a proporção da variação total da variável dependente que é explicada pelo modelo de regressão.</p>



<p>A interpretação do R² é a seguinte:</p>



<p>R² = 0: Neste caso, o modelo de regressão não explica nenhuma variação na variável dependente. Isso significa que o modelo não é útil para prever ou explicar a variável de interesse.</p>



<p>R² = 1: Neste caso, o modelo de regressão explica toda a variação na variável dependente. Isso indica que o modelo se ajusta perfeitamente aos dados e é extremamente útil para prever ou explicar a variável de interesse.</p>



<p>0 &lt; R² &lt; 1: Neste caso, o modelo de regressão explica uma parte da variação na variável dependente. Quanto maior o valor de R², melhor o modelo se ajusta aos dados e melhor é a sua capacidade de prever ou explicar a variável de interesse.</p>



<p>É importante notar que um R² alto não garante que o modelo seja adequado, nem que haja uma relação causal entre as variáveis. Um R² alto pode ser resultado de variáveis irrelevantes, multicolinearidade ou até mesmo de um ajuste excessivo (overfitting). Portanto, é essencial avaliar outras estatísticas e diagnosticar o modelo antes de tirar conclusões definitivas.</p>



<p>Vamos plotar em um scatterplot os dados do modelo treinado para tirar uma conclusão:</p>



<pre class="wp-block-code"><code># Plot
plt.figure(figsize = (12, 8))
plt.xlabel("area_m2", size = 16)
plt.ylabel("valor_aluguel", size = 16)
plt.plot(X&#91;"area_m2"], y, "o", label = "Dados Reais")
plt.plot(X&#91;"area_m2"], resultado.fittedvalues, "r-", label = "Linha de Regressão (Previsões do Modelo)")
plt.legend(loc = "best")
plt.show()</code></pre>



<figure class="wp-block-image size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-7.png" alt="" class="wp-image-1439"/></figure>



<p>Claramente existe uma forte relação entre a área (em m2) dos imóveis e o valor do aluguel. Entretanto, apenas a área dos imóveis não é suficiente para explicar a variação no valor do aluguel, pois nosso modelo obteve um coeficiente de determinação (R²) de apenas 0.34.</p>



<p>O ideal seria usar mais variáveis de entrada para construir o modelo a fim de compreender se outros fatores influenciam no valor do aluguel.</p>



<p>É sempre importante deixar claro que correlação não implica causalidade e que não podemos afirmar que o valor do aluguel muda apenas devido à área dos imóveis. Para estudar causalidade devemos aplicar Análise Causal.</p>



<p>Em um Projeto de Regressão devemos validar as suposições (que são várias) antes de usar o modelo para tirar conclusões.</p>



<h2 class="wp-block-heading">Treinando um modelo para previsão do valor do aluguel baseado na area em m2 usando Scikit Learn</h2>



<p>Sabemos que com um valor de r² de baixa correlação observado (0.34) não é suficiente para treinar um modelo, mas como o objetivo desse projeto é somente exploratório, vamos prosseguir mesmo assim.</p>



<p>Vamos treinar o modelo usando a mesma técnica de regressão linear com Ordinary Least Squares.</p>



<p>Vamos então preparar nossa variável de entrada X e tranformá-la em um array numpy, fazer o reshape dela em um intervalo de -1 e 1 e definir nossa variável de saída Y como o valor do aluguel.</p>



<pre class="wp-block-code"><code>X = np.array (df&#91;'area_m2'])
X = X.reshape(-1,1)
Y = df&#91;'valor_aluguel']</code></pre>



<p>Em seguida vamos fazer um split no nosso modelo para um ambiente de teste e outro de treino. a amostra de testes será configurada para alocar 20% dos dados e consequentemente o treino será realizado com 80% dos dados.</p>



<pre class="wp-block-code"><code>X_treino, X_teste, Y_treino, Y_teste = train_test_split (X, Y, test_size = 0.2, random_state= 42)</code></pre>



<p>O shape das nossas variáveis ficou dessa forma:</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-8.png" alt="" class="wp-image-1446"/></figure>



<p>Valor agora criar e treinar o modelo</p>



<pre class="wp-block-code"><code>modelo = LinearRegression()
modelo.fit(X_treino, Y_treino)</code></pre>



<p>Conseguimos agora analisar a curva da regressão já com a previsão do modelo</p>



<pre class="wp-block-code"><code>plt.scatter(X,Y)
plt.plot(X,modelo.predict(X), color = "red")
plt.xlabel("area em m2")
plt.ylabel ("valor do aluguel")</code></pre>



<figure class="wp-block-image aligncenter size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-9.png" alt="" class="wp-image-1447"/></figure>



<p>Vejamos o score do nosso modelo:</p>



<pre class="wp-block-code"><code>score = modelo.score(X_teste,Y_teste)
print(score)</code></pre>



<p>o nosso modelo ficou com um score de 0.3528410684969181 o que é um valor bem abaixo da média. Na prática esse modelo não poderia ser utilizado para realizar previsões, mas vamos ver como ele se sai.</p>



<p>O próximo passo agora é definir nossos vetores de intercepto (w0) e coeficiente (w1) da reta de regressão. Aqui um gráfico com uma breve explicação dos vetores que estaremos criando dentro do contexto da regressão:</p>



<figure class="wp-block-image size-large"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-10-1024x620.png" alt="" class="wp-image-1448"/></figure>



<pre class="wp-block-code"><code>modelo.intercept_ #W0
modelo.coef_ #W1</code></pre>



<h2 class="wp-block-heading">Fazendo deploy do modelo</h2>



<p>Agora com o modelo treinado, iremos utilizar um input qualquer de area em m2 para que nosso modelo faça a previsão de qual seria um provável valor de aluguel.</p>



<figure class="wp-block-image size-full"><img decoding="async" src="https://alexandrepolselli.com.br/wp-content/uploads/2023/05/image-11.png" alt="" class="wp-image-1449"/></figure>



<h2 class="wp-block-heading"><strong>Conclusão</strong></h2>



<p>Apesar de ser um modelo preditivo fraco, conseguimos gerar algumas previsões a título de conhecimento e treino.</p>



<p>Como é possível observar, segundo o modelo, um imóvel de 500 m² teria uma média de valor de aluguel de R$2520,00</p>



<p>seguem alguns exemplos de previsões geradas pelo modelo:</p>



<figure class="wp-block-table"><table><tbody><tr><td>Area em m2</td><td>Valor do aluguel</td></tr><tr><td>250</td><td>1328.94245948</td></tr><tr><td>300</td><td>1567.3343353</td></tr><tr><td>350</td><td>1805.72621111</td></tr><tr><td>400</td><td>2044.11808692</td></tr><tr><td>450</td><td>2282.50996273</td></tr><tr><td>500</td><td>2520.90183854</td></tr></tbody></table></figure>



<p>Referências</p>



<ul class="wp-block-list">
<li><a href="https://www.datascienceacademy.com.br/" target="_blank" rel="noreferrer noopener">https://www.datascienceacademy.com.br/</a></li>



<li><a href="https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html" target="_blank" rel="noreferrer noopener">https://www.statsmodels.org/dev/generated/statsmodels.regression.linear_model.OLS.html</a></li>



<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html" target="_blank" rel="noreferrer noopener">https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html</a></li>
</ul>
<p>O post <a href="https://datauniverse.com.br/analise-estatistica-exploratoria-com-statsmodels-relacao-entre-a-area-de-imoveis-e-o-valor-do-aluguel/">Análise Estatística e treinamento de modelo preditivo de Machine Learning com regressão linear OLS em python: Relação entre a área de imóveis e o valor do aluguel</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/analise-estatistica-exploratoria-com-statsmodels-relacao-entre-a-area-de-imoveis-e-o-valor-do-aluguel/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
