๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
์–ธ์ œ ์–ด๋””์„œ ์œ ์šฉํ–ˆ๋Š”์ง€ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ง์”€ ๋“œ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์š”์™€ ๋…ผ๋ฌธ์ด๋ฏ€๋กœ ๋ฌด์—‡์„ ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์ „์ ์œผ๋กœ ์ฃผ๊ด€์ ์ธ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์™„์ „ํžˆ ๋‹ค๋ฅผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์•Œ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ๊ฐ€์š”? ๋ฐ์ดํ„ฐ ๊ณผํ•™์˜ ํ•ต์‹ฌ์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์ž‘์—… ๋‹จ๊ณ„๊ฐ€ ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ๋จผ์ €์ด์ž ๊ฐ€์žฅ ์ค‘์š”ํ•œ(์ด ์—†์ด๋Š” ์•„๋ฌด ๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!) ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ฑฐ๋‚˜ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ค ํ˜•ํƒœ๋กœ๋“  ์–ด๋”˜๊ฐ€์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฑฐ๊ธฐ์—์„œ "๊ฒ€์ƒ‰"๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ”๋กœ ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜ ์ €๋Š” ์ €์—๊ฒŒ ์œ ์šฉํ–ˆ๋˜ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ณ , ์ •ํ™•ํžˆ ์–ด๋””์„œ, ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š”์ง€, ์™œ ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ์—์„œ๋Š” ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์œ ํ˜• ๋ธ”๋ก์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • "ํ‘œ์ค€" ์ฟผ๋ฆฌ ์–ธ์–ด๋Š” ๊ด€๊ณ„ํ˜• ๋Œ€์ˆ˜ํ•™์ด๋‚˜ SQL๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ๋งํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ดํ•ด๋˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
  • ์Šคํฌ๋ฆฝํŒ… ์ฟผ๋ฆฌ ์–ธ์–ด: ์˜ˆ๋ฅผ ๋“ค์–ด Python things pandas, numpy ๋˜๋Š” ์‰˜ ์Šคํฌ๋ฆฝํŒ….
  • ์ง€์‹ ๊ทธ๋ž˜ํ”„ ๋ฐ ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ž‘์„ฑ๋œ ๋ชจ๋“  ๋‚ด์šฉ์€ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์„ค๋ช… ๋ฐ "ํ•„์š”ํ•œ ์ด์œ "์™€ ํ•จ๊ป˜ ์œ ์šฉํ–ˆ๋˜ ๊ฐœ์ธ์ ์ธ ๊ฒฝํ—˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ๋น„์Šทํ•œ ์ƒํ™ฉ์ด ์–ด๋–ป๊ฒŒ ๋‹ฅ์น  ์ˆ˜ ์žˆ๋Š”์ง€ ์‹œ๋„ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ์–ธ์–ด๋ฅผ ์ดํ•ดํ•˜์—ฌ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์— (๊ธด๊ธ‰ํ•˜๊ฒŒ) ์ง€์›ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•œ ํ”„๋กœ์ ํŠธ์— ๋„์ฐฉํ•˜๊ธฐ ์ „์—.

"ํ‘œ์ค€" ์ฟผ๋ฆฌ ์–ธ์–ด

ํ‘œ์ค€ ์ฟผ๋ฆฌ ์–ธ์–ด๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๊ณผ ์ •ํ™•ํžˆ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ด€๊ณ„๋Œ€์ˆ˜ํ•™

์˜ค๋Š˜๋‚  ๊ด€๊ณ„ ๋Œ€์ˆ˜ํ•™์ด ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ฟผ๋ฆฌ ์–ธ์–ด๊ฐ€ ์™œ ํŠน์ •ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”์ง€ ์ž˜ ์ดํ•ดํ•˜๊ณ  ์ด๋ฅผ ์˜์‹์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๊ทธ ๋ฐ‘์— ๊น”๋ ค ์žˆ๋Š” ํ•ต์‹ฌ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ด€๊ณ„ ๋Œ€์ˆ˜ํ•™์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ณต์‹์ ์ธ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ด€๊ณ„ ๋Œ€์ˆ˜ํ•™์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์˜ ๊ด€๊ณ„์— ๋Œ€ํ•œ ํ์‡„ํ˜• ์—ฐ์‚ฐ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ข€ ๋” ์ธ๊ฐ„์ ์œผ๋กœ ๋งํ•˜๋ฉด, ์ด๋Š” ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ ํ…Œ์ด๋ธ”์ด ๋˜๋„๋ก ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ž‘์—… ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  ๊ด€๊ณ„ ์—ฐ์‚ฐ ๋ณด๊ธฐ ์ด Habr์˜ ๊ธฐ์‚ฌ - ์—ฌ๊ธฐ์„œ๋Š” ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ์™€ ์œ ์šฉํ•œ ์ •๋ณด๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ฟผ๋ฆฌ ์–ธ์–ด๊ฐ€ ๋ฌด์—‡์ธ์ง€, ํŠน์ • ์ฟผ๋ฆฌ ์–ธ์–ด์˜ ํ‘œํ˜„์‹ ๋’ค์— ์–ด๋–ค ์ž‘์—…์ด ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ฟผ๋ฆฌ ์–ธ์–ด์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋” ๊นŠ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
์—์„œ ๊ฐ€์ ธ์˜จ ์ด ์กฐํ•ญ. ์ž‘์—…์˜ ์˜ˆ: ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋Š” ์กฐ์ธ.

