어제에 이어서 오늘도 프로젝트에 사용할 데이터 분석 자료를 올리려고 한다.  

2018/04/26 - [프로젝트] - [프로젝트 데이터 분석] 상권분석을 위한 서울시 골목상권 프로파일링 정보(상권배후지-추정매출) in R - MongoDB



이 자료는 최종적으로 더 나은 매개변수를 선택하여 머신러닝을 하는데 도움을 줄 자료이다.


현재 집에는 데이터가 없으므로 코드만 올리도록 하겠다.


20180427 금일 실제 데이터가 나오는 것, 시각화가 되는 것을 확인했다.


.R 자료도 첨부한다.


MongoDB_R_Connection.R

Analysis_by_sales_data.R




=============================== R ===============================



##산점도를 이용하여 sales 데이터를 분석

##MongoDB_R_Commection.R 에서 만들어진 자료를 사용.

 

##데이터 정제

#데이터 정제를 위한 라이브러리 등록

library("dplyr")

 

#데이터가 0, 음수면 잘못된 값이기 때문에 그런 값들을 없애준다.

#없애기 전 데이터

dim(df) #29970 84

df_filter_age <- df %>% filter(!(AGRDE_10_SELNG_AMT <= 0) ) %>% 

  filter(!(AGRDE_20_SELNG_AMT <= 0)) %>% filter(!(AGRDE_30_SELNG_AMT <= 0)) %>% 

  filter(!(AGRDE_40_SELNG_AMT <= 0)) %>% filter(!(AGRDE_50_SELNG_AMT <= 0)) %>% 

  filter(!(AGRDE_60_ABOVE_SELNG_AMT <= 0))%>% filter(!(THSMON_SELNG_AMT <= 0))

dim(df_filter_age) #22852 84

 

#반응형 그래프를 그리기 위해 라이브러리 등록

library("ggplot2")

library("plotly")

 

# x축을 매출금액 으로 잡고 이것에 대한 변화량을

# y1 = 연령대 금액

# y2 = 시간대 금액

# y3 = 요일 금액

# 위와 같이 설정하여 분석한다.

#THSMON_SELNG_AMT: 당월_매출_금액

 

 

 

#1.###########################매출금액과 연령대 별 매출 금액의 관계

# AGRDE_10_SELNG_AMT: 연령대_10_매출_금액

# AGRDE_20_SELNG_AMT: 연령대_20_매출_금액

# AGRDE_30_SELNG_AMT: 연령대_30_매출_금액

# AGRDE_40_SELNG_AMT: 연령대_40_매출_금액

# AGRDE_50_SELNG_AMT: 연령대_50_매출_금액

# AGRDE_60_ABOVE_SELNG_AMT: 연령대_60_이상_매출_금액

 

#그래프 그리기

age_10 <- ggplot(df_filter_age, aes(x = THSMON_SELNG_AMT, AGRDE_10_SELNG_AMT)) + geom_point()

age_10

#데이터 확인 결과 점들이 앞부분에 몰려있어 제대로 된 데이터 분석이 어려워 상용로그를 취해 데이터 분포를 줄인다. 

age_10 <- ggplot(df_filter_age, aes(x = log10(THSMON_SELNG_AMT), log10(AGRDE_10_SELNG_AMT))) + geom_point()

age_20 <- ggplot(df_filter_age, aes(x = log10(THSMON_SELNG_AMT), log10(AGRDE_20_SELNG_AMT))) + geom_point()

age_30 <- ggplot(df_filter_age, aes(x = log10(THSMON_SELNG_AMT), log10(AGRDE_30_SELNG_AMT))) + geom_point()

age_40 <- ggplot(df_filter_age, aes(x = log10(THSMON_SELNG_AMT), log10(AGRDE_40_SELNG_AMT))) + geom_point()

age_50 <- ggplot(df_filter_age, aes(x = log10(THSMON_SELNG_AMT), log10(AGRDE_50_SELNG_AMT))) + geom_point()

above_age_60 <- ggplot(df_filter_age, aes(x = log10(THSMON_SELNG_AMT), log10(AGRDE_60_ABOVE_SELNG_AMT))) + geom_point()

#각 그래프를 출력해본다. 

age_10

age_20

age_30

age_40

age_50

