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.

Load dữ liệu IRIS

data(iris)

Tính trung bình, phương sai, độ lệch chuẩn cho Sepal.Length và Sepal.Width

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)

In kết quả

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, “”)

Vẽ biểu đồ phân tán sử dụng ggplot2

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

Đọc file CSV (giả sử tên là ‘iris.csv’)

df = pd.read_csv(‘iris.csv’)

Tính tổng, trung bình và đếm số lượng mẫu cho mỗi loài (Species)

summary = df.groupby(‘Species’).agg({ ‘Sepal.Length’: [‘sum’, ‘mean’, ‘count’] })

print(“Thống kê theo loài:”) print(summary)

Lọc các mẫu có Sepal.Length > 5.0

filtered_df = df[df[‘Sepal.Length’] > 5.0]

Lưu dữ liệu đã lọc vào file mới

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)

Tính min, max, mean theo từng loài hoa (Species)

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

Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

Loại bỏ cột Species để tính toán

numeric_df = df.drop(columns=[‘Species’])

Tính trung bình và độ lệch chuẩn của các cột số

mean_std = numeric_df.agg([‘mean’, ‘std’]) print(“Giá trị trung bình và độ lệch chuẩn:”) print(mean_std)

Tính giá trị trung bình của Sepal.Length

sepal_length_mean = numeric_df[‘Sepal.Length’].mean()

Lọc các dòng có Sepal.Length > trung bình

filtered_df = df[df[‘Sepal.Length’] > sepal_length_mean]

Ghi dữ liệu đã lọc ra file mới

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)

Tính các tứ phân vị (quartiles)

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

Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

Đếm số lượng dòng theo Species

species_counts = df[‘Species’].value_counts() print(“Số lượng mẫu theo từng loài:”) print(species_counts)

Vẽ biểu đồ cột

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)

Tính trung bình, độ lệch chuẩn và giá trị lớn nhất theo Species

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

Đọc dữ liệu iris.csv

df = pd.read_csv(‘iris.csv’)

Tính trung bình của các cột số (loại bỏ Species)

mean_values = df.drop(columns=[‘Species’]).mean()

Xuất giá trị trung bình ra file mean_values.csv

mean_values.to_csv(‘mean_values.csv’, header=[‘Mean’])

Lọc các dòng có Petal.Width nhỏ hơn giá trị trung bình

petal_width_mean = mean_values[‘Petal.Width’] filtered_df = df[df[‘Petal.Width’] < petal_width_mean]

Xuất kết quả lọc ra file

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.

Load thư viện và dữ liệu

data(iris) library(dplyr)

Tính min, max, median theo từng loài hoa

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)

Tính giá trị trung bình

mean_df <- iris %>% group_by(Species) %>% summarise(Mean_Sepal_Length = mean(Sepal.Length))

Vẽ biểu đồ cột

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

1. Đọc file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Nhóm dữ liệu theo Species và tính tổng Sepal.Length

sum_by_species = df.groupby(‘Species’)[‘Sepal.Length’].sum().reset_index()

3. Lưu kết quả ra file species_sepal_length_sum.csv

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)

Tính phương sai và độ lệch chuẩn

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

Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

Lọc các dòng có Sepal.Length > 5.0 và Petal.Width < 1.5

filtered_df = df[(df[‘Sepal.Length’] > 5.0) & (df[‘Petal.Width’] < 1.5)]

Xuất kết quả ra file filtered_data.csv

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)

Tính trung bình, min, max

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

1. Đọc dữ liệu iris.csv

df = pd.read_csv(‘iris.csv’)

2. Đếm số lượng dòng của từng loại Species

species_counts = df[‘Species’].value_counts() print(“Số lượng mẫu cho mỗi loài:”) print(species_counts)

3. Vẽ biểu đồ cột

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)

Tính các tứ phân vị

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

Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

Tính trung bình, max, min của Sepal.Width theo từng Species

summary = df.groupby(‘Species’)[‘Sepal.Width’].agg([‘mean’, ‘max’, ‘min’]).reset_index()

Đổi tên cột cho dễ hiểu (tùy chọn)

summary.columns = [‘Species’, ‘Mean_Sepal_Width’, ‘Max_Sepal_Width’, ‘Min_Sepal_Width’]

Xuất kết quả ra file species_summary.csv

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)

Loại bỏ cột Species

numeric_data <- iris[, 1:4]

Tính giá trị trung bình

means <- colMeans(numeric_data) print(“Giá trị trung bình:”) print(means)

Tính phương sai

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

Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

Lọc các dòng có Petal.Length > 4.0

filtered_df = df[df[‘Petal.Length’] > 4.0]

Tính tổng của Sepal.Length từ dữ liệu đã lọc

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)

Tính giá trị lớn nhất và nhỏ nhất của Petal.Width theo từng loài hoa (Species)

