Câu 1 (5 điểm): Sử dụng ngôn ngữ R để thực hiện các yêu cầu sau với bộ dữ liệu hoa IRIS: Tính giá trị trung bình, phương sai và độ lệch chuẩn của các thuộc tính Sepal.Length, Sepal.Width. Vẽ biểu đồ phân tán (scatter plot) giữa Sepal.Length và Sepal.Width, phân biệt màu sắc theo Species bằng thư viện ggplot2. Câu 2 (5 điểm): Sử dụng thư viện Pandas trong Python để thực hiện: Đọc một file CSV chứa bộ dữ liệu IRIS. Tính tổng, giá trị trung bình và đếm số lượng mẫu cho mỗi loài hoa (Species). Lọc ra các mẫu có Sepal.Length > 5.0 và lưu vào file mới.
data(iris)
mean_sepal_length <- mean(iris\(Sepal.Length) var_sepal_length <- var(iris\)Sepal.Length) sd_sepal_length <- sd(iris$Sepal.Length)
mean_sepal_width <- mean(iris\(Sepal.Width) var_sepal_width <- var(iris\)Sepal.Width) sd_sepal_width <- sd(iris$Sepal.Width)
cat(“Sepal.Length - Mean:”, mean_sepal_length, “, Variance:”, var_sepal_length, “, SD:”, sd_sepal_length, “”) cat(“Sepal.Width - Mean:”, mean_sepal_width, “, Variance:”, var_sepal_width, “, SD:”, sd_sepal_width, “”)
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point(size = 2) + labs(title = “Biểu đồ phân tán Sepal.Length vs Sepal.Width”, x = “Sepal Length”, y = “Sepal Width”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
summary = df.groupby(‘Species’).agg({ ‘Sepal.Length’: [‘sum’, ‘mean’, ‘count’] })
print(“Thống kê theo loài:”) print(summary)
filtered_df = df[df[‘Sepal.Length’] > 5.0]
filtered_df.to_csv(‘iris_filtered.csv’, index=False)
print(“Đã lưu các mẫu có Sepal.Length > 5.0 vào file ‘iris_filtered.csv’”)
Câu 1 (5 điểm): Sử dụng ngôn ngữ R, thực hiện: 1.Tính min, max, trung bình của Sepal.Width theo từng loại Species. 2.Vẽ boxplot cho thuộc tính Petal.Length theo từng nhóm Species bằng thư viện ggplot2. Câu 2 (5 điểm): Dùng Pandas, thực hiện các bước sau: 1.Đọc file iris.csv. 2.Tính giá trị trung bình và độ lệch chuẩn của tất cả các cột (trừ Species). 3.Lọc các dòng có Sepal.Length lớn hơn giá trị trung bình. Xuất kết quả ra file filtered_iris.csv. # Load dữ liệu IRIS data(iris)
aggregate(Sepal.Width ~ Species, data = iris, FUN = function(x) { c(min = min(x), max = max(x), mean = mean(x)) }) library(dplyr)
iris %>% group_by(Species) %>% summarise( Min = min(Sepal.Width), Max = max(Sepal.Width), Mean = mean(Sepal.Width) ) library(ggplot2)
ggplot(iris, aes(x = Species, y = Petal.Length, fill = Species)) + geom_boxplot() + labs(title = “Boxplot Petal.Length theo Species”, x = “Loài hoa”, y = “Petal Length”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
numeric_df = df.drop(columns=[‘Species’])
mean_std = numeric_df.agg([‘mean’, ‘std’]) print(“Giá trị trung bình và độ lệch chuẩn:”) print(mean_std)
sepal_length_mean = numeric_df[‘Sepal.Length’].mean()
filtered_df = df[df[‘Sepal.Length’] > sepal_length_mean]
filtered_df.to_csv(‘filtered_iris.csv’, index=False) print(“Đã lưu kết quả lọc vào file ‘filtered_iris.csv’”) Câu 1 (5 điểm): Dùng R để: 1.Tính các tứ phân vị (quartiles) của cột Sepal.Length. 2.Vẽ histogram của Sepal.Length với mỗi nhóm Species sử dụng ggplot2. Câu 2 (5 điểm): Dùng Pandas: 1.Đọc dữ liệu iris.csv. 2.Đếm số lượng dòng cho từng loại Species. 3.Vẽ biểu đồ cột (bar plot) hiển thị số lượng dòng của mỗi loại Species sử dụng thư viện Matplotlib. # Load dữ liệu IRIS data(iris)
quartiles <- quantile(iris$Sepal.Length) print(quartiles) library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, fill = Species)) + geom_histogram(position = “identity”, alpha = 0.6, bins = 20) + facet_wrap(~Species) + labs(title = “Histogram Sepal.Length theo từng Species”, x = “Sepal Length”, y = “Tần suất”) + theme_minimal() import pandas as pd import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
species_counts = df[‘Species’].value_counts() print(“Số lượng mẫu theo từng loài:”) print(species_counts)
species_counts.plot(kind=‘bar’, color=‘skyblue’, edgecolor=‘black’)
plt.title(“Số lượng mẫu theo từng loài (Species)”) plt.xlabel(“Species”) plt.ylabel(“Số lượng mẫu”) plt.xticks(rotation=0) plt.tight_layout() plt.show() Câu 1 (5 điểm): Sử dụng R: 1.Tính trung bình, độ lệch chuẩn và giá trị lớn nhất của Petal.Length cho từng nhóm Species. 2.Vẽ biểu đồ violin của Sepal.Width cho từng nhóm Species bằng thư viện ggplot2. Câu 2 (5 điểm): Sử dụng Pandas: 1.Đọc file iris.csv. 2.Tính trung bình của tất cả các cột (trừ Species) và xuất kết quả ra file mean_values.csv. 3.Lọc các dòng có Petal.Width nhỏ hơn giá trị trung bình của cột này. Xuất kết quả ra file filtered_petal_width.csv. # Load dữ liệu data(iris) library(dplyr)
iris %>% group_by(Species) %>% summarise( Mean_Petal_Length = mean(Petal.Length), SD_Petal_Length = sd(Petal.Length), Max_Petal_Length = max(Petal.Length) ) library(ggplot2)
ggplot(iris, aes(x = Species, y = Sepal.Width, fill = Species)) + geom_violin(trim = FALSE) + labs(title = “Biểu đồ Violin của Sepal.Width theo Species”, x = “Loài hoa”, y = “Sepal Width”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
mean_values = df.drop(columns=[‘Species’]).mean()
mean_values.to_csv(‘mean_values.csv’, header=[‘Mean’])
petal_width_mean = mean_values[‘Petal.Width’] filtered_df = df[df[‘Petal.Width’] < petal_width_mean]
filtered_df.to_csv(‘filtered_petal_width.csv’, index=False)
print(“Đã xuất trung bình vào ‘mean_values.csv’ và kết quả lọc vào ‘filtered_petal_width.csv’”) Câu 1 (5 điểm): Dùng R để: 1.Tính min, max, trung vị của cột Sepal.Length cho từng nhóm Species. 2.Vẽ biểu đồ cột thể hiện giá trị trung bình của Sepal.Length theo từng nhóm Species bằng thư viện ggplot2. Câu 2 (5 điểm): Dùng Pandas: 1. Đọc file iris.csv. 2. Nhóm dữ liệu theo cột Species và tính tổng giá trị của Sepal.Length cho từng nhóm. 3. Lưu kết quả ra file species_sepal_length_sum.csv.
data(iris) library(dplyr)
iris %>% group_by(Species) %>% summarise( Min_Sepal_Length = min(Sepal.Length), Max_Sepal_Length = max(Sepal.Length), Median_Sepal_Length = median(Sepal.Length) )
library(ggplot2)
mean_df <- iris %>% group_by(Species) %>% summarise(Mean_Sepal_Length = mean(Sepal.Length))
ggplot(mean_df, aes(x = Species, y = Mean_Sepal_Length, fill = Species)) + geom_col() + labs(title = “Giá trị trung bình Sepal.Length theo Species”, x = “Loài hoa”, y = “Trung bình Sepal.Length”) + theme_minimal()
import pandas as pd
df = pd.read_csv(‘iris.csv’)
sum_by_species = df.groupby(‘Species’)[‘Sepal.Length’].sum().reset_index()
sum_by_species.to_csv(‘species_sepal_length_sum.csv’, index=False)
print(“Đã lưu tổng Sepal.Length theo Species vào file ‘species_sepal_length_sum.csv’”)
Câu 1 (5 điểm): Dùng R để: Tính phương sai, độ lệch chuẩn của Sepal.Width cho từng nhóm Species. Vẽ biểu đồ histogram của cột Petal.Width với mỗi nhóm Species sử dụng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Lọc các dòng mà giá trị Sepal.Length lớn hơn 5.0 và Petal.Width nhỏ hơn 1.5. Xuất kết quả ra file filtered_data.csv. # Load thư viện và dữ liệu data(iris) library(dplyr)
iris %>% group_by(Species) %>% summarise( Variance_Sepal_Width = var(Sepal.Width), SD_Sepal_Width = sd(Sepal.Width) ) library(ggplot2)
ggplot(iris, aes(x = Petal.Width, fill = Species)) + geom_histogram(position = “identity”, alpha = 0.6, bins = 15) + facet_wrap(~Species) + labs(title = “Histogram Petal.Width theo Species”, x = “Petal Width”, y = “Tần suất”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
filtered_df = df[(df[‘Sepal.Length’] > 5.0) & (df[‘Petal.Width’] < 1.5)]
filtered_df.to_csv(‘filtered_data.csv’, index=False)
print(“Đã lưu kết quả lọc vào file ‘filtered_data.csv’”)
Câu 1 (5 điểm): Dùng R để: Tính trung bình, giá trị lớn nhất, nhỏ nhất của cột Petal.Length. Vẽ biểu đồ scatter giữa Sepal.Width và Petal.Length phân loại theo Species bằng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Đếm số lượng dòng của từng loại Species. Vẽ biểu đồ cột biểu diễn số lượng dòng của mỗi loại Species sử dụng Matplotlib. # Load dữ liệu IRIS data(iris)
mean_petal_length <- mean(iris\(Petal.Length) min_petal_length <- min(iris\)Petal.Length) max_petal_length <- max(iris$Petal.Length)
cat(“Trung bình Petal.Length:”, mean_petal_length, “”) cat(“Giá trị nhỏ nhất Petal.Length:”, min_petal_length, “”) cat(“Giá trị lớn nhất Petal.Length:”, max_petal_length, “”)
library(ggplot2)
ggplot(iris, aes(x = Sepal.Width, y = Petal.Length, color = Species)) + geom_point(size = 2) + labs(title = “Scatter plot: Sepal.Width vs Petal.Length”, x = “Sepal Width”, y = “Petal Length”) + theme_minimal() import pandas as pd import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
species_counts = df[‘Species’].value_counts() print(“Số lượng mẫu cho mỗi loài:”) print(species_counts)
species_counts.plot(kind=‘bar’, color=‘orchid’, edgecolor=‘black’) plt.title(“Số lượng mẫu theo từng loài (Species)”) plt.xlabel(“Species”) plt.ylabel(“Số lượng mẫu”) plt.xticks(rotation=0) plt.tight_w() Câu 1 (5 điểm): Dùng R để: Tính các tứ phân vị (quartiles) của Sepal.Length. Vẽ biểu đồ boxplot của Petal.Length theo từng nhóm Species bằng thư viện ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Tính trung bình, giá trị lớn nhất, nhỏ nhất của Sepal.Width theo từng nhóm Species. Xuất kết quả ra file species_summary.csv. # Load dữ liệu IRIS data(iris)
quartiles <- quantile(iris$Sepal.Length) print(quartiles)library(ggplot2)
ggplot(iris, aes(x = Species, y = Petal.Length, fill = Species)) + geom_boxplot() + labs(title = “Boxplot của Petal.Length theo Species”, x = “Loài hoa”, y = “Petal Length”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
summary = df.groupby(‘Species’)[‘Sepal.Width’].agg([‘mean’, ‘max’, ‘min’]).reset_index()
summary.columns = [‘Species’, ‘Mean_Sepal_Width’, ‘Max_Sepal_Width’, ‘Min_Sepal_Width’]
summary.to_csv(‘species_summary.csv’, index=False)
print(“Đã lưu kết quả thống kê vào file ‘species_summary.csv’”)
Câu 1 (5 điểm): Dùng R để: Tính giá trị trung bình, phương sai của tất cả các cột (trừ cột Species). Vẽ biểu đồ phân tán giữa Sepal.Length và Sepal.Width, phân nhóm theo Species bằng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Lọc các dòng có Petal.Length lớn hơn 4.0. Tính tổng của cột Sepal.Length cho dữ liệu đã lọc. # Load dữ liệu IRIS data(iris)
numeric_data <- iris[, 1:4]
means <- colMeans(numeric_data) print(“Giá trị trung bình:”) print(means)
variances <- apply(numeric_data, 2, var) print(“Phương sai:”) print(variances) library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) + geom_point(size = 2) + labs(title = “Scatter plot: Sepal.Length vs Sepal.Width theo Species”, x = “Sepal Length”, y = “Sepal Width”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
filtered_df = df[df[‘Petal.Length’] > 4.0]
sepal_length_sum = filtered_df[‘Sepal.Length’].sum()
print(“Tổng Sepal.Length của các dòng có Petal.Length > 4.0:”, sepal_length_sum) Câu 1 (5 điểm): Dùng R để: Tính giá trị lớn nhất và nhỏ nhất của cột Petal.Width theo từng nhóm Species. Vẽ biểu đồ line của trung bình Sepal.Width theo từng nhóm Species sử dụng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Nhóm dữ liệu theo Species và tính trung bình của tất cả các cột (trừ Species). Lưu kết quả vào file mean_by_species.csv. # Load dữ liệu IRIS data(iris)
iris %>% group_by(Species) %>% summarise( Min_Petal_Width = min(Petal.Width), Max_Petal_Width = max(Petal.Width) ) library(ggplot2) library(dplyr)
mean_sepal_width <- iris %>% group_by(Species) %>% summarise(Mean_Sepal_Width = mean(Sepal.Width))
ggplot(mean_sepal_width, aes(x = Species, y = Mean_Sepal_Width, group = 1)) + geom_line(color = “blue”) + geom_point(color = “red”) + labs(title = “Biểu đồ Line của Trung bình Sepal.Width theo Species”, x = “Loài hoa”, y = “Trung bình Sepal.Width”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
mean_by_species = df.drop(columns=‘Species’).groupby(df[‘Species’]).mean().reset_index()
mean_by_species.to_csv(‘mean_by_species.csv’, index=False)
print(“Đã lưu kết quả trung bình theo Species vào file ‘mean_by_species.csv’”) Câu 1 (5 điểm): Dùng R để: Tính độ lệch chuẩn của Sepal.Length theo từng nhóm Species. Vẽ biểu đồ violin của Petal.Width theo từng nhóm Species bằng thư viện ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Lọc các dòng mà Sepal.Width nhỏ hơn 3.0. Xuất kết quả ra file filtered_width.csv. # Load dữ liệu IRIS data(iris) library(dplyr)
iris %>% group_by(Species) %>% summarise(SD_Sepal_Length = sd(Sepal.Length)) library(ggplot2)
ggplot(iris, aes(x = Species, y = Petal.Width, fill = Species)) + geom_violin() + labs(title = “Biểu đồ Violin của Petal.Width theo Species”, x = “Loài hoa”, y = “Petal Width”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
filtered_df = df[df[‘Sepal.Width’] < 3.0]
filtered_df.to_csv(‘filtered_width.csv’, index=False)
print(“Đã lưu kết quả lọc vào file ‘filtered_width.csv’”) import pandas as pd
df = pd.read_csv(‘iris.csv’)
filtered_df = df[df[‘Sepal.Width’] < 3.0]
filtered_df.to_csv(‘filtered_width.csv’, index=False)
print(“Đã lưu kết quả lọc vào file ‘filtered_width.csv’”) Câu 1 (5 điểm): Dùng R để: Tính trung bình, phương sai và độ lệch chuẩn của Sepal.Width cho tất cả các dòng dữ liệu. Vẽ biểu đồ scatter giữa Petal.Length và Petal.Width, phân loại theo Species bằng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Tính tổng giá trị của Sepal.Length và Sepal.Width theo từng loại Species. Xuất kết quả ra file total_by_species.csv. # Cài đặt ggplot2 nếu chưa có # install.packages(“ggplot2”)
library(ggplot2)
data(iris)
mean_sepal_width <- mean(iris\(Sepal.Width) var_sepal_width <- var(iris\)Sepal.Width) sd_sepal_width <- sd(iris$Sepal.Width)
cat(“Trung bình Sepal.Width:”, mean_sepal_width, “”) cat(“Phương sai Sepal.Width:”, var_sepal_width, “”) cat(“Độ lệch chuẩn Sepal.Width:”, sd_sepal_width, “”)
ggplot(iris, aes(x = Petal.Length, y = Petal.Width, color = Species)) + geom_point(size = 2) + labs(title = “Biểu đồ scatter Petal.Length vs Petal.Width theo Species”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
total_by_species = df.groupby(‘Species’)[[‘Sepal.Length’, ‘Sepal.Width’]].sum()
total_by_species.to_csv(‘total_by_species.csv’)
print(total_by_species) ⚠️ Lưu ý: Đảm bảo file iris.csv nằm trong cùng thư mục với file Python khi chạy script. Nếu không, cần cung cấp đường dẫn đầy đủ. Câu 1 (5 điểm): Dùng R để: Tính min, max và trung bình của Petal.Length cho tất cả các dòng. Vẽ biểu đồ cột thể hiện trung bình Petal.Width theo từng nhóm Species sử dụng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Lọc các dòng có Sepal.Length lớn hơn 6.0. Tính giá trị trung bình của cột Petal.Width trong dữ liệu đã lọc. # Cài đặt nếu cần: # install.packages(“ggplot2”)
library(ggplot2)
data(iris)
min_petal_length <- min(iris\(Petal.Length) max_petal_length <- max(iris\)Petal.Length) mean_petal_length <- mean(iris$Petal.Length)
cat(“Giá trị nhỏ nhất Petal.Length:”, min_petal_length, “”) cat(“Giá trị lớn nhất Petal.Length:”, max_petal_length, “”) cat(“Giá trị trung bình Petal.Length:”, mean_petal_length, “”)
ggplot(iris, aes(x = Species, y = Petal.Width, fill = Species)) + stat_summary(fun = mean, geom = “bar”) + labs(title = “Trung bình Petal.Width theo Species”, y = “Trung bình Petal.Width”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
filtered_df = df[df[‘Sepal.Length’] > 6.0]
mean_petal_width = filtered_df[‘Petal.Width’].mean()
print(“Giá trị trung bình Petal.Width (Sepal.Length > 6.0):”, mean_petal_width) Câu 1 (5 điểm): Dùng R để: Tính giá trị lớn nhất, nhỏ nhất và độ lệch chuẩn của Sepal.Width cho từng nhóm Species. Vẽ biểu đồ boxplot của Sepal.Length theo từng nhóm Species bằng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Đếm số lượng dòng mà Petal.Length lớn hơn 4.0. Xuất kết quả ra file count_filtered_petal_length.csv. # Cài đặt nếu chưa có: # install.packages(“dplyr”) # install.packages(“ggplot2”)
library(dplyr) library(ggplot2)
data(iris)
summary_stats <- iris %>% group_by(Species) %>% summarise( Min_Sepal_Width = min(Sepal.Width), Max_Sepal_Width = max(Sepal.Width), SD_Sepal_Width = sd(Sepal.Width) )
print(summary_stats)
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) + geom_boxplot() + labs(title = “Boxplot của Sepal.Length theo Species”, y = “Sepal.Length”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
count_filtered = (df[‘Petal.Length’] > 4.0).sum()
result_df = pd.DataFrame({‘Count_Petal_Length_gt_4.0’: [count_filtered]}) result_df.to_csv(‘count_filtered_petal_length.csv’, index=False)
print(result_df) Câu 1 (5 điểm): Dùng R để: Tính giá trị trung bình của Sepal.Length và Petal.Length theo từng nhóm Species. Vẽ biểu đồ scatter giữa Sepal.Width và Petal.Width, phân loại theo Species bằng ggplot2. Câu 2 (5 điểm): Dùng Pandas để: Đọc file iris.csv. Tính tổng giá trị của tất cả các cột (trừ Species) theo từng loại Species. Lưu kết quả vào file total_values_by_species.csv. # Cài đặt nếu chưa có: # install.packages(“dplyr”) # install.packages(“ggplot2”)
library(dplyr) library(ggplot2)
data(iris)
mean_values <- iris %>% group_by(Species) %>% summarise( Mean_Sepal_Length = mean(Sepal.Length), Mean_Petal_Length = mean(Petal.Length) )
print(mean_values)
ggplot(iris, aes(x = Sepal.Width, y = Petal.Width, color = Species)) + geom_point(size = 2) + labs(title = “Scatter plot: Sepal.Width vs Petal.Width theo Species”) + theme_minimal() import pandas as pd
df = pd.read_csv(‘iris.csv’)
total_values = df.groupby(‘Species’).sum(numeric_only=True)
total_values.to_csv(‘total_values_by_species.csv’)
print(total_values)
Kt2 Câu 1 (5 điểm): 1.Viết chương trình R để tạo 100 giá trị ngẫu nhiên từ phân phối nhị thức với n=10, p=0.3, sau đó vẽ biểu đồ histogram của dữ liệu. 2.Kiểm định xem dữ liệu trên có tuân theo phân phối nhị thức hay không bằng phép kiểm định Kolmogorov-Smirnov. Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính giá trị trung bình, trung vị và độ lệch chuẩn của từng đặc trưng (Sepal.Length, Sepal.Width, Petal.Length, Petal.Width). 3.Vẽ biểu đồ boxplot cho từng đặc trưng theo từng loại hoa (Species). # Thiết lập tham số set.seed(123) # Đặt seed để kết quả tái lập n <- 10 p <- 0.3
data <- rbinom(100, size = n, prob = p)
hist(data, breaks = seq(-0.5, max(data)+0.5, 1), col = “skyblue”, border = “white”, main = “Histogram của dữ liệu nhị thức”, xlab = “Giá trị”, ylab = “Tần suất”)
ks_result <- ks.test(data, “pbinom”, size = n, prob = p)
print(ks_result) import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
stats = df.describe().loc[[‘mean’, ‘50%’, ‘std’]] stats.rename(index={‘50%’: ‘median’}, inplace=True) print(“Thống kê mô tả:”) print(stats)
features = [‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]
for feature in features: plt.figure(figsize=(6, 4)) sns.boxplot(x=‘Species’, y=feature, data=df, palette=“Set2”) plt.title(f’Boxplot của {feature} theo từng Species’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Tạo một mẫu 200 giá trị từ phân phối Poisson với lambda = 4 và tính giá trị trung bình, phương sai của mẫu này. 2.Sử dụng phương pháp đồ thị (QQ-plot) để kiểm tra xem dữ liệu có phù hợp với phân phối Poisson hay không. Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính khoảng giá trị từ 25% đến 75% của từng đặc trưng trong tập dữ liệu. 3.Vẽ biểu đồ histogram của chiều dài cánh hoa (Petal.Length). # Thiết lập tham số set.seed(123) lambda <- 4
data <- rpois(200, lambda = lambda)
mean_val <- mean(data) var_val <- var(data)
cat(“Trung bình mẫu:”, mean_val, “”) cat(“Phương sai mẫu:”, var_val, “”)
observed <- sort(data) theoretical <- qpois(ppoints(200), lambda)
qqplot(theoretical, observed, main = “QQ-plot: Dữ liệu thực vs Poisson(λ = 4)”, xlab = “Giá trị lý thuyết (Poisson)”, ylab = “Giá trị quan sát (data)”, col = “blue”, pch = 19) abline(0, 1, col = “red”) import pandas as pd import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
iqr = df.describe().loc[[‘25%’, ‘75%’]] print(“Khoảng giá trị từ 25% đến 75% (IQR):”) print(iqr)
plt.figure(figsize=(6, 4)) plt.hist(df[‘Petal.Length’], bins=15, color=‘skyblue’, edgecolor=‘black’) plt.title(‘Histogram của Petal.Length’) plt.xlabel(‘Petal.Length’) plt.ylabel(‘Tần suất’) plt.grid(True, linestyle=‘–’, alpha=0.5) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 500 giá trị từ phân phối chuẩn N(50,225) 2.Sử dụng kiểm định Shapiro-Wilk để kiểm tra tính chuẩn của tập dữ liệu này. Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính phương sai của từng đặc trưng trong tập dữ liệu. 3.Vẽ biểu đồ scatter giữa chiều dài đài hoa (Sepal.Length) và chiều rộng đài hoa (Sepal.Width). # Đặt seed để tái lập set.seed(123)
data <- rnorm(500, mean = 50, sd = sqrt(225))
shapiro_result <- shapiro.test(data)
cat(“Kết quả kiểm định Shapiro-Wilk:”) print(shapiro_result) import pandas as pd import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
variances = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].var() print(“Phương sai của từng đặc trưng:”) print(variances)
plt.figure(figsize=(6, 4)) plt.scatter(df[‘Sepal.Length’], df[‘Sepal.Width’], color=‘green’, alpha=0.6) plt.title(‘Scatter plot: Sepal.Length vs Sepal.Width’) plt.xlabel(‘Sepal.Length’) plt.ylabel(‘Sepal.Width’) plt.grid(True, linestyle=‘–’, alpha=0.5) plt.tight_layout() plt.show() Câu 1 (5 điểm):[2,10] 1.Sinh ngẫu nhiên 300 giá trị từ phân phối đều liên tục trong khoảng 2 đến10 2.Tính giá trị kỳ vọng và phương sai của mẫu dữ liệu trên. Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Xác định giá trị lớn nhất và nhỏ nhất của từng đặc trưng trong tập dữ liệu. 3.Vẽ biểu đồ barplot để hiển thị số lượng mẫu của mỗi loại hoa. set.seed(123)
data <- runif(300, min = 2, max = 10)
mean_val <- mean(data) var_val <- var(data)
cat(“Giá trị kỳ vọng (mean):”, mean_val, “”) cat(“Phương sai (variance):”, var_val, “”) import pandas as pd import matplotlib.pyplot as plt import seaborn as sns
df = pd.read_csv(‘iris.csv’)
min_max = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].agg([‘min’, ‘max’]) print(“Giá trị nhỏ nhất và lớn nhất của từng đặc trưng:”) print(min_max)
plt.figure(figsize=(6, 4)) sns.countplot(x=‘Species’, data=df, palette=“Set2”) plt.title(‘Số lượng mẫu theo từng loại hoa’) plt.xlabel(‘Loại hoa (Species)’) plt.ylabel(‘Số lượng mẫu’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 400 giá trị từ phân phối mũ với lambda = 0.5 2.Tính giá trị trung bình, phương sai và vẽ biểu đồ phân phối của mẫu dữ liệu này. Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính hệ số tương quan giữa chiều dài đài hoa (Sepal.Length) và chiều dài cánh hoa (Petal.Length). 3.Vẽ biểu đồ scatter giữa chiều dài cánh hoa (Petal.Length) và chiều rộng cánh hoa (Petal.Width) theo từng loại hoa. set.seed(123)
lambda <- 0.5 data <- rexp(400, rate = lambda)
mean_val <- mean(data) var_val <- var(data)
cat(“Trung bình mẫu:”, mean_val, “”) cat(“Phương sai mẫu:”, var_val, “”)
hist(data, breaks = 30, probability = TRUE, col = “lightblue”, border = “white”, main = “Biểu đồ phân phối mẫu từ phân phối mũ (lambda = 0.5)”, xlab = “Giá trị”)
curve(dexp(x, rate = lambda), col = “red”, lwd = 2, add = TRUE) import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
correlation = df[‘Sepal.Length’].corr(df[‘Petal.Length’]) print(“Hệ số tương quan giữa Sepal.Length và Petal.Length:”, correlation)
plt.figure(figsize=(6, 4)) sns.scatterplot(x=‘Petal.Length’, y=‘Petal.Width’, hue=‘Species’, data=df, palette=‘Set1’) plt.title(‘Scatter plot: Petal.Length vs Petal.Width theo Species’) plt.xlabel(‘Petal.Length’) plt.ylabel(‘Petal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 600 giá trị từ phân phối nhị thức với n=20, p=0.5 2.Vẽ biểu đồ histogram của dữ liệu và so sánh với phân phối chuẩn. Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính giá trị trung bình, độ lệch chuẩn của từng đặc trưng theo từng loại hoa. 3.Vẽ biểu đồ Boxplot của chiều rộng đài hoa (Sepal.Width). set.seed(123)
n <- 20 p <- 0.5 data <- rbinom(600, size = n, prob = p)
mean_val <- mean(data) sd_val <- sd(data)
hist(data, breaks = seq(min(data)-0.5, max(data)+0.5, 1), probability = TRUE, col = “lightblue”, border = “white”, main = “Histogram của phân phối nhị thức vs. chuẩn”, xlab = “Giá trị”)
x_vals <- seq(min(data), max(data), length.out = 100) lines(x_vals, dnorm(x_vals, mean = mean_val, sd = sd_val), col = “red”, lwd = 2)
legend(“topright”, legend = c(“Histogram”, “Phân phối chuẩn”), fill = c(“lightblue”, NA), border = c(“white”, NA), lty = c(NA, 1), col = c(“black”, “red”)) import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
stats = df.groupby(‘Species’)[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].agg([‘mean’, ‘std’]) print(“Trung bình và độ lệch chuẩn theo từng loại hoa:”) print(stats)
plt.figure(figsize=(6, 4)) sns.boxplot(x=‘Species’, y=‘Sepal.Width’, data=df, palette=‘Pastel1’) plt.title(‘Boxplot của Sepal.Width theo Species’) plt.xlabel(‘Loại hoa (Species)’) plt.ylabel(‘Sepal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Tạo một mẫu 150 giá trị có phân phối Poisson .λ=7 2.Kiểm tra tính chất của mẫu bằng cách so sánh giá trị trung bình và phương sai. set.seed(123)
n <- 20 p <- 0.5 data <- rbinom(600, size = n, prob = p)
mean_val <- mean(data) sd_val <- sd(data)
hist(data, breaks = seq(min(data)-0.5, max(data)+0.5, 1), probability = TRUE, col = “lightblue”, border = “white”, main = “Histogram của phân phối nhị thức vs. chuẩn”, xlab = “Giá trị”)
x_vals <- seq(min(data), max(data), length.out = 100) lines(x_vals, dnorm(x_vals, mean = mean_val, sd = sd_val), col = “red”, lwd = 2)
legend(“topright”, legend = c(“Histogram”, “Phân phối chuẩn”), fill = c(“lightblue”, NA), border = c(“white”, NA), lty = c(NA, 1), col = c(“black”, “red”))
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính hệ số tương quan giữa chiều dài cánh hoa (Petal.Length) và chiều rộng cánh hoa (Petal.Width). 3.Vẽ biểu đồ scatter giữa hai đặc trưng này. import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
stats = df.groupby(‘Species’)[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].agg([‘mean’, ‘std’]) print(“Trung bình và độ lệch chuẩn theo từng loại hoa:”) print(stats)
plt.figure(figsize=(6, 4)) sns.boxplot(x=‘Species’, y=‘Sepal.Width’, data=df, palette=‘Pastel1’) plt.title(‘Boxplot của Sepal.Width theo Species’) plt.xlabel(‘Loại hoa (Species)’) plt.ylabel(‘Sepal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 350 giá trị từ phân phối chuẩn N(30,100). 2.Dùng kiểm định Shapiro-Wilk để kiểm tra tính chuẩn của dữ liệu. set.seed(123)
mean_val <- 30 sd_val <- 100 data <- rnorm(350, mean = mean_val, sd = sd_val)
shapiro_test <- shapiro.test(data)
cat(“Kết quả kiểm định Shapiro-Wilk:”) print(shapiro_test)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính các giá trị tối thiểu, tối đa của từng đặc trưng. 3.Vẽ biểu đồ histogram của chiều dài đài hoa (Sepal.Length). import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
min_max_values = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].agg([‘min’, ‘max’]) print(“Giá trị tối thiểu và tối đa của từng đặc trưng:”) print(min_max_values)
plt.figure(figsize=(6, 4)) sns.histplot(df[‘Sepal.Length’], kde=True, color=‘skyblue’, bins=20) plt.title(‘Histogram của Sepal.Length’) plt.xlabel(‘Sepal.Length’) plt.ylabel(‘Tần suất’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 500 giá trị từ phân phối đều liên tục trên khoảng 0 đến 5[0,5] 2.Tính kỳ vọng, phương sai của mẫu và vẽ biểu đồ histogram. set.seed(123)
data <- runif(500, min = 0, max = 5)
expected_value <- mean(data) # Kỳ vọng variance <- var(data) # Phương sai
cat(“Kỳ vọng của mẫu:”, expected_value, “”) cat(“Phương sai của mẫu:”, variance, “”)
hist(data, breaks = 20, probability = TRUE, col = “lightblue”, border = “white”, main = “Histogram của phân phối đều”, xlab = “Giá trị”)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính trung bình và phương sai của chiều dài đài hoa (Sepal.Length) theo từng loại hoa. 3.Vẽ biểu đồ Boxplot cho từng loại hoa. import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
sepal_stats = df.groupby(‘Species’)[‘Sepal.Length’].agg([‘mean’, ‘var’]) print(“Trung bình và phương sai của Sepal.Length theo từng loại hoa:”) print(sepal_stats)
plt.figure(figsize=(6, 4)) sns.boxplot(x=‘Species’, y=‘Sepal.Length’, data=df, palette=‘Set2’) plt.title(‘Boxplot của Sepal.Length theo Species’) plt.xlabel(‘Loại hoa (Species)’) plt.ylabel(‘Sepal.Length’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 400 giá trị từ phân phối mũ với lambda = 0.3 2.Kiểm tra phân phối của dữ liệu bằng biểu đồ QQ-plot. set.seed(123)
lambda <- 0.3 data <- rexp(400, rate = lambda)
qqnorm(data, main = “QQ-plot của phân phối mũ”) qqline(data, col = “red”, lwd = 2)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính độ lệch chuẩn của từng đặc trưng. 3.Vẽ biểu đồ scatter giữa chiều dài cánh hoa (Petal.Length) và chiều rộng đài hoa (Sepal.Width). import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
std_devs = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].std() print(“Độ lệch chuẩn của từng đặc trưng:”) print(std_devs)
plt.figure(figsize=(6, 4)) sns.scatterplot(x=‘Petal.Length’, y=‘Sepal.Width’, data=df, hue=‘Species’, palette=‘Set2’) plt.title(‘Scatter plot giữa Petal.Length và Sepal.Width’) plt.xlabel(‘Petal.Length’) plt.ylabel(‘Sepal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 300 giá trị từ phân phối nhị thức với n=15, p=0.4 2.Vẽ biểu đồ histogram và so sánh với phân phối Poisson tương ứng. set.seed(123)
lambda <- 0.3 data <- rexp(400, rate = lambda)
qqnorm(data, main = “QQ-plot của phân phối mũ”) qqline(data, col = “red”, lwd = 2)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính giá trị trung bình của từng đặc trưng theo từng loại hoa. 3.Vẽ biểu đồ scatter giữa chiều dài đài hoa (Sepal.Length) và chiều dài cánh hoa (Petal.Length). import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
std_devs = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].std() print(“Độ lệch chuẩn của từng đặc trưng:”) print(std_devs)
plt.figure(figsize=(6, 4)) sns.scatterplot(x=‘Petal.Length’, y=‘Sepal.Width’, data=df, hue=‘Species’, palette=‘Set2’) plt.title(‘Scatter plot giữa Petal.Length và Sepal.Width’) plt.xlabel(‘Petal.Length’) plt.ylabel(‘Sepal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Tạo một mẫu 200 giá trị từ phân phối Poisson λ=5 2.Kiểm tra tính phù hợp với phân phối Poisson bằng cách so sánh trung bình và phương sai. set.seed(123)
lambda <- 5 data <- rpois(200, lambda)
sample_mean <- mean(data) sample_var <- var(data)
cat(“Trung bình của mẫu:”, sample_mean, “”) cat(“Phương sai của mẫu:”, sample_var, “”)
theoretical_mean <- lambda theoretical_var <- lambda
cat(“Trung bình lý thuyết:”, theoretical_mean, “”) cat(“Phương sai lý thuyết:”, theoretical_var, “”)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính khoảng giá trị từ 25% đến 75% của từng đặc trưng. 3.Vẽ biểu đồ histogram của chiều rộng cánh hoa (Petal.Width). import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
quantiles = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].quantile([0.25, 0.75]) print(“Khoảng giá trị từ 25% đến 75% của từng đặc trưng:”) print(quantiles)
plt.figure(figsize=(6, 4)) sns.histplot(df[‘Petal.Width’], kde=True, color=‘skyblue’, bins=15) plt.title(‘Histogram của Petal.Width’) plt.xlabel(‘Petal.Width’) plt.ylabel(‘Tần suất’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 600 giá trị từ phân phối chuẩn N(40,122) 2.Kiểm tra tính chuẩn của dữ liệu bằng kiểm định Shapiro-Wilk. set.seed(123)
mu <- 40 # Trung bình sigma <- 12 # Độ lệch chuẩn data <- rnorm(600, mean = mu, sd = sigma)
shapiro_test <- shapiro.test(data)
cat(“Giá trị p từ kiểm định Shapiro-Wilk:”, shapiro_test$p.value, “”)
if (shapiro_test$p.value < 0.05) { cat(“Dữ liệu không tuân theo phân phối chuẩn.”) } else { cat(“Dữ liệu tuân theo phân phối chuẩn.”) }
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính giá trị trung bình và phương sai của chiều rộng đài hoa (Sepal.Width) theo từng loại hoa. 3.Vẽ biểu đồ Boxplot của chiều rộng đài hoa theo từng loại hoa. import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
sepal_width_stats = df.groupby(‘Species’)[‘Sepal.Width’].agg([‘mean’, ‘var’]) print(“Trung bình và phương sai của Sepal.Width theo từng loại hoa:”) print(sepal_width_stats)
plt.figure(figsize=(6, 4)) sns.boxplot(x=‘Species’, y=‘Sepal.Width’, data=df, palette=‘Set2’) plt.title(‘Boxplot của Sepal.Width theo Species’) plt.xlabel(‘Loại hoa (Species)’) plt.ylabel(‘Sepal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 500 giá trị từ phân phối đều liên tục trên khoảng [1,7]. 2.Tính kỳ vọng, phương sai của mẫu và vẽ biểu đồ histogram. set.seed(123)
n <- 500 data_uniform <- runif(n, min = 1, max = 7)
expected_value <- mean(data_uniform) variance_value <- var(data_uniform)
cat(“Kỳ vọng của mẫu:”, expected_value, “”) cat(“Phương sai của mẫu:”, variance_value, “”)
hist(data_uniform, breaks = 20, col = “lightblue”, border = “white”, main = “Histogram của phân phối đều”, xlab = “Giá trị”, ylab = “Tần suất”)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính hệ số tương quan giữa chiều dài đài hoa (Sepal.Length) và chiều rộng đài hoa (Sepal.Width). 3.Vẽ biểu đồ scatter giữa hai đặc trưng này. import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
correlation = df[‘Sepal.Length’].corr(df[‘Sepal.Width’]) print(f”Hệ số tương quan giữa Sepal.Length và Sepal.Width: {correlation}“)
plt.figure(figsize=(6, 4)) sns.scatterplot(x=‘Sepal.Length’, y=‘Sepal.Width’, data=df, hue=‘Species’, palette=‘Set2’) plt.title(‘Scatter plot giữa Sepal.Length và Sepal.Width’) plt.xlabel(‘Sepal.Length’) plt.ylabel(‘Sepal.Width’) plt.tight_layout() plt.show() Câu 1 (5 điểm): 1.Sinh ngẫu nhiên 400 giá trị từ phân phối mũ với lambda = 0.4 2.Kiểm tra phân phối của dữ liệu bằng QQ-plot. set.seed(123)
lambda <- 0.4 data_exponential <- rexp(400, rate = lambda)
qqnorm(data_exponential, main = “QQ-plot của phân phối mũ”) qqline(data_exponential, col = “red”)
Câu 2 (5 điểm): 1.Đọc tập dữ liệu Iris bằng thư viện Pandas. 2.Tính khoảng giá trị từ 25% đến 75% của từng đặc trưng. 3.Vẽ biểu đồ Boxplot của chiều dài cánh hoa (Petal.Length). import pandas as pd import seaborn as sns import matplotlib.pyplot as plt
df = pd.read_csv(‘iris.csv’)
quantiles = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].quantile([0.25, 0.75]) print(“Khoảng giá trị từ 25% đến 75% của từng đặc trưng:”) print(quantiles)
plt.figure(figsize=(6, 4)) sns.boxplot(x=‘Species’, y=‘Petal.Length’, data=df, palette=‘Set2’) plt.title(‘Boxplot của Petal.Length theo Species’) plt.xlabel(‘Loại hoa (Species)’) plt.ylabel(‘Petal.Length’) plt.tight_layout() plt.show() BAI3: Câu 1 (5 điểm) Sử dụng tập dữ liệu mtcars trong R, xây dựng mô hình hồi quy tuyến tính để dự đoán mpg dựa vào hp và wt. Đánh giá mô hình bằng hệ số R bình phương R2và RMSE. Câu 2 (5 điểm) Dùng tập dữ liệu iris, xây dựng mô hình hồi quy logistic để phân loại Species (chỉ xét hai lớp setosa và versicolor). Tính ma trận nhầm lẫn của mô hình và độ chính xác. # Dữ liệu mtcars data(mtcars)
model <- lm(mpg ~ hp + wt, data = mtcars)
summary_model <- summary(model) r_squared <- summary_model$r.squared
predictions <- predict(model, mtcars)
actual <- mtcars$mpg rmse <- sqrt(mean((actual - predictions)^2))
cat(“R-squared:”, r_squared, “”) cat(“RMSE:”, rmse, “”) # Dữ liệu iris data(iris)
iris_binary <- subset(iris, Species %in% c(“setosa”, “versicolor”))
iris_binary\(Species <- factor(iris_binary\)Species) iris_binary\(Species <- as.numeric(iris_binary\)Species == “versicolor”)
model_logit <- glm(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris_binary, family = binomial)
predicted_probs <- predict(model_logit, type = “response”)
predicted_classes <- ifelse(predicted_probs > 0.5, 1, 0)
conf_matrix <- table(Predicted = predicted_classes, Actual = iris_binary$Species)
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
print(“Confusion Matrix:”) print(conf_matrix) cat(“Accuracy:”, accuracy, “”) Câu 1 (5 điểm) Sử dụng tập Boston (từ thư viện MASS), xây dựng mô hình hồi quy tuyến tính dự đoán medv theo lstat và rm. Tính MAE và MSE của mô hình. Câu 2 (5 điểm) Sử dụng tập Default (từ thư viện ISLR), xây dựng mô hình hồi quy logistic dự đoán default dựa vào balance và income. Vẽ ROC curve và tính AUC. # Tải dữ liệu và thư viện library(MASS)
data(“Boston”)
model <- lm(medv ~ lstat + rm, data = Boston)
predictions <- predict(model, Boston)
actual <- Boston$medv
mae <- mean(abs(actual - predictions)) mse <- mean((actual - predictions)^2)
cat(“MAE:”, mae, “”) cat(“MSE:”, mse, “”) # Tải dữ liệu và thư viện library(ISLR) library(pROC)
data(“Default”)
model_logit <- glm(default ~ balance + income, data = Default, family = “binomial”)
predicted_probs <- predict(model_logit, type = “response”)
roc_obj <- roc(Default$default, predicted_probs)
plot(roc_obj, col = “blue”, main = “ROC Curve - Default Model”)
auc_value <- auc(roc_obj) cat(“AUC:”, auc_value, “”) Câu 1 (5 điểm) Sử dụng tập iris, xây dựng mô hình hồi quy tuyến tính dự đoán Petal.Length theo Sepal.Length và Sepal.Width. Kiểm tra giả định của mô hình bằng biểu đồ residual plot. Câu 2 (5 điểm) Dùng tập PimaIndiansDiabetes (từ thư viện mlbench), xây dựng mô hình hồi quy logistic dự đoán diabetes. Tính precision, recall và F1-score. # Dữ liệu iris data(iris)
model <- lm(Petal.Length ~ Sepal.Length + Sepal.Width, data = iris)
par(mfrow = c(1, 1)) # Một biểu đồ trên màn hình plot(model\(fitted.values, model\)residuals, xlab = “Fitted values”, ylab = “Residuals”, main = “Residual Plot”, pch = 19, col = “darkgreen”) abline(h = 0, col = “red”, lwd = 2) # Tải thư viện và dữ liệu library(mlbench) library(caret) # Để tính confusion matrix data(PimaIndiansDiabetes)
model_logit <- glm(diabetes ~ ., data = PimaIndiansDiabetes, family = “binomial”)
probs <- predict(model_logit, type = “response”)
predicted <- ifelse(probs > 0.5, “pos”, “neg”) predicted <- factor(predicted, levels = c(“neg”, “pos”))
actual <- PimaIndiansDiabetes$diabetes
conf <- confusionMatrix(predicted, actual, positive = “pos”)
cat(“Precision:”, conf\(byClass["Precision"], "\n") cat("Recall:", conf\)byClass[“Recall”], “”) cat(“F1-score:”, conf$byClass[“F1”], “”) Câu 1 (5 điểm) • Tạo tập dữ liệu ngẫu nhiên 100 quan sát với biến phụ thuộc Y = 3X1 + 2X2 + 6 và chạy mô hình hồi quy tuyến tính. Tính RMSE và hệ số R2. Câu 2 (5 điểm) Dùng tập Titanic (từ thư viện titanic), xây dựng mô hình hồi quy logistic dự đoán Survived. Tính accuracy và ma trận nhầm lẫn. set.seed(123) # Đảm bảo tái lập kết quả
n <- 100 X1 <- rnorm(n, mean = 0, sd = 1) X2 <- rnorm(n, mean = 0, sd = 1) error <- rnorm(n, mean = 0, sd = 1) Y <- 3 * X1 + 2 * X2 + 6 + error
data_sim <- data.frame(Y, X1, X2)
model <- lm(Y ~ X1 + X2, data = data_sim)
predictions <- predict(model, data_sim)
rmse <- sqrt(mean((data_sim$Y - predictions)^2))
r_squared <- summary(model)$r.squared
cat(“RMSE:”, rmse, “”) cat(“R-squared:”, r_squared, “”) # Cài và load thư viện nếu cần # install.packages(“titanic”) library(titanic) library(caret)
data <- titanic_train
data <- na.omit(data[, c(“Survived”, “Pclass”, “Sex”, “Age”)])
data\(Sex <- ifelse(data\)Sex == “male”, 1, 0) # male = 1, female = 0
model_logit <- glm(Survived ~ Pclass + Sex + Age, data = data, family = binomial)
probs <- predict(model_logit, type = “response”)
predicted <- ifelse(probs > 0.5, 1, 0)
predicted <- factor(predicted, levels = c(0,1)) actual <- factor(data$Survived, levels = c(0,1))
conf <- confusionMatrix(predicted, actual, positive = “1”)
print(conf\(table) cat("Accuracy:", conf\)overall[“Accuracy”], “”) Câu 1 (5 điểm) Sử dụng tập airquality, dự đoán Ozone dựa vào Wind và Temp bằng mô hình hồi quy tuyến tính. Kiểm tra tính đa cộng tuyến bằng VIF. # Load dữ liệu data(“airquality”)
data <- na.omit(airquality[, c(“Ozone”, “Wind”, “Temp”)])
model <- lm(Ozone ~ Wind + Temp, data = data)
library(car)
vif_values <- vif(model)
summary(model) cat(“VIF values:”) print(vif_values)
Câu 2 (5 điểm) Dùng tập Heart (từ thư viện mlbench), xây dựng mô hình hồi quy logistic dự đoán AHD. Tính ROC-AUC score. # Cài đặt thư viện nếu chưa có # install.packages(“mlbench”) # install.packages(“pROC”)
library(mlbench) library(pROC)
data(Heart)
heart_data <- na.omit(Heart)
model_logit <- glm(AHD ~ ., data = heart_data, family = binomial)
probs <- predict(model_logit, type = “response”)
actual <- heart_data$AHD
roc_obj <- roc(actual, probs)
plot(roc_obj, col = “blue”, main = “ROC Curve - Heart Dataset”)
auc_score <- auc(roc_obj) cat(“ROC-AUC Score:”, auc_score, “”) Câu 1 (5 điểm) Xây dựng mô hình hồi quy tuyến tính dự đoán Sepal.Length từ Sepal.Width và Petal.Length trong tập iris. Kiểm tra giả định phân phối chuẩn của residuals. # Dữ liệu iris data(iris)
model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris)
summary(model)
res <- residuals(model)
par(mfrow = c(1, 2)) # Hiển thị 2 biểu đồ cạnh nhau
hist(res, breaks = 20, col = “skyblue”, main = “Histogram of Residuals”, xlab = “Residuals”)
qqnorm(res, main = “Q-Q Plot of Residuals”) qqline(res, col = “red”, lwd = 2)
Câu 2 (5 điểm) Xây dựng mô hình hồi quy logistic dự đoán Survived trong tập Titanic. Tính F1-score của mô hình. # Cài đặt thư viện nếu cần # install.packages(“titanic”) # install.packages(“caret”)
library(titanic) library(caret)
data <- titanic_train data <- na.omit(data[, c(“Survived”, “Pclass”, “Sex”, “Age”)]) data\(Sex <- ifelse(data\)Sex == “male”, 1, 0)
model_logit <- glm(Survived ~ Pclass + Sex + Age, data = data, family = binomial)
probs <- predict(model_logit, type = “response”)
predicted <- ifelse(probs > 0.5, 1, 0) predicted <- factor(predicted, levels = c(0, 1)) actual <- factor(data$Survived, levels = c(0, 1))
conf <- confusionMatrix(predicted, actual, positive = “1”)
cat(“F1-score:”, conf$byClass[“F1”], “”) Câu 1 (5 điểm) Sử dụng tập mtcars, dự đoán mpg bằng hồi quy tuyến tính dựa vào disp và qsec. Kiểm tra độ phù hợp mô hình bằng hệ số R bình phương hiệu chỉnh. # Dữ liệu mtcars data(mtcars)
model <- lm(mpg ~ disp + qsec, data = mtcars)
summary_model <- summary(model)
adj_r_squared <- summary_model$adj.r.squared
cat(“Adjusted R-squared:”, adj_r_squared, “”) Câu 2 (5 điểm) Dùng tập iris, dự đoán Species (chỉ xét versicolor và virginica) bằng hồi quy logistic. Vẽ đường ROC và tính AUC. # Cài đặt thư viện nếu cần # install.packages(“pROC”)
library(pROC)
data(iris)
iris_bin <- subset(iris, Species %in% c(“versicolor”, “virginica”))
iris_bin\(Species <- factor(iris_bin\)Species) iris_bin\(Species <- as.numeric(iris_bin\)Species == “virginica”)
model_logit <- glm(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris_bin, family = binomial)
probs <- predict(model_logit, type = “response”)
roc_obj <- roc(iris_bin$Species, probs)
plot(roc_obj, col = “darkblue”, main = “ROC Curve - Iris Logistic Model”)
auc_score <- auc(roc_obj) cat(“AUC:”, auc_score, “”) Câu 1 (5 điểm) Xây dựng mô hình hồi quy tuyến tính trên tập Boston để dự đoán medv từ crim và indus. Kiểm tra mức ý nghĩa của các hệ số hồi quy. # Cài và load thư viện # install.packages(“MASS”) library(MASS)
data(“Boston”)
model <- lm(medv ~ crim + indus, data = Boston)
summary_model <- summary(model)
print(summary_model)
Câu 2 (5 điểm) Sử dụng tập PimaIndiansDiabetes, dự đoán diabetes bằng hồi quy logistic. So sánh precision và recall khi thay đổi ngưỡng phân loại. # Cài và load thư viện # install.packages(“mlbench”) # install.packages(“caret”) library(mlbench) library(caret)
data(“PimaIndiansDiabetes”)
model <- glm(diabetes ~ ., data = PimaIndiansDiabetes, family = “binomial”)
probs <- predict(model, type = “response”) actual <- PimaIndiansDiabetes$diabetes
evaluate_threshold <- function(threshold) { predicted <- ifelse(probs > threshold, “pos”, “neg”) predicted <- factor(predicted, levels = c(“neg”, “pos”)) cm <- confusionMatrix(predicted, actual, positive = “pos”) precision <- cm\(byClass["Precision"] recall <- cm\)byClass[“Recall”] cat(“Threshold:”, threshold, “→ Precision:”, round(precision, 3), “, Recall:”, round(recall, 3), “”) }
evaluate_threshold(0.3) evaluate_threshold(0.5) # mặc định evaluate_threshold(0.7) âu 1 (5 điểm) Dùng tập iris, chạy hồi quy tuyến tính dự đoán Petal.Width từ Petal.Length. Đánh giá mô hình bằng MAE. # Dữ liệu iris data(iris)
model <- lm(Petal.Width ~ Petal.Length, data = iris)
predicted <- predict(model, iris)
actual <- iris$Petal.Width mae <- mean(abs(actual - predicted))
cat(“MAE (Mean Absolute Error):”, round(mae, 4), “”)
Câu 2 (5 điểm) Xây dựng mô hình hồi quy logistic trên tập Heart để dự đoán bệnh tim. Tính và so sánh các độ đo Accuracy, Precision và Recall. # Cài và load thư viện # install.packages(“mlbench”) # install.packages(“caret”) library(mlbench) library(caret)
data(“Heart”)
heart_data <- na.omit(Heart)
model <- glm(AHD ~ ., data = heart_data, family = binomial)
probs <- predict(model, type = “response”)
predicted <- ifelse(probs > 0.5, “Yes”, “No”) predicted <- factor(predicted, levels = c(“No”, “Yes”)) actual <- heart_data$AHD
conf <- confusionMatrix(predicted, actual, positive = “Yes”)
cat(“Accuracy :”, round(conf\(overall["Accuracy"], 3), "\n") cat("Precision:", round(conf\)byClass[“Precision”], 3), “”) cat(“Recall :”, round(conf$byClass[“Recall”], 3), “”) Câu 1 (5 điểm) Xây dựng mô hình hồi quy tuyến tính trên tập airquality, dự đoán Temp dựa vào Wind và Solar.R. Kiểm tra giả định phân phối chuẩn của residuals bằng Shapiro-Wilk test. # Load dữ liệu data(“airquality”)
data <- na.omit(airquality[, c(“Temp”, “Wind”, “Solar.R”)])
model <- lm(Temp ~ Wind + Solar.R, data = data)
residuals_model <- residuals(model)
shapiro_test <- shapiro.test(residuals_model)
cat(“Shapiro-Wilk test p-value:”, shapiro_test$p.value, “”)
if (shapiro_test$p.value > 0.05) { cat(“✅ Residuals có thể coi là phân phối chuẩn (không bác bỏ H0).”) } else { cat(“⚠️ Residuals có thể không phân phối chuẩn (bác bỏ H0).”) }
Câu 2 (5 điểm) Dự đoán Survived trên tập Titanic bằng hồi quy logistic. Tính độ chính xác của mô hình trên tập kiểm tra. # Cài thư viện nếu cần # install.packages(“titanic”) # install.packages(“caret”) library(titanic) library(caret)
data <- titanic_train
data <- na.omit(data[, c(“Survived”, “Pclass”, “Sex”, “Age”)]) data\(Sex <- ifelse(data\)Sex == “male”, 1, 0)
set.seed(123) train_index <- createDataPartition(data$Survived, p = 0.7, list = FALSE) train_data <- data[train_index, ] test_data <- data[-train_index, ]
model_logit <- glm(Survived ~ Pclass + Sex + Age, data = train_data, family = binomial)
probs <- predict(model_logit, newdata = test_data, type = “response”) predicted <- ifelse(probs > 0.5, 1, 0)
actual <- test_data$Survived accuracy <- mean(predicted == actual)
cat(“Accuracy on test set:”, round(accuracy, 3), “”) Câu 1 (5 điểm) Sử dụng tập mtcars, chạy hồi quy tuyến tính để dự đoán hp từ wt và qsec. Tính RMSE của mô hình. # Dữ liệu mtcars data(mtcars)
model <- lm(hp ~ wt + qsec, data = mtcars)
predicted_hp <- predict(model, mtcars)
actual_hp <- mtcars$hp rmse <- sqrt(mean((actual_hp - predicted_hp)^2))
cat(“RMSE:”, round(rmse, 3), “”)
Câu 2 (5 điểm) Dùng tập iris, chạy hồi quy logistic để phân loại Species. Kiểm tra độ chính xác trên tập kiểm tra. # Dữ liệu iris data(iris)
set.seed(123) train_index <- sample(1:nrow(iris), 0.8 * nrow(iris)) train_data <- iris[train_index, ] test_data <- iris[-train_index, ]
model_logit <- glm(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = train_data, family = “binomial”)
probs <- predict(model_logit, newdata = test_data, type = “response”)
predicted <- ifelse(probs > 0.5, “versicolor”, “setosa”) # Chỉ xét 2 lớp: setosa và versicolor predicted <- factor(predicted, levels = c(“setosa”, “versicolor”))
actual <- test_data$Species accuracy <- mean(predicted == actual)
cat(“Accuracy on test set:”, round(accuracy, 3), “”) Câu 1 (5 điểm) Sử dụng tập airquality, xây dựng mô hình hồi quy tuyến tính để dự đoán Ozone. Tính độ lỗi trung bình tuyệt đối (MAE). # Dữ liệu airquality data(“airquality”)
data <- na.omit(airquality[, c(“Ozone”, “Wind”, “Solar.R”, “Temp”)])
model <- lm(Ozone ~ Wind + Solar.R + Temp, data = data)
predicted_ozone <- predict(model, data)
actual_ozone <- data$Ozone mae <- mean(abs(actual_ozone - predicted_ozone))
cat(“MAE (Mean Absolute Error):”, round(mae, 3), “”)
Câu 2 (5 điểm) Xây dựng hồi quy logistic trên tập PimaIndiansDiabetes. So sánh mô hình bằng ROC-AUC.
library(mlbench) library(pROC)
data(“PimaIndiansDiabetes”)
model_logit <- glm(diabetes ~ ., data = PimaIndiansDiabetes, family = “binomial”)
probs <- predict(model_logit, type = “response”)
roc_obj <- roc(PimaIndiansDiabetes$diabetes, probs)
plot(roc_obj, main = “ROC Curve for Logistic Regression Model”, col = “blue”)
auc_score <- auc(roc_obj) cat(“AUC (Area Under Curve):”, round(auc_score, 3), “”) Câu 1 (5 điểm) Sử dụng tập Boston, dự đoán medv từ rm bằng hồi quy tuyến tính. Kiểm tra giả định phân phối chuẩn của residuals. # Cài và load thư viện # install.packages(“MASS”) library(MASS)
data(“Boston”)
model <- lm(medv ~ rm, data = Boston)
summary(model)
predicted <- predict(model, Boston)
residuals_model <- residuals(model)
shapiro_test <- shapiro.test(residuals_model)
cat(“Shapiro-Wilk test p-value:”, shapiro_test$p.value, “”)
if (shapiro_test$p.value > 0.05) { cat(“✅ Residuals có thể coi là phân phối chuẩn (không bác bỏ H0).”) } else { cat(“⚠️ Residuals có thể không phân phối chuẩn (bác bỏ H0).”) }
Câu 2 (5 điểm) Dự đoán default trên tập Default bằng hồi quy logistic. Tính hệ số hồi quy và ý nghĩa thống kê của chúng. # Cài và load thư viện # install.packages(“ISLR”) library(ISLR)
data(“Default”)
model_logit <- glm(default ~ balance + income, data = Default, family = “binomial”)
summary(model_logit)
coefficients <- summary(model_logit)$coefficients cat(“Hệ số hồi quy và ý nghĩa thống kê:”) print(coefficients) Câu 1 (5 điểm) Sử dụng tập iris, dự đoán Petal.Length từ Sepal.Length và Sepal.Width. Kiểm tra độ phù hợp của mô hình bằng hệ số R bình phương hiệu chỉnh. # Dữ liệu iris data(iris)
model <- lm(Petal.Length ~ Sepal.Length + Sepal.Width, data = iris)
summary(model)
adjusted_r2 <- summary(model)$adj.r.squared cat(“Adjusted R-squared:”, round(adjusted_r2, 3), “”)
Câu 2 (5 điểm) Sử dụng tập Heart, chạy hồi quy logistic dự đoán bệnh tim. Vẽ ROC curve. # Cài và load thư viện # install.packages(“mlbench”) # install.packages(“pROC”) library(mlbench) library(pROC)
data(“Heart”)
Heart\(AHD <- as.factor(Heart\)AHD)
set.seed(123) train_index <- sample(1:nrow(Heart), 0.8 * nrow(Heart)) train_data <- Heart[train_index, ] test_data <- Heart[-train_index, ]
model_logit <- glm(AHD ~ ., data = train_data, family = “binomial”)
probs <- predict(model_logit, newdata = test_data, type = “response”)
roc_obj <- roc(test_data$AHD, probs)
plot(roc_obj, main = “ROC Curve for Logistic Regression Model”, col = “blue”)
auc_score <- auc(roc_obj) cat(“AUC (Area Under Curve):”, round(auc_score, 3), “”) Câu 1 (5 điểm) Xây dựng mô hình hồi quy tuyến tính dự đoán Ozone trên tập airquality. Tính hệ số R bình phương hiệu chỉnh # Dữ liệu airquality data(“airquality”)
data <- na.omit(airquality)
model <- lm(Ozone ~ Wind + Solar.R + Temp, data = data)
summary(model)
adjusted_r2 <- summary(model)$adj.r.squared cat(“Adjusted R-squared:”, round(adjusted_r2, 3), “”)
Câu 2 (5 điểm) Dự đoán diabetes trên tập PimaIndiansDiabetes bằng hồi quy logistic. Kiểm tra ma trận nhầm lẫn. # Cài và load thư viện # install.packages(“mlbench”) # install.packages(“caret”) library(mlbench) library(caret)
data(“PimaIndiansDiabetes”)
set.seed(123) train_index <- createDataPartition(PimaIndiansDiabetes$diabetes, p = 0.8, list = FALSE) train_data <- PimaIndiansDiabetes[train_index, ] test_data <- PimaIndiansDiabetes[-train_index, ]
model_logit <- glm(diabetes ~ ., data = train_data, family = “binomial”)
pred_probs <- predict(model_logit, test_data, type = “response”)
predicted_class <- ifelse(pred_probs > 0.5, “pos”, “neg”) predicted_class <- factor(predicted_class, levels = c(“neg”, “pos”))
conf_matrix <- confusionMatrix(predicted_class, test_data$diabetes)
print(conf_matrix)
Một nhà máy sản xuất một loại linh kiện với thời gian gia công (tính theo phút) tuân theo phân phối đều liên tục trên đoạn [5,15]. • Tìm xác suất để thời gian gia công của một linh kiện nằm trong khoảng từ 7 đến 12 phút. Dùng hàm punif () trong R để tính toán và kiểm tra lại kết quả ở ý trên # 1. Tính P(7 ≤ X ≤ 12) với X ~ Uniform(5, 15) prob <- punif(12, min = 5, max = 15) - punif(7, min = 5, max = 15)
print(paste(“Xác suất thời gian gia công từ 7 đến 12 phút là:”, prob))
manual_prob <- (12 - 7) / (15 - 5) print(paste(“Kiểm tra thủ công:”, manual_prob))
Một sinh viên ôn thi có thể làm bài trong khoảng thời gian từ 2 đến 6 giờ, giả sử thời gian ôn thi có phân phối đều. Xác suất sinh viên ôn thì ít hơn 4 giờ là bao nhiêu? Kiểm tra bằng punif() trong R. # Tính thủ công a <- 2 b <- 6 prob_manual <- (4 - a)/(b - a) print(paste(“Kết quả tính thủ công:”, prob_manual))
prob_R <- punif(4, min = 2, max = 6) print(paste(“Kết quả từ punif():”, prob_R))
print(paste(“Hai kết quả bằng nhau?”, prob_manual == prob_R))
set.seed(123) # Để kết quả có thể tái lập data <- rpois(50, lambda = 2) # Tạo dữ liệu mẫu từ Poisson(2) # Kiểm định Kolmogorov-Smirnov ks_result <- ks.test(data, “ppois”, lambda = 2)
print(ks_result) # Tạo dữ liệu mẫu set.seed(123) data <- rpois(50, lambda = 2)
ks_result <- ks.test(data, “ppois”, lambda = 2)
print(ks_result)
plot(ecdf(data), main = “ECDF so với Poisson(2)”, col = “blue”) curve(ppois(x, lambda = 2), add = TRUE, col = “red”, lwd = 2) legend(“bottomright”, legend = c(“Dữ liệu”, “Poisson(2)”), col = c(“blue”, “red”), lty = 1)
library(ggplot2) data(iris)
iris_subset <- iris[iris\(Species %in% c("setosa", "versicolor"), ] iris_subset\)Species <- factor(iris_subset$Species) # Loại bỏ level không dùng
head(iris_subset) summary(iris_subset)# Xây dựng mô hình chỉ sử dụng Petal.Length model <- glm(Species ~ Petal.Length, data = iris_subset, family = binomial)
summary(model)
coef(model) # Tạo dữ liệu để vẽ đường cong newdata <- data.frame(Petal.Length = seq(min(iris_subset\(Petal.Length), max(iris_subset\)Petal.Length), length.out = 100)) newdata$prob <- predict(model, newdata, type = “response”)
ggplot(iris_subset, aes(x = Petal.Length, y = as.numeric(Species) - 1)) + geom_point(aes(color = Species), alpha = 0.6) + geom_line(data = newdata, aes(x = Petal.Length, y = prob), color = “blue”, size = 1) + labs(title = “Đường cong Sigmoid của mô hình hồi quy logistic”, x = “Petal Length (cm)”, y = “Xác suất là Versicolor”) + scale_color_manual(values = c(“red”, “green3”)) + theme_minimal() # Dự đoán trên tập huấn luyện predicted <- ifelse(predict(model, type = “response”) > 0.5, “versicolor”, “setosa”)
table(Predicted = predicted, Actual = iris_subset$Species)
mean(predicted == iris_subset$Species)
library(ggplot2) library(car) # Cho hàm vif() data(iris)
iris_subset <- iris[iris\(Species %in% c("setosa", "versicolor"), ] iris_subset\)Species <- factor(iris_subset$Species) # Loại bỏ level không dùng
iris_subset\(Species_binary <- ifelse(iris_subset\)Species == “versicolor”, 1, 0) # Xây dựng mô hình với tất cả biến độc lập full_model <- glm(Species_binary ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris_subset, family = binomial)
summary(full_model) # Tính VIF cho các biến độc lập vif_values <- vif(full_model) print(vif_values)
barplot(vif_values, main = “VIF Values”, col = “lightblue”, ylab = “VIF”) abline(h = 5, col = “red”) # Ngưỡng thông thường # Xây dựng lại mô hình loại bỏ biến có VIF cao reduced_model <- glm(Species_binary ~ Sepal.Length + Petal.Length, data = iris_subset, family = binomial)
vif(reduced_model) # So sánh hai mô hình anova(full_model, reduced_model, test = “Chisq”)
predicted_full <- ifelse(predict(full_model, type = “response”) > 0.5, 1, 0) predicted_reduced <- ifelse(predict(reduced_model, type = “response”) > 0.5, 1, 0)
cat(“Độ chính xác mô hình đầy đủ:”, mean(predicted_full == iris_subset\(Species_binary), "\n") cat("Độ chính xác mô hình rút gọn:", mean(predicted_reduced == iris_subset\)Species_binary))