rajkhanke's picture
Update app.py
08e3c38 verified
from flask import Flask, render_template, request
import matplotlib.pyplot as plt
import pandas as pd
from joblib import load
import seaborn as sns
import io
from wordcloud import WordCloud
import base64
import string
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
from google_play_scraper import app, Sort, reviews_all
from nltk.sentiment.vader import SentimentIntensityAnalyzer
from nltk.corpus import stopwords
from collections import Counter
from matplotlib.sankey import Sankey
import networkx as nx
app = Flask(__name__)
def preprocess_text(text):
if text is not None:
# Convert to lowercase
text = text.lower()
# Remove special characters and punctuation
text = text.translate(str.maketrans('', '', string.punctuation))
# Tokenize text
tokens = word_tokenize(text)
# Remove stopwords
stop_words = set(stopwords.words('english'))
tokens = [word for word in tokens if word not in stop_words]
# Lemmatize tokens
lemmatizer = WordNetLemmatizer()
tokens = [lemmatizer.lemmatize(word) for word in tokens]
# Join tokens back into string
preprocessed_text = ' '.join(tokens)
return preprocessed_text
else:
return ''
def preprocess_dataframe(df):
# Drop unnecessary columns
df.drop(['userName', 'reviewId', 'userImage', 'reviewCreatedVersion', 'at'], axis=1, inplace=True)
# Convert 'repliedAt' column to datetime
df['repliedAt'] = pd.to_datetime(df['repliedAt'])
# Extract month and year from 'repliedAt'
df['RepliedMonth'] = df['repliedAt'].dt.month
df['RepliedYear'] = df['repliedAt'].dt.year
# Drop the original 'repliedAt' column
df.drop('repliedAt', axis=1, inplace=True)
# Convert 'replyContent' to binary indicator
df['IsReplied'] = df['replyContent'].apply(lambda x: 'Yes' if x and x.strip() != '' else 'No')
# Drop 'replyContent' column
df.drop('replyContent', axis=1, inplace=True)
# Fill missing values in 'appVersion' with '0'
df['appVersion'].fillna('0', inplace=True)
# Only keep necessary columns (content, score, IsReplied)
df = df[['content', 'score', 'IsReplied']]
return df
def analyze_sentiment(text, score):
# Initialize VADER sentiment analyzer
analyzer = SentimentIntensityAnalyzer()
# Perform sentiment analysis
sentiment_score = analyzer.polarity_scores(text)['compound']
if sentiment_score >= 0.05 and score >= 3:
return 'positive'
elif sentiment_score <= -0.05 and score < 3:
return 'negative'
else:
return 'neutral'
@app.route('/predict/app', methods=['POST'])
def predict_appFraud():
# Get the app ID and other necessary data from the form
app_id = request.form['app-id']
app_name = request.form['app-name']
# Scrape reviews for the specified app
reviews = reviews_all(app_id, sleep_milliseconds=0, lang="Eng", country="in", sort=Sort.NEWEST)
df = pd.json_normalize(reviews)
# Preprocess the DataFrame
df = preprocess_dataframe(df)
# Perform sentiment analysis
df['sentiment'] = df.apply(lambda row: analyze_sentiment(row['content'], row['score']), axis=1)
# Generate result based on sentiment
positive_count = (df['sentiment'] == 'positive').sum()
negative_count = (df['sentiment'] == 'negative').sum()
if positive_count > negative_count:
result = "The App is Not Fraud"
else:
result = "The App is Fraud"
total_reviews = len(df)
positive_reviews = (df['sentiment'] == 'positive').sum()
negative_reviews = (df['sentiment'] == 'negative').sum()
neutral_reviews = (df['sentiment'] == 'neutral').sum()
average_rating = round(df['score'].mean(), 2)
positive_percentage = round((positive_reviews / total_reviews) * 100, 2)
negative_percentage = round((negative_reviews / total_reviews) * 100, 2)
neutral_percentage = round((neutral_reviews / total_reviews) * 100, 2)
replied_percentage = round((df['IsReplied'] == 'Yes').mean() * 100, 2)
# Generate visualizations
# 1. Percentage pie chart of reviews
reviews_counts = df['sentiment'].value_counts()
labels = reviews_counts.index
colors = ['red', 'green', 'blue']
plt.figure(figsize=(6, 4))
plt.pie(reviews_counts, labels=labels, colors=colors, autopct='%1.1f%%', startangle=140)
plt.title('Percentage of Reviews in Fraud App')
buffer1 = io.BytesIO()
plt.savefig(buffer1, format='png')
buffer1.seek(0)
buffer_data1 = base64.b64encode(buffer1.getvalue()).decode()
plt.close()
# 2. Count plot of each type of review
plt.figure(figsize=(6, 4))
sns.countplot(x='sentiment', data=df, palette={'positive': 'green', 'negative': 'red', 'neutral': 'blue'})
plt.title('Count of Each Review Type in Fraud App')
plt.xlabel('Sentiment')
plt.ylabel('Count')
buffer2 = io.BytesIO()
plt.savefig(buffer2, format='png')
buffer2.seek(0)
buffer_data2 = base64.b64encode(buffer2.getvalue()).decode()
plt.close()
# 3. Histogram for each type of score
plt.figure(figsize=(6, 4))
sns.histplot(data=df, x='score', hue='sentiment', multiple='stack', bins=20)
plt.title('Histogram of Rating for Each Review Type in Fraud App')
plt.xlabel('Score')
plt.ylabel('Count')
buffer3 = io.BytesIO()
plt.savefig(buffer3, format='png')
buffer3.seek(0)
buffer_data3 = base64.b64encode(buffer3.getvalue()).decode()
plt.close()
# 4. Pie chart of isreplied (Yes vs No)
replied_counts = df['IsReplied'].value_counts()
labels = replied_counts.index
plt.figure(figsize=(6, 4))
plt.pie(replied_counts, labels=labels, autopct='%1.1f%%', startangle=140, colors=['lightgreen', 'lightcoral'])
plt.title('Percentage of Replies in Fraud App Reviews')
buffer4 = io.BytesIO()
plt.savefig(buffer4, format='png')
buffer4.seek(0)
buffer_data4 = base64.b64encode(buffer4.getvalue()).decode()
plt.close()
# 5. Violin plot of review vs score
plt.figure(figsize=(6, 4))
sns.violinplot(x='sentiment', y='score', data=df, palette={'positive': 'green', 'negative': 'red', 'neutral': 'blue'})
plt.title('Violin Plot of Review vs Rating in Fraud App')
plt.xlabel('Sentiment')
plt.ylabel('Score')
buffer5 = io.BytesIO()
plt.savefig(buffer5, format='png')
buffer5.seek(0)
buffer_data5 = base64.b64encode(buffer5.getvalue()).decode()
plt.close()
# 6. Joint count plot for positive, negative, and neutral reviews based on isreplied (Yes or No)
plt.figure(figsize=(6, 4)) # Set the size of the figure
sns.catplot(x='sentiment', kind='count', hue='IsReplied', data=df, palette='Set1',height=4,aspect=1)
plt.title('Sentiments vs Review Reply Status')
plt.xlabel('Sentiment')
plt.ylabel('Count')
plt.tight_layout()
buffer6 = io.BytesIO()
plt.savefig(buffer6, format='png')
buffer6.seek(0)
buffer_data6 = base64.b64encode(buffer6.getvalue()).decode()
plt.close()
# Render template with result and any other data you want to display
return render_template('app_result.html', result=result, app_name=app_name,
total_reviews=total_reviews, positive_reviews=positive_reviews,
negative_reviews=negative_reviews, neutral_reviews=neutral_reviews,
average_rating=average_rating, positive_percentage=positive_percentage,
negative_percentage=negative_percentage, neutral_percentage=neutral_percentage, replied_percentage=replied_percentage, plot1=buffer_data1, plot2=buffer_data2,
plot3=buffer_data3, plot4=buffer_data4, plot5=buffer_data5, plot6=buffer_data6)
# Load the pre-trained model
best_rf_classifier = load('RFModel.pkl')
# Load X_train
X_train = pd.read_csv('X_train.csv')
# Load the dataset
df = pd.read_csv('DVCarFraudDetection.csv')
@app.route('/')
def index():
return render_template('index.html')
@app.route('/vehicle_insurance')
def vehicle_insurance():
return render_template('vehicle.html')
@app.route('/predict/insurance')
def predict_insurance():
return render_template('vehicle.html')
@app.route('/dataset')
def dataset_display():
# Generate visualizations
fig1, ax1 = plt.subplots(figsize=(6, 4))
sns.countplot(y='CarCompany', data=df)
buffer1 = io.BytesIO()
plt.savefig(buffer1, format='png')
buffer1.seek(0)
buffer_data1 = base64.b64encode(buffer1.getvalue()).decode()
plt.close(fig1)
fig2, ax2 = plt.subplots(figsize=(6, 4))
sns.countplot(x='BasePolicy', hue='IsFraud', data=df, palette={0: 'green', 1: 'red'})
buffer2 = io.BytesIO()
plt.savefig(buffer2, format='png')
buffer2.seek(0)
buffer_data2 = base64.b64encode(buffer2.getvalue()).decode()
plt.close(fig2)
fig3, ax3 = plt.subplots(figsize=(6, 4))
past_claims_counts = df['PastNumberOfClaims'].value_counts()
ax3.pie(past_claims_counts, labels=past_claims_counts.index, autopct='%1.1f%%')
ax3.set_title('Past Number of Claims Count')
buffer3 = io.BytesIO()
plt.savefig(buffer3, format='png')
buffer3.seek(0)
buffer_data3 = base64.b64encode(buffer3.getvalue()).decode()
plt.close(fig3)
fig4, ax4 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
sns.countplot(x='IsAddressChanged', hue='IsFraud', data=df, palette={0: 'green', 1: 'red'})
ax4.set_title('Address Change and Fraud Distribution')
ax4.set_xlabel('Is Address Changed?')
ax4.set_ylabel('Count')
plt.legend(title='Is Fraud')
buffer4 = io.BytesIO()
plt.savefig(buffer4, format='png')
buffer4.seek(0)
buffer_data4 = base64.b64encode(buffer4.getvalue()).decode()
plt.close(fig4)
fig5, ax5 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
heatmap_data = df.groupby(['CarCompany', 'OwnerGender']).size().unstack()
sns.heatmap(heatmap_data, annot=True, cmap='coolwarm', fmt='.2f', ax=ax5)
ax5.set_title('Car Company vs Owner Gender')
ax5.set_xlabel('Owner Gender')
ax5.set_ylabel('Car Company')
plt.yticks(rotation=0) # Rotate y-axis labels for better readability
plt.tight_layout()
buffer5 = io.BytesIO()
plt.savefig(buffer5, format='png')
buffer5.seek(0)
buffer_data5 = base64.b64encode(buffer5.getvalue()).decode()
plt.close(fig5)
fig6, ax6 = plt.subplots(figsize=(6, 4))
num_supplements_counts = df['NumberOfSuppliments'].value_counts()
ax6.pie(num_supplements_counts, labels=num_supplements_counts.index, autopct='%1.1f%%')
ax6.set_title('NUmber of Suplements Count')
buffer6 = io.BytesIO()
plt.savefig(buffer6, format='png')
buffer6.seek(0)
buffer_data6 = base64.b64encode(buffer6.getvalue()).decode()
plt.close(fig6)
fig7, ax7 = plt.subplots(figsize=(6, 4))
sns.countplot(x='PoliceReportFiled', hue='IsFraud', data=df)
buffer7 = io.BytesIO()
plt.savefig(buffer7, format='png')
buffer7.seek(0)
buffer_data7 = base64.b64encode(buffer7.getvalue()).decode()
plt.close(fig7)
fig8, ax8 = plt.subplots(figsize=(6, 4))
sns.violinplot(x='OwnerGender', y='OwnerAge', data=df, palette={'Male': 'blue', 'Female': 'pink'}, ax=ax8)
buffer8 = io.BytesIO()
plt.savefig(buffer8, format='png')
buffer8.seek(0)
buffer_data8 = base64.b64encode(buffer8.getvalue()).decode()
plt.close(fig8)
fig9, ax9 = plt.subplots(figsize=(6, 4)) # Create a new figure and axis
sns.scatterplot(x='OwnerAge', y='NumberOfSuppliments', data=df, ax=ax9)
plt.title('Scatter Plot of OwnerAge vs NumberOfSuppliments') # Set the title of the plot
plt.tight_layout() # Ensure tight layout
buffer9 = io.BytesIO() # Create a BytesIO buffer to store the plot image
plt.savefig(buffer9, format='png') # Save the plot to the buffer in PNG format
buffer9.seek(0) # Reset the buffer position to the start
buffer_data9 = base64.b64encode(buffer9.getvalue()).decode() # Encode the plot image as base64
plt.close(fig9) # Close the figure to release resources
fig10, ax10 = plt.subplots(figsize=(6, 4))
sns.boxplot(x='CarCategory', y='CarPrice', data=df, ax=ax10)
buffer10 = io.BytesIO()
plt.savefig(buffer10, format='png')
buffer10.seek(0)
buffer_data10 = base64.b64encode(buffer10.getvalue()).decode()
plt.close(fig10)
# Render the dataset template with plots
return render_template('dataset.html', df=pd.read_csv('DVCarFraudDetection.csv'), plot1=buffer_data1, plot2=buffer_data2,
plot3=buffer_data3, plot4=buffer_data4, plot5=buffer_data5, plot6=buffer_data6,
plot7=buffer_data7, plot8=buffer_data8, plot9=buffer_data9, plot10=buffer_data10)
@app.route('/predict/insurance', methods=['POST'])
def make_prediction():
# Get the form data
CarCompany = request.form['CarCompany']
AccidentArea = request.form['AccidentArea']
OwnerGender = request.form['OwnerGender']
OwnerAge = int(request.form['OwnerAge'])
Fault = request.form['Fault']
CarCategory = request.form['CarCategory']
CarPrice = int(request.form['CarPrice'])
PoliceReportFiled = request.form['PoliceReportFiled']
WitnessPresent = request.form['WitnessPresent']
AgentType = request.form['AgentType']
NumberOfSuppliments = int(request.form['NumberOfSuppliments'])
BasePolicy = request.form['BasePolicy']
IsAddressChanged = request.form['IsAddressChanged']
PastNumberOfClaims = int(request.form['PastNumberOfClaims'])
# Preprocess the input data
car_price = CarPrice / 10 # scaling car price as in your previous code
user_input = {
'CarCompany': [CarCompany],
'AccidentArea': [AccidentArea],
'OwnerGender': [OwnerGender],
'OwnerAge': [OwnerAge],
'Fault': [Fault],
'CarCategory': [CarCategory],
'CarPrice': [car_price],
'PoliceReportFiled': [PoliceReportFiled],
'WitnessPresent': [WitnessPresent],
'AgentType': [AgentType],
'NumberOfSuppliments': [NumberOfSuppliments],
'BasePolicy': [BasePolicy],
'IsAddressChanged': [IsAddressChanged],
'PastNumberOfClaims': [PastNumberOfClaims]
}
user_df = pd.DataFrame(user_input)
processed_user_input = pd.get_dummies(user_df)
# Assuming X_train is your training data, you need to replace it with your actual training data
processed_user_input = processed_user_input.reindex(columns=X_train.columns, fill_value=0)
# Make prediction
prediction = best_rf_classifier.predict(processed_user_input)
# Return prediction result
if prediction[0] == 1:
result = "Fraud in Insurance"
else:
result = "No Fraud in Insurance"
# Generate visualizations
fig1, ax1 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
sns.countplot(x='OwnerGender', hue='IsFraud', data=df, ax=ax1)
buffer1 = io.BytesIO()
plt.savefig(buffer1, format='png')
buffer1.seek(0)
buffer_data1 = base64.b64encode(buffer1.getvalue()).decode()
plt.close(fig1)
fig2, ax2 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
sns.violinplot(x='CarCategory', y='CarPrice', data=df, ax=ax2)
buffer2 = io.BytesIO()
plt.savefig(buffer2, format='png')
buffer2.seek(0)
buffer_data2 = base64.b64encode(buffer2.getvalue()).decode()
plt.close(fig2)
fig3, ax3 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
sns.countplot(x='AgentType', hue='IsFraud', data=df, ax=ax3)
buffer3 = io.BytesIO()
plt.savefig(buffer3, format='png')
buffer3.seek(0)
buffer_data3 = base64.b64encode(buffer3.getvalue()).decode()
plt.close(fig3)
fig4, ax4 = plt.subplots(figsize=(6 , 4)) # Adjust the figsize as per your preference
policy_fraud_counts = df[df['IsFraud'] == 1]['BasePolicy'].value_counts()
ax4.pie(policy_fraud_counts, labels=policy_fraud_counts.index, autopct='%1.1f%%')
buffer4 = io.BytesIO()
plt.savefig(buffer4, format='png')
buffer4.seek(0)
buffer_data4 = base64.b64encode(buffer4.getvalue()).decode()
plt.close(fig4)
fig5, ax5 = plt.subplots(figsize=(6, 4))
fraud_data = df[df['IsFraud'] == 1]
non_fraud_data = df[df['IsFraud'] == 0]
sns.boxplot(x='IsFraud', y='CarPrice', data=fraud_data, ax=ax5)
sns.boxplot(x='IsFraud', y='CarPrice', data=non_fraud_data, ax=ax5)
ax5.set_xlabel('Fraud Status')
ax5.set_ylabel('Car Price')
ax5.set_title('Box Plot of Car Price for Fraud and Non-Fraud Cases')
handles, labels = ax5.get_legend_handles_labels()
ax5.legend(handles, labels)
buffer5 = io.BytesIO()
plt.savefig(buffer5, format='png')
buffer5.seek(0)
buffer_data5 = base64.b64encode(buffer5.getvalue()).decode()
plt.close(fig5)
fig6, ax6 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
sns.histplot(data=df, x='PastNumberOfClaims', bins=range(max(df['PastNumberOfClaims'])+2), kde=False, ax=ax6)
ax6.set_ylabel('Fraud cases count')
buffer6 = io.BytesIO()
plt.savefig(buffer6, format='png')
buffer6.seek(0)
buffer_data6 = base64.b64encode(buffer6.getvalue()).decode()
plt.close(fig6)
fig7, ax7 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
policy_fraud_counts = df[df['IsFraud'] == 1]['CarCategory'].value_counts()
ax7.pie(policy_fraud_counts, labels=policy_fraud_counts.index, autopct='%1.1f%%')
buffer7 = io.BytesIO()
plt.savefig(buffer7, format='png')
buffer7.seek(0)
buffer_data7 = base64.b64encode(buffer7.getvalue()).decode()
plt.close(fig7)
fig8, ax8 = plt.subplots(figsize=(6, 4)) # Adjust the figsize as per your preference
sns.countplot(x='PastNumberOfClaims', hue='IsFraud', data=df, ax=ax8)
buffer8 = io.BytesIO()
plt.savefig(buffer8, format='png')
buffer8.seek(0)
buffer_data8 = base64.b64encode(buffer8.getvalue()).decode()
plt.close(fig8)
# Return prediction result and base64 encoded images
return render_template('prediction_result.html', result=result, plot1=buffer_data1, plot2=buffer_data2,
plot3=buffer_data3, plot4=buffer_data4, plot5=buffer_data5, plot6=buffer_data6,
plot7=buffer_data7, plot8=buffer_data8)
@app.route("/predict/app")
def predict_app():
return render_template('fraudapp.html')
@app.route("/mobile_app")
def mobile_app():
return render_template('fraudapp.html')
@app.route('/analysis/app')
def analysis_app():
return render_template('app_analysis.html')
@app.route('/analysis/app', methods=['POST'])
def analysisresult_app():
app_id = request.form['app-id']
app_name = request.form['app-name']
# Scrape reviews for the specified app
reviews = reviews_all(app_id, sleep_milliseconds=0, lang="Eng", country="in", sort=Sort.NEWEST)
df = pd.json_normalize(reviews)
# Preprocess the DataFrame
df = preprocess_dataframe(df)
# Perform sentiment analysis
df['sentiment'] = df.apply(lambda row: analyze_sentiment(row['content'], row['score']), axis=1)
# Word Cloud
text = ' '.join(df['content'].astype(str).tolist())
wordcloud = WordCloud(width=600, height=400, background_color='white').generate(text)
img_buffer1 = save_wordcloud_to_buffer(wordcloud)
stop_words = set(stopwords.words('english'))
# Add more words if necessary
additional_stopwords = set(['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your', 'yours', 'yourself', 'yourselves', 'he', 'him', 'his', 'himself', 'she', 'her', 'hers', 'herself', 'it', 'its', 'itself', 'they', 'them', 'their', 'theirs', 'themselves', 'what', 'which', 'who', 'whom', 'this', 'that', 'these', 'those', 'am', 'is', 'are', 'was', 'were', 'be', 'been', 'being', 'have', 'has', 'had', 'having', 'do', 'does', 'did', 'doing', 'a', 'an', 'the', 'and', 'but', 'if', 'or', 'because', 'as', 'until', 'while', 'of', 'at', 'by', 'for', 'with', 'about', 'against', 'between', 'into', 'through', 'during', 'before', 'after', 'above', 'below', 'to', 'from', 'up', 'down', 'in', 'out', 'on', 'off', 'over', 'under', 'again', 'further', 'then', 'once', 'here', 'there', 'when', 'where', 'why', 'how', 'all', 'any', 'both', 'each', 'few', 'more', 'most', 'other', 'some', 'such', 'no', 'nor', 'not', 'only', 'own', 'same', 'so', 'than', 'too', 'very', 's', 't', 'can', 'will', 'just', 'don', 'should', 'now', 'd', 'll', 'm', 'o', 're', 've', 'y', 'ain', 'aren', 'couldn', 'didn', 'doesn', 'hadn', 'hasn', 'haven', 'isn', 'ma', 'mightn', 'mustn', 'needn', 'shan', 'shouldn', 'wasn', 'weren', 'won', 'wouldn'])
stop_words.update(additional_stopwords)
# Count Plot of 10 Most Repeated Proper Nouns
proper_nouns = []
for review in df['content']:
words = review.split()
for word in words:
if word.istitle() and word.isalpha() and word.lower() not in stop_words:
proper_nouns.append(word)
top_proper_nouns = Counter(proper_nouns).most_common(10)
fig2, ax2 = plt.subplots(figsize=(6, 4))
sns.countplot(y=proper_nouns, order=[word[0] for word in top_proper_nouns], palette='viridis', ax=ax2)
ax2.set_title('Count Plot of 10 Most Repeated Proper Nouns')
ax2.set_xlabel('Count')
buffer2 = save_plot_to_buffer(fig2)
fig3, ax3 = plt.subplots(figsize=(6, 4))
is_replied_no_df = df[df['IsReplied'] == 'No']
sentiment_counts = is_replied_no_df['sentiment'].value_counts()
ax3.pie(sentiment_counts, labels=sentiment_counts.index, autopct='%1.1f%%', startangle=90, colors=['green', 'red', 'blue'])
ax3.set_title('Pie Chart of Sentiment Distribution for IsReplied NO')
buffer3 = save_plot_to_buffer(fig3)
# Calculate Review Length
df['review_length'] = df['content'].apply(lambda x: len(x.split()))
# Create a pivot table to aggregate sentiment scores by review length
sentiment_distribution = df.pivot_table(index='review_length', columns='sentiment', values='score', aggfunc='mean')
# Plot the heatmap
fig4, ax4 = plt.subplots(figsize=(6, 4))
sns.heatmap(sentiment_distribution, cmap='YlGnBu', linewidths=0.5, ax=ax4)
ax4.set_title('Sentiment Distribution Heatmap')
ax4.set_xlabel('Sentiment')
ax4.set_ylabel('Review Length')
# Save the plot to buffer
buffer4 = save_plot_to_buffer(fig4)
# Heatmap of Word Frequency
word_lengths = df['content'].apply(lambda x: len(x.split()))
word_freq = pd.DataFrame({'Word Length': word_lengths, 'Rating': df['score']})
fig5, ax5 = plt.subplots(figsize=(6, 4))
sns.heatmap(word_freq.corr(), annot=True, cmap='coolwarm', ax=ax5)
ax5.set_title('Heatmap of Word Length vs Rating')
buffer5 = save_plot_to_buffer(fig5)
# Joint Count Plot of Score for Positive, Negative, and Neutral
fig6, ax6 = plt.subplots(figsize=(6, 4))
sns.histplot(data=df, x='score', hue='sentiment', multiple='stack', palette='husl', ax=ax6)
ax6.set_title('Joint Count Plot of Score for Positive, Negative, and Neutral')
ax6.set_xlabel('Score')
ax6.set_ylabel('Count')
buffer6 = save_plot_to_buffer(fig6)
return render_template('app_analysis_final.html', df=df, app_name=app_name,
buffer1=img_buffer1, buffer2=buffer2, buffer3=buffer3,
buffer4=buffer4, buffer5=buffer5, buffer6=buffer6)
# Function to save plot to buffer
def save_plot_to_buffer(fig):
buffer = io.BytesIO()
fig.savefig(buffer, format='png')
buffer.seek(0)
buffer_data = base64.b64encode(buffer.getvalue()).decode()
plt.close(fig)
return buffer_data
# Function to save WordCloud image to buffer
def save_wordcloud_to_buffer(wordcloud):
img = wordcloud.to_image()
img_buffer = io.BytesIO()
img.save(img_buffer, format='PNG')
img_buffer.seek(0)
buffer = base64.b64encode(img_buffer.getvalue()).decode()
img_buffer.close()
return buffer
@app.route('/analysis/insurance')
def analysis_insurance():
# Generate visualizations
# Visualization 1: Distribution of Car Prices
fig1, ax1 = plt.subplots(figsize=(6, 4))
sns.histplot(df['CarPrice'], kde=True, color='skyblue', ax=ax1)
ax1.set_title('Distribution of Car Prices')
ax1.set_xlabel('Car Price')
ax1.set_ylabel('Frequency')
buffer1 = save_plot_to_buffer(fig1)
# Visualization 2: Distribution of Owner Ages
fig2, ax2 = plt.subplots(figsize=(6, 4))
sns.histplot(df['OwnerAge'], kde=True, color='salmon', ax=ax2)
ax2.set_title('Distribution of Owner Ages')
ax2.set_xlabel('Owner Age')
ax2.set_ylabel('Frequency')
buffer2 = save_plot_to_buffer(fig2)
# Visualization 3: Count of Claims by Base Policy
fig3, ax3 = plt.subplots(figsize=(6, 4))
sns.countplot(x='CarCategory', hue='IsFraud', data=df, palette='coolwarm', ax=ax3)
ax3.set_title('Count of Claims by Car category')
ax3.set_xlabel('Car category')
ax3.set_ylabel('Count')
buffer3 = save_plot_to_buffer(fig3)
# Visualization 4: Distribution of Car Prices by Fraud Status
fig4, ax4 = plt.subplots(figsize=(6, 4))
sns.boxplot(x='IsFraud', y='CarPrice', data=df, palette='Set2', ax=ax4)
ax4.set_title('Distribution of Car Prices by Fraud Status')
ax4.set_xlabel('Fraud Status')
ax4.set_ylabel('Car Price')
buffer4 = save_plot_to_buffer(fig4)
# Visualization 5: Count of Claims by Accident Area
fig5, ax5 = plt.subplots(figsize=(6, 4))
sns.countplot(x='AccidentArea', hue='IsFraud', data=df, palette='husl', ax=ax5)
ax5.set_title('Count of Claims by Accident Area')
ax5.set_xlabel('Accident Area')
ax5.set_ylabel('Count')
buffer5 = save_plot_to_buffer(fig5)
# Visualization 6: Distribution of Number of Supplements
fig6, ax6 = plt.subplots(figsize=(6, 4))
sns.histplot(df['NumberOfSuppliments'], kde=True, color='orange', ax=ax6)
ax6.set_title('Distribution of Number of Supplements')
ax6.set_xlabel('Number of Supplements')
ax6.set_ylabel('Frequency')
buffer6 = save_plot_to_buffer(fig6)
# Visualization 7: Count of Claims by Witness Presence
fig7, ax7 = plt.subplots(figsize=(6, 4))
sns.countplot(x='WitnessPresent', hue='IsFraud', data=df, palette='viridis', ax=ax7)
ax7.set_title('Count of Claims by Witness Presence')
ax7.set_xlabel('Witness Presence')
ax7.set_ylabel('Count')
buffer7 = save_plot_to_buffer(fig7)
# Visualization 8: Distribution of Past Number of Claims
fig8, ax8 = plt.subplots(figsize=(6, 4))
sns.histplot(df['PastNumberOfClaims'], kde=True, color='purple', ax=ax8)
ax8.set_title('Distribution of Past Number of Claims')
ax8.set_xlabel('Past Number of Claims')
ax8.set_ylabel('Frequency')
buffer8 = save_plot_to_buffer(fig8)
numeric_columns = df.select_dtypes(include='number')
# Compute the correlation matrix
corr = numeric_columns.corr()
# Create the heatmap
fig9, ax9 = plt.subplots(figsize=(6.5, 4.5))
sns.heatmap(corr, annot=True, cmap='coolwarm', fmt=".2f", ax=ax9)
ax9.set_title('Heatmap of Correlation Matrix')
buffer9 = save_plot_to_buffer(fig9)
# Visualization 10: Network Graph of Car Brands and Fraud Status
fig10, ax10 = plt.subplots(figsize=(6, 4))
G = nx.from_pandas_edgelist(df, 'CarCompany', 'IsFraud')
nx.draw(G, with_labels=True, node_color='skyblue', node_size=2000, font_size=10, ax=ax10)
ax10.set_title('Network Graph of Car Brands and Fraud Status')
buffer10 = save_plot_to_buffer(fig10)
# Visualization 11: Violin Plot of Accident Area and Car Price
fig11, ax11 = plt.subplots(figsize=(6, 4))
sns.violinplot(x='AccidentArea', y='CarPrice', data=df, hue='IsFraud', split=True, palette='husl', ax=ax11)
ax11.set_title('Violin Plot of Accident Area and Car Price')
buffer11 = save_plot_to_buffer(fig11)
fig12, ax12 = plt.subplots(figsize=(6, 4))
hb = ax12.hexbin(df['CarPrice'], df['OwnerAge'], gridsize=50, cmap='inferno')
ax12.set_title('Hexbin Plot of Car Prices and Owner Ages')
ax12.set_xlabel('Car Price')
ax12.set_ylabel('Owner Age')
cb = fig12.colorbar(hb, ax=ax12)
cb.set_label('Frequency')
buffer12 = save_plot_to_buffer(fig12)
# Return render template with the additional plots
return render_template('insurance_analysis.html', plot1=buffer1, plot2=buffer2,
plot3=buffer3, plot4=buffer4, plot5=buffer5, plot6=buffer6,
plot7=buffer7, plot8=buffer8, plot9=buffer9, plot10=buffer10,
plot11=buffer11, plot12=buffer12)
if __name__ == "__main__":
app.run(debug=True,port=7860,host='0.0.0.0')