Data Science: Ví dụ về Exploratory Data Analysis (EDA) với Notebook


  1. Load data into a dataframe

Ví dụ:


# Azure storage access info for open dataset diabetes

blob_account_name = "azureopendatastorage"

blob_container_name = "mlsamples"

blob_relative_path = "diabetes"

blob_sas_token = r"" # Blank since container is Anonymous access


# Set Spark config to access blob storage

wasbs_path = f"wasbs://%s@%s.blob.core.windows.net/%s" % (blob_container_name, blob_account_name, blob_relative_path)

spark.conf.set("fs.azure.sas.%s.%s.blob.core.windows.net" % (blob_container_name, blob_account_name), blob_sas_token)

print("Remote blob path: " + wasbs_path)


# Spark read parquet, note that it won't load any data yet by now

df = spark.read.parquet(wasbs_path)

=>đổi phần cuối thành như thế này để giữ cache, tránh trường hợp mỗi lần chạy -lại các code sau đó lphair chạy lại toàn bộ project

# Spark read parquet, note that it won't load any data yet by now

df = spark.read.parquet(wasbs_path).cache()
df = spark.read.parquet(wasbs_path).persist()  #lưu DF vào RAM
df.count()

display(df)

kết quả:



2. Nhập DF vào Pandas:

df = df.toPandas()

df.head()


Việc sử dụng DataFrame của pandas giúp bạn dễ dàng xử lý và thao tác với dữ liệu trước khi đưa vào mô hình học máy. Dưới đây là một số lý do tại sao bạn cần sử dụng pandas DataFrame trong quy trình này:
Dễ dàng làm sạch dữ liệu: Pandas cung cấp các phương thức mạnh mẽ để xử lý dữ liệu thiếu, lọc, nhóm và sắp xếp dữ liệu. Việc làm sạch dữ liệu (như loại bỏ các giá trị thiếu, xử lý dữ liệu không hợp lệ) là một bước quan trọng trước khi áp dụng mô hình học máy.
Chuyển đổi dữ liệu dễ dàng: Trong quá trình chuẩn bị dữ liệu cho học máy, bạn có thể cần phải chuyển đổi dữ liệu từ các định dạng khác (CSV, Excel, SQL) thành pandas DataFrame. Pandas hỗ trợ nhiều định dạng dữ liệu và có thể dễ dàng chuyển đổi giữa chúng.
Hỗ trợ các thao tác phức tạp: Với pandas, bạn có thể thực hiện các phép toán phức tạp như tính toán thống kê, chuyển đổi dữ liệu (pivoting, melting), lọc và kết hợp nhiều bảng dữ liệu. Điều này rất hữu ích khi bạn cần phân tích hoặc trích xuất các đặc trưng (features) từ dữ liệu thô.
Tích hợp tốt với các thư viện ML: Pandas DataFrame có thể dễ dàng chuyển đổi thành các đối tượng phù hợp với các thư viện học máy như Scikit-learn, TensorFlow hoặc PyTorch. Bạn có thể dễ dàng lấy dữ liệu từ pandas DataFrame và đưa nó vào các mô hình ML mà không cần quá nhiều bước trung gian.
Hiển thị và trực quan hóa dữ liệu: Pandas giúp bạn nhanh chóng xem và phân tích dữ liệu thông qua các phương thức như head(), tail(), và describe(). Điều này cực kỳ quan trọng khi bạn cần kiểm tra dữ liệu của mình trước khi đưa vào mô hình.
Vì vậy, sử dụng pandas DataFrame giúp bạn chuẩn bị dữ liệu hiệu quả và dễ dàng hơn trong các dự án học máy. Nếu bạn đang làm việc trong môi trường Fabric, pandas sẽ là công cụ hữu ích để xử lý và chuẩn bị dữ liệu trước khi truyền vào các mô hình học máy.


3. Kiểm tra cấu trúc


codeCopy

# Display the number of rows and columns in the dataset

print("Number of rows:", df.shape[0])

print("Number of columns:", df.shape[1])


 df.shape[0] lấy số dòng trong DataFrame, vì chỉ số dòng nằm ở vị trí đầu tiên của tuple.

 df.shape[1] lấy số cột trong DataFrame, vì chỉ số cột nằm ở vị trí thứ hai của tuple.


# Display the data types of each column

print("\nData types of columns:")

