diff --git a/Data_VN_filter_v7.xlsx b/Data_VN_filter_v7.xlsx new file mode 100644 index 0000000..92d87b0 Binary files /dev/null and b/Data_VN_filter_v7.xlsx differ diff --git a/Project_Code_and_Results/2_CA_and_Spearman.rar b/Project_Code_and_Results/2_CA_and_Spearman.rar new file mode 100644 index 0000000..e181f7f Binary files /dev/null and b/Project_Code_and_Results/2_CA_and_Spearman.rar differ diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_Correlation_Matrix.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_Correlation_Matrix.csv new file mode 100644 index 0000000..3b9dc4a --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_Correlation_Matrix.csv @@ -0,0 +1,8 @@ +,Exercises,Culture,Beauty,Education,Society,Spirit +Park,0.6367377065045589,0.5386259837748125,0.609527381412311,0.6666205318079247,0.5894275000421331,0.5971978092460599 +Residential,0.6898067312223374,0.5322888366243355,0.7043563888714474,0.7003848393051737,0.6356124898043054,0.671536167178851 +Garden,0.569207243129314,0.42043962025354226,0.520982025379601,0.5745723285479705,0.47015163689224226,0.4720301687679101 +Rooftop,0.5220196490736146,0.39671027279755816,0.559846265287038,0.5289815361048281,0.46041084713416613,0.5313786451855366 +Recreation,0.4416516078536275,0.4118096932349253,0.414973028889102,0.48397115121605433,0.347143218999983,0.3437593248955575 +Agriculture,-0.30525120464643385,-0.09456459047576876,-0.41726188321313135,-0.3345389043778018,-0.3341241701147672,-0.37637058454953964 +Nature,-0.44980612831551553,-0.27299890014702094,-0.49976092665649713,-0.4610579352258267,-0.4605091031334855,-0.5381766537399497 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_Services_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_Services_Coords.csv new file mode 100644 index 0000000..d3917d7 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_Services_Coords.csv @@ -0,0 +1,7 @@ +,0,1 +Exercises,0.007027806093845654,0.004957784418992443 +Culture,-0.12773486154946914,-0.001881737518742339 +Beauty,0.05188265296211081,0.0051213397312073914 +Education,0.020143274994230118,0.013800122537297493 +Society,0.004096923788506599,-0.004799612673251565 +Spirit,0.04544596636820759,-0.018212152335741184 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_UGS_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_UGS_Coords.csv new file mode 100644 index 0000000..5ede300 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_CES_UGS_Coords.csv @@ -0,0 +1,8 @@ +,0,1 +Park,0.01929915023578449,-0.0026557268484349067 +Residential,0.03611771387245799,-0.006098756785044107 +Garden,0.024297413495923986,0.008449977834710572 +Rooftop,0.03634674358580918,-0.009949590505925508 +Recreation,-0.0006198278964895602,0.015176373315937821 +Agriculture,-0.14550165539847498,-0.015634536842211624 +Nature,-0.14586553315107212,0.01084942463742428 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_Correlation_Matrix.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_Correlation_Matrix.csv new file mode 100644 index 0000000..a861d6b --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_Correlation_Matrix.csv @@ -0,0 +1,8 @@ +,Dirty,Unsafe,Danger +Park,-0.40659517420422864,-0.3652691650630517,-0.47632864603181757 +Residential,-0.42361014190625074,-0.37318965467898796,-0.4711066759095078 +Garden,-0.3109599181970276,-0.27653098840256857,-0.34126139088328367 +Rooftop,-0.313359215935556,-0.3361077310042239,-0.35612431235937536 +Recreation,-0.09348749429342133,-0.14803279299655103,-0.27167796733643157 +Agriculture,0.48572656432897177,0.46262486117052976,0.5273673898837783 +Nature,0.5129174934902375,0.5064560749634449,0.5363089258301386 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_Services_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_Services_Coords.csv new file mode 100644 index 0000000..9f06290 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_Services_Coords.csv @@ -0,0 +1,4 @@ +,0,1 +Dirty,-0.021750742704197926,-0.023688662634614326 +Unsafe,-0.031685779157853394,0.02094725474813505 +Danger,0.056173988030702275,0.002810907103117069 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_UGS_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_UGS_Coords.csv new file mode 100644 index 0000000..8aaaa66 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_DES_UGS_Coords.csv @@ -0,0 +1,8 @@ +,0,1 +Park,-0.05277737050209137,0.021966851260274492 +Residential,-0.039828498949265316,0.030086993744197595 +Garden,-0.011237261666548438,0.01787364745984657 +Rooftop,0.0025503277042415763,-0.014900920261128709 +Recreation,-0.05985983449204827,-0.034402423139858064 +Agriculture,0.04093472746557441,-0.0031882467528099086 +Nature,0.03188949642613842,0.0004223966469934847 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_Correlation_Matrix.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_Correlation_Matrix.csv new file mode 100644 index 0000000..0cbeaee --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_Correlation_Matrix.csv @@ -0,0 +1,8 @@ +,MEAN RES,MEAN CES,MEAN DES +Park,0.6110543201654319,0.6768852442644577,-0.47060044983099286 +Residential,0.6407085222739133,0.7291962678143591,-0.4708562921098795 +Garden,0.44165260890843555,0.5480223668648628,-0.34198141262933823 +Rooftop,0.49600027293784166,0.5419994714753112,-0.3688582414111523 +Recreation,0.3745893900657618,0.40850035774422844,-0.17674812102484044 +Agriculture,-0.3502787611798973,-0.39573598649446984,0.5625037794065111 +Nature,-0.4734036284834367,-0.5391708531031724,0.582247211793259 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_Services_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_Services_Coords.csv new file mode 100644 index 0000000..807f95b --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_Services_Coords.csv @@ -0,0 +1,4 @@ +,0,1 +MEAN RES,-0.2186071848607324,-0.007839144868552231 +MEAN CES,-0.2574749215265179,0.007317945054910379 +MEAN DES,0.6682022605408963,0.00045551629187779 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_UGS_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_UGS_Coords.csv new file mode 100644 index 0000000..3eec276 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_MEAN_ESS_DES_UGS_Coords.csv @@ -0,0 +1,8 @@ +,0,1 +Park,-0.28217527664101055,-0.004698104759826525 +Residential,-0.2891839961693309,0.00131726592526606 +Garden,-0.18810995860092022,0.013756464641007708 +Rooftop,-0.20631526503069358,-0.0065124662879235936 +Recreation,-0.07849003909114283,-0.0039717946663235335 +Agriculture,0.6635981475555077,0.002205946282469859 +Nature,0.8024031622133635,-0.002091864403477851 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_Correlation_Matrix.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_Correlation_Matrix.csv new file mode 100644 index 0000000..68a1304 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_Correlation_Matrix.csv @@ -0,0 +1,8 @@ +,Temperature,Noise,Stormwind,Respiratory +Park,0.5943691697194959,0.4789900955834734,0.5400353044339286,0.5612018360594374 +Residential,0.6098741786551782,0.4993073835325437,0.5888125616106002,0.6297059731338867 +Garden,0.45042886274863986,0.3963838785463788,0.42396144532666635,0.41516036007093543 +Rooftop,0.49442453924504476,0.4358175328312086,0.4842898044085772,0.4021375963717873 +Recreation,0.40664357632988,0.3565204984864607,0.39747369992230713,0.3250145065589509 +Agriculture,-0.3272930077585318,-0.23403946925952315,-0.3063551523911346,-0.320369510797842 +Nature,-0.44797645118533835,-0.30105163246668354,-0.4709764053605818,-0.45237173056171975 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_Services_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_Services_Coords.csv new file mode 100644 index 0000000..673179f --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_Services_Coords.csv @@ -0,0 +1,5 @@ +,0,1 +Temperature,-0.023338638107689796,-0.006213751498479767 +Noise,0.06553553877191058,-0.0005751574284129316 +Stormwind,-0.021996594532673455,-0.013022115419183451 +Respiratory,-0.019898887972482068,0.02012270293988676 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_UGS_Coords.csv b/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_UGS_Coords.csv new file mode 100644 index 0000000..6756d62 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/CA_RES_UGS_Coords.csv @@ -0,0 +1,8 @@ +,0,1 +Park,-0.02240002337805916,0.007917221215969647 +Residential,-0.02799189713117847,0.015859200211763763 +Garden,-0.008475103510200898,0.0016829493791823964 +Rooftop,-0.0060566811778039985,-0.017070154943948847 +Recreation,-0.004992858046068623,-0.015594566177349648 +Agriculture,0.05380057559170161,0.0006539273597548665 +Nature,0.11812861315235715,0.010393415861558994 diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_CES.png b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_CES.png new file mode 100644 index 0000000..11458c0 Binary files /dev/null and b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_CES.png differ diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_DES.png b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_DES.png new file mode 100644 index 0000000..1da15ac Binary files /dev/null and b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_DES.png differ diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_MEAN_ESS_DES.png b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_MEAN_ESS_DES.png new file mode 100644 index 0000000..d6ee693 Binary files /dev/null and b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_MEAN_ESS_DES.png differ diff --git a/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_RES.png b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_RES.png new file mode 100644 index 0000000..defbcc3 Binary files /dev/null and b/Project_Code_and_Results/2_CA_and_Spearman/CA_plot_RES.png differ diff --git a/Project_Code_and_Results/2_CA_and_Spearman/run_ca_mean.py b/Project_Code_and_Results/2_CA_and_Spearman/run_ca_mean.py new file mode 100644 index 0000000..71530a3 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/run_ca_mean.py @@ -0,0 +1,90 @@ +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import prince +import os + +# Đường dẫn file dữ liệu +file_path = r'c:\Users\NASPC\Documents\Du án tại SG tháng 8\Data_VN_filter_v7.xlsx' +output_dir = r'c:\Users\NASPC\Documents\Du án tại SG tháng 8\Project_Code_and_Results\2_CA_and_Spearman' + +# Load data +df = pd.read_excel(file_path) + +# Extract variables +ugs_cols = ['Park', 'Residential', 'Garden', 'Rooftop', 'Recreation', 'Agriculture', 'Nature'] +mean_cols = ['MEAN RES', 'MEAN CES', 'MEAN DES'] +colors = ['green', 'purple', 'red'] + +print("Running CA for MEAN RES, MEAN CES, MEAN DES...") + +# Lọc các biến có trong data +available_means = [c for c in mean_cols if c in df.columns] +if not available_means: + print("Không tìm thấy các cột MEAN trong dữ liệu.") + exit() + +data = df[ugs_cols + available_means].dropna() + +# Tạo ma trận tương quan Spearman +corr = data.corr(method='spearman').loc[ugs_cols, available_means] + +# Dịch chuyển ma trận để tất cả các giá trị đều dương (CA yêu cầu bảng tần số hoặc giá trị dương) +corr_shifted = corr + 1 + +# Initialize CA +ca = prince.CA(n_components=2, n_iter=3, copy=True, check_input=True, engine='scipy', random_state=42) +ca = ca.fit(corr_shifted) + +# Extract column and row coordinates +row_coords = ca.row_coordinates(corr_shifted) # UGS +col_coords = ca.column_coordinates(corr_shifted) # Mean Services + +# Save to CSV +group_name = "MEAN_ESS_DES" +corr.to_csv(os.path.join(output_dir, f'CA_{group_name}_Correlation_Matrix.csv')) +row_coords.to_csv(os.path.join(output_dir, f'CA_{group_name}_UGS_Coords.csv')) +col_coords.to_csv(os.path.join(output_dir, f'CA_{group_name}_Services_Coords.csv')) + +# Plot Biplot +fig, ax = plt.subplots(figsize=(10, 8)) + +# Plot UGS points +ax.scatter(row_coords[0], row_coords[1], c='blue', label='UGS Types', s=80, marker='o', edgecolors='black') + +# Plot Mean Services points with corresponding colors +for i, col in enumerate(available_means): + c_idx = mean_cols.index(col) + color = colors[c_idx] + ax.scatter(col_coords.loc[col, 0], col_coords.loc[col, 1], c=color, marker='s', s=100, edgecolors='black') + +# Labels +for i, txt in enumerate(ugs_cols): + ax.annotate(txt, (row_coords.iloc[i, 0], row_coords.iloc[i, 1]), + xytext=(-10, 10), textcoords='offset points', + color='blue', fontweight='bold', fontsize=12, ha='right', va='bottom') + +for i, txt in enumerate(available_means): + c_idx = mean_cols.index(txt) + color = colors[c_idx] + ax.annotate(txt, (col_coords.loc[txt, 0], col_coords.loc[txt, 1]), + xytext=(10, -10), textcoords='offset points', + color=color, fontsize=12, fontweight='bold', ha='left', va='top') + +# Add dummy plots for legend +ax.scatter([], [], c='green', marker='s', label='MEAN RES (Điều hòa)') +ax.scatter([], [], c='purple', marker='s', label='MEAN CES (Văn hóa)') +ax.scatter([], [], c='red', marker='s', label='MEAN DES (Bất lợi)') + +ax.axhline(0, color='grey', linestyle='--', linewidth=1) +ax.axvline(0, color='grey', linestyle='--', linewidth=1) +ax.set_title('CA Biplot: UGS vs MEAN RES, MEAN CES, MEAN DES', fontsize=16) +ax.set_xlabel('Component 0', fontsize=12) +ax.set_ylabel('Component 1', fontsize=12) +ax.legend(loc='best', fontsize=12) +plt.grid(True, linestyle=':', alpha=0.6) + +plt.savefig(os.path.join(output_dir, f'CA_plot_{group_name}.png'), dpi=300, bbox_inches='tight') +plt.close() + +print("Finished MEAN ESS/DES.") diff --git a/Project_Code_and_Results/2_CA_and_Spearman/run_ca_separate.py b/Project_Code_and_Results/2_CA_and_Spearman/run_ca_separate.py new file mode 100644 index 0000000..773bc05 --- /dev/null +++ b/Project_Code_and_Results/2_CA_and_Spearman/run_ca_separate.py @@ -0,0 +1,87 @@ +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import prince +import os + +# Đường dẫn file dữ liệu +file_path = r'c:\Users\NASPC\Documents\Du án tại SG tháng 8\Data_VN_filter_v7.xlsx' +output_dir = r'c:\Users\NASPC\Documents\Du án tại SG tháng 8\Project_Code_and_Results\2_CA_and_Spearman' + +# Load data +df = pd.read_excel(file_path) + +# Extract variables +ugs_cols = ['Park', 'Residential', 'Garden', 'Rooftop', 'Recreation', 'Agriculture', 'Nature'] + +groups = { + 'RES': ['Temperature', 'Noise', 'Stormwind', 'Respiratory'], + 'CES': ['Exercises', 'Culture', 'Beauty', 'Education', 'Society', 'Spirit'], + 'DES': ['Dirty', 'Unsafe', 'Danger'] +} + +colors = { + 'RES': 'green', + 'CES': 'purple', + 'DES': 'red' +} + +for group_name, cols in groups.items(): + available_cols = [c for c in cols if c in df.columns] + if not available_cols: + print(f"No columns found for {group_name}") + continue + + print(f"Running CA for {group_name}...") + + data = df[ugs_cols + available_cols].dropna() + corr = data.corr(method='spearman').loc[ugs_cols, available_cols] + + corr_shifted = corr + 1 + + # Initialize CA + ca = prince.CA(n_components=2, n_iter=3, copy=True, check_input=True, engine='scipy', random_state=42) + ca = ca.fit(corr_shifted) + + # Extract column and row coordinates + row_coords = ca.row_coordinates(corr_shifted) # UGS + col_coords = ca.column_coordinates(corr_shifted) # Services + + # Save to CSV + corr.to_csv(os.path.join(output_dir, f'CA_{group_name}_Correlation_Matrix.csv')) + row_coords.to_csv(os.path.join(output_dir, f'CA_{group_name}_UGS_Coords.csv')) + col_coords.to_csv(os.path.join(output_dir, f'CA_{group_name}_Services_Coords.csv')) + + # Plot Biplot + fig, ax = plt.subplots(figsize=(10, 8)) + + # Plot UGS points + ax.scatter(row_coords[0], row_coords[1], c='blue', label='UGS Types', s=80, marker='o', edgecolors='black') + + # Plot Services points + color = colors[group_name] + ax.scatter(col_coords[0], col_coords[1], c=color, marker='s', s=80, edgecolors='black', label=group_name) + + # Labels + for i, txt in enumerate(ugs_cols): + ax.annotate(txt, (row_coords.iloc[i, 0], row_coords.iloc[i, 1]), + xytext=(-10, 10), textcoords='offset points', + color='blue', fontweight='bold', fontsize=12, ha='right', va='bottom') + + for i, txt in enumerate(available_cols): + ax.annotate(txt, (col_coords.iloc[i, 0], col_coords.iloc[i, 1]), + xytext=(10, -10), textcoords='offset points', + color=color, fontsize=12, fontweight='bold', ha='left', va='top') + + ax.axhline(0, color='grey', linestyle='--', linewidth=1) + ax.axvline(0, color='grey', linestyle='--', linewidth=1) + ax.set_title(f'CA Biplot: UGS vs {group_name}', fontsize=16) + ax.set_xlabel('Component 0', fontsize=12) + ax.set_ylabel('Component 1', fontsize=12) + ax.legend(loc='best', fontsize=12) + plt.grid(True, linestyle=':', alpha=0.6) + + plt.savefig(os.path.join(output_dir, f'CA_plot_{group_name}.png'), dpi=300, bbox_inches='tight') + plt.close() + + print(f"Finished {group_name}.")