반응형
1. 데이터 분석 프로젝트 마무리
- 데이터 시각화, 분석, 머신러닝 모델 설계를 통한 매출 예측
- 몇 번을 갈아엎어 이제야 완료된거 같긴 한데 데이터 모으는게 제일 어려웠다.
데이터 분석 프로젝트
#라이브러리 불러오기
# pip install pandas, folium, plotly
import pandas as pd
import folium # 지도 불러오기 위한 라이브러리
import matplotlib.pyplot as plt #pie 그래프 라이브러리
import plotly.express as px #버블차트 라이브러리
import seaborn as sns
import matplotlib.font_manager as fm
from matplotlib import font_manager, rc
from sklearn import linear_model
import numpy as np
#plot 한글 깨짐
plt.rc('font', family='Malgun Gothic')
#막대그래프 한글 깨짐
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
real_data = pd.read_csv('C:/Users/User/Desktop/project/찐찐.csv',encoding="CP949")
#필요없는 컬럼변수(년도) 삭제
real_data = real_data.drop('년도',axis=1)
#결측치 확인
total = real_data.isnull().sum().sort_values(ascending=False)
percent = (real_data.isnull().sum()/real_data.isnull().count()).sort_values(ascending=False)
missing_data = pd.concat([total, percent], axis=1, keys=['Total', 'Percent'])
percent_data = percent.head(20)
percent_data.plot(kind="bar", figsize = (8,6), fontsize = 10)
plt.xlabel("", fontsize = 20)
plt.ylabel("", fontsize = 20)
plt.title("Total Missing Value (%)", fontsize = 20)
import missingno as msno
missingdata_df = real_data.columns[real_data.isnull().any()].tolist()
msno.heatmap(real_data[missingdata_df], figsize=(8,6))
plt.title("결측치 변수 간의 상관관계", fontsize = 20)
#결측치 mean으로 대체
data = real_data.fillna(real_data.mean())
#결측치 제거
data = data.dropna()
#data.to_csv('data.csv', encoding="CP949")
data_col = data.columns
data_col = data_col[1:15]
for i in data_col :
plt.boxplot(data[i])
plt.xlabel(i)
plt.show()
data = data[data['도로혼잡도']>0]
data = data[data['면적']<10000]
data = data[data['매출']>4000000000]
for i in data_col :
plt.boxplot(data[i])
plt.xlabel(i)
plt.show()
data_Y = data['매출']
#데이터프레임에 열 추가(방문효율, 접근지수)
data['방문효율'] = data['방문객수'] / data['유동인구수']
data['접근지수'] = data['인구'] * data['방문효율']
#boxplot을 사용한 이상치 처리
data_col = data.columns
data_col = data_col[1:15]
for i in data_col :
plt.boxplot(data[i])
plt.xlabel(i)
plt.show()
data = data[data['접근지수']<250000]
data = data[data['블로그수']<4000]
for i in data_col :
plt.boxplot(data[i])
plt.xlabel(i)
plt.show()
data.to_csv('c3.csv', encoding="CP949")
data_corr = data.corr(method='pearson')
#상관계수에 따른 히트맵
#0.7보다 크면 강한 상관관계
plt.subplots(figsize=(18,15))
sns.heatmap(data_corr, vmax=1,square=True)
data4 = data
data4 = data4.drop(['지점'], axis=1)
data4_corr = data4.corr(method='pearson')
y_corr = list(data4_corr.iloc[11])
y_co = list(data4.columns)
ind = np.arange(len(y_corr))
width = 0.2
fig, ax = plt.subplots(figsize=(6,20))
rects = ax.barh(ind, np.array(y_corr), color='red')
ax.set_yticks(ind+((width)/2.))
ax.set_yticklabels(y_co, rotation='horizontal', size = 15)
ax.set_xlabel("상관계수", size = 20)
ax.set_title("매출과의 상관관계", size = 20)
sns.lmplot(x="접근지수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="인구", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="면적", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="방문객수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="인구", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="유동인구수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="방문빈도수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="도로혼잡도", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="차선수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="블로그수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="생산인구수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="주변대형마트", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="차량수", y="매출", data=data, line_kws={'color':"red"})
sns.lmplot(x="방문효율", y="매출", data=data, line_kws={'color':"red"})
import statsmodels.api as sm
lm_model = sm.OLS(data['접근지수'].values.reshape(-1,1), data['매출'])
lm_result = lm_model.fit()
print(i, lm_result.summary())
X_data = data[['방문객수','인구','방문효율','접근지수']]
Y_data = data['매출']
linear_regression = linear_model.LinearRegression()
linear_regression.fit(X = pd.DataFrame(X_data), y = Y_data)
prediction = linear_regression.predict(X = pd.DataFrame(X_data))
print('a value = ', linear_regression.intercept_)
print('b value = ', linear_regression.coef_)
# 적합도 검증 - 잔차
residuals = Y_data-prediction
residuals.describe()
# 적합도 검증 - 결정계수
SSE = (residuals**2).sum()
SST = ((Y_data-Y_data.mean())**2).sum()
R_squared = 1 - (SSE/SST)
print('R_squared = ', R_squared)
#score 계산
from sklearn.metrics import mean_squared_error
print('score = ', linear_regression.score(X =pd.DataFrame(X_data), y=Y_data))
#매출에 영향을 주는 변수는 방문객수, 인구, 방문효율, 접근지수
data2 = data.sort_values(by='접근지수', ascending=False)
data2 = data2.drop_duplicates(['지점'], keep='first')
data2.to_csv('접근지수매출데이터.csv', encoding = "CP949")
#XGBoost
from xgboost import plot_importance
import xgboost as xgb ## XGBoost 불러오기
from xgboost import plot_importance ## Feature Importance를 불러오기 위함
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score
from sklearn.metrics import confusion_matrix, f1_score, roc_auc_score
from xgboost import XGBRegressor
import math
import warnings
#score 계산
def rmsle(y_pred, y_test) :
assert len(y_test) == len(y_pred)
return np.sqrt(np.mean((np.log(1+y_pred) - np.log(1+y_test))**0.1))
#매출을 제외한 데이터
data3 = data.drop(['지점','매출'],axis=1)
xgb_data_X = data3
xgb_data_Y = data['매출']
X_train, X_test, Y_train, Y_test = train_test_split(xgb_data_X, xgb_data_Y, test_size = 0.2, random_state = 11)
print(X_train.shape, X_test.shape)
print(Y_train.shape, Y_test.shape)
xgb = XGBRegressor(n_estimators=500, learning_rate = 0.005, max_depth = 5)
xgb.fit(X_train, Y_train)
xgb_pred = xgb.predict(X_test)
score = rmsle(Y_test, xgb_pred)
score
#Random Forest
rfc = RandomForestRegressor()
rfc.fit(X_train, Y_train)
rfc_pred = rfc.predict(X_test)
rfc_score = rmsle(Y_test, rfc_pred)
rfc_score
#Lasso
from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01,max_iter=10000).fit(X_train, Y_train)
lasso_pred = lasso.predict(X_test)
lasso_score = rmsle(Y_test, lasso_pred)
lasso_score
#Ridge
from sklearn.linear_model import Ridge
ridge = Ridge(alpha =0.01).fit(X_train,Y_train)
ridge_pred = ridge.predict(X_test)
ridge_score = rmsle(Y_test, ridge_pred)
ridge_score
#Decision Tree
from sklearn.tree import DecisionTreeRegressor
Decision = DecisionTreeRegressor(max_depth=7)
Decision.fit(X_train,Y_train)
Decision_pred = Decision.predict(X_test)
Decision_score = rmsle(Y_test, Decision_pred)
Decision_score
#ada Boosting
from sklearn.ensemble import AdaBoostRegressor
ada = AdaBoostRegressor()
ada.fit(X_train, Y_train)
ada_pred = ada.predict(X_test)
ada_score = rmsle(Y_test, ada_pred)
ada_score
Model_Name = ['XGBoost','Random Forest','Lasso','Ridge','Decision Tree','ADA Boosting']
Model_Score = [score, rfc_score,lasso_score, ridge_score, Decision_score, ada_score]
plt.figure(figsize = (15,10))
plt.title("머신러닝 모델 정확도", size = 30)
plt.xlabel("모델 이름", size = 20)
plt.ylabel("정확도", size = 20)
plt.xticks(size = 15)
plt.yticks(size = 15)
sns.barplot(Model_Name, Model_Score)
#plt.bar(Model_Name, Model_Score)
#라이브러리 불러오기
# pip install pandas, folium, plotly
import pandas as pd
import folium # 지도 불러오기 위한 라이브러리
import matplotlib.pyplot as plt #pie 그래프 라이브러리
import plotly.express as px #버블차트 라이브러리
import seaborn as sns
import matplotlib.font_manager as fm
from matplotlib import font_manager, rc
from sklearn import linear_model
import math
로컬푸드_접근지수_위치 = pd.read_csv('C:/Users/User/Desktop/project/접근지수매출데이터.csv',encoding="CP949")
로컬푸드_위치 = pd.read_csv('C:/Users/User/Desktop/project/로컬푸드위치.csv',encoding="CP949")
전북_주차장_데이터 = pd.read_csv('C:/Users/User/Desktop/project/전라북도 주차장.csv',encoding="CP949")
전북_주차장_데이터 = 전북_주차장_데이터.drop_duplicates(['지점'], keep='first')
#주차장 데이터 변수 drop
전북_주차장_데이터 = 전북_주차장_데이터.drop(['주차장관리번호','주차장구분','주차장유형','소재지도로명주소','급지구분','부제시행구분','운영요일','평일운영시작시각','평일운영종료시각', '토요일운영시작시각',
'토요일운영종료시각', '공휴일운영시작시각', '공휴일운영종료시각', '요금정보', '주차기본시간', '주차기본요금',
'추가단위시간', '추가단위요금', '1일주차권요금적용시간', '1일주차권요금', '월정기권요금', '결제방법', '특기사항',
'관리기관명', '전화번호','데이터기준일자','제공기관코드','제공기관명'],axis=1)
#주차구획수 기준 필터링
전북_주차장_데이터 = 전북_주차장_데이터[전북_주차장_데이터['주차구획수']>100]
전북_주차장_데이터 = 전북_주차장_데이터.dropna()
전북_주차장_데이터 = 전북_주차장_데이터.drop_duplicates(['주차장명'], keep="first")
로컬푸드_접근지수_위치['위도'] = 로컬푸드_위치['위도']
로컬푸드_접근지수_위치['경도'] = 로컬푸드_위치['경도']
로컬푸드_접근지수_위치 = 로컬푸드_접근지수_위치.drop('Unnamed: 0', axis=1)
plt.figure(figsize = (20,20))
plt.scatter(전북_주차장_데이터['위도'], 전북_주차장_데이터['경도'], marker='o', color = 'blue')
plt.scatter(로컬푸드_접근지수_위치['위도'], 로컬푸드_접근지수_위치['경도'], marker='o', color = 'red')
plt.figure(figsize = (20,20))
plt.scatter(전북_주차장_데이터['위도'], 전북_주차장_데이터['경도'], marker='o', color = 'blue')
plt.scatter(로컬푸드_접근지수_위치['위도'], 로컬푸드_접근지수_위치['경도'], marker='o', color = 'red')
로컬푸드_위치_위도 = list(로컬푸드_접근지수_위치['위도'])
로컬푸드_위치_경도 = list(로컬푸드_접근지수_위치['경도'])
전북_주차장_데이터_위도 = list(전북_주차장_데이터['위도'])
전북_주차장_데이터_경도 = list(전북_주차장_데이터['경도'])
from haversine import haversine
C = []
A = [로컬푸드_위치_위도[0], 로컬푸드_위치_경도[0]]
for i in range(len(전북_주차장_데이터_위도)) :
B = [전북_주차장_데이터_위도[i], 전북_주차장_데이터_경도[i]]
C.append(haversine(A, B, unit = 'km'))
전북_주차장_데이터['거리'] = C
전북_주차장_데이터 = 전북_주차장_데이터.sort_values(by = '거리')
전북_주차장_데이터['순위'] = [i for i in range(1,65)]
#loc를 사용하게 되면, concat을 하면서 no가 섞여 1~20까지 위도, 경도가 2개씩 나오므로, iloc를 통해 사용
#이건 나중에 지워도 됩니다.
location = folium.Map([로컬푸드_위치_위도[0], 로컬푸드_위치_경도[0]],
tiles = "OpenStreetMap",
zoom_start = 10)
folium.CircleMarker([로컬푸드_위치_위도[0], 로컬푸드_위치_경도[0]],
radius = 5,
color = "#0000FF",
fil_color = "#ffffff",
popup = "local").add_to(location)
for i in range(len(전북_주차장_데이터['위도'])) :
#주차장 써클
folium.CircleMarker(location=[전북_주차장_데이터['위도'].iloc[i], 전북_주차장_데이터['경도'].iloc[i]],
radius = 5,
color = "#FF0000",
fil_color = "#ffffff",
popup = "parking").add_to(location)
전북_주차장_데이터.to_csv('최종순위결과.csv', encoding = "CP949")
#라이브러리 불러오기
import pandas as pd
from matplotlib import pyplot as plt
import matplotlib.font_manager as fm
from matplotlib import font_manager, rc
import seaborn as sns
#plot 한글 깨짐
plt.rc('font', family='Malgun Gothic')
#막대그래프 한글 깨짐
font_name = font_manager.FontProperties(fname="c:/Windows/Fonts/malgun.ttf").get_name()
rc('font', family=font_name)
#접근지수매출데이터 csv 파일 불러오기
로컬푸드_접근지수_위치 = pd.read_csv('C:/Users/User/Desktop/project/접근지수매출데이터.csv',encoding="CP949")
#필요없는 컬럼변수 삭제
로컬푸드_접근지수_위치 = 로컬푸드_접근지수_위치.drop(['Unnamed: 0','면적','방문객수','인구','유동인구수','방문빈도수','도로혼잡도','차선수','블로그수','생산인구수','주변대형마트','차량수'], axis=1)
로컬푸드_매출 = 로컬푸드_접근지수_위치[['지점','매출']]
로컬푸드_매출 = 로컬푸드_매출.sort_values(by='매출', ascending = False)
로컬푸드_매출['순위'] = [i for i in range(1,33)]
로컬푸드_매출 = 로컬푸드_매출.head()
로컬푸드_접근지수 = 로컬푸드_접근지수_위치[['지점','접근지수']]
로컬푸드_접근지수 = 로컬푸드_접근지수.sort_values(by='접근지수', ascending = False)
로컬푸드_접근지수['순위'] = [i for i in range(1,33)]
로컬푸드_접근지수 = 로컬푸드_접근지수.head()
plt.figure(figsize = (8,8))
plt.title("지점간의 매출 순위", size = 30)
plt.xlabel('지점', size = 20)
plt.ylabel('매출', size = 20)
plt.xticks(rotation=90)
sns.barplot(로컬푸드_매출['지점'], 로컬푸드_매출['매출'])
plt.figure(figsize = (8,8))
plt.title("지점간의 접근지수 순위", size = 30)
plt.xlabel('지점', size = 20)
plt.ylabel('접근지수', size = 20)
plt.xticks(rotation=90)
sns.barplot(로컬푸드_접근지수['지점'], 로컬푸드_접근지수['접근지수'])
반응형
'자기개발 > TIL' 카테고리의 다른 글
TIL(Today I Learned) 20210119 (0) | 2021.01.20 |
---|---|
TIL(Today I Learned) 20210115 (0) | 2021.01.15 |
TIL(Today I Learned) 20210114 (0) | 2021.01.14 |
TIL(Today I Learned) 20210113 (0) | 2021.01.13 |
TIL(Today I Learned) 20200919 ~ 20200921 (0) | 2020.09.21 |
TIL(Today I Learned) 20200918 (0) | 2020.09.18 |
TIL(Today I Learned) 20200917 (0) | 2020.09.18 |
TIL(Today I Learned) 20200916 (0) | 2020.09.16 |
최근댓글