Bạn đã biết cách giao tiếp với dữ liệu hiệu quả? Đây là cách Piktochart đã làm để giao tiếp với dữ liệu trở nên dễ dàng hơn
Trong những năm gần đây, tin tức về data science tràn ngập khắp mọi nơi, với các chủ đề nói về những đột phá trong deep learning. Máy móc giờ đây đã có thể học vẽ như Van Gogh hay chiến thắng kiện tướng cờ tướng thế giới. Có vô số các bài viết hướng dẫn bạn cách tạo ra những ...
Trong những năm gần đây, tin tức về data science tràn ngập khắp mọi nơi, với các chủ đề nói về những đột phá trong deep learning. Máy móc giờ đây đã có thể học vẽ như Van Gogh hay chiến thắng kiện tướng cờ tướng thế giới. Có vô số các bài viết hướng dẫn bạn cách tạo ra những neural networks, logistic regression, etc…Kết quả là có rất quan điểm cho rằng các công ty nên dựa trên data, xây dựng những AI nhằm có được lợi thế cạnh tranh trong kinh doanh.
Tuy vậy, theo quan điểm của cá nhân tôi, hiện tại có rất ít nguồn giải thích một cách bài bản, đa phần kiến thức chỉ được trình bày một cách sơ sài và thiếu hệ thống.
Trước hết, để tôi giải thích những công việc mà nhóm chuyên gia phân tích dữ liệu Pikochart. Chúng tôi tập trung vào phân tích thống kê tình hình kinh doanh của công ty và trình bày kết quả theo phương thức đơn giản, dễ hiểu nhất cho người dùng, Và từ đó đưa ra các dự báo. Với những sự hỗ trợ từ các thư viện như D3, data visualization đã trở nên phổ biến hơn.
Do đó, tôi muốn cho bạn biết các phương thức mà chúng tôi đã sử dụng để giao tiếp với dữ liệu và giúp đỡ các nhân viên khác trong công việc của họ.
Cho những người yêu thích bảng tính của Google
Bảng tính một trong những công cụ cơ bản được sử dụng trong phân tích dữ liệu, không mấy xa lạ với Piktochart nó rất được team Marketing yêu thích bởi giao diện quen thuộc, dễ sử dụng và khả năng chia sẻ dễ dàng
Tuy vậy, bảng tính chắc chắn không phải là công cụ mà chúng tôi thích sử dụng. Bởi việc lấy data từ các bảng SQL hay các log như JSON sẽ cần một công cụ linh hoạt có thể thực hiện được nhiều tác vụ khác nhau, mỗi công cụ có các thư viện thích hợp để làm việc với dữ liệu. Đó là nguyên nhân vì sao chúng tôi chọn Python, một quyết định tuyệt vời bởi thưu viện pandas của nó.
Với Piktochark, các phân tích được thực hiện với sự giúp đỡ Pandas, nhưng thật không may chúng thiếu phần tự động hóa và nạp các số liệu bảng tính bằng tay. Và kết quả là, hàng tuần các đồng nghiệp của chúng tôi luôn hỏi về các số liệu mới cập nhật trong tuần, và điều đó thật phiền phức.
Rất may là Python có một hệ hệ sinh thái vô cùng phong phú, có cả các thư viện chuyên về bảng tính của Google. Chúng tôi chọn gspread module, cực kì tiện lợi với Google Spreadsheets API.
Ví dụ, hàm cơ bản sau cho phép chèn một danh sách các giá trị vào một hàng đã có:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import os import slackclient def slack_message(text, channel="@flavien", botname="statistics", icon=":python:"): """ This function sends a message to Slack. Args: text (str): text of the message channel: the channel/user to whom the message is sent (default: @flavien) botname (str): the name of the bot (default: statistics) icon (str): the bot icon (default: :python:) """ # The Slack token is kept in an environment variable for security purposes. slack_token = os.environ["SLACK_TOKEN"] slackclient.SlackClient(slack_token).api_call( "chat.postMessage", channel=channel, text=text, username=botname, icon_emoji=icon ) |
Một trong những lợi thế của cách này là ta có thể thêm hàng vào mà không làm thay đổi cả bảng tính. Ngoài ra, để cho dễ nhìn ta có thể highlight hoặc thêm comment. Từ đó bảo đảm, thông tin được trình bày rõ ràng mà không làm thay đổi format của toàn bộ bảng tính.
Tuy vậy, nó có yếu điểm là khi thêm vào một hàng, thư viện cần phải build lại toàn bộ những hàng nằm dưới hàng được thêm vào.
Giải pháp là, kết hợp với gspread sử dụng Google Drive Python API, tạo ra các scripts dùng để upload hoặc delete cả files chứ không riêng gì spreadsheets trong Google Drive của công ty.
Với chỉ vài dòng code, chúng ta có thể tự động hóa nhiều tác vụ lặp đi lặp lại để theo dõi các thí nghiệm khác nhau và phân tích sâu hơn bằng cách kết hợp nhiều nguồn dữ liệu lại với nhau.
Ví dụ: Chúng tôi thử nghiệm với tự động hóa giúp tăng lượng khách hàng signup. Bắt đầu với việc khai thác dữ liệu thuê bao đến từ WordPress platform và các hoạt động từ database hỗ trợ app cũng như hợp nhất chúng thành một file trong table format. Tiếp theo ta sẽ dùng code sau để upload chúng lên Google Drive.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# service (Google Drive API service object): see https://developers.google.com/drive/v3/web/quickstart/python # file_metadata = dict( name="your_file_name", parents=["Google_Drive_folder_id"], mimeType="application/vnd.google-apps.spreadsheet" ) media = apiclient.http.MediaFileUpload( path_to_CSV_file, mimetype="text/csv", resumable=True ) created_file = service.files().create(body=file_metadata, media_body=media, fields="id").execute() |
Bằng cách impose `mimeType="application/vnd.google-apps.spreadsheet"` vào trong file meta-data, một CSV file đơn giản - `mimetype="text/csv"` – sẽ tự động được chuyển sang bảng tính khi thêm vào Google Drive. Mặc định, không có file nào trong Google Drive bị ghi đè lên. Do đó , nếu bạn muốn cập nhật một tập tin riêng có, bạn sẽ cần phải xóa version có sẵn (nó có thể thực hiện tự động với API).
Cuối cùng, để có thể tối ưu hóa và cải thiện thì số liệu thực nghiệm cần phải thường xuyên được kiểm tra và đánh giá. Để đạt được điều này thì chỉ là vấn đề thời gian chạy script, trên các server chuyên dùng để phân tích dữ liệu. Và giờ đây các thành viên có thể đọc và phân tích các báo cào được cập nhật hàng tuần.
Dành cho người lười biếng: Slack
Tự động hóa bảng tính đóng vai trò quan trọng, và việc khiến các đồng nghiệp hứng thú với Data cũng là một thử thách mà chúng tôi cần phải vượt qua. Nhận ra việc họ không hề muốn động vào dù dữ liệu đã được có sẵn. Nói cách khác, họ muốn dữ liệu phải được trình bày sẵn cho họ.
Bởi vì chúng tôi đã dùng Slack trong giao tiếp nội bộ nên cũng dùng slackclient, một thư viện Python liên quan tới Slack API. Với chỉ vài dòng code, chúng tôi có thể trực tiếp chia sẻ số liệu với các đồng nghiệp trong khi vẫn giữ hồ sơ các bảng tính ở trên.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
import os import slackclient def slack_message(text, channel="@flavien", botname="statistics", icon=":python:"): """ This function sends a message to Slack. Args: text (str): text of the message channel: the channel/user to whom the message is sent (default: @flavien) botname (str): the name of the bot (default: statistics) icon (str): the bot icon (default: :python:) """ # The Slack token is kept in an environment variable for security purposes. slack_token = os.environ["SLACK_TOKEN"] slackclient.SlackClient(slack_token).api_call( "chat.postMessage", channel=channel, text=text, username=botname, icon_emoji=icon ) |
Hình dưới đây là kết quả của output cho signups mới của chúng tôi.
Nâng cao khả năng đọc dữ liệu: Jupyter notebooks
Theo kinh nghiệm của tôi, việc sử dụng số liệu để giải thích luôn là điều cần thiết. Nó giúp họ hiểu nhanh hơn cũng như dễ hình dung khi hiểu được quá trình trích xuất dữ liệu và những hạn chế của nó.
Tuy nhiên, giải thích cũng cần phải có thời gian, ngoài ra cũng không thể dùng comment trong bảng tính nhằm để tránh nhầm lẫn. Vấn đề này chỉ vừa mới được giải quyết gần đây.
Chúng tôi sử dụng Jupyter notebooks để thực hiện việc phân tích. Nếu bạn không biết thì nó cung cấp một giao diện vô cùng mạnh mẽ và tiện lợi dựa trên công nghệ web để giữ code, comments và visualizations ở một chỗ. Ta có thể dùng desktop app interact như một lựa chọn thay thế khác cho giao diện trình duyệt web. Notebook là một công cụ vô cùng tuyệt vời để chia sẻ và được dùng rộng rãi trong giáo dục.
Một tính năng vô cùng thú vị của notebook là sự linh hoạt của chún. Nó cũng là một cách tuyệt vời để các developer bàn luận code. Notebooks cũng có thể được biến đổi trực tiếp thành các HTML page thông qua:
1 2 3 |
jupyter nbconvert your_notebook.ipynb --to html |
Command này cung cấp một HTML page với những đặc điểm cơ bản, chứa đựng toàn bộ mọi thứ từ code cho đến outputs, table, comments và cả charts.
Để cho nó phù hợp với các đồng nghiệp của tôi, templates đã được sử dụng để tinh chỉnh kết quả thông qua:
1 2 3 |
`jupyter nbconvert your_notebook.ipynb --to html --template extended-basic.tpl` |
Và cho kết quả như sau:
cũng như
Lí do tôi chọn template extended-basic.tpl là vì toàn bộ các ô chứa code đều đã xóa bởi mục đích thiết kế cần phải theo đúng những yêu cầu sau:
- Chiều rộng văn bản được giới hạn với chỉ 75 kí tự.
- Cách đặt tên cột, kiểu số, và định dạng được lấy ý tưởng từ bài viết này
- Biểu đồ được dựa trên hướng dẫn của Sunlight Foundation mà tôi đã khám phá qua blog của Andy Kirk với một số chỉnh sửa từ bài viết này.
Trong khi chúng ta dùng matplotlib và seaborn cho biểu đồ tĩnh, bởi vì ta tạo ra báo cáo HTML, việc lợi dụng những tương tác trở nên khả thi. Tôi hiện dùng plot.ly open-source Python libraries vốn có tính năng dùng để zoom, data selection, hoặc annotations.
Mọi thứ ở trên đều giúp các đồng nghiệp của chúng tôi hiểu rõ các bước phân tích và biểu đồ nhằm nắm vững nội dung từ chúng.
Ngoài ra nó còn có thể tự động execute notebooks nhờ vào `nbconvert` library dưới đây:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
import nbformat from nbconvert.preprocessors import ExecutePreprocessor from nbconvert import HTMLExporter import os import codecs import jinja2 def nb_to_html(notebook_path, template_path="basic", version=4, timeout=3600, kernel="python3"): """ This functions executes a Jupyter notebook and creates the related HTML file. Args: notebook_path (str): notebook path template_path (str): template path version (int): version of the notebook timeout (float): maximum time spent per cell kernel (str) """ if os.path.isfile(notebook_path): with open(notebook_path, "r") as f: nb = nbformat.read(f, as_version=version) ep = ExecutePreprocessor(timeout=timeout, kernel_name=kernel) ep.preprocess(nb, {"metadata": {"path": "."}}) notebook_folder, notebook = os.path.split(notebook_path) with open("/tmp/" + notebook, "wt") as f: nbformat.write(nb, f) html_exporter = HTMLExporter() if os.path.isfile(template_path): template_folder, template = os.path.split(template_path) loader = jinja2.FileSystemLoader(template_folder) html_exporter.extra_loaders = [loader] html_exporter.template_file = template.replace(".tpl", "") with open("/tmp/" + notebook, mode="r") as f: notebook_exe = nbformat.reads("".join(f.readlines()), as_version=version) (body, _) = html_exporter.from_notebook_node(notebook_exe) codecs.open(notebook_folder + "/" + notebook.replace(".ipynb", ".html"), "w", encoding="utf-8").write(body) else: print("{} does not exist.".format(notebook_path)) |
Tôi sử dụng code ở những phần trước để tạo ra một bảng báo cáo HTML cập nhật. Files được bỏ vào một Amazon S3 bucket vốn được truy vấn bởi máy chủ bao gồm các báo cáo có sẵn.
Lời kết
Trên đây chỉ là một vài gợi ý, ngoài ra có vô số những platform cung cấp khả năng đưa ra báo cáo dựa trên SQL như plot.ly hoặc Mode và hỗ trợ Jupyter notebooks và online dashboards. Microsoft Azure, Google Cloud hoặc Amazon AWS cũng phát triển những tin năng tương tự trên nền tảng của họ. Bảng điều khiển có thể dễ dàng được thiết lập từ notebooks bởi Layout extension hoặc bằng cách dùng widgets.
Chúng tôi chọn cách thức đơn giản nhất để cho phép các thành viên quen thuộc với tool nhưng cũng xem xét các giải pháp SaaS để cải thiện quá trình chia sẻ phân tích dữ liệu.
1/12 này, tại Vietnam Web Summit 2017 anh ELVIN LEE – Chief Product Officer (CPO) của Piktochart cùng đội ngũ lập trình của mình sẽ có những chia sẽ rõ hơn về chủ để này. Nhanh tay đăng kí những slot giới hạn cuối cùng gặp gỡ anh Elvin Lee tại: https://vietnamwebsummit.com/vi/ve-tham-du/
Techtalk via piktochart