print(df.dtypes)


4. Kiểm tra data thiếu

codeCopy

missing_values = df.isnull().sum()

print("\nMissing values per column:")

print(missing_values)




The code checks for missing values. Observe that there’s no missing data in the dataset.

5. Thống kê tính trạng các data số

codeCopy

df.describe()


 

6.Vẽ biểu đồ phân phối dữ liệu

codeCopy

import matplotlib.pyplot as plt

import seaborn as sns

import numpy as np

 

import matplotlib.pyplot as plt:

  • Thư viện matplotlib là một công cụ mạnh mẽ để vẽ đồ thị trong Python. pyplot là một module của matplotlib giúp vẽ các loại đồ thị như biểu đồ cột, biểu đồ phân tán, biểu đồ đường, v.v. Trong trường hợp này, plt là bí danh (alias) cho module này
import seaborn as sns:
  • Seaborn là thư viện mở rộng của matplotlib, cung cấp các công cụ trực quan hóa dữ liệu đẹp hơn và dễ sử dụng hơn. sns là bí danh để sử dụng các hàm của seaborn, đặc biệt hữu ích khi bạn muốn tạo ra các biểu đồ thống kê với ít dòng mã.

import numpy as np:

  • Numpy là thư viện hỗ trợ các phép toán số học và mảng đa chiều (arrays) trong Python. Trong trường hợp này, thư viện numpy có thể được sử dụng để tạo dữ liệu giả lập hoặc tính toán các thống kê mô tả cho dữ liệu.

# Calculate the mean, median of the BMI variable

mean = df['BMI'].mean()

median = df['BMI'].median()

   df['BMI'] truy xuất đến cột có tên BMI trong DataFrame df.

# Histogram of the BMI variable

plt.figure(figsize=(8, 6))

plt.hist(df['BMI'], bins=20, color='skyblue', edgecolor='black')

plt.title('BMI Distribution')

plt.xlabel('BMI')

plt.ylabel('Frequency')

 

plt.figure(figsize=(8, 6)):

  • Câu lệnh này thiết lập kích thước của hình vẽ (figure) với chiều rộng 8 inch và chiều cao 6 inch.

plt.hist(df['BMI'], bins=20, color='skyblue', edgecolor='black'):

  • plt.hist() vẽ một biểu đồ histogram cho cột BMI của DataFrame df.
  • bins=20 chia dữ liệu thành 20 nhóm (hoặc các "thùng" trên biểu đồ).
  • color='skyblue' thiết lập màu sắc của các thanh trên biểu đồ là màu xanh dương nhạt.
  • edgecolor='black' thiết lập màu sắc của đường viền thanh histogram là màu đen.

plt.title('BMI Distribution'):

  • Thiết lập tiêu đề cho biểu đồ là "BMI Distribution".

plt.xlabel('BMI'):

  • Thiết lập nhãn cho trục x là "BMI", biểu thị rằng trục này đại diện cho các giá trị của chỉ số BMI.

plt.ylabel('Frequency'):

  • Thiết lập nhãn cho trục y là "Frequency", biểu thị số lượng các giá trị BMI trong mỗi nhóm (bin).

 

   

# Add lines for the mean and median

plt.axvline(mean, color='red', linestyle='dashed', linewidth=2, label='Mean')

plt.axvline(median, color='green', linestyle='dashed', linewidth=2, label='Median')

# Add a legend

plt.legend()

plt.show()

 

 



7. Perform multivariate analysis

Let’s generate visualizations such as scatter plots and box plots to uncover patterns and relationships within the data.

7.1 Scatter plots-biểu đồ phân tán

codeCopy

import matplotlib.pyplot as plt

import seaborn as sns

# Scatter plot of BMI vs. Target variable

plt.figure(figsize=(8, 6))

sns.scatterplot(x='BMI', y='Y', data=df)

plt.title('BMI vs. Target variable')

plt.xlabel('BMI')

plt.ylabel('Target')

plt.show()

We can see that as the BMI increases, the target variable also increases, indicating a positive linear relationship between these two variables.

=>dù có sự liên quan giữa BMI và biến (cùng tăng) nhưng đồ thị có sự phân tán nhiều dẫn tới khó kết luận chính xác.

 


7.2 Biểu đồ hộp

codeCopy

import seaborn as sns

import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(7, 5))

