{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Khoảng tin cậy (Confidence interval)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# import libraries\n", "import math\n", "import numpy as np\n", "import scipy.stats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sai số chuẩn (Standard error)\n", "- Ước lượng sai số dựa vào tỉ lệ (for proportion)\n", "$$\\sigma_{\\hat{p}} = \\sqrt{\\frac{p(1-p)}{n}}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Bài toán: tỉ lệ khách hàng thoả mãn với dịch vụ hiện tại**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sai số ước lượng: 4.89897948557\n", "Tỉ lệ chặn dưới: 55.1010205144\n", "Tỉ lệ chặn trên: 64.8989794856\n" ] } ], "source": [ "# standard error for proportion\n", "# p hat: estimate proportion for population\n", "p = 0.6\n", "n = 100\n", "std_err_prop = math.sqrt(p * (1 - p) / n) * 100\n", "print \"Sai số ước lượng:\", std_err_prop\n", "print \"Tỉ lệ chặn dưới:\", p * 100 - std_err_prop\n", "print \"Tỉ lệ chặn trên:\", p * 100 + std_err_prop" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sai số ước lượng: 1.54919333848\n", "Tỉ lệ chặn dưới: 58.4508066615\n", "Tỉ lệ chặn trên: 61.5491933385\n" ] } ], "source": [ "# increase sample size will decrease standard error\n", "n = 1000\n", "std_err_prop = math.sqrt(p * (1 - p) / n) * 100\n", "print \"Sai số ước lượng:\", std_err_prop\n", "print \"Tỉ lệ chặn dưới:\", p * 100 - std_err_prop\n", "print \"Tỉ lệ chặn trên:\", p * 100 + std_err_prop" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Ước lượng sai số từ giá trị trung bình (For mean)\n", "$$\\sigma_{\\bar{x}} = \\frac{\\sigma}{\\sqrt{n}}$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Bài toán: thời gian trung bình để một khách hàng uống hết ly cà phê**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sample A mean: 1.58\n", "Sample B mean: 1.28\n", "Sample C mean: 1.84\n", "Sample D mean: 1.36\n", "Thời gian trung bình từ các mẫu trung bình: 1.515\n", "Độ lệch của từ các mẫu trung bình: 0.217428149052\n" ] } ], "source": [ "# lấy mẫu 5 khách hàng vào mỗi ngày thứ Hai như sau\n", "n = 5\n", "sample_A = np.asarray([2.1, 1.3, 0.6, 1.5, 2.4])\n", "sample_B = np.asarray([0.7, 1.3, 1.8, 0.7, 1.9])\n", "sample_C = np.asarray([2.1, 1.9, 2.5, 1.8, 0.9])\n", "sample_D = np.asarray([1.6, 2.1, 1, 0.9, 1.2])\n", "print \"Sample A mean:\", sample_A.mean()\n", "print \"Sample B mean:\", sample_B.mean()\n", "print \"Sample C mean:\", sample_C.mean()\n", "print \"Sample D mean:\", sample_D.mean()\n", "\n", "average_of_means = (sample_A.mean() + sample_B.mean() + sample_C.mean() + sample_D.mean()) / 4\n", "list_of_means = np.asarray([sample_A.mean(), sample_B.mean(), sample_C.mean(), sample_D.mean()])\n", "std_of_means = list_of_means.std()\n", "print \"Thời gian trung bình từ các mẫu trung bình:\", average_of_means\n", "print \"Độ lệch của từ các mẫu trung bình:\", std_of_means" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ước lượng độ lệch chuẩn cho quần thể: 0.486184121501\n", "Chặn dưới cho ước lượng: 1.29757185095\n", "Chặn trên cho ước lượng: 1.73242814905\n" ] } ], "source": [ "# estimate standard deviation of population\n", "std_of_population = std_of_means * math.sqrt(n)\n", "print \"Ước lượng độ lệch chuẩn cho quần thể:\", std_of_population\n", "print \"Chặn dưới cho ước lượng:\", average_of_means - std_of_means\n", "print \"Chặn trên cho ước lượng:\", average_of_means + std_of_means" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Cách tính khoảng tin cậy\n", "$$proportionCI = \\hat{p} \\pm Zscore_{\\alpha/2} * \\frac{\\sigma}{\\sqrt{n}}$$\n", "$$meanCI = \\bar{x} \\pm Zscore_{\\alpha/2} * \\frac{\\sigma}{\\sqrt{n}}$$\n", "$$uperLimit = sampleParam + Zscore_{\\alpha/2} * standardError$$\n", "$$lowerLimit = sampleParam - Zscore_{\\alpha/2} * standardError$$\n", "\n", "**Bài toán: dự đoán khả năng trúng cử của ứng viên A so với ứng viên B với độ tin cậy là 95%**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Z-score: 1.95996398454\n", "Độ lỗi chuẩn cho tỉ lệ ủng hộ ứng viên A: 0.0497493718553\n", "Độ lỗi chuẩn cho tỉ lệ thu thập được: 0.00497493718553\n", "Tỉ lệ ủng hộ chặn trên: 0.559750697709\n", "Tỉ lệ ủng hộ chặn dưới: 0.540249302291\n" ] } ], "source": [ "# lấy mẫu 100 người\n", "n = 100\n", "\n", "# ủng hộ ứng viên A là 55%\n", "candidate_A_prop = 0.55\n", "\n", "# ủng hộ ứng viên B là 45%\n", "candidate_B_prop = 0.45\n", "\n", "# tính Zscore cho ứng viên A với độ tin cậy là 95%\n", "qnorm = scipy.stats.norm.ppf(0.975)\n", "print \"Z-score:\", qnorm\n", "\n", "# calculate p hat\n", "p = candidate_A_prop\n", "std_err_prop = math.sqrt(p * (1 - p) / n)\n", "print \"Độ lỗi chuẩn cho tỉ lệ ủng hộ ứng viên A:\", std_err_prop\n", "\n", "# calculate standard error of mean\n", "std_of_means = std_err_prop / math.sqrt(n)\n", "print \"Độ lỗi chuẩn cho tỉ lệ thu thập được:\", std_of_means\n", "\n", "# calculate interval\n", "upper_limit = candidate_A_prop + qnorm * std_of_means\n", "lower_limit = candidate_A_prop - qnorm * std_of_means\n", "print \"Tỉ lệ ủng hộ chặn trên:\", upper_limit\n", "print \"Tỉ lệ ủng hộ chặn dưới:\", lower_limit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Bài toán: ước lượng thời gian trung bình (phút) một người chạy trong vòng 1km với độ tin cậy là 95%**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Total runners: 9\n", "Sample mean: 8.95555555556\n", "Sample standard deviation: 1.28332130826\n", "Standard/Sampling error: 0.427773769422\n", "Z-score: 1.95996398454\n", "Thời gian trung bình chặn trên: 9.79397673715\n", "Thời gian trung bình chặn dưới: 8.11713437396\n" ] } ], "source": [ "# thống kê thời gian các lượt chạy\n", "list_run_time = np.asarray([11.3, 10.3, 9.6, 9.1, 8.9, 8.9, 8.1, 7.5, 6.9])\n", "sample_size = list_run_time.size\n", "sample_mean = list_run_time.mean()\n", "sample_std = list_run_time.std()\n", "standard_err = sample_std / math.sqrt(sample_size)\n", "\n", "print \"Total runners:\", sample_size\n", "print \"Sample mean:\", sample_mean\n", "print \"Sample standard deviation:\", sample_std\n", "print \"Standard/Sampling error:\", standard_err\n", "\n", "# calculate interval\n", "qnorm = scipy.stats.norm.ppf(0.975)\n", "print \"Z-score:\", qnorm\n", "upper_limit = sample_mean + qnorm * standard_err\n", "lower_limit = sample_mean - qnorm * standard_err\n", "print \"Thời gian trung bình chặn trên:\", upper_limit\n", "print \"Thời gian trung bình chặn dưới:\", lower_limit" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Kiểm định giả thuyết (Hypothesis testing)\n", "Thực hiện 4 bước\n", "1. Thiệt lập giả thuyết $H_0, H_a$ và chọn mức ý nghĩa/ngưỡng chấp nhận/độ không chắc chắn/độ tin cậy $\\alpha$\n", "2. Xác định dạng kiểm định (binomial-test, z-test, t-test, chi-square-test, f-test)\n", "3. Tính p-value\n", "4. Đối chiếu p-value với mức ý nghĩa đã chọn" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Bài toán: nữ sinh bị gọi lên bảng trả bài nhiều hơn nam đúng hay sai?**" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# gọi tên 50 người thì thấy tỉ lệ nam nữ như sau\n", "n_boys = 14\n", "n_girls = 36" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Thiết lập giả thuyết\n", " - $H_0$ cho rằng nữ bị gọi là do tình cờ (happend by chance) nghĩa là xác suất bị gọi $p \\le 0.5$\n", " - $H_a$ cho rằng nữ bị gọi là do thiên vị (not by chance) nghĩa là xác suất bị gọi $p > 0.5$\n", " - Chọn mức ý nghĩa $\\alpha = 5\\%$. Nếu tỉ lệ nữ bị gọi nhiều hơn 36 có xác suất nhỏ hơn 5% thì ta sẽ loại bỏ $H_0$.\n", "2. Xác định dạng kiểm định:\n", " - Đây là binomial-test với $p = 0.5$\n", "3. Tính p-value (chính là Zscore) " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "p-value/Z-score: 0.00128056854884\n" ] } ], "source": [ "n = n_boys + n_girls\n", "x = n_girls\n", "p = 0.51\n", "alpha = 0.05\n", "p_value = scipy.stats.binom.pmf(x, n, p)\n", "print \"p-value/Z-score:\", p_value" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reject H0 => nữ bị gọi là do thiên vị\n" ] } ], "source": [ "# reject H0 or not\n", "if p_value < alpha:\n", " print \"Reject H0 => nữ bị gọi là do thiên vị\"\n", "else:\n", " print \"Accept H0 => nữ bị gọi là do tình cờ\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Bài toán: test khả năng thắng cử của ứng cử viên**\n", "1. Thiết lập giả thuyết\n", " - $H_0: p \\le 0.5$ - ứng viên thua cử\n", " - $H_a: p > 0.5$ - ứng viên thắng cử\n", " - Chọn mức ý nghĩa $\\alpha = 5\\%$.\n", "2. Xác định dạng kiểm định:\n", " - Đây là z-test với $z_p = \\frac{\\hat{p} - p_0}{\\sqrt{\\frac{p_0(1 - p_0)}{n}}}$\n", "3. Tính p-value (chính là Zscore) " ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Z-score: 1.788854382\n", "Z-cdf: 0.96318086494\n", "p-value: 0.0368191350602\n" ] } ], "source": [ "# lấy mẫu thực nghiệm\n", "n = 500\n", "p_hat = yes = 0.54\n", "p_0 = 0.5\n", "z_p = (p_hat - p_0)/(math.sqrt(p_0 * (1 - p_0) / n))\n", "print \"Z-score:\", z_p\n", "\n", "# one-tail test\n", "z_cdf = scipy.stats.norm.cdf(z_p)\n", "print \"Z-cdf:\", z_cdf\n", "\n", "# calculate p-value\n", "p_value = 1 - z_cdf\n", "print \"p-value:\", p_value" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reject H0 => ứng viên thắng cử\n" ] } ], "source": [ "# reject H0 or not\n", "if p_value < alpha:\n", " print \"Reject H0 => ứng viên thắng cử\"\n", "else:\n", " print \"Accept H0 => ứng viên thua cử\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Bài toán: khách hàng không thích sản phẩm nhỏ hơn 20kg, trước khi ship nhà sản xuất cần phải test điều này**\n", "1. Thiết lập giả thuyết\n", " - $H_0: \\mu \\ge 20.15 \\ kg$\n", " - $H_a: \\mu < 20.15 \\ kg$\n", " - Chọn mức ý nghĩa $\\alpha = 5\\%$.\n", "2. Xác định dạng kiểm định:\n", " - Đây là z-test với $z = \\frac{\\bar{x} - \\mu}{\\frac{\\sigma}{\\sqrt{n}}}$\n", "3. Tính p-value (chính là Zscore) " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Z-score: -1.92307692308\n", "p-value: 0.0272351950137\n" ] } ], "source": [ "# lấy mẫu thực nghiệm\n", "n = 100\n", "mu = 20.15\n", "avg_weight = 20.1\n", "std_weight = 0.26\n", "z = (avg_weight - mu)/(std_weight / math.sqrt(n))\n", "print \"Z-score:\", z\n", "\n", "# one-tail test\n", "p_value = scipy.stats.norm.cdf(z)\n", "print \"p-value:\", p_value" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Reject H0 => không ship hàng\n" ] } ], "source": [ "# reject H0 or not\n", "if p_value < alpha:\n", " print \"Reject H0 => không ship hàng\"\n", "else:\n", " print \"Accept H0 => ship hàng\"" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 2 }