์—ฐ๊ตฌ ์ž๋ฃŒ:

์Šคํƒ ํฌ๋“œ์˜ ์ข‹์€ ์ž…๋ฌธ ๊ณผ์ •. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ด€๊ณ„ํ˜• ๋Œ€์ˆ˜ํ•™ ๋ฐ ์ด๋ก ์— ๊ด€ํ•œ ๋งŽ์€ ์ž๋ฃŒ(Coursera, Udacity)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์˜จ๋ผ์ธ์—๋Š” ์ข‹์€ ์ž๋ฃŒ๋ฅผ ํฌํ•จํ•˜์—ฌ ์—„์ฒญ๋‚œ ์–‘์˜ ์ž๋ฃŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•™์ˆ  ๊ณผ์ •. ๋‚ด ๊ฐœ์ธ์ ์ธ ์กฐ์–ธ: ๊ด€๊ณ„ ๋Œ€์ˆ˜ํ•™์„ ์ž˜ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ธฐ๋ณธ์˜ ๊ธฐ์ดˆ์ž…๋‹ˆ๋‹ค.

SQL

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
์—์„œ ๊ฐ€์ ธ์˜จ ์ด ๊ธฐ์‚ฌ.

SQL์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ด€๊ณ„ํ˜• ๋Œ€์ˆ˜์˜ ๊ตฌํ˜„์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ์ง€๋งŒ SQL์€ ์„ ์–ธ์ ์ž…๋‹ˆ๋‹ค! ์ฆ‰, ๊ด€๊ณ„ํ˜• ๋Œ€์ˆ˜ํ•™ ์–ธ์–ด๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‹ค์ œ๋กœ ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์„ ๋งํ•˜์ง€๋งŒ SQL์„ ์‚ฌ์šฉํ•˜์—ฌ ์ถ”์ถœํ•  ๋‚ด์šฉ์„ ์ง€์ •ํ•˜๋ฉด DBMS๊ฐ€ ์ด๋ฏธ ๊ด€๊ณ„ํ˜• ๋Œ€์ˆ˜ํ•™ ์–ธ์–ด๋กœ (ํšจ๊ณผ์ ์ธ) ํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋™๋“ฑ์„ฑ์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ์ •๋ฆฌ).

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
์—์„œ ๊ฐ€์ ธ์˜จ ์ด ๊ธฐ์‚ฌ.

์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ด€๊ณ„ํ˜• DBMS: Oracle, Postgres, SQL Server ๋“ฑ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์‚ฌ์‹ค์ƒ ์–ด๋””์—๋‚˜ ์žˆ์œผ๋ฉฐ ์ด๋“ค๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋†’์Šต๋‹ˆ๋‹ค. ์ฆ‰, SQL์„ ์ฝ๊ฑฐ๋‚˜(๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ๋†’์Œ) ์ž‘์„ฑํ•ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค( ๊ฐ€๋Šฅ์„ฑ๋„ ๋‚ฎ์Œ).

๋ฌด์—‡์„ ์ฝ๊ณ  ๊ณต๋ถ€ํ•ด์•ผ ํ•˜๋Š”๊ฐ€

์œ„์˜ ๋™์ผํ•œ ๋งํฌ(๊ด€๊ณ„ํ˜• ๋Œ€์ˆ˜ํ•™ ๊ด€๋ จ)์— ๋”ฐ๋ฅด๋ฉด ์—„์ฒญ๋‚œ ์–‘์˜ ์ž๋ฃŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ด.

๊ทธ๋Ÿฐ๋ฐ NoSQL์ด ๋ญ”๊ฐ€์š”?

