StudentOfDS/ExploratoryDataAnalysis-EDA-UsingStreamlit
0
1# Importing necessary libraries2import streamlit as st3import pandas as pd4import plotly.express as px5import seaborn as sns6import matplotlib.pyplot as plt7import numpy as np8 9# Function to load dataset10def load_dataset(file_path, file_format):11 """12 Load dataset from file path.13 14 Parameters:15 file_path (str): Path to the dataset file.16 file_format (str): Format of the dataset file ('csv' or 'excel').17 18 Returns:19 DataFrame: Loaded dataset.20 """21 if file_format == 'csv':22 df = pd.read_csv(file_path)23 elif file_format == 'excel':24 df = pd.read_excel(file_path)25 return df26 27# Function to display dataset information28def display_dataset_info(df):29 """30 Display basic information about the dataset.31 32 Parameters:33 df (DataFrame): DataFrame containing the dataset.34 """35 st.subheader("Dataset Information")36 st.write("Number of Rows:", df.shape[0])37 st.write("Number of Columns:", df.shape[1])38 st.dataframe(df.head())39 40# Function to handle missing values41def handle_missing_values(df):42 """43 Handle missing values in the dataset.44 45 Parameters:46 df (DataFrame): DataFrame containing the dataset.47 """48 st.subheader("Missing Values")49 missing_values = df.isnull().sum()50 if missing_values.sum() == 0:51 st.write("No missing values found in the dataset.")52 else:53 st.write(missing_values)54 55# Function to analyze outliers56def analyze_outliers(df):57 """58 Analyze outliers in numerical columns of the dataset.59 60 Parameters:61 df (DataFrame): DataFrame containing the dataset.62 """63 st.subheader("Outlier Analysis")64 numerical_columns = df.select_dtypes(include=np.number).columns65 if len(numerical_columns) == 0:66 st.write("No numerical columns found in the dataset.")67 else:68 outliers = pd.DataFrame(index=numerical_columns, columns=['Count of Outliers'])69 for col in numerical_columns:70 Q1 = df[col].quantile(0.25)71 Q3 = df[col].quantile(0.75)72 IQR = Q3 - Q173 lower_bound = Q1 - 1.5 * IQR74 upper_bound = Q3 + 1.5 * IQR75 outliers.loc[col, 'Count of Outliers'] = df[(df[col] < lower_bound) | (df[col] > upper_bound)].shape[0]76 st.write(outliers)77 78# Function to visualize data distributions79def visualize_data_distribution(df):80 """81 Visualize data distributions of numerical columns in the dataset.82 83 Parameters:84 df (DataFrame): DataFrame containing the dataset.85 """86 st.subheader("Data Distribution")87 numerical_columns = df.select_dtypes(include=np.number).columns88 if len(numerical_columns) == 0:89 st.write("No numerical columns found in the dataset.")90 else:91 selected_columns = st.multiselect("Select columns for visualization:", numerical_columns)92 for col in selected_columns:93 fig = px.histogram(df, x=col, title=f'Distribution of {col}')94 fig.update_layout(margin=dict(l=0, r=0, t=0, b=0)) # Apply tight layout95 st.plotly_chart(fig)96 97# Function to visualize count plots of categorical columns98def visualize_count_plots(df):99 """100 Visualize count plots of categorical columns in the dataset.101 102 Parameters:103 df (DataFrame): DataFrame containing the dataset.104 """105 st.subheader("Count Plots of Categorical Columns")106 categorical_columns = df.select_dtypes(include='object').columns107 if len(categorical_columns) == 0:108 st.write("No categorical columns found in the dataset.")109 else:110 selected_columns = st.multiselect("Select columns for visualization:", categorical_columns)111 for col in selected_columns:112 fig, ax = plt.subplots()113 sns.countplot(data=df, x=col, ax=ax)114 plt.xticks(rotation=45)115 plt.tight_layout() # Apply tight layout116 st.pyplot(fig)117 118# Function to display descriptive analysis119def display_descriptive_analysis(df):120 """121 Display descriptive analysis of the dataset.122 123 Parameters:124 df (DataFrame): DataFrame containing the dataset.125 """126 st.subheader("Descriptive Analysis")127 st.write(df.describe())128 129# Function to visualize box plots130def visualize_box_plots(df):131 """132 Visualize box plots of numerical columns in the dataset.133 134 Parameters:135 df (DataFrame): DataFrame containing the dataset.136 """137 st.subheader("Box Plots")138 numerical_columns = df.select_dtypes(include=np.number).columns139 if len(numerical_columns) == 0:140 st.write("No numerical columns found in the dataset.")141 else:142 selected_columns = st.multiselect("Select columns for visualization:", numerical_columns)143 for col in selected_columns:144 fig = px.box(df, y=col, title=f'Box Plot of {col}')145 fig.update_layout(margin=dict(l=0, r=0, t=0, b=0)) # Apply tight layout146 st.plotly_chart(fig)147 148# Function to visualize scatter plots149def visualize_scatter_plots(df):150 """151 Visualize scatter plots of numerical columns in the dataset.152 153 Parameters:154 df (DataFrame): DataFrame containing the dataset.155 """156 st.subheader("Scatter Plots")157 numerical_columns = df.select_dtypes(include=np.number).columns158 if len(numerical_columns) < 2:159 st.write("Insufficient numerical columns for scatter plots.")160 else:161 x_col = st.selectbox("Select X-axis column:", numerical_columns)162 y_col = st.selectbox("Select Y-axis column:", numerical_columns)163 fig = px.scatter(df, x=x_col, y=y_col, title="Scatter Plot")164 fig.update_layout(margin=dict(l=0, r=0, t=0, b=0)) # Apply tight layout165 st.plotly_chart(fig)166 167# Function to visualize pair plots168def visualize_pair_plots(df):169 """170 Visualize pair plots of numerical columns in the dataset.171 172 Parameters:173 df (DataFrame): DataFrame containing the dataset.174 """175 st.subheader("Pair Plots")176 numerical_columns = df.select_dtypes(include=np.number).columns177 if len(numerical_columns) < 2:178 st.write("Insufficient numerical columns for pair plots.")179 else:180 fig = px.scatter_matrix(df, dimensions=numerical_columns, title="Pair Plot")181 fig.update_layout(margin=dict(l=0, r=0, t=0, b=0)) # Apply tight layout182 st.plotly_chart(fig)183 184# Function to visualize correlation heatmap185def visualize_correlation_heatmap(df):186 """187 Visualize correlation heatmap of numerical columns in the dataset.188 189 Parameters:190 df (DataFrame): DataFrame containing the dataset.191 """192 st.subheader("Correlation Heatmap")193 fig, ax = plt.subplots()194 sns.heatmap(df.corr(), annot=True, cmap='coolwarm', ax=ax)195 plt.tight_layout() # Apply tight layout196 st.pyplot(fig)197 198# Main function to run the EDA tool199def main():200 # Page configuration201 st.set_page_config(layout="wide", page_icon="๐", page_title="EDA Tool")202 203 # Title and description204 st.title("Exploratory Data Analysis Tool")205 st.write("Upload your dataset to explore its characteristics and distributions.")206 207 # Sidebar for file upload and EDA options208 st.sidebar.title("Options")209 file_path = st.sidebar.file_uploader("Upload Dataset", type=['csv', 'xlsx'])210 if file_path:211 df = load_dataset(file_path, file_format=file_path.name.split('.')[-1])212 display_dataset_info(df)213 214 st.sidebar.subheader("Exploratory Data Analysis")215 options = st.sidebar.multiselect("Choose EDA tasks:", 216 ["Display Dataset Info", "Handle Missing Values", "Analyze Outliers", 217 "Visualize Data Distribution", "Visualize Count Plots", "Display Descriptive Analysis",218 "Visualize Box Plots", "Visualize Scatter Plots", "Visualize Pair Plots", "Visualize Correlation Heatmap"])219 220 if "Display Dataset Info" in options:221 display_dataset_info(df)222 223 if "Handle Missing Values" in options:224 handle_missing_values(df)225 226 if "Analyze Outliers" in options:227 analyze_outliers(df)228 229 if "Visualize Data Distribution" in options:230 visualize_data_distribution(df)231 232 if "Visualize Count Plots" in options:233 visualize_count_plots(df)234 235 if "Display Descriptive Analysis" in options:236 display_descriptive_analysis(df)237 238 if "Visualize Box Plots" in options:239 visualize_box_plots(df)240 241 if "Visualize Scatter Plots" in options:242 visualize_scatter_plots(df)243 244 if "Visualize Pair Plots" in options:245 visualize_pair_plots(df)246 247 if "Visualize Correlation Heatmap" in options:248 visualize_correlation_heatmap(df)249 250# Run the main function251if __name__ == "__main__":252 main()253 