迷走ブログ

ファウスト的衝動を抱き、迷走している、凡人による気まぐれブログです。

【python】石油小売価格の変動を可視化してみた

はじめに

今回は日本における石油小売価格について、1990年から現在(2021年)までの政府が発表している資料をもとに可視化してみました。

結論

リーマンショック前の価格高騰とリーマンショック後の価格低下が著しい。
コロナショック後の価格低下はあるが、リーマンショック後ほどの著しい低下をもたらしているとまでは言えない?
f:id:yktmmrmtoosa03:20210929132054j:plain
f:id:yktmmrmtoosa03:20210929132102j:plain

使用したデータについて

今回使用したデータは、経済産業省エネルギー庁が集計している「石油製品価格調査」の「給油所小売価格調査(ガソリン、軽油、灯油)」に関する統計データを使用しています。
調査の結果|石油製品価格調査|資源エネルギー庁

コード

# 必要になりそうなものを呼び出す
import pandas as pd
import plotly.express as px

まずは必要となりそうなモジュールを呼び出しています。pandas はデータの加工のために使用します。plotlyは可視化するために使用する予定です。

matplotlibを使用していない理由は、iPad上にてjupyter notebookを動かしているのですが、使用しているアプリがjapanize-matplotlibに対応していないためです。

そのため、日本語の文字化け回避方法として、直接日本語に対応しているフォントを指定して呼び出さないといけないのですが、そのフォントがiPad上にインストールされている(ここではjunoのアプリに対応している)ものとして、どれなのかわからないので、諦めました。

ググると、font_managerを呼び出して、日本語に対応しているものを表示できるようでそれを試したのですが、僕のiPadはなぜか以下のものしかフォントが表示されず、困惑しています。訳がわからんのです。。。
f:id:yktmmrmtoosa03:20210928232503j:plain

ハイオクの価格について

df = pd.read_excel('s.xls',encoding="utf-8")
df.head(5)

f:id:yktmmrmtoosa03:20210928233132j:plain
とりあえず、ダウンロードした統計データを呼び出しています。「utf-8」の形式で呼び出しているのですが、これを記載しなくても問題ない?ようですが、一応指定しています。

読み込んだデータを見ると、「〇〇局」と「全国」平均値と「調査日」という項目は要素が埋まっている可能性が高そうです。

df[['全         国','関  東  局','近  畿  局']].describe().round(1)

f:id:yktmmrmtoosa03:20210929165020j:plain
本来であれば、欠損値が含まれているかどうかをチェックし、場合によっては値を穴埋めする必要があるのですが、今回は調べたい列である「全国」平均値と「関東局」と「近畿局」に関しては問題なさそうです。

基本統計量を確認してみると、まず、1990年から現在(2021)までの1リットルあたりのハイオクの平均金額は、139円ほどであるようですね。
正直、車に乗らないので感覚がわからないです。
そもそも今回調べるまで、ハイオクとレギュラーの違いも知らなかったです。

全国の中央値は140.4のようです。
最高価格は196円のようです。

fig = px.line(df,x='調査日',y=['全         国','関  東  局','近  畿  局'],title='ハイオク価格の変動')
fig.show()

f:id:yktmmrmtoosa03:20210929001451j:plain

レギュラーの価格について

df2 = pd.read_excel('s.xls',sheet_name='レギュラー',encoding="utf-8")
df2.head()

f:id:yktmmrmtoosa03:20210929002034j:plain
ハイオクの時のコードとほぼ同じです。
異なるのは、シート名を指定していることくらいです。

df2[['全         国','関  東  局','近  畿  局']].describe().round(1)

f:id:yktmmrmtoosa03:20210929002319j:plain
レギュラーの全国平均は、126円前後らしいです。
また、最高価格は、185円前後のようです。

fig2 = px.line(df2,x='調査日',y=['全         国','関  東  局','近  畿  局'],title='レギュラー価格の変動')
fig2.show()

f:id:yktmmrmtoosa03:20210929002649j:plain
・・・・・・はい。

おわりに

pythonの勉強を頑張るしかない!
俺の戦いはこれからだっ!!!

【python】日向坂46さんの身長を含む基本的なデータを可視化してみた

はじめに

前回、乃木坂46さんに関して、身長等をまとめてみました。
そこで、今回は姉妹グループである日向坂46さんについて分析したいと思います。なお前回行った操作とほぼ変わらないため、今回は過程をすっ飛ばして、可視化部分に注力しました。

