Professional Documents
Culture Documents
Thi TKMT
Thi TKMT
import pandas as pd
# In ra thông báo
print("Đã xóa các dòng có giá trị null và lưu kết quả vào tệp
'mpg_cleaned.csv'.")
Tìm trung binh, trung vị của các thuộc tính: 'cylinders',
'horsepower', 'weight'
import pandas as pd
mean_horsepower = df['horsepower'].mean()
median_horsepower = df['horsepower'].median()
mean_weight = df['weight'].mean()
median_weight = df['weight'].median()
# In ra kết quả
print("Trung bình (mean) của 'cylinders':", mean_cylinders)
print("Trung vị (median) của 'cylinders':", median_cylinders)
c. So sánh các đại lượng thống kê cho mỗi loài chim cánh cụt
(mean, median, standard deviation) trên các thuộc tính
bill_length_mm, bill_depth_mm, flipper, và body_mass:
# Sử dụng groupby để nhóm theo loài và tính giá trị trung bình,
trung vị, và độ lệch chuẩn
species_stats = data.groupby('species')[['bill_length_mm',
'bill_depth_mm', 'flipper_length_mm', 'body_mass_g']].agg(['mean',
'median', 'std'])
# In ra kết quả
print(species_stats)
c. Dựa trên kết quả tính được, bạn có thể rút ra nhận xét về sự
khác biệt giữa các loài chim cánh cụt trong các thuộc tính
được nêu ra. Ví dụ, bạn có thể thấy rằng một loài có trọng
lượng trung bình lớn hơn hoặc sâu mỏ lớn hơn so với các loài
khác. Điều này có thể đưa ra thông tin về sự đa dạng của các
loài trong hệ sinh thái của chim cánh cụt. Tóm lược, nhận xét
phụ thuộc vào kết quả cụ thể của phân tích thống kê.
3. Vẽ đồ thị phù hợp thể hiện phân phối của ba loại chim cánh cụt,
qua đó bạn hãy đưa ra bình luận của mình.
import pandas as pd
import matplotlib.pyplot as plt
plt.show()
Sau khi chạy mã này, bạn sẽ có một biểu đồ histogram thể hiện phân
phối trọng lượng của ba loài chim cánh cụt. Bây giờ bạn có thể đưa ra
nhận xét dựa trên biểu đồ:
Bạn có thể thấy rằng Gentoo thường có trọng lượng lớn hơn so
với các loài khác, với phân phối dạng hình chuông cao và hẹp.
Adelie có phân phối trọng lượng rộng hơn, và họ thường có
trọng lượng thấp hơn so với Gentoo.
Chinstrap nằm ở giữa về mặt trọng lượng, và phân phối của họ
có độ biến đổi vừa phải.
Điều này cho thấy rằng có sự khác biệt trong trọng lượng giữa các loài
chim cánh cụt, và biểu đồ histogram giúp thể hiện mối quan hệ này
một cách trực quan.
4. a. Để khảo sát mối quan hệ giữa độ dài cánh (flipper length) và
trọng lượng (body_mass) của loài chim cánh cụt Gentoo, bạn có thể sử
dụng biểu đồ phân tán (scatter plot). Biểu đồ phân tán cho phép bạn
xem xét mối quan hệ giữa hai biến liên tục.
Dưới đây là cách vẽ biểu đồ phân tán giữa độ dài cánh và trọng lượng
của loài chim Gentoo:
import pandas as pd
import matplotlib.pyplot as plt
Chiều cao Nam thanh niên Hàn Quốc được mô hình hóa bằng phân phối chuẩn N(µ=172
(cm), s=5(cm)). Anh/chị hãy thực hiện các yêu cầu sau (trên python).
a) Xác suất chọn ngẫu nhiên một bạn gọi là lùn (nhỏ hơn 162(cm))?
b) Giả sử, thanh niên nam được xem là cao lớn (> 182 (cm)). Hỏi xác suất chọn ngẫu nhiên
một thanh niên nam cao lớn ở Hàn Quốc là bao nhiêu?
c) Chọn thanh niên nam có chiều cao gọi là tầm thước (trong khoảng 165-182(cm))? Hỏi xác
suất chọn người tầm thước là bao nhiêu.
d) Cho biết 6% là thấp bé, vậy thế nào là chuẩn thấp bé của thanh niên nam ở Hàn Quốc
(cm)
e) Cho biết đến 9% cao lớn, vậy cao lớn có ngưỡng chiều cao là bao nhiêu (cm)?
f) Vẽ biểu đồ phân bố mô tả phân bố chuẩn trên
a) Xác suất chọn ngẫu nhiên một bạn gọi là lùn (nhỏ hơn 162 cm):
from scipy.stats import norm
b) Xác suất chọn ngẫu nhiên một thanh niên nam cao lớn (> 182 cm):
# Sử dụng hàm phân phối chuẩn để tính xác suất
probability = 1 - norm.cdf(182, loc=mu, scale=sigma)
print("Xác suất chọn ngẫu nhiên một thanh niên nam cao lớn:",
probability)
c) Xác suất chọn thanh niên nam có chiều cao trong khoảng 165-182
cm:
# Sử dụng hàm phân phối chuẩn để tính xác suất
probability = norm.cdf(182, loc=mu, scale=sigma) -
norm.cdf(165, loc=mu, scale=sigma)
d) Tìm giá trị chiều cao thấp bé sao cho 6% nằm bên trái của nó:
# Sử dụng hàm phân phối chuẩn nghịch đảo (quantile function)
để tìm giá trị
height = norm.ppf(0.06, loc=mu, scale=sigma)
print("Ngưỡng chiều cao cao lớn của thanh niên nam ở Hàn
Quốc:", height, "cm")
f) Vẽ biểu đồ phân bố mô tả phân bố chuẩn:
import numpy as np
import matplotlib.pyplot as plt
cdf Cumulative Distribution Function Hàm phân Phối Tích Lũy F(x)
Ví dụ: Một bài thi trắc nghiệm bao gồm 10 câu, mỗi câu có 4 lựa chọn. Giả sử bạn
không học bài và đánh lụi tất cả các câu hỏi. Có thể rằng giả định rằng xác suất lựa
chọn các đáp án là như nhau và sự lựa chọn đáp án ở một câu hỏi không bị ảnh hưởng
bởi các câu hỏi khác.
Nếu gọi X là biến ngẫu nhiên thể hiện số câu trả lời đúng, thì X sẽ có phân phối nhị
thức (X ~ B(n, p). Ta có thể mô phỏng giá trị của X như sau:
# Số câu hỏi và xác suất lựa chọn đáp án đúng ở một câu trả lời
n, p = 10, 0.25
# Phát sinh ngẫu nhiên số câu đúng
binom.rvs(n, p)
Nếu lớp học có 10 bạn, thì có thể mô phỏng kết quả kiểm tra của lớp như sau:
bi_sam_10 = binom.rvs(n, p, size=10)
bi_sam_10
# Lập bảng phân phối tần số thống kê số lượng câu trả lời đúng.
pd.Series(data=bi_sam_10, name='Số câu đúng').value_counts().sort_index()
plt.hist(bi_sam_10)
plt.show()
Vẽ histogram
# Phát sinh mẫu kích thước 1000 theo phân phối Nhị Thức
bi_sam_1000 = binom.rvs(n, p, size=1000)
freq_table = pd.Series(data=bi_sam_1000, name='Số câu
đúng').value_counts().sort_index()
freq_table
plt.hist(bi_sam_1000)
plt.show()
Nhận xét: Trong đồ thị histogram ở trên, các cột có vị trí không hoàn toàn
chính xác. Lý do là vì matplotlib tính toán tự động số cột (bins) và vị trí các cột một
cách tự động dựa vào giới hạn giá trị trên trục hoành (xlim). Vì vậy, ta thay đổi một
số tham số sau để có đồ thị hiển thị tốt hơn:
dorongcot = 0.4
offset = dorongcot/2
# Nối đỉnh các cột lại bằng các đường nét đứt ls='--' (linestyle)
#, và nối các điểm đầu mỗi cột marker='o'
plt.plot(freq_table.index, freq_table, color='y', ls='--', marker='o')
plt.show()
Vẽ hàm độ lớn (pmf)
Vì phân phối nhị thức là phân phối rời rạc nên số lượng các câu đúng cũng mang giá
trị rời rạc từ 0..10. Ta sẽ tạo một mảng x mang các giá trị từ 0..10, và một mảng y là
giá trị xác suất suất hiện tương ứng với từng giá trị của mảng x theo phân phối nhị
thức
x = range(11)
y = binom.pmf(x, n, p)
print('x: ', x)
print('y: ', y)
# Vẽ scatter
plt.scatter(x, y, color='b')
plt.xticks(x)
plt.xlabel('Giá trị')
plt.ylabel('Xác suất')
plt.title('HÀM ĐỘ LỚN PHÂN PHỐI NHỊ THỨC')
plt.show()
Bình luận
Nếu sử dụng các đường nối các điểm sẽ dễ gây hiểu nhầm là đồ thị cho hàm
liên tục, nghĩa là hàm độ lớn sẽ có giá trị tại các điểm mang giá trị không
nguyên.
Đồ thị này có hình dáng giống như đồ thị histogram vẽ từ 1000 phần tử được
phát sinh. Trên thực tế, nếu một biến ngẫu nhiên mang phân phối nhị thức thì
đồ thị phân phối tần số (histogram) vẽ từ một mẫu thu nhận được sẽ có hình
dáng gần giống như đồ thị vẽ từ hàm độ lớn của phân phối này.
# Vẽ đồ thị có kích thước 12x4 (inches), gồm 2 đồ thị con (axes) nằm cùng
một hàng
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
for value in x:
axes[0].plot([value, value], [0, y[value]], color='orange', ls='--')
plt.show()
Phân Phối Poisson
Phân phối Poisson thường dùng để tính xác suất của một số sự kiện xảy ra trong một
khoảng thời gian. Chúng ta sẽ khởi tạo ngẫu nhiên mẫu có phân phối Poisson và vẽ đồ
thị hàm độ lớn của phần phối này.
Vẽ histogram
dorongcot=0.4
offset = dorongcot/2 # Dùng để hiển thị ngay dấu ticks
plt.ylabel('Tần số')
plt.xlabel('x')
plt.title('HISTOGRAM')
plt.show()
plt.ylabel('Tần số')
plt.xlabel('x')
plt.title('HISTOGRAM')
plt.show()
Vẽ hàm độ lớn (pmf)
x = range(30)
y = poisson.pmf(x, mu=10)
print('x: ', x)
print('y: ', y)
plt.subplots(figsize=(8, 4))
# Vẽ scatter
plt.scatter(x, y, color='red')
plt.xticks(x)
plt.xlabel('Giá trị')
plt.ylabel('Xác suất')
plt.title('HÀM ĐỘ LỚN PHÂN PHỐI POISSON')
plt.show()
Vẽ hàm phân phối tích luỹ (cdf)
Thử vẽ hàm phân phối tích luỹ của đồ thị trên (mu=10)
xs_tich_luy = poisson.cdf(x, mu=10)
print(xs_tich_luy)
# Vẽ đồ thị có kích thước 12x4 (inches), gồm 2 đồ thị con (axes) nằm cùng một hàng
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
for value in x:
axes[0].plot([value, value], [0, y[value]], color='green', ls='--')
plt.show()
Phân Phối Chuẩn (Normal)
Phát sinh mẫu
Giả sử chiều cao của nam thanh niên trưởng thành là biến ngẫu nhiên có phân
phối chuẩn với kỳ vọng là 170cm, và độ lệch chuẩn là 3cm. Ta thử phát sinh
ngẫu nhiên mẫu chiều cao của 10000 thanh niên.
mu = 170
sigma = 3
norm_sam_10K = norm.rvs(loc=mu, scale=sigma, size=10000)
plt.hist(norm_sam_10K, bins=100)
plt.show()
plt.show()
norm.pdf(-1)
plt.fill_between(x=np.arange(1,4,0.01),
y1= norm.pdf(np.arange(1,4,0.01)) ,
color='red',
alpha=0.35)
plt.fill_between(x=np.arange(-1,1,0.01),
y1= norm.pdf(np.arange(-1,1,0.01)) ,
color='blue',
alpha=0.35)
Hàm cdf()
norm.cdf(-2).round(5)
norm.cdf(8, loc=16, scale=4).round(5)
norm.ppf(0.02275, loc=16, scale=4).round(2)
Hàm ppf()
norm.ppf(0.02275).round(2)
Hàm sf()
norm.sf(2).round(5)
Hàm isf()
norm.isf(0.02275).round(2)
Bài 01: Một bài thi trắc nghiệm gồm 10 câu hỏi, mỗi câu có 4 phương án trả lời trong
đó chỉ có một phương án đúng. Bạn hãy:
a. Một sinh viên không học bài làm bài bằng cách chọn ngẫu nhiên một phương án
cho mỗi câu hỏi. Bạn hãy dùng hàm random để in ra số câu đúng của bạn sinh viên
trong 10 lần kiểm tra.
b. Giả sử mỗi câu đúng được 4 điểm, mỗi câu sai bị trừ 2 điểm. Tính xác suất để sinh
viên này được 4 điểm
c. Gọi X là số câu trả lời đúng. Tính E(X) và Var(X)
a)
import random
def simulate_one_test():
# Sinh lựa chọn ngẫu nhiên cho mỗi câu (số từ 0 đến 3)
choices = [random.randint(0, 3) for _ in range(10)]
# Đếm số câu đúng (giá trị 0 là câu đúng)
correct_answers = choices.count(0)
return correct_answers
c. Để tính kỳ vọng (E(X)) và phương sai (Var(X)) cho số câu trả lời đúng (X), bạn có
thể sử dụng các công thức sau:
E(X) = n * p Var(X) = n * p * (1 - p)
Sử dụng các giá trị này, bạn có thể tính E(X) và Var(X) như sau:
n=6
p=1/4
expected_value = n * p
variance = n * p * (1 - p)
print(f"E(X) = {expected_value:.2f}")
print(f"Var(X) = {variance:.2f}")
Bài 02: Một trung tâm bưu điện nhận được 3 cuộc gọi điện thoại mỗi phút. Tính xác
suất để trung tâm nhận được 1 cuộc gọi, 2 cuộc gọi, 3 cuộc gọi trong vòng một phút
biết số cuộc gọi trong một phút có phân phối Poisson.
import math
# Vẽ histogram
plt.hist(sample, bins=10, density=True, alpha=0.6, color='b', edgecolor='k')
plt.xlabel('Trọng lượng (gam)')
plt.ylabel('Tần số tương đối')
plt.title('Histogram trọng lượng trái cây từ mẫu 20 trái cây')
plt.show()
# Vẽ histogram
plt.hist(sample, bins=10, density=True, alpha=0.6, color='b', edgecolor='k')
plt.xlabel('Trọng lượng (gam)')
plt.ylabel('Tần số tương đối')
plt.title('Histogram trọng lượng trái cây từ mẫu 100 trái cây')
plt.show()
d. Nhận xét từ hai cách lấy mẫu (20 trái và 100 trái):
Khi lấy mẫu lớn hơn (100 trái), phân phối trung bình mẫu (sample mean) có xu hướng tiệm cận giá
trị trung bình của phân phối gốc (population mean) hơn. Điều này làm giảm sai số trong ước tính
giá trị trung bình.
Độ lệch chuẩn của mẫu (sample standard deviation) cũng càng tiệm cận độ lệch chuẩn của phân
phối gốc (population standard deviation) khi kích thước mẫu lớn hơn.
4mô phỏng tung một con xúc sắc cân đối đồng chất 5000 lần. Dựa vào giá trị mô
phỏng, bạn hãy tìm các giá trị xác suất dưới đây:
a. Xác suất để số chấm xuất hiện là 4
b. Xác suất để số chấm xuất hiện lớn hơn hoặc bằng 4
c. Giả sử biết số chấm xuất hiện lớn hơn hoặc bằng 4. Hãy tìm xác suất để mặt 6
chấm xuất hiện.
A)
import random
# Số lần mô phỏng
n_simulations = 5000
for _ in range(n_simulations):
roll = random.randint(1, n_dots)
if roll == 4:
count_4 += 1
for _ in range(n_simulations):
roll = random.randint(1, n_dots)
if roll >= 4:
if roll == 6:
count_6_given_4_or_more += 1
Bài 05: Tạo 5000 số ngẫu nhiên có phân phối nhị thức với n=50, p=0.7 Bạn Hãy
a. Tìm các giá trị thống kê: min, max, Q1, Q2, Q3 b. Vẽ đồ thị boxplot c. Vẽ các đồ
thị: tần số, tần suất
import numpy as np
import matplotlib.pyplot as plt
# Tạo mẫu
sample = np.random.binomial(n, p, sample_size)
print(f"Minimum: {minimum}")
print(f"Maximum: {maximum}")
print(f"Q1 (25th percentile): {q1}")
print(f"Q2 (Median - 50th percentile): {q2}")
print(f"Q3 (75th percentile): {q3}")
# b. Vẽ đồ thị boxplot
plt.figure(figsize=(6, 4))
plt.boxplot(sample, vert=False)
plt.xlabel('Giá trị')
plt.title('Biểu đồ Boxplot')
plt.show()
plt.subplot(1, 2, 1)
plt.hist(sample, bins=20, density=False, color='blue', edgecolor='k')
plt.xlabel('Giá trị')
plt.ylabel('Tần số')
plt.title('Biểu đồ tần số')
plt.subplot(1, 2, 2)
plt.hist(sample, bins=20, density=True, color='green', edgecolor='k')
plt.xlabel('Giá trị')
plt.ylabel('Tần suất')
plt.title('Biểu đồ tần suất')
plt.tight_layout()
plt.show()
Tính: a. Chiều cao trung bình (kỳ vọng) của quần thể và độ lệch chuẩn về chiều
cao của quần thể.
b. Tính tỷ lệ người cao trong quần thể, biết rằng thanh niên có chiều cao từ 180
trở lên được gọi là cao.
c. Vẽ histogram về chiều cao của quần thể. Theo bạn quần thể có phân phối
chuẩn hay không?
d. Thử vẽ histogram và đồ thị hàm mật độ của phân phối chuẩn sử dụng tham số
loc và scale bằng với kỳ vọng và độ lệch chuẩn của quần thể.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# a. Tạo mẫu gồm 10,000 phần tử mô phỏng chiều cao từ 120cm đến 200cm
POP = np.random.uniform(120, 200, 10000)
# a. Tính kỳ vọng (trung bình) và độ lệch chuẩn của quần thể
mean_height = np.mean(POP)
std_dev_height = np.std(POP)
# b. Tính tỷ lệ người cao (chiều cao từ 180cm trở lên) trong quần thể
tall_count = np.sum(POP >= 180)
tall_percentage = (tall_count / len(POP)) * 100
# Tạo phân phối chuẩn với kỳ vọng và độ lệch chuẩn của quần thể
x = np.linspace(120, 200, 1000)
pdf = norm.pdf(x, loc=mean_height, scale=std_dev_height)
plt.plot(x, pdf, 'r', linewidth=2, label='Phân phối chuẩn')
plt.legend()
plt.title('So sánh với Phân phối Chuẩn')
plt.show()
ài 2: Lấy mẫu cỡ 20
Bạn hãy lấy một mẫu kích thước 20 phần từ. Tính:
d. Thử vẽ đồ thị hàm mật độ của phân phối chuẩn với tham số loc và scale bằng với
giá trị trung bình và độ lệch chuẩn và chiều cao của mẫu. Bạn có nhận xét gì không?
# a. Tính giá trị trung bình của mẫu và độ lệch chuẩn của mẫu
sample_mean = np.mean(sample)
sample_std_dev = np.std(sample)
# Tạo phân phối chuẩn với kỳ vọng và độ lệch chuẩn của mẫu
x = np.linspace(120, 200, 1000)
pdf_sample = norm.pdf(x, loc=sample_mean, scale=sample_std_dev)
plt.plot(x, pdf_sample, 'r', linewidth=2, label='Phân phối chuẩn')
plt.legend()
plt.title('So sánh Mẫu với Phân phối Chuẩn')
plt.show()
Bài 3: Lấy mẫu cỡ 100
Lặp lại thí nghiệm bài 2 với cỡ mẫu là 100
# Lấy mẫu kích thước 100 từ quần thể đã tạo (POP)
sample_size_large = 100
sample_large = np.random.choice(POP, sample_size_large)
# a. Tính giá trị trung bình của mẫu và độ lệch chuẩn của mẫu
sample_mean_large = np.mean(sample_large)
sample_std_dev_large = np.std(sample_large)
# Tạo phân phối chuẩn với kỳ vọng và độ lệch chuẩn của mẫu (kích thước 100)
x = np.linspace(120, 200, 1000)
pdf_sample_large = norm.pdf(x, loc=sample_mean_large,
scale=sample_std_dev_large)
plt.plot(x, pdf_sample_large, 'r', linewidth=2, label='Phân phối chuẩn')
plt.legend()
plt.title('So sánh Mẫu (kích thước 100) với Phân phối Chuẩn')
plt.show()
b. Thực hiện bài 3 100 lần, mỗi lần bạn tính được trung bình mẫu. Vẽ đồ thị
histogram cho 100 trung bình mẫu bạn tính được.
c. Vẽ histogram của hai câu a, b trong cùng một hình để so sánh. Theo bạn hình dạng
của histogram thay đổi nói lên điều gì?
Gợi ý: tạo một danh sách rỗng để chứa các trung bình mẫu tính được, sử dụng hàm
append() để thêm giá trị trung bình vào danh sách sau mỗi lần tính.
a
# Tạo danh sách để chứa trung bình mẫu
sample_means_20 = []
# Giả định dữ liệu mẫu về chiều cao (ví dụ: giá trị ngẫu nhiên)
population_heights = np.random.normal(170, 10, 1000) # Giả định 1000
người với trung bình chiều cao 170 và độ lệch chuẩn 10
sample_means = []
for _ in range(num_samples):
sample = np.random.choice(population_heights, sample_size)
sample_mean = np.mean(sample)
sample_means.append(sample_mean)
b. Bạn hãy mô phỏng 1000 lần lấy mẫu có kích cỡ 500. Vẽ histogram tỷ lệ người cao
của các mẫu
import numpy as np
import matplotlib.pyplot as plt
# Giả định dữ liệu mẫu về chiều cao (ví dụ: giá trị ngẫu nhiên)
population_heights = np.random.normal(170, 10, 1000) # Giả định 1000
người với trung bình chiều cao 170 và độ lệch chuẩn 10
sample_means = []
for _ in range(num_samples):
sample = np.random.choice(population_heights, sample_size)
sample_mean = np.mean(sample)
sample_means.append(sample_mean)
# Mô phỏng 1000 lần lấy mẫu kích thước 100 và tính phương sai
for _ in range(1000):
sample = np.random.choice(POP, 100)
sample_variance = np.var(sample)
sample_variances.append(sample_variance)
Giả sử cân nặng của gà là biến ngẫu nhiên có phân phối chuẩn. Hãy lập khoảng tin
cậy cho cân nặng trung bình của khi xuất chuồng với độ tin cậy là 95%. Trong 2
trường hợp:
a, Biết σ=0.3
import scipy.stats as stats
data = [2.1, 1.8, 2.0, 2.3, 1.7, 1.5, 2.0, 2.2, 1.8]
confidence_level = 0.95
sigma = 0.3
b, Không biết σ
import scipy.stats as stats
data = [2.1, 1.8, 2.0, 2.3, 1.7, 1.5, 2.0, 2.2, 1.8]
confidence_level = 0.95