iris %>% group_by(Species) %>% summarise( Min_Petal_Width = min(Petal.Width), Max_Petal_Width = max(Petal.Width) ) library(ggplot2) library(dplyr)

Tính trung bình Sepal.Width theo từng Species

mean_sepal_width <- iris %>% group_by(Species) %>% summarise(Mean_Sepal_Width = mean(Sepal.Width))

Vẽ biểu đồ line

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

Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘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)

mean_by_species = df.drop(columns=‘Species’).groupby(df[‘Species’]).mean().reset_index()

Lưu kết quả vào file mean_by_species.csv

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)

Tính độ lệch chuẩn của Sepal.Length theo từng nhóm Species

iris %>% group_by(Species) %>% summarise(SD_Sepal_Length = sd(Sepal.Length)) library(ggplot2)

Vẽ biểu đồ violin của Petal.Width theo Species

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

1. Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Lọc các dòng có Sepal.Width nhỏ hơn 3.0

filtered_df = df[df[‘Sepal.Width’] < 3.0]

3. Xuất kết quả ra file filtered_width.csv

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

1. Đọc dữ liệu từ file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Lọc các dòng có Sepal.Width nhỏ hơn 3.0

filtered_df = df[df[‘Sepal.Width’] < 3.0]

3. Xuất kết quả ra file filtered_width.csv

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”)

Nạp thư viện

library(ggplot2)

Dùng sẵn dataset iris trong R

data(iris)

1. Tính trung bình, phương sai và độ lệch chuẩn của Sepal.Width

mean_sepal_width <- mean(iris\(Sepal.Width) var_sepal_width <- var(iris\)Sepal.Width) sd_sepal_width <- sd(iris$Sepal.Width)

In kết quả

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, “”)

2. Vẽ biểu đồ scatter Petal.Length vs Petal.Width, phân loại theo Species

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

1. Đọc file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Tính tổng Sepal.Length và Sepal.Width theo từng loại Species

total_by_species = df.groupby(‘Species’)[[‘Sepal.Length’, ‘Sepal.Width’]].sum()

3. Xuất kết quả ra file CSV

total_by_species.to_csv(‘total_by_species.csv’)

In kết quả (tùy chọn)

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)

Dữ liệu iris có sẵn trong R

data(iris)

1. Tính min, max và trung bình của Petal.Length

min_petal_length <- min(iris\(Petal.Length) max_petal_length <- max(iris\)Petal.Length) mean_petal_length <- mean(iris$Petal.Length)

In kết quả

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, “”)

2. Vẽ biểu đồ cột thể hiện trung bình Petal.Width theo Species

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

1. Đọc file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Lọc các dòng có Sepal.Length > 6.0

filtered_df = df[df[‘Sepal.Length’] > 6.0]

3. Tính giá trị trung bình của Petal.Width trong dữ liệu đã lọc

mean_petal_width = filtered_df[‘Petal.Width’].mean()

In kết quả

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)

Dữ liệu iris có sẵn

data(iris)

1. Tính giá trị lớn nhất, nhỏ nhất và độ lệch chuẩn của Sepal.Width cho từng Species

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)

2. Vẽ biểu đồ boxplot của Sepal.Length theo từng nhóm Species

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

1. Đọc file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Đếm số dòng có Petal.Length > 4.0

count_filtered = (df[‘Petal.Length’] > 4.0).sum()

3. Tạo DataFrame kết quả và xuất ra file CSV

result_df = pd.DataFrame({‘Count_Petal_Length_gt_4.0’: [count_filtered]}) result_df.to_csv(‘count_filtered_petal_length.csv’, index=False)

In kết quả

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)

Dữ liệu iris có sẵn

data(iris)

1. Tính giá trị trung bình của Sepal.Length và Petal.Length theo từng nhóm Species

mean_values <- iris %>% group_by(Species) %>% summarise( Mean_Sepal_Length = mean(Sepal.Length), Mean_Petal_Length = mean(Petal.Length) )

print(mean_values)

2. Vẽ biểu đồ scatter giữa Sepal.Width và Petal.Width, phân loại theo Species

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

1. Đọc file iris.csv

df = pd.read_csv(‘iris.csv’)

2. Tính tổng giá trị của tất cả các cột (trừ ‘Species’) theo từng loại Species

Chọn các cột số (loại trừ ‘Species’) và group theo Species

total_values = df.groupby(‘Species’).sum(numeric_only=True)

3. Lưu kết quả vào file CSV

total_values.to_csv(‘total_values_by_species.csv’)

In kết quả (tùy chọn)

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

1. Tạo dữ liệu ngẫu nhiên từ phân phối nhị thức

data <- rbinom(100, size = n, prob = p)

2. Vẽ biểu đồ histogram

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”)

3. Kiểm định Kolmogorov-Smirnov

Ta so sánh dữ liệu với phân phối nhị thức lý thuyết