行ったこと

前回と同様ですが、以下の流れを取りました。

  • WEBから日向坂46さんに所属している方々のデータを集める(今回もWikiからコピペ)
  • エクセル形式でデータを読み込み、そのデータを軽く加工
  • データを可視化

コードについて

import pandas as pd
import matplotlib.pyplot as plt
import plotly.express as px

df = pd.read_excel("hina.xlsx",encoding="utf-8")
df.columns = df.loc[0] #データのカラム名を0行名に指定
df.head()

f:id:yktmmrmtoosa03:20210923212937j:plain
まず、必要となりそうな諸々のモジュールを読み込みます。
イメージとしてはpandas で加工し、matplotlib、poorlyで可視化を試みる、という流れです。

次に、エクセル形式で保存したデータを読み込みました。ただし、前回同様に、邪魔な列が読み込まれてしまいました。

df.drop('Unnamed: 0',axis=1,inplace=True)
df.head()

ここでは邪魔な「Unnamed: 0」を削除しました。

問題は、前回同様に「身長」と「生年月日」の部分から数値を取り出すことです。
そのため、それらをstr.split()を使って、それぞれを分解しました。

var_data = df['身長'].str.split('cm',expand=True)
var_data.head()

f:id:yktmmrmtoosa03:20210923213328j:plain
上述の通り、ここでは、数値だけを残すために操作しました。
ただ、replace()を使って、いらない部分だけを空白に入れ替えればすむ話だったと今更ながら思いました。。。分割してしまったため、空白の列ができてしまいミスりました。そのため、それらをdrop()で削除することとなりました。。。

同様に生年月日の部分も分解しました。今回はほぼ同じコードとなるため、分割したコードは省略します。その後、カラム名をつけて、元のデータと結合します。

var_data.columns = ['歳']
df = pd.concat([var_data,df],axis=1)
df.drop(['生年月日'],axis=1,inplace=True)
df.head()

f:id:yktmmrmtoosa03:20210923214446j:plain
わーい(⌒▽⌒)
とりあえず、データの加工が完了したことにします。
次に、基本的な統計量について確認していきます。

df.describe().round(1)

f:id:yktmmrmtoosa03:20210923233645j:plain
平均身長は、160cmのようです。また、平均年齢は20.6歳のようです。
前回、乃木坂46さんの情報を分析した際には、161cmくらいだったはずなので、坂道(?)アイドルでは160cm前後が平均なのでしょうかね。

import plotly.express as px
fig = px.scatter(df, x='加入期', y='歳')
fig.show()

f:id:yktmmrmtoosa03:20210923225031j:plain
1、2、3期と段階的に若い人たちが集まっているようです。
3期生は、17歳なんて、鬼若いですねー(死語???)

運営会社は、しっかりと世代交代を意識して人選しているようですね。

fig = px.scatter(df, x='加入期', y='身長(cm)',size='歳')
fig.show()

f:id:yktmmrmtoosa03:20210923225828j:plain
加入期ごとで身長の差異を見てみました。
特に傾向があるようには見えませんが、背の高い方から低い方まで幅広く在籍していらっしゃるようですね。そう言った意味では、運営会社は需要者の多様な趣味嗜好に合致するような人選をしているとも言えそうですね。

import plotly.express as px
fig = px.scatter(df, x='身長(cm)', y='歳',color='加入期',size='歳', hover_data=['身長(cm)'])
fig.show()

f:id:yktmmrmtoosa03:20210923230558j:plain
・・・特に言及なしです。

おわりに

とりあえず、pythonの勉強を頑張って、仕事で使えるレベルにします!!!
データの加工と可視化をスムーズに行えるように頑張るしかない!
俺(たち)の戦いはこれからだ!!!(笑)

【python】乃木坂46さんの平均身長を調べてみた

はじめに

最近、YouTubeのおすすめに表示されてから、乃木坂46さんの曲を積極的に聴くようになりました。特に推しメン?に該当する方はいませんが、乃木坂46さん自体に興味を持ったので、pythonの勉強ということで、属性に関する情報的なものを分析してみました。

結論:身長は意外と高い

乃木坂46さん全体では、平均160.7cmのようでした。
また、平均年齢は、21.2歳でした。

行ったこと

  • Wikiから所属している方の情報を引張ってくる(今回は手作業)
  • データを少し加工する
  • 基本統計量を算出する
  • 色々と考察してみた

