1 전반적인 작업흐름

전문 문서를 제작하기 위해서는 다양한 요소가 기술적으로 결합되어야만 된다.

  1. 정형 데이터: 관계형 데이터베이스 → 데이터 과학을 위한 기반 데이터
  2. 데이터 과학 문서: R + 마크다운 → 그래프, 표, 모형, \(\cdots\)
  3. 문서 책 저작: \(\LaTeX\) → PDF 문서

상기 세가지 요소가 유기적으로 연결이 되어야만 전문적인 보고서 문서를 제작할 수 있다.

2 가짜 데이터 만들기 [^faker]

[]: Dale Seo (Mar 14, 2020), “파이썬으로 가짜 데이터 생성하기 - Faker”, Engineering Blog

데이터 과학을 하다보면 처음 데이터가 필요한 경우가 많다. 이런 경우 가짜 데이터를 만들어서 원하는 결과를 얻은 후에 나중에 이를 실데이터로 치환하는 경우 생산성을 많이 높일 수 있고 사전에 관련 문제를 해결하는데 도움을 주기도 한다. profile() 메쏘드를 사용해서 기본 데이터를 얻을 수 있지만 특정 필요한 필드만 정의해서 개인 신상에 대한 가짜 데이터도 얻을 수 있다.

from faker import Faker
import pandas as pd

fake = Faker("ko_KR")

# def create_rows_faker(num=1):
#     output = [{"name"       : fake.name(),
#                "email"      : fake.email(),
#                # "company"    : fake.company(),
#                # "job"        : fake.job(),
#                # "credit card": fake.credit_card_provider(),
#                # "city"       : fake.city(),
#                # "ip_address" : fake.ipv4_private(),
#                # "profile"    : fake.profile(),
#                # "date_time"  : fake.date_time(),
#                "address"    : fake.address()} for x in range(num)]               
#     return output
# 
# df_faker = pd.DataFrame(create_rows_faker(100))

profiles = [fake.profile() for i in range(10)]
df_faker = pd.DataFrame(profiles)

df_faker.head()
                job   company  ...                mail   birthdate
0    전기공학 기술자 및 연구원  주식회사 박하김  ...         zi@nate.com  2005-10-16
1            여행 사무원       김이박  ...  ijihu@dreamwiz.com  1974-12-25
2               소방관       윤김김  ...   minjun77@live.com  1970-12-21
3  국가/지방 및 공공행정 사무원  주식회사 강이나  ...        sju@nate.com  1956-10-04
4               주조원    유한회사 이  ...  ijimin@hotmail.com  1992-10-17

[5 rows x 13 columns]
df_faker.to_csv("data/faker.csv", sep = "|", na_rep = "NaN")

파이썬 Faker로 생성한 가짜 데이터를 가지고 기본적인 통계 분석 작업을 수행하기에 앞서 생성한 가짜 고객데이터를 살펴본다.

library(tidyverse)
library(reticulate)

faker_tbl <- read_delim("data/faker.csv", delim = "|")

faker_tbl %>% 
  reactable::reactable()

FinanceDataReader 파이썬 팩키지를 활용하여 주식 데이터를 얻어온다.

  • pip install beautifulsoup4
  • pip install finance-datareader
import FinanceDataReader as fdr

# 삼성전자(005930) : (2017-01-0 ~ 2019-12-31)
samsung_df = fdr.DataReader('005930', '2017-01-01', '2019-12-31')

# Apple(AAPL) : (2017-01-0 ~ 2019-12-31)
apple_df = fdr.DataReader('AAPL', '2017-01-01', '2019-12-31')

# AMAZON(AMZN) : (2017-01-0 ~ 2019-12-31)
aws_df = fdr.DataReader('AMZN', '2017-01-01', '2019-12-31')

samsung_df.to_csv("data/stock_samsung.csv", sep = "|", na_rep = "NaN")
apple_df.to_csv("data/stock_apple.csv", sep = "|", na_rep = "NaN")
aws_df.to_csv("data/stock_aws.csv", sep = "|", na_rep = "NaN")

3 데이터베이스 구축

데이터베이스를 구축하고자 하는 경우 데이터베이스 시스템을 갖추고 데이터를 테이블로 저장한다.

