エネルギーは様々なビジネスにとって最も重要な要素の一つであり、燃料価格の急激な上昇は世界経済に影響を及ぼしています。エネルギーコストは、様々な財やサービスの価格が上昇し、数十年にわたる高いインフレ率に大きく寄与しています。ガス価格は原油価格と連動して変動しますが、その変動幅は常に同じではありません。原油は世界的に取引されている商品なので、主に世界レベルでの需要と供給が価格を決定します。供給が需要を上回れば価格は下落します。逆に、需要が供給を上回れば価格は上昇します。
COVID-19の時はすべてのビジネスが停止していたため燃料需要が減少しましたが、パンデミックによる世界各地の産業再開から急に増加しました。一方、ロシアがウクライナに侵攻してからは状況が悪くなりました。ロシアは世界最大の石油生産・輸出国であり、アメリカやカナダなど多くの国がロシアの輸入を禁止したため、燃料価格が軒並み高騰したのです。
今回は、最新のデータセットとGridDBを用いて、世界の燃料価格とその需要について考察します。
GridDBを用いたデータセットのエクスポートとインポート
GridDBは、高いスケーラビリティと最適化を実現したインメモリNoSQLデータベースで、特に時系列データベースにおいて、より高いパフォーマンスと効率性を実現するために並列処理を可能にします。 今回はGridDBのNode.jsクライアントを使用します。GridDBとNode.jsを接続し、リアルタイムにデータをインポートまたはエクスポートすることができます。
これらは、分析に使用する列です。
- Country: 国の名前 - データベースの主キー。
- Daily Oil Consumption (Barrels): 各国の1日の消費量に必要な石油のバレル数。
- World Share: 各国の石油消費量の割合。
- Yearly Gallons Per Capita: 一人当たり年間ガロン数。
- Price Per Gallon (USD): 1ガロンあたりの価格(単位:米ドル)。
- Price Per Liter (USD): 1リットルあたりの価格(単位:USドル)。
- Price Per Liter (PKR): 1リットルあたりの価格(パキスタン・ルピー)。
GridDBにデータセットをアップロードするために、 Kaggle から取得したデータを含むCSVファイルを読み込みます。
ここで、行情報を挿入する前にデータベースのデザインを生成できるように、データベースのスキーマをGridDBに渡すためのGridDBコンテナを作成します。 次に、GridDBにデータを挿入することになります。これで、データセットをGridDBプラットフォームにエクスポートすることに成功しました。
一方、GridDBプラットフォームからデータセットを取り込むには、SQLに似たGridDBの問い合わせ言語であるTQLを使用します。コンテナを作成し、そこに取り込んだデータを格納することにします。 次のステップは、列情報の順に行を抽出してデータフレームに保存し、データの可視化と分析に使用することです。
var griddb = require('griddb_node');
const createCsvWriter = require('csv-writer').createObjectCsvWriter;
const csvWriter = createCsvWriter({
path: 'out.csv',
header: [
{id: "country", title: "country"},
{id: "daily oil consumption (barrels)", title: "daily oil consumption (barrels)"},
{id: "world share", title: "world share"},
{id: "yearly gallons per capita", title: "yearly gallons per capita"},
{id: "price per gallon (USD)", title: "price per gallon(USD)"},
{id: "price per liter (USD)", title: "price per liter (USD)"},
{id: "price per liter (PKR)", title: "price per liter (PKR)"}
]
});
const factory = griddb.StoreFactory.getInstance();
const store = factory.getStore({
"host": '239.0.0.1',
"port": 31999,
"clusterName": "defaultCluster",
"username": "admin",
"password": "admin"
});
const conInfo = new griddb.ContainerInfo({
'name': "globalfluctuationsfuelprices",
'columnInfoList': [
["country", griddb.Type.STRING],
["daily oil consumption (barrels)", griddb.Type.INTEGER],
["world share", griddb.Type.STRING],
["yearly gallons per capita", griddb.Type.DOUBLE],
["price per gallon (USD)", griddb.Type.DOUBLE],
["price per liter (USD)", griddb.Type.DOUBLE],
["price per liter (PKR)", griddb.Type.DOUBLE]
],
'type': griddb.ContainerType.COLLECTION, 'rowKey': true
});
const csv = require('csv-parser');
const fs = require('fs');
var lst = []
var lst2 = []
var i =0;
fs.createReadStream('./dataset/Petrol Dataset June 20 2022.csv')
.pipe(csv())
.on('data', (row) => {
lst.push(row);
})
.on('end', () => {
var container;
var idx = 0;
for(let i=0;i<lst.length;i++){
lst[i]['daily oil consumption (barrels)'] = parseInt(lst[i]["daily oil consumption (barrels)"])
lst[i]['yearly gallons per capita'] = parseFloat(lst[i]["yearly gallons per capita"])
lst[i]['price per gallon(USD)'] = parseFloat(lst[i]["price per gallon (USD)"])
lst[i]['price per liter (USD)'] = parseFloat(lst[i]["price per liter (USD)"])
lst[i]['price per liter (PKR)'] = parseFloat(lst[i]["price per liter (PKR)"])
console.log(parseFloat(lst[i]["country"]))
store.putContainer(conInfo, false)
.then(cont => {
container = cont;
return container.createIndex({ 'columnName': 'name', 'indexType': griddb.IndexType.DEFAULT });
})
.then(() => {
idx++;
container.setAutoCommit(false);
return container.put([String(idx), lst[i]['country'],lst[i]["daily oil consumption (barrels)"],lst[i]["world share"],lst[i]["yearly gallons per capita"],lst[i]["price per gallon (USD)"],lst[i]["price per liter(USD)"],lst[i]["price per liter (PKR)"]]);
})
.then(() => {
return container.commit();
})
.catch(err => {
if (err.constructor.name == "GSException") {
for (var i = 0; i < err.getErrorStackSize(); i++) {
console.log("[", i, "]");
console.log(err.getErrorCode(i));
console.log(err.getMessage(i));
}
} else {
console.log(err);
}
});
}
store.getContainer("globalfluctuationsfuelprices")
.then(ts => {
container = ts;
query = container.query("select *")
return query.fetch();
})
.then(rs => {
while (rs.hasNext()) {
console.log(rs.next())
lst2.push(
{
'country': rs.next()[1],
"daily oil consumption (barrels)": rs.next()[2],
"world share": rs.next()[3],
"yearly gallons per capita": rs.next()[4],
"price per gallon (USD)": rs.next()[5],
"price per liter (USD)": rs.next()[6],
"price per liter (PKR)": rs.next()[7]
}
);
}
console.log(lst2)
csvWriter
.writeRecords(lst2)
.then(()=> console.log('The CSV file was written successfully'));
return
}).catch(err => {
if (err.constructor.name == "GSException") {
for (var i = 0; i < err.getErrorStackSize(); i++) {
console.log("[", i, "]");
console.log(err.getErrorCode(i));
console.log(err.getMessage(i));
}
} else {
console.log(err);
}
});
console.log(lst2);
});
データ分析
ここで、世界各国の燃料価格と消費量を把握するために、データセットを確認し、データ分析を行いました。
データセットの理解を深めるために、2つのカラムを追加しました。
- Gallons GDP Per Capita Can Buy - 一人当たり購入可能なガロン数(各国の一人当たりGDPで計算)。
- xTimes Yearly Gallons Per Capita Can Buy - 一人当たり年間購入可能なガロン数。
これらのカラムから、人々の燃料購買力を知ることができ、各国の経済がいかに国民の経済状況によって影響を受けているかを知ることができるのです。
そこで、「1日の石油消費量(バレル)」と「世界シェア」の2つの列を降順に並べ、世界で最も燃料を使っているのはどの国なのかを調べたところ、「1日の石油消費量(バレル)」が最も多く、「世界シェア」は最も少ないことが分かりました。 世界経済の中心であり、真の超大国である米国は、最も多くの燃料を消費しています。2位の中国もまた、超大国として台頭してきた国なのです。
データセットと劇的に上昇する燃料費を見て、現在どの国が最も燃料費が高いかを知る必要があります。2022年6月20日時点の更新価格によると、北朝鮮は1ガロンあたりの燃料価格が14.5ドルと衝撃的な高さであることが分かりました。米国が北朝鮮の核ミサイル開発用品の購入を理由に制裁を加えたため、北朝鮮と米国の間には政治的緊張関係が存在します。
結論
ロシアのウクライナ侵攻が続く限り、短期的にも燃料価格は上昇するのではないかと推察されます。一方、ロシアは近い将来、この侵略に介入して阻止すれば、石油の輸出を開始し、世界の燃料需要に応えることができるだろうし、あるいは状況は悪化する可能性が最も高いでしょう。
このデータ解析には、データの読み書きや保存が容易なGridDBを使用しました。