above_age_60

 

##모든 그래프가 양적상관관계를 가지고 있다.

 

#어떤 회귀분석 모델을 사용할지 결정을 하기 위해 상관관계분석을 해본다.

df_amt_by_age <- df_filter_age %>% select(THSMON_SELNG_AMT, AGRDE_10_SELNG_AMT, AGRDE_20_SELNG_AMT, AGRDE_30_SELNG_AMT, AGRDE_40_SELNG_AMT, AGRDE_50_SELNG_AMT, AGRDE_60_ABOVE_SELNG_AMT)

df_amt_by_age_cor <- cor(df_amt_by_age)

#데이터를 출력해본다.

df_amt_by_age_cor

corrplot(df_amt_by_age_cor)

 

##0.5이상의 강한 상관관계가 나오므로 선형회귀분석을 이용하여도 충분한 자료를 얻을 수 있다고 판단.

#각 그래프에 선형회귀 분석을 한다.

age_10_lm <- age_10 + geom_smooth(method="lm")

age_20_lm <- age_20 + geom_smooth(method="lm")

age_30_lm <- age_30 + geom_smooth(method="lm")

age_40_lm <- age_40 + geom_smooth(method="lm")

age_50_lm <- age_50 + geom_smooth(method="lm")

above_age_60_lm <- above_age_60 + geom_smooth(method="lm")

#그래프를 출력해본다.

age_10_lm

age_20_lm 

age_30_lm

age_40_lm

age_50_lm

above_age_60_lm

 

#선형회귀분석 summary를 얻기 위한 객체를 만든다.

