Jekyll2022-09-18T16:16:34+07:00http://kinhtehocvohai.github.io/feed.xmlKinh Tế Học Vô HạiNơi chia sẻ kiến thức ``Vô Hại'' về kinh tế học, khoa học dữ liệu và phương thức kết hợp chúng trong nghiên cứu các vấn đề chính sách, xã hội và quyết định kinh doanh.Kinh tế học Vô hạiGhép cặp, Bình quân Gia quyền hay Hồi quy2022-09-18T00:00:00+07:002022-09-18T00:00:00+07:00http://kinhtehocvohai.github.io/blogpost/Gh%C3%A9p-c%E1%BA%B7p,-B%C3%ACnh-qu%C3%A2n-Gia-quy%E1%BB%81n-hay-H%E1%BB%93i-quy<p><em>Nguồn: Biên tâp lại từ Matteo Courthoud theo <a href="https://towardsdatascience.com/matching-weighting-or-regression-99bf5cffa0d9">Towardsdatascience</a></em></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">!</span> <span class="n">pip</span> <span class="n">install</span> <span class="n">causalml</span>
</code></pre></div></div>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="nn">statsmodels.formula.api</span> <span class="k">as</span> <span class="n">smf</span>
<span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="n">sns</span>
</code></pre></div></div>
<p><em>Hiểu và so sánh các phương pháp suy luận nhân quả có điều kiện.</em></p>
<p>Phép thử A/B hoặc thử nghiệm kiểm soát ngẫu nhiên là tiêu chuẩn vàng trong suy luận nhân quả. Bằng cách phân ngẫu nhiên các cá nhân vào nhóm (nhận) can thiệp hoặc đối chứng, ta có thể an tâm rằng cá nhân bình quân trong hai nhóm này tương tự nhau và mọi khác biệt ta quan sát được có thể quy hoàn toàn cho tác động của can thiệp.</p>
<p>Tuy nhiên nhóm can thiệp và đối chứng nhiều khi không hoàn toàn tương đồng. Lý do có thể vì quá trình phân bổ ngẫu nhiên không hoàn hảo hoặc không thể tiến hành. Vì các lý do đạo đức hoặc các lý do thực tiễn khác, không phải lúc nào ta cũng có thể phân bổ can thiệp một cách ngẫu nhiên. Ngay cả khi có thể, đôi khi ta không có mẫu quan sát đủ lớn để có thể nhận ra sự khác biệt giữa hai nhóm. Ví dụ điều này thường xảy ra khi quá trình ngẫu nhiên hóa không được thực hiện ở cấp độ cá nhân mà ở cấp độ nhóm gộp, ví dụ mã địa chỉ, quận/huyện hoặc tỉnh thành phố.</p>
<p>Trong các hoàn cảnh này, ta vẫn có thể khôi phục ước lượng nhân quả của tác động can thiệp sau khi can thiệp đã diễn ra nếu ta có đủ thông tin về các cá nhân bằng cách làm cho nhóm can thiệp và đối chứng trở nên tương tự nhau. Trong bài viết này, chúng ta sẽ cùng tìm hiểu và so sánh các quy trình ước lượng tác động nhân quả khi có sự mất cân xứng giữa nhóm can thiệp và đối chứng mà ta quan sát được toàn bộ. Cụ thể, chúng ta sẽ phân tích dữ liệu sử dụng ba phương pháp: ghép cặp, bình quân gia quyền và hồi quy.</p>
<h1 id="ví-dụ">Ví dụ</h1>
<p>Giả sử ta có một trang blog về thống kê và suy luận nhân quả 😇. Để nâng cao trải nhiệm người dùng, ta cân nhắc việc sử dụng chế độ nền tối và muốn tìm hiểu liệu tính năng này có làm tăng thời gian người dùng dành cho trang blog hay không.</p>
<p><img src="https://miro.medium.com/proxy/1*Hp7STI5b8nCfgJlLtvCGmg.png" alt="Giao diện Website cho nhóm đối chứng (bên trái) và can thiệp (bên phải)" /></p>
<p>Chúng ta không phải một công ty lớn, vì thế chúng ta không chạy phép thử A/B mà chỉ đơn giản tung ra phiên bản nền tối và quan sát người dùng chọn nó hay không và thời gian họ dành cho trang blog. Chúng ta biết rằng có sự [tự] chọn lựa ở đây: những người dùng thích chế độ nền tối có thể cũng đồng thời có các sở thích đọc khác và điều này có thể cản trở phân tích nhân quả.</p>
<p>Chúng ta có thể biểu diễn mô hình tạo lập dữ liệu bằng Biểu đồ Chỉ hướng Không Tuần Hoàn (Directed Acyclic Graph (DAG)).</p>
<p><img src="https://miro.medium.com/max/1400/1*j0zbE3_i5LPmOedhZ-aFCg.png" alt="Biều đồ DAG của mô hình tạo lập dữ liệu" /></p>
<p>Chúng ta tạo lập dữ liệu mô phỏng sử dụng mô hình tạo lập dữ liệu như sau:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">dgp_darkmode</span><span class="p">():</span>
<span class="s">"""
Data Generating Process: blog dark mode and time spend reading
"""</span>
<span class="k">def</span> <span class="nf">generate_data</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">N</span><span class="o">=</span><span class="mi">300</span><span class="p">,</span> <span class="n">seed</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
<span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">seed</span><span class="p">(</span><span class="n">seed</span><span class="p">)</span>
<span class="c1"># Control variables
</span> <span class="n">nam_giới</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">binomial</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.45</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span>
<span class="n">tuổi</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">rint</span><span class="p">(</span><span class="mi">18</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">beta</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span><span class="o">*</span><span class="mi">50</span><span class="p">)</span>
<span class="n">tổng_giờ_đọc</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">minimum</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nb">round</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">lognormal</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mf">1.3</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mi">1</span><span class="p">),</span> <span class="mi">2000</span><span class="p">)</span>
<span class="c1"># Treatment
</span> <span class="n">pr</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">maximum</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="n">minimum</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">0.8</span> <span class="o">+</span> <span class="mf">0.3</span><span class="o">*</span><span class="n">nam_giới</span> <span class="o">-</span> <span class="n">np</span><span class="p">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">tuổi</span><span class="o">-</span><span class="mi">18</span><span class="p">)</span><span class="o">/</span><span class="mi">10</span><span class="p">))</span>
<span class="n">nền_tối</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">binomial</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">pr</span><span class="p">,</span> <span class="n">N</span><span class="p">)</span><span class="o">==</span><span class="mi">1</span>
<span class="c1"># Outcome
</span> <span class="n">số_giờ_đọc</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nb">round</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">normal</span><span class="p">(</span><span class="mi">10</span> <span class="o">-</span> <span class="mi">4</span><span class="o">*</span><span class="n">nam_giới</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">np</span><span class="p">.</span><span class="n">log</span><span class="p">(</span><span class="n">tổng_giờ_đọc</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span><span class="o">*</span><span class="n">nền_tối</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="n">N</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># Generate the dataframe
</span> <span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s">'số_giờ_đọc'</span><span class="p">:</span> <span class="n">số_giờ_đọc</span><span class="p">,</span> <span class="s">'nền_tối'</span><span class="p">:</span> <span class="n">nền_tối</span><span class="p">,</span> <span class="s">'nam_giới'</span><span class="p">:</span> <span class="n">nam_giới</span><span class="p">,</span> <span class="s">'tuổi'</span><span class="p">:</span> <span class="n">tuổi</span><span class="p">,</span> <span class="s">'tổng_giờ_đọc'</span><span class="p">:</span> <span class="n">tổng_giờ_đọc</span><span class="p">})</span>
<span class="k">return</span> <span class="n">df</span>
<span class="n">df</span> <span class="o">=</span> <span class="n">dgp_darkmode</span><span class="p">().</span><span class="n">generate_data</span><span class="p">()</span>
<span class="n">df</span><span class="p">.</span><span class="n">head</span><span class="p">()</span>
</code></pre></div></div>
<div id="df-7da5a217-6897-4de4-984b-c8c5e4ae2180">
<div class="colab-df-container">
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>số_giờ_đọc</th>
<th>nền_tối</th>
<th>nam_giới</th>
<th>tuổi</th>
<th>tổng_giờ_đọc</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>14.4</td>
<td>False</td>
<td>0</td>
<td>43.0</td>
<td>65.6</td>
</tr>
<tr>
<th>1</th>
<td>15.4</td>
<td>False</td>
<td>1</td>
<td>55.0</td>
<td>125.4</td>
</tr>
<tr>
<th>2</th>
<td>20.9</td>
<td>True</td>
<td>0</td>
<td>23.0</td>
<td>642.6</td>
</tr>
<tr>
<th>3</th>
<td>20.0</td>
<td>False</td>
<td>0</td>
<td>41.0</td>
<td>129.1</td>
</tr>
<tr>
<th>4</th>
<td>21.5</td>
<td>True</td>
<td>0</td>
<td>29.0</td>
<td>190.2</td>
</tr>
</tbody>
</table>
</div>
<button class="colab-df-convert" onclick="convertToInteractive('df-7da5a217-6897-4de4-984b-c8c5e4ae2180')" title="Convert this dataframe to an interactive table." style="display:none;">
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z" /><path d="M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z" />
</svg>
</button>
<style>
.colab-df-container {
display:flex;
flex-wrap:wrap;
gap: 12px;
}
.colab-df-convert {
background-color: #E8F0FE;
border: none;
border-radius: 50%;
cursor: pointer;
display: none;
fill: #1967D2;
height: 32px;
padding: 0 0 0 0;
width: 32px;
}
.colab-df-convert:hover {
background-color: #E2EBFA;
box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
fill: #174EA6;
}
[theme=dark] .colab-df-convert {
background-color: #3B4455;
fill: #D2E3FC;
}
[theme=dark] .colab-df-convert:hover {
background-color: #434B5C;
box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
fill: #FFFFFF;
}
</style>
<script>
const buttonEl =
document.querySelector('#df-7da5a217-6897-4de4-984b-c8c5e4ae2180 button.colab-df-convert');
buttonEl.style.display =
google.colab.kernel.accessAllowed ? 'block' : 'none';
async function convertToInteractive(key) {
const element = document.querySelector('#df-7da5a217-6897-4de4-984b-c8c5e4ae2180');
const dataTable =
await google.colab.kernel.invokeFunction('convertToInteractive',
[key], {});
if (!dataTable) return;
const docLinkHtml = 'Like what you see? Visit the ' +
'<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
+ ' to learn more about interactive tables.';
element.innerHTML = '';
dataTable['output_type'] = 'display_data';
await google.colab.output.renderOutput(dataTable, element);
const docLink = document.createElement('div');
docLink.innerHTML = docLinkHtml;
element.appendChild(docLink);
}
</script>
</div>
</div>
<p>Ta có thông tin về 300 người dùng. Ta có thể quan sát họ chọn chế độ nền_tối (can thiệp) hay không, thời gian đọc hàng tuần số_giờ_đọc (biến kết quả) và các đặc điểm như giới tính, tuổi và tổng thời gian đã dành cho blog.</p>
<p>Ta muốn ước lược tác động của nền_tối lên số_giờ_đọc của người dùng. Nếu ta có thể chạy phép thử A/B hoặc thử nghiệm ngẫu nhiên , ta chỉ việc so sánh người đọc sử dụng và không sử dụng chế độ nền tối và quy khác biệt về số giờ đọc bình quân cho nền_tối. Hãy cùng kiểm tra con số mà ta có:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="s">'nền_tối==True'</span><span class="p">).</span><span class="n">số_giờ_đọc</span><span class="p">.</span><span class="n">mean</span><span class="p">()</span><span class="o">-</span><span class="n">df</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="s">'nền_tối==False'</span><span class="p">).</span><span class="n">số_giờ_đọc</span><span class="p">.</span><span class="n">mean</span><span class="p">()</span>
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>-0.4446330948042103
</code></pre></div></div>
<p>Người dùng chọn nền_tối trung bình đọc blog ít hơn 0.44 giờ mỗi tuần. Liệu ta có thể kết luận nền_tối là một ý tưởng tồi? Đây có phải tác động nhân quả hay không?</p>
<p>Ta không phân ngẫu nhiên nền_tối vì thế người dùng chọn lựa nó không hoàn toàn giống người dùng không chọn. Liệu ta có thể kiểm chứng lo ngại này? Một phần nào đó. Ta chỉ có thể kiểm tra các thuộc tính có thể quan sát như giới tính, tuổi tác và tổng số giờ trong thiết lập của mình. Ta không thể kiểm tra liệu người đọc có khác biệt dựa trên các thuộc tính không quan sát được.</p>
<p>Hãy dùng hàm create_table_one từ thư viện causalml của Uber để lập bảng so sánh thuộc tính, bao gồm giá trị trung bình các đặc điểm của người dùng giữa hai nhóm kiểm soát và can thiệp. Như tên của nó gợi mở, chúng ta nên trình bảy bảng này ngay khi bắt đầu phân tích suy luận nhân quả.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">causalml.match</span> <span class="kn">import</span> <span class="n">create_table_one</span>
<span class="n">X</span> <span class="o">=</span> <span class="p">[</span><span class="s">'nam_giới'</span><span class="p">,</span> <span class="s">'tuổi'</span><span class="p">,</span> <span class="s">'tổng_giờ_đọc'</span><span class="p">]</span>
<span class="n">table1</span> <span class="o">=</span> <span class="n">create_table_one</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="s">'nền_tối'</span><span class="p">,</span> <span class="n">X</span><span class="p">)</span>
<span class="n">table1</span>
</code></pre></div></div>
<div id="df-a921ffc1-b363-45de-97b6-6964fd19cb58">
<div class="colab-df-container">
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Control</th>
<th>Treatment</th>
<th>SMD</th>
</tr>
<tr>
<th>Variable</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>n</th>
<td>151</td>
<td>149</td>
<td></td>
</tr>
<tr>
<th>nam_giới</th>
<td>0.34 (0.47)</td>
<td>0.66 (0.48)</td>
<td>0.6732</td>
</tr>
<tr>
<th>tuổi</th>
<td>46.01 (9.79)</td>
<td>39.09 (11.53)</td>
<td>-0.6469</td>
</tr>
<tr>
<th>tổng_giờ_đọc</th>
<td>337.78 (464.00)</td>
<td>328.57 (442.12)</td>
<td>-0.0203</td>
</tr>
</tbody>
</table>
</div>
<button class="colab-df-convert" onclick="convertToInteractive('df-a921ffc1-b363-45de-97b6-6964fd19cb58')" title="Convert this dataframe to an interactive table." style="display:none;">
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z" /><path d="M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z" />
</svg>
</button>
<style>
.colab-df-container {
display:flex;
flex-wrap:wrap;
gap: 12px;
}
.colab-df-convert {
background-color: #E8F0FE;
border: none;
border-radius: 50%;
cursor: pointer;
display: none;
fill: #1967D2;
height: 32px;
padding: 0 0 0 0;
width: 32px;
}
.colab-df-convert:hover {
background-color: #E2EBFA;
box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
fill: #174EA6;
}
[theme=dark] .colab-df-convert {
background-color: #3B4455;
fill: #D2E3FC;
}
[theme=dark] .colab-df-convert:hover {
background-color: #434B5C;
box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
fill: #FFFFFF;
}
</style>
<script>
const buttonEl =
document.querySelector('#df-a921ffc1-b363-45de-97b6-6964fd19cb58 button.colab-df-convert');
buttonEl.style.display =
google.colab.kernel.accessAllowed ? 'block' : 'none';
async function convertToInteractive(key) {
const element = document.querySelector('#df-a921ffc1-b363-45de-97b6-6964fd19cb58');
const dataTable =
await google.colab.kernel.invokeFunction('convertToInteractive',
[key], {});
if (!dataTable) return;
const docLinkHtml = 'Like what you see? Visit the ' +
'<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
+ ' to learn more about interactive tables.';
element.innerHTML = '';
dataTable['output_type'] = 'display_data';
await google.colab.output.renderOutput(dataTable, element);
const docLink = document.createElement('div');
docLink.innerHTML = docLinkHtml;
element.appendChild(docLink);
}
</script>
</div>
</div>
<p>Có nhiều khác biệt giữa nhóm can thiệp và đối chứng. Cụ thể người dùng lựa chọn nền_tối trẻ hơn, dành ít thời gian đọc blog hơn và nhiều khả năng là nam.</p>
<p>Một cách khác để biểu diễn tất cả khác biệt cùng một lúc là sử dùng biểu đồ violin theo cặp. Ưu điểm của biểu đồ này là cho phép ta quan sát toàn bộ phân phối xác suất của biến (xấp xỉ thông qua ước lượng mật độ kernel)</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">plot_distributions</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">X</span><span class="p">,</span> <span class="n">d</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="n">sns</span>
<span class="n">df_long</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">copy</span><span class="p">()[</span><span class="n">X</span> <span class="o">+</span> <span class="p">[</span><span class="n">d</span><span class="p">]]</span>
<span class="n">df_long</span><span class="p">[</span><span class="n">X</span><span class="p">]</span> <span class="o">=</span><span class="p">(</span><span class="n">df_long</span><span class="p">[</span><span class="n">X</span><span class="p">]</span> <span class="o">-</span> <span class="n">df_long</span><span class="p">[</span><span class="n">X</span><span class="p">].</span><span class="n">mean</span><span class="p">())</span> <span class="o">/</span> <span class="n">df_long</span><span class="p">[</span><span class="n">X</span><span class="p">].</span><span class="n">std</span><span class="p">()</span>
<span class="n">df_long</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">melt</span><span class="p">(</span><span class="n">df_long</span><span class="p">,</span> <span class="n">id_vars</span><span class="o">=</span><span class="n">d</span><span class="p">,</span> <span class="n">value_name</span><span class="o">=</span><span class="s">'value'</span><span class="p">)</span>
<span class="n">sns</span><span class="p">.</span><span class="n">violinplot</span><span class="p">(</span><span class="n">y</span><span class="o">=</span><span class="s">"variable"</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s">"value"</span><span class="p">,</span> <span class="n">hue</span><span class="o">=</span><span class="n">d</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df_long</span><span class="p">,</span> <span class="n">split</span><span class="o">=</span><span class="bp">True</span><span class="p">).</span>\
<span class="nb">set</span><span class="p">(</span><span class="n">xlabel</span><span class="o">=</span><span class="s">""</span><span class="p">,</span> <span class="n">ylabel</span><span class="o">=</span><span class="s">""</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s">"Normalized Variable Distribution"</span><span class="p">);</span>
<span class="n">plot_distributions</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">X</span><span class="p">,</span> <span class="s">"nền_tối"</span><span class="p">)</span>
</code></pre></div></div>
<p><img src="/assets/images/blogpost/ghepcap/output_13_0.png" alt="image-center" class="align-center" /></p>
<p>Kết luận đưa ra từ biểu đồ violin khá tương đồng: người dùng lựa chọn nền_tối dường như rất khác các người dùng khác.</p>
<h1 id="tại-sao-phải-để-tâm">Tại sao phải để tâm?</h1>
<p>Nếu ta không kiểm soát các thuộc tính quan sát được, ta không thể ước lượng tác động can thiệp thực. Nói ngắn gọn, ta không thể chắc rằng, khác biệt trong kết quả, số_giờ_đọc, có thể quy cho tác động, nền_tối, thay vì các thuộc tính khác. Ví dụ, có khả năng nam giới đọc ít hơn và đồng thời thích nền_tối hơn, vì thế ta quan sát thấy tương quan ngược chiều ngay cả khi nền_tối không có tác động đối với số_giờ_đọc (hoặc thậm chí mối quan hệ thực có thể là cùng chiều).</p>
<p>Nói theo ngôn ngữ Biểu đồ Chỉ hướng Không Tuần Hoàn (DAG), điều này có nghĩa là ta có một lối đi cửa sau cần được đóng lại để có thể phân tích nhân quả.</p>
<p><img src="https://miro.medium.com/max/1400/1*Uy5vMKGxPq8Ak_0EuqzS9Q.png" alt="DAG của phân tích có điều kiện" /></p>
<p>Làm thế nào để ta phân tích điều kiện với các biến giới tính, tuổi tác và số giờ đọc? Ta có một vài lựa chọn như sau:</p>
<ul>
<li>Ghép cặp</li>
<li>Bình quân gia quyền theo điểm xu hướng</li>
<li>Hồi quy với biến kiểm soát</li>
</ul>
<p>Hãy cùng khám phá và so sánh chúng!</p>
<h1 id="phân-tích-điều-kiện">Phân tích điều kiện</h1>
<p>Giả sử với một tập hợp các đối tượng i = 1, …, n, ta quan sát được bộ số (Dᵢ, Yᵢ, Xᵢ) bao gồm:</p>
<ul>
<li>Biến phân bổ can thiệp $D_i ∈ {0,1}$ (nền_tối)</li>
<li>Biến kết quả $Y_i ∈ ℝ$ (số_giờ_đọc)</li>
<li>Vector các biến thuộc tính $X_i ∈ ℝ^n$ (gender, tuổi and tổng_giờ_đọc)</li>
</ul>
<p><strong>Giả thiết 1: Không có nhiễu</strong> (hoặc có thể bỏ qua [các biến không quan sát được], hoặc lựa chọn theo các biến quan sát được)</p>
<p><img src="https://miro.medium.com/max/1400/1*WrxGjw86CtpFo1pzQIAMCQ.png" alt="Giả thiết không có nhiễu" /></p>
<p>nghĩa là khi cố định các thuộc tính quan sát được X, việc phân bổ can thiệp D gần như ngẫu nhiên. Về bản chất, ta giả thiết rằng không có thuộc tính không quan sát được nào ảnh hưởng đồng thời đến việc người dùng chọn nền_tối và số_giờ_đọc của họ. Đây là một giả thiết khá mạnh và nhiều khả năng hợp lý khi ta quan sát được nhiều thuộc tính của các đối tượng.</p>
<p><strong>Giả thiết 2: Trùng lặp</strong> (hoặc [có] vùng hỗ trợ chung)</p>
<p><img src="https://miro.medium.com/max/1400/1*cZ4x3rVw05RR-coEfmt_zQ.png" alt="Giả thiết trùng lặp" /></p>
<p>nghĩa là không đối tượng nào được chắc chắn phân vào nhóm can thiệp hoặc đối chứng. Đây là một giả thiết mang tính kĩ thuật, hàm ý, tại mọi giá trị của giới tính, tuổi tác và số giờ, luôn tồn tại cả người đọc lựa chọn nền_tối và người đọc không chọn chế độ này. Khác với giả thiết không có nhiễu, giả thiết trùng lặp có thể được kiểm chứng.</p>
<h1 id="ghép-cặp">Ghép cặp</h1>
<p>Phương pháp đầu tiên và có lẽ trực quan nhất là tiến hành phân tích điều kiện bằng ghép cặp.</p>
<p>Ý tưởng ghép cặp rất đơn giản. Ví dụ, ta không chắc chắn, ví dụ người dùng giới tính nam và nữ có tương đồng, ta phân tích theo từng giới. Thay vì so sánh số_giờ_đọc theo giá trị biến nền_tối cho toàn bộ mẫu dữ liệu, ta chia nhỏ chúng theo người dùng nam và nữ.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df_gender</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">pivot_table</span><span class="p">(</span><span class="n">df</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="s">'số_giờ_đọc'</span><span class="p">,</span> <span class="n">index</span><span class="o">=</span><span class="s">'nam_giới'</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="s">'nền_tối'</span><span class="p">,</span> <span class="n">aggfunc</span><span class="o">=</span><span class="n">np</span><span class="p">.</span><span class="n">mean</span><span class="p">)</span>
<span class="n">df_gender</span><span class="p">[</span><span class="s">'diff'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_gender</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">df_gender</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">df_gender</span>
</code></pre></div></div>
<div id="df-f210f99e-cfe3-4f31-91ef-8c5d7e421d0a">
<div class="colab-df-container">
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th>nền_tối</th>
<th>False</th>
<th>True</th>
<th>diff</th>
</tr>
<tr>
<th>nam_giới</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>20.318000</td>
<td>22.24902</td>
<td>1.931020</td>
</tr>
<tr>
<th>1</th>
<td>16.933333</td>
<td>16.89898</td>
<td>-0.034354</td>
</tr>
</tbody>
</table>
</div>
<button class="colab-df-convert" onclick="convertToInteractive('df-f210f99e-cfe3-4f31-91ef-8c5d7e421d0a')" title="Convert this dataframe to an interactive table." style="display:none;">
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z" /><path d="M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z" />
</svg>
</button>
<style>
.colab-df-container {
display:flex;
flex-wrap:wrap;
gap: 12px;
}
.colab-df-convert {
background-color: #E8F0FE;
border: none;
border-radius: 50%;
cursor: pointer;
display: none;
fill: #1967D2;
height: 32px;
padding: 0 0 0 0;
width: 32px;
}
.colab-df-convert:hover {
background-color: #E2EBFA;
box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
fill: #174EA6;
}
[theme=dark] .colab-df-convert {
background-color: #3B4455;
fill: #D2E3FC;
}
[theme=dark] .colab-df-convert:hover {
background-color: #434B5C;
box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
fill: #FFFFFF;
}
</style>
<script>
const buttonEl =
document.querySelector('#df-f210f99e-cfe3-4f31-91ef-8c5d7e421d0a button.colab-df-convert');
buttonEl.style.display =
google.colab.kernel.accessAllowed ? 'block' : 'none';
async function convertToInteractive(key) {
const element = document.querySelector('#df-f210f99e-cfe3-4f31-91ef-8c5d7e421d0a');
const dataTable =
await google.colab.kernel.invokeFunction('convertToInteractive',
[key], {});
if (!dataTable) return;
const docLinkHtml = 'Like what you see? Visit the ' +
'<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
+ ' to learn more about interactive tables.';
element.innerHTML = '';
dataTable['output_type'] = 'display_data';
await google.colab.output.renderOutput(dataTable, element);
const docLink = document.createElement('div');
docLink.innerHTML = docLinkHtml;
element.appendChild(docLink);
}
</script>
</div>
</div>
<p>Bây giờ tác động của nền_tối có vẻ đổi chiều: âm cho người dùng nam (-0.03) nhưng dương với trị số lớn cho người dùng nữ (+1.93). Tác động cộng gộp dương, 1.93-0.03=1.90 (giả sử tỉ lệ giới tính cân bằng)! Hiện tượng đổi dấu là một ví dụ cổ điển của Nghịch lý Simpson’s.</p>
<p>Phép so sánh này có thể thực hiện dễ dàng cho giới tính vì nó là biến nhị phân. Với nhiều biến, đôi khi bao gồm cả biến liên tục, ghép cặp trở nên khó khăn hơn. Một chiến lược phổ biến là ghép cặp người dùng trong nhóm can thiệp với người dùng gần giống nhất trong nhóm kiểm soát, sử dụng một thuật toán láng giềng gần nhất nào đó. Chúng ta sẽ không đi sâu diễn giải thuật toán ở đây nhưng ta có thể thực hiện ghép cặp với hàm NearestNeighborMatch từ gói causalml.</p>
<p>Hàm NearestNeighborMatch tạo ra một bộ dữ liệu nơi người dùng trong nhóm can thiệp được ghép 1:1 (tham số ratio=1) với các người dùng trong nhóm đối chứng.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">causalml.match</span> <span class="kn">import</span> <span class="n">NearestNeighborMatch</span>
<span class="n">psm</span> <span class="o">=</span> <span class="n">NearestNeighborMatch</span><span class="p">(</span><span class="n">replace</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">ratio</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">df_matched</span> <span class="o">=</span> <span class="n">psm</span><span class="p">.</span><span class="n">match</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">treatment_col</span><span class="o">=</span><span class="s">"nền_tối"</span><span class="p">,</span> <span class="n">score_cols</span><span class="o">=</span><span class="n">X</span><span class="p">)</span>
</code></pre></div></div>
<p>Liệu hai nhóm có thực sự trở ên tương xứng? Ta có thể tạo một phiên bản mới của <strong>bảng cân đối</strong></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">table1_matched</span> <span class="o">=</span> <span class="n">create_table_one</span><span class="p">(</span><span class="n">df_matched</span><span class="p">,</span> <span class="s">"nền_tối"</span><span class="p">,</span> <span class="n">X</span><span class="p">)</span>
<span class="n">table1_matched</span>
</code></pre></div></div>
<div id="df-c70490a9-6638-471a-a612-2e61c1f0a2a1">
<div class="colab-df-container">
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>Control</th>
<th>Treatment</th>
<th>SMD</th>
</tr>
<tr>
<th>Variable</th>
<th></th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>n</th>
<td>104</td>
<td>104</td>
<td></td>
</tr>
<tr>
<th>nam_giới</th>
<td>0.62 (0.49)</td>
<td>0.62 (0.49)</td>
<td>0.0</td>
</tr>
<tr>
<th>tuổi</th>
<td>41.93 (10.05)</td>
<td>41.85 (10.02)</td>
<td>-0.0086</td>
</tr>
<tr>
<th>tổng_giờ_đọc</th>
<td>206.92 (309.62)</td>
<td>209.48 (321.79)</td>
<td>0.0081</td>
</tr>
</tbody>
</table>
</div>
<button class="colab-df-convert" onclick="convertToInteractive('df-c70490a9-6638-471a-a612-2e61c1f0a2a1')" title="Convert this dataframe to an interactive table." style="display:none;">
<svg xmlns="http://www.w3.org/2000/svg" height="24px"viewBox="0 0 24 24"
width="24px">
<path d="M0 0h24v24H0V0z" fill="none" />
<path d="M18.56 5.44l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94zm-11 1L8.5 8.5l.94-2.06 2.06-.94-2.06-.94L8.5 2.5l-.94 2.06-2.06.94zm10 10l.94 2.06.94-2.06 2.06-.94-2.06-.94-.94-2.06-.94 2.06-2.06.94z" /><path d="M17.41 7.96l-1.37-1.37c-.4-.4-.92-.59-1.43-.59-.52 0-1.04.2-1.43.59L10.3 9.45l-7.72 7.72c-.78.78-.78 2.05 0 2.83L4 21.41c.39.39.9.59 1.41.59.51 0 1.02-.2 1.41-.59l7.78-7.78 2.81-2.81c.8-.78.8-2.07 0-2.86zM5.41 20L4 18.59l7.72-7.72 1.47 1.35L5.41 20z" />
</svg>
</button>
<style>
.colab-df-container {
display:flex;
flex-wrap:wrap;
gap: 12px;
}
.colab-df-convert {
background-color: #E8F0FE;
border: none;
border-radius: 50%;
cursor: pointer;
display: none;
fill: #1967D2;
height: 32px;
padding: 0 0 0 0;
width: 32px;
}
.colab-df-convert:hover {
background-color: #E2EBFA;
box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);
fill: #174EA6;
}
[theme=dark] .colab-df-convert {
background-color: #3B4455;
fill: #D2E3FC;
}
[theme=dark] .colab-df-convert:hover {
background-color: #434B5C;
box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);
filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));
fill: #FFFFFF;
}
</style>
<script>
const buttonEl =
document.querySelector('#df-c70490a9-6638-471a-a612-2e61c1f0a2a1 button.colab-df-convert');
buttonEl.style.display =
google.colab.kernel.accessAllowed ? 'block' : 'none';
async function convertToInteractive(key) {
const element = document.querySelector('#df-c70490a9-6638-471a-a612-2e61c1f0a2a1');
const dataTable =
await google.colab.kernel.invokeFunction('convertToInteractive',
[key], {});
if (!dataTable) return;
const docLinkHtml = 'Like what you see? Visit the ' +
'<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
+ ' to learn more about interactive tables.';
element.innerHTML = '';
dataTable['output_type'] = 'display_data';
await google.colab.output.renderOutput(dataTable, element);
const docLink = document.createElement('div');
docLink.innerHTML = docLinkHtml;
element.appendChild(docLink);
}
</script>
</div>
</div>
<p>Bây giờ khác biệt bình quân giữa hai nhóm giảm nhiều lần. Tuy nhiên lưu ý cỡ mẫu giảm nhẹ (300-208) vì (1) ta chỉ ghép cặp cho các người dùng chịu tác động bởi can thiệp và (2) ta không thể tìm được phương án ghép tốt cho toàn bộ người dùng này.</p>
<p>Ta có thể biểu diễn khác biệt về phân phối xác suất với biểu đồ violin theo cặp.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">plot_distributions</span><span class="p">(</span><span class="n">df_matched</span><span class="p">,</span> <span class="n">X</span><span class="p">,</span> <span class="s">"nền_tối"</span><span class="p">)</span>
</code></pre></div></div>
<p><img src="/assets/images/blogpost/ghepcap/output_25_0.png" alt="image-center" class="align-center" /></p>
<p>Một cách phổ biến để biểu diễn tính cân bằng của các biến giải thích trước và sau ghép cặp là sử dụng biểu đồ cân bằng. Biểu đồ này trình bày hiệu kì vọng chuẩn hóa trước và sau ghép cặp cho mỗi biến kiểm soát.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">plot_balance</span><span class="p">(</span><span class="n">t1</span><span class="p">,</span> <span class="n">t2</span><span class="p">,</span> <span class="n">X</span><span class="p">):</span>
<span class="kn">import</span> <span class="nn">seaborn</span> <span class="k">as</span> <span class="n">sns</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="n">df_smd</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="n">DataFrame</span><span class="p">({</span><span class="s">"Variable"</span><span class="p">:</span> <span class="n">X</span> <span class="o">+</span> <span class="n">X</span><span class="p">,</span>
<span class="s">"Sample"</span><span class="p">:</span> <span class="p">[</span><span class="s">"Unadjusted"</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="p">))]</span> <span class="o">+</span> <span class="p">[</span><span class="s">"Adjusted"</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">X</span><span class="p">))],</span>
<span class="s">"Standardized Mean Difference"</span><span class="p">:</span> <span class="n">t1</span><span class="p">[</span><span class="s">"SMD"</span><span class="p">][</span><span class="mi">1</span><span class="p">:].</span><span class="n">to_list</span><span class="p">()</span> <span class="o">+</span>
<span class="n">t2</span><span class="p">[</span><span class="s">"SMD"</span><span class="p">][</span><span class="mi">1</span><span class="p">:].</span><span class="n">to_list</span><span class="p">()})</span>
<span class="n">sns</span><span class="p">.</span><span class="n">scatterplot</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="s">"Standardized Mean Difference"</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="s">"Variable"</span><span class="p">,</span> <span class="n">hue</span><span class="o">=</span><span class="s">"Sample"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df_smd</span><span class="p">).</span>\
<span class="nb">set</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="s">"Balance Plot"</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="n">axvline</span><span class="p">(</span><span class="n">x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s">'k'</span><span class="p">,</span> <span class="n">ls</span><span class="o">=</span><span class="s">'--'</span><span class="p">,</span> <span class="n">zorder</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.3</span><span class="p">);</span>
<span class="n">plot_balance</span><span class="p">(</span><span class="n">table1</span><span class="p">,</span> <span class="n">table1_matched</span><span class="p">,</span> <span class="n">X</span><span class="p">)</span>
</code></pre></div></div>
<p><img src="/assets/images/blogpost/ghepcap/output_27_0.png" alt="image-center" class="align-center" /></p>
<p>Ta có thể thấy, tất cả khác biệt về thuộc tính quan sát được giữa hai nhóm gần như bằng không. Ta cũng có thể sso sánh các phân phối xác suất sử dụng các thang đo và kiểm định thống kế, ví dụ kiểm định thống kê Kolmogorov-Smirnov.</p>
<p>Làm thế nào để ước lượng tác động can thiệp? Ta chỉ việc đơn giản tính hiệu của kì vọng. Một cách tương đương đồng thời cung cấp sai số chuẩn là chạy hồi quy tuyến tính biến kết quả số_giờ_đọc, theo can thiệp, nền_tối.</p>
<p>Lưu ý vì chúng ta đã ghép cặp cho từng người dùng nhận can thiệp, tác động can thiệp mà ta ước lượng là tác động can thiệp bình quân đối với nhóm can thiệp. Đại lượng này có thể khác tác động can thiệp bình qân nếu nhóm can thiệp khác với quần thể chung (điều này nhiều khả năng xảy ra nếu không chúng ta đã không cần ghép gặp).</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">smf</span><span class="p">.</span><span class="n">ols</span><span class="p">(</span><span class="s">"số_giờ_đọc ~ nền_tối"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df_matched</span><span class="p">).</span><span class="n">fit</span><span class="p">().</span><span class="n">summary</span><span class="p">().</span><span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<table class="simpletable">
<tr>
<td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[0.025</th> <th>0.975]</th>
</tr>
<tr>
<th>Intercept</th> <td> 17.0365</td> <td> 0.469</td> <td> 36.363</td> <td> 0.000</td> <td> 16.113</td> <td> 17.960</td>
</tr>
<tr>
<th>nền_tối[T.True]</th> <td> 1.4490</td> <td> 0.663</td> <td> 2.187</td> <td> 0.030</td> <td> 0.143</td> <td> 2.755</td>
</tr>
</table>
<p>Tác động trở nên dương và có ý nghĩa thống kê ở mức 5%.</p>
<p>Lưu ý là ta có thể ghép nhiều người dùng chịu ảnh hưởng với các người dùng tương tự không chịu ảnh hưởng của can thiệp. Điều này vi phạm giả thiết độc lập giữa các quan sát và làm sai lệch phân tích. Ta có 2 giải pháp:</p>
<ul>
<li>Nhóm cụm sai số chuẩn theo cá nhân trước khi ghép cặp.</li>
<li>Tính sai số chuẩn bằng bootstrap (phù hợp hơn).</li>
</ul>
<p>Dưới đây ta thực hiện giải pháp thứ nhất và nhóm cụm sai số chuẩn theo mã số cá nhân ban đầu (chỉ số khung dữ liệu).</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">smf</span><span class="p">.</span><span class="n">ols</span><span class="p">(</span><span class="s">"số_giờ_đọc ~ nền_tối"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df_matched</span><span class="p">)</span>\
<span class="p">.</span><span class="n">fit</span><span class="p">(</span><span class="n">cov_type</span><span class="o">=</span><span class="s">'cluster'</span><span class="p">,</span> <span class="n">cov_kwds</span><span class="o">=</span><span class="p">{</span><span class="s">'groups'</span><span class="p">:</span> <span class="n">df_matched</span><span class="p">.</span><span class="n">index</span><span class="p">})</span>\
<span class="p">.</span><span class="n">summary</span><span class="p">().</span><span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<table class="simpletable">
<tr>
<td></td> <th>coef</th> <th>std err</th> <th>z</th> <th>P>|z|</th> <th>[0.025</th> <th>0.975]</th>
</tr>
<tr>
<th>Intercept</th> <td> 17.0365</td> <td> 0.650</td> <td> 26.217</td> <td> 0.000</td> <td> 15.763</td> <td> 18.310</td>
</tr>
<tr>
<th>nền_tối[T.True]</th> <td> 1.4490</td> <td> 0.821</td> <td> 1.765</td> <td> 0.078</td> <td> -0.160</td> <td> 3.058</td>
</tr>
</table>
<p>Tác động trở lên ít có ý nghĩa thống kê hơn.</p>
<h1 id="điểm-xu-hướng">Điểm xu hướng</h1>
<p>Rosenbaum and Rubin (1983) chứng minh một kết quả rất mạnh: với giả thiết có thể bỏ qua (dạng mạnh), việc phân tích điều kiện theo xác suất nhận can thiệp (điểm xu hướng) đủ để đảm bảo tính độc lập có điều kiện.</p>
<p><img src="https://miro.medium.com/max/1400/1*XZMX5gFHg6t4YFTMn-w_0g.png" alt="Kết quả Rosenbaum and Rubin (1983)" /></p>
<p>Trong đó e(Xᵢ) là xác suất nhận can thiệp của cá nhân i khi cố định các thuộc tính quan sát được Xᵢ.</p>
<p><img src="https://miro.medium.com/max/1400/1*lzwJtQignaGmWav1nkYTLQ.png" alt="Điểm xu hướng" /></p>
<p>Lưu ý trong phép thử A/B, điểm xu hướng là giống nhau cho các cá nhân.</p>
<p>Kết quả của Rosenbaum and Rubin (1983) rất mạnh và hữu ích vì điểm xu hướng là biến một chiều, trong khi biến kểm soát X có thể là dữ liệu nhiều chiều.</p>
<p>Với giả định không có nhiễu giới thiệu ở trên, ta có thể viết lại tác động can thiệp bình quân như sau:</p>
<p><img src="https://miro.medium.com/max/1400/1*U1i2prKHvJT_QV-l3FDPZA.png" alt="Tác động can thiệp bình quân" /></p>
<p>Lưu ý là công thức tác động can thiệp bình quân này không phụ thuộc vào các kết quả tiềm năng Yᵢ⁽¹⁾ and Yᵢ⁽⁰⁾, mà chỉ phụ thuộc vào kết quả quan sát Yᵢ.</p>
<p>Công thức tác động can thiệp bình quân này hàm ý rằng ước lượng Bình quân Gia quyền theo nghịch đảo của điểm xu hướng (Inverse Propensity Weighted - IPW) là ước lượng không chệch của tác động can thiệp bình quân τ.</p>
<p><img src="https://miro.medium.com/max/1400/1*O4tJk86BuDeerVXsQMIBVQ.png" alt="Ước lượng IPW" /></p>
<p>Ước lượng này không khả thi vì ta không quan sát được điểm xu hướng e(Xᵢ). Tuy nhiên, ta có thể ước lượng chúng. Trên thực tế Imbens, Hirano, Ridder (2003) chỉ ra rằng bạn nên sử dụng giá trị ước lượng của điểm xu hướng ngay cả khi bạn biết giá trị thật của chúng (ví dụ nếu bạn biết quy trình lấy mẫu). Ý tưởng là, nếu ước lượng của điểm xu hướng khác giá trị thực của chúng, điều này mang thêm thông tin cho quá trình ước lượng.</p>
<p>Có nhiều cách để ước lượng xác suất, và cách đơn giản và phổ biến nhất là sử dụng hồi quy logistic.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegressionCV</span>
<span class="n">df</span><span class="p">[</span><span class="s">"pscore"</span><span class="p">]</span> <span class="o">=</span> <span class="n">LogisticRegressionCV</span><span class="p">().</span><span class="n">fit</span><span class="p">(</span><span class="n">y</span><span class="o">=</span><span class="n">df</span><span class="p">[</span><span class="s">"nền_tối"</span><span class="p">],</span> <span class="n">X</span><span class="o">=</span><span class="n">df</span><span class="p">[</span><span class="n">X</span><span class="p">]).</span><span class="n">predict_proba</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="n">X</span><span class="p">])[:,</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<p>Bất cứ khi nào xây dựng mô hình dự đoán, ta nên xây dựng mô hình dựa trên mẫu dữ liệu khác với dữ liệu dùng để suy luận. Nguyên tắc này thường được gọi là đánh giá chéo hoặc ước lượng chéo. Một trong những quy trình đánh giá chéo tốt nhất (nhưng tính toán nhiều) là ước lượng chéo bỏ một quan sát (leave-one-out LOO): khi dự đoán giá trị của quan sát i, ta sử dụng toàn bộ dữ liệu ngoại trừ i. Ta thực hiện quy trình ước lượng chéo LOO sử dụng các hàm cross_val_predict và LeaveOneOut của thư viện Sklearn.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">cross_val_predict</span><span class="p">,</span> <span class="n">LeaveOneOut</span>
<span class="n">df</span><span class="p">[</span><span class="s">'pscore'</span><span class="p">]</span> <span class="o">=</span> <span class="n">cross_val_predict</span><span class="p">(</span><span class="n">estimator</span><span class="o">=</span><span class="n">LogisticRegressionCV</span><span class="p">(),</span>
<span class="n">X</span><span class="o">=</span><span class="n">df</span><span class="p">[</span><span class="n">X</span><span class="p">],</span>
<span class="n">y</span><span class="o">=</span><span class="n">df</span><span class="p">[</span><span class="s">"nền_tối"</span><span class="p">],</span>
<span class="n">cv</span><span class="o">=</span><span class="n">LeaveOneOut</span><span class="p">(),</span>
<span class="n">method</span><span class="o">=</span><span class="s">'predict_proba'</span><span class="p">,</span>
<span class="n">n_jobs</span><span class="o">=-</span><span class="mi">1</span><span class="p">)[:,</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<p>Một phép thử quan trọng sau khi ước lượng điểm xu hướng là vẽ đồ thị so sánh nhóm can thiệp và đối chứng. Trước hết, ta có thể quan sát xem hai nhóm có cân bằng hay không dựa vào việc quan sát hai phân phối xác suất có tương tự hay không. Hơn nữa, ta có thể kiểm tra giả thiết trùng lặp có thỏa đáng hay không. Trường hợp lý tưởng là hai phân phối xác suất cùng phủ khoảng giá trị.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">sns</span><span class="p">.</span><span class="n">histplot</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">x</span><span class="o">=</span><span class="s">'pscore'</span><span class="p">,</span> <span class="n">hue</span><span class="o">=</span><span class="s">'nền_tối'</span><span class="p">,</span> <span class="n">bins</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">stat</span><span class="o">=</span><span class="s">'density'</span><span class="p">,</span> <span class="n">common_norm</span><span class="o">=</span><span class="bp">False</span><span class="p">).</span>\
<span class="nb">set</span><span class="p">(</span><span class="n">ylabel</span><span class="o">=</span><span class="s">""</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="s">"Distribution of Propensity Scores"</span><span class="p">);</span>
</code></pre></div></div>
<p><img src="/assets/images/blogpost/ghepcap/output_41_0.png" alt="image-center" class="align-center" /></p>
<p>Như dự kiến, phân phối xác suất điểm xu hướng giữa nhóm can thiệp và kiểm soát rất khác nhau, hàm ý hai nhóm không tương đồng. Tuy nhiên hai phân phối xác suất cùng phủ một khoảng giá trị tương tự, hàm ý giả thiết trùng lặp được tuân thủ.</p>
<p>Làm thế nào để ước lượng tác động can thiệp bình quân?</p>
<p>Sau khi tính điểm xu hướng, ta chỉ việc gán quyền số cho các quan sát bằng điểm xu hướng của chúng. Chúng ta có thể tính hiệu của bình quân gia quyền của số_giờ_đọc hoặc chạy một phương trình hồi quy gia quyền của số_giờ_đọc theo nền_tối sử dụng hàm wls (bình phương tối thiểu gia quyền)</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">w</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">/</span> <span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s">"pscore"</span><span class="p">]</span> <span class="o">*</span> <span class="n">df</span><span class="p">[</span><span class="s">"nền_tối"</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">df</span><span class="p">[</span><span class="s">"pscore"</span><span class="p">])</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">df</span><span class="p">[</span><span class="s">"nền_tối"</span><span class="p">]))</span>
<span class="n">smf</span><span class="p">.</span><span class="n">wls</span><span class="p">(</span><span class="s">"số_giờ_đọc ~ nền_tối"</span><span class="p">,</span> <span class="n">weights</span><span class="o">=</span><span class="n">w</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">).</span><span class="n">fit</span><span class="p">().</span><span class="n">summary</span><span class="p">().</span><span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<table class="simpletable">
<tr>
<td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[0.025</th> <th>0.975]</th>
</tr>
<tr>
<th>Intercept</th> <td> 18.5755</td> <td> 0.412</td> <td> 45.131</td> <td> 0.000</td> <td> 17.766</td> <td> 19.386</td>
</tr>
<tr>
<th>nền_tối[T.True]</th> <td> 1.1242</td> <td> 0.582</td> <td> 1.930</td> <td> 0.054</td> <td> -0.022</td> <td> 2.270</td>
</tr>
</table>
<p>The effect of nền_tối is now positive and almost statistically significant, at the 5% level.</p>
<p>Note that the wls function automatically normalizes weights so that they sum to 1, which greatly improves the stability of the estimator. In fact, the unnormalized IPW estimator can be very unstable when the propensity scores approach zero or one.</p>
<p>Tác động của nền_tối trở nên dương và gần có ý nghĩa thống kê ở mức 5%.</p>
<p>Lưu ý hàm wls tự động chuẩn hóa các quyền số sao cho tổng của chúng bằng 1. Điều này giúp làm tăng tính vững của ước lượng. Trên thực tế, ước lượng IPW không chuẩn hóa có thể trở nên rất không vững khi điểm xu hướng tiến tới 1 hoặc 0.</p>
<h1 id="hồi-quy-với-biến-kiểm-soát">Hồi quy với Biến Kiểm soát</h1>
<p>Phương pháp cuối cùng mà ta xem xét hôm nay là hồi quy tuyến tính với biến kiểm soát. Ước lượng này rất dễ tiến hành vì ta chỉ việc đưa cá đặc điểm của người dùng - giới tính, tuổi và giờ vào phương trình hồi quy số_giờ_đọc theo nền_tối.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">smf</span><span class="p">.</span><span class="n">ols</span><span class="p">(</span><span class="s">"số_giờ_đọc ~ nền_tối + nam_giới + tuổi + tổng_giờ_đọc"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">).</span><span class="n">fit</span><span class="p">().</span><span class="n">summary</span><span class="p">().</span><span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<table class="simpletable">
<tr>
<td></td> <th>coef</th> <th>std err</th> <th>t</th> <th>P>|t|</th> <th>[0.025</th> <th>0.975]</th>
</tr>
<tr>
<th>Intercept</th> <td> 16.8591</td> <td> 1.082</td> <td> 15.577</td> <td> 0.000</td> <td> 14.729</td> <td> 18.989</td>
</tr>
<tr>
<th>nền_tối[T.True]</th> <td> 1.3858</td> <td> 0.524</td> <td> 2.646</td> <td> 0.009</td> <td> 0.355</td> <td> 2.417</td>
</tr>
<tr>
<th>nam_giới</th> <td> -4.4855</td> <td> 0.499</td> <td> -8.990</td> <td> 0.000</td> <td> -5.468</td> <td> -3.504</td>
</tr>
<tr>
<th>tuổi</th> <td> 0.0513</td> <td> 0.022</td> <td> 2.311</td> <td> 0.022</td> <td> 0.008</td> <td> 0.095</td>
</tr>
<tr>
<th>tổng_giờ_đọc</th> <td> 0.0043</td> <td> 0.001</td> <td> 8.427</td> <td> 0.000</td> <td> 0.003</td> <td> 0.005</td>
</tr>
</table>
<p>Tác động can thiệp bình quân lại mang dấu dương và có ý nghĩa thống kê ở mức 1%!</p>
<h1 id="so-sánh">So sánh</h1>
<p>Các phương pháp khác nhau ở trên có quan hệ như thế nào?</p>
<h1 id="ipw-và-hồi-quy">IPW và Hồi quy</h1>
<p>Có một mối quan hệ chặt chẽ giữa ước ượng IPW và hồi quy tuyến tính với biến kiểm soát. Điều này càng rõ ràng khi ta có một biến rời rạc X.</p>
<p>Trong trường hợp này, giá trị ước lượng IPW được tính theo công thức:</p>
<p><img src="https://miro.medium.com/max/1400/1*bZoPFxIEFk3_AuYD4y-TSg.png" alt="Công thức tương đương của ước lượng IPW" /></p>
<p>Giá trị ước lượng IPW là bình quân gia quyền của tác động can thiệp τₓ, với quyền số là xác suất nhận can thiệp.</p>
<p>Giá trị ước lượng của hồi quy tuyến tính với biến kiểm soát là:</p>
<p><img src="https://miro.medium.com/max/1400/1*t32Ff8mo8Y04YCcms42VAQ.png" alt="Công thức tương đương ước lượng OLS" /></p>
<p>Giá trị ước lượng OLS là bình quân gia quyền của tác động can thiệp τₓ, với trọng số là phương sai của xác suất can thiệp. Điều này có nghĩa là hồi quy tuyến tính cũng là một ược lượng theo trọng số, với trọng số cao cho các thuộc tính mà ta quan sát được độ phân tán cao trong việc nhận tác động. Vì một biến ngẫu nhiên nhị phân có phương sai cao nhất tại giá trị kì vọng 0.5, OLS đặt trọng số cao cho các quan sát có đặc điểm quan sát được chia đều 50/50 giữa nhóm can thiệp và đối chứng. Mặt khác, nếu một số đặc điểm nào đó mà ta chỉ quan sát được ở nhóm can thiệp hoặc đối chứng, chúng sẽ nhận giá trị trọng số bằng 0. Tôi để cử chương 3 của cuốn sách Angrist and Pischke (2009) có thể cung cấp thêm chi tiết.</p>
<h1 id="ipw-và-ghép-cặp">IPW và ghép cặp</h1>
<p>Như ta thấy ở phần IPW, kết quả của Rosenbaum and Rubin (1983) cho thấy ta không nên tiến hành phân tích điều kiện với toàn bộ thuộc tính quan sát X, mà chỉ cần cố định điểm xu hướng e(X).</p>
<p>Ta đã thấy kết quả này không chỉ hàm ý ước lượng bình quân gia quyền mà còn mở rộng cho ghép cặp: ta không cần phải ghép mọi quan sát dựa trên các biến kiểm soát X, mà chỉ cần ghép chúng dựa trên biến duy nhất là điểm xu hướng e(X). Phương pháp này được gọi là ghép cặp điểm xu hướng.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">psm</span> <span class="o">=</span> <span class="n">NearestNeighborMatch</span><span class="p">(</span><span class="n">replace</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">df_ipwmatched</span> <span class="o">=</span> <span class="n">psm</span><span class="p">.</span><span class="n">match</span><span class="p">(</span><span class="n">data</span><span class="o">=</span><span class="n">df</span><span class="p">,</span> <span class="n">treatment_col</span><span class="o">=</span><span class="s">"nền_tối"</span><span class="p">,</span> <span class="n">score_cols</span><span class="o">=</span><span class="p">[</span><span class="s">'pscore'</span><span class="p">])</span>
</code></pre></div></div>
<p>Như nói ở trên, sau khi ghép cặp, ta chỉ cần đơn giản ước lượng bằng cách tính hiệu của kì vọng, và nhớ rằng các quan sát không độc lập và cần thận trọng khi suy luận.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">smf</span><span class="p">.</span><span class="n">ols</span><span class="p">(</span><span class="s">"số_giờ_đọc ~ nền_tối"</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="n">df_ipwmatched</span><span class="p">)</span>\
<span class="p">.</span><span class="n">fit</span><span class="p">(</span><span class="n">cov_type</span><span class="o">=</span><span class="s">'cluster'</span><span class="p">,</span> <span class="n">cov_kwds</span><span class="o">=</span><span class="p">{</span><span class="s">'groups'</span><span class="p">:</span> <span class="n">df_ipwmatched</span><span class="p">.</span><span class="n">index</span><span class="p">})</span>\
<span class="p">.</span><span class="n">summary</span><span class="p">().</span><span class="n">tables</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</code></pre></div></div>
<table class="simpletable">
<tr>
<td></td> <th>coef</th> <th>std err</th> <th>z</th> <th>P>|z|</th> <th>[0.025</th> <th>0.975]</th>
</tr>
<tr>
<th>Intercept</th> <td> 18.5020</td> <td> 0.516</td> <td> 35.864</td> <td> 0.000</td> <td> 17.491</td> <td> 19.513</td>
</tr>
<tr>
<th>nền_tối[T.True]</th> <td> 1.0290</td> <td> 0.713</td> <td> 1.444</td> <td> 0.149</td> <td> -0.368</td> <td> 2.426</td>
</tr>
</table>
<p>Tác động ước lượng của nền_tối dương, có ý nghĩa thống kê ở mức 1% và gần với giá trị thực 2!</p>
<h1 id="kết-luận">Kết luận</h1>
<p>Trong blog này, ta đã cùng xem xét phân tích điều kiện có thể tiến hành bằng nhiều cách. Ghép cặp trực tiếp ghép các cá nhân tương tự ở nhóm can thiệp với nhóm đối chứng. Bình quân gia quyền đơn giản gán các giá trị quyền số khác nhau cho từng quan sát theo xác suất chúng nhận can thiệp. Hồi quy thay vào đó gán quyền số cho các quan sát theo phương sai có điều kiện của tiếp nhận can thiệp. Hồi quy đặt quyền số lớn hơn cho các quan sát có thuộc tính phổ biến với cả nhóm can thiệp và đối chứng.</p>
<p>Các phương pháp này rất hữu dụng vì chúng hoặc cho phép ta ước lượng tác động nhân quả từ dữ liệu quan sát rất lớn hoặc điều chỉnh ước lượng thí nghiệm khi việc ngẫu nhiên hóa không hoàn hảo hoặc khi ta có mẫu nhỏ.</p>
<p>Cuối cùng, nếu bạn muốn tìm hiều thêm, tôi đề cử video bài giảng miễn phí về điểm xu hướng của Paul Goldsmith-Pinkham.</p>
<p>Tài liệu tham khảo</p>
<p>[1] P. Rosenbaum, D. Rubin, The central role of the propensity score in observational studies for causal effects (1983), Biometrika.</p>
<p>[2] G. Imbens, K. Hirano, G. Ridder, Efficient Estimation of Avertuổi Treatment Effects Using the Estimated Propensity Score (2003), Econometrica.</p>
<p>[3] J. Angrist, J. S. Pischke, Mostly harmless econometrics: An Empiricist’s Companion (2009), Princeton University Press.</p>Kinh tế học Vô hạiHiểu và so sánh các phương pháp suy luận nhân quả có điều kiệnSơ lược về Phân tích Dữ liệu2022-05-21T00:00:00+07:002022-05-21T00:00:00+07:00http://kinhtehocvohai.github.io/codingecon/S%C6%A1-l%C6%B0%E1%BB%A3c-v%E1%BB%81-Ph%C3%A2n-t%C3%ADch-D%E1%BB%AF-li%E1%BB%87u<p>Trước khi bắt đầu, các bạn có thể cài đặt Python và các packages phục vụ cho việc phân tích dữ liệu một cách dễ dàng thông qua Anaconda tại đây https://www.anaconda.com/products/distribution</p>
<h1 id="nạp-và-kiểm-tra-kiểu-dữ-liệu">Nạp và kiểm tra kiểu dữ liệu</h1>
<p>Việc nạp dữ liệu vào khung dữ liệu được thực hiện bằng các lệnh như df = pd.read_csv (…) hoặc df = pd.read_stata (…). Chúng ta sẽ nạp dữ liệu về Chiến tranh giữa các vì sao:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">pandas</span> <span class="k">as</span> <span class="n">pd</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>
<span class="kn">from</span> <span class="nn">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>
<span class="c1"># Đặt hạt giống nhằm thuận tiện cho việc tái tạo dãy số ngẫu nhiên
</span><span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="n">seed</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span>
<span class="c1"># Cài đặt số dòng hiển thị tối đa
</span><span class="n">pd</span><span class="p">.</span><span class="n">set_option</span><span class="p">(</span><span class="s">"display.max_rows"</span><span class="p">,</span> <span class="mi">6</span><span class="p">)</span>
<span class="c1"># Cài đặt plot
</span><span class="n">plt</span><span class="p">.</span><span class="n">style</span><span class="p">.</span><span class="n">use</span><span class="p">(</span>
<span class="s">"https://github.com/aeturrell/coding-for-economists/raw/main/plot_style.txt"</span>
<span class="p">)</span>
<span class="n">df</span> <span class="o">=</span> <span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="n">read_csv</span><span class="p">(</span>
<span class="s">"https://github.com/aeturrell/coding-for-economists/raw/main/data/starwars.csv"</span><span class="p">,</span>
<span class="n">index_col</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">.</span><span class="n">dropna</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="s">"species"</span><span class="p">])</span>
<span class="p">)</span>
<span class="c1"># Kiểm tra thông tin về khung dữ liệu
</span><span class="n">df</span><span class="p">.</span><span class="n">info</span><span class="p">()</span>
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><class 'pandas.core.frame.DataFrame'>
Int64Index: 82 entries, 0 to 86
Data columns (total 8 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 name 82 non-null object
1 height 77 non-null float64
2 mass 58 non-null float64
3 hair_color 77 non-null object
4 eye_color 80 non-null object
5 gender 79 non-null object
6 homeworld 74 non-null object
7 species 82 non-null object
dtypes: float64(2), object(6)
memory usage: 5.8+ KB
</code></pre></div></div>
<h1 id="hiển-thị-một-vài-dòng-đầu-tiên-với-head">Hiển thị một vài dòng đầu tiên với head()</h1>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">head</span><span class="p">()</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>homeworld</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Luke Skywalker</td>
<td>172.0</td>
<td>77.0</td>
<td>blond</td>
<td>blue</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
</tr>
<tr>
<th>1</th>
<td>C-3PO</td>
<td>167.0</td>
<td>75.0</td>
<td>NaN</td>
<td>yellow</td>
<td>NaN</td>
<td>Tatooine</td>
<td>Droid</td>
</tr>
<tr>
<th>2</th>
<td>R2-D2</td>
<td>96.0</td>
<td>32.0</td>
<td>NaN</td>
<td>red</td>
<td>NaN</td>
<td>Naboo</td>
<td>Droid</td>
</tr>
<tr>
<th>3</th>
<td>Darth Vader</td>
<td>202.0</td>
<td>136.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
</tr>
<tr>
<th>4</th>
<td>Leia Organa</td>
<td>150.0</td>
<td>49.0</td>
<td>brown</td>
<td>brown</td>
<td>female</td>
<td>Alderaan</td>
<td>Human</td>
</tr>
</tbody>
</table>
</div>
<h1 id="lọc-các-dòng-và-cột-theo-điều-kiện-bằng-cách-sử-dụng-lệnh-dfloc-điều-kiện-hoặc-dòng-cột">Lọc các dòng và cột theo điều kiện bằng cách sử dụng lệnh df.loc [điều kiện hoặc dòng, cột]</h1>
<p>.loc là viết tắt của location (vị trí) và cho phép người dùng lọc (còn gọi là tập hợp con) một khung dữ liệu. .loc hoạt động giống như một chỉ số, vì vậy nó luôn đi kèm với dấu ngoặc vuông, ví dụ: df.loc […].</p>
<p>loc cần hai tham số đầu vào. Đầu tiên là danh sách tên của các dòng bạn muốn chọn hoặc một điều kiện (tức là giá trị logic, với 1= đúng, 0=sai, có cùng độ dài với khung dữ liệu) chọn các dòng nhất định. Hãy nhớ rằng, bạn có thể dễ dàng tạo một loạt các giá trị logic bằng cách kiểm tra một cột với một điều kiện, ví dụ: df [‘column1’] == ‘black’.</p>
<p>Tham số thứ hai bao gồm danh sách tên cột bạn muốn chọn. Trong cả hai trường hợp,: là viết tắt của “sử dụng tất cả các dòng” hoặc “sử dụng tất cả các cột”. Nếu bạn có (các) điều kiện hoặc (các) cột (nhưng không phải cả hai), bạn chỉ cần viết df [condition (s)] hoặc df [column (s)].</p>
<p>Dưới đây là một ví dụ với một điều kiện được tạo từ hai phép so sánh và danh sách các cột:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">loc</span><span class="p">[(</span><span class="n">df</span><span class="p">[</span><span class="s">"hair_color"</span><span class="p">]</span> <span class="o">==</span> <span class="s">"brown"</span><span class="p">)</span> <span class="o">&</span> <span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="s">"eye_color"</span><span class="p">]</span> <span class="o">==</span> <span class="s">"blue"</span><span class="p">),</span> <span class="p">[</span><span class="s">"name"</span><span class="p">,</span> <span class="s">"species"</span><span class="p">]]</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>6</th>
<td>Beru Whitesun lars</td>
<td>Human</td>
</tr>
<tr>
<th>12</th>
<td>Chewbacca</td>
<td>Wookiee</td>
</tr>
<tr>
<th>17</th>
<td>Jek Tono Porkins</td>
<td>Human</td>
</tr>
<tr>
<th>30</th>
<td>Qui-Gon Jinn</td>
<td>Human</td>
</tr>
<tr>
<th>58</th>
<td>Cliegg Lars</td>
<td>Human</td>
</tr>
<tr>
<th>77</th>
<td>Tarfful</td>
<td>Wookiee</td>
</tr>
</tbody>
</table>
</div>
<h1 id="sắp-xếp-dòng-với-lệnh-sort_values">Sắp xếp dòng với lệnh .sort_values()</h1>
<p>Sằp xếp theo thứ tự giảm dần bằng lệnh sort_values(columns, ascending=False)</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">sort_values</span><span class="p">([</span><span class="s">"height"</span><span class="p">,</span> <span class="s">"mass"</span><span class="p">])</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>homeworld</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>18</th>
<td>Yoda</td>
<td>66.0</td>
<td>17.0</td>
<td>white</td>
<td>brown</td>
<td>male</td>
<td>NaN</td>
<td>Yoda's species</td>
</tr>
<tr>
<th>71</th>
<td>Ratts Tyerell</td>
<td>79.0</td>
<td>15.0</td>
<td>none</td>
<td>NaN</td>
<td>male</td>
<td>Aleen Minor</td>
<td>Aleena</td>
</tr>
<tr>
<th>28</th>
<td>Wicket Systri Warrick</td>
<td>88.0</td>
<td>20.0</td>
<td>brown</td>
<td>brown</td>
<td>male</td>
<td>Endor</td>
<td>Ewok</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>82</th>
<td>Rey</td>
<td>NaN</td>
<td>NaN</td>
<td>brown</td>
<td>hazel</td>
<td>female</td>
<td>NaN</td>
<td>Human</td>
</tr>
<tr>
<th>83</th>
<td>Poe Dameron</td>
<td>NaN</td>
<td>NaN</td>
<td>brown</td>
<td>brown</td>
<td>male</td>
<td>NaN</td>
<td>Human</td>
</tr>
<tr>
<th>84</th>
<td>BB8</td>
<td>NaN</td>
<td>NaN</td>
<td>none</td>
<td>black</td>
<td>none</td>
<td>NaN</td>
<td>Droid</td>
</tr>
</tbody>
</table>
<p>82 rows × 8 columns</p>
</div>
<h1 id="chọn-nhiều-dòng-hoặc-cột">Chọn nhiều dòng hoặc cột</h1>
<p>Có thể dùng lát cắt để chọn nhiều dòng hoặc cột theo tên bằng cách sử dụng .loc [tên dòng đầu : tên dòng cuối : bước nhảy, tên cột đầu :tên cột cuối : bước nhảy] hoặc theo vị trí bằng cách sử dụng .iloc [chỉ số dòng đầu : chỉ số dòng cuối : bước nhảy,chỉ số cột đầu : chỉ số cột cuối : bước nhảy].</p>
<p>Ví dụ 1, chọn mỗi dòng thứ 10 từ hàng thứ hai và các cột giữa “tên” và “giới tính”:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="mi">2</span><span class="p">::</span><span class="mi">10</span><span class="p">,</span> <span class="s">"name"</span><span class="p">:</span><span class="s">"gender"</span><span class="p">]</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
</tr>
</thead>
<tbody>
<tr>
<th>2</th>
<td>R2-D2</td>
<td>96.0</td>
<td>32.0</td>
<td>NaN</td>
<td>red</td>
<td>NaN</td>
</tr>
<tr>
<th>12</th>
<td>Chewbacca</td>
<td>228.0</td>
<td>112.0</td>
<td>brown</td>
<td>blue</td>
<td>male</td>
</tr>
<tr>
<th>22</th>
<td>Bossk</td>
<td>190.0</td>
<td>113.0</td>
<td>none</td>
<td>red</td>
<td>male</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>54</th>
<td>Plo Koon</td>
<td>188.0</td>
<td>80.0</td>
<td>none</td>
<td>black</td>
<td>male</td>
</tr>
<tr>
<th>64</th>
<td>Bail Prestor Organa</td>
<td>191.0</td>
<td>NaN</td>
<td>black</td>
<td>brown</td>
<td>male</td>
</tr>
<tr>
<th>75</th>
<td>Shaak Ti</td>
<td>178.0</td>
<td>57.0</td>
<td>none</td>
<td>black</td>
<td>female</td>
</tr>
</tbody>
</table>
<p>8 rows × 6 columns</p>
</div>
<p>Lưu ý rằng với trường hợp này, loc chấp nhận số vì với tập dữ liệu này, tên dòng được định dạng số. Nếu tên dòng định dạng văn bản và ta muốn cắt các dòng theo vị trí chỉ số của chúng, ta sẽ phải sử dụng iloc.</p>
<p>Ví dụ 2, chọn 5 dòng đầu tiên và 2 cột cuối cùng theo vị trí chỉ số:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">iloc</span><span class="p">[:</span><span class="mi">5</span><span class="p">,</span> <span class="o">-</span><span class="mi">2</span><span class="p">:]</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>homeworld</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Tatooine</td>
<td>Human</td>
</tr>
<tr>
<th>1</th>
<td>Tatooine</td>
<td>Droid</td>
</tr>
<tr>
<th>2</th>
<td>Naboo</td>
<td>Droid</td>
</tr>
<tr>
<th>3</th>
<td>Tatooine</td>
<td>Human</td>
</tr>
<tr>
<th>4</th>
<td>Alderaan</td>
<td>Human</td>
</tr>
</tbody>
</table>
</div>
<h1 id="chọn-ngẫu-nhiên-mẫu-với-lệnh-sample">Chọn ngẫu nhiên mẫu với lệnh .sample</h1>
<p>.sample(n) chọn ngẫu nhiên n dòng, .sample (frac = 0,4) chọn 40% dữ liệu, replace = True chọn mẫu bằng thay thế</p>
<p>Lấy mẫu gồm 5 dòng:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">sample</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>homeworld</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>3</th>
<td>Darth Vader</td>
<td>202.0</td>
<td>136.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
</tr>
<tr>
<th>44</th>
<td>Dud Bolt</td>
<td>94.0</td>
<td>45.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Vulpter</td>
<td>Vulptereen</td>
</tr>
<tr>
<th>41</th>
<td>Darth Maul</td>
<td>175.0</td>
<td>80.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Dathomir</td>
<td>Zabrak</td>
</tr>
<tr>
<th>38</th>
<td>Sebulba</td>
<td>112.0</td>
<td>40.0</td>
<td>none</td>
<td>orange</td>
<td>male</td>
<td>Malastare</td>
<td>Dug</td>
</tr>
<tr>
<th>26</th>
<td>Mon Mothma</td>
<td>150.0</td>
<td>NaN</td>
<td>auburn</td>
<td>blue</td>
<td>female</td>
<td>Chandrila</td>
<td>Human</td>
</tr>
</tbody>
</table>
</div>
<h1 id="đổi-tên-bằng-rename">Đổi tên bằng .rename</h1>
<p>Bạn có thể đổi tên tất cả các cột bằng lệnh df.rename (columns = str.lower) để đặt tất cả các cột ở dạng chữ thường. Ngoài ra, sử dụng từ điển để cho biết cột nào nên thay thế bằng tên gì:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">rename</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">{</span><span class="s">"homeworld"</span><span class="p">:</span> <span class="s">"home_world"</span><span class="p">})</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>home_world</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Luke Skywalker</td>
<td>172.0</td>
<td>77.0</td>
<td>blond</td>
<td>blue</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
</tr>
<tr>
<th>1</th>
<td>C-3PO</td>
<td>167.0</td>
<td>75.0</td>
<td>NaN</td>
<td>yellow</td>
<td>NaN</td>
<td>Tatooine</td>
<td>Droid</td>
</tr>
<tr>
<th>2</th>
<td>R2-D2</td>
<td>96.0</td>
<td>32.0</td>
<td>NaN</td>
<td>red</td>
<td>NaN</td>
<td>Naboo</td>
<td>Droid</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>83</th>
<td>Poe Dameron</td>
<td>NaN</td>
<td>NaN</td>
<td>brown</td>
<td>brown</td>
<td>male</td>
<td>NaN</td>
<td>Human</td>
</tr>
<tr>
<th>84</th>
<td>BB8</td>
<td>NaN</td>
<td>NaN</td>
<td>none</td>
<td>black</td>
<td>none</td>
<td>NaN</td>
<td>Droid</td>
</tr>
<tr>
<th>86</th>
<td>Padmé Amidala</td>
<td>165.0</td>
<td>45.0</td>
<td>brown</td>
<td>brown</td>
<td>female</td>
<td>Naboo</td>
<td>Human</td>
</tr>
</tbody>
</table>
<p>82 rows × 8 columns</p>
</div>
<h1 id="thêm-các-cột-mới-với-assign-hoặc-assignment">Thêm các cột mới với .assign hoặc assignment</h1>
<p>Thông thường, bạn sẽ muốn tạo các cột mới dựa trên các cột hiện có.</p>
<p>Có hai cách để làm điều này. Hãy cùng xem cả hai với một ví dụ trong đó chúng tôi muốn tạo một cột chiều cao mới tính bằng mét, được gọi là “height_m:.</p>
<p>Cách đầu tiên, và được sử dụng phổ biến nhất, được gọi là phép gán giá trị và chỉ bao gồm việc nhập tên cột mới trong khung dữ liệu và đặt nó ở phía bên trái của biểu thức gán được tính dựa trên các cột khung dữ liệu hiện có ở phía bên phải . Ví dụ: df [‘height_m’] = df [‘height’] / 100.</p>
<p>Thứ hai là sử dụng phương thức gán trực tiếp trên khung dữ liệu. Trong trường hợp này, câu lệnh gán xuất hiện bên trong dấu ngoặc. Ví dụ, df.assign (height_m = df [“height”] / 100).</p>
<p>Hãy xem các ví dụ của cả hai phương pháp gán giá trị này.</p>
<p>Trước tiên, hãy sử dụng phương pháp đầu tiên:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">[</span><span class="s">'height_m'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">[</span><span class="s">'height'</span><span class="p">]</span><span class="o">/</span><span class="mi">100</span>
<span class="n">df</span><span class="p">.</span><span class="n">head</span><span class="p">()</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>homeworld</th>
<th>species</th>
<th>height_m</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Luke Skywalker</td>
<td>172.0</td>
<td>77.0</td>
<td>blond</td>
<td>blue</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
<td>1.72</td>
</tr>
<tr>
<th>1</th>
<td>C-3PO</td>
<td>167.0</td>
<td>75.0</td>
<td>NaN</td>
<td>yellow</td>
<td>NaN</td>
<td>Tatooine</td>
<td>Droid</td>
<td>1.67</td>
</tr>
<tr>
<th>2</th>
<td>R2-D2</td>
<td>96.0</td>
<td>32.0</td>
<td>NaN</td>
<td>red</td>
<td>NaN</td>
<td>Naboo</td>
<td>Droid</td>
<td>0.96</td>
</tr>
<tr>
<th>3</th>
<td>Darth Vader</td>
<td>202.0</td>
<td>136.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
<td>2.02</td>
</tr>
<tr>
<th>4</th>
<td>Leia Organa</td>
<td>150.0</td>
<td>49.0</td>
<td>brown</td>
<td>brown</td>
<td>female</td>
<td>Alderaan</td>
<td>Human</td>
<td>1.50</td>
</tr>
</tbody>
</table>
</div>
<p>Và bây giờ là hàm .assign</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">assign</span><span class="p">(</span><span class="n">height_m</span><span class="o">=</span><span class="n">df</span><span class="p">[</span><span class="s">"height"</span><span class="p">]</span> <span class="o">/</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">df</span><span class="p">.</span><span class="n">head</span><span class="p">()</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>homeworld</th>
<th>species</th>
<th>height_m</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Luke Skywalker</td>
<td>172.0</td>
<td>77.0</td>
<td>blond</td>
<td>blue</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
<td>1.72</td>
</tr>
<tr>
<th>1</th>
<td>C-3PO</td>
<td>167.0</td>
<td>75.0</td>
<td>NaN</td>
<td>yellow</td>
<td>NaN</td>
<td>Tatooine</td>
<td>Droid</td>
<td>1.67</td>
</tr>
<tr>
<th>2</th>
<td>R2-D2</td>
<td>96.0</td>
<td>32.0</td>
<td>NaN</td>
<td>red</td>
<td>NaN</td>
<td>Naboo</td>
<td>Droid</td>
<td>0.96</td>
</tr>
<tr>
<th>3</th>
<td>Darth Vader</td>
<td>202.0</td>
<td>136.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
<td>2.02</td>
</tr>
<tr>
<th>4</th>
<td>Leia Organa</td>
<td>150.0</td>
<td>49.0</td>
<td>brown</td>
<td>brown</td>
<td>female</td>
<td>Alderaan</td>
<td>Human</td>
<td>1.50</td>
</tr>
</tbody>
</table>
</div>
<p>Cột mới tạo được đặt cuối cùng; tuy nhiên, chúng tôi muốn nó bên cạnh cột chiều cao bằng cách sắp xếp các cột (axis = 1) theo thứ tự bảng chữ cái:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">assign</span><span class="p">(</span><span class="n">height_m</span><span class="o">=</span><span class="n">df</span><span class="p">[</span><span class="s">"height"</span><span class="p">]</span> <span class="o">/</span> <span class="mi">100</span><span class="p">).</span><span class="n">sort_index</span><span class="p">(</span><span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>eye_color</th>
<th>gender</th>
<th>hair_color</th>
<th>height</th>
<th>height_m</th>
<th>homeworld</th>
<th>mass</th>
<th>name</th>
<th>species</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>blue</td>
<td>male</td>
<td>blond</td>
<td>172.0</td>
<td>1.72</td>
<td>Tatooine</td>
<td>77.0</td>
<td>Luke Skywalker</td>
<td>Human</td>
</tr>
<tr>
<th>1</th>
<td>yellow</td>
<td>NaN</td>
<td>NaN</td>
<td>167.0</td>
<td>1.67</td>
<td>Tatooine</td>
<td>75.0</td>
<td>C-3PO</td>
<td>Droid</td>
</tr>
<tr>
<th>2</th>
<td>red</td>
<td>NaN</td>
<td>NaN</td>
<td>96.0</td>
<td>0.96</td>
<td>Naboo</td>
<td>32.0</td>
<td>R2-D2</td>
<td>Droid</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>83</th>
<td>brown</td>
<td>male</td>
<td>brown</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>Poe Dameron</td>
<td>Human</td>
</tr>
<tr>
<th>84</th>
<td>black</td>
<td>none</td>
<td>none</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>NaN</td>
<td>BB8</td>
<td>Droid</td>
</tr>
<tr>
<th>86</th>
<td>brown</td>
<td>female</td>
<td>brown</td>
<td>165.0</td>
<td>1.65</td>
<td>Naboo</td>
<td>45.0</td>
<td>Padmé Amidala</td>
<td>Human</td>
</tr>
</tbody>
</table>
<p>82 rows × 9 columns</p>
</div>
<p>Để ghi đè các cột hiện có, chỉ cần sử dụng height = df [‘height’] / 100 với phương thức gán hoặc df [‘height’] = df [‘height’] / 100.</p>
<h1 id="mô-tả-các-giá-trị-số-với-describe-">Mô tả các giá trị số với .describe ()</h1>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">describe</span><span class="p">()</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>height</th>
<th>mass</th>
<th>height_m</th>
</tr>
</thead>
<tbody>
<tr>
<th>count</th>
<td>77.000000</td>
<td>58.000000</td>
<td>77.000000</td>
</tr>
<tr>
<th>mean</th>
<td>175.103896</td>
<td>98.162069</td>
<td>1.751039</td>
</tr>
<tr>
<th>std</th>
<td>34.483629</td>
<td>170.810183</td>
<td>0.344836</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>50%</th>
<td>180.000000</td>
<td>79.000000</td>
<td>1.800000</td>
</tr>
<tr>
<th>75%</th>
<td>191.000000</td>
<td>84.750000</td>
<td>1.910000</td>
</tr>
<tr>
<th>max</th>
<td>264.000000</td>
<td>1358.000000</td>
<td>2.640000</td>
</tr>
</tbody>
</table>
<p>8 rows × 3 columns</p>
</div>
<h1 id="nhóm-các-giá-trị-với-groupby">Nhóm các giá trị với .groupby()</h1>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">groupby</span><span class="p">(</span><span class="s">"species"</span><span class="p">)[[</span><span class="s">"height"</span><span class="p">,</span> <span class="s">"mass"</span><span class="p">]].</span><span class="n">mean</span><span class="p">()</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>height</th>
<th>mass</th>
</tr>
<tr>
<th>species</th>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<th>Aleena</th>
<td>79.0</td>
<td>15.0</td>
</tr>
<tr>
<th>Besalisk</th>
<td>198.0</td>
<td>102.0</td>
</tr>
<tr>
<th>Cerean</th>
<td>198.0</td>
<td>82.0</td>
</tr>
<tr>
<th>...</th>
<td>...</td>
<td>...</td>
</tr>
<tr>
<th>Xexto</th>
<td>122.0</td>
<td>NaN</td>
</tr>
<tr>
<th>Yoda's species</th>
<td>66.0</td>
<td>17.0</td>
</tr>
<tr>
<th>Zabrak</th>
<td>173.0</td>
<td>80.0</td>
</tr>
</tbody>
</table>
<p>37 rows × 2 columns</p>
</div>
<h1 id="thêm-các-cột-đã-biến-đổi-bằng-cách-sử-dụng-transform-">Thêm các cột đã biến đổi bằng cách sử dụng .transform ()</h1>
<p>Thông thường, việc thêm một cột vào khung dữ liệu là kết quả của một bước trung gian giữa bước groupby() và tổng hợp. Ví dụ, trừ giá trị trung bình của nhóm. Transform thực hiện điều này và trả về một cột đã biến đổi có cùng hình dạng với khung dữ liệu ban đầu. Biến đổi bảo toàn chỉ số ban đầu. (Có những phương pháp khác, chẳng hạn như apply, trả về khung dữ liệu mới với các biến theo nhóm làm chỉ số mới.)</p>
<p>Dưới đây là một ví dụ về hàm transform được sử dụng để loại giá trị trung bình theo loài. Lưu ý rằng chúng ta sử dụng các hàm lambda ở đây. Các hàm lambda là một cách viết hàm nhanh chóng mà không cần đặt tên cho chúng, ví dụ: lambda x: x + 1 xác định một hàm thêm một vào x. Trong ví dụ dưới đây, x trong hàm lambda đảm nhận vai trò của khối lượng được nhóm theo loài.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">[</span><span class="s">"mass_demean_species"</span><span class="p">]</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="n">groupby</span><span class="p">(</span><span class="s">"species"</span><span class="p">)[</span><span class="s">"mass"</span><span class="p">].</span><span class="n">transform</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">-</span> <span class="n">x</span><span class="p">.</span><span class="n">mean</span><span class="p">())</span>
<span class="n">df</span><span class="p">.</span><span class="n">head</span><span class="p">()</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>name</th>
<th>height</th>
<th>mass</th>
<th>hair_color</th>
<th>eye_color</th>
<th>gender</th>
<th>homeworld</th>
<th>species</th>
<th>height_m</th>
<th>mass_demean_species</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Luke Skywalker</td>
<td>172.0</td>
<td>77.0</td>
<td>blond</td>
<td>blue</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
<td>1.72</td>
<td>-5.781818</td>
</tr>
<tr>
<th>1</th>
<td>C-3PO</td>
<td>167.0</td>
<td>75.0</td>
<td>NaN</td>
<td>yellow</td>
<td>NaN</td>
<td>Tatooine</td>
<td>Droid</td>
<td>1.67</td>
<td>5.250000</td>
</tr>
<tr>
<th>2</th>
<td>R2-D2</td>
<td>96.0</td>
<td>32.0</td>
<td>NaN</td>
<td>red</td>
<td>NaN</td>
<td>Naboo</td>
<td>Droid</td>
<td>0.96</td>
<td>-37.750000</td>
</tr>
<tr>
<th>3</th>
<td>Darth Vader</td>
<td>202.0</td>
<td>136.0</td>
<td>none</td>
<td>yellow</td>
<td>male</td>
<td>Tatooine</td>
<td>Human</td>
<td>2.02</td>
<td>53.218182</td>
</tr>
<tr>
<th>4</th>
<td>Leia Organa</td>
<td>150.0</td>
<td>49.0</td>
<td>brown</td>
<td>brown</td>
<td>female</td>
<td>Alderaan</td>
<td>Human</td>
<td>1.50</td>
<td>-33.781818</td>
</tr>
</tbody>
</table>
</div>
<h1 id="lập-biểu-đồ-nhanh-với-plot">Lập biểu đồ nhanh với .plot.</h1>
<p>Bao gồm biểu đồ phân tán biểu, diện tích, cột, hộp, mật độ, lục giác, histogram, kernel và đường.</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">plot</span><span class="p">.</span><span class="n">scatter</span><span class="p">(</span><span class="s">"mass"</span><span class="p">,</span> <span class="s">"height"</span><span class="p">,</span> <span class="n">alpha</span><span class="o">=</span><span class="mf">0.5</span><span class="p">);</span>
</code></pre></div></div>
<p><img src="/assets/images/codingecon/ce01/output_35_0.png" alt="image-center" class="align-center" /></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">.</span><span class="n">plot</span><span class="p">.</span><span class="n">box</span><span class="p">(</span><span class="s">"species"</span><span class="p">);</span>
</code></pre></div></div>
<p><img src="/assets/images/codingecon/ce01/output_36_0.png" alt="image-center" class="align-center" /></p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">df</span><span class="p">[</span><span class="s">"height"</span><span class="p">].</span><span class="n">plot</span><span class="p">.</span><span class="n">kde</span><span class="p">(</span><span class="n">bw_method</span><span class="o">=</span><span class="mf">0.3</span><span class="p">);</span>
</code></pre></div></div>
<p><img src="/assets/images/codingecon/ce01/output_37_0.png" alt="image-center" class="align-center" /></p>
<h1 id="xuất-kết-quả-và-thống-kê-mô-tả">Xuất kết quả và thống kê mô tả</h1>
<p>Ta có thể xuất kết quả sang tệp latex để tích hợp vào bài báo, bản trình bày hoặc áp phích. Giả sử chúng ta đã có một số thống kê mô tả trên khung dữ liệu:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">table</span> <span class="o">=</span> <span class="n">df</span><span class="p">[[</span><span class="s">"mass"</span><span class="p">,</span> <span class="s">"height"</span><span class="p">]].</span><span class="n">agg</span><span class="p">([</span><span class="n">np</span><span class="p">.</span><span class="n">mean</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="n">std</span><span class="p">])</span>
<span class="n">table</span>
</code></pre></div></div>
<div>
<style scoped="">
.dataframe tbody tr th:only-of-type {
vertical-align: middle;
}
.dataframe tbody tr th {
vertical-align: top;
}
.dataframe thead th {
text-align: right;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>mass</th>
<th>height</th>
</tr>
</thead>
<tbody>
<tr>
<th>mean</th>
<td>98.162069</td>
<td>175.103896</td>
</tr>
<tr>
<th>std</th>
<td>170.810183</td>
<td>34.483629</td>
</tr>
</tbody>
</table>
</div>
<p>Ta có thể xuất tệp này sang nhiều định dạng, bao gồm chuỗi, html, xml, markdown, clipboard, Excel, v.v.</p>
<p>Đây là một ví dụ về việc xuất bảng gấu trúc của bạn sang bảng LaTeX:</p>
<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">print</span><span class="p">(</span><span class="n">table</span><span class="p">.</span><span class="n">to_latex</span><span class="p">(</span><span class="n">caption</span><span class="o">=</span><span class="s">"A Table"</span><span class="p">,</span> <span class="n">label</span><span class="o">=</span><span class="s">"tab:descriptive"</span><span class="p">))</span>
</code></pre></div></div>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>\begin{table}
\centering
\caption{A Table}
\label{tab:descriptive}
\begin{tabular}{lrr}
\toprule
{} & mass & height \\
\midrule
mean & 98.162069 & 175.103896 \\
std & 170.810183 & 34.483629 \\
\bottomrule
\end{tabular}
\end{table}
</code></pre></div></div>
<p>Việc ghi vào terminal không hữu ích cho việc hoàn thành bài báo hoặc báo cáo! Để xuất dưới dạng tệp, hãy sử dụng table.to_latex(‘file.tex’, …).</p>Kinh tế học Vô hạiTrước khi bắt đầu, các bạn có thể cài đặt Python và các packages phục vụ cho việc phân tích dữ liệu một cách dễ dàng thông qua Anaconda tại đây https://www.anaconda.com/products/distributionCó chăng làn sóng tự tử theo người nổi tiếng?2022-05-01T00:00:00+07:002022-05-01T00:00:00+07:00http://kinhtehocvohai.github.io/blogpost/C%C3%B3-ch%C4%83ng-l%C3%A0n-s%C3%B3ng-t%E1%BB%B1-t%E1%BB%AD-theo-ng%C6%B0%E1%BB%9Di-n%E1%BB%95i-ti%E1%BA%BFng<p>Từ cuối thế kỉ trước, các nhà kinh tế bắt đầu tìm những lời giải thích duy lý cho hành động tự kết thúc cuộc đời thay vì thừa nhận nó là một biểu hiện bệnh lý như lý giải của các nhà tâm thần học.
Những mô hình ban đầu giải thích đơn giản rằng mỗi người luôn tự tối ưu hóa hàm lợi ích cá nhân và nếu một lúc nào đó họ nhận ra giá trị cuộc đời hiện tại là một con số âm, họ quyết định chấm dứt nó. Hàm ý chính sách hết sức rõ ràng: nâng cao thu nhập có thể giúp giảm tỉ lệ tự sát trong xã hội.
Nhưng rồi người ta chứng kiến một nghịch lý ở Mĩ, khi thu nhập tăng cao, tỉ lệ tự sát giảm ở các nhóm tuổi khác nhưng lại tăng nhanh ở tuổi dậy thì. Các nhà kinh tế giải thích nghịch lý này bằng cách mô hình hóa quan hệ đánh đổi: khi bố mẹ dành nhiều thời gian hơn cho công việc, họ kiếm được nhiều tiền hơn để nâng cao đời sống cho cả gia đình. Nhưng bù lại họ có ít thời gian hơn dành cho con cái và điều này ảnh hưởng không tốt tới sức khỏe tinh thần của trẻ. Riêng với trẻ dậy thì, gia tăng thu nhập không bù đắp nổi thiếu hụt tinh thần và kết quả là tỉ lệ tự sát ở độ tuổi này tăng bất chấp điều kiện kinh tế được cải thiện.</p>
<p>Một cách khác để lý giải hiện tượng một số nhóm người có tỷ lệ tự sát cao hơn các nhóm người khác bằng cách đưa vào mô hình “thiên lệch dự phóng”. Theo đó, có những cú sốc ngẫu nhiên bên ngoài có khả năng tác động lên tâm lý đối tượng, khiến họ bỗng chốc đánh giá quá thấp giá trị cuộc sống trong tương lai và chọn cách tự kết liễu. Đáng tiếc là lựa chọn nhất thời này không thể đảo ngược hoặc làm lại. Với một số nhóm người, ví dụ người trẻ, hệ số “độ nhạy cảm” cao hơn và họ dễ thành nạn nhân của những vụ tự tử bộc phát.</p>
<p>Các nhà kinh tế Hàn Quốc cung cấp bằng chứng thực nghiệm cho thấy việc người nổi tiếng tự tử được đưa tin trên phương tiện thông tin đại chúng có khả năng tạo ra một cú sốc tâm lý và dẫn đến một làn sóng tự tử trong công chúng. Các tác giả nghiên cứu lý do tử vong của người Hàn Quốc trong giai đoạn 2000-2010 và liên hệ nó với 11 vụ tử tự của người nổi tiếng được truyền thông đưa tin rộng rãi trong giai đoạn này. Đây là thời kì mà nạn tự tử ở trong công chúng và người nổi tiếng trở thành một vấn đề bức bối trong xã hội Hàn Quốc.</p>
<p>Các nhà nghiên cứu tạo lập các “phản thực” bằng cách loại bỏ các hiệu ứng ngày trong tuần, mùa vụ theo tháng và cú sốc năm trong chuỗi số liệu tỉ lệ tử vong của người Hàn Quốc. Mô hình hổi quy sau đó cho thấy trong vòng 2 tuần ngay sau khi báo đài loan tin người nổi tiếng tự kết liễu, số vụ tự tử trong công chúng tăng trung bình 10 vụ mỗi ngày. Phân tích sâu hơn cho thấy kết quả này không phải do hiệu ứng thay thế theo thời gian: tỉ lệ tự tử trong công chúng không hề giảm sau đó và việc người nổi tiếng tự tử thực sự gây thêm sức ép với vấn nạn của Hàn Quốc. Điển hình nhất là ca tự tử của nữ diễn viên Jin-sil Choi năm 2008. Theo ước tính của các tác giả, vụ việc này làm tăng 949 ca tự tử trong công chúng trong 7 tuần lễ sau đó.</p>
<p><img src="/assets/images/blogpost/suicide.png" alt="image-center" class="align-center" /></p>
<p>Để củng cố thêm lập luận nguyên nhân – kết quả của mình, các tác giả kiểm tra và không phát hiện cú sốc giá chứng khoán nào ngay trước các vụ tự tử của 11 người nổi tiếng này. Hơn nữa người nổi tiếng tự tử thu hút hành vi tương tự của người không nổi tiếng có các đặc điểm kinh tế, xã hội tương tự người nổi tiếng. Ví dụ ngay sau cái chết của Jin-sil Choi, các vụ tự tử phần nhiều liên quan đến người trẻ, sống ở đô thị. Người nổi tiếng là nam giới thu hút hành động tự tử của nam giới.
Tất nhiên kết quả của nghiên cứu này tại Hàn Quốc không nhất thiết áp dụng được cho các hoàn cảnh khác. Nó phản ánh tính đặc thù của xã hội Hàn Quốc những năm 2000-2010: có rất nhiều người chênh vênh giữa lựa chọn sống hoặc chết, và một cú huých nhẹ từ những người nổi tiếng tiếp sức cho những ý định do “thiên lệch dự phóng” không thể đảo ngược. Hơn nữa, nghiên cứu này mới chỉ phân tích những ca tự tử thực tế của những người nổi tiếng và có lẽ tác động của những ca tự tử “giả thực” vẫn còn là một mảng trống trong nghiên cứu.</p>
<p>*Bài viết dựa trên các nghiên cứu</p>
<p>Hong, S.C. and Lee, J., 2015. People on the verge of death: evidence from impacts of celebrity suicides. Applied Economics, 47(7), pp.710-724.</p>
<p>Mathur, V.K. and Freeman, D.G., 2002. A theoretical model of adolescent suicide and some evidence from US data. Health Economics, 11(8), pp.695-708.</p>Kinh tế học Vô hạiTừ cuối thế kỉ trước, các nhà kinh tế bắt đầu tìm những lời giải thích duy lý cho hành động tự kết thúc cuộc đời thay vì thừa nhận nó là một biểu hiện bệnh lý như lý giải của các nhà tâm thần học. Những mô hình ban đầu giải thích đơn giản rằng mỗi người luôn tự tối ưu hóa hàm lợi ích cá nhân và nếu một lúc nào đó họ nhận ra giá trị cuộc đời hiện tại là một con số âm, họ quyết định chấm dứt nó. Hàm ý chính sách hết sức rõ ràng: nâng cao thu nhập có thể giúp giảm tỉ lệ tự sát trong xã hội. Nhưng rồi người ta chứng kiến một nghịch lý ở Mĩ, khi thu nhập tăng cao, tỉ lệ tự sát giảm ở các nhóm tuổi khác nhưng lại tăng nhanh ở tuổi dậy thì. Các nhà kinh tế giải thích nghịch lý này bằng cách mô hình hóa quan hệ đánh đổi: khi bố mẹ dành nhiều thời gian hơn cho công việc, họ kiếm được nhiều tiền hơn để nâng cao đời sống cho cả gia đình. Nhưng bù lại họ có ít thời gian hơn dành cho con cái và điều này ảnh hưởng không tốt tới sức khỏe tinh thần của trẻ. Riêng với trẻ dậy thì, gia tăng thu nhập không bù đắp nổi thiếu hụt tinh thần và kết quả là tỉ lệ tự sát ở độ tuổi này tăng bất chấp điều kiện kinh tế được cải thiện. Một cách khác để lý giải hiện tượng một số nhóm người có tỷ lệ tự sát cao hơn các nhóm người khác bằng cách đưa vào mô hình “thiên lệch dự phóng”. Theo đó, có những cú sốc ngẫu nhiên bên ngoài có khả năng tác động lên tâm lý đối tượng, khiến họ bỗng chốc đánh giá quá thấp giá trị cuộc sống trong tương lai và chọn cách tự kết liễu. Đáng tiếc là lựa chọn nhất thời này không thể đảo ngược hoặc làm lại. Với một số nhóm người, ví dụ người trẻ, hệ số “độ nhạy cảm” cao hơn và họ dễ thành nạn nhân của những vụ tự tử bộc phát. Các nhà kinh tế Hàn Quốc cung cấp bằng chứng thực nghiệm cho thấy việc người nổi tiếng tự tử được đưa tin trên phương tiện thông tin đại chúng có khả năng tạo ra một cú sốc tâm lý và dẫn đến một làn sóng tự tử trong công chúng. Các tác giả nghiên cứu lý do tử vong của người Hàn Quốc trong giai đoạn 2000-2010 và liên hệ nó với 11 vụ tử tự của người nổi tiếng được truyền thông đưa tin rộng rãi trong giai đoạn này. Đây là thời kì mà nạn tự tử ở trong công chúng và người nổi tiếng trở thành một vấn đề bức bối trong xã hội Hàn Quốc. Các nhà nghiên cứu tạo lập các “phản thực” bằng cách loại bỏ các hiệu ứng ngày trong tuần, mùa vụ theo tháng và cú sốc năm trong chuỗi số liệu tỉ lệ tử vong của người Hàn Quốc. Mô hình hổi quy sau đó cho thấy trong vòng 2 tuần ngay sau khi báo đài loan tin người nổi tiếng tự kết liễu, số vụ tự tử trong công chúng tăng trung bình 10 vụ mỗi ngày. Phân tích sâu hơn cho thấy kết quả này không phải do hiệu ứng thay thế theo thời gian: tỉ lệ tự tử trong công chúng không hề giảm sau đó và việc người nổi tiếng tự tử thực sự gây thêm sức ép với vấn nạn của Hàn Quốc. Điển hình nhất là ca tự tử của nữ diễn viên Jin-sil Choi năm 2008. Theo ước tính của các tác giả, vụ việc này làm tăng 949 ca tự tử trong công chúng trong 7 tuần lễ sau đó.Thiếu niềm tin hay đầu cơ là tác nhân cho sự bùng nổ của đầu tư tiền mã hóa2022-04-16T00:00:00+07:002022-04-16T00:00:00+07:00http://kinhtehocvohai.github.io/blogpost/Thi%E1%BA%BFu-ni%E1%BB%81m-tin-hay-%C4%91%E1%BA%A7u-c%C6%A1-l%C3%A0-t%C3%A1c-nh%C3%A2n-cho-s%E1%BB%B1-b%C3%B9ng-n%E1%BB%95-c%E1%BB%A7a-%C4%91%E1%BA%A7u-t%C6%B0-ti%E1%BB%81n%20m%C3%A3-h%C3%B3a<p>Sự gia tăng không ngừng của Bitcoin, Ether và các loại tiền mã hóa khác cho thấy động lực lớn của nhà đầu tư cũng như mức độ phức tạp của chúng. Một trong những chủ đích của việc tạo ra tiền kỹ thuật số là thay thế tiền pháp định và ngân hàng thương mại bằng một hình thức trao đổi mới có khả năng chống lại sự phá giá và kiểm duyệt của chính phủ và các định chế tài chính. Theo như Nakamoto (2008) lập luận, “Cần phải có một hệ thống thanh toán mã hóa dựa trên mật tính thay cho niềm tin cho phép hai bên đối tác bất kỳ sẵn sàng giao dịch trực tiếp với nhau mà không cần đơn vị bảo chứng”</p>
<p><img src="/assets/images/blogpost/distrust00.png" alt="image-center" class="align-center" /></p>
<p>Trong một bài báo của Auer và Tercero-Lucas (2021), các tác giả xem xét giả thuyết rằng tiền mã hóa được chọn là nơi trú ẩn khi các đồng tiền pháp định hoặc định chế tài chính mất tín nhiệm. Để xác minh giả thuyết trên, họ sử dụng tập dữ liệu cấp vi mô Khảo sát lựa chọn thanh toán của người tiêu dùng (SCPC) do Ngân hàng Dự trữ Liên bang Atlanta cung cấp từ năm 2009. Các bảng khảo sát đều chứa thông tin về hành vi thanh toán của người tiêu dùng Hoa Kỳ liên quan đến việc sử dụng tiền mặt và thanh toán điện tử, cũng như số lượng giao dịch được thực hiện bằng các phương tiện thanh toán.</p>
<p>Để xác định tác nhân cho sự bùng nổ của tiền mã hóa, các tác giả sử dụng mô hình probit. Trong đó, biến phụ thuộc có giá trị 1 khi cá nhân bất kỳ biết hoặc sở hữu ít nhất 1 loại tiền mã hóa và giá trị bằng 0 đối với trường hợp ngược lại. Các biến độc lập gồm có mức độ số hóa tài chính của cá nhân, an ninh và tính thuận tiện của giao dịch, và các biến kiểm soát về kinh tế xã hội như giới tính, độ tuổi, giáo dục, thu nhập, và tình trạng hôn nhân.</p>
<p>Kết quả nghiên cứu cho thấy:</p>
<ul>
<li>Không có sự khác biệt về mức độ lo ngại với tính bảo chứng của các tùy chọn thanh toán chính thống giữa hai nhóm các nhà đầu tư và không đầu tư. Vì vậy, điều này bác bỏ giả thuyết rằng tiền mã hóa được mua nhằm thay thế cho tiền pháp định hoặc các định chế tài chính tại Hoa Kỳ.</li>
<li>Người có trình độ học vấn cao hơn và có nhiều kiến thức hơn về tiền mã hóa sẽ có nhiều khả năng sở hữu chúng.</li>
<li>Bên cạnh đó, nghiên cứu còn cho thấy tiền mã hóa vẫn là thị trường ngách được thống trị bởi các nhà đầu tư nam trẻ tuổi. Theo ước lượng, nam giới có khả năng sở hữu ít nhất một loại tiền mã hóa cao hơn, tương đương với 2–2,2 phần trăm.</li>
</ul>
<p><img src="/assets/images/blogpost/distrust.png" alt="image-center" class="align-center" /></p>
<p>Kết quả còn cho thấy có sự xuất hiện khoảng cách giới trong việc sở hữu tiền mã hóa trong khi khoảng cách kiến thức về tiền mã hóa giữa hai giới lại giảm theo thời gian.</p>
<ul>
<li>Bài viết dựa trên nghiên cứu: Auer, R., & Tercero-Lucas, D. (2021). Distrust or speculation? The socioeconomic drivers of US cryptocurrency investments.</li>
</ul>Kinh tế học Vô hạiSự gia tăng không ngừng của Bitcoin, Ether và các loại tiền mã hóa khác cho thấy động lực lớn của nhà đầu tư cũng như mức độ phức tạp của chúngPhương hướng tương lai - Phần 22022-04-03T00:00:00+07:002022-04-03T00:00:00+07:00http://kinhtehocvohai.github.io/aicausal/Ph%C6%B0%C6%A1ng-h%C6%B0%E1%BB%9Bng-t%C6%B0%C6%A1ng-lai-Ph%E1%BA%A7n-2<p><strong>SUY LUẬN NHÂN QUẢ CHO HỌC MÁY - KỲ 20</strong></p>
<p><em>Bài viết này thuộc chuỗi bài viết về “Suy luận Nhân quả cho Học máy”. Hãy cùng đọc thêm các bài viết có cùng chủ đề <a href="http://kinhtehocvohai.com/aicausal/">tại đây</a></em></p>
<p><em>Để hiểu thêm kiến thức về Suy luận Nhân quả, hãy cùng tìm đọc chuỗi bài viết về “Suy luận Nhân quả với Python” <a href="http://kinhtehocvohai.com/pythoncausal/">tại đây</a> và “60 Giây Nhân quả với Python” <a href="http://kinhtehocvohai.com/causalgraph/">tại đây</a></em></p>
<hr />
<p>Trong phần này, chúng ta cùng trao đổi về tương lai của các phương pháp nhân quả nói chung, và các phương pháp dựa trên bất biến nói riêng.</p>
<p><strong>Học tăng cường nhân quả</strong></p>
<p>Học tăng cường (Reinforcement learning) là lĩnh vực nghiên cứu cách đưa ra quyết định hành động của một chủ thể nhằm tối đa hoá lợi ích tương lai trong một môi trường có tính tương tác và không chắc chắn. Các chủ thể này dựa vào nhiều mô phỏng (và đôi khi là dữ liệu thực) để tìm hiểu hành động nào dẫn tới phần thưởng lớn trong một hoàn cảnh cụ thể. Mặt khác, nhân quả đồng thời hướng tới việc tính toán tác động của hành động, và cho phép áp dụng những hiểu biết đó trong những tình huống mới. Hai lĩnh vực này đã phát triển một cách độc lập và hầu như không có tương tác, cho đến thời gian gần đây. Sự kết hợp giữa hai lĩnh vực này có thể tạo nên một lĩnh vực nghiên cứu hiệu quả, đồng thời mở rộng phạm vi của cả quan hệ nhân quả và học tăng cường.</p>
<p>Giữa khái niệm can thiệp trong suy luận nhân quả và các hành động được thực hiện trong học tăng cường có một mối liên hệ tự nhiên. Trong mỗi giai đoạn (một chu trình vận hành của hệ thống, ví dụ như một ván cờ vua hay cờ vây) của học tăng cường, chủ thể thực hiện các hành động. Điều này xác định một mô hình tạo lập dữ liệu cho phần thưởng mà chủ thể quan tâm và các chuỗi hành động khác nhau sẽ tạo ra các phần thưởng khác nhau. Bởi chủ thể có thể đưa ra các lựa chọn hành động, mỗi hành động sẽ trở thành một can thiệp vào mô hình tạo lập dữ liêu. Khi đó, chúng ta có thể vận dụng suy luận nhân quả. Ví dụ, trong cấp độ thứ ba của bậc thang nhân quả, tư duy phản thực có thể được áp dụng để lập luận về những hành động chưa xảy ra. Việc sử dụng kỹ thuật nhân quả có thể làm giảm số lượng các trường hợp mà chủ thể cần xem xét, hoặc giúp giải thích các yếu tố gây nhiễu.</p>
<p>Về nguyên tắc, các phương pháp dựa trên bất biến như IRM học cách xác định các bất biến từ nhiều môi trường. Đặc điểm này có thể được vận dụng trong học tăng cường. Mỗi vòng học tăng cường bao gồm tất cả các trạng thái nằm giữa trạng thái đầu và cuối. Bởi các vòng học độc lập với nhau, theo thuật ngữ của phương pháp dựa trên bất biến như IRM (Giảm thiểu rủi ro bất biến), chúng có thể được xem như các môi trường khác nhau. Sau đó, chủ thể có thể học được những quy tắc hiệu quả để sử dụng phần bất biến của hành động làm tăng phần thưởng.</p>
<p>Tuy việc ứng dụng học tăng cường cho ứng dụng thương mại vẫn còn ở giai đoạn sơ khai, việc kết hợp học tăng cường với quan hệ nhân quả có tiềm năng lớn. Trước đó, chúng ta cần giải quyết một số câu hỏi. Ví dụ, làm thế nào để kết hợp tính trừu tượng khi lập trình mô hình nhân quả với học tăng cường để giúp tìm ra các quyết định tốt nhất? Công cụ và thư viện nào cần thiết để kích hoạt các ứng dụng thương mại trong trường hợp này?</p>
<p><strong>IRM và môi trường</strong></p>
<p>IRM sử dụng ý tưởng huấn luyện trong nhiều môi trường để thu được khả năng tổng quát hoá ngoài phân phối. Tuy nhiên, rất ít bộ dữ liệu đi kèm với chú thích sẵn có. Có ít nhất hai cách để giải quyết vấn đề này.</p>
<p>Đầu tiên là lưu ý đến môi trường khi thu thập dữ liệu, và thu thập siêu dữ liệu (dữ liệu về dữ liệu). Việc này có thể thực hiện dễ dàng (ví dụ: thu thập vị trí địa lý của hình ảnh trong phần cài đặt nếu có thể, không vi phạm quyền riêng tư của người dùng), hoặc cực kỳ khó khăn (đòi hỏi gắn nhãn thủ công sau thu thập).</p>
<p>Một hướng giải quyết khác hấp dẫn nhưng chưa được thử nghiệm rộng rãi là kết hợp IRM với phân tích cụm (clustering) để phân loại một tập dữ liệu duy nhất theo các môi trường. Câu hỏi đặt ra là làm thế nào để phân cụm theo cách xác định được các môi trường đa dạng và có ý nghĩa. Bởi cách tiếp cận phân tích cụm hiện tại đơn thuần là tương quan, vì vậy có thể bị ảnh hưởng bởi tương quan giả. Điều này đặt ra nhiều thách thức.</p>
<p>Nghiên cứu tác động của việc lựa chọn môi trường và cách tạo ra hoặc sắp xếp các bộ dữ liệu theo nhiều môi trường sẽ là đóng góp có giá trị để làm cho các phương pháp dựa trên bất biến được áp dụng rộng rãi.</p>
<p><strong>Suy luận nhân quả cho tính công bằng của thuật toán</strong></p>
<p>Phần Vấn đề đạo đức trong học máy đã thảo luận một số khái niệm về tính công bằng trong các bài toán dự báo và các công cụ nhân quả có thể giải quyết các bài toán này. Chúng chuyển từ phương pháp tiếp cận truyền thống hoàn toàn lệ thuộc vào dữ liệu sang hướng nhấn mạnh sự cần thiết của việc thêm vào kiến thức bổ sung về cấu trúc của thế giới dưới dạng mô hình nhân quả. Những kiến thức này đặc biệt có giá trị vì nó cho ta biết những thay đổi trong các biến truyền đi như thế nào trong hệ thống (có thể là tự nhiên, kỹ thuật, hay xã hội). Các giả định nhân quả rõ ràng loại bỏ sự mơ hồ khỏi các phương pháp chỉ phụ thuộc vào các mối tương quan thống kê. Việc loại bỏ phân biệt đối xử thông qua lý luận nhân quả cũng là một lĩnh vực nghiên cứu sôi động. Việc những nỗ lực nhằm thúc đẩy tính minh bạch và công bằng trong các hệ thống học máy ngày càng phát triển sẽ tạo đà cho lý luận nhân quả tiếp tục hướng các thuật toán hướng tới sự công bằng.</p>Kinh tế học Vô hạiSUY LUẬN NHÂN QUẢ CHO HỌC MÁY - KỲ 20Bớt hạt nhân, thêm phiền toái2022-03-26T00:00:00+07:002022-03-26T00:00:00+07:00http://kinhtehocvohai.github.io/blogpost/B%E1%BB%9Bt-h%E1%BA%A1t-nh%C3%A2n-th%C3%AAm-phi%E1%BB%81n-to%C3%A1i<p>Khi chiến tranh Nga-Ukraina nổ ra và căng thẳng nguồn cung khí đốt từ Nga leo thang, vấn đề an ninh năng lượng lại càng trở nên nóng bỏng ở châu Âu. Một câu hỏi lớn đặt ra liệu các nước có nên phát triển điện hạt nhân để giảm phụ thuộc năng lượng?</p>
<p>Nước Đức phát triển ồ ạt điện hạt nhân trong suốt 3 thập kỉ kể từ những năm 1960 để giảm thiểu ô nhiễm không khí và đảm bảo nguồn cung năng lượng. Thảm họa tai nạn hạt nhân Chernobyl (Ukraina) nổ ra năm 1986 dấy lên lo ngại trong công luận. Đảng Xanh tham gia chính quyền liên hiệp Schröder năm 2000, thúc đẩy tuyên bố loại trừ dần điện hạt nhân và sau đó bị trì hoãn bởi chính quyền Merkel.
Sự cố điện hạt nhân Fukushima (Nhật Bản) diễn ra 2011 châm ngòi phong trào biểu tình phản đối điện hạt nhận lại nổ ra ở Đức với hơn 250,000 người tham gia. Chính quyền Merkel buộc phải đem trở lại kế hoạch chấm dứt hoàn toàn điện hạt nhân vào 2022. Tại thời điểm 2011, điện hạt nhân đóng góp tới 25% tổng sản lượng điện của toàn nước Đức.</p>
<p>Việc từng bước đóng cửa điện hạt nhân do sức ép chính trị (thay vì thay đổi hoàn cảnh kinh tế hay môi trường) từ một cú sốc bên ngoài (Nhật Bản) đã tạo điều kiện cho các nhà kinh tế đánh giá tác động của các nhà máy điện hạt nhân. Javis, Deschenes và Jha xây dựng một khung phương pháp học máy kết hợp với mô hình kinh tế lượng nghiên cứu sự kiện. Từ đó các tác giả ước lượng sản lượng phản thực của các nhà máy điện sử dụng các loại nhiên liệu khác nhau trên toàn nước Đức giả sử nước này chưa từng từ bỏ điện hạt nhân.</p>
<p><img src="/assets/images/blogpost/nuclear.png" alt="image-center" class="align-center" /></p>
<p>Kết quả là từ tháng 3/2011, Đức giảm ngay khoảng 4TWh điện hạt nhân mỗi tháng và sau đó giảm thêm 2 TWh mỗi tháng. Sự thiếu hụt được bù đắp thông qua tăng năng lượng tái tạo (khoảng 2.5 TWh mỗi tháng), nhà máy điện than (khoảng 2-3 TWh mỗi tháng) và nhập khẩu điện chủ yếu từ Pháp và Séc (khoảng 1TWh mỗi tháng). Đồng thời giá điện bán buôn tăng khoảng 1 euro cho mỗi MWh. Việc thay điện hạt nhân bằng điện than làm tăng ô nhiễm không khí, ước tính làm tăng 800 người chết mỗi năm, tương đương tổn thất xã hội khoảng 2 tỉ euro.</p>
<p>Tổng chi phí xã hội tăng thêm (từ tăng giá điện và tăng tử vong) do đóng cửa điện hạt nhân ước tính trong khoảng 3-8 tỉ euro mỗi năm, tức là 60-160 tỉ euro trong 20 năm. Trong khi đó thảm họa hạt nhân Fukushima ước tính gây ra tổng chi phí xã hội khoảng 280-640 tỉ với xác suất xảy ra ở Đức 1 lần trong 20 năm là 1:150 đến 1:375.</p>
<ul>
<li>Bài viết dựa trên nghiên cứu: Stephen Jarvis, Olivier Deschenes, Akshaya Jha, The Private and External Costs of Germany’s Nuclear Phase-Out, Journal of the European Economic Association, 2022.</li>
</ul>Kinh tế học Vô hạiKhi chiến tranh Nga-Ukraina nổ ra và căng thẳng nguồn cung khí đốt từ Nga leo thang, vấn đề an ninh năng lượng lại càng trở nên nóng bỏng ở châu Âu. Một câu hỏi lớn đặt ra liệu các nước có nên phát triển điện hạt nhân để giảm phụ thuộc năng lượng?Phương hướng tương lai - Phần 12022-03-19T00:00:00+07:002022-03-19T00:00:00+07:00http://kinhtehocvohai.github.io/aicausal/Ph%C6%B0%C6%A1ng-h%C6%B0%E1%BB%9Bng-t%C6%B0%C6%A1ng-lai-Ph%E1%BA%A7n-1<p><strong>SUY LUẬN NHÂN QUẢ CHO HỌC MÁY - KỲ 19</strong></p>
<p><em>Bài viết này thuộc chuỗi bài viết về “Suy luận Nhân quả cho Học máy”. Hãy cùng đọc thêm các bài viết có cùng chủ đề <a href="http://kinhtehocvohai.com/aicausal/">tại đây</a></em></p>
<p><em>Để hiểu thêm kiến thức về Suy luận Nhân quả, hãy cùng tìm đọc chuỗi bài viết về “Suy luận Nhân quả với Python” <a href="http://kinhtehocvohai.com/pythoncausal/">tại đây</a> và “60 Giây Nhân quả với Python” <a href="http://kinhtehocvohai.com/causalgraph/">tại đây</a></em></p>
<hr />
<p>Suy luận nhân quả cung cấp một bộ khung khái niệm và kỹ thuật để giải quyết các câu hỏi về tác động của các hành động, can thiệp thực tế hoặc giả định. Một khi hiểu được tác động đó, chúng ta có thể lật ngược lại câu hỏi và truy hành động nào nhiều khả năng dẫn đến một sự kiện cụ thể. Quy trình này cung cấp một “ngôn ngữ” chính thức để bàn về các mối quan hệ nhân quả. Tuy nhiên không phải mọi câu hỏi về nguyên nhân đều có lời giải đáp dễ dàng. Hơn nữa, việc tìm lời giải đáp hay thậm chí diễn giải và hiểu đúng ý nghĩa của nó cũng không phải là nhiệm vụ đơn giản. Đồ thị nhân quả đã được thảo luận trong những chương mở đầu cung cấp một phương thức thuận tiện để bàn về những vấn đề này, đồng thời cho phép suy luận về những mối quan hệ phụ thuộc về mặt thống kê trong dữ liệu quan sát.</p>
<p>Mô hình nhân quả cấu trúc (SCM) tiến thêm một bước gần hơn tới cách suy luận trực quan này bằng cách đưa ra các giả định chính thức về dạng tham số của các biến tương tác. Tuy nhiên việc xây dựng biểu đồ nhân quả và SCM có thể trở nên khó khăn khi số lượng các biến tăng lên. Một số hệ thống gần như không thể mô hình hoá được theo cách này. Lấy ví dụ, làm thế nào để vẽ được biểu đồ nhân quả cho các điểm ảnh, thậm chí chỉ trong một bức ảnh? Số lượng các tham số gần như vượt khỏi tầm kiểm soát.</p>
<p>May mắn là không phải mọi vấn đề đều đòi hỏi toàn bộ biểu đồ nhân quả. Thông thường, chúng ta chỉ quan tâm đến mối quan hệ nhân quả liên quan tới một mục tiêu cụ thể. Đây là lúc phương pháp dựa trên bất biến (như IRM) bước vào “cuộc chơi” hướng tới việc cho phép mô hình học được các đặc tính ổn định qua nhiều môi trường (hay qua các quy trình tạo dữ liệu khác nhau). Mô hình này cho phép tổng quát hoá ngoài phân phối. Trái ngược với đồ thị nhân quả hoặc SCM khi mà cách duy nhất để xác thực các giả định về tương tác giữa các biến là thông qua thử nghiệm, IRM cho phép kiểm định trên một tập dữ liệu kiểm định chưa được quan sát.</p>
<p><strong>Các cách tiếp cận tương đương</strong></p>
<p>Ngoài các phương pháp dựa trên bất biến, liệu có còn những cách khác để tiếp cận khái quát hoá ngoài phân phối? Nhìn chung, có hai nhánh tiếp cận chính: một là học để khớp với phân phối của các đặc tính (hoặc ước lượng biểu diễn dữ liệu), hai là sử dụng kỹ thuật tối ưu hoá.</p>
<p><strong>Thích ứng miền</strong></p>
<p>Kỹ thuật thích ứng miền (Domain Adaption) là một nhánh của Học chuyển giao (Transfer Learning). Trong đó, mô hình học một tác vụ trong miền gốc có chứa một số phân phối của đặc tính, và sau đó có khả năng thực hiện tốt cùng một nhiệm vụ ở miền mục tiêu có chứa phân phối của đặc tính khác với miền gốc. Các miền đóng vai trò giống như các môi trường trong các phương pháp tiếp cận dựa trên các biến, cụ thể, miền gốc là môi trường đã được huấn luyện, trong khi đó miền mục tiêu là bất kỳ môi trường nào chưa được huấn luyện.</p>
<p>Ở một khía cạnh nào đó, thích ứng miền cũng dựa trên bất biến – nó tìm kiếm một dạng biểu diễn chung có phân phối tương tự nhau trên cả miền nguồn và miền mục tiêu (cũng giống như qua các môi trường). Tuy nhiên, các tính năng nhân quả bất biến không nhất thiết phải tuân theo cùng một phân phối qua các môi trường khác nhau. Ví dụ, một con bò trên tuyết sẽ không tạo ra phân bố điểm ảnh giống hệt với một con bò trên cát, và những đặc tính nhân quả đại diện cho loài bò.</p>
<p><strong>Học chuẩn mạnh</strong></p>
<p>Ý tưởng học qua nhiều môi trường không phải mới mẻ đối với các phương pháp tiếp cận dựa trên bất biến. Học chuẩn mạnh có giám sát (Robust Supervised Learning) là một nhánh bao gồm các kỹ thuật ra đời từ trước và sử dụng thiếp lập đa môi trường như IRM, với mục tiêu tương tự là cho phép hoặc tăng cường tổng quát hóa ngoài phân phối. Nói một cách khác, mục tiêu đặt ra là mô hình dự báo chuẩn mạnh đối với sự thay đổi trong phân bố của các yếu tố đầu vào.</p>
<p>So với IRM, sự khác biệt nằm ở hàm tổn thất. Ý tưởng chính là thêm các đại lượng cơ sở cụ thể vào hàm tổn thất, và cố gắng điều chỉnh các đại lượng này sao cho nhiễu trong các môi trường có tổn thất cao không chiếm ưu thế. Sau đó, giảm thiểu tối đa tổn thất sẽ đảm bảo mô hình hoạt động tốt trên mọi môi trường đã biết. Hơn nữa, một mô hình dự báo chuẩn mạnh sẽ hoạt động tốt trong các môi trường mới được nội suy từ những môi trường đã qua huấn luyện. Điều này sẽ làm cải thiện khả năng tổng quát hoá ngoài phân phối, nhưng không cho phép ngoại suy ngoài môi trường đã được quan sát trong tập huấn luyện, trong khi IRM có thể ngoại suy dựa vào dự đoán bất biến.</p>
<p><strong>Học tổng hợp</strong></p>
<p>Các cách tiếp cận như Thích ứng miền, Học chuẩn mạnh, hay nói chung hơn là Học chuyển giao đều cố gắng giải quyết vấn đề tổng quát hoá ngoài phân phối ở một mức độ nhất định. Thật không may, việc học các đặc tính bất biến với các phân phối khác nhau qua nhiều môi trường vẫn còn là thách thức. Những cách tiếp cận này tốt trong việc nội suy, không phải ngoại suy.</p>
<p>Đây là lúc các phương pháp tiếp cận Học tổng hợp (Meta-learning) như mô hình học tổng hợp bất khả tri (MAML) phát huy tác dụng. Ý tưởng cơ bản là học các tác vụ với một số lượng nhỏ các mẫu đã được gắn mác. Huấn luyện mô hình học tổng hợp được chia ra làm hai bước bao gồm học và huấn luyện. Mục tiêu của mô hình học là nhanh chóng học các tác vụ mới từ một số lượng nhỏ dữ liệu, do đó nó còn được gọi là học nhanh. Tác vụ ở đây có thể là bất kỳ bài toán học có giám sát nào. Mô hình học này được huấn luyện bởi học tổng hợp để có thể học được nhiều nhiệm vụ khác nhau. Học tổng hợp thực hiện nhiệm vụ này bằng cách cho mô hình học thấy hàng trăm, hàng nghìn tác vụ khác nhau.</p>
<p>Việc học sau đó diễn ra ở hai cấp độ. Cấp độ thứ nhất là tập trung vào việc thu thập nhanh kiến thức của mỗi tác vụ thông qua một vài mẫu dữ liệu. Cấp độ thứ hai là thu lượm và tổng hợp các thông tin từ tất cả các tác vụ. Trong trường hợp MAML (phương pháp dựa trên tối ưu hoá), mô hình học (cấp độ đầu tiên) có thể học nhanh tối ưu trên tác vụ mới chỉ qua một vài bước điều chỉnh độ dốc bởi học tổng hợp có khả năng khởi tạo tham số cho mô hình tốt. Cách tiếp cận này gần với bài toán học mô hình phân loại tối ưu qua nhiều môi trường, và có thể được khai thác thêm để học các đặc tính bất biến trong dữ liệu. Đã có nhiều bài báo nghiên cứu kết hợp giữa nhân quả và học tổng hợp.</p>Kinh tế học Vô hạiSUY LUẬN NHÂN QUẢ CHO HỌC MÁY - KỲ 19Thuế giao dịch bất động sản tác động đến thị trường nhà đất ở Anh như thế nào?2022-03-13T00:00:00+07:002022-03-13T00:00:00+07:00http://kinhtehocvohai.github.io/blogpost/Thu%E1%BA%BF-giao-d%E1%BB%8Bch-b%E1%BA%A5t-%C4%91%E1%BB%99ng-s%E1%BA%A3n-t%C3%A1c-%C4%91%E1%BB%99ng-%C4%91%E1%BA%BFn-th%E1%BB%8B-tr%C6%B0%E1%BB%9Dng-nh%C3%A0-%C4%91%E1%BA%A5t-%E1%BB%9F-Anh-nh%C6%B0-th%E1%BA%BF-n%C3%A0o<p>Thuế giao dịch bất động sản là một nguồn thu quan trọng đối với ngân sách nhiều quốc gia. Tuy nhiên, giảm thuế giao dịch bất động sản cũng đồng thời là một chính sách kích cầu hiệu quả trong các thời kì suy thoái kinh tế gần đây.</p>
<p>Ví dụ ở Anh, thuế trước bạ đánh trên giá trị đất và tài sản gắn liền với đất mỗi năm đóng góp ngân sách khoảng trên dưới 8 tỉ bảng trước Covid [1]. Nước này hai lần miễn giảm thuế trên diện rộng: trong khủng hoảng tài chính 2009 và gần đây là trong đại dịch Covid.</p>
<p>Một nghiên cứu năm 2017 chỉ ra rằng thuế đánh vào giao dịch bất động sản như thuế trước bạ tác động rất nhanh và mạnh lên giá nhà [2].</p>
<p>Thuế trước bạ ở Anh được thiết kế theo bậc thang tăng dần. Một hiện tượng thú vị là giá nhà thường phân bổ “dồn ứ” vào ngay dưới các ngưỡng bậc thang thuế suất. Ví dụ, rất nhiều nhà bán với giá gần sát 250,000 bảng, nhưng rất ít nhà bán với giá hơn 250,000 bảng một chút. Lí do là trên ngưỡng này, thuế suất tăng lên 3% thay vì 1%. Hiện tượng tương tự xảy ra với các ngưỡng thay đổi thuế suất cao hơn (500,000, 1 triệu hay 2 triệu bảng). Xung quanh các ngưỡng thay đổi thuế suất, mỗi đồng thuế tăng thêm có thể làm giá nhà giảm từ 2-5 đồng. Một lý do cho tác động rất mạnh này là tiền đóng thuế trước bạ phải thanh toán ngay và không được dùng đòn bẩy tài chính.</p>
<p>Điều ngạc nhiên là thị trường phản ứng rất nhanh theo chính sách thay đổi thuế suất và ngưỡng tính thuế. Ví dụ, khi chính phủ tăng mức miễn thuế từ 125,000 bảng lên 175,000 bảng để kích cầu chống suy thoái, thị trường bất động sản tự điều tiết và chỉ mất 3-4 tháng để chuyển mức “dồn ứ” giá nhà từ ngay dưới 125,000 bảng lên ngay dưới 175,000 bảng (Hình 1).</p>
<p><img src="/assets/images/blogpost/propertytax.png" alt="image-center" class="align-center" /></p>
<p>Cuối cùng, chính sách kích cầu thông qua giảm thuế giao dịch bất động sản có hiệu quả rất lớn. Trong ngắn hạn, việc tăng ngưỡng miễn thuế năm 2009 làm tăng số lượng giao dịch thêm 20%. Tác động này giảm rất ít khi kết thúc chính sách. Vì lượng cung nhà gần như không đổi trong ngắn hạn, khối lượng giao dịch gia tăng này chủ yếu được thúc đẩy vì sự gia tăng nhu cầu chuyển nhà. Điều này có lợi cho sự dịch chuyển lao động giữa các vùng miền và đáp ứng tốt hơn nhu cầu thay đổi nhà ở của cả xã hội trong điều kiện cung nhà giới hạn. Ngoài ra, khảo sát hộ gia đình cho thấy mỗi đồng thuế trước bạ giảm làm tăng đúng 1 đồng chi tiêu cho các hoạt động sửa chữa, nâng cấp, mua sắm nội thất cho bất động sản mới mua, kích thích nhiều ngành nghề kinh tế.</p>
<p>-Bài viết dựa trên 2 nghiên cứu:</p>
<p>[1] Scanlon, K., Whitehead, C., Blanc F. (2021) Lessons from the stamp duty holiday. An LSE London report for Family Building Society.</p>
<p>[2] Best, M. C., Kleven. H. J. (2018), Housing Market Responses to Transaction Taxes: Evidence From Notches and Stimulus in the U.K., The Review of Economic Studies, Volume 85, Issue 1, Pages 157–193, https://doi.org/10.1093/restud/rdx032</p>Kinh tế học Vô hạiThuế giao dịch bất động sản là một nguồn thu quan trọng đối với ngân sách nhiều quốc gia. Tuy nhiên, giảm thuế giao dịch bất động sản cũng đồng thời là một chính sách kích cầu hiệu quả trong các thời kì suy thoái kinh tế gần đây.Vấn đề đạo đức trong Học máy2022-03-05T00:00:00+07:002022-03-05T00:00:00+07:00http://kinhtehocvohai.github.io/aicausal/V%E1%BA%A5n-%C4%91%E1%BB%81-%C4%91%E1%BA%A1o-%C4%91%E1%BB%A9c-trong-H%E1%BB%8Dc-m%C3%A1y<p><strong>SUY LUẬN NHÂN QUẢ CHO HỌC MÁY - KỲ 18</strong></p>
<p><em>Bài viết này thuộc chuỗi bài viết về “Suy luận Nhân quả cho Học máy”. Hãy cùng đọc thêm các bài viết có cùng chủ đề <a href="http://kinhtehocvohai.com/aicausal/">tại đây</a></em></p>
<p><em>Để hiểu thêm kiến thức về Suy luận Nhân quả, hãy cùng tìm đọc chuỗi bài viết về “Suy luận Nhân quả với Python” <a href="http://kinhtehocvohai.com/pythoncausal/">tại đây</a> và “60 Giây Nhân quả với Python” <a href="http://kinhtehocvohai.com/causalgraph/">tại đây</a></em></p>
<hr />
<p>Các mô hình Học máy có vai trò ngày càng quan trọng trong xã hội ngày nay. Trước đây con người đưa ra quyết định và bây giờ thuật toán làm thay. Hệ thống thuật toán này chi phối mọi thứ từ việc chọn lọc những email chúng ta nhận, tới khả năng được phê duyệt tín dụng hay đối tượng mà ta có cơ hội hẹn hò. Có thể nói, tác động của chúng đối với trải nghiệm của con người về thế giới ngày càng lớn. Tuy vậy, hiểu biết của chúng ta về cách thức hoạt động của hệ thống này vẫn chưa đầy đủ. Chúng ta không thể lý giải hay chỉnh sửa khi các thuật toán này đưa ra những dự báo mang tính phân biệt đối xử hoặc những kết quả củng cố cho những thiên kiến sẵn có. May mắn là, suy luận nhân quả cung cấp cho chúng ta một khung lý luận để suy luận về vấn đề này.</p>
<p><strong>Biểu đồ nhân quả làm cho các giả định trở nên rõ ràng</strong></p>
<p>Ngay cả lúc chưa sử dụng hết các công cụ của suy luận nhân quả, mỗi khi chúng ta tiếp cận một vấn đề mới, việc cố gắng vẽ ra biểu đồ nhân quả có thể mang lại nhiều thông tin có ích. Điều này buộc ta phải đối mặt với những giả định ta đưa ra về một hệ thống. Đồng thời nó cũng giúp người khác hiểu các giả định mà ta đặt ra và cung cấp một khuôn khổ hợp lý cho tranh luận.</p>
<figure class="">
<img src="/assets/images/aicausal/chap6/chap6_18_1.png" alt="" /></figure>
<p>Việc làm rõ các giả định của chúng ta giúp tăng cường tính minh bạch. Nhưng nó không bảo vệ ta khỏi các giả định bất hợp lý. Việc thiết lập các mối quan hệ nhân quả thực sự rất khó. Trừ khi chúng ta có thể thực hiện đầy đủ các thí nghiệm để xác thực giả thuyết của mình, lý luận nhân quả từ dữ liệu quan sát thường là các giả định chưa được kiểm chứng (đôi khi không thể kiểm chứng). Chính vì vậy ta cần phải thận trọng khi đưa ra bất kỳ khẳng định nào về nhân quả.</p>
<p><strong>Loại bỏ các thuộc tính cần bảo hộ là chưa đủ</strong></p>
<p>Phân biệt đối xử dựa trên các thuộc tính cần bảo hộ, như chủng tộc hay tình trạng thương tật, bị đánh giá là phi đạo đức, thậm chí là bất hợp pháp ở nhiều nơi. Việc tránh sự phân biệt đối xử trực tiếp (mà theo đó một cá nhân có thuộc tính cần bảo hộ nào đó bị đối xử bất lợi) tương đối dễ dàng. Thông thường, những thuộc tính cần bảo hộ này thường bị loại bỏ khỏi hệ thống học máy. Việc đưa trực tiếp thuộc tính cần bảo hộ vào mô hình tạo ra sự phân biệt đối xử dựa trên thuộc tính đó.</p>
<p>Tuy nhiên phân biệt đối xử gián tiếp dựa trên nhân quả thường khó phát hiện và khó loại trừ hơn. Nhiều thuộc tính không cần bảo hộ lại có khả năng dự báo tốt thuộc tính cần bảo hộ. Lấy ví dụ, vị trí địa lý có thể tương quan lớn với chủng tộc, tôn giáo và tuổi tác. Khi từ chối khoản cho vay đối với một cá nhân thuộc mã vùng địa lý cụ thể, ngân hàng thực tế có thể đang gián tiếp phân biệt đối xử một thuộc tính cần bảo hộ.</p>
<p>Một hình thức phân biệt đối xử khác có tên gọi là phân biệt đối xử gián tiếp giả. Đây là những trường hợp không có đường kết nối từ thuộc tính nhân quả tới kết quả đầu ra. Tuy nhiên như đã thấy ở chương trước (“Từ tương quan đến nhân quả”), các mối tương quan có thể phát sinh từ nhiều cấu trúc nhân quả khác nhau. Như vậy, chỉ loại bỏ thuộc tính cần bảo hộ không có nghĩa là đã loại bỏ được tác động của nó. Không thể đảm bảo một hệ thống không phân biệt đối xử dựa trên thuộc tính cần bảo hộ chỉ vì nó không trực tiếp bao gồm thuộc tính đó. Nói một cách dễ hiểu, chỉ vì một đặc tính không gây ra một đối tượng cụ thể không có nghĩa là nó không có khả năng dự báo đối tượng đó. Đây là một thách thức lớn đối với hệ thống thuật toán được thiết kế nhằm tìm ra các mối tương quan tiềm ẩn, đặc biệt trong trường hợp dữ liệu lịch sử dùng để huấn luyện thuật toán có thể bị ảnh hưởng bởi thiên lệch chọn (và một số thiên lệch khác).</p>
<p>Chỉ loại bỏ những thuộc tính cần bảo hộ là chưa đủ, chúng ta cần đánh giá mô hình kết quả dựa trên các thuộc tính công bằng và tính phân biệt đối xử của nó. Có nhiều thước đo cho tính công bằng tuy nhiên rất khó để tối ưu hoá tất cả thước đo.</p>
<p>Một số nghiên cứu đề xuất sử dụng quan hệ nhân để hiểu và xác định tính công bằng cũng như phân biệt đối xử. Cụ thể, nếu ta có một mô hình biểu đồ nhân quả của hệ thống, ta có thể quan sát những đường dẫn nào bị ảnh hưởng bởi các thuộc tính cần bảo hộ và giải thích trách nhiệm của chúng. Một số mô hình nhân quả cấu trúc phi tham số đóng góp cho việc phát hiện và chỉ ra sự khác biệt chính giữa phân biệt đối xử trực tiếp, phân biệt đối xử gián tiếp và phân biệt đối xử giả.</p>
<p>Điều này cho thấy khó khăn nằm ở bước xây dựng biểu đồ nhân quả. Tất nhiên một biểu đồ nhân quả có thể được sử dụng để bao gồm tất cả các thiên kiến, định kiến, nhưng ít nhất nó vẫn cung cấp cơ sở lập luận.</p>
<p><strong>Bất biến mở ra đường tới công bằng</strong></p>
<p>Một ý tường thú vị được đề xuất trong phần cuối của bài nghiên cứu về phương pháp Giảm thiểu rủi ro bất biến (IRM): coi các nhóm mà ta muốn có sự công bằng như môi trường. Khi tìm hiểu một mô hình bất biến (ICP hoặc IRM), chúng ta rõ ràng đang cố gắng tìm hiểu một mô hình hoạt động tối ưu trong các môi trường khác nhau. Chúng ta có thể xây dựng các môi trường đó bằng cách tách các nhóm có các giá trị khác nhau cho các thuộc tính cần bảo hộ. Sau đó, bằng cách huấn luyện một mô hình tìm cách hoạt động tối ưu trong từng môi trường, chúng ta có thể đảm bảo hiệu quả tốt nhất cho từng thuộc tính cần bảo hộ.</p>
<p>Nói cách khác, các thuộc tính bất biến chính là các thuộc tính nhất quán giữa các nhóm. Hãy xem xét một ví dụ nữa, khi ngân hàng cấp các khoản vay trực tiếp cho cá nhân, và không muốn phân biệt đối xử khách hàng dựa trên các thuộc tính cần bảo hộ. Bằng cách chia khách hàng vào các nhóm theo các thuộc tính cần bảo hộ, ngân hàng đang tìm cách để hiểu liệu điều gì tác động đến các khoản vay xấu trên tất cả các nhóm.</p>
<p>Ý tưởng về việc học một thuộc tính dự báo bất biến trên nhiều môi trường nghĩa là chúng ta sử dụng một dạng biểu diễn thực sự phản ánh mô hình tạo lập dữ liệu. Dạng biểu diễn này, ở một mức độ nào đó, có thể phân tách, theo nghĩa là mỗi chiều của dạng biểu diễn (một vectơ) phải tương ứng với một đại lượng có ý nghĩa. Trong bài nghiên cứu về tính công bằng của biểu diễn có tính phân tách, chứng minh bằng thực nghiệm cho thấy cách biểu diễn này cải thiện tính công bằng trong các ứng dụng thực tiễn.</p>Kinh tế học Vô hạiSUY LUẬN NHÂN QUẢ CHO HỌC MÁY - KỲ 18Can thiệp Quân sự bằng Hỏa lực Áp đảo và Thử nghiệm Tự nhiên2022-02-26T00:00:00+07:002022-02-26T00:00:00+07:00http://kinhtehocvohai.github.io/blogpost/Can-thi%E1%BB%87p-Qu%C3%A2n-s%E1%BB%B1-b%E1%BA%B1ng-H%E1%BB%8Fa-l%E1%BB%B1c-%C3%81p-%C4%91%E1%BA%A3o-v%C3%A0-Th%E1%BB%AD-nghi%E1%BB%87m-T%E1%BB%B1-nhi%C3%AAn<p><strong>Tác giả: Melissa Dell và Pablo Querubin</strong></p>
<p>Can thiệp quân sự vào các quốc gia có nền thể chế non trẻ hoặc yếu kém là nét đặc trưng của Chiến tranh Lạnh và đáng tiếc là chúng vẫn còn tiếp diễn cho đến ngày nay. Hành động này không những làm tiêu tốn đáng kể nguồn lực mà còn gây ra những hậu quả nghiêm trọng về an ninh khu vực đối với tất cả các quốc gia có liên quan.</p>
<p>Về cơ bản, có 2 chiến lược can thiệp quân sự chính thường được đặt ra nhằm đè bẹp lực lượng quốc gia phản kháng và thiết lập nhà nước chuyên chế. Chiến lược thứ nhất tập trung vào việc tăng cường hỏa lực áp đảo. Chiến lược thứ hai nhắm tới việc chinh phục nhân tâm thông qua viện trợ phát triển.
Các chiến lược gia ủng hộ giải pháp hỏa lực tin rằng bom đạn có thể làm tiêu hao lực lượng phản kháng, ngăn chặn hoạt động, và làm nhụt ý chí của họ. Nói như tướng Depuy: “Giải pháp ở Việt Nam là thêm bom, thêm đạn pháo, thêm napan… cho đến khi phía bên kia sụp đổ và đầu hàng” [1]. Những người phản đối cho rằng bom đạn sẽ phản tác dụng nếu dân thường bị tấn công. Chính hành động đó sẽ tạo ra sự phẫn nộ khiến người dân tham gia lực lượng phản kháng và có thêm lý do để chống đối nhà nước mà họ không ủng hộ.</p>
<p>Từ góc nhìn của các quốc gia hứng chịu bom đạn, “ở đâu có áp bức, ở đó có chiến tranh” có vẻ là một chân lý hiển nhiên không cần bàn cãi. Nhưng từ góc nhìn của những nước mang quân đi can thiệp nơi khác, chứng minh giải pháp bom đạn phản tác dụng không phải điều dễ dàng.</p>
<p>Trên phương diện khoa học, rất khó để xác nhận mối tương quan nhân quả ở đây nếu chỉ dựa vào dữ liệu quan sát được từ chiến tranh quá khứ. Có thể bom đạn thôi thúc người dân phản kháng. Nhưng cũng có thể chính những nơi cưu mang lực lượng phản kháng bị lựa chọn làm đích đến cho bom đạn. Tiêu chuẩn “vàng” thử nghiệm ngẫu nhiên không thể áp dụng vì tính phi đạo đức và bất khả thi. Hơn nữa nó không mấy hữu ích vì trên thực tế, nguồn lực quân sự thường được phân bổ theo tính hiệu quả và do đó bom đạn chẳng mấy khi rơi ngẫu nhiên.</p>
<p>GS Havard Melissa Dell, 1 trong 8 nhà kinh tế học trẻ xuất sắc nhất thế giới, và Pablo Querubin đã lật lại sử liệu chiến tranh Việt Nam và chứng minh sai lầm của lực lượng tham chiến Mĩ bằng cách thiết kế hai “thử nghiệm tự nhiên” trong một bài báo đăng trên QJE năm 2018. (Xem thêm bài viết Kinh tế học vô hại về giải Nobel Kinh tế 2021). Cần nhắc lại rằng chiến tranh Việt Nam là can thiệp quân sự khốc liệt nhất trong lịch sử nhân loại. Lượng bom đạn đã rải tương đương 640 quả bom nguyên tử thả xuống Hiroshima và lượng bom đạn trên đầu mỗi quân nhân nhiều gấp 26 lần Thế Chiến II [2].</p>
<p>Thử nghiệm tự nhiên thứ nhất dựa trên thuật toán đánh bom của Mac Namara. Tướng Mĩ này chủ trương sử dụng dữ liệu và lý thuyết kinh tế học, vận trù học, lý thuyết trò chơi và khoa học tính toán trong quân sự. Từ năm 1967, người Mĩ và chính quyền Sài Gòn thu thập dữ liệu gồm 169 câu hỏi về tình hình an ninh, kinh tế, chính trị. Từ đó, hệ thống máy tính IBM, kết hợp với thuật toán Bayesian ước lượng mức độ nguy hiểm đe dọa chính quyền Sài Gòn và cho điểm các thôn ấp theo thang 5 bậc từ A đến E làm căn cứ quyết định cường độ không kích.</p>
<p><img src="/assets/images/blogpost/nationbuilding_1.png" alt="image-center" class="align-center" /></p>
<p>Dell và Querubin đã tận dụng thang điểm này để tiến hành thử nghiệm tự nhiên bằng cách so sánh các ấp ngay trên và ngay dưới ngưỡng quyết định không kích. Ví dụ, hai ấp có mức độ đe dọa đối với chính quyền Sài Gòn xấp xỉ nhau: một ấp có tổng điểm 1.5 và ấp còn lại là 1.49. Tuy nhiên, ấp đầu tiên sẽ được xếp hạng D trong khi ấp thứ hai bị xếp hạng E vì vậy ấp thứ hai sẽ bị thả bom với cường độ mạnh hơn mặc dù chúng có các đặc điểm kinh tế, chính trị, xã hội khá tương đồng.</p>
<p>Kết quả phân tích hồi quy gián đoạn cho thấy, các chiến dịch không kích tiếp thêm sức mạnh cho lực lượng phản kháng. So với kịch bản không bị thả bom, một ấp bị không kích ở mức độ trung bình có khả năng xuất hiện lực lượng du kích phản kháng cao hơn 27%, khả năng xuất hiện chi bộ Đảng cao hơn 25% và khả năng lực lượng phản kháng tấn công chính quyền thân Mĩ cao hơn 9%.</p>
<p>Mục đích sau cùng của việc can thiệp quân sự ở nước ngoài nhằm hướng tới việc xây dựng một chính quyền mới có thể đứng vững sau khi rút quân. Tuy nhiên chính sách không kích của người Mĩ cũng phản tác dụng trên phương diện này. So với kịch bản không bị thả bom, một ấp bị không kích ở mức độ trung bình có khả năng thu thuế thấp hơn 25%, khả năng trẻ đến trường thấp hơn 16% và khả năng người dân tham gia vào xã hội dân sự thấp hơn 13%. Đi cùng với đó là sự suy giảm tính chính danh của chính quyền thân Mĩ.</p>
<p>Thử nghiệm tự nhiên thứ 2 so sánh sách lược bạo lực quân sự với sách lược quân sự mềm dẻo hơn bằng cách tận dụng chia cách địa lý giữa Quân khu 1 điều hành bởi Hải Quân Mĩ và Quân khu 2 điều hành bởi Lục Quân Mĩ. Hải Quân Mĩ chủ trương cài lính vào thôn ấp nhưng tối thiểu hóa các hoạt động quân sự và tập trung vào các chương trình phát triển kinh tế, chính trị, xã hội nhằm chinh phục nhân tâm. Trong khi đó Lục Quân Mĩ đẩy mạnh các chiến dịch “truy bắt-tìm diệt”. Các tác giả so sánh phản ứng của thôn ấp ngay sát ranh giới hai quân khu với lập luận rằng các thôn ấp này khá tương đồng nhau và chỉ khác biệt do chính sách can thiệp quân sự của hai đội quân. Kết quả cho thấy các thôn ấp bên phía Hải Quân Mĩ ít phản kháng hơn và có cái nhìn thiện cảm hơn về Mĩ và chính quyền miền Nam.</p>
<p>Liệu bài học cũ từ chiến tranh Việt Nam có còn giá trị? Cùng với tiến bộ khoa học công nghệ, mức độ chính xác của các vũ khí tân tiến đã được cải thiện đáng kể, tuy nhiên các lực lượng phản kháng quốc gia vẫn luôn hòa lẫn với dân thường. Gần đây [2018], vẫn có nhiều cáo buộc về việc chiến dịch đánh bom của Nga và chính quyền Syria sát hại dân thường. Nhiều chính trị gia trên thế giới vẫn tiếp tục ủng hộ các chiến dịch can thiệp quân sự bằng vũ lực áp đảo ở nước ngoài. Phản ứng gay gắt không công khai của McNamara có lẽ vẫn có ích: “Chiến dịch ném bom này không đáng, nó chẳng làm nên trò chống gì, họ đã bị dội bom nhiều hơn toàn bộ châu Âu trong suốt Thế chiến II và nó đã chẳng làm nên trò chống gì” [3].</p>
<p>*Bài viết dựa theo nghiên cứu Dell, Melissa, and Pablo Querubin. “Nation Building Through Foreign Intervention: Evidence from Discontinuities in Military Strategies.” Quarterly Journal of Economics 133, no. 2 (2018): 701-764.</p>
<p>[1] Trích trong Daniel Ellsberg, Tư liệu về cuộc chiến tranh, New York, năm 1972, tr.234.</p>
<p>[2] Turse, Nick, Kill Anything that Moves: The Real American War in Vietnam (New York: Macmillan, 2013)</p>
<p>[3] Milne, David, America’s Rasputin: Walt Rostow and the Vietnam War (New York : Macmillan, 2008).</p>Kinh tế học Vô hạiCan thiệp quân sự vào các quốc gia có nền thể chế non trẻ hoặc yếu kém là nét đặc trưng của Chiến tranh Lạnh và đáng tiếc là chúng vẫn còn tiếp diễn cho đến ngày nay.