""NoSQL"์ด๋ผ๋Š” ์šฉ์–ด๋Š” ์™„์ „ํžˆ ์ž๋ฐœ์ ์ธ ์œ ๋ž˜๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ›์•„๋“ค์—ฌ์ง€๋Š” ์ •์˜๋‚˜ ์ด๋ฅผ ๋’ท๋ฐ›์นจํ•˜๋Š” ๊ณผํ•™ ๊ธฐ๊ด€์ด ์—†๋‹ค๋Š” ์ ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๊ฐ•์กฐํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค." ๋™ ๊ธฐ์‚ฌ ํ•˜๋ธŒ๋ฅด์—์„œ.

์‹ค์ œ๋กœ ์‚ฌ๋žŒ๋“ค์€ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์™„์ „ํ•œ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•˜๊ณ  ์ง‘๊ณ„๊ฐ€ ํฌํ•จ๋œ ํŠน์ • ๋‹จ์ˆœ ์ฟผ๋ฆฌ๊ฐ€ ์ง€๋ฐฐ์ ์ธ ๊ฒฝ์šฐ, ์ฆ‰ ๋ฉ”ํŠธ๋ฆญ์„ ์‹ ์†ํ•˜๊ฒŒ ๊ณ„์‚ฐํ•˜๊ณ  ์ด๋ฅผ ๋ฐ์ดํ„ฐ์— ๊ธฐ๋กํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋”์šฑ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ด€๊ณ„ํ˜• ๊ธฐ๋Šฅ์€ ๋ถˆํ•„์š”ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์œ ํ•ดํ•œ ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ํŠน์ • ์ž‘์—…์— ๋Œ€ํ•ด ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์ธ ์ƒ์‚ฐ์„ฑ์„ ๋ง์น  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์™œ ํ‘œ์ค€ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋˜ํ•œ ๊ธฐ์กด ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์˜ ๊ณ ์ •๋œ ์ˆ˜ํ•™์  ์Šคํ‚ค๋งˆ ๋Œ€์‹  ์œ ์—ฐํ•œ ์Šคํ‚ค๋งˆ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ์„ ๋ฐฐํฌํ•˜๊ณ  ์‹ ์†ํ•˜๊ฒŒ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ์Šคํ‚ค๋งˆ ๋ฐ ์œ ํ˜•์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ๊ฒฝ์šฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ์—„์ฒญ๋‚˜๊ฒŒ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋‹ค์ง€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ์ „๋ฌธ๊ฐ€ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๊ณ  ์ผ๋ถ€ ๋ฉ”ํƒ€ ์ •๋ณด์™€ ํ•จ๊ป˜ ํŠน์ • ๋„๋ฉ”์ธ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ๋‹จ์ˆœํžˆ ๊ฐ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด JSON์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐ์ดํ„ฐ ํ™•์žฅ์„ ์œ„ํ•œ ๋งค์šฐ ์œ ์—ฐํ•œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ ๋ฐ ๋น ๋ฅธ ๋ฐ˜๋ณต - ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” NoSQL์ด ํ›จ์”ฌ ๋” ์„ ํ˜ธ๋˜๊ณ  ์ฝ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์˜ˆ์ œ ํ•ญ๋ชฉ(NoSQL์ด ํ•„์š”ํ•œ ๊ณณ์— ๋ฐ”๋กœ ์žˆ์—ˆ๋˜ ๋‚ด ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ)

{"en_wikipedia_url":"https://en.wikipedia.org/wiki/Johnny_Cash",
"ru_wikipedia_url":"https://ru.wikipedia.org/wiki/?curid=301643",
"ru_wiki_pagecount":149616,
"entity":[42775,"ะ”ะถะพะฝะฝะธ ะšััˆ","ru"],
"en_wiki_pagecount":2338861}

๋” ์ฝ์–ด๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ์—ฌ๊ธฐ์— NoSQL์— ๋Œ€ํ•ด

๋ฌด์—‡์„ ๊ณต๋ถ€ํ• ๊นŒ์š”?

๋Œ€์‹  ์—ฌ๊ธฐ์„œ๋Š” ์ž‘์—…, ํ•ด๋‹น ์ž‘์—…์˜ ์†์„ฑ, ์ด ์„ค๋ช…์— ๋งž๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ NoSQL ์‹œ์Šคํ…œ์„ ์ฒ ์ €ํžˆ ๋ถ„์„ํ•œ ๋‹ค์Œ ์ด ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์—ฐ๊ตฌ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŒ… ์ฟผ๋ฆฌ ์–ธ์–ด