# 고객 정보
faker_tbl <- read_delim("data/faker.csv", delim = "|") %>% 
  select(name, job, ssn, sex, address, mail, company)

samsung_tbl <- read_delim("data/stock_samsung.csv", delim = "|")
apple_tbl   <- read_delim("data/stock_apple.csv", delim = "|")
aws_tbl     <- read_delim("data/stock_aws.csv", delim = "|")

# 주가정보
stock_tbl <- samsung_tbl %>% 
  select(date = Date, samsung = Open) %>% 
  left_join(
    apple_tbl %>% 
    select(date = Date, apple = Open)
  ) %>% 
  left_join(
    aws_tbl %>% 
    select(date = Date, aws = Open)
  )

stock_tbl <- stock_tbl %>% 
  pivot_longer(cols = -date, names_to = "stock", values_to = "price")

# 주식 보유현황
set.seed(777)
investment_tbl <- tibble(name    = faker_tbl %>% select(name) %>% pull,
                         samsung = runif(nrow(faker_tbl), 0, 100) %>% round(., digits =0),
                         apple   = runif(nrow(faker_tbl), 0, 100) %>% round(., digits =0),
                         aws     = runif(nrow(faker_tbl), 0, 100) %>% round(., digits =0)) %>% 
  mutate(samsung = ifelse(samsung < 70, 0, samsung),
         apple   = ifelse(apple   < 70, 0, apple),
         aws     = ifelse(aws     < 70, 0, aws))

investment_tbl <- investment_tbl %>% 
  pivot_longer(cols = -name, names_to = "stock", values_to = "shares")

고객정보, 주식보유현황, 주가 정보가 있다고 가정하면 보유주식에 대한 시점별 주식변동에 따른 자산변동현황을 살펴볼 수 있다.

library(DBI)
library(RSQLite)
library(tidyverse)

# Create db ---------------------------------------------------------------

conn <- dbConnect(SQLite(), dbname="data/stock.sqlite")

# 테이블 넣기 ---------------------------------------------------------------

DBI::dbWriteTable(conn = conn, name = "customers",  value = faker_tbl, overwrite = TRUE)
DBI::dbWriteTable(conn = conn, name = "stocks",     value = stock_tbl, overwrite = TRUE)
DBI::dbWriteTable(conn = conn, name = "investment", value = investment_tbl, overwrite = TRUE)

dbDisconnect(conn)
library(datamodelr)
library(DiagrammeR)

conn <- dbConnect(SQLite(), dbname="data/stock.sqlite")

customers  <- tbl(conn, "customers") %>% collect()
stocks     <- tbl(conn, "stocks") %>% collect()
investment <- tbl(conn, "investment") %>% collect()

stock_investment_model <- dm_from_data_frames(customers, investment, stocks)

stock_investment_model <- dm_add_references(
  stock_investment_model,
  customers$name   == investment$name,
  investment$stock == stocks$stock
)

stock_investment_graph <- dm_create_graph(stock_investment_model, rankdir = "LR", col_attr = c("column", "type"))
dm_render_graph(stock_investment_graph)
dbDisconnect(conn)

4 DB 쿼리

앞서 작성한 데이터베이스에 접속하여 SQL Query 문을 보내 필요한 정보를 데이터베이스에서 추출한다.

stock_db <- DBI::dbConnect(RSQLite::SQLite(), dbname="data/stock.sqlite")

SQL 쿼리문을 작성하여 customers 테이블에서 필요한 정보를 추출한다.

SELECT name, sex, ssn, company FROM customers LIMIT 10;
Displaying records 1 - 10
name sex ssn company
손영수 M 340417-2709054 주식회사 박하김
황상현 M 820704-2383128 김이박
구영희 F 080004-1264494 윤김김
이현숙 F 030804-2160982 주식회사 강이나
윤성민 M 880726-2752760 유한회사 이
황영호 M 200422-2863944 주식회사 최
지병철 M 640618-1390728 유한회사 성민이
김건우 M 770203-1539912 (유) 전
류경희 F 730210-2716023 백박김
김혜진 F 800323-2972485 (주) 이박최
 

데이터 과학자 이광춘 저작

kwangchun.lee.7@gmail.com