킥스타터(영어: Kickstarter)는 2009년 시작된 미국의 크라우드 펀딩 서비스이다. 영화, 음악, 공연예술, 만화, 비디오게임 등 다양한 분야 프로젝트의 투자를 유치했다. 프로젝트에 기부하여 일정금액이 넘으면 돈을 제공하고, 목표액을 넘지 못하면 투자를 하지 않아도 된다. 투자자는 돈이 아닌 해당 시제품, 감사인사, 티셔츠, 작가와의 식사 등 다른 유무형 형태의 보상을 받는다.
더 자세한 정보를 원한다면 https://www.kickstarter.com/
1) Data Analysis
- 킥스타터 고객들의 특성을 분석
- 킥스타터에서 성공/실패한 프로젝트의 특성을 분석
2) Data Analytics
- Decision Tree를 활용하여 성공/실패한 프로젝트의 유형을 살펴보고 프로젝트의 성공을 위한 제안 제시
- Load Libraries
- Load & Overview data
ksdata <- read.csv("./input/ks-projects-201801.csv", fileEncoding="latin1")
fillColor = "#FFA07A"
fillColor2 = "#F1C40F"
str(ksdata)
## 'data.frame': 378661 obs. of 15 variables:
## $ ID : int 1000002330 1000003930 1000004038 1000007540 1000011046 1000014025 1000023410 1000030581 1000034518 100004195 ...
## $ name : Factor w/ 375765 levels ""," ITâ\u0080\u0099S A HOT CAPPUCCINO NIGHT ",..: 332538 135688 364964 344805 77347 206129 293461 69358 284136 290718 ...
## $ category : Factor w/ 159 levels "3D Printing",..: 109 94 94 91 56 124 59 42 114 40 ...
## $ main_category : Factor w/ 15 levels "Art","Comics",..: 13 7 7 11 7 8 8 8 5 7 ...
## $ currency : Factor w/ 14 levels "AUD","CAD","CHF",..: 6 14 14 14 14 14 14 14 14 14 ...
## $ deadline : Factor w/ 3164 levels "2009-05-03","2009-05-16",..: 2288 3042 1333 1017 2247 2463 1996 2448 1790 1863 ...
## $ goal : num 1000 30000 45000 5000 19500 50000 1000 25000 125000 65000 ...
## $ launched : Factor w/ 378089 levels "1970-01-01 01:00:00",..: 243292 361975 80409 46557 235943 278600 187500 274014 139367 153766 ...
## $ pledged : num 0 2421 220 1 1283 ...
## $ state : Factor w/ 6 levels "canceled","failed",..: 2 2 2 2 1 4 4 2 1 1 ...
## $ backers : int 0 15 3 1 14 224 16 40 58 43 ...
## $ country : Factor w/ 23 levels "AT","AU","BE",..: 10 23 23 23 23 23 23 23 23 23 ...
## $ usd.pledged : num 0 100 220 1 1283 ...
## $ usd_pledged_real: num 0 2421 220 1 1283 ...
## $ usd_goal_real : num 1534 30000 45000 5000 19500 ...
kable(head(ksdata, 5))
| ID | name | category | main_category | currency | deadline | goal | launched | pledged | state | backers | country | usd.pledged | usd_pledged_real | usd_goal_real |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1000002330 | The Songs of Adelaide & Abullah | Poetry | Publishing | GBP | 2015-10-09 | 1000 | 2015-08-11 12:12:28 | 0 | failed | 0 | GB | 0 | 0 | 1533.95 |
| 1000003930 | Greeting From Earth: ZGAC Arts Capsule For ET | Narrative Film | Film & Video | USD | 2017-11-01 | 30000 | 2017-09-02 04:43:57 | 2421 | failed | 15 | US | 100 | 2421 | 30000.00 |
| 1000004038 | Where is Hank? | Narrative Film | Film & Video | USD | 2013-02-26 | 45000 | 2013-01-12 00:20:50 | 220 | failed | 3 | US | 220 | 220 | 45000.00 |
| 1000007540 | ToshiCapital Rekordz Needs Help to Complete Album | Music | Music | USD | 2012-04-16 | 5000 | 2012-03-17 03:24:11 | 1 | failed | 1 | US | 1 | 1 | 5000.00 |
| 1000011046 | Community Film Project: The Art of Neighborhood Filmmaking | Film & Video | Film & Video | USD | 2015-08-29 | 19500 | 2015-07-04 08:35:03 | 1283 | canceled | 14 | US | 1283 | 1283 | 19500.00 |
#kable(tail(ksdata, 5))
- Checking for any missing values
options(repr.plot.width=6, repr.plot.height=8)
missing_data <- ksdata %>% summarise_all(funs(sum(is.na(.))/n()))
missing_data <- gather(missing_data, key = "variables", value = "percent_missing")
ggplot(missing_data, aes(x = reorder(variables, percent_missing), y = percent_missing)) +
geom_bar(stat = "identity", fill = "red", aes(color = I('white')), size = 0.1)+coord_flip()+ theme_few()
sapply(ksdata, function(x) sum(is.na(x)))
## ID name category main_category
## 0 0 0 0
## currency deadline goal launched
## 0 0 0 0
## pledged state backers country
## 0 0 0 0
## usd.pledged usd_pledged_real usd_goal_real
## 3797 0 0
’usd.pledged’에 대한 N/A 값만 존재하는 것으로 보인다. ’usd_pledged_real’을 사용할 것이므로 이 열을 제거하고 ’usd_pledged_real’의 이름을 ’usd_pledged’로 바꾼다. 마찬가지로, ’usd_goal_real’을 사용하여 동일한 작업을 수행하고 ’usd_goal’이라는 이름을 지정한다.
ksdata <- ksdata[,-13]
colnames(ksdata)[13] <- "usd_pledged"
colnames(ksdata)[14] <- "usd_goal"
이 질문은 프로젝트 스타터의 관점에서 카테고리 (데이터 집합의 main_category라고 함)와 하위 카테고리 (데이터 집합의 카테고리라고 함)의 두 가지 수준을 기준으로 답한다. 먼저 카테고리별로 프로젝트 수를 조사해보겠다.
cat.freq <- ksdata %>%
group_by(main_category) %>%
summarize(count=n()) %>%
arrange(desc(count))
cat.freq$main_category <- factor(cat.freq$main_category, levels=cat.freq$main_category)
ggplot(cat.freq, aes(main_category, count, fill=count)) + geom_bar(stat="identity") +
ggtitle("Projects by Category") + xlab("Project Category") + ylab("Frequency") +
geom_text(aes(label=count), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
’Film & Video’는 가장 인기있는 프로젝트 범주에 속하며 가장 인기가 적은 카테고리는 ’Dance’이다. 이제 하위 범주에 대해 동일한 작업을 수행할 것이다. 개별적으로 플롯하기에는 너무 많은(159개의) 하위 카테고리가 있으므로 가장 많은 수의 프로젝트로 10 개의 하위 카테고리를 볼 것이다.
subcat.freq <- ksdata %>%
group_by(category) %>%
summarize(count=n()) %>%
arrange(desc(count))
subcat.freq$category <- factor(subcat.freq$category, levels=subcat.freq$category)
ggplot(head(subcat.freq, 10), aes(category, count, fill=count)) + geom_bar(stat="identity") +
ggtitle("Projects by Subcategory") + xlab("Project Subcategory") + ylab("Frequency") +
geom_text(aes(label=count), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
‘Product Design’은 여기에서 가장 인기있는 하위 범주이며 ’Design’ 범주에 속한다.
# Converting the launch and deadline Dates to correct format:
ksdata$launch_date <- as.Date(ksdata$launched, "%Y-%m-%d")
ksdata$deadline_date <- as.Date(ksdata$deadline, "%Y-%m-%d")
# also addding month and year columns for the deadline and launch dates:
ksdata$launch_year <- substr(ksdata$launched, 1,4)
ksdata$launch_mth <- substr(ksdata$launch_date, 1,7)
ksdata$final_year <- substr(ksdata$deadline,1,4)
ksdata$final_mth <- substr(ksdata$deadline, 1, 7)
ggplot(data=ksdata, aes(x=launch_year)) +
geom_bar(colour="black", fill=fillColor2) +
ylab('Count') +
facet_wrap(~main_category) +
theme(axis.text.x = element_text(angle = 90, hjust = 1)) +
theme_minimal()
위의 질문과 비슷하게 느껴질 수 있지만, 후원자의 관점에서 가장 인기 있는 프로젝트를 금액 기준으로 정렬해보았다(상위 15개).
kable(head(ksdata[order(-ksdata$usd_pledged), c(2,3,13)], 15))
| name | category | usd_pledged | |
|---|---|---|---|
| 157271 | Pebble Time - Awesome Smartwatch, No Compromises | Product Design | 20338986 |
| 250255 | COOLEST COOLER: 21st Century Cooler that’s Actually Cooler | Product Design | 13285226 |
| 216630 | Pebble 2, Time 2 + All-New Pebble Core | Product Design | 12779843 |
| 289916 | Kingdom Death: Monster 1.5 | Tabletop Games | 12393140 |
| 282417 | Pebble: E-Paper Watch for iPhone and Android | Product Design | 10266846 |
| 293862 | The World’s Best TRAVEL JACKET with 15 Features || BAUBAX | Product Design | 9192056 |
| 187653 | Exploding Kittens | Tabletop Games | 8782572 |
| 6666 | OUYA: A New Kind of Video Game Console | Gaming Hardware | 8596475 |
| 309631 | THE 7th CONTINENT â What Goes Up, Must Come Down. | Tabletop Games | 7072757 |
| 271277 | The Everyday Backpack, Tote, and Sling | Product Design | 6565782 |
| 75901 | Fidget Cube: A Vinyl Desk Toy | Product Design | 6465690 |
| 368574 | Shenmue 3 | Video Games | 6333296 |
| 30042 | Pono Music - Where Your Soul Rediscovers Music | Sound | 6225355 |
| 89482 | Bring Back MYSTERY SCIENCE THEATER 3000 | Television | 5764229 |
| 148586 | The Veronica Mars Movie Project | Narrative Film | 5702153 |
여기에 있는 많은 프로젝트가 Product Design 하위 범주에 속한다. 마찬가지로, 가장 많은 후원자가 있는 프로젝트의 상위 15 개 프로젝트를 나열해 보겠다.
kable(head(ksdata[order(-ksdata$backers), c(2,3,11)], 15))
| name | category | backers | |
|---|---|---|---|
| 187653 | Exploding Kittens | Tabletop Games | 219382 |
| 75901 | Fidget Cube: A Vinyl Desk Toy | Product Design | 154926 |
| 292245 | Bring Reading Rainbow Back for Every Child, Everywhere! | Web | 105857 |
| 148586 | The Veronica Mars Movie Project | Narrative Film | 91585 |
| 182658 | Double Fine Adventure | Video Games | 87142 |
| 23405 | Bears vs Babies - A Card Game | Tabletop Games | 85581 |
| 157271 | Pebble Time - Awesome Smartwatch, No Compromises | Product Design | 78471 |
| 239176 | Torment: Tides of Numenera | Video Games | 74405 |
| 272925 | Project Eternity | Video Games | 73986 |
| 38292 | Yooka-Laylee - A 3D Platformer Rare-vival! | Video Games | 73206 |
| 215085 | ZNAPS -The $9 Magnetic Adapter for your mobile devices | Technology | 70122 |
| 368574 | Shenmue 3 | Video Games | 69320 |
| 282417 | Pebble: E-Paper Watch for iPhone and Android | Product Design | 68929 |
| 293644 | Mighty No. 9 | Video Games | 67226 |
| 216630 | Pebble 2, Time 2 + All-New Pebble Core | Product Design | 66673 |
가장 일반적인 하위 카테고리는 Video Games인 것으로 보인다. 이제는 각 카테고리에 대해 기부된 금액을 집계하여 총 금액을 확인할 것이다.
pledged.tot <- ksdata %>%
group_by(main_category) %>%
summarize(total=sum(usd_pledged)) %>%
arrange(desc(total))
pledged.tot$main_category <- factor(pledged.tot$main_category, levels=pledged.tot$main_category)
ggplot(pledged.tot, aes(main_category, total/1000000, fill=total)) + geom_bar(stat="identity") +
ggtitle("Total Amount Pledged by Category") + xlab("Project Category") +
ylab("Amount Pledged (USD millions)") +
geom_text(aes(label=paste0("$", round(total/1000000,1))), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
‘Games’, ‘Design’, ’Technology’는 지금까지 가장 높은 수익을 올리는 범주이다. 후원자 수(객단가)를 고려하는 것이 중요하므로 각 카테고리에 대해 후원자 당 보장되는 평균 금액을 봐야한다. 각 카테고리에 대해 기부 된 총액을 각 카테고리에 대한 후원자 수로 나누어 계산한다.
pledged.avg <- ksdata %>%
group_by(main_category) %>%
summarize(pledged=sum(usd_pledged), backers=sum(backers)) %>%
mutate(avg=pledged/backers) %>%
arrange(desc(avg))
pledged.avg$main_category <- factor(pledged.avg$main_category, levels=pledged.avg$main_category)
ggplot(pledged.avg, aes(main_category, avg, fill=avg)) + geom_bar(stat="identity") +
ggtitle("Average Amount Pledged per Backer") + xlab("Project Category") +
ylab("Amount Pledged (USD)") +
geom_text(aes(label=paste0("$", round(avg,2))), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
‘Technology’는 1인당 평균 후원금액이 가장 높은 반면, ’Comics’는 가장 적은 금액을 보였다. 흥미로운 점은 ’Games’의 경우 (이전 그래프에서 볼 수 있듯) 총액이 많았지만 ’Technology의’ 평균과 2배 정도 차이가 난다.
이어서 박스 플롯을 사용하여 개별 프로젝트에 대해 약속된 금액의 분배를 검토할 것이다. 이상치가 많은(자금 조달이 거의 없거나 엄청나게 많은) 프로젝트들로 인해 박스 플롯이 맨 아래에 삐걱 거리는 것처럼 보일 것이다.
ggplot(ksdata, aes(main_category, usd_pledged, fill=main_category)) + geom_boxplot() +
ggtitle("Amount Pledged vs. Project Category") + xlab("Project Category") +
ylab("Amount Pledged (USD)") +
theme(plot.title=element_text(size=15, face="bold", hjust=0.5),
axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
coord_cartesian(ylim=c(0,20000))
‘Design’과 ’Games’는 다른 카테고리에 비해 상위 4분위수를 가지고 있다. ’Design’, ‘Dance’, ’Theater’는 다른 카테고리에 비해 평균 금액이 높다. ’Comics’는 놀갑게도 상위 4분위수와 중간값을 가지고 있는데, 비록 다른 카테고리와 비교해 볼 때 금액이 낮고(총계와 중앙값 모두), 1인당 후원금액 또한 낮았으므로, 이 카테고리는 개별 프로젝트 마다 평균 후원자의 수가 상대적으로 많아야 한다는 것을 알 수 있다. 한편 ’Technology’는 (총계와 평균치 모두) 많았음에도 불구하고 중앙값이 낮다. 이를 통해 이상치가 많이 있음을 시사한다. ’Crafts’와 ’Journalism’은 다른 범주에 비해 매우 작은 IQR과 낮은 중간 값을 가지고 있다.
자금 목표가 가장 높은 상위 15개 프로젝트를 살펴보겠다.
kable(head(ksdata[order(-ksdata$usd_goal), c(2,3,14,10)], 15))
| name | category | usd_goal | state | |
|---|---|---|---|---|
| 47804 | FUCK Potato Salad. Paleo Potato Brownies! | Food | 166361391 | failed |
| 196532 | A Celtic Lovestory | Drama | 151395870 | failed |
| 367929 | Hydroponic’s Skyscraper(un gratte-ciel hydroponique)e-solar | Technology | 110169772 | failed |
| 222209 | DER NEANDERTALER (Kinofilm mit Starbesetzung in 3D) | Movie Theaters | 107369868 | failed |
| 226162 | Kitchen from Austria in Switzerland | Restaurants | 104057190 | failed |
| 23470 | Help me start a fair media company, Trump Media | Video | 100000000 | failed |
| 33085 | Sage: Warrior Of The Fallen Gods (Movie) | Fantasy | 100000000 | failed |
| 55010 | Kybernan Holographic Gaming Network | Video Games | 100000000 | failed |
| 72776 | Art Is Fabulous | Art | 100000000 | failed |
| 72991 | Wax Apple | Documentary | 100000000 | failed |
| 77677 | Bring back Pontiac | Technology | 100000000 | failed |
| 145944 | Let’s prove the earth is FLAT! (Suspended) (Suspended) | Video | 100000000 | suspended |
| 158460 | The Return Of The Bell Witch Movie | Shorts | 100000000 | failed |
| 160292 | The Book on Comedy 10 GABAGILLTRILLBILLIOPLEXIAN!!!!!!!!!!!! | Comics | 100000000 | failed |
| 211027 | Virtual Reality Playground in Buffalo, NY | Live Games | 100000000 | failed |
일시 중단된 프로젝트 하나를 제외한 다른 모든 프로젝트의 목표가 너무 높게 설정되어 아이디어에 비해 비합리적인 것으로 보인다. 그러면 성공적으로 자금을 지원받은 프로젝트 중 상위 15개를 살펴보겠다.
goal.tops <- ksdata[ksdata$state=="successful",]
kable(head(goal.tops[order(-goal.tops$usd_goal), c(2,3,14,10)], 15))
| name | category | usd_goal | state | |
|---|---|---|---|---|
| 355331 | Elite: Dangerous | Video Games | 2015609 | successful |
| 89482 | Bring Back MYSTERY SCIENCE THEATER 3000 | Television | 2000000 | successful |
| 134463 | Camelot Unchained | Video Games | 2000000 | successful |
| 148586 | The Veronica Mars Movie Project | Narrative Film | 2000000 | successful |
| 171323 | WISH I WAS HERE | Narrative Film | 2000000 | successful |
| 368574 | Shenmue 3 | Video Games | 2000000 | successful |
| 324292 | Blue Mountain State: The Movie | Narrative Film | 1500000 | successful |
| 111637 | The Newest Hottest Spike Lee Joint | Narrative Film | 1250000 | successful |
| 337373 | The Bards Tale IV | Video Games | 1250000 | successful |
| 141639 | Obduction | Video Games | 1100000 | successful |
| 272925 | Project Eternity | Video Games | 1100000 | successful |
| 30719 | Shroud of the Avatar: Forsaken Virtues | Video Games | 1000000 | successful |
| 37515 | Pathfinder Online: A Fantasy Sandbox MMO | Video Games | 1000000 | successful |
| 189800 | ARKYD: A Space Telescope for Everyone | Space Exploration | 1000000 | successful |
| 216630 | Pebble 2, Time 2 + All-New Pebble Core | Product Design | 1000000 | successful |
여기에 나열된 일부 프로젝트는 최고 모금 프로젝트 목록(상위 15개)에도 있었다. 여기에 나열된 가장 일반적인 하위 카테고리는 ’Video Games’과 ’Narrative Film’이다. 각 카테고리의 평균 프로젝트 목표 금액을 살펴보겠다. 아마도 나중에 어떤 프로젝트 유형이 성공 또는 실패했는지에 대한 통찰력을 줄 것이다.
goal.avg <- ksdata %>%
group_by(main_category) %>%
summarize(goal=sum(usd_goal), projects=n()) %>%
mutate(avg=goal/projects) %>%
arrange(desc(avg))
goal.avg$main_category <- factor(goal.avg$main_category, levels=goal.avg$main_category)
ggplot(goal.avg, aes(main_category, avg, fill=avg)) + geom_bar(stat="identity") +
ggtitle("Average Project Goal") + xlab("Project Category") + ylab("Project Goal (USD)") +
geom_text(aes(label=paste0("$", round(avg,0))), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
‘Technology’, ‘Journalism’, ‘Film & Video’는 평균 목표금액이 가장 높다. 반대로 ’Dance’, ‘Crafts’, ’Photography’는 하위 그룹에 속한다. 여기에서 박스 플롯을 사용하여 개별 프로젝트에 대한 프로젝트 목표 금액의 분포를 확인할 것이다.
ggplot(ksdata, aes(main_category, usd_goal, fill=main_category)) + geom_boxplot() +
ggtitle("Project Goal vs. Project Category") + xlab("Project Category") +
ylab("Project Goal (USD)") +
theme(plot.title=element_text(size=15, face="bold", hjust=0.5),
axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12, angle=90), legend.position="null") +
coord_cartesian(ylim=c(0,60000))
‘Technology’는 엄청나게 높은 4 분위수 및 중간 값을 가지고 있다. ’Technology’에 비해 높지는 않지만, ’Design’과 ’Food’ 또한 상대적으로 높은 4 분위수와 중앙값을 가지고 있다. 이 두 카테고리의 평균 프로젝트 목표는 ‘Journalism’ 및 ’Film & Video’보다 낮았지만 중간 및 상위 분위 값이 높았으므로 목표 금액이 적은 많은 프로젝트가 있어야하며 후자는 많은 (높은 금액의)이상치를 가지거나, 둘다이여야 한다.
서로 다른 종류의 프로젝트에 대해 모금액과 목표 금액을 살펴본 결과 각각의 분포가 서로 어떻게 비교되는지 확인해보겠다. 자금 조달이 거의 없는 프로젝트가 많기 때문에(즉, 오른쪽으로 꼬리가 긴 분포를 가진 그래프) 위해 두 변수에 로그 변환을 사용하여 분포를 시각화할 것이다.
usd.amounts <- gather(ksdata, type, amount, usd_pledged, usd_goal, factor_key=T)
ggplot(usd.amounts, aes(amount, fill=type)) +
geom_histogram(alpha=0.5, position="identity") +
ggtitle("Distribution of USD Pledged vs. USD Goal") + xlab("USD") +
ylab("Frequency") + scale_fill_discrete("Type", labels=c("USD Pledged", "USD Goal"))
usd.amounts <- gather(ksdata, type, amount, usd_pledged, usd_goal, factor_key=T)
ggplot(usd.amounts, aes(log(amount+1), fill=type)) +
geom_histogram(alpha=0.5, position="identity") +
ggtitle("Distribution of log(USD Pledged) vs. log(USD Goal)") + xlab("log(USD + 1)") +
ylab("Frequency") + scale_fill_discrete("Type", labels=c("USD Pledged", "USD Goal"))
목표금액 정규분포의 형태를 보이고 있다. 반면에 모금액은 다봉분포(bimodal distribution, 서로 다른 두 개의 최빈값을 갖는 연속확률분포) 형태를 보인다. 모금액은 목표 금액 분포보다 왼쪽에 위치하고 있으며, 많은 프로젝트가 필요한 자금을 조달받지 못했음을 보여주고 있다.
목표 금액과 모금액을 비교할 때 흥미로운 점은 모금 달성 비율(모금달성률)이다. 그런 비율이 가장 높은 상위 15개 프로젝트의 목록을 살펴보겠다.
ksdata$ratio <- ksdata$usd_pledged/ksdata$usd_goal
kable(head(ksdata[order(-ksdata$ratio), c(2,3,13,14,15)], 15))
| name | category | usd_pledged | usd_goal | launch_date | |
|---|---|---|---|---|---|
| 369177 | VULFPECK /// The Beautiful Game | Music | 104277.89 | 1.00 | 2016-08-18 |
| 186097 | Re-covering with Friends | Rock | 68764.10 | 1.00 | 2016-10-14 |
| 360722 | VULFPECK /// Thrill of the Arts | Music | 55266.57 | 1.00 | 2015-08-10 |
| 76291 | Energy Hook | Video Games | 41535.01 | 1.00 | 2013-05-10 |
| 81369 | Band of Brothers 2nd Chance | Tabletop Games | 32843.00 | 1.00 | 2016-07-12 |
| 285409 | CLOCKWRIGHT: Large-Scale Analogue Time Machines | Sculpture | 27588.23 | 1.00 | 2015-12-14 |
| 369215 | Heartbreak Hits â Theo Katzman’s Second LP | Music | 24675.00 | 1.00 | 2016-11-04 |
| 290937 | Penny Arcade’s Podcast, “Downloadable Content”: The Return | Radio & Podcasts | 230360.67 | 10.00 | 2013-05-08 |
| 15289 | THE ‘mi8’ RISES | The Best Wireless Duo Stereo Sound System | Hardware | 22603.00 | 1.00 | 2016-09-13 |
| 164450 | CO-OP THE GAME (Canceled) | Video Games | 16461.73 | 0.97 | 2013-09-09 |
| 127905 | Worst Game Ever | Tabletop Games | 15804.00 | 1.00 | 2014-05-29 |
| 244399 | Y (A Generation) | Documentary | 15066.00 | 1.00 | 2010-10-09 |
| 354532 | Graveface Archival Series | Music | 14328.77 | 1.00 | 2014-08-01 |
| 150243 | Braiiiins! …it will not die! | Tabletop Games | 12984.00 | 1.00 | 2015-02-16 |
| 367450 | Multi-Purpose, All-Occasion Greeting Cards | Printing | 25150.30 | 2.00 | 2015-10-15 |
대부분의 프로젝트 목표가 1 달러이다. 최소 목표가 1,000 달러 이상인 프로젝트만 살펴 보겠다.
goal.min <- ksdata[ksdata$usd_goal>=1000,]
kable(head(goal.min[order(-goal.min$ratio), c(2,3,13,14,15)], 15))
| name | category | usd_pledged | usd_goal | launch_date | |
|---|---|---|---|---|---|
| 187653 | Exploding Kittens | Tabletop Games | 8782572.0 | 10000.00 | 2015-01-20 |
| 293862 | The World’s Best TRAVEL JACKET with 15 Features || BAUBAX | Product Design | 9192055.7 | 20000.00 | 2015-07-07 |
| 75901 | Fidget Cube: A Vinyl Desk Toy | Product Design | 6465690.3 | 15000.00 | 2016-08-30 |
| 132758 | 2015 CES Best, First Domestic Robot That Tracks Intruders! | Robots | 365538.0 | 1000.00 | 2014-12-29 |
| 137446 | The Component Collector | Tabletop Games | 327806.7 | 1000.00 | 2017-06-01 |
| 97372 | Joking Hazard | Tabletop Games | 3246588.5 | 10000.00 | 2016-02-09 |
| 23405 | Bears vs Babies - A Card Game | Tabletop Games | 3215679.8 | 10000.00 | 2016-10-18 |
| 250255 | COOLEST COOLER: 21st Century Cooler that’s Actually Cooler | Product Design | 13285226.4 | 50000.00 | 2014-07-08 |
| 311864 | ClickPack Pro | The Best Functional Anti-theft BackPack | Product Design | 1206179.0 | 5000.00 | 2017-03-27 |
| 1874 | Redefining Italian Luxury Watches - Filippo Loreti | Design | 5020667.0 | 20877.92 | 2016-11-16 |
| 146395 | SMART BELT - Kevlar® Core Indestructible & Micro Adjustment | Design | 1174805.1 | 5000.00 | 2017-05-25 |
| 289928 | Gravity: The Weighted Blanket for Sleep, Stress and Anxiety | Product Design | 4729263.1 | 21500.00 | 2017-04-26 |
| 359433 | HALLAM new york SMART JACKET 2.0 for TRAVEL, for OUTDOOR | Wearables | 1076751.1 | 5000.00 | 2016-12-10 |
| 65216 | Unstable Unicorns | Tabletop Games | 1865140.9 | 10000.00 | 2017-08-17 |
| 309631 | THE 7th CONTINENT â What Goes Up, Must Come Down. | Tabletop Games | 7072757.0 | 40000.00 | 2017-09-26 |
가장 많은 후원금을 받았던 프로젝트가 여기에서도 보인다. 달성률이 높은 프로젝트에서 자주 보이는 카테고리는 ’Tabletop Games’와 ’Product Design’이다.
프로젝트 상태(성공, 실패, 취소 등)별로 세분화해서 분석해보겠다.
state.freq <- ksdata %>%
group_by(state) %>%
summarize(count=n()) %>%
arrange(desc(count))
state.freq$state <- factor(state.freq$state, levels=state.freq$state)
ggplot(state.freq, aes(state, count, fill=count)) + geom_bar(stat="identity") +
ggtitle("Projects by Status") + xlab("Project Status") + ylab("Frequency") +
geom_text(aes(label=count), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
실패한 프로젝트가 성공한 프로젝트보다 많다. 대부분의 프로젝트가 빛을 보지 못하는 것 같다. 프로젝트를 서로 다른 두 개의 카테고리로 그룹화 할 수 있는데, “완료”된 프로젝트 (마감일에 도달한 프로젝트, 즉 성공적인 프로젝트 및 실패한 프로젝트)와 “완료되지 못한”프로젝트 (마감일에 도달하지 않은 프로젝트, 즉 아직 진행중인 프로젝트나 취소 또는 일시 중지된 프로젝트)이다. 이 작업을 수행하고 각 그룹의 프로젝트 상태 비율을 살펴 보겠다.
state.grp <- ksdata %>%
filter(state!="undefined") %>%
mutate(grp=ifelse(state %in% c("successful", "failed"), "complete", "incomplete")) %>%
group_by(grp, state) %>%
summarize(count=n()) %>%
mutate(pct=count/sum(count)) %>%
arrange(grp, desc(state))
state.grp$state <- factor(state.grp$state, levels=state.grp$state)
ggplot(state.grp, aes(grp, pct, fill=state)) + geom_bar(stat="identity") +
ggtitle("Project Status by Completion") + xlab("Project Completion") + ylab("Percentage") +
scale_x_discrete(labels=c("Complete", "Incomplete")) +
scale_y_continuous(labels=scales::percent) +
scale_fill_brewer(name="Project Status",
labels=c("Successful", "Failed", "Suspended", "Live", "Cancelled"),
palette="Set1") +
geom_text(aes(label=paste0(round(pct*100,1),"%")), position=position_stack(vjust=0.5),
colour="white", size=5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12), legend.position="bottom",
legend.title=element_text(size=12, face="bold"))
완료된(마감일에 도달한) 프로젝트의 약 60%가 펀딩에 실패하고, 약 40% 정도가 성공했다는 것을 알 수 있다. 완료되지 못한 (아직 진행중이거나, 취소되었거나 일시 중지된) 프로젝트의 약 90%가 취소되었다.
state.pct <- ksdata %>%
filter(state %in% c("successful", "failed")) %>%
group_by(main_category, state) %>%
summarize(count=n()) %>%
mutate(pct=count/sum(count)) %>%
arrange(desc(state), pct)
state.pct$main_category <- factor(state.pct$main_category,
levels=state.pct$main_category[1:(nrow(state.pct)/2)])
ggplot(state.pct, aes(main_category, pct, fill=state)) + geom_bar(stat="identity") +
ggtitle("Success vs. Failure Rate by Project Category") +
xlab("Project Category") + ylab("Percentage") + scale_y_continuous(labels=scales::percent) +
scale_fill_discrete(name="Project Status", breaks=c("successful", "failed"),
labels=c("Success", "Failure")) +
geom_text(aes(label=paste0(round(pct*100,1),"%")), position=position_stack(vjust=0.5),
colour="white", size=5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12), legend.position="bottom",
legend.title=element_text(size=12, face="bold")) + coord_flip()
‘Dance’, ‘Theater’, ‘Comics’은 가장 높은 성공률을 보이며, ’Technology’, ‘Journalism’, ’Crafts’가 가장 성공률이 낮다. ’Dance’와 ’Comics’은 모금액에서 높은 중앙값을 보였었고, 목표액에서는 낮은 중간값을 보였었다.
‘Technology’, ‘Journalism’, ’Crafts’은 모금액의 중간값이 낮았고, ’Technology’는 목표액의 중앙값이 높았다. 일반적으로 모금액이 높고, 목표금액이 낮을 수록 성공할 확률이 높다. 흥미롭게도 낮은 목표액의 중간 값을 가진 ’Crafts’는 목표액의 중간값이 낮았음에도 불구하고 성공률이 낮았다. 사람들이 전반적으로 이 카테고리에 관심이 많지 않다는 것을 알 수 있었다.
킥스타터의 최대 프로젝트 기간은 60일이다. Kickstarter는 프로젝트를 30일 이하로 설정할 것을 권장한다. 그들의 추론은 30 일 이내에 자금 지원을 받지 못한 프로젝트도 마감 기한까지 자금을 조달하지 못할 것이라고 말하고 있다.
프로젝트 마감일과 프로젝트 시작일의 차이를 계산한 다음 전체 일수로 나누어 각 프로젝트의 기간을 알 수 있다. 이제 프로젝트의 성공률을 일 단위로 계산해보겠다.
ksdata$length <- interval(ymd_hms(ksdata$launched), ymd(ksdata$deadline)) %/% days(1)
length.pct <- ksdata %>%
filter(state %in% c("successful", "failed"), length <= 61) %>%
group_by(length, state) %>%
summarize(count=n()) %>%
mutate(pct=count/sum(count))
ggplot(length.pct[length.pct$state=="successful",], aes(length, pct)) +
geom_point(colour="royalblue4", size=2.5) + ggtitle("Success Rate vs. Project Length") +
xlab("Project Length (Days)") + ylab("Success Rate (%)") +
scale_x_continuous(breaks=c(0,10,20,30,40,50,60)) + geom_vline(xintercept=30, colour="red") +
theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"))
전반적으로 30일을 초과하는 프로젝트는 30일 미만의 프로젝트보다 성공률이 낮으므로 킥스타터의 말은 일리가 있다. 실제로 30일을 초과하는 프로젝트의 경우 성공률과 프로젝트의 기간 간에 역 선형관계(음의 선형관계)를 보이고 있다(30일 이전 상향 추세선, 30일 이후 하향 추세선). 프로젝트 길이에 따른 프로젝트 분포를 살펴보겠다.
ggplot(ksdata[ksdata$length <= 61,], aes(length)) + geom_density(colour="royalblue4", size=1) +
ggtitle("Distribution of Projects by Campaign Length") + xlab("Project Length (Days)") +
ylab("Density (%)") + scale_x_continuous(breaks=c(0,10,20,30,40,50,60)) +
geom_vline(xintercept=30, colour="red") + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"))
대다수의 프로젝트가 30일 이내로 설정되어 있는 것처럼 보인다.
연도별로 런칭된 프로젝트 수와 성공 / 실패율을 살펴 보겠다.
year.freq <- ksdata %>%
filter(year(launched)!="1970") %>%
group_by(year=year(launched)) %>%
summarize(count=n())
ggplot(year.freq, aes(year, count, fill=count)) + geom_bar(stat="identity") +
ggtitle("Number of Projects by Launch Year") + xlab("Year") + ylab("Frequency") +
scale_x_discrete(limits=c(2009:2018)) +
geom_text(aes(label=paste0(count)), vjust=-0.5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12), legend.position="null") +
scale_fill_gradient(low="skyblue1", high="royalblue4")
2015년은 프로젝트가 가장 많은 해였다. 2016년과 2017년의 프로젝트 수가 그 전(2014, 2015년)에 비해 프로젝트 수가 점차 감소하고 있는 것으로 보인다.
state.pct2 <- ksdata %>%
filter(year(launched)!="1970", state %in% c("successful", "failed")) %>%
group_by(year=year(launched), state) %>%
summarize(count=n()) %>%
mutate(pct=count/sum(count)) %>%
arrange(desc(state))
ggplot(state.pct2, aes(year, pct, fill=state)) + geom_bar(stat="identity") +
ggtitle("Success vs. Failure Rate by Year Launched") +
xlab("Year") + ylab("Percentage") + scale_x_discrete(limits=c(2009:2017)) +
scale_y_continuous(labels=scales::percent) +
scale_fill_discrete(name="Project Status", breaks=c("successful", "failed"),
labels=c("Success", "Failure")) +
geom_text(aes(label=paste0(round(pct*100,1),"%")), position=position_stack(vjust=0.5),
colour="white", size=5) + theme_economist() +
theme(plot.title=element_text(hjust=0.5), axis.title=element_text(size=12, face="bold"),
axis.text.x=element_text(size=12), legend.position="bottom",
legend.title=element_text(size=12, face="bold"))
흥미롭게도 2014년과 2015년은 프로젝트 성공률이 가장 낮았다. 어쩌면 많은 사람들이 당시에 크라우드 펀딩에 뛰어들려고 시도했지만 성공하지 못했던 것으로 보인다. 년도를 기준으로 프로젝트 유형간에 차이가 있는지 살펴보갰다. 히트맵은 각 카테고리의 유형 및 연도의 프로젝트 수를 보여준다.
cat.year <- ksdata %>%
filter(!year(launched) %in% c("1970", "2018")) %>%
group_by(main_category, year=year(launched)) %>%
summarize(count=n())
cat.year2 <- t(matrix(cat.year$count, nrow=9))
colnames(cat.year2) <- c("2009", "2010", "2011", "2012", "2013", "2014", "2015", "2016", "2017")
rownames(cat.year2) <- levels(ksdata$main_category)
heatmap.2(cat.year2, dendrogram="row", Colv=F, trace="none", margins=c(10,10))
히트맵에서 주목할만한 부분은 2015년에 ‘Technology’, ‘Film & Video’와 ’Music’가 인가가 매우 많았던 것을 알 수 있었다. ’Food’, ‘Fashion’, ’Art’는 그 다음으로 인기가 많았던 것을 알 수 있었다.
프로젝트가 시작된 국가를 확인할 것이다. 국가별 프로젝트 성공률과 모금 총액과 성공률 그리고 지리적 히트 맵으로 시각화할 것이다.
ks5 <- ksdata %>%
group_by(country, state) %>%
select(goal, pledged, backers) %>%
summarise(freq=n()) %>%
mutate(categoryPerc = freq/sum(freq)) %>%
filter(state == "successful") %>%
arrange(desc(categoryPerc))
ks55 <- head(ks5, 10)
p5 <- ggplot(ks55, aes(x = reorder(country, -categoryPerc), y = round(categoryPerc*100, digits = 1))) +
geom_bar(stat = "identity", fill = fillColor2) + theme(axis.text.x = element_text(angle=60, hjust=1)) + geom_text(aes(label=round(categoryPerc*100, digits = 1)), position=position_dodge(width=0.9), vjust=-0.25) +
theme_economist()
p5+labs(y="Success %", x="Country", title="Top 10 Country by Successful project %")
킥스타터는 글로벌 플랫폼이다. 미국이 아닌 여러 나라의 메이커들도 자신만의 프로젝트를 시작하기 위한 자금을 모금하기 위해 진행한다. 위의 차트에서 볼 수 있듯이 미국은 프로젝트 성공률이 가장 높은 나라지만 다른 나라들 또한 크게 뒤떨어져 있지 않다. 미국에서 시작된 프로젝트의 성공률은 37.4%이며, 영국에서 시작된 프로젝트의 성공률은 35.8%이다. 아시아 지역에서는 홍콩의 프로젝트 성공률이 35%로 영국과 비슷한 양상을 보이고 있으며, 싱가포르 (32.1%)는 상위 5위에 머무르고 있다. 유럽에서는 영국 다음으로 덴마크 (32.3%), 뉴질랜드 (31%), 프랑스 (30.9%), 룩셈부르크 (30.6%), 스웨덴 (29%)이 뒤를 이었다.
ks6 <- ksdata %>%
group_by(country, state) %>%
select(goal, pledged, backers) %>%
summarise(sumpledge=sum(pledged)) %>%
filter(state == "successful") %>%
arrange(desc(sumpledge))
ks66 <- head(ks6, 10)
p6 <- ggplot(ks66, aes(x = reorder(country, -sumpledge), y = round(sumpledge/1000000, digits = 0))) +
geom_bar(stat = "identity", fill = fillColor2) + theme(axis.text.x = element_text(angle=60, hjust=1)) + geom_text(aes(label=round(sumpledge/1000000, digits = 0)), position=position_dodge(width=0.9), vjust=-0.25) +
theme_economist()
p6 + labs(y="Money raised (USD Million)", x="Country", title="Top 10 Country by Money raised (in USD Million)")
각국의 프로젝트 모금액을 비교해 보면, 미국은 나머지 모든 국가를 합친 것보다 월등히 높다는 것을 알 수 있다. 2018년 1월까지 총 31억 2000만 달러의 자금이 조달되었으며, 그 중에서 미국은 25억 3700만 달러를 모았다(한화로 2조 8607억원 수준으로 이는 81.3%에 달한다). 자금 조달 측면에서 영국은 1억 3800만 달러(한화로 1,557억) 수준이고, 미국을 제외한 국가(영국 포함)의 총합은 5억 8300만 달러(한화 6,578억) 수준이다.
킥스타터는 전세계적으로 사용되고 있기 때문에, 카테고리 성공 여부는 프로젝트가 미국 또는 미국 이외의 지역에서 시작되었는지에 따라 결정된다. 이를 위해 데이터를 정리하고 분류하여 미국과 미국이 아닌 지역에서 성공률로 나누었다(아래의 차트는 미국 및 미국 외 국가의 카테고리 성공율을 비교한 것이다). 전반적으로 미국의 성공률이 조금 더 높다.
ks7 <- ksdata %>%
filter(country %in% c('US')) %>%
group_by(main_category, state) %>%
select(goal, pledged, backers) %>%
summarise(freq=n()) %>%
mutate(us = freq/sum(freq)) %>%
filter(state == "successful") %>%
arrange(desc(us))
us_success <- select(ks7, main_category, us)
ks8 <- ksdata %>%
filter(!country %in% c('US')) %>%
group_by(main_category, state) %>%
select(goal, pledged, backers) %>%
summarise(freq=n()) %>%
mutate(non_us = freq/sum(freq)) %>%
filter(state == "successful") %>%
arrange(desc(non_us))
non_us_success <- select(ks8, main_category, non_us)
p7 <- ggplot(ks7, aes(x = reorder(main_category, -us), y = round(us*100, digits = 0))) +
geom_bar(stat = "identity", fill = fillColor2) + theme(axis.text.x = element_text(angle=60, hjust=1)) + geom_text(aes(label=round(us*100, digits = 0)), position=position_dodge(width=0.3), vjust=-0.25) + labs(y="Success %", x="Main Category", title="USA - Successful project %") + theme_economist()+ theme(axis.text.x = element_text(angle = 90, hjust = 1))
p8 <- ggplot(ks8, aes(x = reorder(main_category, -non_us), y = round(non_us*100, digits = 0))) +
geom_bar(stat = "identity", fill = fillColor2) + theme(axis.text.x = element_text(angle=60, hjust=1)) + geom_text(aes(label=round(non_us*100, digits = 0)), position=position_dodge(width=0.3), vjust=-0.25) + labs(y="Success %", x="Main Category", title="Non USA - Successful project %") + theme_economist() + theme(axis.text.x = element_text(angle = 90, hjust = 1))
ggarrange(p7, p8, ncol = 2)
\[H0(귀무가설)\] 두 개의 범주형 변수 간에는 연관성이 없고, 행 변수와 열 변수는 모집단에서 독립적이며, 카테고리의 성공률에 영향을 미친다. \[H1(대립가설)\] 두 개의 범주형 변수 간에는 연관성이 없고, 행 변수와 열 변수는 독립적이지 않으며, 카테고리의 성공에 영향을 주지 않는다.
compare_main <- left_join(us_success, non_us_success, by = c("main_category" = "main_category"))
compare_main
## # A tibble: 15 x 3
## # Groups: main_category [?]
## main_category us non_us
## <fct> <dbl> <dbl>
## 1 Dance 0.647 0.463
## 2 Theater 0.599 0.596
## 3 Comics 0.541 0.535
## 4 Music 0.502 0.286
## 5 Art 0.426 0.345
## 6 Film & Video 0.381 0.329
## 7 Games 0.380 0.298
## 8 Design 0.354 0.342
## 9 Photography 0.318 0.274
## 10 Publishing 0.314 0.287
## 11 Food 0.268 0.158
## 12 Fashion 0.248 0.236
## 13 Crafts 0.247 0.220
## 14 Journalism 0.225 0.176
## 15 Technology 0.219 0.155
chisq.test(data.frame(compare_main$us, compare_main$non_us))
##
## Pearson's Chi-squared test
##
## data: data.frame(compare_main$us, compare_main$non_us)
## X-squared = 0.074268, df = 14, p-value = 1
결과의 p-값이 1에 가깝기 때문에 귀무 가설을 채택할 수 있으며, 카테고리의 성공에 영향을 준다고(성공에 차이가 있다고) 말할 수 있다. 모든 범주에서 미국 내 성공확률은 미국을 제외한 국가의 성공률보다 높다. 따라서 미국에서 프로젝트를 시작하는 것이 성공률을 더 높인다고 말할 수 있다.
킥스타터에서 ‘Games’와 ’Design’ 카테고리는 가장 많은 모금액($741, $734 millon)이 형성되었는데, 이 카테고리에 의해 모금된 금액이 통계적으로 차이가 있는지 아니면 비슷한지 확인해보겠다. 분석을 위해 상위 1,000개의 프로젝트를 선택하고 Anova 분석을 시행하겠다.
ks9 <- ksdata %>%
filter(main_category %in% c('Games')) %>%
select(pledged) %>%
arrange(desc(pledged))
ks10 <- ksdata %>%
filter(main_category %in% c('Design')) %>%
select(pledged) %>%
arrange(desc(pledged))
ks9 <- head(ks9, 1000)
ks10 <- head(ks10, 1000)
sprintf("Mean amount pledged on Design Category: %f", mean(ks9$pledged))
## [1] "Mean amount pledged on Design Category: 500963.445080"
## [1] "Mean amount pledged on Design Category: 399344.450060"
sprintf("Mean amount pledged on Games Category: %f", mean(ks10$pledged))
## [1] "Mean amount pledged on Games Category: 519495.490640"
## [1] "Mean amount pledged on Games Category: 387663.683480"
#ks11 <- round(ks9[sample(1:nrow(ks9), 1000, replace = FALSE), ], digits = -3)
#ks12 <- round(ks10[sample(1:nrow(ks10), 1000, replace = FALSE), ], digits = -3)
ks9 <- round(ks9, digits= -3)
ks10 <- round(ks10, digits = -3)
scores = data.frame(ks9, ks10)
#boxplot(scores)
scores = stack(scores)
resultaov <- aov(values ~ ind, data=scores, var.equal = T)
summary(resultaov)
## Df Sum Sq Mean Sq F value Pr(>F)
## ind 1 1.718e+11 1.718e+11 0.165 0.684
## Residuals 1998 2.077e+15 1.040e+12
P값(유의확률)은 0.77로 유의수준인 0.05보다 높으므로 귀무가설을 채택할 수 있으며, 두 카테고리 모두 통계적으로 같은 금액의 평균값을 가진 1,000개의 프로젝트가 있다고 말할 수 있다.
countries.freq <- ksdata %>%
filter(country!='N,0"') %>%
group_by(country) %>%
summarize(count=n())
countries.match <- joinCountryData2Map(countries.freq, joinCode="ISO2", nameJoinColumn="country")
## 22 codes from your data successfully matched countries in the map
## 0 codes from your data failed to match with a country code in the map
## 220 codes from the map weren't represented in your data
mapCountryData(countries.match, nameColumnToPlot="count",
mapTitle="Number of Projects by Country", catMethod="logFixedWidth",
colourPalette="heat")
프로젝트는 일본과 북아메리카, 유럽 및 오세아니아에서 많이 발생하는 것으로 보인다. 미국과 영국은 규모가 작지만 프로젝트의 수가 가장 많다.
킥스타터의 프로젝트는 펀딩에 참여한 사람들이 금전적으로 지원을 해주는 것이기 때문에 후원자의 수에 따라 프로젝트 성공 및 금액의 여부가 결정된다. 아래의 그림은 후원자의 수와 모금액의 선형관계를 보여주고 있다. 모금액과 후원자 수의 관계를 이해하기 위해 다음 모델을 사용하여 회귀 분석을 실시했다.
\[Pledgedamount = A_{0} + B_{1} * backers\]
xyplot(ksdata$pledged~ksdata$backers, data = ksdata, xlab= "Number of backers", ylab= "Amount pledged (USD)", panel = function(x, y, ...) {
panel.xyplot(x, y, ...)
panel.lmline(x, y, ...)
})
회귀 분석의 결과와 회귀 분석의 가정을 만족시키는 것을 보여주는 차트는 아래에 표시해두었다.
resultslm <- lm(ksdata$pledged~ksdata$backers, data = ksdata)
summary(resultslm)
##
## Call:
## lm(formula = ksdata$pledged ~ ksdata$backers, data = ksdata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -7803302 -2280 -1773 -1674 14405275
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1698.8299 109.0555 15.58 <2e-16 ***
## ksdata$backers 75.5950 0.1194 633.09 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 66660 on 378659 degrees of freedom
## Multiple R-squared: 0.5142, Adjusted R-squared: 0.5142
## F-statistic: 4.008e+05 on 1 and 378659 DF, p-value: < 2.2e-16
par(mfrow=c(2,2))
plot(resultslm)
후원자의 p값(유의확률)은 0.01 미만으로 이는 후원자의 수가 모금 총액에 상당한 영향을 미친다는 것을 의미한다. 선형회귀 모델의 식은 아래와 같다.
\[Pledgedamount = 1698.9 + 75.6 ∗ backers\]
후원자의 기울기는 75.6이므로 각 후원자가 킥스타터에 평균적으로 $ 75.6에 기여했다고 가정할 수 있다. 따라서 더 많은 수의 후원자를 유치할 수 있는 프로젝트가 더 많은 돈을 모으게 됨으로써 성공적으로 진행될 것이다.
프로젝트의 성공에 영향을 끼치는 요소 찾기
의사결정나무 알고리즘을 데이터에 적용하여 변수 중요도와 성공과 실패를 끼치는 요소가 무엇인지 파악하겠다.
full <- ksdata %>%
filter(state %in% c("successful", "failed"))
full <- full %>%
select(c(4, 7, 9, 10, 11, 12))
full$state <- ifelse(full$state == 'failed', 0, 1)
kick_dummy <- data.frame(full, dummy(full$main_category))
kick_dummy <- data.frame(kick_dummy, dummy(full$country))
head(kick_dummy)
### lets prepare and keep data in the proper format
feature <- kick_dummy
response <- as.factor(kick_dummy$state)
feature$state <- as.factor(kick_dummy$state)
### For Cross validation purpose will keep 20% of data aside from my orginal train set
## This is just to check how well my data works for unseen data
set.seed(1234)
ind <- createDataPartition(kick_dummy$state, times=1, p=0.8, list=FALSE)
train_val <- feature[ind, ]
test_val <- feature[-ind, ]
prop.table(table(full$state))*100
prop.table(table(train_val$state))*100
prop.table(table(test_val$state))*100
## Training
dt <- rpart(as.factor(state)~., data = train_val, cp = 0.1^20) # 모든 변수 사용, Full tree 생성
xerror_min_which <- which.min(dt$cptable[, "xerror"])
xerror_min <- min(dt$cptable[, "xerror"])
printcp(dt) # cptable 출력
##
## Classification tree:
## rpart(formula = as.factor(state) ~ ., data = train_val, cp = 0.1^20)
##
## Variables actually used in tree construction:
## [1] backers goal main_category pledged
##
## Root node error: 107198/265340 = 0.404
##
## n= 265340
##
## CP nsplit rel error xerror xstd
## 1 6.0837e-01 0 1.0000000 1.0000000 0.00235792
## 2 7.5710e-02 1 0.3916304 0.3916304 0.00175366
## 3 2.8536e-02 3 0.2402097 0.2403310 0.00142276
## 4 2.5210e-02 5 0.1831377 0.1832870 0.00125825
## 5 1.2640e-02 7 0.1327170 0.1329409 0.00108330
## 6 1.1316e-02 9 0.1074367 0.1078005 0.00098073
## 7 6.5859e-03 11 0.0848057 0.0851788 0.00087593
## 8 5.0281e-03 13 0.0716338 0.0707756 0.00080085
## 9 4.0206e-03 15 0.0615776 0.0607381 0.00074343
## 10 2.8475e-03 17 0.0535364 0.0536484 0.00069972
## 11 2.5327e-03 21 0.0421463 0.0461669 0.00065011
## 12 1.6465e-03 23 0.0370809 0.0386854 0.00059602
## 13 1.6278e-03 25 0.0337879 0.0334521 0.00055483
## 14 1.6255e-03 27 0.0305323 0.0322021 0.00054451
## 15 1.6092e-03 31 0.0240303 0.0315398 0.00053895
## 16 1.4553e-03 33 0.0208120 0.0259333 0.00048927
## 17 9.0953e-04 35 0.0179015 0.0210918 0.00044168
## 18 8.7688e-04 37 0.0160824 0.0179481 0.00040770
## 19 6.8565e-04 39 0.0143286 0.0158492 0.00038328
## 20 5.6904e-04 41 0.0129573 0.0146365 0.00036841
## 21 3.8713e-04 43 0.0118193 0.0142260 0.00036324
## 22 3.3116e-04 45 0.0110450 0.0133118 0.00035144
## 23 3.2183e-04 47 0.0103827 0.0125096 0.00034074
## 24 2.9385e-04 49 0.0097390 0.0112689 0.00032349
## 25 2.6586e-04 51 0.0091513 0.0101961 0.00030777
## 26 2.1922e-04 53 0.0086196 0.0092352 0.00029297
## 27 2.0989e-04 55 0.0081811 0.0087875 0.00028580
## 28 2.0523e-04 57 0.0077613 0.0085543 0.00028200
## 29 1.9123e-04 59 0.0073509 0.0081252 0.00027486
## 30 1.7724e-04 61 0.0069684 0.0074815 0.00026378
## 31 1.6791e-04 64 0.0064367 0.0072389 0.00025948
## 32 1.6325e-04 65 0.0062688 0.0069964 0.00025511
## 33 1.3526e-04 67 0.0059423 0.0068098 0.00025170
## 34 1.3060e-04 75 0.0048602 0.0062874 0.00024187
## 35 1.1894e-04 77 0.0045990 0.0059982 0.00023626
## 36 1.0261e-04 81 0.0041232 0.0053732 0.00022364
## 37 9.7950e-05 83 0.0039180 0.0051867 0.00021973
## 38 8.3957e-05 85 0.0037221 0.0051027 0.00021795
## 39 7.4628e-05 90 0.0033023 0.0047296 0.00020985
## 40 6.9964e-05 94 0.0030038 0.0042258 0.00019838
## 41 6.5300e-05 96 0.0028639 0.0042258 0.00019838
## 42 4.6643e-05 98 0.0027333 0.0037874 0.00018782
## 43 4.2911e-05 100 0.0026400 0.0035262 0.00018124
## 44 4.1978e-05 105 0.0024254 0.0035262 0.00018124
## 45 3.7314e-05 107 0.0023415 0.0033863 0.00017761
## 46 3.4205e-05 109 0.0022668 0.0031997 0.00017266
## 47 3.2650e-05 115 0.0020616 0.0031810 0.00017215
## 48 2.3321e-05 119 0.0019310 0.0031624 0.00017165
## 49 1.5548e-05 121 0.0018844 0.0031344 0.00017089
## 50 1.3993e-05 124 0.0018377 0.0030411 0.00016833
## 51 9.3285e-06 126 0.0018097 0.0030411 0.00016833
## 52 4.6643e-06 130 0.0017724 0.0030504 0.00016859
## 53 3.1095e-06 132 0.0017631 0.0030318 0.00016807
## 54 1.0000e-20 135 0.0017538 0.0030411 0.00016833
plotcp(dt) # cpplot 출력
abline(v = xerror_min_which, lty = 2, col = "red")
text(xerror_min_which, xerror_min, labels = round(xerror_min_which, 2), pos = 3, col = "red")
# pruning
dt_prune <- prune(dt, cp = dt$cptable[which.min(dt$cptable[, "xerror"]), "CP"])
- training accuracy
pred_tr_dt <- predict(dt_prune, type = "class") # class(범주형)으로 예측
#CrossTable(x = train_val$state, y = pred_tr_dt, prop.chisq = FALSE)
confusionMatrix(train_val$state, pred_tr_dt)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 157998 144
## 1 45 107153
##
## Accuracy : 0.9993
## 95% CI : (0.9992, 0.9994)
## No Information Rate : 0.5956
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9985
## Mcnemar's Test P-Value : 1.015e-12
##
## Sensitivity : 0.9997
## Specificity : 0.9987
## Pos Pred Value : 0.9991
## Neg Pred Value : 0.9996
## Prevalence : 0.5956
## Detection Rate : 0.5955
## Detection Prevalence : 0.5960
## Balanced Accuracy : 0.9992
##
## 'Positive' Class : 0
##
- test accuracy
pred_te_dt <- predict(dt_prune, test_val, type = "class")
#CrossTable(x = test_val$state, y = pred_te_dt, prop.chisq = FALSE)
confusionMatrix(test_val$state, pred_te_dt, positive = "1")
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 39526 51
## 1 20 26738
##
## Accuracy : 0.9989
## 95% CI : (0.9987, 0.9992)
## No Information Rate : 0.5962
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.9978
## Mcnemar's Test P-Value : 0.0003704
##
## Sensitivity : 0.9981
## Specificity : 0.9995
## Pos Pred Value : 0.9993
## Neg Pred Value : 0.9987
## Prevalence : 0.4038
## Detection Rate : 0.4031
## Detection Prevalence : 0.4034
## Balanced Accuracy : 0.9988
##
## 'Positive' Class : 1
##
# plotting
plot(dt_prune, margin = 0.1)
text(dt_prune, use.n = T)
fancyRpartPlot(dt_prune, cex = 1) #fancy tree
barplot(dt_prune$variable.importance, ylim = c(0, 55))
dt_prune$variable.importance
## pledged
## 9.003919e+04
## backers
## 7.713038e+04
## goal
## 3.196962e+04
## main_category
## 1.012345e+04
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdDesign
## 2.491352e+03
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdGames
## 2.379017e+03
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdComics
## 1.484687e+03
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdTechnology
## 4.364026e+02
## country
## 2.497828e+02
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdTheater
## 1.839015e+02
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdFood
## 1.075711e+02
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdMusic
## 8.531380e+01
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdN.0.
## 4.432206e+01
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdDance
## 3.981948e+01
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdFilm...Video
## 1.836672e+01
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdGB
## 1.213305e+01
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdBE
## 7.046398e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdIT
## 5.240522e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdFashion
## 5.124196e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdJP
## 3.822880e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdSG
## 3.196868e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdCH
## 2.937949e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdDE
## 2.932639e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdES
## 2.778649e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdDK
## 2.665810e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdNO
## 2.385620e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdHK
## 2.327269e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdLU
## 2.031737e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdCA
## 1.659574e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdAT
## 1.468975e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdNL
## 1.008650e+00
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdFR
## 4.457456e-01
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdIE
## 4.993410e-02
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdArt
## 6.642238e-03
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdMX
## 4.310621e-03
## X.Users.mac.codebox_modified.dev.data.analytics.project.kickstarter.kickstarter.analysis.181030.RmdSE
## 6.661809e-05
킥스타터에서 프로젝트의 성공에 영향을 미치는 요인에는 여러 가지가 있다. ‘Dance’, ‘Theater’ 기반의 프로젝트는 위험이 낮기 때문에 약 65% 정도의 높은 성공률을 보이고 있다. 음악은 52.7%의 성공률을 보이지만 Chiptune은 Kickstarter의 모든 하위 카테고리 중에서 75 %의 성공률을 기록했다. ’Games’의 성공률은 43.9%이며, 탁상형 게임과 비디오 게임이 다른 유형의 프로젝트보다 성공률이 높았다. 반면에 ’Technology’는 23.8%로 성공률이 가장 낮았다. 미국과 미국 외의 국가에서의 프로젝트 성공률이 비슷해보일지라도, 실제 자금 조달 규모에서 미국은 모든 국가를 능가한다(전체의 81.3%를 차지하며 한화로 2조 8607억 수준).
‘Design’과 ’Games’, ‘Comics’, ‘Technology’ 분야가 펀딩에 성공할 확률이 높고, 게임과 디자인, 기술 프로젝트는 더 많은 모금이 가능한 걸 확인할 수 있었다. 지난 7년간의 데이터를 살펴보면 킥 스타터의 각각의 후원자들은 평균 75.6 달러를 펀딩에 기여했다. 따라서 더 많은 수의 후원자가 프로젝트를 성공시키기 위한 프로젝트에 더 많은 자금을 지원할 수 있게 방안을 모색해야 한다.