์ฒ˜์Œ์—๋Š” Python์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๊ฒƒ๊ณผ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ฟผ๋ฆฌ์— ๊ด€ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 

  • Pandas๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๋ฐ์ดํ„ฐ ๊ณผํ•™์˜ ์Šค์œ„์Šค ๊ตฐ์šฉ ์นผ์ด๋ฉฐ, ๊ทธ ์•ˆ์—์„œ ์—„์ฒญ๋‚œ ์–‘์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜, ์ง‘๊ณ„ ๋“ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • Numpy - ๋ฒกํ„ฐ ๊ณ„์‚ฐ, ํ–‰๋ ฌ ๋ฐ ์„ ํ˜• ๋Œ€์ˆ˜ํ•™์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Scipy - ์ด ํŒจํ‚ค์ง€์—๋Š” ๋งŽ์€ ์ˆ˜ํ•™, ํŠนํžˆ ํ†ต๊ณ„๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Jupyter ์—ฐ๊ตฌ์†Œ - ๋งŽ์€ ํƒ์ƒ‰์  ๋ฐ์ดํ„ฐ ๋ถ„์„์ด ๋…ธํŠธ๋ถ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ์•Œ์•„๋‘๋ฉด ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์š”์ฒญ - ๋„คํŠธ์›Œํฌ ์ž‘์—….
  • Pyspark๋Š” ๋ฐ์ดํ„ฐ ์—”์ง€๋‹ˆ์–ด๋“ค ์‚ฌ์ด์—์„œ ๋งค์šฐ ์ธ๊ธฐ๊ฐ€ ๋†’์œผ๋ฉฐ, ๋‹จ์ˆœํžˆ ์ธ๊ธฐ๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ œํ’ˆ์ด๋‚˜ Spark์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.
  • *Selenium - ์‚ฌ์ดํŠธ ๋ฐ ๋ฆฌ์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ ๋•Œ๋กœ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์˜ ์ฃผ์š” ์กฐ์–ธ: Python์„ ๋ฐฐ์šฐ์„ธ์š”!

ํŒ๋‹ค

๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

