import gradio as gr import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt from sklearn.preprocessing import LabelEncoder, OneHotEncoder, StandardScaler, MinMaxScaler, RobustScaler from sklearn.impute import KNNImputer from scipy import stats import plotly.express as px import plotly.graph_objects as go from plotly.subplots import make_subplots import warnings import io import base64 from datetime import datetime import json import statsmodels.api as sm from statsmodels.stats.outliers_influence import variance_inflation_factor from scipy.stats import chi2_contingency warnings.filterwarnings('ignore') class DataAnalyzer: def __init__(self): self.df = None self.numeric_columns = None self.categorical_columns = None def load_data(self, file): try: self.df = pd.read_csv(file.name) self._identify_column_types() return "Veri başarıyla yüklendi!" except Exception as e: return f"Hata: {str(e)}" def _identify_column_types(self): self.numeric_columns = self.df.select_dtypes(include=[np.number]).columns self.categorical_columns = self.df.select_dtypes(include=['object']).columns def get_basic_info(self): if self.df is None: return "Önce veri yükleyin!" info = [] info.append("### 1. Temel Veri Bilgileri") info.append(f"Satır Sayısı: {self.df.shape[0]}") info.append(f"Sütun Sayısı: {self.df.shape[1]}") memory_usage = self.df.memory_usage(deep=True).sum() info.append(f"Bellek Kullanımı: {memory_usage / 1024:.2f} KB") # Veri tipleri info.append("\n### 2. Veri Tipleri ve Örnekler") for column in self.df.columns: unique_count = self.df[column].nunique() info.append(f"\n{column}:") info.append(f" - Tip: {self.df[column].dtype}") info.append(f" - Benzersiz Değer Sayısı: {unique_count}") info.append(f" - İlk 3 Örnek: {', '.join(map(str, self.df[column].head(3)))}") return "\n".join(info) def analyze_missing_values(self): if self.df is None: return "Önce veri yükleyin!" missing = pd.DataFrame({ 'Eksik Sayı': self.df.isnull().sum(), 'Eksik Yüzde': (self.df.isnull().sum() / len(self.df) * 100).round(2) }) # Eksik değer pattern analizi missing_patterns = self.df.isnull().value_counts().head() result = "### Eksik Değer Analizi\n\n" result += missing.to_string() result += "\n\n### Eksik Değer Örüntüleri (İlk 5)\n\n" result += missing_patterns.to_string() return result def analyze_outliers(self, method='zscore', threshold=3): if self.df is None: return "Önce veri yükleyin!" results = [] results.append("### Aykırı Değer Analizi\n") for column in self.numeric_columns: results.append(f"\n{column} analizi:") if method == 'zscore': z_scores = np.abs(stats.zscore(self.df[column].dropna())) outliers = np.where(z_scores > threshold)[0] results.append(f"Z-score metodu ile {len(outliers)} aykırı değer bulundu") if len(outliers) > 0: results.append(f"Aykırı değerler: {self.df[column].iloc[outliers].values[:5]}...") elif method == 'iqr': Q1 = self.df[column].quantile(0.25) Q3 = self.df[column].quantile(0.75) IQR = Q3 - Q1 outliers = self.df[(self.df[column] < (Q1 - 1.5 * IQR)) | (self.df[column] > (Q3 + 1.5 * IQR))][column] results.append(f"IQR metodu ile {len(outliers)} aykırı değer bulundu") if len(outliers) > 0: results.append(f"Aykırı değerler: {outliers.values[:5]}...") # Temel istatistikler stats_data = self.df[column].describe() results.append("\nTemel İstatistikler:") results.append(stats_data.to_string()) return "\n".join(results) def analyze_correlations(self): if self.df is None: return "Önce veri yükleyin!" # Sayısal değişkenler için korelasyon numeric_corr = self.df[self.numeric_columns].corr() # Kategorik değişkenler için Cramer's V cat_correlations = [] for col1 in self.categorical_columns: for col2 in self.categorical_columns: if col1 < col2: contingency = pd.crosstab(self.df[col1], self.df[col2]) chi2, _, _, _ = chi2_contingency(contingency) n = contingency.sum().sum() v = np.sqrt(chi2 / (n * min(contingency.shape[0] - 1, contingency.shape[1] - 1))) cat_correlations.append(f"{col1} - {col2}: {v:.3f}") result = "### Sayısal Değişkenler Arası Korelasyonlar\n\n" result += numeric_corr.round(3).to_string() if cat_correlations: result += "\n\n### Kategorik Değişkenler Arası İlişkiler (Cramer's V)\n\n" result += "\n".join(cat_correlations) return result def create_visualization(self, plot_type, x_col, y_col=None, color_col=None): if self.df is None: return None plt.figure(figsize=(10, 6)) try: if plot_type == 'histogram': fig = px.histogram(self.df, x=x_col, color=color_col, title=f'{x_col} Histogram') elif plot_type == 'box': fig = px.box(self.df, x=x_col, y=y_col, color=color_col, title=f'{x_col} - {y_col} Box Plot') elif plot_type == 'scatter': fig = px.scatter(self.df, x=x_col, y=y_col, color=color_col, title=f'{x_col} vs {y_col} Scatter Plot') elif plot_type == 'bar': fig = px.bar(self.df, x=x_col, y=y_col, color=color_col, title=f'{x_col} - {y_col} Bar Plot') elif plot_type == 'violin': fig = px.violin(self.df, x=x_col, y=y_col, color=color_col, title=f'{x_col} - {y_col} Violin Plot') elif plot_type == 'line': fig = px.line(self.df, x=x_col, y=y_col, color=color_col, title=f'{x_col} - {y_col} Line Plot') elif plot_type == 'heatmap': corr = self.df[[x_col, y_col]].corr() fig = px.imshow(corr, title='Correlation Heatmap') return fig except Exception as e: return f"Görselleştirme oluşturulurken hata: {str(e)}" def feature_importance(self, target_col): if self.df is None: return "Önce veri yükleyin!" try: # Sayısal değişkenler için VIF hesaplama X = self.df[self.numeric_columns].drop(columns=[target_col], errors='ignore') vif_data = pd.DataFrame() vif_data["Feature"] = X.columns vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])] result = "### Özellik Önem Analizi\n\n" result += "VIF (Variance Inflation Factor) Değerleri:\n" result += vif_data.sort_values('VIF', ascending=False).to_string() # Korelasyon bazlı özellik önemi if target_col in self.df.columns: correlations = self.df[self.numeric_columns].corrwith(self.df[target_col]) result += "\n\nHedef Değişken ile Korelasyonlar:\n" result += correlations.sort_values(ascending=False).to_string() return result except Exception as e: return f"Özellik önem analizi sırasında hata: {str(e)}" def statistical_tests(self, column1, column2=None): if self.df is None: return "Önce veri yükleyin!" results = [] results.append("### İstatistiksel Test Sonuçları\n") try: # Tek değişkenli testler if column2 is None: # Normallik testi stat, p_value = stats.normaltest(self.df[column1].dropna()) results.append(f"Normallik Testi (D'Agostino and Pearson's):") results.append(f"Stat: {stat:.4f}, p-value: {p_value:.4f}") results.append(f"Sonuç: {'Normal dağılım' if p_value > 0.05 else 'Normal dağılım değil'}\n") # Temel istatistikler desc = self.df[column1].describe() results.append("Temel İstatistikler:") results.append(desc.to_string()) # İki değişkenli testler else: if column1 in self.numeric_columns and column2 in self.numeric_columns: # Pearson korelasyon corr, p_value = stats.pearsonr(self.df[column1].dropna(), self.df[column2].dropna()) results.append(f"Pearson Korelasyon:") results.append(f"Correlation: {corr:.4f}, p-value: {p_value:.4f}\n") # T-test t_stat, p_value = stats.ttest_ind(self.df[column1].dropna(), self.df[column2].dropna()) results.append(f"Bağımsız T-test:") results.append(f"T-stat: {t_stat:.4f}, p-value: {p_value:.4f}\n") elif column1 in self.categorical_columns and column2 in self.categorical_columns: # Chi-square test contingency = pd.crosstab(self.df[column1], self.df[column2]) chi2, p_value, dof, expected = chi2_contingency(contingency) results.append(f"Chi-square Bağımsızlık Testi:") results.append(f"Chi2: {chi2:.4f}, p-value: {p_value:.4f}") return "\n".join(results) except Exception as e: return f"İstatistiksel testler sırasında hata: {str(e)}" def create_interface(): analyzer = DataAnalyzer() with gr.Blocks() as demo: gr.Markdown("# Gelişmiş Veri Analiz Aracı") with gr.Tab("Veri Yükleme ve Temel Bilgiler"): file_input = gr.File(label="CSV Dosyası Yükleyin") load_button = gr.Button("Veri Yükle") info_button = gr.Button("Temel Bilgileri Göster") output_text = gr.Textbox(label="Sonuçlar", lines=20) load_button.click(analyzer.load_data, inputs=[file_input], outputs=[output_text]) info_button.click(analyzer.get_basic_info, outputs=[output_text]) with gr.Tab("Eksik Değer Analizi"): missing_button = gr.Button("Eksik Değerleri Analiz Et") missing_output = gr.Textbox(label="Eksik Değer Analizi", lines=15) missing_button.click(analyzer.analyze_missing_values, outputs=[missing_output]) with gr.Tab("Aykırı Değer Analizi"): with gr.Row(): outlier_method = gr.Radio(["zscore", "iqr"], label="Analiz Metodu", value="zscore") outlier_threshold = gr.Slider(minimum=1, maximum=5, value=3, label="Eşik Değeri") outlier_button = gr.Button("Aykırı Değerleri Analiz Et") outlier_output = gr.Textbox(label="Aykırı Değer Analizi", lines=15) outlier_button.click( analyzer.analyze_outliers, inputs=[outlier_method, outlier_threshold], outputs=[outlier_output] ) with gr.Tab("Korelasyon Analizi"): corr_button = gr.Button("Korelasyonları Analiz Et") corr_output = gr.Textbox(label="Korelasyon Analizi", lines=15) corr_button.click(analyzer.analyze_correlations, outputs=[corr_output]) with gr.Tab("Görselleştirme"): with gr.Row(): plot_type = gr.Dropdown( choices=[ "histogram", "box", "scatter", "bar", "violin", "line", "heatmap" ], label="Grafik Tipi", value="histogram" ) x_col = gr.Dropdown(label="X Ekseni") y_col = gr.Dropdown(label="Y Ekseni") color_col = gr.Dropdown(label="Renk Değişkeni (Opsiyonel)") plot_button = gr.Button("Grafik Oluştur") plot_output = gr.Plot(label="Görselleştirme") def update_columns(file): if file is not None: df = pd.read_csv(file.name) return gr.Dropdown(choices=df.columns.tolist()), \ gr.Dropdown(choices=df.columns.tolist()), \ gr.Dropdown(choices=['None'] + df.columns.tolist()) return gr.Dropdown(), gr.Dropdown(), gr.Dropdown() file_input.change( update_columns, inputs=[file_input], outputs=[x_col, y_col, color_col] ) plot_button.click( analyzer.create_visualization, inputs=[plot_type, x_col, y_col, color_col], outputs=[plot_output] ) with gr.Tab("İstatistiksel Analizler"): with gr.Row(): stat_col1 = gr.Dropdown(label="Birinci Değişken") stat_col2 = gr.Dropdown(label="İkinci Değişken (Opsiyonel)") stat_button = gr.Button("İstatistiksel Testleri Çalıştır") stat_output = gr.Textbox(label="Test Sonuçları", lines=15) file_input.change( lambda file: ( gr.Dropdown(choices=pd.read_csv(file.name).columns.tolist()), gr.Dropdown(choices=['None'] + pd.read_csv(file.name).columns.tolist()) ) if file else (gr.Dropdown(), gr.Dropdown()), inputs=[file_input], outputs=[stat_col1, stat_col2] ) stat_button.click( analyzer.statistical_tests, inputs=[stat_col1, stat_col2], outputs=[stat_output] ) with gr.Tab("Özellik Önem Analizi"): target_col = gr.Dropdown(label="Hedef Değişken") importance_button = gr.Button("Özellik Önemini Analiz Et") importance_output = gr.Textbox(label="Özellik Önem Analizi", lines=15) file_input.change( lambda file: gr.Dropdown( choices=pd.read_csv(file.name).columns.tolist()) if file else gr.Dropdown(), inputs=[file_input], outputs=[target_col] ) importance_button.click( analyzer.feature_importance, inputs=[target_col], outputs=[importance_output] ) with gr.Tab("Veri Ön İşleme"): with gr.Row(): preprocess_method = gr.Radio( choices=["standardization", "minmax", "robust", "log"], label="Ölçeklendirme Metodu", value="standardization" ) columns_to_process = gr.Dropdown( label="İşlenecek Sütunlar", multiselect=True ) def preprocess_data(file, method, columns): if file is None: return "Önce veri yükleyin!" try: df = pd.read_csv(file.name) processed_df = df.copy() if method == "standardization": scaler = StandardScaler() elif method == "minmax": scaler = MinMaxScaler() elif method == "robust": scaler = RobustScaler() elif method == "log": for col in columns: processed_df[col] = np.log1p(df[col]) return processed_df if method != "log": processed_df[columns] = scaler.fit_transform(df[columns]) output_path = "preprocessed_data.csv" processed_df.to_csv(output_path, index=False) return output_path except Exception as e: return f"Ön işleme sırasında hata: {str(e)}" preprocess_button = gr.Button("Ön İşleme Uygula") preprocess_output = gr.File(label="İşlenmiş Veri") file_input.change( lambda file: gr.Dropdown( choices=pd.read_csv(file.name).select_dtypes(include=[np.number]).columns.tolist(), multiselect=True ) if file else gr.Dropdown(), inputs=[file_input], outputs=[columns_to_process] ) preprocess_button.click( preprocess_data, inputs=[file_input, preprocess_method, columns_to_process], outputs=[preprocess_output] ) with gr.Tab("Rapor Oluşturma"): report_button = gr.Button("Kapsamlı Rapor Oluştur") def generate_report(file): if file is None: return "Önce veri yükleyin!" try: analyzer.load_data(file) report = [] report.append("# Veri Analiz Raporu") report.append(f"Oluşturma Tarihi: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n") report.append("## 1. Temel Bilgiler") report.append(analyzer.get_basic_info()) report.append("\n## 2. Eksik Değer Analizi") report.append(analyzer.analyze_missing_values()) report.append("\n## 3. Aykırı Değer Analizi") report.append(analyzer.analyze_outliers()) report.append("\n## 4. Korelasyon Analizi") report.append(analyzer.analyze_correlations()) # Raporu kaydet report_text = "\n".join(report) with open("data_analysis_report.txt", "w", encoding="utf-8") as f: f.write(report_text) return "data_analysis_report.txt" except Exception as e: return f"Rapor oluşturma sırasında hata: {str(e)}" report_output = gr.File(label="Oluşturulan Rapor") report_button.click( generate_report, inputs=[file_input], outputs=[report_output] ) return demo # Arayüzü oluştur ve başlat if __name__ == "__main__": demo = create_interface() demo.launch()