Gọi hàm phân phối tích lũy nhị thức

ks_result <- ks.test(data, “pbinom”, size = n, prob = p)

In kết quả kiểm định

print(ks_result) import pandas as pd import seaborn as sns import matplotlib.pyplot as plt

1. Đọc dữ liệu

df = pd.read_csv(‘iris.csv’)

2. Tính trung bình, trung vị, độ lệch chuẩn

stats = df.describe().loc[[‘mean’, ‘50%’, ‘std’]] stats.rename(index={‘50%’: ‘median’}, inplace=True) print(“Thống kê mô tả:”) print(stats)

3. Vẽ boxplot cho từng đặc trưng theo từng loại hoa

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

1. Tạo mẫu từ phân phối Poisson

data <- rpois(200, lambda = lambda)

2. Tính trung bình và phương sai

mean_val <- mean(data) var_val <- var(data)

cat(“Trung bình mẫu:”, mean_val, “”) cat(“Phương sai mẫu:”, var_val, “”)

3. QQ-Plot để kiểm tra sự phù hợp với phân phối Poisson

Dùng so sánh với phân phối Poisson chuẩn hóa

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

1. Đọc tập dữ liệu

df = pd.read_csv(‘iris.csv’)

2. Tính khoảng 25% - 75% (Interquartile Range)

iqr = df.describe().loc[[‘25%’, ‘75%’]] print(“Khoảng giá trị từ 25% đến 75% (IQR):”) print(iqr)

3. Vẽ biểu đồ histogram cho Petal.Length

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)

1. Sinh 500 giá trị từ phân phối chuẩn N(50, 225)

data <- rnorm(500, mean = 50, sd = sqrt(225))

2. Kiểm định chuẩn bằng Shapiro-Wilk

shapiro_result <- shapiro.test(data)

3. In kết quả

cat(“Kết quả kiểm định Shapiro-Wilk:”) print(shapiro_result) import pandas as pd import matplotlib.pyplot as plt

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính phương sai của từng đặc trưng (loại bỏ cột Species)

variances = df[[‘Sepal.Length’, ‘Sepal.Width’, ‘Petal.Length’, ‘Petal.Width’]].var() print(“Phương sai của từng đặc trưng:”) print(variances)

3. Vẽ biểu đồ scatter giữa Sepal.Length và Sepal.Width

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)

1. Sinh 300 giá trị từ phân phối đều liên tục Uniform(2, 10)

data <- runif(300, min = 2, max = 10)

2. Tính giá trị kỳ vọng (trung bình mẫu) và phương sai mẫu

mean_val <- mean(data) var_val <- var(data)

3. In kết quả

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

1. Đọc dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tìm giá trị lớn nhất và nhỏ nhất cho mỗi đặc trưng

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)

3. Vẽ biểu đồ barplot số lượng mẫu cho mỗi loại hoa

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)

1. Sinh dữ liệu từ phân phối mũ với lambda = 0.5

lambda <- 0.5 data <- rexp(400, rate = lambda)

2. Tính trung bình và phương sai

mean_val <- mean(data) var_val <- var(data)

cat(“Trung bình mẫu:”, mean_val, “”) cat(“Phương sai mẫu:”, var_val, “”)

3. Vẽ histogram và đường mật độ

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ị”)

Thêm đường mật độ lý thuyết

curve(dexp(x, rate = lambda), col = “red”, lwd = 2, add = TRUE) import pandas as pd import seaborn as sns import matplotlib.pyplot as plt

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính hệ số tương quan giữa Sepal.Length và Petal.Length

correlation = df[‘Sepal.Length’].corr(df[‘Petal.Length’]) print(“Hệ số tương quan giữa Sepal.Length và Petal.Length:”, correlation)

3. Vẽ scatter plot giữa Petal.Length và Petal.Width theo từng loại hoa

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)

1. Sinh 600 giá trị từ phân phối nhị thức

n <- 20 p <- 0.5 data <- rbinom(600, size = n, prob = p)

2. Tính tham số phân phối chuẩn tương ứng

mean_val <- mean(data) sd_val <- sd(data)

3. Vẽ histogram

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ị”)

4. Thêm đường phân phối chuẩn lên biểu đồ

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

1. Đọc tập dữ liệu

df = pd.read_csv(‘iris.csv’)

2. Tính trung bình và độ lệch chuẩn theo từng loại hoa (Species)

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)

3. Vẽ boxplot của Sepal.Width theo từng Species

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)

1. Sinh 600 giá trị từ phân phối nhị thức

n <- 20 p <- 0.5 data <- rbinom(600, size = n, prob = p)

2. Tính tham số phân phối chuẩn tương ứng

mean_val <- mean(data) sd_val <- sd(data)

3. Vẽ histogram

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ị”)

4. Thêm đường phân phối chuẩn lên biểu đồ

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

