-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdata_analysis.py
More file actions
263 lines (222 loc) 路 7.97 KB
/
Copy pathdata_analysis.py
File metadata and controls
263 lines (222 loc) 路 7.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import plotly.express as px
from pandas.plotting import scatter_matrix
from sklearn.cluster import KMeans
from sklearn.linear_model import LinearRegression
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
# 谞讟注谉 讗转 讛谞转讜谞讬诐 诪讛拽讘爪讬诐 砖谞讜爪专讜
df1 = pd.read_csv('df1.csv')
df2 = pd.read_csv('df2.csv')
# #1
df2_clean = df2.dropna(subset=['Horsepower', 'Rating'])
plt.figure(figsize=(10, 6))
plt.scatter(df2_clean['Horsepower'], df2_clean['Rating'], c='blue')
plt.xlabel('Horsepower')
plt.ylabel('Rating')
plt.title('Scatter Plot of Horsepower vs Rating')
plt.savefig('figure_1.png')
plt.show()
# #2
df2_clean = df2.dropna()
sns.set_style("whitegrid")
sns.pairplot(df2_clean, hue='Fuel', height=3)
plt.suptitle('Pairplot of df2', y=1.02)
plt.savefig('figure_2.png')
plt.show()
# #3
df1_clean = df1.dropna(subset=['Year', 'Price'])
plt.figure(figsize=(10, 6))
sns.scatterplot(x='Year', y='Price', hue='Brand', data=df1_clean)
plt.xlabel('Year')
plt.ylabel('Price')
plt.title('Scatter Plot of Year vs Price with Brand')
plt.savefig('figure_3.png')
plt.show()
# #4
plt.figure(figsize=(10, 6))
sns.violinplot(x='Fuel', y='Horsepower', data=df2.dropna(subset=['Fuel', 'Horsepower']))
plt.title('Violin Plot of Horsepower by Fuel Type')
plt.xlabel('Fuel Type')
plt.ylabel('Horsepower')
plt.savefig('figure_4.png')
plt.show()
# #5
plt.figure(figsize=(10, 6))
sns.boxplot(x='Engine_Type', y='Price', data=df1.dropna(subset=['Engine_Type', 'Price']))
plt.title('Boxplot of Price by Engine Type')
plt.xlabel('Engine Type')
plt.ylabel('Price')
plt.xticks(rotation=90)
plt.savefig('figure_5.png')
plt.show()
# #6
plt.figure(figsize=(10, 6))
sns.kdeplot(df2[df2['Fuel'] == 'Petrol']['Horsepower'].dropna(), label='Petrol', fill=True)
sns.kdeplot(df2[df2['Fuel'] == 'Diesel']['Horsepower'].dropna(), label='Diesel', fill=True)
plt.title('KDE Plot of Horsepower by Fuel Type')
plt.xlabel('Horsepower')
plt.legend()
plt.savefig('figure_6.png')
plt.show()
# #7
plt.figure(figsize=(10, 6))
sns.countplot(x='Transmission', data=df2.dropna(subset=['Transmission']))
plt.title('Countplot of Transmission Types')
plt.xlabel('Transmission Type')
plt.ylabel('Count')
plt.savefig('figure_7.png')
plt.show()
# #8
plt.figure(figsize=(10, 6))
df2_clean = df2.dropna(subset=['Fuel', 'Rating'])
df2_clean.groupby('Fuel')['Rating'].mean().plot(kind='bar', color='purple')
plt.title('Bar Plot of Average Rating by Fuel Type')
plt.xlabel('Fuel Type')
plt.ylabel('Average Rating')
plt.savefig('figure_8.png')
plt.show()
# #9
plt.figure(figsize=(10, 6))
df2['Horsepower'].dropna().plot(kind='hist', bins=30, color='teal', edgecolor='black')
plt.title('Histogram of Horsepower')
plt.xlabel('Horsepower')
plt.ylabel('Frequency')
plt.savefig('figure_9.png')
plt.show()
# #10
plt.figure(figsize=(10, 6))
df1_clean = df1.dropna(subset=['Year', 'Price'])
df1_clean.groupby('Year')['Price'].mean().plot(kind='line', marker='o', color='blue')
plt.title('Line Plot of Average Price by Year')
plt.xlabel('Year')
plt.ylabel('Average Price')
plt.savefig('figure_10.png')
plt.show()
# #11
merged_df = pd.merge(df1, df2, on='Brand', how='inner')
plt.figure(figsize=(10, 6))
sns.scatterplot(x='Rating', y='Price', hue='Fuel', data=merged_df)
plt.xlabel('Rating')
plt.ylabel('Price')
plt.title('Scatter Plot of Rating vs Price with Fuel Type')
plt.savefig('figure_11.png')
plt.show()
# #12
plt.figure(figsize=(10, 6))
sns.boxplot(x='Transmission', y='Horsepower', data=df2.dropna(subset=['Transmission', 'Horsepower']))
plt.title('Box Plot of Horsepower by Transmission Type')
plt.xlabel('Transmission Type')
plt.ylabel('Horsepower')
plt.savefig('figure_12.png')
plt.show()
# #13
plt.figure(figsize=(10, 6))
sns.countplot(y='Brand', data=df1, order=df1['Brand'].value_counts().index)
plt.title('Countplot of Brands')
plt.xlabel('Count')
plt.ylabel('Brand')
plt.savefig('figure_13.png')
plt.show()
# #14
df1_numeric = df1.select_dtypes(include=['float64', 'int64'])
scatter_matrix(df1_numeric, figsize=(10, 10), diagonal='kde', alpha=0.2)
plt.suptitle('Scatter Matrix of df1')
plt.tight_layout()
plt.savefig('figure_14.png')
plt.show()
# #15
# 谞讘爪注 诪讬讝讜讙 砖诇 df1 讜- df2
merged_df = pd.merge(df1, df2, on='Brand', how='inner')
# 谞讜讜讚讗 砖讗讬谉 注专讻讬诐 讞住专讬诐 讘注诪讜讚讜转 讛专诇讜讜谞讟讬讜转
merged_df = merged_df.dropna(subset=['Horsepower', 'Rating', 'Price', 'Fuel'])
# 讬爪讬专转 讙专祝 转诇转 诪诪讚讬
fig = px.scatter_3d(merged_df, x='Horsepower', y='Rating', z='Price', color='Fuel',
title='3D Scatter Plot of Horsepower, Rating, and Price by Fuel Type',
labels={'Horsepower': 'Horsepower', 'Rating': 'Rating', 'Price': 'Price'},
hover_name='Brand')
# 砖诪讬专转 讛讙专祝 讻拽讜讘抓
fig.write_html("figure_15.html")
fig.show()
# 砖诇讘 4.1: 讞诇讜拽讛 诇讗砖讻讜诇讜转
# 谞讬拽讜讬 谞讜住祝 砖诇 讛谞转讜谞讬诐 诇讗讞专 讛诪讬讝讜讙
merged_df = merged_df.dropna(subset=['Year', 'Price', 'Horsepower', 'Rating'])
data = merged_df[['Year', 'Price']]
# 谞专诪讜诇 讛谞转讜谞讬诐
scaler = StandardScaler()
data_scaled = scaler.fit_transform(data)
# 驻讜谞拽爪讬讛 诇讞讬砖讜讘 WCSS
def calculate_wcss(data):
wcss = []
for i in range(1, 11):
kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
kmeans.fit(data)
wcss.append(kmeans.inertia_)
return wcss
wcss = calculate_wcss(data_scaled)
plt.figure(figsize=(10, 5))
plt.plot(range(1, 11), wcss, marker='o', linestyle='--')
plt.title('Elbow Method For Optimal k')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.savefig('figure_elbow_method.png')
plt.show()
optimal_clusters = 3 # 注诇 驻讬 诪讘讞谉 讛诪专驻拽 诪讛讙专祝
kmeans = KMeans(n_clusters=optimal_clusters, random_state=0)
merged_df['Cluster'] = kmeans.fit_predict(data_scaled)
plt.figure(figsize=(10, 5))
sns.scatterplot(x='Year', y='Price', hue='Cluster', data=merged_df, palette='viridis')
plt.title('Clusters Visualization')
plt.savefig('figure_clusters.png')
plt.show()
# 砖诇讘 4.2: 专讙专住讬讛 诇讬谞讬讗专讬转
# 讘讞讬专转 注诪讜讚讜转 专诇讜讜谞讟讬讜转 诇专讙专住讬讛
X = merged_df[['Horsepower']]
y = merged_df['Price']
# 讛转讗诪转 讛诪讜讚诇
regressor = LinearRegression()
regressor.fit(X, y)
# 讞讬讝讜讬 注专讻讬诐
y_pred = regressor.predict(X)
# 爪讬讜专 讙专祝 讛专讙专住讬讛
plt.figure(figsize=(10, 5))
plt.scatter(X, y, color='blue')
plt.plot(X, y_pred, color='red', linewidth=2)
plt.title('Linear Regression: Horsepower vs. Price')
plt.xlabel('Horsepower')
plt.ylabel('Price')
plt.savefig('figure_regression.png')
plt.show()
# 讛爪讙转 诪拽讚诪讬 讛专讙专住讬讛
intercept = regressor.intercept_
coefficient = regressor.coef_
print(f'Intercept: {intercept}')
print(f'Coefficient: {coefficient}')
# 砖诇讘 4.3: 谞讬转讜讞 谞讜住祝 讘讗诪爪注讜转 Random Forest Regressor
features = merged_df[['Year', 'Horsepower', 'Rating']]
target = merged_df['Price']
X_train, X_test, y_train, y_test = train_test_split(features, target, test_size=0.3, random_state=42)
rf_regressor = RandomForestRegressor(n_estimators=100, random_state=42)
rf_regressor.fit(X_train, y_train)
y_pred = rf_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse}')
plt.figure(figsize=(10, 5))
plt.scatter(y_test, y_pred, color='blue')
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red', linestyle='--', linewidth=2)
plt.title('Random Forest Regression: Actual vs Predicted Prices')
plt.xlabel('Actual Prices')
plt.ylabel('Predicted Prices')
plt.savefig('figure_rf_regression.png')
plt.show()
# 谞讬转讜讞 拽讜专诇爪讬讛
correlation_matrix = merged_df[['Year', 'Horsepower', 'Rating', 'Price']].corr()
plt.figure(figsize=(10, 5))
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm', linewidths=0.5)
plt.title('Correlation Matrix')
plt.savefig('figure_correlation_matrix.png')
plt.show()