Skip to content
Comprehensive Diabetes Data Analysis Report
# Install necessary packages in a Jupyter notebook
!pip install pandas plotly scikit-learn fpdf
import plotly.express as px
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, roc_curve, auc, confusion_matrix
import os
from fpdf import FPDF
# Load the dataset
diabetes_df = pd.read_csv('./diabetes.csv')
# Create output directory for images
output_dir = 'report_images'
os.makedirs(output_dir, exist_ok=True)
# Detailed Descriptive Statistics
fig1 = make_subplots(rows=3, cols=3, subplot_titles=diabetes_df.columns[:-1])
for i, col in enumerate(diabetes_df.columns[:-1]):
row = i // 3 + 1
col_num = i % 3 + 1
fig1.add_trace(
go.Histogram(x=diabetes_df[col], name=col),
row=row, col=col_num
)
fig1.update_layout(title_text='Detailed Descriptive Statistics', height=800, showlegend=False)
fig1.write_image(f'{output_dir}/detailed_descriptive_statistics.png')
# Box plots for each feature
fig2 = make_subplots(rows=3, cols=3, subplot_titles=diabetes_df.columns[:-1])
for i, col in enumerate(diabetes_df.columns[:-1]):
row = i // 3 + 1
col_num = i % 3 + 1
fig2.add_trace(
go.Box(y=diabetes_df[col], name=col),
row=row, col=col_num
)
fig2.update_layout(title_text='Box Plots for Each Feature', height=800, showlegend=False)
fig2.write_image(f'{output_dir}/box_plots.png')
# Outcome Distribution
fig3 = px.pie(diabetes_df, names='Outcome', title='Outcome Distribution')
fig3.write_image(f'{output_dir}/outcome_distribution_pie.png')
# Fix for Outcome Distribution Bar plot
outcome_counts = diabetes_df['Outcome'].value_counts().reset_index()
outcome_counts.columns = ['Outcome', 'count']
fig4 = px.bar(outcome_counts, x='Outcome', y='count', title='Outcome Distribution Bar')
fig4.write_image(f'{output_dir}/outcome_distribution_bar.png')
# Correlation Analysis
corr_matrix = diabetes_df.corr()
fig5 = px.imshow(corr_matrix, text_auto=True, aspect='auto', title='Correlation Matrix')
fig5.write_image(f'{output_dir}/correlation_matrix.png')
# Pair plot with fixed text overlap on x axis
fig6 = px.scatter_matrix(diabetes_df, dimensions=diabetes_df.columns[:-1], color='Outcome', title='Pair Plot')
fig6.update_layout(
title='Pair Plot',
height=800,
width=800,
xaxis=dict(tickangle=45)
)
fig6.write_image(f'{output_dir}/pair_plot.png')
# Predictive Modeling
X = diabetes_df.drop('Outcome', axis=1)
y = diabetes_df['Outcome']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
report = classification_report(y_test, y_pred, output_dict=True)
# Feature importance
feature_importance = model.feature_importances_
features = X.columns
fig7 = px.bar(x=features, y=feature_importance, title='Feature Importance')
fig7.write_image(f'{output_dir}/feature_importance.png')
# ROC Curve
fpr, tpr, _ = roc_curve(y_test, model.predict_proba(X_test)[:, 1])
roc_auc = auc(fpr, tpr)
fig8 = go.Figure()
fig8.add_trace(go.Scatter(x=fpr, y=tpr, mode='lines', name=f'ROC Curve (AUC = {roc_auc:.2f})'))
fig8.add_trace(go.Scatter(x=[0, 1], y=[0, 1], mode='lines', name='Random Classifier', line=dict(dash='dash')))
fig8.update_layout(title='ROC Curve', xaxis_title='False Positive Rate', yaxis_title='True Positive Rate')
fig8.write_image(f'{output_dir}/roc_curve.png')
# Confusion Matrix
cm = confusion_matrix(y_test, y_pred)
fig9 = px.imshow(cm, text_auto=True, aspect='auto', title='Confusion Matrix')
fig9.write_image(f'{output_dir}/confusion_matrix.png')
# Additional Insights
fig10 = px.line(diabetes_df, x='Age', y='Glucose', title='Glucose Levels Over Age')
fig10.write_image(f'{output_dir}/glucose_over_age.png')
fig11 = px.scatter(diabetes_df, x='BMI', y='Glucose', color='Outcome', title='BMI vs Glucose')
fig11.write_image(f'{output_dir}/bmi_vs_glucose.png')
fig12 = px.scatter(diabetes_df, x='Age', y='BMI', color='Outcome', title='Age vs BMI')
fig12.write_image(f'{output_dir}/age_vs_bmi.png')
# Save classification report to text file
with open(f'{output_dir}/classification_report.txt', 'w') as f:
f.write(classification_report(y_test, y_pred))
# Create PDF report
pdf = FPDF()
pdf.add_page()
pdf.set_font('Arial', 'B', 16)
pdf.cell(200, 10, 'Diabetes Data Analysis Report', ln=True, align='C')
# Add detailed descriptive statistics
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Detailed Descriptive Statistics', ln=True)
pdf.image(f'{output_dir}/detailed_descriptive_statistics.png', x=10, y=30, w=180)
pdf.add_page()
# Add box plots
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Box Plots for Each Feature', ln=True)
pdf.image(f'{output_dir}/box_plots.png', x=10, y=30, w=180)
# Add outcome distribution
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Outcome Distribution', ln=True)
pdf.image(f'{output_dir}/outcome_distribution_pie.png', x=10, y=30, w=180)
pdf.add_page()
pdf.image(f'{output_dir}/outcome_distribution_bar.png', x=10, y=30, w=180)
# Add correlation matrix
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Correlation Matrix', ln=True)
pdf.image(f'{output_dir}/correlation_matrix.png', x=10, y=30, w=180)
# Add pair plot
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Pair Plot', ln=True)
pdf.image(f'{output_dir}/pair_plot.png', x=10, y=30, w=180)
# Add feature importance
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Feature Importance', ln=True)
pdf.image(f'{output_dir}/feature_importance.png', x=10, y=30, w=180)
# Add ROC curve
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'ROC Curve', ln=True)
pdf.image(f'{output_dir}/roc_curve.png', x=10, y=30, w=180)
# Add confusion matrix
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Confusion Matrix', ln=True)
pdf.image(f'{output_dir}/confusion_matrix.png', x=10, y=30, w=180)
# Add additional insights
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Additional Insights', ln=True)
pdf.image(f'{output_dir}/glucose_over_age.png', x=10, y=30, w=180)
pdf.add_page()
pdf.image(f'{output_dir}/bmi_vs_glucose.png', x=10, y=30, w=180)
pdf.add_page()
pdf.image(f'{output_dir}/age_vs_bmi.png', x=10, y=30, w=180)
# Add classification report
pdf.add_page()
pdf.set_font('Arial', 'B', 12)
pdf.cell(200, 10, 'Classification Report', ln=True)
pdf.set_font('Arial', '', 12)
with open(f'{output_dir}/classification_report.txt', 'r') as f:
for line in f:
pdf.cell(200, 10, line, ln=True)
# Save the PDF
pdf_output_path = 'Diabetes_Data_Analysis_Report.pdf'
pdf.output(pdf_output_path)
pdf_output_path