1. Đọc tập dữ liệu

df = pd.read_csv(‘iris.csv’)

2. Tính trung bình và độ lệch chuẩn theo từng loại hoa (Species)

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)

3. Vẽ boxplot của Sepal.Width theo từng Species

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)

1. Sinh 350 giá trị từ phân phối chuẩn N(30, 100)

mean_val <- 30 sd_val <- 100 data <- rnorm(350, mean = mean_val, sd = sd_val)

2. Kiểm định Shapiro-Wilk để kiểm tra tính chuẩn

shapiro_test <- shapiro.test(data)

3. In kết quả kiểm định

cat(“Kết quả kiểm định Shapiro-Wilk:”) print(shapiro_test)

Nếu p-value nhỏ hơn mức ý nghĩa (thường là 0.05), bác bỏ giả thuyết dữ liệu có 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 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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính giá trị tối thiểu và tối đa của từng đặc trưng

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)

3. Vẽ biểu đồ histogram của Sepal.Length

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)

1. Sinh 500 giá trị từ phân phối đều liên tục trên khoảng [0, 5]

data <- runif(500, min = 0, max = 5)

2. Tính kỳ vọng và phương sai

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, “”)

3. Vẽ histogram của dữ liệu

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính trung bình và phương sai của Sepal.Length theo từng loại hoa (Species)

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)

3. Vẽ biểu đồ Boxplot cho Sepal.Length theo từng loại hoa

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)

1. Sinh 400 giá trị từ phân phối mũ với lambda = 0.3

lambda <- 0.3 data <- rexp(400, rate = lambda)

2. Kiểm tra phân phối của dữ liệu bằng biểu đồ QQ-plot

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính độ lệch chuẩn của từng đặc trưng

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)

3. Vẽ biểu đồ scatter giữa Petal.Length và Sepal.Width

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)

1. Sinh 400 giá trị từ phân phối mũ với lambda = 0.3

lambda <- 0.3 data <- rexp(400, rate = lambda)

2. Kiểm tra phân phối của dữ liệu bằng biểu đồ QQ-plot

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính độ lệch chuẩn của từng đặc trưng

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)

3. Vẽ biểu đồ scatter giữa Petal.Length và Sepal.Width

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)

1. Tạo mẫu 200 giá trị từ phân phối Poisson với lambda = 5

lambda <- 5 data <- rpois(200, lambda)

2. Tính trung bình và phương sai của mẫu dữ liệu

sample_mean <- mean(data) sample_var <- var(data)

3. Kiểm tra tính phù hợp với phân phối Poisson:

Đối với phân phối Poisson, trung bình và phương sai phải bằng nhau (λ = mean = variance)

cat(“Trung bình của mẫu:”, sample_mean, “”) cat(“Phương sai của mẫu:”, sample_var, “”)

So sánh với phân phối Poisson lý thuyết:

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính khoảng giá trị từ 25% đến 75% của từng đặc trưng

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)

3. Vẽ biểu đồ histogram của Petal.Width

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)

1. Sinh ngẫu nhiên 600 giá trị từ phân phối chuẩn N(40, 12^2)

mu <- 40 # Trung bình sigma <- 12 # Độ lệch chuẩn data <- rnorm(600, mean = mu, sd = sigma)

2. Kiểm tra tính chuẩn của dữ liệu bằng kiểm định Shapiro-Wilk

shapiro_test <- shapiro.test(data)

In kết quả của kiểm định Shapiro-Wilk

cat(“Giá trị p từ kiểm định Shapiro-Wilk:”, shapiro_test$p.value, “”)

Nếu p-value nhỏ hơn mức ý nghĩa (ví dụ 0.05), chúng ta bác bỏ giả thuyết dữ liệu theo phân phối chuẩn

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính giá trị trung bình và phương sai của Sepal.Width theo từng loại hoa (Species)

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)

3. Vẽ biểu đồ Boxplot của Sepal.Width theo từng loại hoa

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)

1. Sinh ngẫu nhiên 500 giá trị từ phân phối đều trên khoảng [1, 7]

n <- 500 data_uniform <- runif(n, min = 1, max = 7)

2. Tính kỳ vọng và phương sai của mẫu

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, “”)

3. Vẽ biểu đồ histogram

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính hệ số tương quan giữa Sepal.Length và Sepal.Width

correlation = df[‘Sepal.Length’].corr(df[‘Sepal.Width’]) print(f”Hệ số tương quan giữa Sepal.Length và Sepal.Width: {correlation}“)

3. Vẽ biểu đồ scatter giữa Sepal.Length và Sepal.Width

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)

1. Sinh ngẫu nhiên 400 giá trị từ phân phối mũ với lambda = 0.4

lambda <- 0.4 data_exponential <- rexp(400, rate = lambda)

