Spaces:
Build error
Build error
| import streamlit as st | |
| import pandas as pd | |
| import seaborn as sns | |
| import matplotlib.pyplot as plt | |
| import plotly.express as px | |
| from plotly.subplots import make_subplots | |
| import plotly.graph_objects as go | |
| st.set_page_config( | |
| page_title="Air Quality Analysis", | |
| page_icon="🌍", | |
| layout="wide" # Set layout to wide | |
| ) | |
| # Add custom CSS for background color | |
| page_bg_color = """ | |
| <style> | |
| /* Change the background color of the entire page */ | |
| [data-testid="stAppViewContainer"] { | |
| background-color: #5C7285; /* Light blue-gray color */ | |
| } | |
| /* Optional: Adjust sidebar background for consistency */ | |
| [data-testid="stSidebar"] { | |
| background-color: #727D73; /* Light gray-blue for the sidebar */ | |
| } | |
| </style> | |
| """ | |
| st.markdown(page_bg_color, unsafe_allow_html=True) | |
| # Load your AQI data | |
| def load_data(): | |
| # Replace with your data loading logic | |
| return pd.read_csv(r"random.csv") | |
| # Load data | |
| data = load_data() | |
| # Dashboard Title | |
| st.markdown( | |
| """ | |
| # **Comprehensive Analysis of Air Quality and Pollutant Dynamics Across Indian Cities** | |
| ### **Completed On:** February 2025 | |
| ### **Author:** Kaustubh Yewale | |
| ## **Introduction** | |
| Air pollution is one of the most critical challenges in urban environments, affecting public health, ecosystems, and overall quality of life. | |
| This project provides an in-depth analysis of air quality across Indian cities, focusing on pollutants like PM2.5, PM10, CO, SO₂, NO₂, and O₃. | |
| Through **advanced visualizations and data-driven insights**, the project uncovers pollution patterns, identifies high-risk areas, and explores the relationship between **weather conditions and pollution levels**. | |
| The ultimate goal is to provide **actionable recommendations** for mitigating pollution and supporting **policymakers in making informed decisions**. | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| st.image(r"Picture1.png") | |
| st.markdown( | |
| """ | |
| ## **Problem Statement** | |
| Urban air pollution has emerged as a severe environmental and public health issue. Understanding air quality trends and their correlation with weather conditions is crucial for: | |
| - Identifying pollution hotspots | |
| - Evaluating health risks associated with high pollution levels | |
| - Formulating strategic mitigation policies | |
| This project **analyzes air quality trends** across Indian cities, using **data science techniques** to extract meaningful insights from pollutant and weather data. | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| st.write(''' | |
| ## **Objectives** | |
| 1. **Retrieve and preprocess air quality data** from sources like `aqi.in` and **merge with weather data**. | |
| 2. **Perform Exploratory Data Analysis (EDA)** to identify pollution trends across different cities and regions. | |
| 3. **Analyze the correlation** between AQI and weather conditions (e.g., temperature, humidity, wind speed). | |
| 4. **Develop machine learning models** to predict AQI levels based on weather conditions and pollutants. | |
| 5. **Provide visual insights** using maps, correlation heatmaps, and distribution plots. | |
| 6. **Propose recommendations** for improving air quality and highlight policy implications. | |
| ''') | |
| st.markdown( | |
| """ | |
| ## **📊 Data Collection Approach** | |
| ##### 1. 🌍 Latitude and Longitude Retrieval: | |
| Obtained latitude and longitude of various areas using **ChatGPT** for location-based analysis. | |
| ##### 2. 🌫️ Air Quality Data Scraping: | |
| Scraped data for key pollutants (**PM2.5, PM10, CO, SO₂, NO₂, O₃**) and AQI from **aqi.in** using Python libraries. | |
| ##### 3. ☁️ Weather Data Integration: | |
| Retrieved additional weather features (**humidity, pressure, wind speed**) using the **Weatherstack API**. | |
| ##### 4. 🔗 Data Consolidation: | |
| Merged pollutant data with weather data for each location to create a comprehensive dataset. | |
| """, | |
| unsafe_allow_html=True | |
| ) | |
| st.markdown('<h1 style="color: #FFD700;">AQI Dashboard</h1>', unsafe_allow_html=True) | |
| st.markdown("Analyze Air Quality Index data and trends.") | |
| # Sidebar Filters | |
| st.subheader("Filter Options") | |
| cities = st.multiselect("Select Cities", options=data["areas"].unique()) | |
| pollutants = st.multiselect("Select Pollutants", options=['pm2.5', 'pm10', 'co', 'so2', 'no2', 'o3']) | |
| # Filter Data | |
| filtered_data = data.copy() | |
| if cities: | |
| filtered_data = filtered_data[filtered_data["areas"].isin(cities)] | |
| if pollutants: | |
| filtered_data = filtered_data[pollutants + ["areas", "AQI"]] | |
| # Display Filtered Data | |
| st.subheader("Filtered Data") | |
| st.dataframe(filtered_data) | |
| # Plot AQI Trends | |
| # Additional Features | |
| st.subheader("Statistics") | |
| if not filtered_data.empty: | |
| st.write(filtered_data.describe()) | |
| else: | |
| st.write("No data available for statistics.") | |
| st.markdown('<h1 style="color: #FFD700;">Outlier Detection for Various Pollutants</h1>', unsafe_allow_html=True) | |
| # Create a subplot grid | |
| fig = make_subplots( | |
| rows=3, cols=2, | |
| subplot_titles=[ | |
| 'Outlier Detection: PM2.5 and PM10', | |
| 'Outlier Detection: SO2, NO2, O3', | |
| 'Outlier Detection: CO and Total Pollution', | |
| 'Outlier Detection: Humidity and Temperature', | |
| 'Outlier Detection: CO', | |
| 'Outlier Detection: Pressure' | |
| ] | |
| ) | |
| # Add box plots for PM2.5 and PM10 | |
| fig.add_trace( | |
| go.Box(y=data['pm2.5'], name='PM2.5'), | |
| row=1, col=1 | |
| ) | |
| fig.add_trace( | |
| go.Box(y=data['pm10'], name='PM10'), | |
| row=1, col=1 | |
| ) | |
| # Add box plots for SO2, NO2, and O3 | |
| fig.add_trace( | |
| go.Box(y=data['so2'], name='SO2'), | |
| row=1, col=2 | |
| ) | |
| fig.add_trace( | |
| go.Box(y=data['no2'], name='NO2'), | |
| row=1, col=2 | |
| ) | |
| fig.add_trace( | |
| go.Box(y=data['o3'], name='O3'), | |
| row=1, col=2 | |
| ) | |
| # Add box plots for CO and Total Pollution | |
| fig.add_trace( | |
| go.Box(y=data['co'], name='CO'), | |
| row=2, col=1 | |
| ) | |
| fig.add_trace( | |
| go.Box(y=data['Total_Pollution'], name='Total Pollution'), | |
| row=2, col=1 | |
| ) | |
| # Add box plots for Humidity and Temperature | |
| fig.add_trace( | |
| go.Box(y=data['humdity'], name='Humidity'), | |
| row=2, col=2 | |
| ) | |
| fig.add_trace( | |
| go.Box(y=data['temperature'], name='Temperature'), | |
| row=2, col=2 | |
| ) | |
| # Add box plots for Pressure and CO | |
| fig.add_trace( | |
| go.Box(y=data['pressure'], name='Pressure'), | |
| row=3, col=1 | |
| ) | |
| fig.add_trace( | |
| go.Box(y=data['co'], name='CO'), | |
| row=3, col=2 | |
| ) | |
| # Update layout | |
| fig.update_layout( | |
| height=1000, | |
| title_text="Outlier Detection for Various Pollutants", | |
| showlegend=False | |
| ) | |
| # Display the boxplot in Streamlit | |
| st.plotly_chart(fig, use_container_width=True) | |
| st.write('''### Insights and Action-Oriented Insights: | |
| 1. **CO exhibits the highest variability** with extreme outliers, reaching levels over **2000**, making it the most critical pollutant to address. | |
| 2. **PM10 shows noticeable outliers**, suggesting localized high emissions, likely from construction or dust-related activities. | |
| 3. **Other pollutants (PM2.5, SO₂, NO₂, O₃)** have relatively lower levels and variability but should still be monitored to avoid spikes. | |
| 4. Focus on reducing **CO emissions** through stricter vehicle and industrial emission regulations. | |
| 5. Address **PM10 outliers** by implementing dust control measures at construction sites and promoting green buffers in urban areas. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Air Quality Distribution by Category</h1>', unsafe_allow_html=True) | |
| category_counts = data['Air quality'].value_counts().reset_index() | |
| category_counts.columns = ['Air quality', 'Count'] | |
| # Create the bar chart using Plotly | |
| fig1 = px.bar(category_counts, x='Air quality', y='Count', | |
| color='Air quality', title='Air Quality Distribution by Category', | |
| barmode='stack', text='Count') | |
| fig1.update_traces(textposition='outside') | |
| # Display the Plotly chart in Streamlit | |
| st.plotly_chart(fig1, use_container_width=True) | |
| st.write('''### Insights: | |
| 1. Most areas fall under **"Moderately Polluted"** and **"Satisfactory"** categories, indicating manageable but concerning pollution levels. | |
| 2. Very few areas (40) have **"Good"** air quality, highlighting the need for improvement. | |
| 3. **"Poor" and "Very Poor"** areas require urgent intervention to address harmful pollution. | |
| --- | |
| ### Action-Oriented Insights: | |
| 1. Focus on **"Poor" and "Very Poor" regions** with stricter emission controls and localized mitigation strategies. | |
| 2. Promote **urban greening** and **renewable energy adoption** to improve air quality across all regions. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Pollution Category Distribution</h1>', unsafe_allow_html=True) | |
| # Calculate Pollution Category Counts | |
| pollution_counts = data['Pollution_Category'].value_counts().reset_index() | |
| pollution_counts.columns = ['Pollution Category', 'Count'] | |
| # Define pull values (explode only 'Considerable') | |
| pollution_counts['pull'] = pollution_counts['Pollution Category'].apply( | |
| lambda x: 0.2 if x == 'Considerable' else 0 | |
| ) | |
| # Create the pie chart with explosion | |
| fig = px.pie( | |
| pollution_counts, | |
| names='Pollution Category', | |
| values='Count', | |
| title='Distribution of Pollution Categories', | |
| ) | |
| fig.update_traces( | |
| textinfo='percent+label', | |
| pull=pollution_counts['pull'] | |
| ) | |
| fig.update_layout( | |
| title_font_size=24, # Increase title font size | |
| width=800, # Set the chart width | |
| height=800, # Set the chart height | |
| showlegend=True, # Ensure the legend is visible | |
| ) | |
| # Display the pie chart | |
| st.plotly_chart(fig, use_container_width=True) | |
| st.write('''### Combined Insights and Action-Oriented Insights: | |
| 1. Over **50% of areas** fall into the **"Hazardous"** category, posing severe public health risks. | |
| 2. **Unsafe (25.7%)** and **Extremely Hazardous (21.4%)** areas demand immediate interventions to reduce pollutant levels. | |
| 3. Implement stricter emission controls and promote **renewable energy adoption** to tackle high pollution areas. | |
| 4. Deploy **real-time air monitoring systems** to track pollution trends and take proactive measures. | |
| 5. Raise public awareness to encourage sustainable practices like reducing vehicular emissions and waste burning. | |
| ''') | |
| # Scatter Plot for AQI vs Temperature | |
| st.markdown('<h1 style="color: #FFD700;">Pollution (AQI) vs Temperature</h1>', unsafe_allow_html=True) | |
| fig3 = px.scatter( | |
| data, | |
| x='temperature', | |
| y='AQI', | |
| color='Air quality', | |
| size='pm2.5', | |
| hover_name='areas', | |
| title='Pollution (AQI) vs Temperature', | |
| labels={'temperature': 'Temperature (°C)', 'AQI': 'Air Quality Index'} | |
| ) | |
| # Display the scatter plot in Streamlit | |
| st.plotly_chart(fig3, use_container_width=True) | |
| st.write('''### Insights and Action-Oriented Insights: | |
| 1. AQI levels are highest between **10°C and 20°C**, with "Moderately Polluted" and "Satisfactory" air quality dominating most temperature ranges. | |
| 2. "Very Poor" air quality is primarily observed in regions with temperatures above **15°C**, indicating a potential correlation with warmer conditions. | |
| 3. Focus on reducing **PM2.5 emissions**, as larger bubbles highlight its significant contribution to poor AQI levels. | |
| 4. Investigate pollutant sources in regions with **10°C–20°C** temperatures and enforce stricter emission controls in warmer areas. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Total Pollution vs Temperature</h1>', unsafe_allow_html=True) | |
| # Create the scatter plot using Plotly | |
| fig3 = px.scatter( | |
| data, x='temperature', y='Total_Pollution', | |
| color='Air quality', size='pm2.5', | |
| hover_name='areas', | |
| title='Total Pollution vs Temperature', | |
| labels={'temperature': 'Temperature (°C)', 'Total_Pollution': 'Total Pollution'} | |
| ) | |
| # Display the scatter plot in Streamlit | |
| st.plotly_chart(fig3, use_container_width=True) | |
| st.write('''### **Insights and Action-Oriented Recommendations** | |
| 1. **Pollution Peaks at Moderate Temperatures**: | |
| - Total pollution is highest around 15°C, with "Very Poor" air quality dominating. Target pollution control efforts during these conditions by limiting industrial and vehicular emissions. | |
| 2. **Decline in Pollution at Higher Temperatures**: | |
| - Total pollution decreases as temperatures exceed 25°C. Encourage maintaining such trends through renewable energy initiatives and green urban planning. | |
| 3. **Satisfactory Air Quality Across Wider Ranges**: | |
| - Areas with "Satisfactory" air quality are evenly distributed across temperatures. Expand awareness campaigns to sustain and improve such conditions. | |
| 4. **Outliers with Extreme Pollution**: | |
| - Outlier points with Total Pollution > 2000 demand immediate investigation and action, particularly in "Very Poor" air quality zones. | |
| 5. **Seasonal Pollution Management**: | |
| - Develop temperature-based pollution mitigation strategies to address seasonal patterns, focusing on cooler months when pollution spikes. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Weather Conditions vs AQI</h1>', unsafe_allow_html=True) | |
| # Aggregate AQI by weather condition | |
| weather_aqi = data.groupby('Weather_Condition')['AQI'].mean().reset_index() | |
| # Create the bar chart using Plotly | |
| fig5 = px.bar( | |
| weather_aqi, x='Weather_Condition', y='AQI', | |
| color='Weather_Condition', text='AQI', | |
| title='Weather Conditions vs AQI', | |
| color_discrete_sequence=px.colors.qualitative.Pastel | |
| ) | |
| fig5.update_traces(textposition='outside') | |
| # Display the chart in Streamlit | |
| st.plotly_chart(fig5, use_container_width=True) | |
| st.write('''### Insights and Action-Oriented Insights: | |
| 1. **Cool & Dry** and **Normal** weather conditions exhibit the highest AQI levels (**118.36** and **117.23** respectively), indicating significant pollution during these conditions. | |
| 2. **Hot & Humid** conditions show relatively lower AQI levels (**80.75**), possibly due to improved pollutant dispersion in warmer, humid climates. | |
| 3. Focus on **Cool & Dry** regions for pollution control measures, such as stricter emission regulations and increased monitoring during these conditions. | |
| 4. Implement **urban greenery initiatives** and promote **clean energy** solutions to mitigate AQI spikes in areas with "Cool & Dry" and "Normal" conditions. | |
| 5. Investigate local sources of pollution in these weather conditions to design targeted mitigation strategies. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Relationship Between Wind Speed and PM2.5 Levels</h1>', unsafe_allow_html=True) | |
| # Create scatter plot using Plotly | |
| fig_wind_pm25 = px.scatter( | |
| data, | |
| x='wind_speed', | |
| y='pm2.5', | |
| color='Air quality', | |
| size='pm2.5', | |
| title='Relationship Between Wind Speed and PM2.5 Levels', | |
| labels={'wind_speed': 'Wind Speed (m/s)', 'pm2.5': 'PM2.5 Levels'}, | |
| hover_name='areas' | |
| ) | |
| fig_wind_pm25.update_layout( | |
| xaxis_title='Wind Speed (m/s)', | |
| yaxis_title='PM2.5 Levels', | |
| legend_title='Air Quality' | |
| ) | |
| # Display the scatter plot in Streamlit | |
| st.plotly_chart(fig_wind_pm25, use_container_width=True) | |
| st.write('''### **Insights**: | |
| 🌟 Areas with **low wind speed (<10 m/s)** tend to have **higher PM2.5 levels**, indicating insufficient dispersion of particulate matter. | |
| 🌟 **Moderately polluted and very poor air quality categories** dominate in regions with low wind speed, emphasizing the impact of stagnant air conditions. | |
| ### **Action-Oriented Insights**: | |
| ✅ Promote **urban greening and wind corridors** in high-density areas to naturally improve air circulation. | |
| ✅ **Install pollution control technologies** near industrial and urban hotspots to mitigate the accumulation of PM2.5. ''') | |
| st.markdown('<h1 style="color: #FFD700;">Relationship Between Humidity and AQI</h1>', unsafe_allow_html=True) | |
| # Create the plot | |
| fig, ax = plt.subplots(figsize=(10, 6)) | |
| sns.regplot( | |
| x=data['humdity'], y=data['AQI'], | |
| scatter_kws={'alpha': 0.6}, line_kws={'color': 'red'}, ax=ax | |
| ) | |
| ax.set_title('Relationship Between Humidity and AQI') | |
| ax.set_xlabel('Humidity (%)') | |
| ax.set_ylabel('Air Quality Index (AQI)') | |
| # Display the plot in Streamlit | |
| st.pyplot(fig) | |
| st.write('''### Insights: | |
| 1. The scatterplot shows a **weak positive correlation** between humidity (%) and AQI, with higher humidity levels slightly associated with increased AQI values. | |
| 2. The **wide spread** of AQI across all humidity levels suggests that humidity alone is not a strong determinant of air quality. | |
| ### Action-Oriented Insights: | |
| 1. **Focus on humid regions**: Implement targeted air quality monitoring and mitigation strategies in areas with high humidity and poor air quality. | |
| 2. **Address other factors**: Investigate additional variables like wind speed, industrial emissions, and temperature to better understand AQI variability. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Top 10 Most Polluted Cities</h1>', unsafe_allow_html=True) | |
| # Get the top 10 most polluted cities | |
| top_10_most_polluted = data.nlargest(10, 'AQI') | |
| # Create bar chart using Plotly | |
| fig6 = px.bar( | |
| top_10_most_polluted.sort_values('AQI', ascending=True), | |
| y='areas', | |
| x='AQI', | |
| title='Top 10 Most Polluted Cities', | |
| color='AQI', | |
| hover_data=['pm2.5', 'pm10', 'co', 'so2', 'no2', 'o3', 'Total_Pollution'], | |
| color_continuous_scale=px.colors.sequential.Oryel | |
| ) | |
| # Display the chart in Streamlit | |
| st.plotly_chart(fig6, use_container_width=True) | |
| st.write('''### Insights from the Visualization: | |
| **Most Polluted Cities**: | |
| - Cities like **Serampore**, **Chinsurah**, and **Kalyani** rank highest in AQI, indicating critically poor air quality. | |
| - These cities may require immediate interventions due to the significant health risks posed by air pollution. | |
| --- | |
| ### Recommendations for Action: | |
| **For Most Polluted Cities**: | |
| - Implement stricter industrial emission controls and traffic regulations. | |
| - Promote renewable energy usage and reduce dependency on fossil fuels. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Top 10 Least Polluted Cities</h1>', unsafe_allow_html=True) | |
| # Get the top 10 least polluted cities | |
| top_10_least_polluted = data.nsmallest(10, 'AQI') | |
| # Create bar chart using Plotly | |
| fig7 = px.bar( | |
| top_10_least_polluted.sort_values('AQI', ascending=True), | |
| y='areas', | |
| x='AQI', | |
| title='Top 10 Least Polluted Cities', | |
| color='AQI', | |
| hover_data=['pm2.5', 'co', 'pm10', 'Total_Pollution'], | |
| color_continuous_scale=px.colors.sequential.Blugrn | |
| ) | |
| # Display the chart in Streamlit | |
| st.plotly_chart(fig7, use_container_width=True) | |
| st.write('''### Insights from the Visualization: | |
| **Least Polluted Cities**: | |
| - Cities such as **Pathanamthitta**, **Adoor**, and **Chengannur** showcase very low AQI values, indicating excellent air quality. | |
| - These cities could serve as benchmarks for pollution control measures. | |
| --- | |
| ### Recommendations for Action: | |
| **For Least Polluted Cities**: | |
| - Ensure continuous monitoring to maintain the air quality. | |
| - Encourage green practices such as afforestation and waste management.''') | |
| st.markdown('<h1 style="color: #FFD700;">Correlation Heatmap of AQI and Pollutants</h1>', unsafe_allow_html=True) | |
| # Select relevant data | |
| correlation_data = data[['pm2.5', 'pm10', 'co', 'so2', 'no2', 'o3', 'AQI']] | |
| # Compute correlation matrix | |
| corr_matrix = correlation_data.corr() | |
| # Create heatmap using Plotly | |
| fig = go.Figure( | |
| data=go.Heatmap( | |
| z=corr_matrix.values, # Correlation values | |
| x=corr_matrix.columns, # Column names | |
| y=corr_matrix.columns, # Row names | |
| colorscale='Viridis', # Color scheme | |
| zmin=-1, # Minimum correlation value | |
| zmax=1, # Maximum correlation value | |
| texttemplate="%{z:.2f}", # Format correlation values | |
| textfont={"size": 12} | |
| ) | |
| ) | |
| # Add title and layout settings | |
| fig.update_layout( | |
| title="Correlation Heatmap of AQI and Pollutants", | |
| xaxis=dict(title="Variables", tickangle=45), | |
| yaxis=dict(title="Variables"), | |
| autosize=True, | |
| template="plotly_white" | |
| ) | |
| # Display the heatmap in Streamlit | |
| st.plotly_chart(fig, use_container_width=True) | |
| st.write('''### Insights and Recommendations: | |
| 1. **PM2.5 (0.92)** and **PM10 (0.88)** have the strongest correlation with AQI, making them the primary contributors to air quality degradation. | |
| 2. **CO (0.78)** also plays a significant role in worsening AQI, often coexisting with particulate matter from combustion sources. | |
| 3. **O₃ (-0.11)** shows a weak negative correlation with AQI, suggesting minimal or inverse influence under certain conditions. | |
| 4. Focus on reducing **PM2.5**, **PM10**, and **CO** through stricter emission controls and cleaner fuel adoption. | |
| 5. Mitigate combined emissions of particulate matter and CO by targeting industrial and vehicular pollution sources.### Insights and Recommendations: | |
| 1. **PM2.5 (0.92)** and **PM10 (0.88)** have the strongest correlation with AQI, making them the primary contributors to air quality degradation. | |
| 2. **CO (0.78)** also plays a significant role in worsening AQI, often coexisting with particulate matter from combustion sources. | |
| 3. **O₃ (-0.11)** shows a weak negative correlation with AQI, suggesting minimal or inverse influence under certain conditions. | |
| 4. Focus on reducing **PM2.5**, **PM10**, and **CO** through stricter emission controls and cleaner fuel adoption. | |
| 5. Mitigate combined emissions of particulate matter and CO by targeting industrial and vehicular pollution sources.''') | |
| st.markdown('<h1 style="color: #FFD700;">Pollutant Levels Across Pollution Categories</h1>', unsafe_allow_html=True) | |
| # Create the bar chart using Plotly | |
| fig11 = px.bar( | |
| data, | |
| x='Pollution_Category', | |
| y=['pm2.5', 'pm10', 'so2', 'no2', 'o3', 'co'], | |
| title='Pollutant Levels Across Pollution Categories', | |
| labels={'value': 'Pollutant Levels (µg/m³)', 'variable': 'Pollutants'}, | |
| barmode='group', | |
| hover_name='state', | |
| color_discrete_sequence=px.colors.qualitative.Vivid_r # Vibrant color palette | |
| ) | |
| # Enhance hover details | |
| fig11.update_traces(hovertemplate='%{x}<br>%{y:.2f} µg/m³<br>Pollutant: %{legendgroup}') | |
| # Customize layout | |
| fig11.update_layout( | |
| title_font=dict(size=20, color='Grey', family='Arial Black'), | |
| xaxis_title_font=dict(size=16, color='black'), | |
| yaxis_title_font=dict(size=16, color='black'), | |
| legend_title=dict(font=dict(size=14)), | |
| plot_bgcolor='rgba(240, 240, 240, 0.9)' # Light background | |
| ) | |
| # Display the bar chart in Streamlit | |
| st.plotly_chart(fig11, use_container_width=True) | |
| st.write('''### **Insights** | |
| 1. **Carbon Monoxide Dominance**: | |
| - CO is the most significant pollutant across all pollution categories, with exceptionally high levels in the "Extremely Hazardous" and "Hazardous" categories, indicating the substantial contribution of vehicle emissions and industrial processes. | |
| 2. **PM2.5 and PM10 Contribution**: | |
| - Particulate matter (PM2.5 and PM10) shows a strong presence in "Hazardous" and "Unsafe" categories, reflecting pollution sources like construction, road dust, and combustion activities. | |
| 3. **Minor Contribution from Ozone (O₃) and Sulfur Dioxide (SO₂)**: | |
| - O₃ and SO₂ have relatively lower levels across all categories, suggesting lesser emissions from natural sources or effective control measures for these pollutants in some regions. | |
| 4. **Disproportionate Distribution**: | |
| - The pollutant levels significantly vary across pollution categories, with "Extremely Hazardous" and "Hazardous" contributing disproportionately higher levels compared to other categories like "Unsafe" or "Considerable." | |
| --- | |
| ### **Action-Oriented Recommendations** | |
| 1. **Target CO Emissions**: | |
| - Implement stricter vehicle emission standards and promote the transition to electric vehicles to reduce CO levels in the most polluted regions. | |
| 2. **Control PM2.5 and PM10 Sources**: | |
| - Enforce regulations to curb construction dust, road dust, and combustion activities, especially in "Hazardous" and "Unsafe" areas. | |
| 3. **Monitor and Mitigate Pollutants**: | |
| - Deploy real-time monitoring systems in "Extremely Hazardous" zones to identify and address localized sources of pollution effectively. | |
| 4. **Urban Greening Initiatives**: | |
| - Increase vegetation and green buffers in urban areas to naturally absorb pollutants like PM2.5 and PM10 and improve air quality. | |
| 5. **Public Awareness Campaigns**: | |
| - Educate communities on reducing activities that contribute to pollutants, such as waste burning, and encourage the adoption of public transport. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Interactive Map of AQI</h1>', unsafe_allow_html=True) | |
| # Create the interactive scatter geo map | |
| fig9 = px.scatter_geo( | |
| data, | |
| lat='lat', | |
| lon='long', | |
| color='AQI', | |
| size='AQI', | |
| title='Interactive Map of AQI', | |
| hover_name='areas', | |
| hover_data=['wind_speed'], | |
| color_continuous_scale='RdYlGn_r' # Red-Yellow-Green scale (reversed) | |
| ) | |
| # Update layout for better visualization | |
| fig9.update_layout( | |
| geo=dict( | |
| showland=True, | |
| landcolor="rgb(217, 217, 217)", | |
| showcoastlines=True, | |
| coastlinecolor="rgb(0, 0, 0)", | |
| ), | |
| margin=dict(l=10, r=10, t=50, b=10) | |
| ) | |
| # Display the map in Streamlit | |
| st.plotly_chart(fig9, use_container_width=True) | |
| st.write(':red[Its an interactive map you can zoom it and hover it to get more info.]') | |
| st.write('''### Insights and Action-Oriented Insights: | |
| 1. **Northern and eastern regions** exhibit the highest AQI levels, with hotspots visible, likely due to industrial activities and high population density. | |
| 2. **Central and southern regions** show relatively moderate AQI levels, indicating better air quality and manageable pollution levels. | |
| 3. Urban clusters with severe AQI levels require **localized pollution control measures**, including traffic management and stricter industrial regulations. | |
| 4. Deploy additional **air quality monitoring stations** in less covered areas to ensure comprehensive data collection for proactive interventions. | |
| 5. Focus on **reducing vehicular emissions** and promoting **green energy solutions** in high-AQI regions to improve air quality. | |
| ''') | |
| st.markdown('<h1 style="color: #FFD700;">Conclusion</h1>', unsafe_allow_html=True) | |
| st.markdown(''' | |
| The AQI EDA project has provided a **comprehensive analysis of air quality** across different regions. | |
| Key insights include: | |
| 1. **Air Quality Trends**: | |
| - The project identified areas with critical pollution levels and categorized them into distinct AQI categories (*Good, Satisfactory, Moderate, Poor, Very Poor, Severe*). | |
| - This helps pinpoint regions requiring urgent intervention. | |
| 2. **Geographic Visualization**: | |
| - Interactive visualizations, such as scatter plots on satellite maps, offered an intuitive way to understand the **spatial distribution of pollution levels**, highlighting hotspots and relatively cleaner areas. | |
| 3. **Correlations and Patterns**: | |
| - Analysis of parameters like **PM2.5, PM10, CO, SO₂, NO₂, and O₃** provided valuable insights into their contributions to overall pollution. | |
| - Seasonal variations and weather conditions like humidity and wind speed were found to influence AQI. | |
| 4. **Health Impacts**: | |
| - The classification of AQI into categories (*e.g., Hazardous, Unsafe*) serves as a tool for raising **public awareness** about the health risks associated with air pollution. | |
| ''') | |