age_10_lm_summ <- lm( log10(AGRDE_10_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter)

age_20_lm_summ <- lm( log10(AGRDE_20_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter)

age_30_lm_summ <- lm( log10(AGRDE_30_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter)

age_40_lm_summ <- lm( log10(AGRDE_40_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter)

age_50_lm_summ <- lm( log10(AGRDE_50_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter)

above_age_60_lm_summ <- lm( log10(AGRDE_60_ABOVE_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter)

#각각의 summary를 확인 

summary(age_10_lm_summ)

summary(age_20_lm_summ)

summary(age_30_lm_summ)

summary(age_40_lm_summ)

summary(age_50_lm_summ)

summary(above_age_60_lm_summ)

 

 

 

 

 

 

 

 

#2.###########################매출금액과 시간대 별 매출 금액의 관계

# TMZON_00_06_SELNG_AMT: 시간대_00~06_매출_금액

# TMZON_06_11_SELNG_AMT: 시간대_06~11_매출_금액

# TMZON_11_14_SELNG_AMT: 시간대_11~14_매출_금액

# TMZON_14_17_SELNG_AMT: 시간대_14~17_매출_금액

# TMZON_17_21_SELNG_AMT: 시간대_17~21_매출_금액

# TMZON_21_24_SELNG_AMT: 시간대_21~24_매출_금액

 

#데이터 정제

dim(df) #29970 84

df_filter_time <- df %>% filter(!(TMZON_00_06_SELNG_AMT <= 0) ) %>% 

  filter(!(TMZON_06_11_SELNG_AMT <= 0)) %>% filter(!(TMZON_11_14_SELNG_AMT <= 0)) %>% 

  filter(!(TMZON_14_17_SELNG_AMT <= 0)) %>% filter(!(TMZON_17_21_SELNG_AMT <= 0)) %>% 

  filter(!(TMZON_21_24_SELNG_AMT <= 0))%>% filter(!(THSMON_SELNG_AMT <= 0))

dim(df_filter_time) #15371 84

 

#그래프 그리기

time_00_06 <- ggplot(df_filter_time, aes(x = THSMON_SELNG_AMT, TMZON_00_06_SELNG_AMT)) + geom_point()

time_00_06

#데이터 확인 결과 점들이 앞부분에 몰려있어 제대로 된 데이터 분석이 어려워 상용로그를 취해 데이터 분포를 줄인다. 

time_00_06 <- ggplot(df_filter_time, aes(x = log10(THSMON_SELNG_AMT), log10(TMZON_00_06_SELNG_AMT))) + geom_point()

time_06_11 <- ggplot(df_filter_time, aes(x = log10(THSMON_SELNG_AMT), log10(TMZON_06_11_SELNG_AMT))) + geom_point()

time_11_14 <- ggplot(df_filter_time, aes(x = log10(THSMON_SELNG_AMT), log10(TMZON_11_14_SELNG_AMT))) + geom_point()

time_14_17 <- ggplot(df_filter_time, aes(x = log10(THSMON_SELNG_AMT), log10(TMZON_14_17_SELNG_AMT))) + geom_point()

time_17_21 <- ggplot(df_filter_time, aes(x = log10(THSMON_SELNG_AMT), log10(TMZON_17_21_SELNG_AMT))) + geom_point()

time_21_24 <- ggplot(df_filter_time, aes(x = log10(THSMON_SELNG_AMT), log10(TMZON_21_24_SELNG_AMT))) + geom_point()

#각 그래프를 출력해본다. 

time_00_06

time_06_11

time_11_14

time_14_17

time_17_21

time_21_24

 

##모든 그래프가 양적상관관계를 가지고 있다.

 

#어떤 회귀분석 모델을 사용할지 결정을 하기 위해 상관관계분석을 해본다.

df_amt_by_time <- df_filter_time %>% select(THSMON_SELNG_AMT, TMZON_00_06_SELNG_AMT, TMZON_06_11_SELNG_AMT, TMZON_11_14_SELNG_AMT, TMZON_14_17_SELNG_AMT, TMZON_17_21_SELNG_AMT, TMZON_21_24_SELNG_AMT)

df_amt_by_time_cor <- cor(df_amt_by_time)

#데이터를 출력해본다.

df_amt_by_time_cor

corrplot(df_amt_by_time_cor)

 

##0.5이상의 강한 상관관계가 나오므로 선형회귀분석을 이용하여도 충분한 자료를 얻을 수 있다고 판단.

#각 그래프에 선형회귀 분석을 한다.

time_00_06_lm <- time_00_06 + geom_smooth(method = "lm")

time_06_11_lm <- time_06_11 + geom_smooth(method = "lm")

time_11_14_lm <- time_11_14 + geom_smooth(method = "lm")

time_14_17_lm <- time_14_17 + geom_smooth(method = "lm")

time_17_21_lm <- time_17_21 + geom_smooth(method = "lm")

time_21_24_lm <- time_21_24 + geom_smooth(method = "lm")

#그래프를 출력해본다

time_00_06_lm

time_06_11_lm

time_11_14_lm

time_14_17_lm

time_17_21_lm

time_21_24_lm

 

#선형회귀분석 summary를 얻기 위한 객체를 만든다.

time_00_06_lm_summ <- lm( log10(TMZON_00_06_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_time)

time_06_11_lm_summ <- lm( log10(TMZON_06_11_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_time)

time_11_14_lm_summ <- lm( log10(TMZON_11_14_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_time)

time_14_17_lm_summ <- lm( log10(TMZON_14_17_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_time)

time_17_21_lm_summ <- lm( log10(TMZON_17_21_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_time)

time_21_24_lm_summ <- lm( log10(TMZON_21_24_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_time)

#각각의 summary를 확인 

summary(time_00_06_lm_summ)

summary(time_06_11_lm_summ)

summary(time_11_14_lm_summ)

summary(time_14_17_lm_summ)

summary(time_17_21_lm_summ)

summary(time_21_24_lm_summ)

 

 

 

 

 

 

 

 

#3.###########################매출금액과 요일 별 매출 금액의 관계

# MON_SELNG_AMT: 월요일_매출_금액

# TUES_SELNG_AMT: 화요일_매출_금액

# WED_SELNG_AMT: 수요일_매출_금액

# THUR_SELNG_AMT: 목요일_매출_금액

# FRI_SELNG_AMT: 금요일_매출_금액

# SAT_SELNG_AMT: 토요일_매출_금액

# SUN_SELNG_AMT: 일요일_매출_금액

 

#데이터 정제

dim(df) #29970 84

df_filter_day <- df %>% filter(!(MON_SELNG_AMT <= 0) ) %>% 

  filter(!(TUES_SELNG_AMT <= 0)) %>% filter(!(WED_SELNG_AMT <= 0)) %>% 

  filter(!(THUR_SELNG_AMT <= 0)) %>% filter(!(FRI_SELNG_AMT <= 0)) %>% 

  filter(!(SAT_SELNG_AMT <= 0)) %>% filter(!(SUN_SELNG_AMT <= 0)) %>% 

  filter(!(THSMON_SELNG_AMT <= 0))

dim(df_filter_day) #25751 84

 

#그래프 그리기

mon <- ggplot(df_filter_day, aes(x = THSMON_SELNG_AMT, MON_SELNG_AMT)) + geom_point()

mon

#데이터 확인 결과 점들이 앞부분에 몰려있어 제대로 된 데이터 분석이 어려워 상용로그를 취해 데이터 분포를 줄인다. 

mon <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(MON_SELNG_AMT))) + geom_point()

tues <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(TUES_SELNG_AMT))) + geom_point()

wed <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(WED_SELNG_AMT))) + geom_point()

thur <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(THUR_SELNG_AMT))) + geom_point()

fri <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(FRI_SELNG_AMT))) + geom_point()

sat <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(SAT_SELNG_AMT))) + geom_point()