2. Kiểm tra phân phối của dữ liệu bằng QQ-plot

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

1. Đọc tập dữ liệu Iris

df = pd.read_csv(‘iris.csv’)

2. Tính khoảng giá trị từ 25% đến 75% của từng đặc trưng

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)

3. Vẽ biểu đồ Boxplot của Petal.Length

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(mpg ~ hp + wt, data = mtcars)

Tóm tắt mô hình để xem hệ số R bình phương

summary_model <- summary(model) r_squared <- summary_model$r.squared

Dự đoán giá trị mpg từ mô hình

predictions <- predict(model, mtcars)

Tính RMSE

actual <- mtcars$mpg rmse <- sqrt(mean((actual - predictions)^2))

In kết quả

cat(“R-squared:”, r_squared, “”) cat(“RMSE:”, rmse, “”) # Dữ liệu iris data(iris)

Lọc dữ liệu chỉ giữ lại setosa và versicolor

iris_binary <- subset(iris, Species %in% c(“setosa”, “versicolor”))

Đổi nhãn thành nhị phân: setosa = 0, versicolor = 1

iris_binary\(Species <- factor(iris_binary\)Species) iris_binary\(Species <- as.numeric(iris_binary\)Species == “versicolor”)

Xây dựng mô hình logistic

model_logit <- glm(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris_binary, family = binomial)

Dự đoán xác suất

predicted_probs <- predict(model_logit, type = “response”)

Chuyển sang phân loại 0 hoặc 1 với ngưỡng 0.5

predicted_classes <- ifelse(predicted_probs > 0.5, 1, 0)

Ma trận nhầm lẫn

conf_matrix <- table(Predicted = predicted_classes, Actual = iris_binary$Species)

Độ chính xác

accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)

In kết quả

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)

Xem dữ liệu Boston

data(“Boston”)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(medv ~ lstat + rm, data = Boston)

Dự đoán giá trị medv

predictions <- predict(model, Boston)

Thực tế

actual <- Boston$medv

Tính MAE và MSE

mae <- mean(abs(actual - predictions)) mse <- mean((actual - predictions)^2)

In kết quả

cat(“MAE:”, mae, “”) cat(“MSE:”, mse, “”) # Tải dữ liệu và thư viện library(ISLR) library(pROC)

Xem dữ liệu Default

data(“Default”)

Xây dựng mô hình hồi quy logistic

model_logit <- glm(default ~ balance + income, data = Default, family = “binomial”)

Dự đoán xác suất

predicted_probs <- predict(model_logit, type = “response”)

Vẽ ROC và tính AUC

roc_obj <- roc(Default$default, predicted_probs)

Vẽ đường cong ROC

plot(roc_obj, col = “blue”, main = “ROC Curve - Default Model”)

In giá trị AUC

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Petal.Length ~ Sepal.Length + Sepal.Width, data = iris)

Residual plot

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)

Xây dựng mô hình hồi quy logistic

model_logit <- glm(diabetes ~ ., data = PimaIndiansDiabetes, family = “binomial”)

Dự đoán xác suất

probs <- predict(model_logit, type = “response”)

Chuyển sang phân loại với ngưỡng 0.5

predicted <- ifelse(probs > 0.5, “pos”, “neg”) predicted <- factor(predicted, levels = c(“neg”, “pos”))

Thực tế

actual <- PimaIndiansDiabetes$diabetes

Ma trận nhầm lẫn

conf <- confusionMatrix(predicted, actual, positive = “pos”)

In các chỉ số

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ả

Tạo dữ liệu ngẫu nhiên

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

Đưa vào data frame

data_sim <- data.frame(Y, X1, X2)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Y ~ X1 + X2, data = data_sim)

Dự đoán

predictions <- predict(model, data_sim)

Tính RMSE

rmse <- sqrt(mean((data_sim$Y - predictions)^2))

Hệ số R²

r_squared <- summary(model)$r.squared

In kết quả

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)

Dữ liệu Titanic (dùng bản đã xử lý sẵn: titanic::titanic_train)

data <- titanic_train

Xử lý dữ liệu: loại NA và chọn biến đơn giản

data <- na.omit(data[, c(“Survived”, “Pclass”, “Sex”, “Age”)])

Biến định tính cần chuyển thành số

data\(Sex <- ifelse(data\)Sex == “male”, 1, 0) # male = 1, female = 0

Mô hình logistic

model_logit <- glm(Survived ~ Pclass + Sex + Age, data = data, family = binomial)

Dự đoán xác suất

probs <- predict(model_logit, type = “response”)

Chuyển thành nhãn 0/1

predicted <- ifelse(probs > 0.5, 1, 0)

Chuyển thành factor để tính ma trận nhầm lẫn

predicted <- factor(predicted, levels = c(0,1)) actual <- factor(data$Survived, levels = c(0,1))