import pandas as pd
df = pd.read_csv(โ€œdata/dataset.csvโ€)
# Calculate and rename aggregations
all_together = (df[df[โ€˜trip_typeโ€™] == โ€œreturnโ€]
    .groupby(['start_station_name','end_station_name'])
                  	    .agg({'trip_duration_seconds': [np.size, np.mean, np.min, np.max]})
                           .rename(columns={'size': 'num_trips', 
           'mean': 'avg_duration_seconds',    
           'amin': min_duration_seconds', 
           โ€˜amax': 'max_duration_seconds'}))

๋ณธ์งˆ์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ ๊ณ ์ „์ ์ธ SQL ํŒจํ„ด์— ๋งž๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT start_station_name, end_station_name, count(trip_duration_seconds) as size, โ€ฆ..
FROM dataset
WHERE trip_type = โ€˜returnโ€™
GROUPBY start_station_name, end_station_name

๊ทธ๋Ÿฌ๋‚˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ์ด ์ฝ”๋“œ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ์™€ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ผ๋ถ€๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” Python ํŒŒ์ดํ”„๋ผ์ธ์— ์ฟผ๋ฆฌ๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ƒํ™ฉ์—์„œ๋Š” Pandas ๋˜๋Š” pySpark์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ฟผ๋ฆฌ ์–ธ์–ด๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์œผ๋กœ pySpark์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •์‹ ์œผ๋กœ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ํ†ตํ•ด ์œ ์‚ฌํ•œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

df.filter(df.trip_type = โ€œreturnโ€)
  .groupby(โ€œdayโ€)
  .agg({duration: 'mean'})
  .sort()

์–ด๋””์„œ, ๋ฌด์—‡์„ ์ฝ์„๊นŒ

์ผ๋ฐ˜์ ์œผ๋กœ Python ์ž์ฒด์— ๋Œ€ํ•ด ๋ฌธ์ œ ์—†์Œ ๊ณต๋ถ€ํ•  ์ž๋ฃŒ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. ์˜จ๋ผ์ธ์—๋Š” ์ˆ˜๋งŽ์€ ํŠœํ† ๋ฆฌ์–ผ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŒฌ๋”, ํŒŒ์ด์ŠคํŒŒํฌ ๊ทธ๋ฆฌ๊ณ  ๊ฐ•์ขŒ ๋ถˆ๊ฝƒ (๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ž์ฒด๋กœ๋„ DS). ์ „๋ฐ˜์ ์œผ๋กœ ์—ฌ๊ธฐ์— ์žˆ๋Š” ์ฝ˜ํ…์ธ ๋Š” ์ธํ„ฐ๋„ท ๊ฒ€์ƒ‰์— ์ ํ•ฉํ•˜๋ฉฐ ์ง‘์ค‘ํ•  ํŒจํ‚ค์ง€ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค๋ฉด ๋‹น์—ฐํžˆ pandas๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. DS+Python ์†Œ์žฌ์˜ ์กฐํ•ฉ์— ๋Œ€ํ•ด์„œ๋„ ๋Œ€๋‹จํžˆ.

์ฟผ๋ฆฌ ์–ธ์–ด๋กœ์„œ์˜ ์…ธ

์ œ๊ฐ€ ์ž‘์—…ํ•œ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๋ฐ ๋ถ„์„ ํ”„๋กœ์ ํŠธ ์ค‘ ์ƒ๋‹น์ˆ˜๋Š” ์‹ค์ œ๋กœ Python, Java์—์„œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ์™€ ์…ธ ๋ช…๋ น ์ž์ฒด์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ผ๋ฐ˜์ ์œผ๋กœ bash/zsh/etc์˜ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ผ์ข…์˜ ์ƒ์œ„ ์ˆ˜์ค€ ์ฟผ๋ฆฌ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  ๊ฑฐ๊ธฐ์— ๋ฃจํ”„๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” ์‰˜ ์–ธ์–ด์˜ DS ์ฝ”๋“œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค). ๊ฐ„๋‹จํ•œ ์˜ˆ - ์œ„ํ‚ค๋ฐ์ดํ„ฐ์˜ QID ๋งคํ•‘๊ณผ ๋Ÿฌ์‹œ์•„์–ด ๋ฐ ์˜์–ด ์œ„ํ‚ค์— ๋Œ€ํ•œ ์ „์ฒด ๋งํฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด bash์˜ ๋ช…๋ น์—์„œ ๊ฐ„๋‹จํ•œ ์š”์ฒญ์„ ์ž‘์„ฑํ–ˆ๊ณ  ์ถœ๋ ฅ์„ ์œ„ํ•ด Python์œผ๋กœ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •๋ฆฌํ•˜์„ธ์š”:

pv โ€œdata/latest-all.json.gzโ€ | 
unpigz -c  | 
jq --stream $JQ_QUERY | 
python3 scripts/post_process.py "output.csv"

์–ด๋””์—์„œ

JQ_QUERY = 'select((.[0][1] == "sitelinks" and (.[0][2]=="enwiki" or .[0][2] =="ruwiki") and .[0][3] =="title") or .[0][1] == "id")' 

์‹ค์ œ๋กœ ์ด๋Š” ํ•„์š”ํ•œ ๋งคํ•‘์„ ์ƒ์„ฑํ•œ ์ „์ฒด ํŒŒ์ดํ”„๋ผ์ธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณด์‹œ๋‹ค์‹œํ”ผ ๋ชจ๋“  ๊ฒƒ์ด ์ŠคํŠธ๋ฆผ ๋ชจ๋“œ์—์„œ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • pv filepath - ํŒŒ์ผ ํฌ๊ธฐ์— ๋”ฐ๋ผ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์„ ์ œ๊ณตํ•˜๊ณ  ํ•ด๋‹น ๋‚ด์šฉ์„ ๊ณ„์† ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • unpigz -c ์•„์นด์ด๋ธŒ์˜ ์ผ๋ถ€๋ฅผ ์ฝ๊ณ  jq์— ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ‚ค๊ฐ€ ์žˆ๋Š” jq - ์ŠคํŠธ๋ฆผ์€ ์ฆ‰์‹œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Python์˜ ํ›„์ฒ˜๋ฆฌ๊ธฐ(์ฒซ ๋ฒˆ์งธ ์˜ˆ์™€ ๋™์ผ)์— ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚ด๋ถ€์ ์œผ๋กœ ํฌ์ŠคํŠธ ํ”„๋กœ์„ธ์„œ๋Š” ์ถœ๋ ฅ ํ˜•์‹์„ ์ง€์ •ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์ƒํƒœ ๋จธ์‹ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. 

์ „์ฒด์ ์œผ๋กœ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ(0.5TB)์— ๋Œ€ํ•ด ํ๋ฆ„ ๋ชจ๋“œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ณต์žกํ•œ ํŒŒ์ดํ”„๋ผ์ธ์€ ์ƒ๋‹นํ•œ ๋ฆฌ์†Œ์Šค ์—†์ด ๊ฐ„๋‹จํ•œ ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ๋ช‡ ๊ฐ€์ง€ ๋„๊ตฌ๋กœ ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ํŒ: ํ„ฐ๋ฏธ๋„์—์„œ ์ž˜ ์ž‘๋™ํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ bash/zsh/etc๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์–ด๋””์— ์œ ์šฉํ• ๊นŒ์š”? ์˜ˆ, ๊ฑฐ์˜ ๋ชจ๋“  ๊ณณ์—์„œ ๋‹ค์‹œ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ, ์ธํ„ฐ๋„ท์—๋Š” ๊ณต๋ถ€ํ•  ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์—ฌ๊ธฐ์„œ๋Š” ์ด ๋‚ด ์ด์ „ ๊ธฐ์‚ฌ.

R ์Šคํฌ๋ฆฝํŒ…

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ๋…์ž๋Š” ์ด๋ ‡๊ฒŒ ์™ธ์น  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์Œ, ์ด๊ฒƒ์€ ์ „์ฒด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ž…๋‹ˆ๋‹ค! ๋ฌผ๋ก  ๊ทธ๊ฐ€ ์˜ณ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์‹ค์ œ๋กœ ์ฟผ๋ฆฌ ์–ธ์–ด์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋งฅ๋ฝ์—์„œ R์„ ์ž์ฃผ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

R์€ ์ •์  ์ปดํ“จํŒ…๊ณผ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•œ ํ†ต๊ณ„ ์ปดํ“จํŒ… ํ™˜๊ฒฝ์ด์ž ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ์ด).

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
์ทจํ•œ ๋”ฐ๋ผ์„œ. ๊ทธ๋Ÿฐ๋ฐ, ์ข‹์€ ์ž๋ฃŒ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž๊ฐ€ R์„ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์ ์–ด๋„ R์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถ„์„ํ•˜๋Š” IT๊ฐ€ ์•„๋‹Œ ์‚ฌ๋žŒ๋“ค์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณณ์—์„œ ์ด๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์ œ์•ฝ ๋ถ€๋ฌธ.
  • ์ƒ๋ฌผํ•™์ž๋“ค.
  • ๊ธˆ์œต ๋ถ€๋ฌธ.
  • ํ†ต๊ณ„๋ฅผ ๋‹ค๋ฃจ๋Š” ์ˆœ์ˆ˜ ์ˆ˜ํ•™ ๊ต์œก์„ ๋ฐ›์€ ์‚ฌ๋žŒ๋“ค์ž…๋‹ˆ๋‹ค.
  • ์ „๋ฌธ ํ†ต๊ณ„ ๋ชจ๋ธ ๋ฐ ๊ธฐ๊ณ„ ํ•™์Šต ๋ชจ๋ธ(์ €์ž์˜ ๋ฒ„์ „์—์„œ R ํŒจํ‚ค์ง€๋กœ๋งŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Œ)

์‹ค์ œ๋กœ ์ฟผ๋ฆฌ ์–ธ์–ด์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ”ํžˆ ๋ฐœ๊ฒฌ๋˜๋Š” ํ˜•ํƒœ๋กœ๋Š” ์‹ค์ œ๋กœ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ฟผ๋ฆฌ(๋ชจ๋ธ) ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ggplot2 ๋“ฑ์˜ ํŒจํ‚ค์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋“ฑ ๋ชจ๋ธ์„ ์ƒ์„ฑํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์ธ๋ฐ, ์ด๊ฒƒ๋„ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ˜•ํƒœ๋‹ค. .

์‹œ๊ฐํ™” ์ฟผ๋ฆฌ ์˜ˆ์‹œ

ggplot(data = beav, 
       aes(x = id, y = temp, 
           group = activ, color = activ)) +
  geom_line() + 
  geom_point() +
  scale_color_manual(values = c("red", "blue"))

์ผ๋ฐ˜์ ์œผ๋กœ R์˜ ๋งŽ์€ ์•„์ด๋””์–ด๊ฐ€ ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„ ๋ฐ ๋ฐ์ดํ„ฐ ๋ฒกํ„ฐํ™”์™€ ๊ฐ™์€ pandas, numpy ๋˜๋Š” scipy์™€ ๊ฐ™์€ Python ํŒจํ‚ค์ง€๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์—ˆ์œผ๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ R์˜ ๋งŽ์€ ๊ฒƒ๋“ค์ด ์ต์ˆ™ํ•˜๊ณ  ํŽธ๋ฆฌํ•ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์—ฐ๊ตฌํ•  ์†Œ์Šค๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด.

์ง€์‹ ๊ทธ๋ž˜ํ”„

์—ฌ๊ธฐ์„œ๋Š” ์ง€์‹ ๊ทธ๋ž˜ํ”„์™€ ๊ทธ๋ž˜ํ”„์šฉ ์ฟผ๋ฆฌ ์–ธ์–ด๋กœ ์ž‘์—…ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๊ฝค ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„ ํŠน์ดํ•œ ๊ฒฝํ—˜์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ด ๋ถ€๋ถ„์€ ์ข€ ๋” ์ด๊ตญ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋งŒ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ๊ณ ์ •๋œ ์Šคํ‚ค๋งˆ๊ฐ€ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์Šคํ‚ค๋งˆ๊ฐ€ ์œ ์—ฐํ•˜๋ฉฐ ๊ฐ ์กฐ๊ฑด์ž๋Š” ์‹ค์ œ๋กœ "์—ด" ๊ทธ ์ด์ƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์‚ฌ๋žŒ์„ ๋ชจ๋ธ๋งํ•˜๊ณ  ํ•ต์‹ฌ ์‚ฌํ•ญ์„ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํŠน์ • ์‚ฌ๋žŒ์ธ Douglas Adams๋ฅผ ์„ ํƒํ•˜๊ณ  ์ด ์„ค๋ช…์„ ๊ธฐ์ดˆ๋กœ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
www.wikidata.org/wiki/Q42

๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์—„์ฒญ๋‚œ ์ˆ˜์˜ ์—ด์ด ํฌํ•จ๋œ ๊ฑฐ๋Œ€ํ•œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ๋Œ€๋ถ€๋ถ„์€ NULL์ด๊ฑฐ๋‚˜ ์ผ๋ถ€ ๊ธฐ๋ณธ False ๊ฐ’์œผ๋กœ ์ฑ„์›Œ์ ธ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•œ๊ตญ ๊ตญ๋ฆฝ ๋„์„œ๊ด€ ํ•ญ๋ชฉ - ๋ฌผ๋ก  ๋ณ„๋„์˜ ํ…Œ์ด๋ธ”์— ๋„ฃ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋Š” ๊ถ๊ทน์ ์œผ๋กœ ๊ณ ์ •๋œ ๊ด€๊ณ„ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ ์–ด๋กœ ์œ ์—ฐํ•œ ๋…ผ๋ฆฌ ํšŒ๋กœ๋ฅผ ๋ชจ๋ธ๋งํ•˜๋ ค๋Š” ์‹œ๋„์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
๋”ฐ๋ผ์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ๊ทธ๋ž˜ํ”„ ๋˜๋Š” ์ด์ง„ ๋ฐ ๋‹จํ•ญ ๋ถ€์šธ ํ‘œํ˜„์‹์œผ๋กœ ์ €์žฅ๋œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”.

์–ด๋””์„œ ์ด๋Ÿฐ ์ผ์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋‚˜์š”? ์ฒซ์งธ๋กœ, ๋ฐ์ดํ„ฐ ์œ„ํ‚ค, ๊ทธ๋ž˜ํ”„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋˜๋Š” ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ.

๋‹ค์Œ์€ ์ œ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์ž‘์—…ํ•œ ์ฃผ์š” ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

์ŠคํŒŒํด

์œ„ํ‚ค :
SPARQL(์žฌ๊ท€ ์•ฝ์–ด ๋ถ€ํ„ฐ ๊ณตํ•™๊ณผ. SPARQL ํ”„๋กœํ† ์ฝœ ๋ฐ RDF ์ฟผ๋ฆฌ ์–ธ์–ด) - ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด, ๋ชจ๋ธ๋กœ ํ‘œํ˜„๋จ RDF๊ณผ ํ”„๋กœํ† ์ฝœ ์ด๋Ÿฌํ•œ ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ  ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค. SPARQL์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค W3C ์ปจ์†Œ์‹œ์—„ ๊ทธ๋ฆฌ๊ณ  ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜ ์‹œ๋งจํ‹ฑ ์›น.

๊ทธ๋Ÿฌ๋‚˜ ์‹ค์ œ๋กœ๋Š” ๋…ผ๋ฆฌ์  ๋‹จํ•ญ ๋ฐ ์ดํ•ญ ์กฐ๊ฑด๋ถ€์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋ถ€์šธ ํ‘œํ˜„์‹์—์„œ ์ˆ˜์ •๋œ ๊ฒƒ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์„ ์กฐ๊ฑด๋ถ€๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค(๋งค์šฐ ๋‹จ์ˆœํ™”๋จ).

SPARQL ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” RDF(Resource Description Framework) ๊ธฐ๋ฐ˜ ์ž์ฒด๋Š” ์‚ผ์ค‘ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. object, predicate, subject - ์ฟผ๋ฆฌ๋Š” ์ •์‹ ์— ์ง€์ •๋œ ์ œํ•œ ์‚ฌํ•ญ์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ํŠธ๋ฆฌํ”Œ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. p_55(X, q_33)์ด ์ฐธ์ธ X๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฌผ๋ก  p_55๋Š” ID 55์™€์˜ ์ผ์ข…์˜ ๊ด€๊ณ„์ด๊ณ  q_33์€ ID 33์„ ๊ฐ€์ง„ ๊ฐ์ฒด(์—ฌ๊ธฐ์„œ ๊ทธ๋ฆฌ๊ณ  ์ „์ฒด ์ด์•ผ๊ธฐ, ๋‹ค์‹œ ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์ƒ๋žตํ•จ).

๋ฐ์ดํ„ฐ ํ‘œํ˜„์˜ ์˜ˆ:

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 
๊ตญ๊ฐ€๋ณ„ ์‚ฌ์ง„ ๋ฐ ์˜ˆ์‹œ๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”. ๋”ฐ๋ผ์„œ.

๊ธฐ๋ณธ ์ฟผ๋ฆฌ ์˜ˆ

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๋Š” ์ˆ ์–ด์— ๋Œ€ํ•ด ?country ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฐพ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.
member_of, member_of(?country,q458) ๋ฐ q458์ด ์œ ๋Ÿฝ ์—ฐํ•ฉ์˜ ID์ธ ๊ฒƒ์€ ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค.

Python ์—”์ง„ ๋‚ด๋ถ€์˜ ์‹ค์ œ SPARQL ์ฟผ๋ฆฌ ์˜ˆ:

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 

์ผ๋ฐ˜์ ์œผ๋กœ SPARQL์„ ์ž‘์„ฑํ•˜๋Š” ๋Œ€์‹  ์ฝ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฒ€์ƒ‰๋˜๋Š” ๋ฐฉ์‹์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ตœ์†Œํ•œ ๊ธฐ๋ณธ ์ˆ˜์ค€์—์„œ ์–ธ์–ด๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•œ ๊ธฐ์ˆ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

์˜จ๋ผ์ธ์œผ๋กœ ๊ณต๋ถ€ํ•  ์ž๋ฃŒ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ ์ด ะธ ์ด. ์ €๋Š” ๋ณดํ†ต Google์—์„œ ํŠน์ • ๋””์ž์ธ๊ณผ ์˜ˆ์‹œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š”๋ฐ, ์ง€๊ธˆ์€ ๊ทธ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ์  ์ฟผ๋ฆฌ ์–ธ์–ด

๋‚ด ๊ธฐ์‚ฌ์—์„œ ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ๋Š” ์™œ ๋…ผ๋ฆฌ์  ์–ธ์–ด๊ฐ€ ์ฟผ๋ฆฌ ์ž‘์„ฑ์— ์ ํ•ฉํ•œ์ง€ ๊ฐ„๋žตํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ RDF๋Š” p(X) ๋ฐ h(X,Y) ํ˜•์‹์˜ ๋…ผ๋ฆฌ๋ฌธ ์ง‘ํ•ฉ์ด๋ฉฐ ๋…ผ๋ฆฌ ์ฟผ๋ฆฌ์˜ ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

output(X) :- country(X), member_of(X,โ€œEUโ€).

์—ฌ๊ธฐ์„œ๋Š” X์˜ ๊ฒฝ์šฐ country(X)๊ฐ€ ์ฐธ์ธ ๊ฒฝ์šฐ ์ƒˆ๋กœ์šด ์กฐ๊ฑด์ž ์ถœ๋ ฅ/1(/1์€ ๋‹จํ•ญ์„ ์˜๋ฏธ)์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, X๋Š” ๊ตญ๊ฐ€์ด๊ณ  member_of(X,"EU ")์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ด ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ์™€ ๊ทœ์น™์ด ๋ชจ๋‘ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ œ์‹œ๋˜๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ๋งค์šฐ ์‰ฝ๊ณ  ์ž˜ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๊ณ„ ์–ด๋””์—์„œ ๋งŒ๋‚ฌ๋‚˜์š”?: ํ•ด๋‹น ์–ธ์–ด๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํšŒ์‚ฌ์™€ ์‹œ์Šคํ…œ ํ•ต์‹ฌ์˜ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ์ „์ฒด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ-์ด๊ฒƒ์€ ๋‹ค์†Œ ์ด๊ตญ์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ ๋•Œ๋กœ๋Š” ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์œ„ํ‚ค๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ์  ์–ธ์–ด์˜ ์ฝ”๋“œ ์กฐ๊ฐ ์˜ˆ:

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 

์ž๋ฃŒ: ์—ฌ๊ธฐ์— ํ˜„๋Œ€ ๋…ผ๋ฆฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ Answer Set ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋งํฌ๋ฅผ ์ œ๊ณตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๊ณผํ•™์ž ๋…ธํŠธ: ๋ฐ์ดํ„ฐ ์ฟผ๋ฆฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๋งž์ถคํ˜• ๊ฒ€ํ† 

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€