sun <- ggplot(df_filter_day, aes(x = log10(THSMON_SELNG_AMT), log10(SUN_SELNG_AMT))) + geom_point()

#각 그래프를 출력해본다. 

mon

tues

wed

thur

fri

sat

sun

 

##모든 그래프가 양적상관관계를 가지고 있다.

 

 

 

 

 

#상관관계분석을 해본다.

df_amt_by_day <- df_filter_day %>% select(THSMON_SELNG_AMT, MON_SELNG_AMT, TUES_SELNG_AMT, WED_SELNG_AMT, THUR_SELNG_AMT, FRI_SELNG_AMT, SAT_SELNG_AMT, SUN_SELNG_AMT)

df_amt_by_day_cor <- cor(df_amt_by_day)

#데이터를 출력해본다.

df_amt_by_day_cor

corrplot(df_amt_by_day_cor)

 

##사실상 모두 0.8이상의 아주 강한 상관관계가 있어 의미없는 데이터라고 판단된다

##주중보다 주말이 더 상관관계가 높다는 것은 이미 앞에서 밝힌 바 있다.

 

 

 

 

##이하 그냥 해보는 것

#각 그래프에 선형회귀 분석을 한다.

mon_lm <- mon + geom_smooth(method = "lm")

tues_lm <- tues + geom_smooth(method = "lm")

wed_lm <- wed + geom_smooth(method = "lm")

thur_lm <- thur + geom_smooth(method = "lm")

fri_lm <- fri + geom_smooth(method = "lm")

sat_lm <- sat + geom_smooth(method = "lm")

sun_lm <- sun + geom_smooth(method = "lm")

 

#그래프를 출력해본다

mon_lm

tues_lm

wed_lm

thur_lm

fri_lm

sat_lm

sun_lm

 

#선형회귀분석 summary를 얻기 위한 객체를 만든다.

mon_lm_summ <- lm( log10(MON_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

tues_lm_summ <- lm( log10(TUES_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

wed_lm_summ <- lm( log10(WED_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

thur_lm_summ <- lm( log10(THUR_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

fri_lm_summ <- lm( log10(FRI_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

sat_lm_summ <- lm( log10(SAT_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

sun_lm_summ <- lm( log10(SUN_SELNG_AMT) ~ log10(THSMON_SELNG_AMT), data = df_filter_day)

 

#각각의 summary를 확인 

summary(mon_lm_summ)

summary(tues_lm_summ)

summary(wed_lm_summ)

summary(thur_lm_summ)

summary(fri_lm_summ)

summary(sat_lm_summ)

summary(sun_lm_summ)



=============================== R ===============================




오늘 분석 자료도 큰 의미가 있는 자료는 아니었다.


상식적으로 상관관계가 높을 것이라 예상되기 때문이다. 


다만 실제 확인하는 것과 직감적으로 아는 것은 차이가 있기에 의미가 있었다고 할 수 있다.


그리고 오늘의 자료는 내일 두 자료를 join시키는데 이용할 것이기 때문에 데이터 확인을 위해 꼭 필요한 작업이었다.



내일은 더 나은 분석과 웹 프로그래밍을 할 수 있기를 바란다.



+ Recent posts