Ma trận nhầm lẫn và độ chính xác

conf <- confusionMatrix(predicted, actual, positive = “1”)

In kết quả

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”)

Loại bỏ NA

data <- na.omit(airquality[, c(“Ozone”, “Wind”, “Temp”)])

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Ozone ~ Wind + Temp, data = data)

Cài đặt thư viện car để tính VIF nếu chưa có

install.packages(“car”)

library(car)

Kiểm tra đa cộng tuyến

vif_values <- vif(model)

In kết quả

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)

Load dữ liệu

data(Heart)

Loại bỏ NA nếu có

heart_data <- na.omit(Heart)

Mô hình hồi quy logistic

model_logit <- glm(AHD ~ ., data = heart_data, family = binomial)

Dự đoán xác suất

probs <- predict(model_logit, type = “response”)

Biến thực tế

actual <- heart_data$AHD

Tính ROC và AUC

roc_obj <- roc(actual, probs)

Vẽ đường cong ROC

plot(roc_obj, col = “blue”, main = “ROC Curve - Heart Dataset”)

In AUC

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Sepal.Length ~ Sepal.Width + Petal.Length, data = iris)

Xem tóm tắt mô hình

summary(model)

Lấy phần dư (residuals)

res <- residuals(model)

Kiểm tra phân phối chuẩn của residuals bằng biểu đồ

par(mfrow = c(1, 2)) # Hiển thị 2 biểu đồ cạnh nhau

Histogram

hist(res, breaks = 20, col = “skyblue”, main = “Histogram of Residuals”, xlab = “Residuals”)

Q-Q plot

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)

Tải và xử lý dữ liệu

data <- titanic_train data <- na.omit(data[, c(“Survived”, “Pclass”, “Sex”, “Age”)]) data\(Sex <- ifelse(data\)Sex == “male”, 1, 0)

Mô hình hồi quy logistic

model_logit <- glm(Survived ~ Pclass + Sex + Age, data = data, family = binomial)

Dự đoán xác suất

probs <- predict(model_logit, type = “response”)

Phân loại: dùng ngưỡng 0.5

predicted <- ifelse(probs > 0.5, 1, 0) predicted <- factor(predicted, levels = c(0, 1)) actual <- factor(data$Survived, levels = c(0, 1))

Ma trận nhầm lẫn và các chỉ số

conf <- confusionMatrix(predicted, actual, positive = “1”)

In F1-score

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(mpg ~ disp + qsec, data = mtcars)

Tóm tắt mô hình

summary_model <- summary(model)

Lấy hệ số R bình phương hiệu chỉnh

adj_r_squared <- summary_model$adj.r.squared

In kết quả

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)

Dữ liệu iris

data(iris)

Lọc dữ liệu: chỉ giữ versicolor và virginica

iris_bin <- subset(iris, Species %in% c(“versicolor”, “virginica”))

Đổi nhãn thành nhị phân: versicolor = 0, virginica = 1

iris_bin\(Species <- factor(iris_bin\)Species) iris_bin\(Species <- as.numeric(iris_bin\)Species == “virginica”)

Xây dựng mô hình logistic (dùng tất cả biến độc lập)

model_logit <- glm(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = iris_bin, family = binomial)

Dự đoán xác suất

probs <- predict(model_logit, type = “response”)

Vẽ ROC và tính AUC

roc_obj <- roc(iris_bin$Species, probs)

Vẽ đường cong ROC

plot(roc_obj, col = “darkblue”, main = “ROC Curve - Iris Logistic Model”)

Tính AUC

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)

Xem dữ liệu Boston

data(“Boston”)

Mô hình hồi quy tuyến tính

model <- lm(medv ~ crim + indus, data = Boston)

Tóm tắt mô hình

summary_model <- summary(model)

In kết quả

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)

Load dữ liệu

data(“PimaIndiansDiabetes”)

Mô hình hồi quy logistic

model <- glm(diabetes ~ ., data = PimaIndiansDiabetes, family = “binomial”)

Dự đoán xác suất

probs <- predict(model, type = “response”) actual <- PimaIndiansDiabetes$diabetes

Hàm tính precision và recall theo ngưỡng tùy chọn

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), “”) }

So sánh precision & recall ở nhiều ngưỡng

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Petal.Width ~ Petal.Length, data = iris)

Dự đoán

predicted <- predict(model, iris)

Tính MAE

actual <- iris$Petal.Width mae <- mean(abs(actual - predicted))

In kết quả

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)

Load dữ liệu

data(“Heart”)

Loại bỏ dòng chứa NA

heart_data <- na.omit(Heart)

Xây dựng mô hình hồi quy logistic

model <- glm(AHD ~ ., data = heart_data, family = binomial)

Dự đoán xác suất

probs <- predict(model, type = “response”)

Phân loại với ngưỡng 0.5