# Replace numeric values with labels

df['SEX'] = df['SEX'].replace({1: 'Male', 2: 'Female'})

sns.boxplot(x='SEX', y='BP', data=df, ax=ax)

ax.set_title('Blood pressure across Gender')

plt.tight_layout()

plt.show() 

These observations suggest that there are differences in the blood pressure profiles of male and female patients. On average, female patients have a higher blood pressure than male patients.

 


Đang tải lên: Đã tải 42792/42792 byte lên.

Hộp của nữu cao hơn nam=>Nữ huyết áp trung bình cao hơn

Hộp của nữ dài hơn=>nữ có sự biến động  về huyết áp ở dữ liệu trung tâm 25%-75%

Min-max của nam rộng hơn: có nhiều cá nhân có huyết áp nằm ngoài mức trung bình hơn, tức là có những người huyết áp rất thấp hoặc rất cao.

Nam giới có vài điểm ngoại lai (outliers) ở phía trên, cho thấy có một số người có huyết áp cao bất thường.

Kết luận:

  1. Nữ có huyết áp trung bình cao hơn nam, cho thấy có thể có sự khác biệt sinh lý hoặc lối sống ảnh hưởng đến huyết áp giữa hai giới.
  2. Huyết áp của nữ biến động nhiều hơn trong khoảng trung tâm (IQR rộng hơn), nghĩa là một số người có mức huyết áp ổn định, trong khi những người khác dao động nhiều hơn.
  3. Nam giới có phạm vi huyết áp rộng hơn (MIN - MAX lớn hơn), chứng tỏ có một số cá nhân có huyết áp rất thấp hoặc rất cao, có thể do yếu tố sức khỏe hoặc lối sống.
  4. Một số nam giới có huyết áp cao bất thường (outliers), có thể cần chú ý vì đây có thể là dấu hiệu của bệnh lý hoặc nguy cơ tim mạch cao.

Hành động gợi ý:

  • Kiểm tra nguyên nhân tại sao nữ có huyết áp trung bình cao hơn, có thể liên quan đến chế độ ăn uống, căng thẳng hoặc yếu tố sinh lý.
  • Đối với nữ, nên theo dõi huyết áp định kỳ hơn, đặc biệt với những người có sự biến động lớn để phát hiện sớm các vấn đề sức khỏe.
  • Đối với nam, cần chú ý đến những người có huyết áp quá thấp hoặc quá cao, kiểm tra yếu tố nguy cơ như lối sống, bệnh nền hoặc chế độ dinh dưỡng.
  • Những người có huyết áp quá cao (đặc biệt là outliers ở nam) nên được tư vấn y tế, vì đây có thể là dấu hiệu của bệnh tim mạch hoặc cao huyết áp cần kiểm soát.
  • Xem xét các biện pháp cải thiện sức khỏe tổng thể, như điều chỉnh chế độ ăn uống, tập thể dục và kiểm tra huyết áp thường xuyên để đảm bảo huyết áp ổn định hơn.

 

7.3 Biểu đồ cột có tính toán

codeCopy

import matplotlib.pyplot as plt

import seaborn as sns

# Calculate average BP and BMI by SEX

avg_values = df.groupby('SEX')[['BP', 'BMI']].mean()   

# Bar chart of the average BP and BMI by SEX

ax = avg_values.plot(kind='bar', figsize=(15, 6), edgecolor='black')   

# Add title and labels

plt.title('Avg. Blood Pressure and BMI by Gender')

plt.xlabel('Gender')

plt.ylabel('Average')   

# Display actual numbers on the bar chart

for p in ax.patches:

    ax.annotate(format(p.get_height(), '.2f'),

                (p.get_x() + p.get_width() / 2., p.get_height()),

                ha = 'center', va = 'center',

                xytext = (0, 10),

                textcoords = 'offset points')

plt.show()



This graph shows that the average blood pressure is higher in female patients compared to male patients. Additionally, it shows that the average Body Mass Index (BMI) is slightly higher in females than in males.

 

  1. Huyết áp trung bình của nữ cao hơn nam (98.19 so với 91.52), cho thấy nữ có nguy cơ cao huyết áp cao hơn nam giới.
  2. BMI của nữ cũng cao hơn nam một chút (26.79 so với 26.01), cho thấy nữ có xu hướng có chỉ số khối cơ thể cao hơn.
  3. Do mối liên hệ giữa BMI và huyết áp, nữ giới có thể cần chú ý hơn đến chế độ ăn uống, tập thể dục để kiểm soát cân nặng và duy trì huyết áp ổn định.

