Spaces:
Sleeping
Sleeping
| 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() |