predicted <- ifelse(probs > 0.5, “Yes”, “No”) predicted <- factor(predicted, levels = c(“No”, “Yes”)) actual <- heart_data$AHD

Ma trận nhầm lẫn và các chỉ số

conf <- confusionMatrix(predicted, actual, positive = “Yes”)

In các độ đo

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”)

Loại bỏ NA

data <- na.omit(airquality[, c(“Temp”, “Wind”, “Solar.R”)])

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Temp ~ Wind + Solar.R, data = data)

Trích residuals

residuals_model <- residuals(model)

Kiểm tra phân phối chuẩn bằng Shapiro-Wilk test

shapiro_test <- shapiro.test(residuals_model)

In kết quả

cat(“Shapiro-Wilk test p-value:”, shapiro_test$p.value, “”)

Diễn giải

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)

Load dữ liệu

data <- titanic_train

Tiền xử lý: giữ biến cần thiết và loại NA

data <- na.omit(data[, c(“Survived”, “Pclass”, “Sex”, “Age”)]) data\(Sex <- ifelse(data\)Sex == “male”, 1, 0)

Chia tập train và test (70-30)

set.seed(123) train_index <- createDataPartition(data$Survived, p = 0.7, list = FALSE) train_data <- data[train_index, ] test_data <- data[-train_index, ]

Xây dựng mô hình logistic trên tập train

model_logit <- glm(Survived ~ Pclass + Sex + Age, data = train_data, family = binomial)

Dự đoán trên tập test

probs <- predict(model_logit, newdata = test_data, type = “response”) predicted <- ifelse(probs > 0.5, 1, 0)

So sánh với nhãn thực tế

actual <- test_data$Survived accuracy <- mean(predicted == actual)

In kết quả

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(hp ~ wt + qsec, data = mtcars)

Dự đoán giá trị

predicted_hp <- predict(model, mtcars)

Tính RMSE

actual_hp <- mtcars$hp rmse <- sqrt(mean((actual_hp - predicted_hp)^2))

In kết quả

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)

Chia tập dữ liệu thành tập train và test (80-20)

set.seed(123) train_index <- sample(1:nrow(iris), 0.8 * nrow(iris)) train_data <- iris[train_index, ] test_data <- iris[-train_index, ]

Xây dựng mô hình hồi quy logistic (phân loại Species)

model_logit <- glm(Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width, data = train_data, family = “binomial”)

Dự đoán xác suất

probs <- predict(model_logit, newdata = test_data, type = “response”)

Chuyển sang nhãn phân loại (ngưỡng 0.5)

predicted <- ifelse(probs > 0.5, “versicolor”, “setosa”) # Chỉ xét 2 lớp: setosa và versicolor predicted <- factor(predicted, levels = c(“setosa”, “versicolor”))

So sánh với nhãn thực tế

actual <- test_data$Species accuracy <- mean(predicted == actual)

In kết quả

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”)

Loại bỏ các giá trị NA

data <- na.omit(airquality[, c(“Ozone”, “Wind”, “Solar.R”, “Temp”)])

Xây dựng mô hình hồi quy tuyến tính để dự đoán Ozone

model <- lm(Ozone ~ Wind + Solar.R + Temp, data = data)

Dự đoán Ozone

predicted_ozone <- predict(model, data)

Tính MAE (Mean Absolute Error)

actual_ozone <- data$Ozone mae <- mean(abs(actual_ozone - predicted_ozone))

In kết quả

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.

Cài và load thư viện

install.packages(“mlbench”)

install.packages(“pROC”)

library(mlbench) library(pROC)

Load dữ liệu PimaIndiansDiabetes

data(“PimaIndiansDiabetes”)

Xây dựng mô hình hồi quy logistic

model_logit <- glm(diabetes ~ ., data = PimaIndiansDiabetes, family = “binomial”)

Dự đoán xác suất

probs <- predict(model_logit, type = “response”)

Tạo đối tượng ROC

roc_obj <- roc(PimaIndiansDiabetes$diabetes, probs)

Vẽ ROC curve

plot(roc_obj, main = “ROC Curve for Logistic Regression Model”, col = “blue”)

Tính AUC (Area Under the Curve)

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)

Load dữ liệu Boston

data(“Boston”)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(medv ~ rm, data = Boston)

Tóm tắt mô hình

summary(model)

Dự đoán giá trị

predicted <- predict(model, Boston)

Trích residuals

residuals_model <- residuals(model)

Kiểm tra phân phối chuẩn của residuals bằng Shapiro-Wilk test

shapiro_test <- shapiro.test(residuals_model)

In kết quả kiểm tra

cat(“Shapiro-Wilk test p-value:”, shapiro_test$p.value, “”)

Diễn giải

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)

Load dữ liệu Default

data(“Default”)

Xây dựng mô hình hồi quy logistic