Hành động gợi ý:

  • Nữ giới nên theo dõi huyết áp thường xuyên hơn và có chế độ ăn uống hợp lý để hạn chế nguy cơ cao huyết áp.
  • Duy trì lối sống lành mạnh, như tập thể dục thường xuyên, ăn uống cân bằng để giữ BMI ổn định.
  • Nam giới dù có huyết áp trung bình thấp hơn, nhưng vẫn cần chú ý đến cá nhân có nguy cơ cao (outliers) để tránh các vấn đề sức khỏe sau này.

 

 

 7.4 Biểu đồ Line có tính toán

codeCopy

import matplotlib.pyplot as plt

import seaborn as sns

plt.figure(figsize=(10, 6))

sns.lineplot(x='AGE', y='BMI', data=df, errorbar=None)

plt.title('BMI over Age')

plt.xlabel('Age')

plt.ylabel('BMI')

plt.show()

The age group of 19 to 30 years has the lowest average BMI values, while the highest average BMI is found in the age group of 65 to 79 years. Additionally, observe that the average BMI for most age groups falls within the overweight range.

 


8. Correlation analysis-phân tích tương quan

Let’s calculate correlations between different features to understand their relationships and dependencies.

codeCopy

df.corr(numeric_only=True)

#tính ma trận tương quan giữa các cột số trong DataFrame.



codeCopy

plt.figure(figsize=(15, 7))

sns.heatmap(df.corr(numeric_only=True), annot=True, vmin=-1, vmax=1, cmap="Blues")

 

 


Phân tích Heatmap

Bản đồ nhiệt này hiển thị ma trận tương quan giữa các biến số, trong đó:

  • Màu xanh đậm (gần 1.0) → Tương quan dương mạnh.
  • Màu xanh nhạt (gần 0) → Tương quan yếu hoặc không có mối quan hệ rõ ràng.
  • Màu trắng/xanh rất nhạt (gần -1.0) → Tương quan nghịch mạnh.

🔎 Nhận xét từ heatmap

  1. AGE và BMI có tương quan dương (0.19)
    → Tuổi tăng, BMI có xu hướng tăng nhưng không mạnh.
  2. AGE và BP có tương quan khá tốt (0.34)
    → Tuổi càng cao, huyết áp (BP) có xu hướng tăng.
  3. S1, S2, S3, S4, S5, S6 có tương quan chặt với nhau
    → Đây có thể là các biến liên quan đến một chỉ số chung nào đó (như sinh hóa, lipid máu, v.v.).
  4. S3 có mối quan hệ nghịch với S4 (gần -1.0)
    → Hai biến này có xu hướng đối lập nhau, cần kiểm tra ý nghĩa thực tế.
  5. Y (biến mục tiêu) có tương quan với một số biến
    • BMI, BP có tương quan khá rõ với Y (khoảng 0.19 - 0.3).
    • S5 có tương quan dương khá mạnh với Y.
    • S3 và S4 có ảnh hưởng đối lập đến Y.

🛠 Giải pháp & Định hướng

🔹 Dự đoán Y:

  • Nếu Y là một chỉ số sức khỏe/dự báo bệnh lý, có thể tập trung vào BMI, BP và S5 để xây dựng mô hình dự đoán.
  • Kiểm tra tác động của S3 và S4 để tránh nhiễu trong phân tích.

🔹 Loại bỏ đa cộng tuyến:

  • Vì nhóm S1-S6 có tương quan cao, có thể dùng PCA (Principal Component Analysis) để giảm số chiều dữ liệu.
  • Nếu một số biến quá giống nhau (hệ số tương quan ~1.0), có thể loại bớt để tránh dư thừa thông tin.

🔹 Ứng dụng vào thực tế:

  • Nếu mục tiêu là cải thiện sức khỏe, có thể tập trung vào việc kiểm soát BMI và BP, đặc biệt là khi tuổi tăng.
  • Nếu đây là dữ liệu bệnh nhân, có thể xem xét mối quan hệ giữa các biến sinh hóa và nguy cơ bệnh tật.

 





Nhận xét