大学2年生がマナビDX Questに駆け込んで変わったこと

この記事は 「[マナビDX Questで得たもの Advent Calendar 2024](https://qiita.com/advent-calendar/2024/manabi-dx-quest2024) 」20日目の記事です。
Qiitaで初投稿...ではありません。

# TL;DR

大学2年生がマナビDX Quest の全プログラムに取り組んでみたら
- 大学の試験との両立は辛かったが、それでも解答例と周りの受講生に助けられ修了できた
- 作図やテキスト加工にもっと効率を求めるようになった
- Python も Excel も便利な変換ツールとして使うようになった

# このひとだあれ？

「せし (@NitCelcius)」といいます

- いつもはゆるくプログラム書きつつ個人製作します
    - C# (.NET Core, Unity)
    - Next.js (ただしTypeScript以外受け付けない)
- 申し込み当時は大学2年生の夏まっただ中でした
- 当時プログラミングサークルの会長で C# 以外使わない狂信者でした
    - ゆえに Python のポテンシャルを知らなかった

# マナビDX Quest とは

一言で表現するならば

「無料で自律的にプログラミングとビジネス的観点からのデータ分析と実践手法が学べる勉強会」です。

名前の通り「DX」に関する用語や概念や実例、Python を使った実習、ビジネスでのプレゼンテーションのやり方などなど…..そういった資料や講義が、すべて**無料**で用意されています。応募時のテストさえクリアすれば SIGNATE さんから教材が提供され、最初は「**PBL**」なる名目で2～5ヶ月間ぶっ通しで勉強が始まります。

また、この勉強が終わると「**地域企業協働プログラム**」なるものに参加する権利が与えられます。実際の企業さんと生のデータ、生身の社会人さんと渡り合いながら実践する場所として、約2ヶ月間行う場所です。

プログラムについてさらに詳しくは、以下のページをご覧ください。

[デジタル推進人材育成プログラム「マナビDX Quest」](https://dxq.manabi-dx.ipa.go.jp/)

当時、同プログラムに私が応募したモチベーションは

1. 大学に入ってから学びだした Python で大規模なデータ分析がしたい！
2. 自分自身の書くコードやプレゼンが社会にどれだけ通用するか知りたい！
3. 学生として私が持つ「DX」への偏見を正したい (そして社会人は「DX」をどう認識しているのか？)

という3つでした。

いずれも過去に私が行っていたことに根ざしています。

1.  高校時代にVBAを書くなり Excel をいじるなりしたこと
2.  今までのコーディングがすべて自己満足の開発に留まっていてコードリーディングの経験に乏しかったこと
3. 「DX」「DX**化**」「DX**する**」といった「DX」はどの品詞なんだという議論が私の中で繰り広げられていたこと (プログラム参加のモチベーションには繋がらないかもしれませんが、恥ずかしい事実として「どれが正しいんだ？」と悩むレベルでした)

過去にデータ分析に苦労していた背景があったり、あるいはそれを生業として生きる人たちの考え方が知りたかったりといった具合で、自然とマナビDX Questへ応募していました。

# はじまり、の前に

マナビDX Quest に応募する際、小テスト(「アセスメント」と呼びます)を受けなければなりません。まずはこれのために練習をば…と思いましたが、実は申込時には締切2日前だったので YOLO[^1] っていう気持ちで受けていました。

[^1]: YOLO は “You Only Live Once” (人生一度きり) https://makitani.net/shimauma/you-only-live-once

- 基本的な関数 (”SUM” , “AVERAGE”) 、操作 (ソートと絞り込み、クエリ処理) ができれば大丈夫です
- 同機能が Python で実現できるならば、Pythonを使用してもよいです
- 日数がある限り、何度でも挑戦できます
    - ただしボーダーラインが公開されません
- **制限時間がすごく厳しいです**。(私は12秒残しでフィニッシュしましたが、辛かった…！)

なお、受講後は同じテスト以外に更に難しいテストにも挑戦できます。もちろんこちらも制限時間はもっと厳しいですが、できると気持ちよいです

# 基本的な流れ (PBL)

私が参加した際の「PBL」は以下の構成でした。PBLは第1タームと第2タームに分かれていますが、いずれもそれぞれ1～2週間のスパンで…

1. 課題を見つけて
2. それの根拠となるデータを見つけて可視化 & プレゼン
3. その課題に対してどうすればいいか考えて
4. 今までの内容をすべてプレゼンに起こして
5. フィードバックから軌道修正案を考える

という流れです。すべての課題をプログラム終了までにこなしていくとタームを修了できます。

第1タームと第2タームではそれぞれ、取り組みたい分野を元に教材を選ぶことができます。ただし第1タームで修了できない場合には第2タームは受講できないので、がんばって課題を提出することをおすすめします。

ちなみに、課題はフォーマットや解答例が提示されるので、それらを参考にしても、あるいは ChatGPT などなどツールを使うことも許可されています。したがって課題の提出自体は難しくありません。

本当に困った…！という際には、マナビDX Questの一つの特徴である「学び合うクルーであれ」が役に立ちます。受講生のうち同じ教材を選択した人たちで課題に関する質問やディスカッションができる Slack や、あるいは毎週に行われる受講生同士の話し合い (Saturday Salon)、また自治的に行われるイベントなど、様々話を聞くことのできるツールが存在します。

> ## "競争"と"共創"。学び合うクルーであれ。
>  — マナビDX Quest. [https://dxq.manabi-dx.ipa.go.jp](https://dxq.manabi-dx.ipa.go.jp/). “マナビDX Questが大切にしたいこと” のセクションより

課題に困ったらほかの受講生と助け合おう！ということを忘れないようにするとよいです。
(私は土曜日にアルバイトをしていたので、一切参加できなかったことが心残りです)

## Tip: Gold 修了というモチベーション

PBLの各ステップには締切があります。当時は2週間に1回の提出が必要でしたが、これらの締切をすべて守って提出することで「Gold 修了」のバッジがもらえます。~~(輝かしい…！)~~

ひとつでも締切をスキップした場合でも、プログラムが終了するまでにすべての課題を提出した場合には 「Silver 修了」のバッジがもらえます。

## PBLのひと味違うところ

マナビDX Quest のPBLでは、一部の課題に対してほかの受講生からレビューが飛んできます。いわゆる**相互レビュー**というもので、いくつか設定された評価軸に基づいて点数をつけよう！というものです。
一定期間中に数人のレビューが課され、これを提出することが求められます。期間中に「わ、そのスライドいいな」「自分の、あれでよかったのかなぁ」と思っても必ず提出しましょう。

レビュー完了後、この付けた点数が平均され(※厳密にはそうでないですが)、実際に上位 5% の受講者はランキングとして名前が公開されます。

点数以外にも個人からのフィードバックがあります。「ここ良かったね」「もっとここを改善すれば良いよ」のメッセージが飛んできて、実際に課題に対してとった戦略がどれほど有用であったのかの分析に使えます。

### ちなみに、この人の成績は？

- 第1ターム (レビュー2回)
    - データ分析課題: 8位
    - プレゼン課題: ランキング外
    - データ分析課題はデータの可視化が主であり様々な視点から分析しよう、考えを言語化しようという流れでした
    - プレゼン課題は評価軸の内容を一つ思いっきり忘れていたので点数が伸びずでした
    - そうそう、「スライドの背景が黒(``#081208``)なのはなぜですか？」という質問が飛んできたのを覚えています。なんでもメッセージどうぞ！という欄があって、そこに書かれていました。ここでその質問に回答すると…
        - ドーナツグラフなどの多くの系列が存在するグラフが多用されるプレゼンにおいては、なるべく系列を「イメージカラー」として議論を進めたかったのです。
        白色背景だと系列に使うカラフルな色の明度を落とすことで、黒色背景だと明度を上げることで背景色とのコントラストを確保できます。
        この際に、白背景だと明度を下げるために色相の違いがわかりにくい…！という問題点が浮かび、それに対して黒背景であれば明度が大きいので、色相の異なる色を並べたときに可読性が高かった、という理由がありました。
        - (HSL → RGB に変換するとき、十分な明度が確保されていることを前提に、彩度が大きければ大きいほど RGB 各成分の値が大きくなるので、結果として色相を変えたときのRGB成分の値の変化が大きくなるよ、という感覚からです)
- 第2ターム (レビュー1回)
    - プレゼン課題: 22位
    - 第2タームはスパンが短くてつらいです。毎週課題を出さないと Gold 修了できない…！というレベルでした
        - 大学の試験が被ってデスマーチが発生しました

# PBLのおわり、地域企業協働プログラムのはじまり

(~~Advent Calendar の締切に間に合わないので~~地域企業協働プログラムだけでかなり内容が濃いので、別記事にします…！)

# サイドディッシュ

- PBL、あるいは地域企業協働プログラムに参加中は SIGNATE の教材が開放され、自由に利用できます
    - 個人の感覚として、大学の講義を短時間にして、講義 : 実践 = 1 : 3 の配合になるよう内容が組まれているイメージでした
        - 「実践」には皆さんがイメージする通りの「小テスト」が入ってきます
    - 外出中、移動中にこつこつやっていくと「PBLのこの課題、SIGNATEで見たぞ？」が増えるので有利になります
    - 教材をこなすと EXP が溜まって LEVEL UP します。私の場合 Lv 44 で終わりました
- 主にPBLで出てくるビジネス用語やデータ分析・収集の手法、研究倫理を学んでいました
- データ分析にすでに慣れている方には、マナビDX Quest 内の受講生全員と競い合う「コンペ」に参加できます。一定に用意されたデータセットを学習させた機械学習モデルの性能を競うもので、[Kaggle](https://www.kaggle.com) と似た形式です

# 変わったこと

### 大規模なデータ分析は Python でも Excel でもできてしまう

- Excel は思うより強力です (※メモリが足りれば)
    - Excelだと実行途中の結果が見やすくまとめられ、説明なしにも「何がしたいか」を明確にまとめやすいです
    - Python みたいに上から下へのフローに固定されることなく、文脈と意図を持って「タテに、ヨコに」組んでいくことで可読性の高いシートができます
    - ただし、巨大なデータを分析する際には RAM の問題が出てきます
        - 16 GB のRAMを積んだノートパソコンで取り組んでいましたが、あっさりと「PCのメモリが不足しています」のウィンドウで Excel が落ちます
            - Excel はちゃんと 64-bit 版を導入しましょう (32-bit 版では使用できる RAM に制限があります)
            - 私の場合は、仮想メモリに48GB割り振る暴挙に出ることで改善しました
        - Numpyの裏で使われる C 言語のような固定された型の概念が Excel では薄いので、演算にはメモリと計算コストが多めにかかります
            - ~~Pythonのforループは低速~~
- Python は手軽 (※2) かつ高速です
    - Python には計算と処理の用途として numpy 、あるいは可視化の用途として matplotlib や seaborn など多様なライブラリが存在します
        - 特に統計計算においては、煩雑な計算手順を書かなくても加工ができます。
            - e.g. 四分位数を出すときに
                1. ソートして
                2. すべてのデータ数を出して
                3. それを4で割って
                4. この小数部が 0.5 であれば2つの数値の平均を取る
                5. そうでないなら該当するインデックスの値を抜き出す
            - という、まぁまぁ手間のかかるアルゴリズムを明示的に書かなくても ``DataFrame.quantile()`` で計算が完了します
    - 加工手順をコードとして記述するために再利用性が高く、データの使い回しも容易です
        - Jupyter Notebook を使えばデバッグとコードの可読性確保がしやすくなります (効率は度外視します)
    - 少し込み入った分析・加工には Excel よりも Python が有利な場合があります
        - e.g. `<2022-07-07, 192, 品物A, Hoge商店>` なるデータが飛んできたら `Win + R` → `python` と入力し `Enter` を押して、おもむろに以下のコードを入力します
            
            ```python
            raw = "<2022-07-07, 192, 品物A, Hoge商店>"[1:-1] # 最初と最後の文字を消して
            rawArr = raw.split(",") # カンマで区切って分割して
            cols = [s.strip() for s in rawArr] # 各要素の前後のスペースを消して
            date = cols[0] # 日付
            amount = int(cols[1]) # 金額(整数型)
            item_name = cols[2]
            store_display_name = cols[3]
            ```
            
          これで、関数に落とし込むなどしてこのコードを使い回せばデータ変換のしくみができてしまいます。GUI で逐一操作が必要な Excel より手順が少なくて楽です
        - Excel だと `TEXTSPLIT()` `SUBSTR()` `TRIM()` 関数あたりで同じ機能を実装できますが、セルの配置を考えつつこれを実現するのは手間がかかります
    - マナビDX Quest での Python の立ち位置は
        - プログラミングに触れたことがある人であれば、数時間でデータ分析用途に十分使えます 
        - インターネット上の記事からコピーするだけで実現できてしまうケースもある
        - AIもあなどれない
            - 例えばこんなプロンプトを使う
                - 「販売額、訪問時間、人数、年代の列を含むデータについて、販売額をより高くしている原因を探るためにはどんな方法を使えばよいですか？」
                - 「～～の方法を使って分析を行いたいです。Python, numpy, matplotlib を使って結果を表示するコードを書いてください」

### 相互レビューという形式から学べる視点は多かった

大学だと教師からのレビューが評定としてそのまま成績になりますが、マナビDX Quest では他の参加者からのレビューがそのまま成績になります。
そのため、同じ課題を共有する人間として、プレゼンを通してどう向き合ってきたか、どんな施策を提示してその中のどこを推し、どこで困ったのかが表れます。「ここで困ったんだなぁ」とか「こんなまとめ方もあるんだな」とか言われて初めて気づくことも多かったです。

レビューにおけるねぎらいももちろん嬉しいですが、自分では気づかない特異な着眼点も教えてくれるので、「こうすればよかったか？」「こうしなくてもよかったな？」と顧みる機会が何度もやってきます。(ようは「社会人・他人の視点で、あなたの議論がどう受け取られるか」がわかります)

### 構造化データに落とし込む"短い"手順が分かった

例えば PDF やらWebサイトで書かれている「日付」「イベント名」の形式の表をどうにか Google Calendar にインポートしたい！などあるとき、特に文章や生のデータを構造化データに落とし込む手順が浮かぶようになりました。
(個人的見解ですが) 例えば文字列の `split` と `join` 程度であれば、おもむろに Python を開いて加工するのが、実は手動で行うより早いです。もちろん Excel の ``TEXTSPLIT(なにを, なにで区切る)`` も便利です。(クセが強くて使いませんが)
現在はうまい指示をすれば(プロンプトを工夫すれば) AI が表データに落とし込んでくれます。ただ誤りを見つけると、とたんに論理が破綻して修正が大変になります...。手動でじゅうぶん効率よくできるなら、手動がベストだなと気付かされました。

### 効率化の鬼になる(※1)

とくにビジネス的観点から分析する時間になると、課題として与えられた意見や内容から抜き出してコピペする単純作業や、簡単な図(ダイアグラムや分類表)を作るといった作業が多くなります。
見やすさのためとはいえ、やはりその時間は短くしてもっと内容と考察に力を入れよう！と思うと、例えば [Mermaid](https://mermaid.js.org/) のようなダイアグラムや図の自動生成ツールが欲しくなります。
正しい使い方でなくとも、図として書き出しながら整理すると自然と考えが整理されて便利です。例えば電子本と紙媒体のメリットやデメリットを考えるならば、構造化して以下のように図を書くと便利と思います。

```mermaid
graph TD
    A["本の形態"] --> B["紙の本"]
    A --> C["電子本"]
    
    B --> D["メリット"]
    B --> E["デメリット"]
    C --> F["メリット"]
    C --> G["デメリット"]
    
    D --> D1["定期購読が得"]
    D --> D2["目に優しい"]
    D --> D3["本棚に飾れる"]
    D --> D4["中古で売買できる"]
    
    E --> E1["保管場所を取る"]
    E --> E2["持ち運びが大変"]
    E --> E3["劣化する"]
    E --> E4["検索が困難"]
    
    F --> F1["持ち運びが楽"]
    F --> F2["保管場所を取らない"]
    F --> F3["検索が容易"]
    F --> F4["夜間でも読める"]
    
    G --> G1["電池が必要"]
    G --> G2["目に負担がかかる"]
    G --> G3["端末が故障するかも"]
    G --> G4["再販売できない"]
```

このコードから一部構造を抜き出すとこんな感じになります。

```plaintext
graph TD
    A["本の形態"] --> B["紙の本"]
    A --> C["電子本"]
    
    B --> D["メリット"]
    B --> E["デメリット"]
    
    D --> D1["定期購読が得"]
    D --> D2["目に優しい"]
    ...
```

最初の ``graph TD`` だけは呪文として目を瞑って、あとは ``ID[説明] --> ID2[説明2]`` と矢印をつなげる感覚で書いていくと、自動で図が生成されます。

こういった図を作って整理するのには配置やデザインを考える手間がかかるので、初期の段階ではより簡易なものを用いて整理すると効率よくスライドのアウトラインができてきます。
残りのデザインは青天井に凝るなりなんなりできてしまうので割愛しますが、PowerPoint をお使いであれば [SmartArt](https://support.microsoft.com/ja-jp/office/smartart-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6-office-%E3%81%A7%E7%B5%84%E7%B9%94%E5%9B%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-9b51f667-11b7-4971-a757-a08a36684ee6) といった選択肢もあります。こちらも階層化したテキストから簡単な図を生成できるので、たたき台として便利です。

### (大学生はとくに) 課題には計画的に取り組もう

実際、マナビDX Quest の各課題はレビューが必要な課題の直前が特に一番大変でした。レビューの必要ない課題はあまり負荷が大きくないのですが、レビューが必要な課題の前はおのずとプレゼンテーションの作成になってくるので...溜めてしまうと、直前の午前2時まで寝られないこともありました。
大学の課題に比べ、マナビDX Questの課題はため込むとやっかいです。To/do管理や締切管理ツールを使うことを強くおすすめします！

# 次はどこへ行こう？

- そのあとデータサイエンスって面白いな、機械学習もやってみたいなと考え「東京大学グローバル消費インテリジェンス寄付講座」 (GCI 2024 Summer)](https://gci2.t.u-tokyo.ac.jp) を修了しました
    - マナビDX Quest よりも「データを加工して分析し、機械学習に適応する手法」に重きを置いています。一方、ビジネス的にそれらの手法をいかに活用するかはほんのり学ぶ程度にとどめています
    - GCIのほうが圧倒的に難易度が高いです (個人的見解)。マナビDX Quest を修了した方であればクリアできるはず…！
    - ビジネス的側面や求められる分析、課題に対する解決手段を マナビDX Quest で身につけて、GCI では分析の道具をさらに増やすイメージです