model_logit <- glm(default ~ balance + income, data = Default, family = “binomial”)

Tóm tắt mô hình

summary(model_logit)

Trích hệ số hồi quy và ý nghĩa thống kê

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)

Xây dựng mô hình hồi quy tuyến tính

model <- lm(Petal.Length ~ Sepal.Length + Sepal.Width, data = iris)

Tóm tắt mô hình

summary(model)

Kiểm tra Adjusted R-squared

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)

Load dữ liệu Heart

data(“Heart”)

Chuyển đối tượng AHD thành yếu tố (factor) để phù hợp với mô hình phân loại

Heart\(AHD <- as.factor(Heart\)AHD)

Chia dữ liệu thành tập train và test (80-20)

set.seed(123) train_index <- sample(1:nrow(Heart), 0.8 * nrow(Heart)) train_data <- Heart[train_index, ] test_data <- Heart[-train_index, ]

Xây dựng mô hình hồi quy logistic

model_logit <- glm(AHD ~ ., data = train_data, family = “binomial”)

Dự đoán xác suất trên tập test

probs <- predict(model_logit, newdata = test_data, type = “response”)

Tạo đối tượng ROC

roc_obj <- roc(test_data$AHD, probs)

Vẽ ROC curve

plot(roc_obj, main = “ROC Curve for Logistic Regression Model”, col = “blue”)

Tính AUC (Area Under the Curve)

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”)

Loại bỏ các giá trị NA để xử lý dữ liệu

data <- na.omit(airquality)

Xây dựng mô hình hồi quy tuyến tính để dự đoán Ozone

model <- lm(Ozone ~ Wind + Solar.R + Temp, data = data)

Tóm tắt mô hình

summary(model)

Kiểm tra Adjusted R-squared

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)

Load dữ liệu PimaIndiansDiabetes

data(“PimaIndiansDiabetes”)

Chia dữ liệu thành tập train và test (80-20)

set.seed(123) train_index <- createDataPartition(PimaIndiansDiabetes$diabetes, p = 0.8, list = FALSE) train_data <- PimaIndiansDiabetes[train_index, ] test_data <- PimaIndiansDiabetes[-train_index, ]

Xây dựng mô hình hồi quy logistic

model_logit <- glm(diabetes ~ ., data = train_data, family = “binomial”)

Dự đoán trên tập kiểm tra

pred_probs <- predict(model_logit, test_data, type = “response”)

Chuyển đổi xác suất thành nhãn dự đoán (ngưỡng 0.5)

predicted_class <- ifelse(pred_probs > 0.5, “pos”, “neg”) predicted_class <- factor(predicted_class, levels = c(“neg”, “pos”))

Kiểm tra ma trận nhầm lẫn

conf_matrix <- confusionMatrix(predicted_class, test_data$diabetes)

In kết quả ma trận nhầm lẫn

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)

2. In kết quả

print(paste(“Xác suất thời gian gia công từ 7 đến 12 phút là:”, prob))

3. Kiểm tra bằng phép tính thủ công

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))

Dùng hàm punif()

prob_R <- punif(4, min = 2, max = 6) print(paste(“Kết quả từ punif():”, prob_R))

So sánh 2 kết quả

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)

In kết quả

print(ks_result) # Tạo dữ liệu mẫu set.seed(123) data <- rpois(50, lambda = 2)

Kiểm định KS

ks_result <- ks.test(data, “ppois”, lambda = 2)

Xem kết quả

print(ks_result)

Vẽ đồ thị so sánh

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)

Lọc dữ liệu chỉ lấy Setosa và Versicolor

iris_subset <- iris[iris\(Species %in% c("setosa", "versicolor"), ] iris_subset\)Species <- factor(iris_subset$Species) # Loại bỏ level không dùng

Xem tổng quan dữ liệu

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)

Tóm tắt mô hình

summary(model)

Hệ số của mô hình

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”)

Vẽ biểu đồ

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”)

Ma trận nhầm lẫn

table(Predicted = predicted, Actual = iris_subset$Species)

Độ chính xác

mean(predicted == iris_subset$Species)

library(ggplot2) library(car) # Cho hàm vif() data(iris)

Lọc dữ liệu chỉ lấy Setosa và Versicolor

iris_subset <- iris[iris\(Species %in% c("setosa", "versicolor"), ] iris_subset\)Species <- factor(iris_subset$Species) # Loại bỏ level không dùng

Chuyển đổi Species thành biến nhị phân (0 = setosa, 1 = versicolor)

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)

Tóm tắt mô hình

summary(full_model) # Tính VIF cho các biến độc lập vif_values <- vif(full_model) print(vif_values)

Vẽ biểu đồ VIF

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)

Kiểm tra lại VIF

vif(reduced_model) # So sánh hai mô hình anova(full_model, reduced_model, test = “Chisq”)

Kiểm tra độ chính xác

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))