まず、今回は手作業で乃木坂46に属する方々の情報をエクセルファイルにコピペしました。スクレイピングのやり方は前回までで頑張ったので、今回はとりあえずデータを簡単に整える方に勉強時間を費やしたかったからです。

・・・す、 スクレイピングがうまくいかなかったから諦めたわけじゃないんだからねっ!

データ加工:いらないところを置き換える

import pandas as pd

df = pd.read_excel('i.xlsx')
df.columns = df.loc[0] #カラム名を0行目に書き換える
df.to_excel('re.xlsx')

手作業でデータをエクセルファイルに保存した後、データを読み込んでいます。
ただし、列名が「Unnamed: 0」のようになったため、その下の行に載っている列名をそのまま引っ張りました。

実は、この後不要な情報を削除しようといろいろと工夫をしました。例えば、以下のような操作をしました。

df.drop(columns=['Unnamed: 0','Unnamed: 1'])

が、何度もやり直すうちに何がなんだかわからなくなってしまい、一番左の列を消すことが出来ず、残りつづけました。
(ここら辺の理解が曖昧なので、勉強し直します。。。)

df['身長'].str.replace('cm','')

f:id:yktmmrmtoosa03:20210922201229j:plain

次に、身長部分に対して操作をしました。これは、後ほど、平均年齢等の統計量を算出するために文字列から数字のみにどうにか変更を試みました。加えて、間違ってコードを消してしまったのですが、df['生年月日'].str.split()を用いて、年月と歳の部分を分割しました。この時、「‘(’」で分割してしまったので、二度手間で分割後にreplace()で「歳)」を空白に置き換えました。

考察:基本的な統計量の算出

# 基本統計量の算出
df.describe().round(1)

f:id:yktmmrmtoosa03:20210922182228j:plain
欠損値を除いたデータの数は、全部で39です。おそらく、今のメンバー数と同数のはずです。中身を確認していきます。

まず、round(1)部分は、単に小数点第2位を四捨五入することを意味しています(そもそも元のデータがどうだったか忘れてしまったため、指定しました)。

次に、上述で「年齢」と「身長」の項目を数字として取り出し、それぞれの項目を追加しました。そのため、describe()でそちらの統計量が算出されています。

mean部分が平均値を意味するため、乃木坂46さん全体では、160.7cmであるようです。意外と身長が高いなと思いました。ちなみに、政府の出している統計によると(https://www.e-stat.go.jp/dbview?sid=0003224177)、乃木坂46さんの年齢の平均値である21歳くらいを見ると、157.1cmのようなです。そのため、乃木坂46さんは平均よりも背の高い集団と言えそうかなと思います。ちなみに、50%と載っている部分は、中央値となります。なので、集団全体のちょうど真ん中(なんと表現するばしっくりとくるのかわからないのでお許しください)は、161.0cmのようです。

あと、世間の流れなのか事務所の意向なのかわかりませんが、最年長29歳の方が在籍していらっしゃるようです。一番下の歳の方は、17歳のようなので、およそ12歳以上も歳の差があります。ちなみに最年長の方は、僕の年齢よりも2歳ほど高いので驚きました。
他のアイドルグループを見ていないのでなんとも言えないのですが、二十歳前後がグループ平均の年齢としては普通なのでしょうか・・・なんというか学生の方が多そうですね。

df[["出身地","血液型"]].describe()

f:id:yktmmrmtoosa03:20210922202926j:plain
ここでは、文字列の統計量を算出しています。
39人分がカウントされています。意外ではないですが、東京出身地が最も多いようです。また血液型別だと、A型の方が多いようです。

c =df.groupby('出身地').size()
c.sort_values(inplace=True,ascending=False)
c

f:id:yktmmrmtoosa03:20210922211642j:plain
東京出身が多いのは、上述の通りですが、なんと海外出身者がいらっしゃるようです。ドイツ?やアメリカの都市名が出てきました!グローバル化が進んでいるのでしょうかね。

d=df.groupby('血液型').size()
d.sort_values(inplace=True,ascending=False)
d 

f:id:yktmmrmtoosa03:20210922212523j:plain
あれ、A型とO型の数が同じではないですか!
この時、初めて知ったのですが、同じ値が最多であった場合、いずれか一方のみしか(おそらく文字コード順が優先される?)describe()では算出されないらしい?ことを知りました。正直よく理解できていないです。

e=df.groupby('加入期').size()
e.sort_values(inplace=True,ascending=False)
e 

f:id:yktmmrmtoosa03:20210922220243j:plain
4期生の方々が最も多いようです。ググったところ、4期生が最も新しい方々のようですので、着々と年齢層の入れ替わりをしているところみたいです。
加入期ごとでの年齢や身長の差異を出していないので、可視化してみます。

import plotly.express as px
fig = px.scatter(x=df['加入期'], y=df['年齢'])
fig.show() 

f:id:yktmmrmtoosa03:20210922221652j:plain
y軸が年齢でx軸に加入期ごとに配置しています。
意外にも1期生は20代前半と後半でちょうど二分化されているようです。あとは、運営の方からすると、10代後半から20代前半までを主要メンバーとして確保したい、ということなのでしょうか、3、4期生はほとんどが若いようです。

import plotly.express as px
fig = px.scatter(df, x="身長", y="年齢", color="加入期")
fig.show() 

f:id:yktmmrmtoosa03:20210922223301j:plain
ちょっと、情報量を増やしてみました。身長と年齢と加入期で何か見えて来ないかなーと思ったのですが、特にありませんね。しいてあげるとするならば、4期生の方々は165cm前後の方が多そうだということくらいかと思います。。。
ちなみに、下記のグラフは年齢と身長の軸を入れ替えたバージョンです。。。
特に意味はありません。。。。
f:id:yktmmrmtoosa03:20210922224524j:plain

おわりに

今回は乃木坂46さんについて分析してみました。
経営層がどのような人材を求めているのか、傾向があるかなーと思ったのですが、今回の内容だけでは特に新しい発見はなさそうでした。
まあ、データの加工練習にはなりましたので、ひとまずはこれでよしとします。

Amazonアンリミテッドで乃木坂46さんの曲を聞こうかな。。。

【雑学・ビジネス】「ググれ」と言われてもそもそも「ググり方」がわからないときに考えるコツと小技

はじめに

f:id:yktmmrmtoosa03:20210922133809j:plain
よく「ググれ」と言われることが多いわけですが、そもそもググり方を教えてくれないことが多いと思います。
新人の時、僕は目当ての情報を探すのに時間がかかっていました。もちろん、その一つの要因にはそもそも前提となる知識が足りていなかったからという部分もありました。しかし、ある時、先輩にググり方のコツを聞いたことがありました。その時に知ったのですが、どうやら「ググり方」という行為自体には「コツ」があるのだと。。。。。。

この記事では、新卒や社会人2年目くらいまでの方で、「調べ物」に時間がかかっているという人に対して、「ググり方」を共有できればと思います。

検索する目的や対象の明確化

f:id:yktmmrmtoosa03:20210922133829p:plain
まずは「自分は一体全体なにを知りたいのか」ということを明確に意識することが大事です。例えば、「目薬」を購入する場面を考えてみます。

その時、その「目薬」を買う目的(どのような目薬を購入したいのか)によって、検索するべき条件は異なってきますよね。

例えば、太郎くんは最近疲れ気味で、視界が霞むことがありました。
太郎くんは寝不足のためであると考え、眠気が覚めるような刺激の強い「目薬」をインターネットで探し始めました。。。。。

上記の例は、情報があまりにも断片的で具体的ではありませんが、とりあえずこの事例を考えてみます(強気!?)。
この時、早速ググるのではなく、一度立ち止まってみます。今回の例では「目薬」を求めているわけですが、どんな「目薬」でも良いというわけではありませんよね。「眠気が覚めるような刺激が強いもの」が購入する目的です。

そうなると、「目薬」とググっても、「コンタクト用」や「ドライアイ用」等さまざまな用途・効果のものが販売されており、「アイドルとコラボしたもの」等の期間限定のもの、それらは当然値段だって異なるものを含めて多数ヒットしてしまう可能性が高いであろうと予想できます。

上記は極端な例ですが、ググる目的を考えるとノイズが多くなるような検索式は避けようと心がけることができます。
このように、一度立ち止まって目的を考えると、どのように検索するべきかの方向性が見えてきます。

検索式を考えること

上述のように、ググる目的を考えた上で「検索式」を考えて行くのがコツです。

具体的に検索式とは何かというと、「AND」「OR」「NOT」なのかを意識することです。

例えば、「AND」は「異なる概念を掛け合わせることで、共通する部分を抽出する」ことです。学生の頃に、学習したベン図を思い浮かべるとよくわかるかと思います(下手な図を用意しました笑)。「A」と「B」の概念があったとしたら、その共通している部分のようなイメージです。
f:id:yktmmrmtoosa03:20210922121338j:plain

一方で、「OR」は「同じ概念をつなぎ合わせており、複数の条件のいずれかが当てはまる部分を抽出する」ことです。「A」と「B」の概念があったとしたら、そのどちらかに合致していれば良い、というようなイメージです。
f:id:yktmmrmtoosa03:20210922121725j:plain

最後に、「NOT」の場合です。これは注意が必要です。例えば、概念「AとB」が含まれているような場合を調べる時を考えてみます。具体的には、「アイドル」という単語をググり、「ジャニーズ以外のアイドルはどんな人たちがいるのだろうか」ということを知りたいとします。その時、「アイドル」に内包される「ジャニーズ」はノイズとなりますので、その部分を除外するというようなイメージです(うまく説明できない。。。。。。)。そのため、検索結果に漏れが出てしまうことを意識する必要があります。要するに、意図して検索結果を絞っているのならば良いのですが、無意識に範囲を狭めてしまわないようにしたほうが良い、ということを伝えたいのですが、伝わりますでしょうか・・・
f:id:yktmmrmtoosa03:20210922122823j:plain

ググる際のテクニック

f:id:yktmmrmtoosa03:20210922133844p:plain
ここでは実際にググる時の小技的なものを共有できればと思います。

サイト検索の方法

「site:〇〇」とすると、特定のサイトを検索できます。
例えば「site:youtube.com 乃木坂46」とググると、YouTubeにアップロードされている乃木坂46の文字が含まれる動画がずらっとヒットするはずです。

検索から特定の語句を除く方法

「-〇〇」と除外したい語句の前に記号「-」をつけることで、特定の概念を除外できます。例えば、「アイドル -乃木坂46」とすると「乃木坂46」さん以外のアイドルに関する記事がヒットするはずです。これは、一度見たことやすでに知っている情報を取り除くときに、非常に有効です。

完全一致検索の方法

「"〇〇"」と単語や語句を引用符で囲み、検索することで、完全に一致するものだけに絞ることができます。
例えば、「"乃木坂46メンバー"」と検索すると、「メンバー一覧」が確認できるような記事がヒットするはずです。

言い換える

キーワードを上位概念、下位概念に置き換える

僕の場合は、ググるキーワード自体を変更する時は、基本的によく知らない分野や専門用語を調べるとき、個別具体的な事例を調べたいときに使っています。
例えば、「法律」とググるとめちゃくちゃ「法務部とは?」みたいな記事がヒットするのですが、「ライセンス法務」とすることで、「ライセンス契約」に関する記事に絞り込めるようなイメージです(はじめから「ライセンス契約」でググれば早いのですが、あくまでも事例ですのでご理解いただければ幸いです。。。)。

カタカナやひらがな、漢字ので置き換える

カタカナやひらがな等の変更もそうですが、意外と馬鹿にならないのは、カタカナの「スマートフォン」「スマートホン」みたいな表記の揺れです。これは、上述の完全一致で検索した時に気をつけた方が良いです。基本的に、完全一致で調べると、表記の揺れを見落とす可能性があります。そのため、念の為、表記の揺れの観点でもググるようにしたほうがいいと思います。

類義語で置き換える

WeblioやWiki等の辞書で、類義語を確認して、言葉を換えて調べると良い場合があります。
知らない分野や専門用語を調べるときに、意外と効果を発揮します。

ファイルタイプの指定

例えば、「filetype:pdf 〇〇」
これは統計情報や論文を調べるときに効果抜群です。ただしあくまでも公共機関や権威ある団体のURL先から提供されていることを意識することをおすすめします。そうでないと、よくわからない団体が発行している偏見に満ち溢れた論文的なものを閲覧してしまうことになってしまいますので、気をつけましょう。もちろん、そのような事例をあえて調べているのでしたら、問題ないと思います。

期間の指定

Googleさんでは、なんと期間を指定して調べることができます(他の検索サイトでもそうなのかもしれませんが)。
例えば、iPad端末からググると、「ツール」という部分が小さく画面の上部に配置されています。そこから「期間」を指定して時期を絞ることができます。
f:id:yktmmrmtoosa03:20210922133008j:plain

おわりに

もうググることに時間をかけない!
俺(たち)の戦いはこれからだ!!

・・・乃木坂46さんの「きっかけ」という曲いいですね。YouTubeでおすすめに出てきたので聴いたら、気に入りました。

きっかけ

きっかけ

  • Sony Music Labels Inc.
Amazon

【python】お茶の種類をまとめてみた

はじめに

前回はコーヒーの種類について産地別に特徴を調べました。
今回はお茶の種類についてまとめていきたいと思います。

行ったこと

大雑把に表現すると以下の流れで、お茶の種類をまとめました。

  • 「お茶」AND「種類」でググる
  • 一番上にヒットしたサイトを確認し、お茶の種類が載っていることを確認し、スクレイピング
  • 若干のデータの整形

コード

サイトからお茶の種類と特徴をスクレイピング

import pandas as pd
from bs4 import BeautifulSoup
import requests

url = "https://chiran-omoiire.com/tashinamu/type"
h = requests.get(url)
soup = BeautifulSoup(h.content,"html.parser")

dff = []

for i in soup.find_all("li"):
    for ii in i.find_all("h5"):
        for iii in i.find_all('p'):
            df = [str(ii.text),str(iii.text)]
            dff.append(df)
            pd.DataFrame(dff).to_csv("tea.csv",encoding="utf-8")

はじめに、必要そうなモジュールを呼び出しています。その後、該当のURLを指定しています。

今回はサイトを開くと、欲しい情報が「h5」と「p」タグに入っていたので、それらを指定しています。
実はfor文を繰り返しているのですが、見栄えはあまりよくないです。
ここは、おそらく内包表記で表現できるはずなのですが、勉強不足でそこら辺の理解が伴っていないため、今回は諦めました。

それから、集めた情報を文字列として空のdffというところに収納し、一つのファイル内に行と列を持った形で書き込むためです。

最後に、収納した情報をCSV形式で保存しています。

保存したファイルの中身を表示する

data = pd.read_csv('tea.csv', encoding="utf-8")
data

f:id:yktmmrmtoosa03:20210921072730j:plain
うまく収納されています。

……はい、なんか表が見にくいため、若干修正していきます。
例えばいらない連番や列名の説明がないため、そこら辺を修正していきます。

保存したCSVファイルの列名の変更と連番が載っている列を削除する

import pandas as pd

data = pd.read_csv('tea.csv', encoding="utf-8")
del data['Unnamed: 0']

dd=data.rename(columns={"0":"お茶の種類","1":"特徴の説明"})
dd.to_csv('tea1.csv',encoding="utf-8")
dd

f:id:yktmmrmtoosa03:20210921072703j:plain
ここでは「Unnamed: 0」という列が邪魔なので削除しています。
その上で、rename()を用いて、列名を変更しています。
最後に、変更後のデータを保存しています。

補足

一つのサイトからしか情報を集めていないため、今回は別のサイトからも情報を集めようとしたのですが、結局うまくいきませんでした。。。

import pandas as pd
from bs4 import BeautifulSoup
import requests

url = "http://shop.chanoma.co.jp/column/kind/kind.html"
h = requests.get(url)
soup = BeautifulSoup(h.content,"html.parser")

dff = []

for i in soup.find_all("h3"):
    with open("tea3_header.txt","a",encoding="utf-8") as f:
        f.write(i.text+"\n")

for ii in soup.find_all(id = "detail"):
    for iii in ii.h3.find_next_siblings("p"):
        df = [str(i.text),str(iii.text)]
        dff.append(df)
pd.DataFrame(dff).to_csv("tea3.csv",encoding="utf-8")

ここでは上述のサイトと同様にお茶の種類とその特徴について書かれた部分をスクレイピングを試みています。
しかし、一つのファイルに列と行を持った状態にうまくできませんでした。そのため、一旦、h3タグをテキストで保存しておきました。
というのも、最初のfor文で取り出したh3タグの情報を収納しようとしても、(pタグの数と合わないからか?)h3タグの情報がうまく列に入ってくれませんでした。

よくわからないので、一度で全てを処理するのは諦めて、後でCSVの方の列を書き換えようと思っています。

おわりに

とりあえず、当初の目的であるお茶の種類を知るということはできたので、個人的には満足しました。
もっとpythonの勉強を頑張って、実務で使えるレベルにしたい!!!

ところでコーヒーメーカーか何がいいのかわからんから、スクレイピングで情報をかき集めようかな。。。。。。